diff -pruN 5.15.15+dfsg-2/.QT-ENTERPRISE-LICENSE-AGREEMENT 5.15.17+dfsg-1/.QT-ENTERPRISE-LICENSE-AGREEMENT
--- 5.15.15+dfsg-2/.QT-ENTERPRISE-LICENSE-AGREEMENT	2024-08-16 06:16:13.385252700 +0000
+++ 5.15.17+dfsg-1/.QT-ENTERPRISE-LICENSE-AGREEMENT	2025-02-26 11:03:01.823832500 +0000
@@ -108,155 +108,481 @@ Version 2024-02
 3. Appendix for Privacy and Security Terms https://www.qt.io/terms-conditions/privacy-and-security
 
 Appendix for Qt Development Framework
-Version 2024-02
+Version 2025-02, compliant with Qt Frame Agreement 2023-06 or later
 
-1. This Appendix for Qt Development Framework is an integral part of the Agreement and specifies the legal terms for the licensing of Licensed Software (as defined below) between The Qt Company and the Customer. Entry into this Appendix governs the use of and supersedes any prior contracts between the Parties (including prior License Agreements and similar prior agreements), with respect to the Licensed Software under this Appendix.
+1. This Appendix for Qt Development Framework is an integral part of the Agreement and specifies the legal terms for the licensing of Licensed Software (as defined below) between The Qt Company and Customer. Entry into this Appendix governs the use of and supersedes any prior contracts between the Parties (including prior License Agreements and similar prior agreements), with respect to Licensed Software governed by this Appendix.
 
 2. DEFINITIONS
-2.1. Capitalized words used in this Appendix shall have the meanings described in the Agreement or as defined below.
-2.2. "Add-on Products" shall mean The Qt Company's specific add-on software products which are not licensed as part of The Qt Company's standard Services offerings, but shall be included into the scope of Licensed Software only if so specifically agreed between the Parties.
-2.3. "Application" means software products created using the Licensed Software, which include the Redistributables, or part thereof.
-2.4. "End Customer" shall mean Customer's customer(s) to whom Customer, directly or indirectly, distributes copies of the Redistributables as integrated or incorporated into Applications or Devices.
-2.5. "Data Protection Legislation" shall mean the General Data Protection Regulation (EU 2016/679) (GDPR) and any national implementing laws, regulations and secondary legislation, as may be amended or updated from time to time, as well as any other data protection laws or regulations applicable in the relevant territory.
-2.6. "Deployment Platforms" shall mean target operating systems and/or hardware specified in the License Certificate, on which the Redistributables can be distributed pursuant to the terms and conditions of this Appendix.
-2.7. "Designated User(s)" shall mean the employee(s) of Customer or Customer's Affiliates acting within the scope of their employment or Customer's Contractors acting within the scope of their services on behalf of Customer.
-2.8. "Development License" shall mean the license needed by the Customer for each Designated User to use Licensed Software under the license grant described in Section 5 of this Appendix. Development Licenses are available per respective Licensed Software products; each product having its designated scope and purpose of use.
-2.9. "Development Platforms" shall mean the host operating system(s) specified in the License Certificate, on which Licensed Software can be used under the Development License.
-2.10. "Devices" shall mean
-(i) hardware devices or products that
-a. are manufactured and/or distributed by the Customer, its Affiliates, Contractors or End Customer, and
-b. incorporate, integrate or link to Applications such that substantial functionality of such unit, when used by an End User, is provided by Application(s) or otherwise depends on the Licensed Software; or
-(ii) Applications designed for the hardware devices specified in item (i).
-Devices covered by this Appendix shall be specified in the Pricing Appendix or Purchase Document.
-2.11. "Distribution License(s)" shall mean a royalty-bearing license required for any kind of sale, trade, exchange, loan, lease, rental or other distribution by or on behalf of Customer to a third party of Redistributables in connection with Devices pursuant to license grant described in Section 5.3 of this Appendix. Distribution Licenses are sold separately for each type of Device respectively and cannot be used for any other type of Devices.
-2.12. "Distribution License Packs" shall mean set of prepaid Distribution Licenses for distribution of Redistributables, as defined in The Qt Company's standard price list, quote, Pricing Appendix  or in the Purchase Document, as applicable.
-2.13. "Evaluation License Term" shall mean a time period specified in the License Certificate for the Customer to use the relevant Licensed Software for evaluation purposes according to Section 5.6 of this Appendix.
-2.14. "Intellectual Property Rights" shall mean patents (including utility models), design patents, and designs (whether or not capable of registration), chip topography rights and other like protection, copyrights, trademarks, service marks, trade names, logos or other words or symbols and any other form of statutory protection of any kind and applications for any of the foregoing as well as any trade secrets.
-2.15. "License Certificate" shall mean a certificate generated by The Qt Company for each Designated User respectively upon their download of the Licensed Software, which will be available under the respective Designated User's Qt Account at account.qt.io. License Certificates will specify relevant information pertaining to the Licensed Software purchased by Customer and the license to the Licensed Software.
-2.16. "License Fee" shall mean the fee charged to Customer for rights granted under this Appendix.
-2.17. "Licensed Software" shall mean the specified product(s) of Qt Software which Customer has purchased and which is provided to Customer under the terms of this Appendix (including its Exhibits). Licensed Software shall include corresponding online or electronic documentation, associated media and printed materials, including source code (where applicable), example programs and the documentation. Licensed Software does not include Third Party Software (as defined in Section 6) or Qt Community Edition. The Qt Company may, in the course of its development activities, at its free and absolute discretion and without any obligation to send or publish any notifications to Customer or in general, make changes, additions or deletions in the components and functionalities of the Licensed Software, provided that no such changes, additions or deletions will affect the already released version of the Licensed Software, but only upcoming version(s).
-2.18. "License Term" shall mean the agreed validity period of the Development License during which the relevant Licensed Software product can be used pursuant to this Appendix. The agreed License Term, as ordered and paid for by Customer, shall be memorialized in the applicable License Certificate.
-2.19. "Customer's Records" shall mean books and records that contain information bearing on Customer's compliance with the  Agreement, Customer's use of Qt Community Edition and/or the payments due to The Qt Company under the Agreement, including, but not limited to user information, assembly logs, sales records and distribution records.
-2.20. "Modified Software" shall have the meaning as set forth below in Section 4.
-2.21. "Qt Software" shall mean the development and design software of The Qt Company, which The Qt Company makes available under commercial and/or open source licenses as either the "Licensed Software" or the "Qt Community Edition".
-2.22. "Permitted Software" shall mean third party products that are generally available to the public, which may include parts of Qt Community Edition or be developed using Qt Community Edition.
-2.23. "Pre-Release Code" shall have the meaning as set forth in Section 7.
-2.24. "Prohibited Combination" shall mean any effort to use, combine, incorporate, link or integrate Licensed Software with any software created with or incorporating Qt Community Edition, or use Licensed Software for creation of any such software.
-2.25. "Qt Community Edition" shall mean  the open source version of Qt Software available under the terms of the GNU Lesser General Public License, version 2.1 or later ("LGPL") or the GNU General Public License, version 2.0 or later ("GPL"). For clarity, Qt Community Edition shall not be provided, governed or used under this Appendix.
-2.26. "Redistributables" shall mean the portions of Licensed Software as set forth in Exhibit 1 hereto that may be distributed pursuant to this Appendix in object code form only, including any relevant documentation. Where relevant, any reference to Licensed Software in this Appendix includes and refers  to Redistributables.
-2.27. "Renewal Term" shall mean an extension of the previous License Term as agreed between the Parties.
-2.28. "Submitted Modified Software" shall have the meaning as set forth in Section 4.2 of this Appendix.
-2.29. "Third-Party Software" shall have the meaning set forth in Section 6 of this Appendix.
-2.30. "Updates" shall mean a release or version of the Licensed Software containing bug fixes, error corrections and other changes that are generally made available to users of the Licensed Software that have contracted for Support. Updates are generally depicted as a change to the digits following the decimal in the Licensed Software version number. The Qt Company shall make Updates available to Customer under the Support. Updates shall be considered as part of the Licensed Software hereunder.
-2.31. "Upgrades" shall mean a release or version of the Licensed Software containing enhancements and new features and are generally depicted as a change to the first digit of the Licensed Software version number. In the event that Upgrades are provided to Customer under this Appendix, they shall be considered as part of the Licensed Software hereunder.
+2.1. Capitalized words used in this Appendix and not defined below shall have the meanings described in the Agreement.
+2.2. “Add-on Products” means The Qt Company’s specific add-on software products which are not licensed as part of The Qt Company’s standard Services offerings, and are included in the scope of Licensed Software only if specifically agreed between the Parties.
+2.3. “Application” means software products created using the Licensed Software, which include the Redistributables, or part thereof.
+2.4. “Customer’s Records” means books and records that contain information bearing on Customer’s compliance with the Agreement, Customer’s use of Qt Community Edition and/or the payments due to The Qt Company under the Agreement, including, but not limited to user information, assembly and/or build logs, portions of Licensed Software used, sales records and distribution records.
+2.5. “Data Protection Legislation” means the General Data Protection Regulation (EU 2016/679) (GDPR) and any national implementing laws, regulations and secondary legislation, as may be amended or updated from time to time, as well as any other data protection laws or regulations applicable in the relevant territory.
+2.6. “Deployment Platforms” means target operating systems and/or hardware specified in the License Certificate, on which the Redistributables can be distributed pursuant to the terms and conditions of this Appendix.
+2.7. “Designated User(s)” means the employee(s) of Customer or Customer’s Affiliates acting within the scope of their employment or Customer’s Contractors acting within the scope of their services on behalf of Customer.
+2.8. “Development License” means the license needed by Customer for each Designated User to use Licensed Software under the license grant in Section 5 of this Appendix. Development Licenses are available per respective Licensed Software product; each product having its designated scope and purpose of use.
+2.9. “Development Platforms” means the host operating system(s) specified in the License Certificate, on which Licensed Software can be used under the Development License.
+2.10. “Devices” means
+(i) hardware or compute units that are manufactured and/or distributed by the Customer, its Affiliates, Contractors, or End Customer, and incorporate or include Licensed Software; or
+(ii) Applications which provide Substantial Functionality (as defined below) by communicating, integrating, or otherwise interacting in any way with a hardware or compute unit, regardless of whether the Application is provided together with the hardware or compute unit, or separate therefrom.
+For the purpose of defining a Device, “Substantial Functionality” means that a normal, intended or specified operation of a hardware or compute unit is dependent on or limited by the Application.
+Devices covered by this Appendix are specified in the Pricing Appendix or Purchase Document. Customer’s end product may contain more than one Device and require more than one Distribution License per end product.
+2.11. “Distribution License(s)” means a royalty-bearing license required for any kind of sale, trade, exchange, loan, lease, rental or other distribution by or on behalf of Customer to a third party (including Affiliates) of a Device pursuant to Section 5.3 of this Appendix. Use of Distribution Licenses is valid for the agreed period (either in perpetuity or for a period defined in the Purchase Document(s)), sold separately for each type of Device, and cannot be used for other types of Devices.
+2.12. “Distribution License Packs” means set of prepaid Distribution Licenses as defined in The Qt Company’s standard price list, quote, Pricing Appendix or in the Purchase Document, as applicable.
+2.13. “End Customer” means Customer’s customer(s) to whom Customer, directly or indirectly, distributes copies of the Redistributables as integrated or incorporated into Applications or Devices.
+2.14. “Evaluation License Term” means a time period specified in the License Certificate for Customer to use the relevant Licensed Software for evaluation purposes according to Section 5.5 of this Appendix.
+2.15. “Intellectual Property Rights” means patents (including utility models), design patents, and designs (whether or not capable of registration), chip topography rights and other like protection, copyrights, trademarks, service marks, trade names, logos or other words or symbols, any other form of statutory protection of any kind and applications for any of the foregoing, as well as any trade secrets.
+2.16. “License Certificate” means a certificate generated by The Qt Company for each Designated User upon their download of the Licensed Software, which will be available under the respective Designated User’s Qt Account at account.qt.io. License Certificates specify relevant information pertaining to the Licensed Software purchased by Customer and the license to the Licensed Software.
+2.17. “License Fee” means the fee charged to Customer for rights granted under this Appendix.
+2.18. “Licensed Software” means the specified product(s) of Qt Software which Customer has purchased, and which is provided to Customer under the terms of this Appendix and Agreement (including its Exhibits). Licensed Software shall include corresponding online or electronic documentation, associated media and printed materials, including source code (where applicable), example programs and documentation. Licensed Software does not include Third Party Software (as defined in Section 6) or Qt Community Edition. The Qt Company may, in the course of its development activities, at its free and absolute discretion and without any obligation to send or publish any notifications, make changes, additions or deletions in the components and functionalities of the Licensed Software, provided that no such changes, additions or deletions will affect the already released version of the Licensed Software, but only upcoming version(s).
+2.19. “License Term” means the agreed validity period of the Development License during which the relevant Licensed Software can be used pursuant to this Appendix. The agreed License Term, as ordered and paid for by Customer, is stated in the applicable License Certificate.
+2.20. “Modified Software” has the meaning set forth below in Section 4.
+2.21. “Permitted Software” means third party products that are generally available to the public, which may include parts of Qt Community Edition or be developed using Qt Community Edition.
+2.22. “Pre-Release Code” has the meaning set forth in Section 7.
+2.23. “Prohibited Combination” means any effort to use, combine, incorporate, link or integrate Licensed Software with any software created with or incorporating Qt Community Edition, or use Licensed Software for creation of any such software.
+2.24. “Qt Community Edition” means the open source version of Qt Software primarily available under the terms of the GNU Lesser General Public License, version 2.1 or later (“LGPL”) or the GNU General Public License, version 2.0 or later (“GPL”). For clarity, Qt Community Edition shall not be provided, governed or used under this Appendix.
+2.25. “Qt Software” means the development and design software of The Qt Company, which The Qt Company makes available under commercial and/or open source licenses as either the “Licensed Software” or the “Qt Community Edition”.
+2.26. “Redistributables" means the portions of Licensed Software set forth in Exhibit 1 that may be distributed pursuant to this Appendix in object code form only, including any relevant documentation. Where relevant, any reference to Licensed Software in this Appendix includes and refers to Redistributables.
+2.27. “Renewal Term” means an extension of the previous License Term as agreed between the Parties.
+2.28. “Submitted Modified Software” has the meaning set forth in Section 4.2 of this Appendix.
+2.29. “Third-Party Software" has the meaning set forth in Section 6 of this Appendix.
+2.30. “Updates” means a release or version of the Licensed Software containing bug fixes, error corrections and other changes that are generally made available to users of the Licensed Software that have contracted for Support. Updates are generally depicted as a change to the digits following the decimal in the Licensed Software version number. The Qt Company shall make Updates available to Customer under the Support. Updates shall be considered as part of the Licensed Software hereunder.
+2.31. “Upgrades” means a release or version of the Licensed Software containing enhancements and new features and are generally depicted as a change to the first digit of the Licensed Software version number. In the event that Upgrades are provided to Customer under this Appendix, they shall be considered as part of the Licensed Software.
 
 3. OWNERSHIP
 3.1. Ownership of The Qt Company
 3.1.1. The Licensed Software is protected by copyright laws and international copyright treaties, as well as other intellectual property laws and treaties. The Licensed Software is licensed, not sold.
-3.1.2. All of The Qt Company's Intellectual Property Rights are and shall remain the exclusive property of The Qt Company or its respective licensors . No rights to The Qt Company's Intellectual Property Rights are assigned or granted to Customer under this Appendix, except when and to the extent expressly specified herein.
+3.1.2. All of The Qt Company's Intellectual Property Rights are and shall remain the exclusive property of The Qt Company or its respective licensors. No rights to The Qt Company’s Intellectual Property Rights are assigned or granted to Customer under this Appendix, except when and solely to the extent expressly specified herein.
 3.2. Ownership of Customer
-3.2.1. All of Customer's Intellectual Property Rights are and shall remain the exclusive property of Customer or its licensors respectively.
+3.2.1. All of Customer’s Intellectual Property Rights are and shall remain the exclusive property of Customer or its licensors respectively.
 3.2.2. Except to the extent set forth in this Appendix, all Intellectual Property Rights to the Modified Software, Applications and Devices (except to Redistributables included therein) shall remain with Customer.
 
 4. MODIFIED SOFTWARE
-4.1. Customer may create bug-fixes, error corrections, patches or modifications to the Licensed Software ("Modified Software"). To the extent that Customer's Modified Software breaks source or binary compatibility or other functionality with the Licensed Software, Customer acknowledges that The Qt Company's ability to provide Support may be prevented or limited and Customer's ability to make use of Updates may be restricted.
-4.2. Customer may, at its sole and absolute discretion, choose to submit Modified Software to The Qt Company ("Submitted Modified Software") in connection with Customer's Support request, service request or otherwise. In the event Customer does so, then, Customer hereby grants The Qt Company a sublicensable, assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and fully paid-up license, under all of Customer's Intellectual Property Rights, to reproduce, adapt, translate, modify, and prepare derivative works of, publicly display, publicly perform, sublicense, make available and distribute such Submitted Modified Software as The Qt Company sees fit at its free and absolute discretion.
+4.1. Customer may create bug-fixes, error corrections, patches or modifications to the Licensed Software (“Modified Software”). To the extent that Customer’s Modified Software breaks source or binary compatibility or other functionality with the Licensed Software, Customer acknowledges that The Qt Company’s ability to provide Support may be prevented or limited and Customer’s ability to make use of Updates may be restricted.
+4.2. Customer may, at its sole and absolute discretion, choose to submit Modified Software to The Qt Company (“Submitted Modified Software”) in connection with Customer’s Support request, service request or otherwise. In the event Customer does so, then, Customer hereby grants The Qt Company a sublicensable, assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and fully paid-up license, under all of Customer’s Intellectual Property Rights, to reproduce, adapt, translate, modify, and prepare derivative works of, publicly display, publicly perform, sublicense, make available and distribute such Submitted Modified Software as The Qt Company sees fit at its free and absolute discretion.
 
 5. LICENSES GRANTED
 5.1. Development with Licensed Software
-5.1.1. Subject to the terms of the Agreement, The Qt Company grants to Customer a worldwide, non-exclusive, non-transferable license, valid for each License Term, to use, modify and copy the Licensed Software by Designated Users on the Development Platforms for the sole purposes of designing, developing, demonstrating and testing Application(s) and/or Devices, and to provide support and other services related to such Applications and Devices to End Customers. Each Application and/or Device can only include, incorporate or integrate contributions by such Designated Users who are duly licensed for the applicable Development Platform(s) and Deployment Platform(s) (i.e have a valid license for the appropriate Licensed Software product and only use one type of Qt Development License per Customer Application and/or Device(s)).
+5.1.1. Subject to the terms of the Agreement, The Qt Company grants to Customer a worldwide, non-exclusive, non-transferable license, valid for each License Term, to use, modify and copy the Licensed Software by Designated Users on the Development Platforms for the sole purposes of designing, developing, demonstrating and testing Application(s) and/or Devices, and to provide support, maintenance, updates, and other services related to such Applications and Devices to End Customers. Each Application or Device can only include, incorporate or integrate contributions by Designated Users who are duly licensed for the applicable Development Platform(s) and Deployment Platform(s) (i.e. have a current and valid Development License for the appropriate Licensed Software and only use one type of Development License per Customer Application or Device(s)).
 5.1.2. Customer may install copies of the Licensed Software on five (5) computers per Designated User, provided that only Designated Users who have a valid Development License may use the Licensed Software.
-5.1.3. Customer may designate another Designated User to replace a then-current Designated User by notifying The Qt Company in writing, where such replacement is due to termination of employment, long-term absence or other permanent reason affecting Designated User's need for Licensed Software.
-5.1.4. Upon expiry of the initially agreed License Term, the respective License Term shall be automatically extended by one or more Renewal Term(s), unless and until either Party notifies the other Party in writing, that it does not wish to continue the License Term, such notification to be provided to the other Party no less than thirty (30) days before expiry of the respective License Term. The Qt Company shall, in good time before the due date for the above notification, remind the Customer on the coming Renewal Term. Unless otherwise agreed between the Parties, Renewal Term shall be equal to the length of the previous License Term, but no longer than thirty-six (36) months.
-5.1.5. Any such Renewal Term shall be subject to License Fees agreed between the Parties or, if no advance agreement exists, subject to The Qt Company's standard list pricing applicable at the commencement date of any such Renewal Term.
-5.2. Distribution of Applications
-5.2.1. Subject to the terms of the Agreement, The Qt Company grants to Customer a worldwide, non-exclusive, non-transferable, perpetual, royalty-free and revocable (only for Customer’s material breach of agreement) right and license to:
-(i) distribute, by itself or through its Contractors, Redistributables as installed, incorporated or integrated into Applications for execution on the Deployment Platforms; and
-(ii) grant perpetual and irrevocable sublicenses to Redistributables, as distributed hereunder, for End Customers solely to the extent necessary in order for the End Customers to use the Applications for their respective intended purposes.
-5.2.2. Right to distribute the Redistributables as part of an Application as provided herein is not royalty-bearing but is conditional upon the Application having been created, updated and maintained under a valid and duly paid Development License.
+5.1.3. Customer may designate another Designated User to replace a then-current Designated User by notifying The Qt Company in writing, where such replacement is due to termination of employment, long-term absence or other permanent reason affecting Designated User’s need for Licensed Software.
+5.1.4. Upon expiry of the initially agreed License Term, the respective License Term shall be automatically extended by one or more Renewal Term(s), unless and until either Party notifies the other Party in writing, that it does not wish to continue the License Term, such notification to be provided to the other Party no less than thirty (30) days before expiry of the respective License Term. The Qt Company shall, in good time before the due date for the above notification, remind the Customer of the coming Renewal Term. Unless otherwise agreed between the Parties, Renewal Term shall be equal to the length of the previous License Term, but no longer than thirty-six (36) months.
+5.1.5. Any such Renewal Term shall be subject to License Fees agreed between the Parties or, if no advance agreement exists, subject to The Qt Company’s standard list pricing applicable at the commencement date of any such Renewal Term.
+5.2. Distribution of Applications. Subject to the terms of the Agreement, The Qt Company grants Customer a worldwide, non-exclusive, non-transferable, perpetual, royalty-free and revocable (for Customer’s material breach of the Agreement) right and license to:
+(i) distribute, by itself or through its Contractors, Applications for use on the Deployment Platforms; and
+(ii) grant End Customers perpetual sublicenses to Redistributables used in Applications solely to the extent necessary for End Customers to use the Applications as intended.
 5.3. Distribution of Devices
-5.3.1. Subject to the terms of the Agreement, The Qt Company grants to Customer a worldwide, non-exclusive, non-transferable, perpetual, revocable (only for Customer’s material breach of agreement), royalty-bearing right and license to:
-(i) distribute, by itself or through one or more tiers of Contractors, Redistributables as installed, incorporated or integrated, or intended to be installed, incorporated or integrated into Devices for execution on the Deployment Platforms; and
-(ii) grant perpetual and irrevocable sublicenses to Redistributables, as distributed hereunder, for End Customers solely to the extent necessary in order for the End Customers to use the Devices for their respective intended purposes.
-5.3.2. Right to distribute the Devices as provided herein is conditional upon (i) the Devices having been created, updated and maintained under a valid and duly paid Development License, and (ii) Customer having acquired corresponding Distribution Licenses at the time of distribution of any Devices to End Customers.
+5.3.1. Subject to the terms of the Agreement, The Qt Company grants Customer a worldwide, non-exclusive, non-transferable, revocable (for Customer’s material breach of the Agreement), royalty-bearing right and license to:
+(i) distribute (including through its Contractors), Devices for use on the Deployment Platforms; and
+(ii) grant End Customers perpetual sublicenses to Redistributables used in Devices, solely to the extent necessary for End Customers to use the Devices as intended.
+5.3.2. Right to distribute the Devices requires that:
+(i) the Devices are created, updated and maintained under a current and valid Development License,
+(ii) Customer has purchased corresponding Distribution Licenses before distribution of any Devices to End Customers, and
+(iii) the Distribution Licenses are valid for distribution at the date of distribution.
 5.4. Further Requirements
 5.4.1. The licenses granted in this Section 5 by The Qt Company to Customer are conditional and subject to Customer's compliance with the following terms:
-(i) Customer acknowledges that The Qt Company has separate products for the purpose of Applications and Devices respectively, where development and distribution of Devices is only allowed using the correct designated product. Customer shall ensure and bear the burden of proof that Customer is using a correct product entitling Customer to development and distribution of Devices;
+(i)  Customer acknowledges that The Qt Company has separate products for the purpose of Applications and Devices respectively, where development and distribution of Devices is only allowed using the correct designated product. Customer shall ensure and bear the burden of proof that Customer is using a correct product entitling Customer to development and distribution of Devices;
 (ii) Customer shall not remove or alter any copyright, trademark or other proprietary rights notice(s) contained in any portion of the Licensed Software;
-(iii) Applications must add primary and substantial functionality to Licensed Software so as not to compete with the Licensed Software;
-(iv) Applications may not pass on functionality which in any way makes it possible for others to create software with Licensed Software; provided however that Customer may use Licensed Software’s scripting and QML ("Qt Quick") functionality solely in order to enable scripting, themes and styles that augment the functionality and appearance of the Application(s) without adding primary and substantial functionality to the Application(s);
+(iii)  Applications must add primary and material functionality to Licensed Software so as not to compete with the Licensed Software;
+(iv)   Applications may not pass on functionality which in any way makes it possible for others to create software with Licensed Software; provided however that Customer may use Licensed Software’s scripting and QML ("Qt Quick") functionality solely in order to enable scripting, themes and styles that augment the functionality and appearance of the Application(s) without adding primary and substantial functionality to the Application(s);
 (v) Customer shall not use Licensed Software in any manner or for any purpose that infringes, misappropriates or otherwise violates any Intellectual Property Right or right of any third party, or that violates any applicable law;
 (vi) Customer shall not use The Qt Company's or any of its suppliers' names, logos, or trademarks to market Applications, except that Customer may use “Built with Qt” logo to indicate that an Application or Device was developed using Licensed Software;
 (vii) Customer shall not distribute, sublicense or disclose source code of Licensed Software to any third party (provided however that Customer may appoint employee(s) of Contractors and Affiliates as Designated Users to use Licensed Software pursuant to this Appendix).
 (viii) Customer shall not grant the End Customers a right to: (a) make copies of the Redistributables except when and to the extent required to use the Applications and/or Devices for their intended purpose; (b) modify the Redistributables or create derivative works thereof; (c) decompile, disassemble or otherwise reverse engineer Redistributables; or (d) redistribute any copy or portion of the Redistributables to any third party, except as part of the onward sale of the Application or Device on which the Redistributables are installed;
-(ix) Customer shall not, and shall cause that its Affiliates or Contractors shall not, use Licensed Software in any Prohibited Combination, unless Customer has received specific advance written permission from The Qt Company to do so. Absent such written permission, any and all distribution by Customer during the term of the Agreement of a hardware device or product: a) which incorporates or integrates any part of Licensed Software or Qt Community Edition; or b) where substantial functionality is provided by software built with Licensed Software or Qt Community Edition or otherwise depends on Licensed Software or Qt Community Edition, shall be considered to be Device distribution under this Appendix and shall be dependent on Customer’s compliance thereof (including but not limited to the obligation to pay applicable License Fees for such distribution). Notwithstanding the foregoing, Customer is entitled to use and combine Licensed Software with Permitted Software;
-(x) Customer shall cause all of its Affiliates, Contractors and End Customer entitled to make use of the licenses granted under this Appendix, to be contractually bound to comply with the relevant terms hereof and not to use the Licensed Software beyond the terms hereof nor for any purposes other than operating within the scope of their services for Customer. Customer shall be responsible for any and all actions and omissions of its Affiliates, Contractors, and End Customers relating to the Licensed Software and use thereof (including but not limited to payment of all applicable License Fees);
+(ix) Customer shall not and shall cause that its Affiliates, Contractors or End Customers shall not, use Licensed Software in any Prohibited Combination, unless Customer has received specific advance written permission from The Qt Company to do so. Without the written permission of The Qt Company, any and all distribution by Customer of a hardware device or product: a) which incorporates or integrates any part of Licensed Software or Qt Community Edition; or b) where material functionality is provided by software built with Licensed Software or Qt Community Edition or otherwise depends on Licensed Software or Qt Community Edition, shall be considered to be Device distribution under this Appendix and shall be dependent on Customer’s compliance thereof (including but not limited to the obligation to pay applicable License Fees for such distribution). Notwithstanding the foregoing, Customer is entitled to use and combine Licensed Software with Permitted Software;
+(x) Customer shall cause all of its Affiliates, Contractors and End Customers entitled to make use of the licenses granted under this Appendix, to be contractually bound to comply with the relevant terms hereof and not to use the Licensed Software beyond the terms hereof nor for any purposes other than operating within the scope of their services for Customer. Customer shall be responsible for any and all actions and omissions of its Designated Users, Affiliates, Contractors, and End Customers relating to the Licensed Software and use thereof (including but not limited to payment of all applicable License Fees);
 (xi) Except when and to the extent explicitly provided in this Section 5, Customer shall not transfer, publish, disclose, display or otherwise make available the Licensed Software; and
 (xii) Customer shall not attempt or enlist a third party to conduct or attempt to conduct any of the above.
 5.4.2. The above terms shall not be applicable if and solely to the extent they conflict with any mandatory provisions of applicable laws.
-5.4.3. Any use of Licensed Software beyond the provisions of this Appendix is strictly prohibited and requires, at a minimum an additional license from The Qt Company (e.g. certain additional rights granted under software development kit “SDK” agreement with regard to limitations of Section 5.4.1 iv, vii or viii).
+5.4.3. Any use of Licensed Software beyond the provisions of this Appendix is strictly prohibited and requires, at a minimum an additional license from The Qt Company (e.g. certain additional rights may be granted under a software development kit “SDK” agreement with regard to limitations of Section 5.4.1 iv, vii or viii).
 5.5. Evaluation License
 5.5.1. Subject to the terms of this Appendix, The Qt Company grants to Customer a worldwide, non-exclusive, non-transferable license, valid for the Evaluation License Term to use the relevant Licensed Software product solely for Customer’s internal use to evaluate and determine whether the Licensed Software meets Customer's business requirements, specifically excluding any commercial use of the Licensed Software or any derived work thereof.
-5.5.2. Upon the expiry of the Evaluation License Term, Customer must either discontinue use of the relevant Licensed Software or acquire a commercial Development License specified herein.
+5.5.2. Upon the expiry of the Evaluation License Term, Customer must either discontinue use of the relevant Licensed Software or acquire a commercial Development License.
 
 6. THIRD-PARTY SOFTWARE. The Licensed Software may provide links or access to third party libraries or code (collectively "Third-Party Software") to implement various functions. Third-Party Software does not, however, comprise part of the Licensed Software, but is provided to Customer complimentary and use thereof is discretionary for Customer. Third-Party Software will be listed in the ".../src/3rdparty" source tree delivered with the Licensed Software or documented in the Licensed Software, as such may be amended from time to time. Customer acknowledges that use or distribution of Third-Party Software is in all respects subject to applicable license terms of applicable third-party right holders.
 
 7. PRE-RELEASE CODE
-7.1. The Licensed Software may contain pre-release code and functionality, or sample code marked or otherwise stated with appropriate designation such as "Technology Preview", "Alpha", "Beta", "Experimental", "Sample", "Example" etc. ("Pre-Release Code").
-7.2. Such Pre-Release Code may be provided complimentary for  Customer, in order to provide experimental support or information for new platforms or preliminary versions of one or more new functionalities, or for other similar reasons. Pre-Release Code may not be at the level of performance and compatibility of a final, generally available, product offering.  Pre-Release Code may not operate correctly, may contain errors and may be substantially modified by The Qt Company prior to a commercial product release, if any. The Qt Company is under no obligation to make Pre-Release Code commercially available, or provide any Support or Updates relating thereto. To the maximum extent permitted by law, the Qt Company assumes no liability whatsoever regarding any Pre-Release Code and any use thereof is exclusively at Customer's own risk and expense.
-7.3.  Unless Licensed Software specifies different license terms for the respective Pre-Release Code, Customer is entitled to use such pre-release code pursuant to Section 5 of this Appendix, just like other Licensed Software.
+7.1. The Licensed Software may contain pre-release code and functionality, or sample code marked or otherwise stated with appropriate designation such as “Technology Preview”, “Alpha”, “Beta”, “Experimental”, “Sample”, “Example” etc. (“Pre-Release Code”).
+7.2. Such Pre-Release Code may be provided complimentary for Customer (e.g., to provide experimental support or information for new platforms or preliminary versions of one or more new functionalities). Pre-Release Code may not be at the level of performance and compatibility of a final, generally available, product offering. Pre-Release Code may not operate correctly, may contain errors and may be substantially modified by The Qt Company prior to a commercial product release, if any. The Qt Company is under no obligation to make Pre-Release Code commercially available or provide any Support or Updates relating thereto. To the maximum extent permitted by law, the Qt assumes no liability whatsoever regarding any Pre-Release Code and any use thereof is exclusively at Customer’s own risk and expense.
+7.3. Unless Licensed Software specifies different license terms for the respective Pre-Release Code, Customer is entitled to use such Pre-Release Code pursuant to Section 5 of this Appendix.
 
 8. SUPPORT. Support is provided according to agreed support level and subject to applicable requirements and restrictions, as specified in the Appendix for Support Terms.
 
 9. FEES AND ORDERING: DISTRIBUTION LICENSES
-9.1. Distribution License Packs
-9.1.1. Unless otherwise agreed in writing, Distribution Licenses shall be purchased by way of Distribution License Packs.
-9.1.2. Upon due payment of the ordered Distribution License Pack(s), Customer will have an account of Distribution Licenses available for distributing the Redistributables in accordance with this Agreement.
-9.2. Each time Customer distributes a copy of Redistributables, one Distribution License is used and Customer's account of available Distribution Licenses is decreased accordingly.
-9.3. Customer may distribute copies of the Redistributables so long as Customer has Distribution Licenses remaining on its account.
+9.1. Unless otherwise agreed in writing, Distribution Licenses shall be purchased by way of Distribution License Packs. Further Distribution License parameters may be set forth in the applicable Pricing Appendix.
+9.2. Upon due payment of the ordered Distribution Licenses, Customer will have an account of Distribution Licenses available for distributing Devices during the validity period of the respective Distribution Licenses in accordance with this Agreement.
+9.3. Each time Customer distributes a Device, one Distribution License is used and Customer’s account of available Distribution Licenses is decreased accordingly.
 
 10. RECORD-KEEPING AND REPORTING OBLIGATIONS; AUDIT RIGHTS
-10.1. Customer's Record-keeping
-10.1.1. Customer shall at all times during the term of the Agreement or validity of any of the licenses hereunder, whichever is later, and for a period of two (2) years thereafter, maintain Customer's Records in an accurate and up-to-date form. Customer's Records shall be adequate to reasonably enable The Qt Company to determine Customer's compliance with the provisions of the Agreement. The records shall conform to general good accounting practices.
-10.1.2. Customer shall, within thirty (30) days from receiving The Qt Company's request to that effect, deliver to The Qt Company a report based on Customer's Records, such report to contain information, in sufficient detail, on: (i) number and identity of users working with Licensed Software or Qt Community Edition, (ii) copies of Redistributables distributed by Customer during the most recent calendar quarter and/or any other term specified by The Qt Company, and (iii) any other information pertaining to Customer's compliance with the terms of the Agreement (e.g. information on products and/or projects relating to use of Distribution Licenses), as The Qt Company may reasonably require from time to time.
-10.2. The Qt Company's Audit Rights
-10.2.1. The Qt Company or an independent auditor acting on behalf of The Qt Company may, upon at least thirty (30) days' prior written notice and at The Qt Company expense, audit Customer with respect to Customer's use of the Licensed Software, but not more frequently than once during each six (6) month period. Such audit may be conducted by mail, electronic means or through an in-person visit to Customer's place of business. Any possible in-person audit shall be conducted during regular business hours at Customer's facilities, shall not unreasonably interfere with Customer's business activities and shall be limited in scope to verify Customer's compliance with the terms of the Agreement. The Qt Company or its independent auditor shall be entitled to inspect Customer's Records and conduct necessary interviews of Customer's relevant employees and Contractors. All Customer's Records and use thereof shall be subject to the obligation of confidentiality under the Agreement.
-10.2.2. If an audit reveals that Customer is using the Licensed Software beyond scope of the licenses Customer has paid for, Customer shall pay to The Qt Company any amounts owed for such unauthorized use within thirty (30) days from receipt of the corresponding invoice from The Qt Company.
-10.2.3. In addition, in the event the audit reveals a material violation of the terms of the Agreement (without limitation, either (i) underpayment of more than 10% of License Fees or 10,000 euros (whichever is more) or (ii) distribution of products, which include or result from Prohibited Combination, shall be deemed a material violation for purposes of this section), then Customer shall pay The Qt Company's reasonable cost of conducting such audit.
+10.1. Customer’s Record-keeping
+10.1.1. Customer shall at all times during the term of the Agreement or validity of any of the licenses hereunder, whichever is later, and for a period of two (2) years thereafter, maintain Customer’s Records in an accurate and up-to-date form. Customer’s Records shall be adequate to reasonably enable The Qt Company to determine Customer’s compliance with the provisions of the Agreement. The records shall conform to general good accounting practices.
+10.1.2. Customer shall, within thirty (30) days from receiving The Qt Company’s request to that effect, deliver to The Qt Company a report based on Customer’s Records, such report to contain information, in sufficient detail, on: (i) number and identity of users working with Licensed Software or Qt Community Edition, (ii) Devices distributed by Customer during the most recent calendar quarter and/or any other term specified by The Qt Company, and (iii) any other information pertaining to Customer’s compliance with the terms of the Agreement (e.g. information on products and/or projects relating to use of Licensed Software), as The Qt Company may reasonably require from time to time.
+10.2. The Qt Company’s Audit Rights
+10.2.1. The Qt Company or an independent auditor acting on behalf of The Qt Company may, upon at least thirty (30) days’ prior written notice and at The Qt Company expense, audit Customer with respect to Customer’s use of the Licensed Software, but not more frequently than once during each six (6) month period. Such audit may be conducted by mail, electronic means or through an in-person visit to Customer’s place of business. Any possible in-person audit shall be conducted during regular business hours at Customer's facilities, shall not unreasonably interfere with Customer's business activities and shall be limited in scope to verify Customer’s compliance with the terms of the Agreement. The Qt Company or its independent auditor shall be entitled to inspect Customer’s Records and conduct necessary interviews of Customer’s relevant employees and Contractors. All Customer’s Records and use thereof shall be subject to the obligation of confidentiality under the Agreement.
+10.2.2. If an audit reveals that Customer is using the Licensed Software beyond the scope of the licenses Customer has paid for, Customer shall pay to The Qt Company any amounts owed for such unauthorized use within thirty (30) days from receipt of the corresponding invoice from The Qt Company.
+10.2.3. In addition, in the event the audit reveals a material violation of the terms of the Agreement (without limitation, either (i) underpayment of more than 10% of License Fees or 10,000 Euros (whichever is more) or (ii) distribution of products, which include or result from Prohibited Combination, shall be deemed a material violation for purposes of this section), then Customer shall pay The Qt Company's reasonable cost of conducting such audit.
 
 11. TERMINATION
 11.1. Termination of Licenses
-11.1.1. The Qt Company may terminate Customer's rights to any and all Licensed Software (including access to Support), if Customer:
-(i) commits a material breach of the Agreement (including this Appendix) and has not remedied the breach within a reasonable period of time (which shall be no less than 30 days) of The Qt Company's written notice specifying the breach, or
+11.1.1. The Qt Company may terminate Customer’s rights to any and all Licensed Software (including access to Support), if Customer:
+(i) commits a material breach of the Agreement (including this Appendix) and has not remedied the breach within a reasonable period of time (which shall be no less than thirty (30) days) of The Qt Company’s written notice specifying the breach, or
 (ii) becomes bankrupt, insolvent or goes into liquidation or debt restructuring.
-11.2. Suspension of rights: Instead of termination, The Qt Company reserves the right to suspend or withhold grants of any and all rights to the Licensed Software (including Support), should Customer fail to make payment in timely fashion or otherwise violate or is reasonably suspected of violating its obligations under the Agreement and/or this Appendix, and where such violation or breach is not cured within ten (10) business days following The Qt Company's written notice thereof.
-11.3. Parties  Rights and Duties upon Termination
-11.3.1. Upon expiry or termination of the Development Licenses, Customer shall cease and shall cause all Designated Users (including those of its Affiliates' and Contractors') to cease using the relevant Licensed Software.
-11.3.2. Upon such expiry or termination of Development Licenses, Customer shall destroy or return to The Qt Company all copies of the respective Licensed Software and all related materials and will certify the same by Customer's duly authorized officer to The Qt Company upon its request, provided however that Customer may retain and utilize such copies of the Licensed Software to the extent required to provide Customer's continued support to End Customers,  for archiving purposes or as is required under applicable law.
-11.3.3. Distribution Licenses are perpetual and, therefore, Customer's distribution rights hereunder shall only terminate upon The Qt Company's termination of Distribution Licenses due to Customer's material breach as set forth in Section 11.1.1(i) of this Appendix. In case of such termination by The Qt Company due to Customer's material breach, Customer must cease any distribution of Applications and Devices at the effective date of termination.
-11.3.4. Expiry or termination of any of Customer's licenses hereunder for any reason whatsoever shall not:
-(i) relieve Customer of its obligation to pay any License Fees accrued or payable to The Qt Company prior to the effective date of termination, and Customer pay to The Qt Company all such fees within 30 days from the effective date of termination of the licenses;
-(ii) relieve Customer of its obligation to ensure that Applications and Devices (including those already distributed) remain in compliance with the terms of the Agreement; nor
-(iii) affect any rights of End Customer to continue use of Applications and Devices (and therein incorporated Redistributables).
-11.4. Extension of Rights under Special Circumstances. In the event that, during the applicable License Term, The Qt Company is declared bankrupt under a final, non-cancellable decision by relevant court of law, and the Agreement is not, at the date of expiry of the Development License(s), assigned to a party who has assumed The Qt Company's position as a legitimate licensor of Licensed Software under the Agreement, then all valid Development Licenses possessed by Customer at such date of expiry, and which Customer has not notified for expiry, shall be extended to be valid in perpetuity under the terms of the Agreement. Any such extension shall not apply to The Qt Company's Support obligations.
+11.1.2. Suspension of rights: Instead of termination, The Qt Company reserves the right to suspend or withhold grants of any and all rights to the Licensed Software (including Support), should Customer fail to make payment in timely fashion or otherwise violate or is reasonably suspected of violating its obligations under the Agreement and/or this Appendix, and where such violation or breach is not cured within ten (10) business days following The Qt Company’s written notice thereof.
+11.2. Parties´ Rights and Duties upon Termination
+11.2.1. Upon expiry or termination of the Development Licenses, Customer shall cease and shall cause all Designated Users (including those of its Affiliates’ and Contractors’) to cease using the relevant Licensed Software.
+11.2.2. Upon such expiry or termination of Development Licenses, Customer shall destroy or return to The Qt Company all copies of the respective Licensed Software and all related materials and will certify the same by Customer’s duly authorized officer to The Qt Company upon its request, provided however that Customer may retain and utilize such copies of the Licensed Software to the extent required to provide Customer’s continued support to End Customers, for archiving purposes or as is required under applicable law.
+11.2.3. Upon expiry of Distribution Licenses, Customer shall cease (including via its Affiliates and Contractors) distribution of Devices.
+11.2.4. If Customer’s distribution rights for Applications and Devices hereunder are terminated by The Qt Company due to Customer’s material breach, then Customer must cease any distribution of Applications and Devices as of the effective date of termination.
+11.2.5. Expiry or termination of any of Customer’s licenses hereunder for any reason whatsoever shall not:
+(i) relieve Customer of its obligation to pay any License Fees accrued or payable to The Qt Company prior to the effective date of termination, and Customer shall pay to The Qt Company all such fees within thirty (30) days from the effective date of termination of the licenses;
+(ii) relieve Customer of its obligation to ensure that Customer’s actions or inactions do not cause Applications and Devices (including those already distributed) to fall out of compliance with the terms of the Agreement; nor
+(iii) affect any rights of End Customer to continue use of Applications and Devices (and therein incorporated Redistributables) received by the End Customer before the date of such expiry or termination of Customer’s rights.
+11.3. Extension of Rights under Special Circumstances. In the event that, during the applicable License Term, The Qt Company is declared bankrupt under a final, non-cancellable decision by relevant court of law, and the Agreement is not, at the date of expiry of the Development License(s), assigned to a party who has assumed The Qt Company’s position as a legitimate licensor of Licensed Software under the Agreement, then all valid Development Licenses possessed by Customer at such date of expiry, and which Customer has not notified for expiry, shall be extended to be valid in perpetuity under the terms of the Agreement. Any such extension shall not apply to The Qt Company’s Support obligations.
 
 EXHIBIT 1, Licensed Software
-At the time of conclusion of this Appendix, the latest available version of Licensed Software includes the software libraries and tools set forth in Exhibit 1 (as provided below), depending on which product(s) Customer has purchased under the relevant Purchase Document.
-The modules and tools are specific to each product version respectively and may vary from version to version. Modules and tools included in the latest publicly available version of the respective product at any given time are listed in Exhibit 1 of  https://www.qt.io/terms-conditions/qt-dev-framework/exhibit-1. If a new version of Licensed Software does not include a module or tool present in an older version which Customer is entitled to use under a valid license from The Qt Company, then Customer will continue to have such right during the validity of Customer's license to relevant Licensed Software.  In the event a new version of the Licensed Software adds modules or tools to any previous version(s), Customer's rights will extend to cover also such additional modules and tools.
 
-EXHIBIT 2 - Small Business Terms
-1. This Exhibit applies to entities that qualify as a Qualified Small Business (defined below) and provides additional terms and conditions applicable to small business pricing and licensing. In the event that Customer is a Qualified Small Business and there is any conflict between the terms of this Exhibit and any other terms of the Agreement, the terms in this Exhibit shall take precedence.
-
-2. APPLICABILITY FOR SMALL BUSINESS LICENSES. Any small business discounts applied require that Customer (including any Customer Affiliates or group entities) has an annual revenue (including annual capital funding) below 1 Million EUR, or the equivalent thereof, as approved by The Qt Company (each, a "Qualified Small Business"). The annual revenue, including funding, must be evidenced upon request by business records and approved by The Qt Company in its reasonable discretion.
+The modules and tools are specific to each product version respectively and may vary from version to version. Modules and tools included in the latest publicly available version of the respective product at any given time are listed in Exhibit 1 of the latest version of the Qt Frame Agreement available at https://www.qt.io/terms-conditions/qt-dev-framework/exhibit-1. If a new version of Licensed Software does not include a module or tool present in an older version which Customer is entitled to use under a valid license from The Qt Company, then Customer will continue to have such right during the validity of Customer’s license to relevant Licensed Software. In the event a new version of the Licensed Software adds modules or tools to any previous version(s), Customer’s rights will extend to cover also such additional modules and tools.
 
-3. SUPPORT. Support is limited to: (i) Install Support; and (ii) for any other Standard Support issue, five (5) support tickets annually.
+Licensed Software: Developer modules and tools
+The modules and/or tools that are included in the latest publicly available version of the respective product at the effective date of this Appendix, Qt for Application Development Professional (ADP), Qt for Application Development Enterprise (ADE), Qt for Device Creation Professional (DCP), Qt for Device Creation Enterprise (DCE), - are marked with ‘X’ in the below table. Parts of the product that are permitted for distribution in object-code form only (“Redistributables”) are marked with ‘R’ in the below table.
++-----------------------------------------------------------------------------+
+|   Modules / Tools                   |   ADP   |   ADE   |   DCP   |   DCE   |
++-----------------------------------------------------------------------------+
+|Active Qt                            |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt 3D                                |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt5 Core Compatibility APIs          |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Android Extras                    |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Bluetooth                         |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Canvas 3D                         |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Charts                            |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Concurrent                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Core                              |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Data Visualization                |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt D-Bus                             |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt for Python                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt for WebAssembly                   |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Gamepad                           |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Graphical Effects                 |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt GUI                               |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Help                              |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Image Formats                     |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Location                          |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Lottie Animation                  |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Mac Extras                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Multimedia                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Multimedia Widgets                |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Network                           |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Network Authorization             |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt NFC                               |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt OpenGL                            |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt PDF                               |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Platform Headers                  |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Positioning                       |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Print Support                     |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Purchasing                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt QML                               |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick                             |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick 3D                          |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Controls 1                  |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Controls                    |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Dialogs                     |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Extras                      |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Layouts                     |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Test                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Timeline                    |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick WebGL                       |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Widgets                     |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Remote Objects                    |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Script                            |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Script Tools                      |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt SCXML                             |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Sensors                           |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Serial Bus                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Serial Port                       |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Shader Tools                      |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Speech                            |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt State Machine                     |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt SQL                               |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt SVG                               |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Test                              |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt UI Tools                          |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Virtual Keyboard                  |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Wayland Compositor                |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt WebChannel                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt WebEngine                         |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt WebSockets                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt WebView                           |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Widgets                           |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Windows Extras                    |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt X11 Extras                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt XML                               |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt XML Patterns                      |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Designer (Qt Widget Designer)     |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Linguist                          |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Assistant                         |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|lupdate                              |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|lrelease                             |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|lrelease                             |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt MQTT                              |         |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt KNX                               |         |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt OPC UA                            |         |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt CoAP                              |         |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Insight Tracker                   |         |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Boot 2 Qt stacks                     |         |         |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt OTA                               |         |         |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Device Utilities                     |         |         |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Debugging Bridge (QDB) Daemon     |         |         |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Ultralite Controls          |         |         |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Ultralite                   |         |         |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Safe Renderer (QSR)               |         |         |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Application Manager               |         |         |         |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Interface Framework               |         |         |         |   X,R   |
++-----------------------------------------------------------------------------+
+|Neptune Reference UI                 |         |         |         |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt for Android Automotive OS(QAA)    |         |         |         |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Creator                           |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|Qt Design Studio (Professional)      |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|androiddeployqt                      |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|androidtestrunner                    |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|canbusutil                           |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|dumpcpp                              |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|dumpdoc                              |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|fixqt4headers.pl                     |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|idc                                  |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|moc                                  |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|pixeltool                            |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qdbus                                |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qdbuscpp2xml                         |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qdbusviewer                          |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qdbusxml2cpp                         |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qdistancefieldgenerator              |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qdoc                                 |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qhelpgenerator                       |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qlalr                                |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmake                                |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qml                                  |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlcachegen                          |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmldom                               |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmleasing                            |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlformat                            |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmllint                              |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlpreview                           |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlprofiler                          |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlscene                             |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmltestrunner                        |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmltime                              |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlviewer                            |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qtdiag                               |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qtpaths                              |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qtplugininfo                         |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qvkgen                               |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|rcc                                  |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|tracegen                             |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|uic                                  |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|windeployqt                          |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|Target toolchains                    |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|Qt Debugging Bridge (QDB) Host Tools |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qtconfig-gui                         |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|Qt Emulator                          |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|Qt Creator VxWorks plugin            |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qulrcc                               |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlinterfacegenerator                |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmltocpp                             |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qulfontcompiler                      |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlprojectexporter                   |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|Qt Deployment Server                 |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|Qt Creator plugin for                |         |         |         |         |
+|Qt Application Manager               |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+
+Rights for Application and Device use cases
+Following table summarizes the rights afforded by different products of the Licensed Software to create and distribute Applications and Devices as defined in this Appendix (X marks for rights):
++-----------------------------------------------------------------------------+
+|                                     |   Applications    |      Devices      |
++-----------------------------------------------------------------------------+
+|ADP                                  |         X         |                   |
++-----------------------------------------------------------------------------+
+|ADE                                  |         X         |                   |
++-----------------------------------------------------------------------------+
+|DCP                                  |         X         |         X         |
++-----------------------------------------------------------------------------+
+|DCE                                  |         X         |         X         |
++-----------------------------------------------------------------------------+
+
+Redistributables and Tools - Data collection
+Customer is responsible for Customer’s use of Licensed Software, including the developer modules and tools. Any use of modules and tools by Customer to track, access, process, or otherwise handle data (including telemetry data) is the responsibility of Customer and must be done in compliance with applicable laws. If Customer uses the Licensed Software to perform any operation or set of operations on personal data, The Qt Company has no access or visibility into such operations by Customer. The Qt Company in no way acts as a data processor to Customer.
+
+Licensed Software: Designer tools and modules
+The modules and/or tools that are included in the respective product Qt for Design Studio Professional (DSP), Qt for Design Studio Enterprise (DSE) - are marked with X in the below table.
++-----------------------------------------------------------------------------+
+|                                     |        DSP        |        DSE        |
++-----------------------------------------------------------------------------+
+|Qt Design Studio                     |         X         |         X         |
++-----------------------------------------------------------------------------+
+|Qt Design Bridges                    |                   |         X         |
++-----------------------------------------------------------------------------+
+|QML Live on host                     |         X         |         X         |
++-----------------------------------------------------------------------------+
+|QML Live on target                   |                   |         X         |
++-----------------------------------------------------------------------------+
+|Variant Management                   |                   |         X         |
++-----------------------------------------------------------------------------+
+|Shader creation tools                |                   |         X         |
++-----------------------------------------------------------------------------+
+|Profiling tools                      |                   |         X         |
++-----------------------------------------------------------------------------+
+|Simulink support                     |                   |         X         |
++-----------------------------------------------------------------------------+
+Designer tools include no Redistributables. Both DSP and DSE can be used to create an user interface for use cases covered by ADP, ADE, DCP and DCE.
 
-4. LIMITATION ON NUMBER OF SMALL BUSINESS DEVELOPER LICENSES. Qualified Small Business discounts and purchasing structure may be applied to a maximum of  three discounted developer licenses (either ADE or DCP) per Qualified Small Business. Any additional licenses purchased will be at The Qt Company list price in effect at the time.
+EXHIBIT 2 – Small Business Terms
 
+1. This Exhibit applies to entities that qualify as a Qualified Small Business (defined below) and provides additional terms and conditions applicable to small business pricing and licensing. In the event that Customer is a Qualified Small Business and there is any conflict between the terms of this Exhibit and any other terms of the Agreement, the terms in this Exhibit shall take precedence.
+2. APPLICABILITY FOR SMALL BUSINESS LICENSES. Any small business discounts applied require that Customer (including any Customer Affiliates or group entities) has an annual revenue (including annual capital funding) below 1 Million EUR, or the equivalent thereof, as approved by The Qt Company (each, a “Qualified Small Business”). The annual revenue, including funding, must be evidenced upon request by business records and approved by The Qt Company in its reasonable discretion.
+3. SUPPORT. Support is limited to: (i) Install Support; and (ii) for any other Standard Support issue, five (5) support tickets annually.
+4. LIMITATION ON NUMBER OF SMALL BUSINESS DEVELOPER LICENSES. Qualified Small Business discounts and purchasing structure may be applied to a maximum of three discounted developer licenses (either ADE or DCP) per Qualified Small Business. Any additional licenses purchased will be at The Qt Company list price in effect at the time.
 5. LIMITATION FOR NUMBER OF INSTALLATIONS. Customer may install copies of the Licensed Software on two (2) computers per Designated User, provided that only the Designated Users who have a valid Development License may use the Licensed Software.
-
-6. CONDITIONAL WAIVER OF DISTRIBUTION LICENSES. For Qualified Small Businesses, the Agreement requirements to purchase Distribution Licenses for Devices shall apply only when Customer ceases to be a Qualified Small Business (e.g., when annual revenue threshholds  are bypassed).
-
-7. ADDITIONAL TERMS FOR RENEWALS. The initial subscription purchase term for Qualified Small Business Licenses is twelve (12) months. Upon expiration of the initial twelve (12) month term and unless terminated in accordance with the Agreement, the Licenses will automatically renew for additional twelve (12) month terms with applicable Qualified Small Business discounts. If Customer ceases to be a Qualified Small Business, renewal pricing shall be at The Qt Company list price in effect at the time of renewal, or as agreed in writing between the parties.
-
+6. CONDITIONAL WAIVER OF DISTRIBUTION LICENSES. For Qualified Small Businesses, the Agreement requirements to purchase Distribution Licenses for Devices shall apply only when Customer ceases to be a Qualified Small Business (e.g., when annual revenue thresholds are bypassed).
+7. ADDITIONAL TERMS FOR RENEWALS. The initial subscription purchase term for Qualified Small Business Licenses is twelve (12) months. Upon expiration of the initial twelve (12) month term, Customer’s Qualified Small Business Licenses may be renewed with applicable Qualified Small Business pricing so long as Customer remains a Qualified Small Business and accepts The Qt Company’s terms and conditions at the time of renewal. If Customer ceases to be a Qualified Small Business, renewal pricing shall be at The Qt Company list price in effect at the time of renewal, or as agreed in writing between the parties.
 8. ADDITIONAL AUDIT RIGHTS. In addition to the audit rights set forth in the Agreement, The Qt Company reserves the right to audit Customer financial records in order to determine whether Customer is a Qualified Small Business.
diff -pruN 5.15.15+dfsg-2/.qmake.conf 5.15.17+dfsg-1/.qmake.conf
--- 5.15.15+dfsg-2/.qmake.conf	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/.qmake.conf	2024-11-20 13:56:33.000000000 +0000
@@ -6,4 +6,4 @@ DEFINES += QT_NO_JAVA_STYLE_ITERATORS
 QT_SOURCE_TREE = $$PWD
 QT_BUILD_TREE = $$shadowed($$PWD)
 
-MODULE_VERSION = 5.15.15
+MODULE_VERSION = 5.15.17
diff -pruN 5.15.15+dfsg-2/.release-timestamp 5.15.17+dfsg-1/.release-timestamp
--- 5.15.15+dfsg-2/.release-timestamp	2024-08-16 06:16:10.973240000 +0000
+++ 5.15.17+dfsg-1/.release-timestamp	2025-02-26 11:02:59.051807400 +0000
@@ -1 +1 @@
-QT_PACKAGEDATE_STR=2024-08-16
\ No newline at end of file
+QT_PACKAGEDATE_STR=2025-02-26
\ No newline at end of file
diff -pruN 5.15.15+dfsg-2/.tag 5.15.17+dfsg-1/.tag
--- 5.15.15+dfsg-2/.tag	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/.tag	2024-11-20 13:56:33.000000000 +0000
@@ -1 +1 @@
-ca725ad9c5331a657c328bf624f2b0b713623276
+5e8b3ee0ae8cabf3c1a84d4568ff5f9f2bb09544
diff -pruN 5.15.15+dfsg-2/debian/changelog 5.15.17+dfsg-1/debian/changelog
--- 5.15.15+dfsg-2/debian/changelog	2024-10-25 11:41:28.000000000 +0000
+++ 5.15.17+dfsg-1/debian/changelog	2025-07-10 12:01:47.000000000 +0000
@@ -1,3 +1,82 @@
+qtbase-opensource-src-gles (5.15.17+dfsg-1) experimental; urgency=medium
+
+  * Merge qtbase-opensource-src 5.15.17+dfsg-1 upload.
+  * Bump qtbase build-dependencies to 5.15.17.
+  * Add missing t64 suffix in debian/libqt5gui5-gles.lintian-overrides.
+
+ -- Dmitry Shachnev <mitya57@debian.org>  Thu, 10 Jul 2025 15:01:47 +0300
+
+qtbase-opensource-src (5.15.17+dfsg-1) experimental; urgency=medium
+
+  * New upstream release.
+  * Merge 5.15.15+dfsg-5 upload from unstable.
+  * Drop patches, included in the new release:
+    - CVE-2023-51714.diff
+    - CVE-2024-25580.diff
+    - gcc_14.diff
+  * Refresh CVE-2024-39936.diff.
+  * Bump ABI version to qtbase-abi-5-15-17.
+  * Update debian/copyright.
+  * Remove logic for Perl shebang rewriting, dh_perl now does that.
+
+ -- Dmitry Shachnev <mitya57@debian.org>  Sat, 24 May 2025 22:32:13 +0300
+
+qtbase-opensource-src (5.15.16+dfsg-2) experimental; urgency=medium
+
+  * Merge changes from 5.15.15+dfsg-3.
+
+ -- Pino Toscano <pino@debian.org>  Fri, 07 Feb 2025 07:46:08 +0100
+
+qtbase-opensource-src (5.15.16+dfsg-1) experimental; urgency=medium
+
+  * New upstream release.
+  * Drop libxkbcommon_1.6.0.diff, included in the new release.
+  * Update symbols files from buildds’ and current build logs.
+    - Qt_5.x symbols are now defined only in libqt5core5t64.
+  * Bump ABI version to qtbase-abi-5-15-16.
+  * Exclude non-free util/update_public_suffix_list.sh from the tarball.
+  * Update debian/copyright.
+  * Remove unused package-name-doesnt-match-sonames Lintian overrides.
+    - Lintian >= 2.117.1 does not complain about t64 package names.
+
+ -- Dmitry Shachnev <mitya57@debian.org>  Fri, 24 Jan 2025 22:26:02 +0300
+
+qtbase-opensource-src (5.15.15+dfsg-5) unstable; urgency=medium
+
+  * Backport upstream patch to add null checks in table iface methods in
+    linuxaccessibility/atspiadaptor.cpp (closes: #1081682).
+  * Update symbols files from buildds’ logs.
+
+ -- Dmitry Shachnev <mitya57@debian.org>  Mon, 24 Mar 2025 15:42:48 +0300
+
+qtbase-opensource-src (5.15.15+dfsg-4) unstable; urgency=medium
+
+  * Fix containsTLDEntry() crash when tldChunkCount >= 3 (closes: #1095423).
+    - Thanks to Timo Röhling for help with debugging this!
+
+ -- Dmitry Shachnev <mitya57@debian.org>  Sat, 08 Feb 2025 19:24:33 +0300
+
+qtbase-opensource-src (5.15.15+dfsg-3) unstable; urgency=medium
+
+  * Team upload.
+  * Enable the Vulkan support on all the architectures (i.e. not only on
+    Linux), as vulkan-loader is portable, and now available also on non-Linux
+    architectures in Debian:
+    - remove the linux-any limitation for the libvulkan-dev build and runtime
+      dependency
+    - remove the linux-any limitation for the vulkan-related symbols in
+      libqt5gui5t64.symbols
+    - remove the linux-any limitation for the vulkan-related files in install
+      files
+
+ -- Pino Toscano <pino@debian.org>  Fri, 07 Feb 2025 07:20:36 +0100
+
+qtbase-opensource-src (5.15.15+dfsg-2) unstable; urgency=medium
+
+  * Upload to unstable.
+
+ -- Dmitry Shachnev <mitya57@debian.org>  Fri, 25 Oct 2024 12:40:08 +0300
+
 qtbase-opensource-src-gles (5.15.15+dfsg-2) unstable; urgency=medium
 
   * Upload to unstable.
diff -pruN 5.15.15+dfsg-2/debian/control 5.15.17+dfsg-1/debian/control
--- 5.15.15+dfsg-2/debian/control	2024-10-25 11:41:28.000000000 +0000
+++ 5.15.17+dfsg-1/debian/control	2025-07-10 12:01:47.000000000 +0000
@@ -38,13 +38,13 @@ Build-Depends: debhelper-compat (= 13),
                libpq-dev,
                libproxy-dev,
                libpulse-dev,
-               libqt5core5t64 (>= 5.15.15+dfsg~),
-               libqt5dbus5t64 (>= 5.15.15+dfsg~),
-               libqt5network5t64 (>= 5.15.15+dfsg~),
+               libqt5core5t64 (>= 5.15.17+dfsg~),
+               libqt5dbus5t64 (>= 5.15.17+dfsg~),
+               libqt5network5t64 (>= 5.15.17+dfsg~),
                libsqlite3-dev,
                libssl-dev,
                libudev-dev [linux-any],
-               libvulkan-dev [linux-any],
+               libvulkan-dev,
                libx11-dev,
                libx11-xcb-dev,
                libxcb-icccm4-dev,
@@ -114,7 +114,7 @@ Depends: libegl-dev,
          libqt5test5t64 (>= ${source:Upstream-Version}),
          libqt5widgets5t64 (>= ${source:Upstream-Version}),
          libqt5xml5t64 (>= ${source:Upstream-Version}),
-         libvulkan-dev [linux-any],
+         libvulkan-dev,
          libxext-dev,
          qt5-qmake (>= ${source:Upstream-Version}),
          qtbase5-dev-tools (>= ${source:Upstream-Version}),
diff -pruN 5.15.15+dfsg-2/debian/copyright 5.15.17+dfsg-1/debian/copyright
--- 5.15.15+dfsg-2/debian/copyright	2024-10-25 11:41:28.000000000 +0000
+++ 5.15.17+dfsg-1/debian/copyright	2025-07-10 12:01:47.000000000 +0000
@@ -17,6 +17,7 @@ Files-Excluded: bin/licheck*
                 tests/manual/network_stresstest/qtest
                 tests/testserver/apache2/testdata/www/htdocs/protected/rfc3252.txt
                 tests/testserver/apache2/testdata/www/htdocs/rfcs/rfc2616.html
+                util/update_public_suffix_list.sh
 # Removed non-free files:
 # * RFCs (see QTBUG-30544 and QTBUG-30545)
 # * htmlinfo example which contains non-free websites snapshots
@@ -24,6 +25,7 @@ Files-Excluded: bin/licheck*
 # * src/3rdparty/iaccessible2 — not preferred form of modification
 # * src/3rdparty/sqlite — not preferred form of modification
 # * src/3rdparty/wintab — license does not permit modification
+# * util/update_public_suffix_list.sh — commercial-only license (QTBUG-133229)
 
 # Manual rules for The Qt Company copyrights
 
@@ -67,7 +69,7 @@ Copyright: 2007-2013 Fathi Boudra <fabo@
            2005-2007 Brian Nelson <pyro@debian.org>
            2012-2013 Zoltán Balogh <zoltan.balogh@canonical.com>
            2012-2013 Timo Jyrinki <timo.jyrinki@canonical.com>
-           2013-2024 Dmitry Shachnev <mitya57@debian.org>
+           2013-2025 Dmitry Shachnev <mitya57@debian.org>
            2018 Simon Quigley <tsimonq2@ubuntu.com>
 License: LGPL-3 or GPL-2+
 
@@ -2077,7 +2079,7 @@ Copyright: 1998-2005 David Turner
 License: Harfbuzz
 
 Files: src/3rdparty/harfbuzz-ng/*
-Copyright: 2010-2022 Google, Inc.
+Copyright: 2010-2024 Google, Inc.
            2015-2020 Ebrahim Byagowi
            2019-2020 Facebook, Inc.
            2012-2015 Mozilla Foundation
@@ -2097,8 +2099,15 @@ Copyright: 2010-2022 Google, Inc.
            2018-2021 Khaled Hosny
            2018-2020 Adobe, Inc
            2013-2015 Alexei Podtelezhnikov
+           2022 Red Hat, Inc.
 License: Harfbuzz
 
+Files: src/3rdparty/harfbuzz-ng/src/hb-algs.hh
+Copyright: 2017 Google, Inc.
+           2019 Facebook, Inc.
+           2012 Zilong Tan <eric.zltan@gmail.com>
+License: Harfbuzz and Expat
+
 License: Harfbuzz
  Permission is hereby granted, without written agreement and without
  license or royalty fees, to use, copy, modify, and distribute this
@@ -2185,7 +2194,7 @@ License: ICC
  profile.
 
 Files: src/3rdparty/libjpeg/src/*
-Copyright: 2009-2023 D. R. Commander
+Copyright: 2009-2024 D. R. Commander
            2011-2016 Siarhei Siamashka
            2015-2022 Matthieu Darbois
            2015 Intel Corporation
@@ -2200,12 +2209,13 @@ Copyright: 2009-2023 D. R. Commander
            2018 Matthias Räncker
            2019-2020 Arm Limited
            2021 Alex Richardson
+           2014 Olle Liljenzin
 License: libjpeg and BSD-3-clause and Zlib
 
 Files: src/3rdparty/libpng/*.c
        src/3rdparty/libpng/*.h
-Copyright: 1995-2023 The PNG Reference Library Authors.
-           2018-2023 Cosmin Truta
+Copyright: 1995-2024 The PNG Reference Library Authors
+           2018-2024 Cosmin Truta
            2000-2018 Glenn Randers-Pehrson
            1996-1997 Andreas Dilger
            1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -2245,12 +2255,12 @@ Copyright: 2005 The Android Open Source
 License: Apache-2.0
 
 Files: src/3rdparty/pcre2/src/*
-Copyright: 1997-2022 University of Cambridge
-           2009-2022 Zoltan Herczeg
+Copyright: 1997-2024 University of Cambridge
+           2009-2024 Zoltan Herczeg
 License: BSD-3-clause
 
 Files: src/3rdparty/pcre2/src/sljit/*
-Copyright: 2009-2022 Zoltan Herczeg <hzmester@freemail.hu>
+Copyright: 2009-2024 Zoltan Herczeg <hzmester@freemail.hu>
 License: BSD-2-clause
 
 Files: src/3rdparty/pixman/*
@@ -2308,12 +2318,12 @@ License: Bitstream
 
 Files: src/3rdparty/freetype/src/gzip/*
        src/3rdparty/zlib/src/*
-Copyright: 1995-2022 Jean-loup Gailly
-           1995-2022 Mark Adler
+Copyright: 1995-2024 Jean-loup Gailly
+           1995-2024 Mark Adler
 License: Zlib
 
 Files: src/3rdparty/md4c/*
-Copyright: 2016-2020 Martin Mitáš
+Copyright: 2016-2024 Martin Mitáš
 License: Expat
 
 Files: src/3rdparty/VulkanMemoryAllocator/*
diff -pruN 5.15.15+dfsg-2/debian/libqt5gui5-gles.lintian-overrides 5.15.17+dfsg-1/debian/libqt5gui5-gles.lintian-overrides
--- 5.15.15+dfsg-2/debian/libqt5gui5-gles.lintian-overrides	2024-10-25 11:41:28.000000000 +0000
+++ 5.15.17+dfsg-1/debian/libqt5gui5-gles.lintian-overrides	2025-07-10 12:01:47.000000000 +0000
@@ -2,8 +2,8 @@
 # our private headers. It is ok if internal packages depend on the ABI one.
 libqt5gui5-gles: symbols-declares-dependency-on-other-package qtbase-abi-*
 # This is an alternative dependency, as libqt5gui5-gles provides the same ABI.
-# Symbols which are present only in libqt5gui5 do not get this dependency.
-libqt5gui5-gles: symbols-declares-dependency-on-other-package libqt5gui5 (libQt5Gui.so.5) [symbols]
+# Symbols which are present only in libqt5gui5t64 do not get this dependency.
+libqt5gui5-gles: symbols-declares-dependency-on-other-package libqt5gui5t64 (libQt5Gui.so.5) [symbols]
 # libQt5EglDeviceIntegration and libQt5XcbQpa are actually private libraries
 # *only* used by their respective platforms plugins. Sadly instead of being
 # installed into a proper place like /usr/lib/<arch-triplet>/qt5/ they are
diff -pruN 5.15.15+dfsg-2/debian/libqt5gui5-gles.symbols 5.15.17+dfsg-1/debian/libqt5gui5-gles.symbols
--- 5.15.15+dfsg-2/debian/libqt5gui5-gles.symbols	2024-10-25 11:41:28.000000000 +0000
+++ 5.15.17+dfsg-1/debian/libqt5gui5-gles.symbols	2025-07-10 12:01:47.000000000 +0000
@@ -1,25 +1,9 @@
-# SymbolsHelper-Confirmed: 5.15.13 alpha amd64 i386 loong64 powerpc ppc64 sh4 sparc64
+# SymbolsHelper-Confirmed: 5.15.16 amd64
 libQt5Gui.so.5 libqt5gui5t64 #MINVER# | libqt5gui5-gles #MINVER#
-| libqt5gui5t64 #MINVER# | libqt5gui5-gles #MINVER#, qtbase-abi-5-15-15
+| libqt5gui5t64 #MINVER# | libqt5gui5-gles #MINVER#, qtbase-abi-5-15-17
 | libqt5gui5t64 #MINVER#
 | libqt5gui5-gles #MINVER#
 * Build-Depends-Package: qtbase5-gles-dev
- Qt_5.0@Qt_5.0 5.6.0~beta
- Qt_5.10@Qt_5.10 5.10.0
- Qt_5.11@Qt_5.11 5.11.0~rc1
- Qt_5.12@Qt_5.12 5.12.0
- Qt_5.13@Qt_5.13 5.14.1
- Qt_5.14@Qt_5.14 5.14.1
- Qt_5.15@Qt_5.15 5.15.1
- Qt_5.1@Qt_5.1 5.6.0~beta
- Qt_5.2@Qt_5.2 5.6.0~beta
- Qt_5.3@Qt_5.3 5.6.0~beta
- Qt_5.4@Qt_5.4 5.6.0~beta
- Qt_5.5@Qt_5.5 5.6.0~beta
- Qt_5.6@Qt_5.6 5.6.0~beta
- Qt_5.7@Qt_5.7 5.7.0
- Qt_5.8@Qt_5.8 5.8.0
- Qt_5.9@Qt_5.9 5.9.0~beta
  Qt_5@Qt_5 5.6.0~beta
  (symver)Qt_5_PRIVATE_API 0 1
  _Z11qDrawBorderP8QPainterRK5QRectPKN4QCss11BorderStyleEPKiPK6QBrushPK5QSize@Qt_5 5.0.2
@@ -96,7 +80,7 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _Z31QT_DISTANCEFIELD_HIGHGLYPHCOUNTv@Qt_5 5.8.0
  (arch=arm64)_Z31qt_convert_rgb888_to_rgb32_neonPjPKhi@Qt_5 5.6.0~beta
  _Z32qGamma_correct_back_to_linear_csP6QImage@Qt_5 5.0.2
- (optional=gccinternal|arch=amd64 x32)_Z32qt_convert_rgb888_to_rgb32_ssse3PjPKhi@Qt_5 5.0.2
+ (optional=gccinternal|arch=amd64 hurd-amd64 x32)_Z32qt_convert_rgb888_to_rgb32_ssse3PjPKhi@Qt_5 5.0.2
  _Z33hb_qt_font_get_use_design_metricsP9hb_font_t@Qt_5 5.2.0
  _Z33hb_qt_font_set_use_design_metricsP9hb_font_tj@Qt_5 5.2.0
  _Z34qt_sort_families_by_writing_systemN5QChar6ScriptERK11QStringList@Qt_5 5.10.1
@@ -1128,31 +1112,31 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _ZN13QTextDocumentD0Ev@Qt_5 5.0.2
  _ZN13QTextDocumentD1Ev@Qt_5 5.0.2
  _ZN13QTextDocumentD2Ev@Qt_5 5.0.2
- (arch=linux-any)_ZN13QVulkanWindow10frameReadyEv@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow11exposeEventEP12QExposeEvent@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow11qt_metacallEN11QMetaObject4CallEiPPv@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow11qt_metacastEPKc@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow11resizeEventEP12QResizeEvent@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow12frameGrabbedERK6QImage@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow14createRendererEv@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow14setSampleCountEi@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow16staticMetaObjectE@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow19setDeviceExtensionsERK5QListI10QByteArrayE@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow20clipCorrectionMatrixEv@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow21supportedSampleCountsEv@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow22setPhysicalDeviceIndexEi@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow24availablePhysicalDevicesEv@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow24setPreferredColorFormatsERK7QVectorI8VkFormatE@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow25supportedDeviceExtensionsEv@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow26setQueueCreateInfoModifierERKSt8functionIFvPK23VkQueueFamilyPropertiesjR7QVectorI23VkDeviceQueueCreateInfoEEE@Qt_5 5.15.1
- (arch=linux-any)_ZN13QVulkanWindow4grabEv@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow5eventEP6QEvent@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindow8setFlagsE6QFlagsINS_4FlagEE@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindowC1EP7QWindow@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindowC2EP7QWindow@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindowD0Ev@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindowD1Ev@Qt_5 5.11.1
- (arch=linux-any)_ZN13QVulkanWindowD2Ev@Qt_5 5.11.1
+ _ZN13QVulkanWindow10frameReadyEv@Qt_5 5.11.1
+ _ZN13QVulkanWindow11exposeEventEP12QExposeEvent@Qt_5 5.11.1
+ _ZN13QVulkanWindow11qt_metacallEN11QMetaObject4CallEiPPv@Qt_5 5.11.1
+ _ZN13QVulkanWindow11qt_metacastEPKc@Qt_5 5.11.1
+ _ZN13QVulkanWindow11resizeEventEP12QResizeEvent@Qt_5 5.11.1
+ _ZN13QVulkanWindow12frameGrabbedERK6QImage@Qt_5 5.11.1
+ _ZN13QVulkanWindow14createRendererEv@Qt_5 5.11.1
+ _ZN13QVulkanWindow14setSampleCountEi@Qt_5 5.11.1
+ _ZN13QVulkanWindow16staticMetaObjectE@Qt_5 5.11.1
+ _ZN13QVulkanWindow19setDeviceExtensionsERK5QListI10QByteArrayE@Qt_5 5.11.1
+ _ZN13QVulkanWindow20clipCorrectionMatrixEv@Qt_5 5.11.1
+ _ZN13QVulkanWindow21supportedSampleCountsEv@Qt_5 5.11.1
+ _ZN13QVulkanWindow22setPhysicalDeviceIndexEi@Qt_5 5.11.1
+ _ZN13QVulkanWindow24availablePhysicalDevicesEv@Qt_5 5.11.1
+ _ZN13QVulkanWindow24setPreferredColorFormatsERK7QVectorI8VkFormatE@Qt_5 5.11.1
+ _ZN13QVulkanWindow25supportedDeviceExtensionsEv@Qt_5 5.11.1
+ _ZN13QVulkanWindow26setQueueCreateInfoModifierERKSt8functionIFvPK23VkQueueFamilyPropertiesjR7QVectorI23VkDeviceQueueCreateInfoEEE@Qt_5 5.15.1
+ _ZN13QVulkanWindow4grabEv@Qt_5 5.11.1
+ _ZN13QVulkanWindow5eventEP6QEvent@Qt_5 5.11.1
+ _ZN13QVulkanWindow8setFlagsE6QFlagsINS_4FlagEE@Qt_5 5.11.1
+ _ZN13QVulkanWindowC1EP7QWindow@Qt_5 5.11.1
+ _ZN13QVulkanWindowC2EP7QWindow@Qt_5 5.11.1
+ _ZN13QVulkanWindowD0Ev@Qt_5 5.11.1
+ _ZN13QVulkanWindowD1Ev@Qt_5 5.11.1
+ _ZN13QVulkanWindowD2Ev@Qt_5 5.11.1
  _ZN14QDragMoveEventC1ERK6QPoint6QFlagsIN2Qt10DropActionEEPK9QMimeDataS3_INS4_11MouseButtonEES3_INS4_16KeyboardModifierEEN6QEvent4TypeE@Qt_5 5.0.2
  _ZN14QDragMoveEventC2ERK6QPoint6QFlagsIN2Qt10DropActionEEPK9QMimeDataS3_INS4_11MouseButtonEES3_INS4_16KeyboardModifierEEN6QEvent4TypeE@Qt_5 5.0.2
  _ZN14QDragMoveEventD0Ev@Qt_5 5.0.2
@@ -1505,28 +1489,28 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _ZN15QTextListFormatC1Ev@Qt_5 5.0.2
  _ZN15QTextListFormatC2ERK11QTextFormat@Qt_5 5.0.2
  _ZN15QTextListFormatC2Ev@Qt_5 5.0.2
- (arch=linux-any)_ZN15QVulkanInstance13presentQueuedEP7QWindow@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstance13setApiVersionERK14QVersionNumber@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstance13setExtensionsERK5QListI10QByteArrayE@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstance13setVkInstanceEP12VkInstance_T@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstance15deviceFunctionsEP10VkDevice_T@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstance15supportedLayersEv@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstance15supportsPresentEP18VkPhysicalDevice_TjP7QWindow@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstance16surfaceForWindowEP7QWindow@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstance19getInstanceProcAddrEPKc@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstance19supportedExtensionsEv@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstance20resetDeviceFunctionsEP10VkDevice_T@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstance22presentAboutToBeQueuedEP7QWindow@Qt_5 5.15.1
- (subst|arch=linux-any)_ZN15QVulkanInstance23removeDebugOutputFilterEPFbj26VkDebugReportObjectTypeEXT{uint64_t}{size_t}iPKcS2_E@Qt_5 5.14.1
- (subst|arch=linux-any)_ZN15QVulkanInstance24installDebugOutputFilterEPFbj26VkDebugReportObjectTypeEXT{uint64_t}{size_t}iPKcS2_E@Qt_5 5.14.1
- (arch=linux-any)_ZN15QVulkanInstance6createEv@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstance7destroyEv@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstance8setFlagsE6QFlagsINS_4FlagEE@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstance9setLayersERK5QListI10QByteArrayE@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstanceC1Ev@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstanceC2Ev@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstanceD1Ev@Qt_5 5.11.1
- (arch=linux-any)_ZN15QVulkanInstanceD2Ev@Qt_5 5.11.1
+ _ZN15QVulkanInstance13presentQueuedEP7QWindow@Qt_5 5.11.1
+ _ZN15QVulkanInstance13setApiVersionERK14QVersionNumber@Qt_5 5.11.1
+ _ZN15QVulkanInstance13setExtensionsERK5QListI10QByteArrayE@Qt_5 5.11.1
+ _ZN15QVulkanInstance13setVkInstanceEP12VkInstance_T@Qt_5 5.11.1
+ _ZN15QVulkanInstance15deviceFunctionsEP10VkDevice_T@Qt_5 5.11.1
+ _ZN15QVulkanInstance15supportedLayersEv@Qt_5 5.11.1
+ _ZN15QVulkanInstance15supportsPresentEP18VkPhysicalDevice_TjP7QWindow@Qt_5 5.11.1
+ _ZN15QVulkanInstance16surfaceForWindowEP7QWindow@Qt_5 5.11.1
+ _ZN15QVulkanInstance19getInstanceProcAddrEPKc@Qt_5 5.11.1
+ _ZN15QVulkanInstance19supportedExtensionsEv@Qt_5 5.11.1
+ _ZN15QVulkanInstance20resetDeviceFunctionsEP10VkDevice_T@Qt_5 5.11.1
+ _ZN15QVulkanInstance22presentAboutToBeQueuedEP7QWindow@Qt_5 5.15.1
+ (subst)_ZN15QVulkanInstance23removeDebugOutputFilterEPFbj26VkDebugReportObjectTypeEXT{uint64_t}{size_t}iPKcS2_E@Qt_5 5.14.1
+ (subst)_ZN15QVulkanInstance24installDebugOutputFilterEPFbj26VkDebugReportObjectTypeEXT{uint64_t}{size_t}iPKcS2_E@Qt_5 5.14.1
+ _ZN15QVulkanInstance6createEv@Qt_5 5.11.1
+ _ZN15QVulkanInstance7destroyEv@Qt_5 5.11.1
+ _ZN15QVulkanInstance8setFlagsE6QFlagsINS_4FlagEE@Qt_5 5.11.1
+ _ZN15QVulkanInstance9setLayersERK5QListI10QByteArrayE@Qt_5 5.11.1
+ _ZN15QVulkanInstanceC1Ev@Qt_5 5.11.1
+ _ZN15QVulkanInstanceC2Ev@Qt_5 5.11.1
+ _ZN15QVulkanInstanceD1Ev@Qt_5 5.11.1
+ _ZN15QVulkanInstanceD2Ev@Qt_5 5.11.1
  _ZN16QAccessibleEventD0Ev@Qt_5 5.6.0~beta
  _ZN16QAccessibleEventD1Ev@Qt_5 5.6.0~beta
  _ZN16QAccessibleEventD2Ev@Qt_5 5.6.0~beta
@@ -1563,7 +1547,7 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _ZN16QDoubleValidatorD0Ev@Qt_5 5.0.2
  _ZN16QDoubleValidatorD1Ev@Qt_5 5.0.2
  _ZN16QDoubleValidatorD2Ev@Qt_5 5.0.2
- (optional=inline|arch=!hppa !ia64 !ppc64 !s390x !sparc64)_ZN16QOpenGLFunctions17glBindFramebufferEjj@Qt_5 5.15.2
+ (optional=inline|arch=!hppa !ia64 !powerpc !ppc64 !s390x !sparc64)_ZN16QOpenGLFunctions17glBindFramebufferEjj@Qt_5 5.15.2
  _ZN16QOpenGLFunctions25initializeOpenGLFunctionsEv@Qt_5 5.0.2
  _ZN16QOpenGLFunctionsC1EP14QOpenGLContext@Qt_5 5.0.2
  _ZN16QOpenGLFunctionsC1Ev@Qt_5 5.0.2
@@ -2093,16 +2077,16 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _ZN21QTextDocumentFragmentD1Ev@Qt_5 5.0.2
  _ZN21QTextDocumentFragmentD2Ev@Qt_5 5.0.2
  _ZN21QTextDocumentFragmentaSERKS_@Qt_5 5.0.2
- (arch=linux-any)_ZN21QVulkanWindowRenderer13initResourcesEv@Qt_5 5.11.1
- (arch=linux-any)_ZN21QVulkanWindowRenderer16preInitResourcesEv@Qt_5 5.11.1
- (arch=linux-any)_ZN21QVulkanWindowRenderer16releaseResourcesEv@Qt_5 5.11.1
- (arch=linux-any)_ZN21QVulkanWindowRenderer17logicalDeviceLostEv@Qt_5 5.11.1
- (arch=linux-any)_ZN21QVulkanWindowRenderer18physicalDeviceLostEv@Qt_5 5.11.1
- (arch=linux-any)_ZN21QVulkanWindowRenderer22initSwapChainResourcesEv@Qt_5 5.11.1
- (arch=linux-any)_ZN21QVulkanWindowRenderer25releaseSwapChainResourcesEv@Qt_5 5.11.1
- (arch=linux-any)_ZN21QVulkanWindowRendererD0Ev@Qt_5 5.11.1
- (arch=linux-any)_ZN21QVulkanWindowRendererD1Ev@Qt_5 5.11.1
- (arch=linux-any)_ZN21QVulkanWindowRendererD2Ev@Qt_5 5.11.1
+ _ZN21QVulkanWindowRenderer13initResourcesEv@Qt_5 5.11.1
+ _ZN21QVulkanWindowRenderer16preInitResourcesEv@Qt_5 5.11.1
+ _ZN21QVulkanWindowRenderer16releaseResourcesEv@Qt_5 5.11.1
+ _ZN21QVulkanWindowRenderer17logicalDeviceLostEv@Qt_5 5.11.1
+ _ZN21QVulkanWindowRenderer18physicalDeviceLostEv@Qt_5 5.11.1
+ _ZN21QVulkanWindowRenderer22initSwapChainResourcesEv@Qt_5 5.11.1
+ _ZN21QVulkanWindowRenderer25releaseSwapChainResourcesEv@Qt_5 5.11.1
+ _ZN21QVulkanWindowRendererD0Ev@Qt_5 5.11.1
+ _ZN21QVulkanWindowRendererD1Ev@Qt_5 5.11.1
+ _ZN21QVulkanWindowRendererD2Ev@Qt_5 5.11.1
  _ZN22QAccessibleApplicationC1Ev@Qt_5 5.0.2
  _ZN22QAccessibleApplicationC2Ev@Qt_5 5.0.2
  _ZN22QInputMethodQueryEvent8setValueEN2Qt16InputMethodQueryERK8QVariant@Qt_5 5.0.2
@@ -2802,7 +2786,7 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _ZN7QWindow16setSizeIncrementERK5QSize@Qt_5 5.2.0
  _ZN7QWindow16staticMetaObjectE@Qt_5 5.2.0
  _ZN7QWindow17mouseReleaseEventEP11QMouseEvent@Qt_5 5.2.0
- (arch=linux-any)_ZN7QWindow17setVulkanInstanceEP15QVulkanInstance@Qt_5 5.11.1
+ _ZN7QWindow17setVulkanInstanceEP15QVulkanInstance@Qt_5 5.11.1
  _ZN7QWindow17startSystemResizeE6QFlagsIN2Qt4EdgeEE@Qt_5 5.15.1
  _ZN7QWindow17visibilityChangedENS_10VisibilityE@Qt_5 5.2.0
  _ZN7QWindow18focusObjectChangedEP7QObject@Qt_5 5.2.0
@@ -3799,35 +3783,35 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _ZNK13QTextFragment8containsEi@Qt_5 5.0.2
  _ZNK13QTextFragment8positionEv@Qt_5 5.0.2
  _ZNK13QTextFragment9glyphRunsEii@Qt_5 5.0.2
- (arch=linux-any)_ZNK13QVulkanWindow10metaObjectEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow11colorFormatEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow12currentFrameEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow12supportsGrabEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow13graphicsQueueEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow14msaaColorImageEi@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow14physicalDeviceEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow14swapChainImageEi@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow17defaultRenderPassEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow17depthStencilImageEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow18currentFramebufferEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow18depthStencilFormatEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow18msaaColorImageViewEi@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow18swapChainImageSizeEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow18swapChainImageViewEi@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow19graphicsCommandPoolEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow19sampleCountFlagBitsEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow19swapChainImageCountEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow20concurrentFrameCountEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow20currentCommandBufferEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow21depthStencilImageViewEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow22deviceLocalMemoryIndexEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow22hostVisibleMemoryIndexEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow24graphicsQueueFamilyIndexEv@Qt_5 5.15.1
- (arch=linux-any)_ZNK13QVulkanWindow24physicalDevicePropertiesEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow26currentSwapChainImageIndexEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow5flagsEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow6deviceEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK13QVulkanWindow7isValidEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow10metaObjectEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow11colorFormatEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow12currentFrameEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow12supportsGrabEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow13graphicsQueueEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow14msaaColorImageEi@Qt_5 5.11.1
+ _ZNK13QVulkanWindow14physicalDeviceEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow14swapChainImageEi@Qt_5 5.11.1
+ _ZNK13QVulkanWindow17defaultRenderPassEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow17depthStencilImageEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow18currentFramebufferEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow18depthStencilFormatEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow18msaaColorImageViewEi@Qt_5 5.11.1
+ _ZNK13QVulkanWindow18swapChainImageSizeEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow18swapChainImageViewEi@Qt_5 5.11.1
+ _ZNK13QVulkanWindow19graphicsCommandPoolEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow19sampleCountFlagBitsEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow19swapChainImageCountEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow20concurrentFrameCountEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow20currentCommandBufferEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow21depthStencilImageViewEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow22deviceLocalMemoryIndexEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow22hostVisibleMemoryIndexEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow24graphicsQueueFamilyIndexEv@Qt_5 5.15.1
+ _ZNK13QVulkanWindow24physicalDevicePropertiesEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow26currentSwapChainImageIndexEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow5flagsEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow6deviceEv@Qt_5 5.11.1
+ _ZNK13QVulkanWindow7isValidEv@Qt_5 5.11.1
  _ZNK14QFileOpenEvent8openFileER5QFile6QFlagsIN9QIODevice12OpenModeFlagEE@Qt_5 5.0.2
  _ZNK14QGenericPlugin10metaObjectEv@Qt_5 5.0.2
  _ZNK14QImageIOPlugin10metaObjectEv@Qt_5 5.0.2
@@ -3962,15 +3946,15 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _ZNK15QTextCharFormat11anchorNamesEv@Qt_5 5.0.2
  _ZNK15QTextCharFormat13fontUnderlineEv@Qt_5 5.0.2
  _ZNK15QTextCharFormat4fontEv@Qt_5 5.0.2
- (arch=linux-any)_ZNK15QVulkanInstance10apiVersionEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK15QVulkanInstance10extensionsEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK15QVulkanInstance10vkInstanceEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK15QVulkanInstance5flagsEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK15QVulkanInstance6handleEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK15QVulkanInstance6layersEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK15QVulkanInstance7isValidEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK15QVulkanInstance9errorCodeEv@Qt_5 5.11.1
- (arch=linux-any)_ZNK15QVulkanInstance9functionsEv@Qt_5 5.11.1
+ _ZNK15QVulkanInstance10apiVersionEv@Qt_5 5.11.1
+ _ZNK15QVulkanInstance10extensionsEv@Qt_5 5.11.1
+ _ZNK15QVulkanInstance10vkInstanceEv@Qt_5 5.11.1
+ _ZNK15QVulkanInstance5flagsEv@Qt_5 5.11.1
+ _ZNK15QVulkanInstance6handleEv@Qt_5 5.11.1
+ _ZNK15QVulkanInstance6layersEv@Qt_5 5.11.1
+ _ZNK15QVulkanInstance7isValidEv@Qt_5 5.11.1
+ _ZNK15QVulkanInstance9errorCodeEv@Qt_5 5.11.1
+ _ZNK15QVulkanInstance9functionsEv@Qt_5 5.11.1
  _ZNK16QAccessibleEvent19accessibleInterfaceEv@Qt_5 5.0.2
  _ZNK16QAccessibleEvent8uniqueIdEv@Qt_5 5.2.0~rc1
  _ZNK16QConicalGradient5angleEv@Qt_5 5.0.2
@@ -4569,7 +4553,7 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _ZNK7QWindow13sizeIncrementEv@Qt_5 5.0.2
  _ZNK7QWindow13surfaceHandleEv@Qt_5 5.0.2
  _ZNK7QWindow14accessibleRootEv@Qt_5 5.0.2
- (arch=linux-any)_ZNK7QWindow14vulkanInstanceEv@Qt_5 5.11.1
+ _ZNK7QWindow14vulkanInstanceEv@Qt_5 5.11.1
  _ZNK7QWindow15requestedFormatEv@Qt_5 5.0.2
  _ZNK7QWindow15transientParentEv@Qt_5 5.0.2
  _ZNK7QWindow16devicePixelRatioEv@Qt_5 5.0.2
@@ -4796,10 +4780,10 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _ZNK9QVector4D16toVector3DAffineEv@Qt_5 5.0.2
  _ZNK9QVector4D6lengthEv@Qt_5 5.0.2
  _ZNK9QVector4Dcv8QVariantEv@Qt_5 5.0.2
- (optional=templinst|arch=alpha loong64 powerpc sh4|subst)_ZNSt6vectorIiSaIiEE14_M_fill_assignE{size_t}RKi@Qt_5 5.15.13
+ (optional=templinst|arch=m68k|subst)_ZNSt6vectorIiSaIiEE14_M_fill_assignE{size_t}RKi@Qt_5 5.15.13
  (optional=templinst|subst)_ZNSt6vectorIiSaIiEE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPiS1_EE{size_t}RKi@Qt_5 5.15.3
- (optional=templinst|arch=!alpha !loong64 !powerpc !sh4)_ZNSt6vectorIiSaIiEE17_M_realloc_appendIJRKiEEEvDpOT_@Qt_5 5.15.13
- (optional=templinst|arch=alpha loong64 powerpc sh4)_ZNSt6vectorIiSaIiEE17_M_realloc_insertIJRKiEEEvN9__gnu_cxx17__normal_iteratorIPiS1_EEDpOT_@Qt_5 5.15.13
+ (optional=templinst|arch=!m68k)_ZNSt6vectorIiSaIiEE17_M_realloc_appendIJRKiEEEvDpOT_@Qt_5 5.15.13
+ (optional=templinst|arch=m68k)_ZNSt6vectorIiSaIiEE17_M_realloc_insertIJRKiEEEvN9__gnu_cxx17__normal_iteratorIPiS1_EEDpOT_@Qt_5 5.15.13
  _ZTI10QClipboard@Qt_5 5.0.2
  _ZTI10QDropEvent@Qt_5 5.0.2
  _ZTI10QHelpEvent@Qt_5 5.0.2
@@ -4837,7 +4821,7 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _ZTI13QRasterWindow@Qt_5 5.4.0
  _ZTI13QStandardItem@Qt_5 5.0.2
  _ZTI13QTextDocument@Qt_5 5.0.2
- (arch=linux-any)_ZTI13QVulkanWindow@Qt_5 5.11.1
+ _ZTI13QVulkanWindow@Qt_5 5.11.1
  _ZTI14QDragMoveEvent@Qt_5 5.0.2
  _ZTI14QFileOpenEvent@Qt_5 5.0.2
  _ZTI14QGenericPlugin@Qt_5 5.0.2
@@ -4880,7 +4864,7 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _ZTI20QTextFrameLayoutData@Qt_5 5.0.2
  _ZTI20QTextObjectInterface@Qt_5 5.0.2
  _ZTI21QPlatformSurfaceEvent@Qt_5 5.5.0
- (arch=linux-any)_ZTI21QVulkanWindowRenderer@Qt_5 5.11.1
+ _ZTI21QVulkanWindowRenderer@Qt_5 5.11.1
  _ZTI22QAccessibleApplication@Qt_5 5.0.2
  _ZTI22QInputMethodQueryEvent@Qt_5 5.0.2
  _ZTI22QWhatsThisClickedEvent@Qt_5 5.0.2
@@ -4959,7 +4943,7 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _ZTS13QRasterWindow@Qt_5 5.4.0
  _ZTS13QStandardItem@Qt_5 5.0.2
  _ZTS13QTextDocument@Qt_5 5.0.2
- (arch=linux-any)_ZTS13QVulkanWindow@Qt_5 5.11.1
+ _ZTS13QVulkanWindow@Qt_5 5.11.1
  _ZTS14QDragMoveEvent@Qt_5 5.0.2
  _ZTS14QFileOpenEvent@Qt_5 5.0.2
  _ZTS14QGenericPlugin@Qt_5 5.0.2
@@ -5002,7 +4986,7 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _ZTS20QTextFrameLayoutData@Qt_5 5.0.2
  _ZTS20QTextObjectInterface@Qt_5 5.0.2
  _ZTS21QPlatformSurfaceEvent@Qt_5 5.5.0
- (arch=linux-any)_ZTS21QVulkanWindowRenderer@Qt_5 5.11.1
+ _ZTS21QVulkanWindowRenderer@Qt_5 5.11.1
  _ZTS22QAccessibleApplication@Qt_5 5.0.2
  _ZTS22QInputMethodQueryEvent@Qt_5 5.0.2
  _ZTS22QWhatsThisClickedEvent@Qt_5 5.0.2
@@ -5080,7 +5064,7 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _ZTV13QRasterWindow@Qt_5 5.4.0
  _ZTV13QStandardItem@Qt_5 5.0.2
  _ZTV13QTextDocument@Qt_5 5.0.2
- (arch=linux-any)_ZTV13QVulkanWindow@Qt_5 5.11.1
+ _ZTV13QVulkanWindow@Qt_5 5.11.1
  _ZTV14QDragMoveEvent@Qt_5 5.0.2
  _ZTV14QFileOpenEvent@Qt_5 5.0.2
  _ZTV14QGenericPlugin@Qt_5 5.0.2
@@ -5122,7 +5106,7 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _ZTV20QTextFrameLayoutData@Qt_5 5.0.2
  _ZTV20QTextObjectInterface@Qt_5 5.6.0~beta
  _ZTV21QPlatformSurfaceEvent@Qt_5 5.5.0
- (arch=linux-any)_ZTV21QVulkanWindowRenderer@Qt_5 5.11.1
+ _ZTV21QVulkanWindowRenderer@Qt_5 5.11.1
  _ZTV22QAccessibleApplication@Qt_5 5.0.2
  _ZTV22QInputMethodQueryEvent@Qt_5 5.0.2
  _ZTV22QWhatsThisClickedEvent@Qt_5 5.0.2
@@ -5197,10 +5181,10 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  _Zls6QDebugRK11QTextLength@Qt_5 5.0.2
  _Zls6QDebugRK12QKeySequence@Qt_5 5.0.2
  _Zls6QDebugRK12QPainterPath@Qt_5 5.0.2
- (arch=linux-any)_Zls6QDebugRK12QVulkanLayer@Qt_5 5.11.1
+ _Zls6QDebugRK12QVulkanLayer@Qt_5 5.11.1
  _Zls6QDebugRK14QSurfaceFormat@Qt_5 5.0.2
  _Zls6QDebugRK16QAccessibleEvent@Qt_5 5.0.2
- (arch=linux-any)_Zls6QDebugRK16QVulkanExtension@Qt_5 5.11.1
+ _Zls6QDebugRK16QVulkanExtension@Qt_5 5.11.1
  _Zls6QDebugRK19QOpenGLDebugMessage@Qt_5 5.1.0
  _Zls6QDebugRK21QOpenGLVersionProfile@Qt_5 5.10.0
  _Zls6QDebugRK4QPen@Qt_5 5.0.2
@@ -5295,7 +5279,7 @@ libQt5Gui.so.5 libqt5gui5t64 #MINVER# |
  (c++)"non-virtual thunk to QRasterWindow::metric(QPaintDevice::PaintDeviceMetric) const@Qt_5" 5.4.0
  (c++)"non-virtual thunk to QRasterWindow::redirected(QPoint*) const@Qt_5" 5.4.0
  (c++)"non-virtual thunk to QRasterWindow::~QRasterWindow()@Qt_5" 5.9.0~beta3
- (arch=linux-any|c++)"non-virtual thunk to QVulkanWindow::~QVulkanWindow()@Qt_5" 5.11.1
+ (c++)"non-virtual thunk to QVulkanWindow::~QVulkanWindow()@Qt_5" 5.11.1
  (c++)"non-virtual thunk to QWindow::format() const@Qt_5" 5.0.2
  (c++)"non-virtual thunk to QWindow::surfaceHandle() const@Qt_5" 5.0.2
  (c++)"non-virtual thunk to QWindow::surfaceType() const@Qt_5" 5.0.2
diff -pruN 5.15.15+dfsg-2/debian/patches/CVE-2023-51714.diff 5.15.17+dfsg-1/debian/patches/CVE-2023-51714.diff
--- 5.15.15+dfsg-2/debian/patches/CVE-2023-51714.diff	2024-10-25 11:41:28.000000000 +0000
+++ 5.15.17+dfsg-1/debian/patches/CVE-2023-51714.diff	1970-01-01 00:00:00.000000000 +0000
@@ -1,29 +0,0 @@
-Description: HPack: fix incorrect integer overflow check
-Origin: upstream
- https://download.qt.io/official_releases/qt/5.15/0001-CVE-2023-51714-qtbase-5.15.diff
- https://download.qt.io/official_releases/qt/5.15/0002-CVE-2023-51714-qtbase-5.15.diff
-Last-Update: 2024-01-13
-
---- a/src/network/access/http2/hpacktable.cpp
-+++ b/src/network/access/http2/hpacktable.cpp
-@@ -40,6 +40,7 @@
- #include "hpacktable_p.h"
- 
- #include <QtCore/qdebug.h>
-+#include <QtCore/private/qnumeric_p.h>
- 
- #include <algorithm>
- #include <cstddef>
-@@ -62,8 +63,10 @@ HeaderSize entry_size(const QByteArray &
-     // for counting the number of references to the name and value would have
-     // 32 octets of overhead."
- 
--    const unsigned sum = unsigned(name.size() + value.size());
--    if (std::numeric_limits<unsigned>::max() - 32 < sum)
-+    size_t sum;
-+    if (add_overflow(size_t(name.size()), size_t(value.size()), &sum))
-+        return HeaderSize();
-+    if (sum > (std::numeric_limits<unsigned>::max() - 32))
-         return HeaderSize();
-     return HeaderSize(true, quint32(sum + 32));
- }
diff -pruN 5.15.15+dfsg-2/debian/patches/CVE-2024-25580.diff 5.15.17+dfsg-1/debian/patches/CVE-2024-25580.diff
--- 5.15.15+dfsg-2/debian/patches/CVE-2024-25580.diff	2024-10-25 11:41:28.000000000 +0000
+++ 5.15.17+dfsg-1/debian/patches/CVE-2024-25580.diff	1970-01-01 00:00:00.000000000 +0000
@@ -1,197 +0,0 @@
-Description: improve KTX file reading memory safety
-Origin: upstream, https://download.qt.io/official_releases/qt/5.15/CVE-2024-25580-qtbase-5.15.diff
-Last-Update: 2024-02-17
-
---- a/src/gui/util/qktxhandler.cpp
-+++ b/src/gui/util/qktxhandler.cpp
-@@ -73,7 +73,7 @@ struct KTXHeader {
-     quint32 bytesOfKeyValueData;
- };
- 
--static const quint32 headerSize = sizeof(KTXHeader);
-+static constexpr quint32 qktxh_headerSize = sizeof(KTXHeader);
- 
- // Currently unused, declared for future reference
- struct KTXKeyValuePairItem {
-@@ -103,11 +103,36 @@ struct KTXMipmapLevel {
-     */
- };
- 
--bool QKtxHandler::canRead(const QByteArray &suffix, const QByteArray &block)
-+static bool qAddOverflow(quint32 v1, quint32 v2, quint32 *r) {
-+    // unsigned additions are well-defined
-+    *r = v1 + v2;
-+    return v1 > quint32(v1 + v2);
-+}
-+
-+// Returns the nearest multiple of 4 greater than or equal to 'value'
-+static bool nearestMultipleOf4(quint32 value, quint32 *result)
- {
--    Q_UNUSED(suffix)
-+    constexpr quint32 rounding = 4;
-+    *result = 0;
-+    if (qAddOverflow(value, rounding - 1, result))
-+        return true;
-+    *result &= ~(rounding - 1);
-+    return false;
-+}
- 
--    return (qstrncmp(block.constData(), ktxIdentifier, KTX_IDENTIFIER_LENGTH) == 0);
-+// Returns a slice with prechecked bounds
-+static QByteArray safeSlice(const QByteArray& array, quint32 start, quint32 length)
-+{
-+    quint32 end = 0;
-+    if (qAddOverflow(start, length, &end) || end > quint32(array.length()))
-+        return {};
-+    return QByteArray(array.data() + start, length);
-+}
-+
-+bool QKtxHandler::canRead(const QByteArray &suffix, const QByteArray &block)
-+{
-+    Q_UNUSED(suffix);
-+    return block.startsWith(QByteArray::fromRawData(ktxIdentifier, KTX_IDENTIFIER_LENGTH));
- }
- 
- QTextureFileData QKtxHandler::read()
-@@ -115,42 +140,97 @@ QTextureFileData QKtxHandler::read()
-     if (!device())
-         return QTextureFileData();
- 
--    QByteArray buf = device()->readAll();
--    const quint32 dataSize = quint32(buf.size());
--    if (dataSize < headerSize || !canRead(QByteArray(), buf)) {
--        qCDebug(lcQtGuiTextureIO, "Invalid KTX file %s", logName().constData());
-+    const QByteArray buf = device()->readAll();
-+    if (size_t(buf.size()) > std::numeric_limits<quint32>::max()) {
-+        qWarning(lcQtGuiTextureIO, "Too big KTX file %s", logName().constData());
-+        return QTextureFileData();
-+    }
-+
-+    if (!canRead(QByteArray(), buf)) {
-+        qWarning(lcQtGuiTextureIO, "Invalid KTX file %s", logName().constData());
-+        return QTextureFileData();
-+    }
-+
-+    if (buf.size() < qsizetype(qktxh_headerSize)) {
-+        qWarning(lcQtGuiTextureIO, "Invalid KTX header size in %s", logName().constData());
-         return QTextureFileData();
-     }
- 
--    const KTXHeader *header = reinterpret_cast<const KTXHeader *>(buf.constData());
--    if (!checkHeader(*header)) {
--        qCDebug(lcQtGuiTextureIO, "Unsupported KTX file format in %s", logName().constData());
-+    KTXHeader header;
-+    memcpy(&header, buf.data(), qktxh_headerSize);
-+    if (!checkHeader(header)) {
-+        qWarning(lcQtGuiTextureIO, "Unsupported KTX file format in %s", logName().constData());
-         return QTextureFileData();
-     }
- 
-     QTextureFileData texData;
-     texData.setData(buf);
- 
--    texData.setSize(QSize(decode(header->pixelWidth), decode(header->pixelHeight)));
--    texData.setGLFormat(decode(header->glFormat));
--    texData.setGLInternalFormat(decode(header->glInternalFormat));
--    texData.setGLBaseInternalFormat(decode(header->glBaseInternalFormat));
--
--    texData.setNumLevels(decode(header->numberOfMipmapLevels));
--    quint32 offset = headerSize + decode(header->bytesOfKeyValueData);
--    const int maxLevels = qMin(texData.numLevels(), 32);               // Cap iterations in case of corrupt file.
--    for (int i = 0; i < maxLevels; i++) {
--        if (offset + sizeof(KTXMipmapLevel) > dataSize)                // Corrupt file; avoid oob read
--            break;
--        const KTXMipmapLevel *level = reinterpret_cast<const KTXMipmapLevel *>(buf.constData() + offset);
--        quint32 levelLen = decode(level->imageSize);
--        texData.setDataOffset(offset + sizeof(KTXMipmapLevel::imageSize), i);
--        texData.setDataLength(levelLen, i);
--        offset += sizeof(KTXMipmapLevel::imageSize) + levelLen + (3 - ((levelLen + 3) % 4));
-+    texData.setSize(QSize(decode(header.pixelWidth), decode(header.pixelHeight)));
-+    texData.setGLFormat(decode(header.glFormat));
-+    texData.setGLInternalFormat(decode(header.glInternalFormat));
-+    texData.setGLBaseInternalFormat(decode(header.glBaseInternalFormat));
-+
-+    texData.setNumLevels(decode(header.numberOfMipmapLevels));
-+
-+    const quint32 bytesOfKeyValueData = decode(header.bytesOfKeyValueData);
-+    quint32 headerKeyValueSize;
-+    if (qAddOverflow(qktxh_headerSize, bytesOfKeyValueData, &headerKeyValueSize)) {
-+        qWarning(lcQtGuiTextureIO, "Overflow in size of key value data in header of KTX file %s",
-+                 logName().constData());
-+        return QTextureFileData();
-+    }
-+
-+    if (headerKeyValueSize >= quint32(buf.size())) {
-+        qWarning(lcQtGuiTextureIO, "OOB request in KTX file %s", logName().constData());
-+        return QTextureFileData();
-+    }
-+
-+    // Technically, any number of levels is allowed but if the value is bigger than
-+    // what is possible in KTX V2 (and what makes sense) we return an error.
-+    // maxLevels = log2(max(width, height, depth))
-+    const int maxLevels = (sizeof(quint32) * 8)
-+            - qCountLeadingZeroBits(std::max(
-+                    { header.pixelWidth, header.pixelHeight, header.pixelDepth }));
-+
-+    if (texData.numLevels() > maxLevels) {
-+        qWarning(lcQtGuiTextureIO, "Too many levels in KTX file %s", logName().constData());
-+        return QTextureFileData();
-+    }
-+
-+    quint32 offset = headerKeyValueSize;
-+    for (int level = 0; level < texData.numLevels(); level++) {
-+        const auto imageSizeSlice = safeSlice(buf, offset, sizeof(quint32));
-+        if (imageSizeSlice.isEmpty()) {
-+            qWarning(lcQtGuiTextureIO, "OOB request in KTX file %s", logName().constData());
-+            return QTextureFileData();
-+        }
-+
-+        const quint32 imageSize = decode(qFromUnaligned<quint32>(imageSizeSlice.data()));
-+        offset += sizeof(quint32); // overflow checked indirectly above
-+
-+        texData.setDataOffset(offset, level);
-+        texData.setDataLength(imageSize, level);
-+
-+        // Add image data and padding to offset
-+        quint32 padded = 0;
-+        if (nearestMultipleOf4(imageSize, &padded)) {
-+            qWarning(lcQtGuiTextureIO, "Overflow in KTX file %s", logName().constData());
-+            return QTextureFileData();
-+        }
-+
-+        quint32 offsetNext;
-+        if (qAddOverflow(offset, padded, &offsetNext)) {
-+            qWarning(lcQtGuiTextureIO, "OOB request in KTX file %s", logName().constData());
-+            return QTextureFileData();
-+        }
-+
-+        offset = offsetNext;
-     }
- 
-     if (!texData.isValid()) {
--        qCDebug(lcQtGuiTextureIO, "Invalid values in header of KTX file %s", logName().constData());
-+        qWarning(lcQtGuiTextureIO, "Invalid values in header of KTX file %s",
-+                 logName().constData());
-         return QTextureFileData();
-     }
- 
-@@ -191,7 +271,7 @@ bool QKtxHandler::checkHeader(const KTXH
-             (decode(header.numberOfFaces) == 1));
- }
- 
--quint32 QKtxHandler::decode(quint32 val)
-+quint32 QKtxHandler::decode(quint32 val) const
- {
-     return inverseEndian ? qbswap<quint32>(val) : val;
- }
---- a/src/gui/util/qktxhandler_p.h
-+++ b/src/gui/util/qktxhandler_p.h
-@@ -68,7 +68,7 @@ public:
- 
- private:
-     bool checkHeader(const KTXHeader &header);
--    quint32 decode(quint32 val);
-+    quint32 decode(quint32 val) const;
- 
-     bool inverseEndian = false;
- };
diff -pruN 5.15.15+dfsg-2/debian/patches/CVE-2024-39936.diff 5.15.17+dfsg-1/debian/patches/CVE-2024-39936.diff
--- 5.15.15+dfsg-2/debian/patches/CVE-2024-39936.diff	2024-10-25 11:41:28.000000000 +0000
+++ 5.15.17+dfsg-1/debian/patches/CVE-2024-39936.diff	2025-07-10 12:01:47.000000000 +0000
@@ -23,7 +23,7 @@ Last-Update: 2024-07-14
 
 --- a/src/network/access/qhttp2protocolhandler.cpp
 +++ b/src/network/access/qhttp2protocolhandler.cpp
-@@ -371,12 +371,12 @@ bool QHttp2ProtocolHandler::sendRequest(
+@@ -375,12 +375,12 @@ bool QHttp2ProtocolHandler::sendRequest(
          }
      }
  
diff -pruN 5.15.15+dfsg-2/debian/patches/a11y_null_checks.diff 5.15.17+dfsg-1/debian/patches/a11y_null_checks.diff
--- 5.15.15+dfsg-2/debian/patches/a11y_null_checks.diff	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/debian/patches/a11y_null_checks.diff	2025-07-10 12:01:47.000000000 +0000
@@ -0,0 +1,76 @@
+Description: a11y atspi: add null checks in table iface methods
+ Add null checks to cover the cases where QAccessibleTableInterface::cellAt
+ returns nullptr (which happens e.g. when called with invalid indices via
+ AT-SPI) or where the cell object doesn't implement the
+ QAccessibleTableCellInterface, which would previously result in crashes.
+ .
+ Cherry-picked into 5.15 as it fixes a crash in popular accessibility client
+ software. Conflict resolution: remove C++17'isms (`if` with initializer).
+Origin: upstream, https://invent.kde.org/qt/qt/qtbase/-/commit/076da096464a5d3f
+Last-Update: 2025-03-24
+Bug: https://bugs.debian.org/1081682
+
+--- a/src/platformsupport/linuxaccessibility/atspiadaptor.cpp
++++ b/src/platformsupport/linuxaccessibility/atspiadaptor.cpp
+@@ -2393,13 +2393,14 @@ bool AtSpiAdaptor::tableInterface(QAcces
+         if (cols > 0) {
+             row = index / cols;
+             col = index % cols;
+-            QAccessibleTableCellInterface *cell = interface->tableInterface()->cellAt(row, col)->tableCellInterface();
+-            if (cell) {
+-                row = cell->rowIndex();
+-                col = cell->columnIndex();
+-                rowExtents = cell->rowExtent();
+-                colExtents = cell->columnExtent();
+-                isSelected = cell->isSelected();
++            QAccessibleInterface *cell = interface->tableInterface()->cellAt(row, col);
++            QAccessibleTableCellInterface *cellIface = cell ? cell->tableCellInterface() : nullptr;
++            if (cellIface) {
++                row = cellIface->rowIndex();
++                col = cellIface->columnIndex();
++                rowExtents = cellIface->rowExtent();
++                colExtents = cellIface->columnExtent();
++                isSelected = cellIface->isSelected();
+                 success = true;
+             }
+         }
+@@ -2410,12 +2411,22 @@ bool AtSpiAdaptor::tableInterface(QAcces
+     } else if (function == QLatin1String("GetColumnExtentAt")) {
+         int row = message.arguments().at(0).toInt();
+         int column = message.arguments().at(1).toInt();
+-        connection.send(message.createReply(interface->tableInterface()->cellAt(row, column)->tableCellInterface()->columnExtent()));
++        int columnExtent = 0;
++        QAccessibleInterface *cell = interface->tableInterface()->cellAt(row, column);
++        QAccessibleTableCellInterface *cellIface = cell ? cell->tableCellInterface() : nullptr;
++        if (cellIface)
++            columnExtent = cellIface->columnExtent();
++        connection.send(message.createReply(columnExtent));
+ 
+     } else if (function == QLatin1String("GetRowExtentAt")) {
+         int row = message.arguments().at(0).toInt();
+         int column = message.arguments().at(1).toInt();
+-        connection.send(message.createReply(interface->tableInterface()->cellAt(row, column)->tableCellInterface()->rowExtent()));
++        int rowExtent = 0;
++        QAccessibleInterface *cell = interface->tableInterface()->cellAt(row, column);
++        QAccessibleTableCellInterface *cellIface = cell ? cell->tableCellInterface() : nullptr;
++        if (cellIface)
++            rowExtent = cellIface->rowExtent();
++        connection.send(message.createReply(rowExtent));
+ 
+     } else if (function == QLatin1String("GetColumnHeader")) {
+         int column = message.arguments().at(0).toInt();
+@@ -2455,8 +2466,12 @@ bool AtSpiAdaptor::tableInterface(QAcces
+     } else if (function == QLatin1String("IsSelected")) {
+         int row = message.arguments().at(0).toInt();
+         int column = message.arguments().at(1).toInt();
+-        QAccessibleTableCellInterface* cell = interface->tableInterface()->cellAt(row, column)->tableCellInterface();
+-        connection.send(message.createReply(cell->isSelected()));
++        bool isSelected = false;
++        QAccessibleInterface *cell = interface->tableInterface()->cellAt(row, column);
++        QAccessibleTableCellInterface *cellIface = cell ? cell->tableCellInterface() : nullptr;
++        if (cellIface)
++            isSelected = cellIface->isSelected();
++        connection.send(message.createReply(isSelected));
+     } else if (function == QLatin1String("AddColumnSelection")) {
+         int column = message.arguments().at(0).toInt();
+         connection.send(message.createReply(interface->tableInterface()->selectColumn(column)));
diff -pruN 5.15.15+dfsg-2/debian/patches/containsTLDEntry.diff 5.15.17+dfsg-1/debian/patches/containsTLDEntry.diff
--- 5.15.15+dfsg-2/debian/patches/containsTLDEntry.diff	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/debian/patches/containsTLDEntry.diff	2025-07-10 12:01:47.000000000 +0000
@@ -0,0 +1,20 @@
+Description: fix containsTLDEntry crash when there are three or more chunks
+ tldChunks[N] contains total size of chunks from 0 to N, not just the Nth one.
+Author: Dmitry Shachnev <mitya57@debian.org>
+Forwarded: no
+Bug-Debian: https://bugs.debian.org/1095423
+Last-Update: 2025-02-08
+
+--- a/src/corelib/io/qtldurl.cpp
++++ b/src/corelib/io/qtldurl.cpp
+@@ -86,8 +86,8 @@ static bool containsTLDEntry(QStringView
+ 
+     // Find which chunk contains the tldGroupOffset
+     while (tldGroupOffset >= tldChunks[chunk]) {
+-        chunkIndex -= tldChunks[chunk];
+-        offset += tldChunks[chunk];
++        chunkIndex = tldIndices[index] - tldChunks[chunk];
++        offset = tldChunks[chunk];
+         chunk++;
+ 
+         // We can not go above the number of chunks we have, since all our
diff -pruN 5.15.15+dfsg-2/debian/patches/gcc_14.diff 5.15.17+dfsg-1/debian/patches/gcc_14.diff
--- 5.15.15+dfsg-2/debian/patches/gcc_14.diff	2024-10-25 11:41:28.000000000 +0000
+++ 5.15.17+dfsg-1/debian/patches/gcc_14.diff	1970-01-01 00:00:00.000000000 +0000
@@ -1,19 +0,0 @@
-Description: QFutureInterface: fix build with GCC14/C++20: template-id not allowed
- When declaring a constructor, you must use the injected name, not a
- template.
- .
- qfutureinterface.h:472:37: error: template-id not allowed for constructor in C++20 [-Werror=template-id-cdtor]
-Origin: upstream, https://code.qt.io/cgit/qt/qtbase.git/commit/?id=111c08d0eaa13465
-Last-Update: 2024-07-24
-
---- a/src/corelib/thread/qfutureinterface.h
-+++ b/src/corelib/thread/qfutureinterface.h
-@@ -281,7 +281,7 @@ template <>
- class QFutureInterface<void> : public QFutureInterfaceBase
- {
- public:
--    explicit QFutureInterface<void>(State initialState = NoState)
-+    explicit QFutureInterface(State initialState = NoState)
-         : QFutureInterfaceBase(initialState)
-     { }
- 
diff -pruN 5.15.15+dfsg-2/debian/patches/libxkbcommon_1.6.0.diff 5.15.17+dfsg-1/debian/patches/libxkbcommon_1.6.0.diff
--- 5.15.15+dfsg-2/debian/patches/libxkbcommon_1.6.0.diff	2024-10-25 11:41:28.000000000 +0000
+++ 5.15.17+dfsg-1/debian/patches/libxkbcommon_1.6.0.diff	1970-01-01 00:00:00.000000000 +0000
@@ -1,24 +0,0 @@
-Description: xkb: fix build with libxkbcommon 1.6.0 and later
- A few XKB_KEY_dead_* defines got removed from 1.6.0. See also
- https://github.com/xkbcommon/libxkbcommon/blob/6073565903488cb5b9a8d37fdc4a7c2f9d7ad04d/NEWS#L9-L14
- https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/merge_requests/70/diffs?commit_id=cb44799b72f611eb4c9d7cc185bc3b09e070be08
-Origin: upstream, https://code.qt.io/cgit/qt/qtbase.git/commit/?id=8af35d27e8f02bbb
-Last-Update: 2023-10-17
-
---- a/src/platformsupport/input/xkbcommon/qxkbcommon.cpp
-+++ b/src/platformsupport/input/xkbcommon/qxkbcommon.cpp
-@@ -273,10 +273,14 @@ static constexpr const auto KeyTbl = qMa
-         Xkb2Qt<XKB_KEY_dead_small_schwa,        Qt::Key_Dead_Small_Schwa>,
-         Xkb2Qt<XKB_KEY_dead_capital_schwa,      Qt::Key_Dead_Capital_Schwa>,
-         Xkb2Qt<XKB_KEY_dead_greek,              Qt::Key_Dead_Greek>,
-+/* The following four XKB_KEY_dead keys got removed in libxkbcommon 1.6.0
-+   The define check is kind of version check here. */
-+#ifdef XKB_KEY_dead_lowline
-         Xkb2Qt<XKB_KEY_dead_lowline,            Qt::Key_Dead_Lowline>,
-         Xkb2Qt<XKB_KEY_dead_aboveverticalline,  Qt::Key_Dead_Aboveverticalline>,
-         Xkb2Qt<XKB_KEY_dead_belowverticalline,  Qt::Key_Dead_Belowverticalline>,
-         Xkb2Qt<XKB_KEY_dead_longsolidusoverlay, Qt::Key_Dead_Longsolidusoverlay>,
-+#endif
- 
-         // Special keys from X.org - This include multimedia keys,
-         // wireless/bluetooth/uwb keys, special launcher keys, etc.
diff -pruN 5.15.15+dfsg-2/debian/patches/series 5.15.17+dfsg-1/debian/patches/series
--- 5.15.15+dfsg-2/debian/patches/series	2024-10-25 11:41:28.000000000 +0000
+++ 5.15.17+dfsg-1/debian/patches/series	2025-07-10 12:01:47.000000000 +0000
@@ -9,15 +9,12 @@ sql_odbc_more_unicode_checks.diff
 a11y_root.diff
 dont_use_O_PATH.diff
 fix_qdbusmacros_h.diff
-libxkbcommon_1.6.0.diff
 loongarch.diff
-CVE-2023-51714.diff
-CVE-2024-25580.diff
 CVE-2024-39936.diff
-gcc_14.diff
 revert_statusnotifierhost_checking.diff
 dont_fallback_to_x11_tray_on_non_x11.diff
 check_dbus_tray_availability_every_time.diff
+a11y_null_checks.diff
 
 # Debian specific.
 no_htmlinfo_example.diff
@@ -30,3 +27,4 @@ path_max.diff
 qstorageinfo_linux.diff
 cross_build_mysql.diff
 cast_types_for_egl_x11_test.diff
+containsTLDEntry.diff
diff -pruN 5.15.15+dfsg-2/debian/qtbase5-gles-dev.install 5.15.17+dfsg-1/debian/qtbase5-gles-dev.install
--- 5.15.15+dfsg-2/debian/qtbase5-gles-dev.install	2024-10-25 11:41:28.000000000 +0000
+++ 5.15.17+dfsg-1/debian/qtbase5-gles-dev.install	2025-07-10 12:01:47.000000000 +0000
@@ -22,7 +22,6 @@
 [linux-any] usr/lib/${DEB_HOST_MULTIARCH}/qt5/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri
 [linux-any] usr/lib/${DEB_HOST_MULTIARCH}/qt5/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri
 [linux-any] usr/lib/${DEB_HOST_MULTIARCH}/qt5/mkspecs/modules/qt_lib_kms_support_private.pri
-[linux-any] usr/lib/${DEB_HOST_MULTIARCH}/qt5/mkspecs/modules/qt_lib_vulkan_support_private.pri
 usr/include/${DEB_HOST_MULTIARCH}/qt5/QtConcurrent/QtConcurrent
 usr/include/${DEB_HOST_MULTIARCH}/qt5/QtConcurrent/QtConcurrentDepends
 usr/include/${DEB_HOST_MULTIARCH}/qt5/QtConcurrent/QtConcurrentFilter
@@ -1783,6 +1782,7 @@ usr/lib/${DEB_HOST_MULTIARCH}/qt5/mkspec
 usr/lib/${DEB_HOST_MULTIARCH}/qt5/mkspecs/modules/qt_lib_testlib.pri
 usr/lib/${DEB_HOST_MULTIARCH}/qt5/mkspecs/modules/qt_lib_testlib_private.pri
 usr/lib/${DEB_HOST_MULTIARCH}/qt5/mkspecs/modules/qt_lib_theme_support_private.pri
+usr/lib/${DEB_HOST_MULTIARCH}/qt5/mkspecs/modules/qt_lib_vulkan_support_private.pri
 usr/lib/${DEB_HOST_MULTIARCH}/qt5/mkspecs/modules/qt_lib_widgets.pri
 usr/lib/${DEB_HOST_MULTIARCH}/qt5/mkspecs/modules/qt_lib_widgets_private.pri
 usr/lib/${DEB_HOST_MULTIARCH}/qt5/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri
diff -pruN 5.15.15+dfsg-2/debian/qtbase5-private-gles-dev.install 5.15.17+dfsg-1/debian/qtbase5-private-gles-dev.install
--- 5.15.15+dfsg-2/debian/qtbase5-private-gles-dev.install	2024-10-25 11:41:28.000000000 +0000
+++ 5.15.17+dfsg-1/debian/qtbase5-private-gles-dev.install	2025-07-10 12:01:47.000000000 +0000
@@ -9,21 +9,12 @@
 [linux-any] usr/include/${DEB_HOST_MULTIARCH}/qt5/QtKmsSupport/QtKmsSupportDepends
 [linux-any] usr/include/${DEB_HOST_MULTIARCH}/qt5/QtKmsSupport/QtKmsSupportVersion
 [linux-any] usr/include/${DEB_HOST_MULTIARCH}/qt5/QtKmsSupport/qtkmssupportversion.h
-[linux-any] usr/include/${DEB_HOST_MULTIARCH}/qt5/QtVulkanSupport/5.*/*
-[linux-any] usr/include/${DEB_HOST_MULTIARCH}/qt5/QtVulkanSupport/QtVulkanSupport
-[linux-any] usr/include/${DEB_HOST_MULTIARCH}/qt5/QtVulkanSupport/QtVulkanSupportDepends
-[linux-any] usr/include/${DEB_HOST_MULTIARCH}/qt5/QtVulkanSupport/QtVulkanSupportVersion
-[linux-any] usr/include/${DEB_HOST_MULTIARCH}/qt5/QtVulkanSupport/qtvulkansupportversion.h
 [linux-any] usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt5EglFSDeviceIntegration/Qt5EglFSDeviceIntegrationConfig.cmake
 [linux-any] usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt5EglFSDeviceIntegration/Qt5EglFSDeviceIntegrationConfigVersion.cmake
 [linux-any] usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt5KmsSupport/Qt5KmsSupportConfig.cmake
 [linux-any] usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt5KmsSupport/Qt5KmsSupportConfigVersion.cmake
-[linux-any] usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt5VulkanSupport/Qt5VulkanSupportConfig.cmake
-[linux-any] usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt5VulkanSupport/Qt5VulkanSupportConfigVersion.cmake
 [linux-any] usr/lib/${DEB_HOST_MULTIARCH}/libQt5KmsSupport.a
 [linux-any] usr/lib/${DEB_HOST_MULTIARCH}/libQt5KmsSupport.prl
-[linux-any] usr/lib/${DEB_HOST_MULTIARCH}/libQt5VulkanSupport.a
-[linux-any] usr/lib/${DEB_HOST_MULTIARCH}/libQt5VulkanSupport.prl
 usr/include/${DEB_HOST_MULTIARCH}/qt5/QtAccessibilitySupport/5.*/*
 usr/include/${DEB_HOST_MULTIARCH}/qt5/QtAccessibilitySupport/QtAccessibilitySupport
 usr/include/${DEB_HOST_MULTIARCH}/qt5/QtAccessibilitySupport/QtAccessibilitySupportDepends
@@ -94,6 +85,11 @@ usr/include/${DEB_HOST_MULTIARCH}/qt5/Qt
 usr/include/${DEB_HOST_MULTIARCH}/qt5/QtThemeSupport/QtThemeSupportDepends
 usr/include/${DEB_HOST_MULTIARCH}/qt5/QtThemeSupport/QtThemeSupportVersion
 usr/include/${DEB_HOST_MULTIARCH}/qt5/QtThemeSupport/qtthemesupportversion.h
+usr/include/${DEB_HOST_MULTIARCH}/qt5/QtVulkanSupport/5.*/*
+usr/include/${DEB_HOST_MULTIARCH}/qt5/QtVulkanSupport/QtVulkanSupport
+usr/include/${DEB_HOST_MULTIARCH}/qt5/QtVulkanSupport/QtVulkanSupportDepends
+usr/include/${DEB_HOST_MULTIARCH}/qt5/QtVulkanSupport/QtVulkanSupportVersion
+usr/include/${DEB_HOST_MULTIARCH}/qt5/QtVulkanSupport/qtvulkansupportversion.h
 usr/include/${DEB_HOST_MULTIARCH}/qt5/QtWidgets/5.*/*
 usr/include/${DEB_HOST_MULTIARCH}/qt5/QtXkbCommonSupport/5.*/*
 usr/include/${DEB_HOST_MULTIARCH}/qt5/QtXkbCommonSupport/QtXkbCommonSupport
@@ -125,6 +121,8 @@ usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt5S
 usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt5ServiceSupport/Qt5ServiceSupportConfigVersion.cmake
 usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt5ThemeSupport/Qt5ThemeSupportConfig.cmake
 usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt5ThemeSupport/Qt5ThemeSupportConfigVersion.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt5VulkanSupport/Qt5VulkanSupportConfig.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt5VulkanSupport/Qt5VulkanSupportConfigVersion.cmake
 usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt5XcbQpa/Qt5XcbQpaConfig.cmake
 usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt5XcbQpa/Qt5XcbQpaConfigVersion.cmake
 usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt5XkbCommonSupport/Qt5XkbCommonSupportConfig.cmake
@@ -153,5 +151,7 @@ usr/lib/${DEB_HOST_MULTIARCH}/libQt5Serv
 usr/lib/${DEB_HOST_MULTIARCH}/libQt5ServiceSupport.prl
 usr/lib/${DEB_HOST_MULTIARCH}/libQt5ThemeSupport.a
 usr/lib/${DEB_HOST_MULTIARCH}/libQt5ThemeSupport.prl
+usr/lib/${DEB_HOST_MULTIARCH}/libQt5VulkanSupport.a
+usr/lib/${DEB_HOST_MULTIARCH}/libQt5VulkanSupport.prl
 usr/lib/${DEB_HOST_MULTIARCH}/libQt5XkbCommonSupport.a
 usr/lib/${DEB_HOST_MULTIARCH}/libQt5XkbCommonSupport.prl
diff -pruN 5.15.15+dfsg-2/include/QtAccessibilitySupport/5.15.15/QtAccessibilitySupport/private/qaccessiblebridgeutils_p.h 5.15.17+dfsg-1/include/QtAccessibilitySupport/5.15.15/QtAccessibilitySupport/private/qaccessiblebridgeutils_p.h
--- 5.15.15+dfsg-2/include/QtAccessibilitySupport/5.15.15/QtAccessibilitySupport/private/qaccessiblebridgeutils_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtAccessibilitySupport/5.15.15/QtAccessibilitySupport/private/qaccessiblebridgeutils_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/accessibility/qaccessiblebridgeutils_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtAccessibilitySupport/5.15.17/QtAccessibilitySupport/private/qaccessiblebridgeutils_p.h 5.15.17+dfsg-1/include/QtAccessibilitySupport/5.15.17/QtAccessibilitySupport/private/qaccessiblebridgeutils_p.h
--- 5.15.15+dfsg-2/include/QtAccessibilitySupport/5.15.17/QtAccessibilitySupport/private/qaccessiblebridgeutils_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtAccessibilitySupport/5.15.17/QtAccessibilitySupport/private/qaccessiblebridgeutils_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/accessibility/qaccessiblebridgeutils_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtAccessibilitySupport/qtaccessibilitysupportversion.h 5.15.17+dfsg-1/include/QtAccessibilitySupport/qtaccessibilitysupportversion.h
--- 5.15.15+dfsg-2/include/QtAccessibilitySupport/qtaccessibilitysupportversion.h	2024-08-16 06:16:11.537243000 +0000
+++ 5.15.17+dfsg-1/include/QtAccessibilitySupport/qtaccessibilitysupportversion.h	2025-02-26 11:03:01.815832400 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTACCESSIBILITYSUPPORT_VERSION_H
 #define QT_QTACCESSIBILITYSUPPORT_VERSION_H
 
-#define QTACCESSIBILITYSUPPORT_VERSION_STR "5.15.15"
+#define QTACCESSIBILITYSUPPORT_VERSION_STR "5.15.17"
 
-#define QTACCESSIBILITYSUPPORT_VERSION 0x050F0F
+#define QTACCESSIBILITYSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTACCESSIBILITYSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtClipboardSupport/5.15.15/QtClipboardSupport/private/qmacmime_p.h 5.15.17+dfsg-1/include/QtClipboardSupport/5.15.15/QtClipboardSupport/private/qmacmime_p.h
--- 5.15.15+dfsg-2/include/QtClipboardSupport/5.15.15/QtClipboardSupport/private/qmacmime_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtClipboardSupport/5.15.15/QtClipboardSupport/private/qmacmime_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/clipboard/qmacmime_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtClipboardSupport/5.15.17/QtClipboardSupport/private/qmacmime_p.h 5.15.17+dfsg-1/include/QtClipboardSupport/5.15.17/QtClipboardSupport/private/qmacmime_p.h
--- 5.15.15+dfsg-2/include/QtClipboardSupport/5.15.17/QtClipboardSupport/private/qmacmime_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtClipboardSupport/5.15.17/QtClipboardSupport/private/qmacmime_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/clipboard/qmacmime_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtClipboardSupport/qtclipboardsupportversion.h 5.15.17+dfsg-1/include/QtClipboardSupport/qtclipboardsupportversion.h
--- 5.15.15+dfsg-2/include/QtClipboardSupport/qtclipboardsupportversion.h	2024-08-16 06:16:11.533242700 +0000
+++ 5.15.17+dfsg-1/include/QtClipboardSupport/qtclipboardsupportversion.h	2025-02-26 11:02:59.075807600 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTCLIPBOARDSUPPORT_VERSION_H
 #define QT_QTCLIPBOARDSUPPORT_VERSION_H
 
-#define QTCLIPBOARDSUPPORT_VERSION_STR "5.15.15"
+#define QTCLIPBOARDSUPPORT_VERSION_STR "5.15.17"
 
-#define QTCLIPBOARDSUPPORT_VERSION 0x050F0F
+#define QTCLIPBOARDSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTCLIPBOARDSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtConcurrent/qtconcurrentversion.h 5.15.17+dfsg-1/include/QtConcurrent/qtconcurrentversion.h
--- 5.15.15+dfsg-2/include/QtConcurrent/qtconcurrentversion.h	2024-08-16 06:16:13.373252600 +0000
+++ 5.15.17+dfsg-1/include/QtConcurrent/qtconcurrentversion.h	2025-02-26 11:02:59.215808900 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTCONCURRENT_VERSION_H
 #define QT_QTCONCURRENT_VERSION_H
 
-#define QTCONCURRENT_VERSION_STR "5.15.15"
+#define QTCONCURRENT_VERSION_STR "5.15.17"
 
-#define QTCONCURRENT_VERSION 0x050F0F
+#define QTCONCURRENT_VERSION 0x050F11
 
 #endif // QT_QTCONCURRENT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/cp949codetbl_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/cp949codetbl_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/cp949codetbl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/cp949codetbl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/cp949codetbl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/minimum-linux_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/minimum-linux_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/minimum-linux_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/minimum-linux_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/global/minimum-linux_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qabstractanimation_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qabstractanimation_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qabstractanimation_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qabstractanimation_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/animation/qabstractanimation_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qabstracteventdispatcher_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qabstracteventdispatcher_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qabstracteventdispatcher_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qabstracteventdispatcher_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qabstracteventdispatcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qabstractfileengine_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qabstractfileengine_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qabstractfileengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qabstractfileengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qabstractfileengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qabstractitemmodel_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qabstractitemmodel_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qabstractitemmodel_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qabstractitemmodel_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/itemmodels/qabstractitemmodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qabstractproxymodel_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qabstractproxymodel_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qabstractproxymodel_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qabstractproxymodel_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/itemmodels/qabstractproxymodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qabstractstate_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qabstractstate_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qabstractstate_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qabstractstate_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/statemachine/qabstractstate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qabstracttransition_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qabstracttransition_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qabstracttransition_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qabstracttransition_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/statemachine/qabstracttransition_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qanimationgroup_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qanimationgroup_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qanimationgroup_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qanimationgroup_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/animation/qanimationgroup_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qbig5codec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qbig5codec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qbig5codec_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qbig5codec_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qbig5codec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qbinaryjson_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qbinaryjson_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qbinaryjson_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qbinaryjson_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/serialization/qbinaryjson_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qbinaryjsonarray_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qbinaryjsonarray_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qbinaryjsonarray_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qbinaryjsonarray_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/serialization/qbinaryjsonarray_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qbinaryjsonobject_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qbinaryjsonobject_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qbinaryjsonobject_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qbinaryjsonobject_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/serialization/qbinaryjsonobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qbinaryjsonvalue_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qbinaryjsonvalue_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qbinaryjsonvalue_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qbinaryjsonvalue_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/serialization/qbinaryjsonvalue_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qbytearray_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qbytearray_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qbytearray_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qbytearray_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/text/qbytearray_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qbytedata_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qbytedata_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qbytedata_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qbytedata_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/text/qbytedata_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcalendarbackend_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcalendarbackend_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcalendarbackend_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcalendarbackend_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qcalendarbackend_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcalendarmath_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcalendarmath_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcalendarmath_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcalendarmath_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qcalendarmath_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcborcommon_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcborcommon_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcborcommon_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcborcommon_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/serialization/qcborcommon_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcborvalue_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcborvalue_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcborvalue_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcborvalue_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/serialization/qcborvalue_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcfsocketnotifier_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcfsocketnotifier_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcfsocketnotifier_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcfsocketnotifier_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qcfsocketnotifier_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcollator_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcollator_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcollator_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcollator_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/text/qcollator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcore_mac_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcore_mac_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcore_mac_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcore_mac_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qcore_mac_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcore_unix_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcore_unix_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcore_unix_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcore_unix_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qcore_unix_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcoreapplication_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcoreapplication_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcoreapplication_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcoreapplication_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qcoreapplication_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcorecmdlineargs_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcorecmdlineargs_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcorecmdlineargs_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcorecmdlineargs_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qcorecmdlineargs_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcoreglobaldata_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcoreglobaldata_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qcoreglobaldata_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qcoreglobaldata_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qcoreglobaldata_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdatastream_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdatastream_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdatastream_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdatastream_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/serialization/qdatastream_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdataurl_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdataurl_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdataurl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdataurl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qdataurl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdatetime_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdatetime_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdatetime_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdatetime_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qdatetime_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdatetimeparser_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdatetimeparser_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdatetimeparser_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdatetimeparser_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qdatetimeparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdeadlinetimer_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdeadlinetimer_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdeadlinetimer_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdeadlinetimer_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qdeadlinetimer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdebug_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdebug_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdebug_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdebug_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qdebug_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdir_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdir_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdir_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdir_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qdir_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdoublescanprint_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdoublescanprint_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qdoublescanprint_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qdoublescanprint_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/text/qdoublescanprint_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qduplicatetracker_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qduplicatetracker_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qduplicatetracker_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qduplicatetracker_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/tools/qduplicatetracker_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qelfparser_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qelfparser_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qelfparser_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qelfparser_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/plugin/qelfparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qendian_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qendian_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qendian_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qendian_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/global/qendian_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeucjpcodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeucjpcodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeucjpcodec_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeucjpcodec_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qeucjpcodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeuckrcodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeuckrcodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeuckrcodec_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeuckrcodec_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qeuckrcodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_cf_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_cf_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_cf_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_cf_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qeventdispatcher_cf_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_glib_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_glib_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_glib_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_glib_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qeventdispatcher_glib_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_unix_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_unix_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_unix_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_unix_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qeventdispatcher_unix_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_win_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_win_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_win_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_win_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qeventdispatcher_win_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_winrt_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_winrt_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_winrt_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeventdispatcher_winrt_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qeventdispatcher_winrt_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeventloop_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeventloop_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeventloop_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeventloop_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qeventloop_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeventtransition_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeventtransition_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qeventtransition_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qeventtransition_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/statemachine/qeventtransition_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfactoryloader_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfactoryloader_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfactoryloader_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfactoryloader_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/plugin/qfactoryloader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfile_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfile_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfile_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfile_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfile_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfiledevice_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfiledevice_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfiledevice_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfiledevice_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfiledevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfileinfo_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfileinfo_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfileinfo_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfileinfo_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfileinfo_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfileselector_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfileselector_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfileselector_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfileselector_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfileselector_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemengine_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemengine_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfilesystemengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystementry_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystementry_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystementry_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystementry_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfilesystementry_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemiterator_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemiterator_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemiterator_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemiterator_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfilesystemiterator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemmetadata_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemmetadata_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemmetadata_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemmetadata_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfilesystemmetadata_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_fsevents_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_fsevents_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_fsevents_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_fsevents_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfilesystemwatcher_fsevents_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_inotify_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_inotify_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_inotify_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_inotify_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfilesystemwatcher_inotify_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_kqueue_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_kqueue_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_kqueue_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_kqueue_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfilesystemwatcher_kqueue_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfilesystemwatcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_polling_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_polling_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_polling_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_polling_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfilesystemwatcher_polling_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_win_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_win_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_win_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfilesystemwatcher_win_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfilesystemwatcher_win_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfinalstate_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfinalstate_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfinalstate_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfinalstate_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/statemachine/qfinalstate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfreelist_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfreelist_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfreelist_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfreelist_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/tools/qfreelist_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfsfileengine_iterator_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfsfileengine_iterator_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfsfileengine_iterator_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfsfileengine_iterator_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfsfileengine_iterator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfsfileengine_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfsfileengine_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfsfileengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfsfileengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qfsfileengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfunctions_fake_env_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfunctions_fake_env_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfunctions_fake_env_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfunctions_fake_env_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qfunctions_fake_env_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfunctions_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfunctions_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfunctions_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfunctions_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qfunctions_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfutex_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfutex_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfutex_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfutex_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/thread/qfutex_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfutureinterface_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfutureinterface_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfutureinterface_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfutureinterface_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/thread/qfutureinterface_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfuturewatcher_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfuturewatcher_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qfuturewatcher_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qfuturewatcher_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/thread/qfuturewatcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qgb18030codec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qgb18030codec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qgb18030codec_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qgb18030codec_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qgb18030codec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qglobal_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qglobal_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qglobal_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qglobal_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/global/qglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qgregoriancalendar_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qgregoriancalendar_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qgregoriancalendar_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qgregoriancalendar_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qgregoriancalendar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qharfbuzz_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qharfbuzz_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qharfbuzz_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qharfbuzz_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/text/qharfbuzz_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qhijricalendar_data_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qhijricalendar_data_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qhijricalendar_data_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qhijricalendar_data_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qhijricalendar_data_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qhijricalendar_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qhijricalendar_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qhijricalendar_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qhijricalendar_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qhijricalendar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qhistorystate_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qhistorystate_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qhistorystate_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qhistorystate_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/statemachine/qhistorystate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qhooks_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qhooks_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qhooks_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qhooks_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/global/qhooks_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qiconvcodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qiconvcodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qiconvcodec_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qiconvcodec_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qiconvcodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qicucodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qicucodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qicucodec_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qicucodec_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qicucodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qiodevice_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qiodevice_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qiodevice_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qiodevice_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qiodevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qipaddress_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qipaddress_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qipaddress_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qipaddress_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qipaddress_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qisciicodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qisciicodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qisciicodec_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qisciicodec_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qisciicodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qislamiccivilcalendar_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qislamiccivilcalendar_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qislamiccivilcalendar_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qislamiccivilcalendar_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qislamiccivilcalendar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qitemselectionmodel_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qitemselectionmodel_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qitemselectionmodel_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qitemselectionmodel_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/itemmodels/qitemselectionmodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjalalicalendar_data_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjalalicalendar_data_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjalalicalendar_data_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjalalicalendar_data_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qjalalicalendar_data_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjalalicalendar_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjalalicalendar_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjalalicalendar_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjalalicalendar_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qjalalicalendar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjiscodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjiscodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjiscodec_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjiscodec_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qjiscodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjni_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjni_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjni_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjni_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qjni_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjnihelpers_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjnihelpers_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjnihelpers_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjnihelpers_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qjnihelpers_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjpunicode_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjpunicode_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjpunicode_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjpunicode_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qjpunicode_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjson_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjson_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjson_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjson_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/serialization/qjson_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjsonparser_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjsonparser_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjsonparser_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjsonparser_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/serialization/qjsonparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjsonwriter_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjsonwriter_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjsonwriter_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjsonwriter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/serialization/qjsonwriter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjuliancalendar_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjuliancalendar_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qjuliancalendar_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qjuliancalendar_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qjuliancalendar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlatincodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlatincodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlatincodec_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlatincodec_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qlatincodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlibrary_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlibrary_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlibrary_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlibrary_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/plugin/qlibrary_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlocale_data_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlocale_data_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlocale_data_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlocale_data_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/text/qlocale_data_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlocale_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlocale_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlocale_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlocale_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/text/qlocale_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlocale_tools_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlocale_tools_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlocale_tools_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlocale_tools_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/text/qlocale_tools_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlockfile_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlockfile_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlockfile_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlockfile_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qlockfile_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlocking_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlocking_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlocking_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlocking_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/thread/qlocking_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlogging_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlogging_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qlogging_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qlogging_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/global/qlogging_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qloggingregistry_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qloggingregistry_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qloggingregistry_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qloggingregistry_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qloggingregistry_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmachparser_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmachparser_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmachparser_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmachparser_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/plugin/qmachparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmakearray_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmakearray_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmakearray_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmakearray_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/tools/qmakearray_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmemory_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmemory_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmemory_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmemory_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/global/qmemory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmetaobject_moc_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmetaobject_moc_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmetaobject_moc_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmetaobject_moc_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qmetaobject_moc_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmetaobject_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmetaobject_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmetaobject_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmetaobject_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qmetaobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmetaobjectbuilder_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmetaobjectbuilder_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmetaobjectbuilder_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmetaobjectbuilder_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qmetaobjectbuilder_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmetatype_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmetatype_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmetatype_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmetatype_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qmetatype_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmetatypeswitcher_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmetatypeswitcher_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmetatypeswitcher_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmetatypeswitcher_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qmetatypeswitcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmilankoviccalendar_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmilankoviccalendar_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmilankoviccalendar_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmilankoviccalendar_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qmilankoviccalendar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmimedatabase_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmimedatabase_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmimedatabase_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmimedatabase_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/mimetypes/qmimedatabase_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmimeglobpattern_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmimeglobpattern_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmimeglobpattern_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmimeglobpattern_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/mimetypes/qmimeglobpattern_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmimemagicrule_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmimemagicrule_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmimemagicrule_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmimemagicrule_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/mimetypes/qmimemagicrule_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmimemagicrulematcher_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmimemagicrulematcher_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmimemagicrulematcher_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmimemagicrulematcher_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/mimetypes/qmimemagicrulematcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmimeprovider_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmimeprovider_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmimeprovider_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmimeprovider_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/mimetypes/qmimeprovider_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmimetype_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmimetype_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmimetype_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmimetype_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/mimetypes/qmimetype_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmimetypeparser_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmimetypeparser_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmimetypeparser_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmimetypeparser_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/mimetypes/qmimetypeparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmutex_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmutex_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qmutex_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qmutex_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/thread/qmutex_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qnoncontiguousbytedevice_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qnoncontiguousbytedevice_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qnoncontiguousbytedevice_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qnoncontiguousbytedevice_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qnoncontiguousbytedevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qnumeric_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qnumeric_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qnumeric_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qnumeric_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/global/qnumeric_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qobject_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qobject_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qobject_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qobject_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qoffsetstringarray_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qoffsetstringarray_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qoffsetstringarray_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qoffsetstringarray_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/tools/qoffsetstringarray_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qoperatingsystemversion_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qoperatingsystemversion_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qoperatingsystemversion_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qoperatingsystemversion_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/global/qoperatingsystemversion_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qoperatingsystemversion_win_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qoperatingsystemversion_win_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qoperatingsystemversion_win_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qoperatingsystemversion_win_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/global/qoperatingsystemversion_win_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qorderedmutexlocker_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qorderedmutexlocker_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qorderedmutexlocker_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qorderedmutexlocker_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/thread/qorderedmutexlocker_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qparallelanimationgroup_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qparallelanimationgroup_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qparallelanimationgroup_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qparallelanimationgroup_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/animation/qparallelanimationgroup_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qplugin_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qplugin_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qplugin_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qplugin_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/plugin/qplugin_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qpoll_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qpoll_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qpoll_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qpoll_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qpoll_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qppsattribute_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qppsattribute_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qppsattribute_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qppsattribute_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qppsattribute_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qppsattributeprivate_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qppsattributeprivate_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qppsattributeprivate_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qppsattributeprivate_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qppsattributeprivate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qppsobject_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qppsobject_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qppsobject_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qppsobject_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qppsobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qppsobjectprivate_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qppsobjectprivate_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qppsobjectprivate_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qppsobjectprivate_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qppsobjectprivate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qprocess_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qprocess_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qprocess_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qprocess_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qprocess_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qpropertyanimation_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qpropertyanimation_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qpropertyanimation_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qpropertyanimation_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/animation/qpropertyanimation_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qrandom_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qrandom_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qrandom_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qrandom_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/global/qrandom_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qreadwritelock_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qreadwritelock_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qreadwritelock_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qreadwritelock_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/thread/qreadwritelock_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qresource_iterator_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qresource_iterator_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qresource_iterator_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qresource_iterator_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qresource_iterator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qresource_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qresource_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qresource_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qresource_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qresource_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qringbuffer_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qringbuffer_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qringbuffer_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qringbuffer_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/tools/qringbuffer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qromancalendar_data_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qromancalendar_data_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qromancalendar_data_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qromancalendar_data_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qromancalendar_data_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qromancalendar_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qromancalendar_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qromancalendar_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qromancalendar_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qromancalendar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsavefile_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsavefile_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsavefile_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsavefile_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qsavefile_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qscopedpointer_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qscopedpointer_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qscopedpointer_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qscopedpointer_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/tools/qscopedpointer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsequentialanimationgroup_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsequentialanimationgroup_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsequentialanimationgroup_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsequentialanimationgroup_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/animation/qsequentialanimationgroup_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsettings_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsettings_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsettings_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsettings_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qsettings_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsharedmemory_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsharedmemory_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsharedmemory_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsharedmemory_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qsharedmemory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsignaleventgenerator_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsignaleventgenerator_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsignaleventgenerator_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsignaleventgenerator_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/statemachine/qsignaleventgenerator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsignaltransition_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsignaltransition_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsignaltransition_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsignaltransition_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/statemachine/qsignaltransition_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsimd_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsimd_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsimd_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsimd_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/tools/qsimd_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsimd_x86_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsimd_x86_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsimd_x86_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsimd_x86_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/tools/qsimd_x86_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsimplecodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsimplecodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsimplecodec_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsimplecodec_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qsimplecodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsjiscodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsjiscodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsjiscodec_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsjiscodec_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qsjiscodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qstate_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qstate_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qstate_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qstate_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/statemachine/qstate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qstatemachine_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qstatemachine_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qstatemachine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qstatemachine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/statemachine/qstatemachine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qstdweb_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qstdweb_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qstdweb_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qstdweb_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/platform/wasm/qstdweb_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qstorageinfo_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qstorageinfo_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qstorageinfo_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qstorageinfo_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qstorageinfo_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qstringalgorithms_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qstringalgorithms_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qstringalgorithms_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qstringalgorithms_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/text/qstringalgorithms_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qstringiterator_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qstringiterator_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qstringiterator_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qstringiterator_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/text/qstringiterator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsystemerror_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsystemerror_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsystemerror_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsystemerror_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qsystemerror_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsystemlibrary_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsystemlibrary_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsystemlibrary_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsystemlibrary_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/plugin/qsystemlibrary_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsystemsemaphore_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsystemsemaphore_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qsystemsemaphore_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qsystemsemaphore_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qsystemsemaphore_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qt_pch.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qt_pch.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qt_pch.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qt_pch.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/global/qt_pch.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtemporaryfile_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtemporaryfile_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtemporaryfile_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtemporaryfile_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qtemporaryfile_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtextcodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtextcodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtextcodec_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtextcodec_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qtextcodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtextstream_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtextstream_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtextstream_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtextstream_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/serialization/qtextstream_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qthread_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qthread_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qthread_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qthread_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/thread/qthread_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qthreadpool_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qthreadpool_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qthreadpool_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qthreadpool_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/thread/qthreadpool_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtimerinfo_unix_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtimerinfo_unix_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtimerinfo_unix_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtimerinfo_unix_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qtimerinfo_unix_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtimezoneprivate_data_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtimezoneprivate_data_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtimezoneprivate_data_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtimezoneprivate_data_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qtimezoneprivate_data_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtimezoneprivate_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtimezoneprivate_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtimezoneprivate_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtimezoneprivate_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/time/qtimezoneprivate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtldurl_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtldurl_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtldurl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtldurl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qtldurl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtools_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtools_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtools_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtools_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/tools/qtools_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtrace_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtrace_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtrace_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtrace_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/global/qtrace_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtranslator_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtranslator_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtranslator_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtranslator_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qtranslator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtransposeproxymodel_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtransposeproxymodel_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtransposeproxymodel_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtransposeproxymodel_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/itemmodels/qtransposeproxymodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtsciicodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtsciicodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qtsciicodec_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qtsciicodec_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qtsciicodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qunicodetables_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qunicodetables_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qunicodetables_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qunicodetables_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/text/qunicodetables_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qunicodetools_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qunicodetools_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qunicodetools_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qunicodetools_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/text/qunicodetools_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qurl_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qurl_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qurl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qurl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qurl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qurltlds_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qurltlds_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qurltlds_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qurltlds_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qurltlds_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qutfcodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qutfcodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qutfcodec_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qutfcodec_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qutfcodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qvariant_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qvariant_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qvariant_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qvariant_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qvariant_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qvariantanimation_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qvariantanimation_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qvariantanimation_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qvariantanimation_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/animation/qvariantanimation_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qwaitcondition_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qwaitcondition_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qwaitcondition_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qwaitcondition_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/thread/qwaitcondition_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qwindowscodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qwindowscodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qwindowscodec_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qwindowscodec_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/codecs/qwindowscodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qwindowspipereader_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qwindowspipereader_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qwindowspipereader_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qwindowspipereader_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qwindowspipereader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qwindowspipewriter_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qwindowspipewriter_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qwindowspipewriter_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qwindowspipewriter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/io/qwindowspipewriter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qwineventnotifier_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qwineventnotifier_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qwineventnotifier_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qwineventnotifier_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qwineventnotifier_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qwinregistry_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qwinregistry_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qwinregistry_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qwinregistry_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/kernel/qwinregistry_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qxmlstream_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qxmlstream_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qxmlstream_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qxmlstream_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/serialization/qxmlstream_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qxmlutils_p.h 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qxmlutils_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.15/QtCore/private/qxmlutils_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.15/QtCore/private/qxmlutils_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/corelib/serialization/qxmlutils_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/cp949codetbl_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/cp949codetbl_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/cp949codetbl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/cp949codetbl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/cp949codetbl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/minimum-linux_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/minimum-linux_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/minimum-linux_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/minimum-linux_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/global/minimum-linux_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qabstractanimation_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qabstractanimation_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qabstractanimation_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qabstractanimation_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/animation/qabstractanimation_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qabstracteventdispatcher_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qabstracteventdispatcher_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qabstracteventdispatcher_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qabstracteventdispatcher_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qabstracteventdispatcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qabstractfileengine_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qabstractfileengine_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qabstractfileengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qabstractfileengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qabstractfileengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qabstractitemmodel_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qabstractitemmodel_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qabstractitemmodel_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qabstractitemmodel_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/itemmodels/qabstractitemmodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qabstractproxymodel_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qabstractproxymodel_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qabstractproxymodel_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qabstractproxymodel_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/itemmodels/qabstractproxymodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qabstractstate_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qabstractstate_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qabstractstate_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qabstractstate_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/statemachine/qabstractstate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qabstracttransition_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qabstracttransition_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qabstracttransition_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qabstracttransition_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/statemachine/qabstracttransition_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qanimationgroup_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qanimationgroup_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qanimationgroup_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qanimationgroup_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/animation/qanimationgroup_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qbig5codec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qbig5codec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qbig5codec_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qbig5codec_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qbig5codec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qbinaryjson_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qbinaryjson_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qbinaryjson_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qbinaryjson_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/serialization/qbinaryjson_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qbinaryjsonarray_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qbinaryjsonarray_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qbinaryjsonarray_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qbinaryjsonarray_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/serialization/qbinaryjsonarray_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qbinaryjsonobject_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qbinaryjsonobject_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qbinaryjsonobject_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qbinaryjsonobject_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/serialization/qbinaryjsonobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qbinaryjsonvalue_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qbinaryjsonvalue_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qbinaryjsonvalue_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qbinaryjsonvalue_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/serialization/qbinaryjsonvalue_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qbytearray_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qbytearray_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qbytearray_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qbytearray_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/text/qbytearray_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qbytedata_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qbytedata_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qbytedata_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qbytedata_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/text/qbytedata_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcalendarbackend_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcalendarbackend_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcalendarbackend_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcalendarbackend_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qcalendarbackend_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcalendarmath_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcalendarmath_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcalendarmath_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcalendarmath_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qcalendarmath_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcborcommon_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcborcommon_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcborcommon_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcborcommon_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/serialization/qcborcommon_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcborvalue_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcborvalue_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcborvalue_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcborvalue_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/serialization/qcborvalue_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcfsocketnotifier_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcfsocketnotifier_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcfsocketnotifier_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcfsocketnotifier_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qcfsocketnotifier_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcollator_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcollator_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcollator_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcollator_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/text/qcollator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcore_mac_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcore_mac_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcore_mac_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcore_mac_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qcore_mac_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcore_unix_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcore_unix_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcore_unix_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcore_unix_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qcore_unix_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcoreapplication_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcoreapplication_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcoreapplication_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcoreapplication_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qcoreapplication_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcorecmdlineargs_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcorecmdlineargs_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcorecmdlineargs_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcorecmdlineargs_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qcorecmdlineargs_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcoreglobaldata_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcoreglobaldata_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qcoreglobaldata_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qcoreglobaldata_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qcoreglobaldata_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdatastream_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdatastream_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdatastream_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdatastream_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/serialization/qdatastream_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdataurl_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdataurl_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdataurl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdataurl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qdataurl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdatetime_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdatetime_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdatetime_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdatetime_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qdatetime_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdatetimeparser_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdatetimeparser_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdatetimeparser_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdatetimeparser_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qdatetimeparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdeadlinetimer_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdeadlinetimer_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdeadlinetimer_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdeadlinetimer_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qdeadlinetimer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdebug_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdebug_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdebug_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdebug_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qdebug_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdir_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdir_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdir_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdir_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qdir_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdoublescanprint_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdoublescanprint_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qdoublescanprint_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qdoublescanprint_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/text/qdoublescanprint_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qduplicatetracker_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qduplicatetracker_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qduplicatetracker_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qduplicatetracker_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/tools/qduplicatetracker_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qelfparser_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qelfparser_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qelfparser_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qelfparser_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/plugin/qelfparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qendian_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qendian_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qendian_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qendian_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/global/qendian_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeucjpcodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeucjpcodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeucjpcodec_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeucjpcodec_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qeucjpcodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeuckrcodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeuckrcodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeuckrcodec_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeuckrcodec_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qeuckrcodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_cf_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_cf_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_cf_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_cf_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qeventdispatcher_cf_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_glib_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_glib_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_glib_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_glib_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qeventdispatcher_glib_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_unix_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_unix_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_unix_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_unix_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qeventdispatcher_unix_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_win_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_win_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_win_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_win_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qeventdispatcher_win_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_winrt_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_winrt_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_winrt_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeventdispatcher_winrt_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qeventdispatcher_winrt_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeventloop_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeventloop_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeventloop_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeventloop_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qeventloop_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeventtransition_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeventtransition_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qeventtransition_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qeventtransition_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/statemachine/qeventtransition_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfactoryloader_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfactoryloader_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfactoryloader_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfactoryloader_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/plugin/qfactoryloader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfile_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfile_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfile_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfile_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfile_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfiledevice_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfiledevice_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfiledevice_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfiledevice_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfiledevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfileinfo_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfileinfo_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfileinfo_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfileinfo_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfileinfo_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfileselector_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfileselector_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfileselector_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfileselector_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfileselector_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemengine_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemengine_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfilesystemengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystementry_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystementry_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystementry_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystementry_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfilesystementry_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemiterator_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemiterator_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemiterator_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemiterator_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfilesystemiterator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemmetadata_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemmetadata_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemmetadata_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemmetadata_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfilesystemmetadata_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_fsevents_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_fsevents_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_fsevents_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_fsevents_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfilesystemwatcher_fsevents_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_inotify_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_inotify_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_inotify_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_inotify_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfilesystemwatcher_inotify_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_kqueue_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_kqueue_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_kqueue_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_kqueue_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfilesystemwatcher_kqueue_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfilesystemwatcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_polling_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_polling_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_polling_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_polling_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfilesystemwatcher_polling_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_win_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_win_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_win_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfilesystemwatcher_win_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfilesystemwatcher_win_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfinalstate_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfinalstate_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfinalstate_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfinalstate_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/statemachine/qfinalstate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfreelist_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfreelist_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfreelist_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfreelist_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/tools/qfreelist_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfsfileengine_iterator_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfsfileengine_iterator_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfsfileengine_iterator_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfsfileengine_iterator_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfsfileengine_iterator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfsfileengine_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfsfileengine_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfsfileengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfsfileengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qfsfileengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfunctions_fake_env_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfunctions_fake_env_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfunctions_fake_env_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfunctions_fake_env_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qfunctions_fake_env_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfunctions_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfunctions_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfunctions_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfunctions_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qfunctions_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfutex_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfutex_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfutex_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfutex_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/thread/qfutex_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfutureinterface_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfutureinterface_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfutureinterface_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfutureinterface_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/thread/qfutureinterface_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfuturewatcher_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfuturewatcher_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qfuturewatcher_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qfuturewatcher_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/thread/qfuturewatcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qgb18030codec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qgb18030codec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qgb18030codec_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qgb18030codec_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qgb18030codec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qglobal_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qglobal_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qglobal_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qglobal_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/global/qglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qgregoriancalendar_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qgregoriancalendar_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qgregoriancalendar_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qgregoriancalendar_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qgregoriancalendar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qharfbuzz_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qharfbuzz_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qharfbuzz_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qharfbuzz_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/text/qharfbuzz_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qhijricalendar_data_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qhijricalendar_data_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qhijricalendar_data_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qhijricalendar_data_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qhijricalendar_data_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qhijricalendar_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qhijricalendar_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qhijricalendar_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qhijricalendar_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qhijricalendar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qhistorystate_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qhistorystate_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qhistorystate_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qhistorystate_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/statemachine/qhistorystate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qhooks_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qhooks_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qhooks_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qhooks_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/global/qhooks_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qiconvcodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qiconvcodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qiconvcodec_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qiconvcodec_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qiconvcodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qicucodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qicucodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qicucodec_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qicucodec_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qicucodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qiodevice_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qiodevice_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qiodevice_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qiodevice_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qiodevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qipaddress_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qipaddress_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qipaddress_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qipaddress_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qipaddress_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qisciicodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qisciicodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qisciicodec_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qisciicodec_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qisciicodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qislamiccivilcalendar_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qislamiccivilcalendar_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qislamiccivilcalendar_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qislamiccivilcalendar_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qislamiccivilcalendar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qitemselectionmodel_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qitemselectionmodel_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qitemselectionmodel_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qitemselectionmodel_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/itemmodels/qitemselectionmodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjalalicalendar_data_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjalalicalendar_data_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjalalicalendar_data_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjalalicalendar_data_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qjalalicalendar_data_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjalalicalendar_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjalalicalendar_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjalalicalendar_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjalalicalendar_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qjalalicalendar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjiscodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjiscodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjiscodec_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjiscodec_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qjiscodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjni_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjni_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjni_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjni_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qjni_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjnihelpers_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjnihelpers_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjnihelpers_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjnihelpers_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qjnihelpers_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjpunicode_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjpunicode_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjpunicode_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjpunicode_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qjpunicode_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjson_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjson_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjson_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjson_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/serialization/qjson_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjsonparser_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjsonparser_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjsonparser_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjsonparser_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/serialization/qjsonparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjsonwriter_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjsonwriter_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjsonwriter_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjsonwriter_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/serialization/qjsonwriter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjuliancalendar_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjuliancalendar_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qjuliancalendar_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qjuliancalendar_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qjuliancalendar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlatincodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlatincodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlatincodec_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlatincodec_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qlatincodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlibrary_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlibrary_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlibrary_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlibrary_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/plugin/qlibrary_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlocale_data_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlocale_data_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlocale_data_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlocale_data_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/text/qlocale_data_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlocale_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlocale_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlocale_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlocale_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/text/qlocale_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlocale_tools_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlocale_tools_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlocale_tools_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlocale_tools_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/text/qlocale_tools_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlockfile_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlockfile_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlockfile_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlockfile_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qlockfile_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlocking_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlocking_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlocking_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlocking_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/thread/qlocking_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlogging_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlogging_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qlogging_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qlogging_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/global/qlogging_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qloggingregistry_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qloggingregistry_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qloggingregistry_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qloggingregistry_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qloggingregistry_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmachparser_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmachparser_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmachparser_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmachparser_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/plugin/qmachparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmakearray_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmakearray_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmakearray_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmakearray_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/tools/qmakearray_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmemory_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmemory_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmemory_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmemory_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/global/qmemory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmetaobject_moc_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmetaobject_moc_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmetaobject_moc_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmetaobject_moc_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qmetaobject_moc_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmetaobject_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmetaobject_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmetaobject_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmetaobject_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qmetaobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmetaobjectbuilder_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmetaobjectbuilder_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmetaobjectbuilder_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmetaobjectbuilder_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qmetaobjectbuilder_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmetatype_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmetatype_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmetatype_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmetatype_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qmetatype_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmetatypeswitcher_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmetatypeswitcher_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmetatypeswitcher_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmetatypeswitcher_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qmetatypeswitcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmilankoviccalendar_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmilankoviccalendar_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmilankoviccalendar_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmilankoviccalendar_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qmilankoviccalendar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmimedatabase_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmimedatabase_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmimedatabase_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmimedatabase_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/mimetypes/qmimedatabase_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmimeglobpattern_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmimeglobpattern_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmimeglobpattern_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmimeglobpattern_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/mimetypes/qmimeglobpattern_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmimemagicrule_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmimemagicrule_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmimemagicrule_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmimemagicrule_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/mimetypes/qmimemagicrule_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmimemagicrulematcher_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmimemagicrulematcher_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmimemagicrulematcher_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmimemagicrulematcher_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/mimetypes/qmimemagicrulematcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmimeprovider_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmimeprovider_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmimeprovider_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmimeprovider_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/mimetypes/qmimeprovider_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmimetype_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmimetype_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmimetype_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmimetype_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/mimetypes/qmimetype_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmimetypeparser_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmimetypeparser_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmimetypeparser_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmimetypeparser_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/mimetypes/qmimetypeparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmutex_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmutex_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qmutex_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qmutex_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/thread/qmutex_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qnoncontiguousbytedevice_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qnoncontiguousbytedevice_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qnoncontiguousbytedevice_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qnoncontiguousbytedevice_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qnoncontiguousbytedevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qnumeric_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qnumeric_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qnumeric_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qnumeric_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/global/qnumeric_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qobject_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qobject_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qobject_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qobject_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qoffsetstringarray_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qoffsetstringarray_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qoffsetstringarray_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qoffsetstringarray_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/tools/qoffsetstringarray_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qoperatingsystemversion_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qoperatingsystemversion_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qoperatingsystemversion_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qoperatingsystemversion_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/global/qoperatingsystemversion_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qoperatingsystemversion_win_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qoperatingsystemversion_win_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qoperatingsystemversion_win_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qoperatingsystemversion_win_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/global/qoperatingsystemversion_win_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qorderedmutexlocker_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qorderedmutexlocker_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qorderedmutexlocker_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qorderedmutexlocker_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/thread/qorderedmutexlocker_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qparallelanimationgroup_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qparallelanimationgroup_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qparallelanimationgroup_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qparallelanimationgroup_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/animation/qparallelanimationgroup_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qplugin_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qplugin_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qplugin_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qplugin_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/plugin/qplugin_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qpoll_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qpoll_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qpoll_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qpoll_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qpoll_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qppsattribute_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qppsattribute_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qppsattribute_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qppsattribute_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qppsattribute_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qppsattributeprivate_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qppsattributeprivate_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qppsattributeprivate_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qppsattributeprivate_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qppsattributeprivate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qppsobject_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qppsobject_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qppsobject_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qppsobject_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qppsobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qppsobjectprivate_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qppsobjectprivate_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qppsobjectprivate_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qppsobjectprivate_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qppsobjectprivate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qprocess_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qprocess_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qprocess_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qprocess_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qprocess_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qpropertyanimation_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qpropertyanimation_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qpropertyanimation_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qpropertyanimation_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/animation/qpropertyanimation_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qrandom_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qrandom_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qrandom_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qrandom_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/global/qrandom_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qreadwritelock_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qreadwritelock_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qreadwritelock_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qreadwritelock_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/thread/qreadwritelock_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qresource_iterator_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qresource_iterator_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qresource_iterator_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qresource_iterator_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qresource_iterator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qresource_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qresource_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qresource_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qresource_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qresource_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qringbuffer_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qringbuffer_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qringbuffer_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qringbuffer_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/tools/qringbuffer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qromancalendar_data_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qromancalendar_data_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qromancalendar_data_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qromancalendar_data_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qromancalendar_data_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qromancalendar_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qromancalendar_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qromancalendar_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qromancalendar_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qromancalendar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsavefile_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsavefile_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsavefile_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsavefile_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qsavefile_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qscopedpointer_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qscopedpointer_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qscopedpointer_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qscopedpointer_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/tools/qscopedpointer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsequentialanimationgroup_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsequentialanimationgroup_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsequentialanimationgroup_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsequentialanimationgroup_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/animation/qsequentialanimationgroup_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsettings_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsettings_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsettings_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsettings_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qsettings_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsharedmemory_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsharedmemory_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsharedmemory_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsharedmemory_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qsharedmemory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsignaleventgenerator_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsignaleventgenerator_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsignaleventgenerator_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsignaleventgenerator_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/statemachine/qsignaleventgenerator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsignaltransition_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsignaltransition_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsignaltransition_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsignaltransition_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/statemachine/qsignaltransition_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsimd_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsimd_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsimd_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsimd_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/tools/qsimd_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsimd_x86_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsimd_x86_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsimd_x86_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsimd_x86_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/tools/qsimd_x86_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsimplecodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsimplecodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsimplecodec_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsimplecodec_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qsimplecodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsjiscodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsjiscodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsjiscodec_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsjiscodec_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qsjiscodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qstate_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qstate_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qstate_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qstate_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/statemachine/qstate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qstatemachine_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qstatemachine_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qstatemachine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qstatemachine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/statemachine/qstatemachine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qstdweb_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qstdweb_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qstdweb_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qstdweb_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/platform/wasm/qstdweb_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qstorageinfo_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qstorageinfo_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qstorageinfo_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qstorageinfo_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qstorageinfo_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qstringalgorithms_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qstringalgorithms_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qstringalgorithms_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qstringalgorithms_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/text/qstringalgorithms_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qstringiterator_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qstringiterator_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qstringiterator_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qstringiterator_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/text/qstringiterator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsystemerror_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsystemerror_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsystemerror_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsystemerror_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qsystemerror_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsystemlibrary_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsystemlibrary_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsystemlibrary_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsystemlibrary_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/plugin/qsystemlibrary_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsystemsemaphore_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsystemsemaphore_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qsystemsemaphore_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qsystemsemaphore_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qsystemsemaphore_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qt_pch.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qt_pch.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qt_pch.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qt_pch.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/global/qt_pch.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtemporaryfile_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtemporaryfile_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtemporaryfile_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtemporaryfile_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qtemporaryfile_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtextcodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtextcodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtextcodec_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtextcodec_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qtextcodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtextstream_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtextstream_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtextstream_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtextstream_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/serialization/qtextstream_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qthread_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qthread_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qthread_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qthread_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/thread/qthread_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qthreadpool_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qthreadpool_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qthreadpool_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qthreadpool_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/thread/qthreadpool_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtimerinfo_unix_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtimerinfo_unix_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtimerinfo_unix_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtimerinfo_unix_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qtimerinfo_unix_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtimezoneprivate_data_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtimezoneprivate_data_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtimezoneprivate_data_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtimezoneprivate_data_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qtimezoneprivate_data_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtimezoneprivate_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtimezoneprivate_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtimezoneprivate_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtimezoneprivate_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/time/qtimezoneprivate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtldurl_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtldurl_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtldurl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtldurl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qtldurl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtools_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtools_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtools_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtools_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/tools/qtools_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtrace_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtrace_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtrace_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtrace_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/global/qtrace_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtranslator_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtranslator_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtranslator_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtranslator_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qtranslator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtransposeproxymodel_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtransposeproxymodel_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtransposeproxymodel_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtransposeproxymodel_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/itemmodels/qtransposeproxymodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtsciicodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtsciicodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qtsciicodec_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qtsciicodec_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qtsciicodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qunicodetables_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qunicodetables_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qunicodetables_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qunicodetables_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/text/qunicodetables_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qunicodetools_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qunicodetools_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qunicodetools_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qunicodetools_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/text/qunicodetools_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qurl_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qurl_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qurl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qurl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qurl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qurltlds_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qurltlds_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qurltlds_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qurltlds_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qurltlds_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qutfcodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qutfcodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qutfcodec_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qutfcodec_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qutfcodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qvariant_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qvariant_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qvariant_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qvariant_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qvariant_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qvariantanimation_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qvariantanimation_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qvariantanimation_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qvariantanimation_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/animation/qvariantanimation_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qwaitcondition_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qwaitcondition_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qwaitcondition_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qwaitcondition_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/thread/qwaitcondition_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qwindowscodec_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qwindowscodec_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qwindowscodec_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qwindowscodec_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/codecs/qwindowscodec_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qwindowspipereader_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qwindowspipereader_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qwindowspipereader_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qwindowspipereader_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qwindowspipereader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qwindowspipewriter_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qwindowspipewriter_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qwindowspipewriter_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qwindowspipewriter_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/io/qwindowspipewriter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qwineventnotifier_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qwineventnotifier_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qwineventnotifier_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qwineventnotifier_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qwineventnotifier_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qwinregistry_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qwinregistry_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qwinregistry_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qwinregistry_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/kernel/qwinregistry_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qxmlstream_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qxmlstream_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qxmlstream_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qxmlstream_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/serialization/qxmlstream_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qxmlutils_p.h 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qxmlutils_p.h
--- 5.15.15+dfsg-2/include/QtCore/5.15.17/QtCore/private/qxmlutils_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtCore/5.15.17/QtCore/private/qxmlutils_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/corelib/serialization/qxmlutils_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtCore/headers.pri 5.15.17+dfsg-1/include/QtCore/headers.pri
--- 5.15.15+dfsg-2/include/QtCore/headers.pri	2024-08-16 06:16:11.525242800 +0000
+++ 5.15.17+dfsg-1/include/QtCore/headers.pri	2025-02-26 11:03:00.079816800 +0000
@@ -3,4 +3,4 @@ SYNCQT.GENERATED_HEADER_FILES = QAbstrac
 SYNCQT.PRIVATE_HEADER_FILES = animation/qabstractanimation_p.h animation/qanimationgroup_p.h animation/qparallelanimationgroup_p.h animation/qpropertyanimation_p.h animation/qsequentialanimationgroup_p.h animation/qvariantanimation_p.h codecs/cp949codetbl_p.h codecs/qbig5codec_p.h codecs/qeucjpcodec_p.h codecs/qeuckrcodec_p.h codecs/qgb18030codec_p.h codecs/qiconvcodec_p.h codecs/qicucodec_p.h codecs/qisciicodec_p.h codecs/qjiscodec_p.h codecs/qjpunicode_p.h codecs/qlatincodec_p.h codecs/qsimplecodec_p.h codecs/qsjiscodec_p.h codecs/qtextcodec_p.h codecs/qtsciicodec_p.h codecs/qutfcodec_p.h codecs/qwindowscodec_p.h global/minimum-linux_p.h global/qendian_p.h global/qglobal_p.h global/qhooks_p.h global/qlogging_p.h global/qmemory_p.h global/qnumeric_p.h global/qoperatingsystemversion_p.h global/qoperatingsystemversion_win_p.h global/qrandom_p.h global/qt_pch.h global/qtrace_p.h io/qabstractfileengine_p.h io/qdataurl_p.h io/qdebug_p.h io/qdir_p.h io/qfile_p.h io/qfiledevice_p.h io/qfileinfo_p.h io/qfileselector_p.h io/qfilesystemengine_p.h io/qfilesystementry_p.h io/qfilesystemiterator_p.h io/qfilesystemmetadata_p.h io/qfilesystemwatcher_fsevents_p.h io/qfilesystemwatcher_inotify_p.h io/qfilesystemwatcher_kqueue_p.h io/qfilesystemwatcher_p.h io/qfilesystemwatcher_polling_p.h io/qfilesystemwatcher_win_p.h io/qfsfileengine_iterator_p.h io/qfsfileengine_p.h io/qiodevice_p.h io/qipaddress_p.h io/qlockfile_p.h io/qloggingregistry_p.h io/qnoncontiguousbytedevice_p.h io/qprocess_p.h io/qresource_iterator_p.h io/qresource_p.h io/qsavefile_p.h io/qsettings_p.h io/qstorageinfo_p.h io/qtemporaryfile_p.h io/qtldurl_p.h io/qurl_p.h io/qurltlds_p.h io/qwindowspipereader_p.h io/qwindowspipewriter_p.h itemmodels/qabstractitemmodel_p.h itemmodels/qabstractproxymodel_p.h itemmodels/qitemselectionmodel_p.h itemmodels/qtransposeproxymodel_p.h kernel/qabstracteventdispatcher_p.h kernel/qcfsocketnotifier_p.h kernel/qcore_mac_p.h kernel/qcore_unix_p.h kernel/qcoreapplication_p.h kernel/qcorecmdlineargs_p.h kernel/qcoreglobaldata_p.h kernel/qdeadlinetimer_p.h kernel/qeventdispatcher_cf_p.h kernel/qeventdispatcher_glib_p.h kernel/qeventdispatcher_unix_p.h kernel/qeventdispatcher_win_p.h kernel/qeventdispatcher_winrt_p.h kernel/qeventloop_p.h kernel/qfunctions_fake_env_p.h kernel/qfunctions_p.h kernel/qjni_p.h kernel/qjnihelpers_p.h kernel/qmetaobject_moc_p.h kernel/qmetaobject_p.h kernel/qmetaobjectbuilder_p.h kernel/qmetatype_p.h kernel/qmetatypeswitcher_p.h kernel/qobject_p.h kernel/qpoll_p.h kernel/qppsattribute_p.h kernel/qppsattributeprivate_p.h kernel/qppsobject_p.h kernel/qppsobjectprivate_p.h kernel/qsharedmemory_p.h kernel/qsystemerror_p.h kernel/qsystemsemaphore_p.h kernel/qtimerinfo_unix_p.h kernel/qtranslator_p.h kernel/qvariant_p.h kernel/qwineventnotifier_p.h kernel/qwinregistry_p.h mimetypes/qmimedatabase_p.h mimetypes/qmimeglobpattern_p.h mimetypes/qmimemagicrule_p.h mimetypes/qmimemagicrulematcher_p.h mimetypes/qmimeprovider_p.h mimetypes/qmimetype_p.h mimetypes/qmimetypeparser_p.h plugin/qelfparser_p.h plugin/qfactoryloader_p.h plugin/qlibrary_p.h plugin/qmachparser_p.h plugin/qplugin_p.h plugin/qsystemlibrary_p.h serialization/qbinaryjson_p.h serialization/qbinaryjsonarray_p.h serialization/qbinaryjsonobject_p.h serialization/qbinaryjsonvalue_p.h serialization/qcborcommon_p.h serialization/qcborvalue_p.h serialization/qdatastream_p.h serialization/qjson_p.h serialization/qjsonparser_p.h serialization/qjsonwriter_p.h serialization/qtextstream_p.h serialization/qxmlstream_p.h serialization/qxmlutils_p.h statemachine/qabstractstate_p.h statemachine/qabstracttransition_p.h statemachine/qeventtransition_p.h statemachine/qfinalstate_p.h statemachine/qhistorystate_p.h statemachine/qsignaleventgenerator_p.h statemachine/qsignaltransition_p.h statemachine/qstate_p.h statemachine/qstatemachine_p.h text/qbytearray_p.h text/qbytedata_p.h text/qcollator_p.h text/qdoublescanprint_p.h text/qharfbuzz_p.h text/qlocale_data_p.h text/qlocale_p.h text/qlocale_tools_p.h text/qstringalgorithms_p.h text/qstringiterator_p.h text/qunicodetables_p.h text/qunicodetools_p.h thread/qfutex_p.h thread/qfutureinterface_p.h thread/qfuturewatcher_p.h thread/qlocking_p.h thread/qmutex_p.h thread/qorderedmutexlocker_p.h thread/qreadwritelock_p.h thread/qthread_p.h thread/qthreadpool_p.h thread/qwaitcondition_p.h time/qcalendarbackend_p.h time/qcalendarmath_p.h time/qdatetime_p.h time/qdatetimeparser_p.h time/qgregoriancalendar_p.h time/qhijricalendar_data_p.h time/qhijricalendar_p.h time/qislamiccivilcalendar_p.h time/qjalalicalendar_data_p.h time/qjalalicalendar_p.h time/qjuliancalendar_p.h time/qmilankoviccalendar_p.h time/qromancalendar_data_p.h time/qromancalendar_p.h time/qtimezoneprivate_data_p.h time/qtimezoneprivate_p.h tools/qduplicatetracker_p.h tools/qfreelist_p.h tools/qmakearray_p.h tools/qoffsetstringarray_p.h tools/qringbuffer_p.h tools/qscopedpointer_p.h tools/qsimd_p.h tools/qsimd_x86_p.h tools/qtools_p.h platform/wasm/qstdweb_p.h 
 SYNCQT.QPA_HEADER_FILES = 
 SYNCQT.CLEAN_HEADER_FILES = animation/qabstractanimation.h:animation animation/qanimationgroup.h:animation animation/qparallelanimationgroup.h:animation animation/qpauseanimation.h:animation animation/qpropertyanimation.h:animation animation/qsequentialanimationgroup.h:animation animation/qvariantanimation.h:animation codecs/qtextcodec.h:textcodec global/qcompilerdetection.h global/qendian.h global/qflags.h global/qfloat16.h global/qglobal.h global/qglobalstatic.h global/qisenum.h global/qlibraryinfo.h global/qlogging.h global/qnamespace.h global/qnumeric.h global/qoperatingsystemversion.h global/qprocessordetection.h global/qrandom.h global/qsysinfo.h global/qsystemdetection.h global/qtypeinfo.h global/qtypetraits.h global/qversiontagging.h io/qbuffer.h io/qdebug.h io/qdir.h io/qdiriterator.h io/qfile.h io/qfiledevice.h io/qfileinfo.h io/qfileselector.h io/qfilesystemwatcher.h:filesystemwatcher io/qiodevice.h io/qlockfile.h io/qloggingcategory.h io/qprocess.h:processenvironment io/qresource.h io/qsavefile.h io/qsettings.h:settings io/qstandardpaths.h io/qstorageinfo.h io/qtemporarydir.h io/qtemporaryfile.h io/qurl.h io/qurlquery.h itemmodels/qabstractitemmodel.h:itemmodel itemmodels/qabstractproxymodel.h:proxymodel itemmodels/qconcatenatetablesproxymodel.h:concatenatetablesproxymodel itemmodels/qidentityproxymodel.h:identityproxymodel itemmodels/qitemselectionmodel.h:itemmodel itemmodels/qsortfilterproxymodel.h:sortfilterproxymodel itemmodels/qstringlistmodel.h:stringlistmodel itemmodels/qtransposeproxymodel.h:transposeproxymodel kernel/qabstracteventdispatcher.h kernel/qabstractnativeeventfilter.h kernel/qbasictimer.h kernel/qcoreapplication.h kernel/qcoreevent.h kernel/qdeadlinetimer.h kernel/qelapsedtimer.h kernel/qeventloop.h kernel/qfunctions_nacl.h kernel/qfunctions_vxworks.h kernel/qfunctions_winrt.h kernel/qmath.h kernel/qmetaobject.h kernel/qmetatype.h kernel/qmimedata.h kernel/qobject.h kernel/qobjectcleanuphandler.h kernel/qobjectdefs.h kernel/qpointer.h kernel/qsharedmemory.h kernel/qsignalmapper.h kernel/qsocketnotifier.h kernel/qsystemsemaphore.h kernel/qtestsupport_core.h kernel/qtimer.h kernel/qtranslator.h kernel/qvariant.h kernel/qwineventnotifier.h mimetypes/qmimedatabase.h:mimetype mimetypes/qmimetype.h:mimetype plugin/qfactoryinterface.h plugin/qlibrary.h:library plugin/qplugin.h plugin/qpluginloader.h plugin/quuid.h serialization/qcborarray.h serialization/qcborcommon.h serialization/qcbormap.h serialization/qcborstream.h serialization/qcborstreamreader.h:cborstreamreader serialization/qcborstreamwriter.h:cborstreamwriter serialization/qcborvalue.h serialization/qdatastream.h serialization/qjsonarray.h serialization/qjsondocument.h serialization/qjsonobject.h serialization/qjsonvalue.h serialization/qtextstream.h serialization/qxmlstream.h statemachine/qabstractstate.h:statemachine statemachine/qabstracttransition.h:statemachine statemachine/qeventtransition.h:qeventtransition statemachine/qfinalstate.h:statemachine statemachine/qhistorystate.h:statemachine statemachine/qsignaltransition.h:statemachine statemachine/qstate.h:statemachine statemachine/qstatemachine.h:statemachine text/qbytearray.h text/qbytearraylist.h text/qbytearraymatcher.h text/qchar.h text/qcollator.h text/qlocale.h text/qregexp.h text/qregularexpression.h:regularexpression text/qstring.h text/qstringalgorithms.h text/qstringbuilder.h text/qstringlist.h text/qstringliteral.h text/qstringmatcher.h text/qstringview.h text/qtextboundaryfinder.h thread/qatomic.h thread/qbasicatomic.h thread/qexception.h:future thread/qfuture.h:future thread/qfutureinterface.h:future thread/qfuturesynchronizer.h:future thread/qfuturewatcher.h:future thread/qmutex.h thread/qreadwritelock.h thread/qresultstore.h:future thread/qrunnable.h thread/qsemaphore.h:thread thread/qthread.h thread/qthreadpool.h:thread thread/qthreadstorage.h thread/qwaitcondition.h time/qcalendar.h time/qdatetime.h time/qtimezone.h:timezone tools/qalgorithms.h tools/qarraydata.h tools/qarraydataops.h tools/qarraydatapointer.h tools/qbitarray.h tools/qcache.h tools/qcommandlineoption.h:commandlineparser tools/qcommandlineparser.h:commandlineparser tools/qcontainerfwd.h tools/qcontiguouscache.h tools/qcryptographichash.h tools/qeasingcurve.h:easingcurve tools/qhash.h tools/qhashfunctions.h tools/qiterator.h tools/qline.h tools/qlinkedlist.h tools/qlist.h tools/qmap.h tools/qmargins.h tools/qmessageauthenticationcode.h tools/qpair.h tools/qpoint.h tools/qqueue.h tools/qrect.h tools/qrefcount.h tools/qscopedpointer.h tools/qscopedvaluerollback.h tools/qscopeguard.h tools/qset.h tools/qshareddata.h tools/qsharedpointer.h tools/qsize.h tools/qstack.h tools/qtimeline.h:easingcurve tools/qvarlengtharray.h tools/qvector.h tools/qversionnumber.h 
-SYNCQT.INJECTIONS = src/corelib/global/qconfig.h:qconfig.h:QtConfig src/corelib/global/qconfig_p.h:5.15.15/QtCore/private/qconfig_p.h 
+SYNCQT.INJECTIONS = src/corelib/global/qconfig.h:qconfig.h:QtConfig src/corelib/global/qconfig_p.h:5.15.17/QtCore/private/qconfig_p.h 
diff -pruN 5.15.15+dfsg-2/include/QtCore/qtcoreversion.h 5.15.17+dfsg-1/include/QtCore/qtcoreversion.h
--- 5.15.15+dfsg-2/include/QtCore/qtcoreversion.h	2024-08-16 06:16:11.525242800 +0000
+++ 5.15.17+dfsg-1/include/QtCore/qtcoreversion.h	2025-02-26 11:03:00.079816800 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTCORE_VERSION_H
 #define QT_QTCORE_VERSION_H
 
-#define QTCORE_VERSION_STR "5.15.15"
+#define QTCORE_VERSION_STR "5.15.17"
 
-#define QTCORE_VERSION 0x050F0F
+#define QTCORE_VERSION 0x050F11
 
 #endif // QT_QTCORE_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/dbus_minimal_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/dbus_minimal_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/dbus_minimal_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/dbus_minimal_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/dbus_minimal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbus_symbols_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbus_symbols_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbus_symbols_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbus_symbols_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbus_symbols_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusabstractadaptor_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusabstractadaptor_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusabstractadaptor_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusabstractadaptor_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbusabstractadaptor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusabstractinterface_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusabstractinterface_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusabstractinterface_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusabstractinterface_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbusabstractinterface_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusargument_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusargument_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusargument_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusargument_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbusargument_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusconnection_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusconnection_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusconnection_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusconnection_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbusconnection_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusconnectionmanager_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusconnectionmanager_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusconnectionmanager_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusconnectionmanager_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbusconnectionmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbuscontext_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbuscontext_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbuscontext_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbuscontext_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbuscontext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusintegrator_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusintegrator_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusintegrator_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusintegrator_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbusintegrator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusinterface_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusinterface_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusinterface_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusinterface_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbusinterface_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusintrospection_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusintrospection_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusintrospection_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusintrospection_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbusintrospection_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusmessage_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusmessage_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusmessage_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusmessage_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbusmessage_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusmetaobject_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusmetaobject_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusmetaobject_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusmetaobject_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbusmetaobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusmetatype_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusmetatype_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusmetatype_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusmetatype_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbusmetatype_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbuspendingcall_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbuspendingcall_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbuspendingcall_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbuspendingcall_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbuspendingcall_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusthreaddebug_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusthreaddebug_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusthreaddebug_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusthreaddebug_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbusthreaddebug_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusutil_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusutil_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusutil_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusutil_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbusutil_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusxmlparser_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusxmlparser_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qdbusxmlparser_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qdbusxmlparser_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qdbusxmlparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qtdbusglobal_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qtdbusglobal_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.15/QtDBus/private/qtdbusglobal_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.15/QtDBus/private/qtdbusglobal_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/dbus/qtdbusglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/dbus_minimal_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/dbus_minimal_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/dbus_minimal_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/dbus_minimal_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/dbus_minimal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbus_symbols_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbus_symbols_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbus_symbols_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbus_symbols_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbus_symbols_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusabstractadaptor_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusabstractadaptor_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusabstractadaptor_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusabstractadaptor_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbusabstractadaptor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusabstractinterface_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusabstractinterface_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusabstractinterface_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusabstractinterface_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbusabstractinterface_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusargument_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusargument_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusargument_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusargument_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbusargument_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusconnection_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusconnection_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusconnection_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusconnection_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbusconnection_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusconnectionmanager_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusconnectionmanager_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusconnectionmanager_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusconnectionmanager_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbusconnectionmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbuscontext_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbuscontext_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbuscontext_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbuscontext_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbuscontext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusintegrator_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusintegrator_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusintegrator_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusintegrator_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbusintegrator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusinterface_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusinterface_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusinterface_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusinterface_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbusinterface_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusintrospection_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusintrospection_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusintrospection_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusintrospection_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbusintrospection_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusmessage_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusmessage_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusmessage_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusmessage_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbusmessage_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusmetaobject_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusmetaobject_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusmetaobject_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusmetaobject_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbusmetaobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusmetatype_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusmetatype_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusmetatype_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusmetatype_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbusmetatype_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbuspendingcall_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbuspendingcall_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbuspendingcall_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbuspendingcall_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbuspendingcall_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusthreaddebug_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusthreaddebug_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusthreaddebug_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusthreaddebug_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbusthreaddebug_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusutil_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusutil_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusutil_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusutil_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbusutil_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusxmlparser_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusxmlparser_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qdbusxmlparser_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qdbusxmlparser_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qdbusxmlparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qtdbusglobal_p.h 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qtdbusglobal_p.h
--- 5.15.15+dfsg-2/include/QtDBus/5.15.17/QtDBus/private/qtdbusglobal_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/5.15.17/QtDBus/private/qtdbusglobal_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/dbus/qtdbusglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDBus/qtdbusversion.h 5.15.17+dfsg-1/include/QtDBus/qtdbusversion.h
--- 5.15.15+dfsg-2/include/QtDBus/qtdbusversion.h	2024-08-16 06:16:13.009250600 +0000
+++ 5.15.17+dfsg-1/include/QtDBus/qtdbusversion.h	2025-02-26 11:03:01.815832400 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTDBUS_VERSION_H
 #define QT_QTDBUS_VERSION_H
 
-#define QTDBUS_VERSION_STR "5.15.15"
+#define QTDBUS_VERSION_STR "5.15.17"
 
-#define QTDBUS_VERSION 0x050F0F
+#define QTDBUS_VERSION 0x050F11
 
 #endif // QT_QTDBUS_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_dummy_p.h 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_dummy_p.h
--- 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_dummy_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_dummy_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/devicediscovery/qdevicediscovery_dummy_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_p.h 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_p.h
--- 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/devicediscovery/qdevicediscovery_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_static_p.h 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_static_p.h
--- 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_static_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_static_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/devicediscovery/qdevicediscovery_static_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_udev_p.h 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_udev_p.h
--- 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_udev_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.15/QtDeviceDiscoverySupport/private/qdevicediscovery_udev_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/devicediscovery/qdevicediscovery_udev_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_dummy_p.h 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_dummy_p.h
--- 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_dummy_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_dummy_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/devicediscovery/qdevicediscovery_dummy_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_p.h 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_p.h
--- 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/devicediscovery/qdevicediscovery_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_static_p.h 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_static_p.h
--- 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_static_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_static_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/devicediscovery/qdevicediscovery_static_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_udev_p.h 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_udev_p.h
--- 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_udev_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/5.15.17/QtDeviceDiscoverySupport/private/qdevicediscovery_udev_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/devicediscovery/qdevicediscovery_udev_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/qtdevicediscoverysupportversion.h 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/qtdevicediscoverysupportversion.h
--- 5.15.15+dfsg-2/include/QtDeviceDiscoverySupport/qtdevicediscoverysupportversion.h	2024-08-16 06:16:13.033250800 +0000
+++ 5.15.17+dfsg-1/include/QtDeviceDiscoverySupport/qtdevicediscoverysupportversion.h	2025-02-26 11:02:59.343810000 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTDEVICEDISCOVERYSUPPORT_VERSION_H
 #define QT_QTDEVICEDISCOVERYSUPPORT_VERSION_H
 
-#define QTDEVICEDISCOVERYSUPPORT_VERSION_STR "5.15.15"
+#define QTDEVICEDISCOVERYSUPPORT_VERSION_STR "5.15.17"
 
-#define QTDEVICEDISCOVERYSUPPORT_VERSION 0x050F0F
+#define QTDEVICEDISCOVERYSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTDEVICEDISCOVERYSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtEdidSupport/5.15.15/QtEdidSupport/private/qedidparser_p.h 5.15.17+dfsg-1/include/QtEdidSupport/5.15.15/QtEdidSupport/private/qedidparser_p.h
--- 5.15.15+dfsg-2/include/QtEdidSupport/5.15.15/QtEdidSupport/private/qedidparser_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEdidSupport/5.15.15/QtEdidSupport/private/qedidparser_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/edid/qedidparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEdidSupport/5.15.15/QtEdidSupport/private/qedidvendortable_p.h 5.15.17+dfsg-1/include/QtEdidSupport/5.15.15/QtEdidSupport/private/qedidvendortable_p.h
--- 5.15.15+dfsg-2/include/QtEdidSupport/5.15.15/QtEdidSupport/private/qedidvendortable_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEdidSupport/5.15.15/QtEdidSupport/private/qedidvendortable_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/edid/qedidvendortable_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEdidSupport/5.15.17/QtEdidSupport/private/qedidparser_p.h 5.15.17+dfsg-1/include/QtEdidSupport/5.15.17/QtEdidSupport/private/qedidparser_p.h
--- 5.15.15+dfsg-2/include/QtEdidSupport/5.15.17/QtEdidSupport/private/qedidparser_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEdidSupport/5.15.17/QtEdidSupport/private/qedidparser_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/edid/qedidparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEdidSupport/5.15.17/QtEdidSupport/private/qedidvendortable_p.h 5.15.17+dfsg-1/include/QtEdidSupport/5.15.17/QtEdidSupport/private/qedidvendortable_p.h
--- 5.15.15+dfsg-2/include/QtEdidSupport/5.15.17/QtEdidSupport/private/qedidvendortable_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEdidSupport/5.15.17/QtEdidSupport/private/qedidvendortable_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/edid/qedidvendortable_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEdidSupport/qtedidsupportversion.h 5.15.17+dfsg-1/include/QtEdidSupport/qtedidsupportversion.h
--- 5.15.15+dfsg-2/include/QtEdidSupport/qtedidsupportversion.h	2024-08-16 06:16:13.373252600 +0000
+++ 5.15.17+dfsg-1/include/QtEdidSupport/qtedidsupportversion.h	2025-02-26 11:02:59.343810000 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTEDIDSUPPORT_VERSION_H
 #define QT_QTEDIDSUPPORT_VERSION_H
 
-#define QTEDIDSUPPORT_VERSION_STR "5.15.15"
+#define QTEDIDSUPPORT_VERSION_STR "5.15.17"
 
-#define QTEDIDSUPPORT_VERSION 0x050F0F
+#define QTEDIDSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTEDIDSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfscontext_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfscontext_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfscontext_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfscontext_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/plugins/platforms/eglfs/api/qeglfscontext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfscursor_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfscursor_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfscursor_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfscursor_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/plugins/platforms/eglfs/api/qeglfscursor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsdeviceintegration_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsdeviceintegration_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsdeviceintegration_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsdeviceintegration_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/plugins/platforms/eglfs/api/qeglfsdeviceintegration_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsglobal_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsglobal_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsglobal_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsglobal_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/plugins/platforms/eglfs/api/qeglfsglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfshooks_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfshooks_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfshooks_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfshooks_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/plugins/platforms/eglfs/api/qeglfshooks_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsintegration_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsintegration_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsintegration_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsintegration_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/plugins/platforms/eglfs/api/qeglfsintegration_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsoffscreenwindow_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsoffscreenwindow_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsoffscreenwindow_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsoffscreenwindow_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/plugins/platforms/eglfs/api/qeglfsoffscreenwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsscreen_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsscreen_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsscreen_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsscreen_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/plugins/platforms/eglfs/api/qeglfsscreen_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsvulkaninstance_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsvulkaninstance_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsvulkaninstance_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsvulkaninstance_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/plugins/platforms/eglfs/api/vulkan/qeglfsvulkaninstance_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsvulkanwindow_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsvulkanwindow_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsvulkanwindow_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfsvulkanwindow_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/plugins/platforms/eglfs/api/vulkan/qeglfsvulkanwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfswindow_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfswindow_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfswindow_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.15/QtEglFSDeviceIntegration/private/qeglfswindow_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/plugins/platforms/eglfs/api/qeglfswindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfscontext_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfscontext_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfscontext_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfscontext_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/plugins/platforms/eglfs/api/qeglfscontext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfscursor_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfscursor_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfscursor_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfscursor_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/plugins/platforms/eglfs/api/qeglfscursor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsdeviceintegration_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsdeviceintegration_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsdeviceintegration_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsdeviceintegration_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/plugins/platforms/eglfs/api/qeglfsdeviceintegration_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsglobal_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsglobal_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsglobal_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsglobal_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/plugins/platforms/eglfs/api/qeglfsglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfshooks_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfshooks_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfshooks_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfshooks_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/plugins/platforms/eglfs/api/qeglfshooks_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsintegration_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsintegration_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsintegration_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsintegration_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/plugins/platforms/eglfs/api/qeglfsintegration_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsoffscreenwindow_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsoffscreenwindow_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsoffscreenwindow_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsoffscreenwindow_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/plugins/platforms/eglfs/api/qeglfsoffscreenwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsscreen_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsscreen_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsscreen_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsscreen_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/plugins/platforms/eglfs/api/qeglfsscreen_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsvulkaninstance_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsvulkaninstance_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsvulkaninstance_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsvulkaninstance_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/plugins/platforms/eglfs/api/vulkan/qeglfsvulkaninstance_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsvulkanwindow_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsvulkanwindow_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsvulkanwindow_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfsvulkanwindow_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/plugins/platforms/eglfs/api/vulkan/qeglfsvulkanwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfswindow_p.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfswindow_p.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfswindow_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/5.15.17/QtEglFSDeviceIntegration/private/qeglfswindow_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/plugins/platforms/eglfs/api/qeglfswindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/qteglfsdeviceintegrationversion.h 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/qteglfsdeviceintegrationversion.h
--- 5.15.15+dfsg-2/include/QtEglFSDeviceIntegration/qteglfsdeviceintegrationversion.h	2024-08-16 06:16:11.525242800 +0000
+++ 5.15.17+dfsg-1/include/QtEglFSDeviceIntegration/qteglfsdeviceintegrationversion.h	2025-02-26 11:02:59.351810200 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTEGLFSDEVICEINTEGRATION_VERSION_H
 #define QT_QTEGLFSDEVICEINTEGRATION_VERSION_H
 
-#define QTEGLFSDEVICEINTEGRATION_VERSION_STR "5.15.15"
+#define QTEGLFSDEVICEINTEGRATION_VERSION_STR "5.15.17"
 
-#define QTEGLFSDEVICEINTEGRATION_VERSION 0x050F0F
+#define QTEGLFSDEVICEINTEGRATION_VERSION 0x050F11
 
 #endif // QT_QTEGLFSDEVICEINTEGRATION_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglconvenience_p.h 5.15.17+dfsg-1/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglconvenience_p.h
--- 5.15.15+dfsg-2/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglconvenience_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglconvenience_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/eglconvenience/qeglconvenience_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglpbuffer_p.h 5.15.17+dfsg-1/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglpbuffer_p.h
--- 5.15.15+dfsg-2/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglpbuffer_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglpbuffer_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/eglconvenience/qeglpbuffer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglplatformcontext_p.h 5.15.17+dfsg-1/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglplatformcontext_p.h
--- 5.15.15+dfsg-2/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglplatformcontext_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglplatformcontext_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/eglconvenience/qeglplatformcontext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglstreamconvenience_p.h 5.15.17+dfsg-1/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglstreamconvenience_p.h
--- 5.15.15+dfsg-2/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglstreamconvenience_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglSupport/5.15.15/QtEglSupport/private/qeglstreamconvenience_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/eglconvenience/qeglstreamconvenience_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglSupport/5.15.15/QtEglSupport/private/qt_egl_p.h 5.15.17+dfsg-1/include/QtEglSupport/5.15.15/QtEglSupport/private/qt_egl_p.h
--- 5.15.15+dfsg-2/include/QtEglSupport/5.15.15/QtEglSupport/private/qt_egl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglSupport/5.15.15/QtEglSupport/private/qt_egl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/eglconvenience/qt_egl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglSupport/5.15.15/QtEglSupport/private/qxlibeglintegration_p.h 5.15.17+dfsg-1/include/QtEglSupport/5.15.15/QtEglSupport/private/qxlibeglintegration_p.h
--- 5.15.15+dfsg-2/include/QtEglSupport/5.15.15/QtEglSupport/private/qxlibeglintegration_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglSupport/5.15.15/QtEglSupport/private/qxlibeglintegration_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/eglconvenience/qxlibeglintegration_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglconvenience_p.h 5.15.17+dfsg-1/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglconvenience_p.h
--- 5.15.15+dfsg-2/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglconvenience_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglconvenience_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/eglconvenience/qeglconvenience_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglpbuffer_p.h 5.15.17+dfsg-1/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglpbuffer_p.h
--- 5.15.15+dfsg-2/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglpbuffer_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglpbuffer_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/eglconvenience/qeglpbuffer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglplatformcontext_p.h 5.15.17+dfsg-1/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglplatformcontext_p.h
--- 5.15.15+dfsg-2/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglplatformcontext_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglplatformcontext_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/eglconvenience/qeglplatformcontext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglstreamconvenience_p.h 5.15.17+dfsg-1/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglstreamconvenience_p.h
--- 5.15.15+dfsg-2/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglstreamconvenience_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglSupport/5.15.17/QtEglSupport/private/qeglstreamconvenience_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/eglconvenience/qeglstreamconvenience_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglSupport/5.15.17/QtEglSupport/private/qt_egl_p.h 5.15.17+dfsg-1/include/QtEglSupport/5.15.17/QtEglSupport/private/qt_egl_p.h
--- 5.15.15+dfsg-2/include/QtEglSupport/5.15.17/QtEglSupport/private/qt_egl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglSupport/5.15.17/QtEglSupport/private/qt_egl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/eglconvenience/qt_egl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglSupport/5.15.17/QtEglSupport/private/qxlibeglintegration_p.h 5.15.17+dfsg-1/include/QtEglSupport/5.15.17/QtEglSupport/private/qxlibeglintegration_p.h
--- 5.15.15+dfsg-2/include/QtEglSupport/5.15.17/QtEglSupport/private/qxlibeglintegration_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEglSupport/5.15.17/QtEglSupport/private/qxlibeglintegration_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/eglconvenience/qxlibeglintegration_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEglSupport/qteglsupportversion.h 5.15.17+dfsg-1/include/QtEglSupport/qteglsupportversion.h
--- 5.15.15+dfsg-2/include/QtEglSupport/qteglsupportversion.h	2024-08-16 06:16:12.973250600 +0000
+++ 5.15.17+dfsg-1/include/QtEglSupport/qteglsupportversion.h	2025-02-26 11:02:59.283809400 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTEGLSUPPORT_VERSION_H
 #define QT_QTEGLSUPPORT_VERSION_H
 
-#define QTEGLSUPPORT_VERSION_STR "5.15.15"
+#define QTEGLSUPPORT_VERSION_STR "5.15.17"
 
-#define QTEGLSUPPORT_VERSION 0x050F0F
+#define QTEGLSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTEGLSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qeventdispatcher_glib_p.h 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qeventdispatcher_glib_p.h
--- 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qeventdispatcher_glib_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qeventdispatcher_glib_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/eventdispatchers/qeventdispatcher_glib_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qgenericunixeventdispatcher_p.h 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qgenericunixeventdispatcher_p.h
--- 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qgenericunixeventdispatcher_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qgenericunixeventdispatcher_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/eventdispatchers/qgenericunixeventdispatcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qunixeventdispatcher_qpa_p.h 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qunixeventdispatcher_qpa_p.h
--- 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qunixeventdispatcher_qpa_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qunixeventdispatcher_qpa_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/eventdispatchers/qunixeventdispatcher_qpa_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h
--- 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.15/QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/eventdispatchers/qwindowsguieventdispatcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qeventdispatcher_glib_p.h 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qeventdispatcher_glib_p.h
--- 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qeventdispatcher_glib_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qeventdispatcher_glib_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/eventdispatchers/qeventdispatcher_glib_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qgenericunixeventdispatcher_p.h 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qgenericunixeventdispatcher_p.h
--- 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qgenericunixeventdispatcher_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qgenericunixeventdispatcher_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/eventdispatchers/qgenericunixeventdispatcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qunixeventdispatcher_qpa_p.h 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qunixeventdispatcher_qpa_p.h
--- 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qunixeventdispatcher_qpa_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qunixeventdispatcher_qpa_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/eventdispatchers/qunixeventdispatcher_qpa_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h
--- 5.15.15+dfsg-2/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtEventDispatcherSupport/5.15.17/QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/eventdispatchers/qwindowsguieventdispatcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtEventDispatcherSupport/qteventdispatchersupportversion.h 5.15.17+dfsg-1/include/QtEventDispatcherSupport/qteventdispatchersupportversion.h
--- 5.15.15+dfsg-2/include/QtEventDispatcherSupport/qteventdispatchersupportversion.h	2024-08-16 06:16:13.377252800 +0000
+++ 5.15.17+dfsg-1/include/QtEventDispatcherSupport/qteventdispatchersupportversion.h	2025-02-26 11:03:01.779832100 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTEVENTDISPATCHERSUPPORT_VERSION_H
 #define QT_QTEVENTDISPATCHERSUPPORT_VERSION_H
 
-#define QTEVENTDISPATCHERSUPPORT_VERSION_STR "5.15.15"
+#define QTEVENTDISPATCHERSUPPORT_VERSION_STR "5.15.17"
 
-#define QTEVENTDISPATCHERSUPPORT_VERSION 0x050F0F
+#define QTEVENTDISPATCHERSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTEVENTDISPATCHERSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbbackingstore_p.h 5.15.17+dfsg-1/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbbackingstore_p.h
--- 5.15.15+dfsg-2/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbbackingstore_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbbackingstore_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fbconvenience/qfbbackingstore_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbcursor_p.h 5.15.17+dfsg-1/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbcursor_p.h
--- 5.15.15+dfsg-2/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbcursor_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbcursor_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fbconvenience/qfbcursor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbscreen_p.h 5.15.17+dfsg-1/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbscreen_p.h
--- 5.15.15+dfsg-2/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbscreen_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbscreen_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fbconvenience/qfbscreen_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbvthandler_p.h 5.15.17+dfsg-1/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbvthandler_p.h
--- 5.15.15+dfsg-2/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbvthandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbvthandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fbconvenience/qfbvthandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbwindow_p.h 5.15.17+dfsg-1/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbwindow_p.h
--- 5.15.15+dfsg-2/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbwindow_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFbSupport/5.15.15/QtFbSupport/private/qfbwindow_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fbconvenience/qfbwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbbackingstore_p.h 5.15.17+dfsg-1/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbbackingstore_p.h
--- 5.15.15+dfsg-2/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbbackingstore_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbbackingstore_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fbconvenience/qfbbackingstore_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbcursor_p.h 5.15.17+dfsg-1/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbcursor_p.h
--- 5.15.15+dfsg-2/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbcursor_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbcursor_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fbconvenience/qfbcursor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbscreen_p.h 5.15.17+dfsg-1/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbscreen_p.h
--- 5.15.15+dfsg-2/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbscreen_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbscreen_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fbconvenience/qfbscreen_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbvthandler_p.h 5.15.17+dfsg-1/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbvthandler_p.h
--- 5.15.15+dfsg-2/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbvthandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbvthandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fbconvenience/qfbvthandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbwindow_p.h 5.15.17+dfsg-1/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbwindow_p.h
--- 5.15.15+dfsg-2/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbwindow_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFbSupport/5.15.17/QtFbSupport/private/qfbwindow_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fbconvenience/qfbwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFbSupport/qtfbsupportversion.h 5.15.17+dfsg-1/include/QtFbSupport/qtfbsupportversion.h
--- 5.15.15+dfsg-2/include/QtFbSupport/qtfbsupportversion.h	2024-08-16 06:16:11.621243200 +0000
+++ 5.15.17+dfsg-1/include/QtFbSupport/qtfbsupportversion.h	2025-02-26 11:02:59.267809400 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTFBSUPPORT_VERSION_H
 #define QT_QTFBSUPPORT_VERSION_H
 
-#define QTFBSUPPORT_VERSION_STR "5.15.15"
+#define QTFBSUPPORT_VERSION_STR "5.15.17"
 
-#define QTFBSUPPORT_VERSION 0x050F0F
+#define QTFBSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTFBSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontconfigdatabase_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontconfigdatabase_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontconfigdatabase_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontconfigdatabase_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontengine_coretext_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontengine_coretext_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontengine_coretext_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontengine_coretext_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontengine_ft_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontengine_ft_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontengine_ft_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontengine_ft_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontenginemultifontconfig_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontenginemultifontconfig_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontenginemultifontconfig_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfontenginemultifontconfig_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfreetypefontdatabase_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfreetypefontdatabase_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfreetypefontdatabase_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qfreetypefontdatabase_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qgenericunixfontdatabase_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qgenericunixfontdatabase_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qgenericunixfontdatabase_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qgenericunixfontdatabase_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fontdatabases/genericunix/qgenericunixfontdatabase_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontdatabase_ft_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontdatabase_ft_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontdatabase_ft_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontdatabase_ft_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontengine_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontengine_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fontdatabases/windows/qwindowsfontengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontenginedirectwrite_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontenginedirectwrite_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontenginedirectwrite_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsfontenginedirectwrite_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsnativeimage_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsnativeimage_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsnativeimage_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwindowsnativeimage_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fontdatabases/windows/qwindowsnativeimage_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwinrtfontdatabase_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwinrtfontdatabase_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwinrtfontdatabase_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.15/QtFontDatabaseSupport/private/qwinrtfontdatabase_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/fontdatabases/winrt/qwinrtfontdatabase_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontconfigdatabase_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontconfigdatabase_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontconfigdatabase_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontconfigdatabase_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontengine_coretext_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontengine_coretext_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontengine_coretext_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontengine_coretext_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontengine_ft_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontengine_ft_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontengine_ft_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontengine_ft_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontenginemultifontconfig_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontenginemultifontconfig_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontenginemultifontconfig_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfontenginemultifontconfig_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfreetypefontdatabase_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfreetypefontdatabase_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfreetypefontdatabase_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qfreetypefontdatabase_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qgenericunixfontdatabase_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qgenericunixfontdatabase_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qgenericunixfontdatabase_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qgenericunixfontdatabase_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fontdatabases/genericunix/qgenericunixfontdatabase_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontdatabase_ft_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontdatabase_ft_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontdatabase_ft_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontdatabase_ft_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontengine_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontengine_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fontdatabases/windows/qwindowsfontengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontenginedirectwrite_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontenginedirectwrite_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontenginedirectwrite_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsfontenginedirectwrite_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsnativeimage_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsnativeimage_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsnativeimage_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwindowsnativeimage_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fontdatabases/windows/qwindowsnativeimage_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwinrtfontdatabase_p.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwinrtfontdatabase_p.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwinrtfontdatabase_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/5.15.17/QtFontDatabaseSupport/private/qwinrtfontdatabase_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/fontdatabases/winrt/qwinrtfontdatabase_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtFontDatabaseSupport/qtfontdatabasesupportversion.h 5.15.17+dfsg-1/include/QtFontDatabaseSupport/qtfontdatabasesupportversion.h
--- 5.15.15+dfsg-2/include/QtFontDatabaseSupport/qtfontdatabasesupportversion.h	2024-08-16 06:16:13.033250800 +0000
+++ 5.15.17+dfsg-1/include/QtFontDatabaseSupport/qtfontdatabasesupportversion.h	2025-02-26 11:03:00.095816900 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTFONTDATABASESUPPORT_VERSION_H
 #define QT_QTFONTDATABASESUPPORT_VERSION_H
 
-#define QTFONTDATABASESUPPORT_VERSION_STR "5.15.15"
+#define QTFONTDATABASESUPPORT_VERSION_STR "5.15.17"
 
-#define QTFONTDATABASESUPPORT_VERSION 0x050F0F
+#define QTFONTDATABASESUPPORT_VERSION 0x050F11
 
 #endif // QT_QTFONTDATABASESUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtGlxSupport/5.15.15/QtGlxSupport/private/qglxconvenience_p.h 5.15.17+dfsg-1/include/QtGlxSupport/5.15.15/QtGlxSupport/private/qglxconvenience_p.h
--- 5.15.15+dfsg-2/include/QtGlxSupport/5.15.15/QtGlxSupport/private/qglxconvenience_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGlxSupport/5.15.15/QtGlxSupport/private/qglxconvenience_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/glxconvenience/qglxconvenience_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGlxSupport/5.15.17/QtGlxSupport/private/qglxconvenience_p.h 5.15.17+dfsg-1/include/QtGlxSupport/5.15.17/QtGlxSupport/private/qglxconvenience_p.h
--- 5.15.15+dfsg-2/include/QtGlxSupport/5.15.17/QtGlxSupport/private/qglxconvenience_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGlxSupport/5.15.17/QtGlxSupport/private/qglxconvenience_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/glxconvenience/qglxconvenience_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGlxSupport/qtglxsupportversion.h 5.15.17+dfsg-1/include/QtGlxSupport/qtglxsupportversion.h
--- 5.15.15+dfsg-2/include/QtGlxSupport/qtglxsupportversion.h	2024-08-16 06:16:10.993239900 +0000
+++ 5.15.17+dfsg-1/include/QtGlxSupport/qtglxsupportversion.h	2025-02-26 11:02:59.279809500 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTGLXSUPPORT_VERSION_H
 #define QT_QTGLXSUPPORT_VERSION_H
 
-#define QTGLXSUPPORT_VERSION_STR "5.15.15"
+#define QTGLXSUPPORT_VERSION_STR "5.15.17"
 
-#define QTGLXSUPPORT_VERSION 0x050F0F
+#define QTGLXSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTGLXSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtGraphicsSupport/5.15.15/QtGraphicsSupport/private/qrasterbackingstore_p.h 5.15.17+dfsg-1/include/QtGraphicsSupport/5.15.15/QtGraphicsSupport/private/qrasterbackingstore_p.h
--- 5.15.15+dfsg-2/include/QtGraphicsSupport/5.15.15/QtGraphicsSupport/private/qrasterbackingstore_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGraphicsSupport/5.15.15/QtGraphicsSupport/private/qrasterbackingstore_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/graphics/qrasterbackingstore_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGraphicsSupport/5.15.17/QtGraphicsSupport/private/qrasterbackingstore_p.h 5.15.17+dfsg-1/include/QtGraphicsSupport/5.15.17/QtGraphicsSupport/private/qrasterbackingstore_p.h
--- 5.15.15+dfsg-2/include/QtGraphicsSupport/5.15.17/QtGraphicsSupport/private/qrasterbackingstore_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGraphicsSupport/5.15.17/QtGraphicsSupport/private/qrasterbackingstore_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/graphics/qrasterbackingstore_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGraphicsSupport/qtgraphicssupportversion.h 5.15.17+dfsg-1/include/QtGraphicsSupport/qtgraphicssupportversion.h
--- 5.15.15+dfsg-2/include/QtGraphicsSupport/qtgraphicssupportversion.h	2024-08-16 06:16:13.049250800 +0000
+++ 5.15.17+dfsg-1/include/QtGraphicsSupport/qtgraphicssupportversion.h	2025-02-26 11:03:01.815832400 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTGRAPHICSSUPPORT_VERSION_H
 #define QT_QTGRAPHICSSUPPORT_VERSION_H
 
-#define QTGRAPHICSSUPPORT_VERSION_STR "5.15.15"
+#define QTGRAPHICSSUPPORT_VERSION_STR "5.15.17"
 
-#define QTGRAPHICSSUPPORT_VERSION 0x050F0F
+#define QTGRAPHICSSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTGRAPHICSSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/cs_tdr_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/cs_tdr_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/cs_tdr_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/cs_tdr_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/cs_tdr_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qabstractlayoutstyleinfo_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qabstractlayoutstyleinfo_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qabstractlayoutstyleinfo_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qabstractlayoutstyleinfo_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qabstractlayoutstyleinfo_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qabstracttextdocumentlayout_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qabstracttextdocumentlayout_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qabstracttextdocumentlayout_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qabstracttextdocumentlayout_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qabstracttextdocumentlayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qaccessiblecache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qaccessiblecache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qaccessiblecache_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qaccessiblecache_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/accessible/qaccessiblecache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qastchandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qastchandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qastchandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qastchandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qastchandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qbezier_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qbezier_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qbezier_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qbezier_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qbezier_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qblendfunctions_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qblendfunctions_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qblendfunctions_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qblendfunctions_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qblendfunctions_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qblittable_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qblittable_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qblittable_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qblittable_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qblittable_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qbmphandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qbmphandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qbmphandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qbmphandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qbmphandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolor_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolor_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolor_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolor_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qcolor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolormatrix_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolormatrix_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolormatrix_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolormatrix_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qcolormatrix_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolorspace_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolorspace_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolorspace_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolorspace_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qcolorspace_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolortransferfunction_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolortransferfunction_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolortransferfunction_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolortransferfunction_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qcolortransferfunction_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolortransfertable_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolortransfertable_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolortransfertable_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolortransfertable_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qcolortransfertable_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolortransform_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolortransform_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolortransform_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolortransform_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qcolortransform_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolortrc_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolortrc_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolortrc_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolortrc_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qcolortrc_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolortrclut_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolortrclut_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcolortrclut_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcolortrclut_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qcolortrclut_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcoregraphics_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcoregraphics_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcoregraphics_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcoregraphics_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qcoregraphics_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcosmeticstroker_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcosmeticstroker_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcosmeticstroker_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcosmeticstroker_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qcosmeticstroker_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcssparser_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcssparser_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcssparser_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcssparser_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qcssparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcssutil_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcssutil_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcssutil_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcssutil_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qcssutil_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcursor_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcursor_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qcursor_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qcursor_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qcursor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdatabuffer_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdatabuffer_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdatabuffer_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdatabuffer_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qdatabuffer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdistancefield_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdistancefield_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdistancefield_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdistancefield_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qdistancefield_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdnd_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdnd_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdnd_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdnd_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qdnd_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdrawhelper_mips_dsp_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdrawhelper_mips_dsp_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdrawhelper_mips_dsp_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdrawhelper_mips_dsp_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qdrawhelper_mips_dsp_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdrawhelper_neon_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdrawhelper_neon_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdrawhelper_neon_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdrawhelper_neon_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qdrawhelper_neon_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdrawhelper_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdrawhelper_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdrawhelper_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdrawhelper_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qdrawhelper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdrawhelper_x86_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdrawhelper_x86_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdrawhelper_x86_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdrawhelper_x86_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qdrawhelper_x86_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdrawingprimitive_sse2_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdrawingprimitive_sse2_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qdrawingprimitive_sse2_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qdrawingprimitive_sse2_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qdrawingprimitive_sse2_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qemulationpaintengine_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qemulationpaintengine_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qemulationpaintengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qemulationpaintengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qemulationpaintengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qevent_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qevent_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qevent_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qevent_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qevent_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qfixed_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qfixed_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qfixed_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qfixed_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qfixed_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qfont_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qfont_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qfont_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qfont_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qfont_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qfontengine_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qfontengine_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qfontengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qfontengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qfontengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qfontengine_qpf2_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qfontengine_qpf2_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qfontengine_qpf2_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qfontengine_qpf2_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qfontengine_qpf2_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qfontengineglyphcache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qfontengineglyphcache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qfontengineglyphcache_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qfontengineglyphcache_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qfontengineglyphcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qfontsubset_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qfontsubset_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qfontsubset_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qfontsubset_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qfontsubset_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qfragmentmap_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qfragmentmap_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qfragmentmap_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qfragmentmap_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qfragmentmap_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qglyphrun_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qglyphrun_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qglyphrun_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qglyphrun_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qglyphrun_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qgrayraster_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qgrayraster_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qgrayraster_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qgrayraster_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qgrayraster_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qgridlayoutengine_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qgridlayoutengine_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qgridlayoutengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qgridlayoutengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qgridlayoutengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qguiapplication_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qguiapplication_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qguiapplication_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qguiapplication_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qguiapplication_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qharfbuzzng_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qharfbuzzng_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qharfbuzzng_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qharfbuzzng_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qharfbuzzng_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qhexstring_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qhexstring_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qhexstring_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qhexstring_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qhexstring_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qhighdpiscaling_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qhighdpiscaling_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qhighdpiscaling_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qhighdpiscaling_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qhighdpiscaling_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qicc_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qicc_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qicc_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qicc_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qicc_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qicon_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qicon_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qicon_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qicon_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qicon_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qiconloader_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qiconloader_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qiconloader_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qiconloader_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qiconloader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qimage_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qimage_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qimage_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qimage_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qimage_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qimagepixmapcleanuphooks_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qimagepixmapcleanuphooks_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qimagepixmapcleanuphooks_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qimagepixmapcleanuphooks_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qimagepixmapcleanuphooks_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qimagereaderwriterhelpers_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qimagereaderwriterhelpers_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qimagereaderwriterhelpers_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qimagereaderwriterhelpers_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qimagereaderwriterhelpers_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qimagescale_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qimagescale_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qimagescale_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qimagescale_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qimagescale_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qinputcontrol_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qinputcontrol_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qinputcontrol_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qinputcontrol_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qinputcontrol_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qinputdevicemanager_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qinputdevicemanager_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qinputdevicemanager_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qinputdevicemanager_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qinputdevicemanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qinputdevicemanager_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qinputdevicemanager_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qinputdevicemanager_p_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qinputdevicemanager_p_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qinputdevicemanager_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qinputmethod_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qinputmethod_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qinputmethod_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qinputmethod_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qinputmethod_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qinternalmimedata_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qinternalmimedata_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qinternalmimedata_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qinternalmimedata_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qinternalmimedata_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qkeymapper_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qkeymapper_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qkeymapper_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qkeymapper_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qkeymapper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qkeysequence_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qkeysequence_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qkeysequence_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qkeysequence_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qkeysequence_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qktxhandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qktxhandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qktxhandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qktxhandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qktxhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qlayoutpolicy_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qlayoutpolicy_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qlayoutpolicy_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qlayoutpolicy_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qlayoutpolicy_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qmath_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qmath_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qmath_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qmath_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qmath_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qmemrotate_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qmemrotate_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qmemrotate_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qmemrotate_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qmemrotate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopengl2pexvertexarray_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopengl2pexvertexarray_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopengl2pexvertexarray_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopengl2pexvertexarray_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopengl2pexvertexarray_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopengl_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopengl_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopengl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopengl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopengl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglcontext_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglcontext_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglcontext_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglcontext_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qopenglcontext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglcustomshaderstage_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglcustomshaderstage_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglcustomshaderstage_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglcustomshaderstage_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopenglcustomshaderstage_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglengineshadermanager_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglengineshadermanager_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglengineshadermanager_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglengineshadermanager_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopenglengineshadermanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglengineshadersource_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglengineshadersource_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglengineshadersource_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglengineshadersource_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopenglengineshadersource_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglextensions_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglextensions_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglextensions_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglextensions_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopenglextensions_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglframebufferobject_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglframebufferobject_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglframebufferobject_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglframebufferobject_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopenglframebufferobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglgradientcache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglgradientcache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglgradientcache_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglgradientcache_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopenglgradientcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglpaintdevice_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglpaintdevice_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglpaintdevice_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglpaintdevice_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopenglpaintdevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglpaintengine_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglpaintengine_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglpaintengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglpaintengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopenglpaintengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglprogrambinarycache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglprogrambinarycache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglprogrambinarycache_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglprogrambinarycache_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopenglprogrambinarycache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglqueryhelper_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglqueryhelper_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglqueryhelper_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglqueryhelper_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopenglqueryhelper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglshadercache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglshadercache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglshadercache_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglshadercache_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopenglshadercache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopengltexture_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopengltexture_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopengltexture_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopengltexture_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopengltexture_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopengltexturecache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopengltexturecache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopengltexturecache_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopengltexturecache_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopengltexturecache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopengltextureglyphcache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopengltextureglyphcache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopengltextureglyphcache_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopengltextureglyphcache_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopengltextureglyphcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopengltexturehelper_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopengltexturehelper_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopengltexturehelper_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopengltexturehelper_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopengltexturehelper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopengltextureuploader_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopengltextureuploader_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopengltextureuploader_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopengltextureuploader_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopengltextureuploader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglversionfunctionsfactory_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglversionfunctionsfactory_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglversionfunctionsfactory_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglversionfunctionsfactory_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopenglversionfunctionsfactory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglvertexarrayobject_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglvertexarrayobject_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qopenglvertexarrayobject_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qopenglvertexarrayobject_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/opengl/qopenglvertexarrayobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qoutlinemapper_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qoutlinemapper_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qoutlinemapper_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qoutlinemapper_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qoutlinemapper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpagedpaintdevice_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpagedpaintdevice_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpagedpaintdevice_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpagedpaintdevice_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qpagedpaintdevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpaintdevicewindow_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpaintdevicewindow_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpaintdevicewindow_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpaintdevicewindow_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qpaintdevicewindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpaintengine_blitter_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpaintengine_blitter_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpaintengine_blitter_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpaintengine_blitter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qpaintengine_blitter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpaintengine_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpaintengine_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpaintengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpaintengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qpaintengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpaintengine_pic_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpaintengine_pic_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpaintengine_pic_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpaintengine_pic_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qpaintengine_pic_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpaintengine_raster_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpaintengine_raster_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpaintengine_raster_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpaintengine_raster_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qpaintengine_raster_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpaintengineex_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpaintengineex_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpaintengineex_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpaintengineex_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qpaintengineex_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpainter_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpainter_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpainter_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpainter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qpainter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpainterpath_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpainterpath_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpainterpath_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpainterpath_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qpainterpath_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpathclipper_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpathclipper_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpathclipper_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpathclipper_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qpathclipper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpathsimplifier_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpathsimplifier_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpathsimplifier_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpathsimplifier_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qpathsimplifier_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpdf_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpdf_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpdf_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpdf_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qpdf_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpen_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpen_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpen_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpen_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qpen_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpicture_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpicture_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpicture_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpicture_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qpicture_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpixmap_blitter_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpixmap_blitter_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpixmap_blitter_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpixmap_blitter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qpixmap_blitter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpixmap_raster_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpixmap_raster_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpixmap_raster_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpixmap_raster_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qpixmap_raster_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpixmapcache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpixmapcache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpixmapcache_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpixmapcache_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qpixmapcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpkmhandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpkmhandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpkmhandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpkmhandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qpkmhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpnghandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpnghandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpnghandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpnghandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qpnghandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpolygonclipper_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpolygonclipper_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qpolygonclipper_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qpolygonclipper_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qpolygonclipper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qppmhandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qppmhandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qppmhandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qppmhandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qppmhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrasterdefs_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrasterdefs_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrasterdefs_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrasterdefs_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qrasterdefs_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrasterizer_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrasterizer_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrasterizer_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrasterizer_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qrasterizer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrawfont_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrawfont_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrawfont_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrawfont_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qrawfont_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrbtree_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrbtree_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrbtree_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrbtree_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qrbtree_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrgba64_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrgba64_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrgba64_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrgba64_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qrgba64_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhi_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhi_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhi_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhi_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qrhi_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhi_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhi_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhi_p_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhi_p_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qrhi_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhid3d11_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhid3d11_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhid3d11_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhid3d11_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qrhid3d11_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhid3d11_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhid3d11_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhid3d11_p_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhid3d11_p_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qrhid3d11_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhigles2_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhigles2_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhigles2_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhigles2_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qrhigles2_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhigles2_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhigles2_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhigles2_p_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhigles2_p_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qrhigles2_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhimetal_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhimetal_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhimetal_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhimetal_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qrhimetal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhimetal_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhimetal_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhimetal_p_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhimetal_p_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qrhimetal_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhinull_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhinull_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhinull_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhinull_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qrhinull_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhinull_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhinull_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhinull_p_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhinull_p_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qrhinull_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhiprofiler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhiprofiler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhiprofiler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhiprofiler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qrhiprofiler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhiprofiler_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhiprofiler_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhiprofiler_p_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhiprofiler_p_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qrhiprofiler_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhivulkan_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhivulkan_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhivulkan_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhivulkan_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qrhivulkan_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhivulkan_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhivulkan_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhivulkan_p_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhivulkan_p_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qrhivulkan_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhivulkanext_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhivulkanext_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qrhivulkanext_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qrhivulkanext_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qrhivulkanext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qscreen_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qscreen_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qscreen_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qscreen_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qscreen_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qsessionmanager_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qsessionmanager_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qsessionmanager_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qsessionmanager_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qsessionmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshader_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshader_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshader_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshader_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qshader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshader_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshader_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshader_p_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshader_p_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qshader_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshaderdescription_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshaderdescription_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshaderdescription_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshaderdescription_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qshaderdescription_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshaderdescription_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshaderdescription_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshaderdescription_p_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshaderdescription_p_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/rhi/qshaderdescription_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshaderformat_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshaderformat_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshaderformat_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshaderformat_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qshaderformat_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshadergenerator_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshadergenerator_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshadergenerator_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshadergenerator_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qshadergenerator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshadergraph_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshadergraph_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshadergraph_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshadergraph_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qshadergraph_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshadergraphloader_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshadergraphloader_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshadergraphloader_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshadergraphloader_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qshadergraphloader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshaderlanguage_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshaderlanguage_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshaderlanguage_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshaderlanguage_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qshaderlanguage_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshadernode_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshadernode_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshadernode_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshadernode_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qshadernode_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshadernodeport_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshadernodeport_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshadernodeport_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshadernodeport_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qshadernodeport_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshadernodesloader_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshadernodesloader_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshadernodesloader_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshadernodesloader_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qshadernodesloader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshapedpixmapdndwindow_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshapedpixmapdndwindow_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshapedpixmapdndwindow_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshapedpixmapdndwindow_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qshapedpixmapdndwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshortcutmap_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshortcutmap_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qshortcutmap_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qshortcutmap_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qshortcutmap_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qsimpledrag_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qsimpledrag_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qsimpledrag_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qsimpledrag_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qsimpledrag_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qstandarditemmodel_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qstandarditemmodel_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qstandarditemmodel_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qstandarditemmodel_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/itemmodels/qstandarditemmodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qstatictext_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qstatictext_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qstatictext_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qstatictext_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qstatictext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qstroker_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qstroker_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qstroker_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qstroker_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qstroker_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qt_gui_pch.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qt_gui_pch.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qt_gui_pch.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qt_gui_pch.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qt_gui_pch.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qt_mips_asm_dsp_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qt_mips_asm_dsp_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qt_mips_asm_dsp_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qt_mips_asm_dsp_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qt_mips_asm_dsp_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextcursor_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextcursor_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextcursor_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextcursor_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qtextcursor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextdocument_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextdocument_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextdocument_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextdocument_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qtextdocument_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextdocumentfragment_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextdocumentfragment_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextdocumentfragment_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextdocumentfragment_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qtextdocumentfragment_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextdocumentlayout_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextdocumentlayout_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextdocumentlayout_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextdocumentlayout_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qtextdocumentlayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextengine_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextengine_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qtextengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextformat_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextformat_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextformat_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextformat_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qtextformat_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtexthtmlparser_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtexthtmlparser_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtexthtmlparser_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtexthtmlparser_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qtexthtmlparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextimagehandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextimagehandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextimagehandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextimagehandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qtextimagehandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextmarkdownimporter_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextmarkdownimporter_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextmarkdownimporter_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextmarkdownimporter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qtextmarkdownimporter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextmarkdownwriter_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextmarkdownwriter_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextmarkdownwriter_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextmarkdownwriter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qtextmarkdownwriter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextobject_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextobject_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextobject_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextobject_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qtextobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextodfwriter_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextodfwriter_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextodfwriter_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextodfwriter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qtextodfwriter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtexttable_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtexttable_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtexttable_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtexttable_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qtexttable_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtexturefiledata_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtexturefiledata_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtexturefiledata_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtexturefiledata_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qtexturefiledata_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtexturefilehandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtexturefilehandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtexturefilehandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtexturefilehandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qtexturefilehandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtexturefilereader_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtexturefilereader_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtexturefilereader_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtexturefilereader_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/util/qtexturefilereader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextureglyphcache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextureglyphcache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtextureglyphcache_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtextureglyphcache_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qtextureglyphcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtguiglobal_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtguiglobal_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtguiglobal_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtguiglobal_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qtguiglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtouchdevice_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtouchdevice_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtouchdevice_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtouchdevice_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qtouchdevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtriangulatingstroker_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtriangulatingstroker_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtriangulatingstroker_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtriangulatingstroker_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qtriangulatingstroker_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtriangulator_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtriangulator_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qtriangulator_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qtriangulator_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qtriangulator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qvectorpath_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qvectorpath_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qvectorpath_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qvectorpath_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qvectorpath_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qvulkanwindow_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qvulkanwindow_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qvulkanwindow_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qvulkanwindow_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/vulkan/qvulkanwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qwasmlocalfileaccess_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qwasmlocalfileaccess_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qwasmlocalfileaccess_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qwasmlocalfileaccess_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/platform/wasm/qwasmlocalfileaccess_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qwindow_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qwindow_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qwindow_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qwindow_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qxbmhandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qxbmhandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qxbmhandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qxbmhandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qxbmhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qxpmhandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qxpmhandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qxpmhandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qxpmhandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qxpmhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qzipreader_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qzipreader_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qzipreader_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qzipreader_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qzipreader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qzipwriter_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qzipwriter_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/private/qzipwriter_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/private/qzipwriter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qzipwriter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformaccessibility.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformaccessibility.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformaccessibility.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformaccessibility.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/accessible/qplatformaccessibility.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformbackingstore.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformbackingstore.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformbackingstore.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformbackingstore.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/painting/qplatformbackingstore.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformclipboard.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformclipboard.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformclipboard.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformclipboard.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformclipboard.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformcursor.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformcursor.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformcursor.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformcursor.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformcursor.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformdialoghelper.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformdialoghelper.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformdialoghelper.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformdialoghelper.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformdialoghelper.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformdrag.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformdrag.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformdrag.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformdrag.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformdrag.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformfontdatabase.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformfontdatabase.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformfontdatabase.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformfontdatabase.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/text/qplatformfontdatabase.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformgraphicsbuffer.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformgraphicsbuffer.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformgraphicsbuffer.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformgraphicsbuffer.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformgraphicsbuffer.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformgraphicsbufferhelper.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformgraphicsbufferhelper.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformgraphicsbufferhelper.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformgraphicsbufferhelper.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformgraphicsbufferhelper.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontext.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontext.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontext.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontext.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatforminputcontext.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontext_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontext_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontext_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontext_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatforminputcontext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontextfactory_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontextfactory_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontextfactory_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontextfactory_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatforminputcontextfactory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontextplugin_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontextplugin_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontextplugin_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatforminputcontextplugin_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatforminputcontextplugin_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformintegration.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformintegration.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformintegration.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformintegration.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformintegration.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformintegrationfactory_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformintegrationfactory_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformintegrationfactory_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformintegrationfactory_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformintegrationfactory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformintegrationplugin.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformintegrationplugin.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformintegrationplugin.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformintegrationplugin.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformintegrationplugin.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformmenu.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformmenu.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformmenu.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformmenu.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformmenu.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformnativeinterface.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformnativeinterface.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformnativeinterface.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformnativeinterface.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformnativeinterface.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformoffscreensurface.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformoffscreensurface.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformoffscreensurface.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformoffscreensurface.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformoffscreensurface.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformopenglcontext.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformopenglcontext.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformopenglcontext.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformopenglcontext.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformopenglcontext.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformpixmap.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformpixmap.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformpixmap.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformpixmap.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/image/qplatformpixmap.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformscreen.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformscreen.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformscreen.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformscreen.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformscreen.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformscreen_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformscreen_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformscreen_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformscreen_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformscreen_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformservices.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformservices.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformservices.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformservices.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformservices.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformsessionmanager.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformsessionmanager.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformsessionmanager.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformsessionmanager.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformsessionmanager.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformsharedgraphicscache.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformsharedgraphicscache.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformsharedgraphicscache.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformsharedgraphicscache.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformsharedgraphicscache.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformsurface.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformsurface.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformsurface.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformsurface.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformsurface.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformsystemtrayicon.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformsystemtrayicon.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformsystemtrayicon.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformsystemtrayicon.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformsystemtrayicon.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformtheme.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformtheme.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformtheme.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformtheme.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformtheme.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformtheme_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformtheme_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformtheme_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformtheme_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformtheme_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformthemefactory_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformthemefactory_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformthemefactory_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformthemefactory_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformthemefactory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformthemeplugin.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformthemeplugin.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformthemeplugin.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformthemeplugin.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformthemeplugin.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformvulkaninstance.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformvulkaninstance.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformvulkaninstance.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformvulkaninstance.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/vulkan/qplatformvulkaninstance.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformwindow.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformwindow.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformwindow.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformwindow.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformwindow.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformwindow_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformwindow_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qplatformwindow_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qplatformwindow_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qplatformwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qwindowsysteminterface.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qwindowsysteminterface.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qwindowsysteminterface.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qwindowsysteminterface.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qwindowsysteminterface.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qwindowsysteminterface_p.h 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qwindowsysteminterface_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.15/QtGui/qpa/qwindowsysteminterface_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.15/QtGui/qpa/qwindowsysteminterface_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/gui/kernel/qwindowsysteminterface_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/cs_tdr_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/cs_tdr_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/cs_tdr_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/cs_tdr_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/cs_tdr_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qabstractlayoutstyleinfo_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qabstractlayoutstyleinfo_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qabstractlayoutstyleinfo_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qabstractlayoutstyleinfo_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qabstractlayoutstyleinfo_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qabstracttextdocumentlayout_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qabstracttextdocumentlayout_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qabstracttextdocumentlayout_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qabstracttextdocumentlayout_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qabstracttextdocumentlayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qaccessiblecache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qaccessiblecache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qaccessiblecache_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qaccessiblecache_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/accessible/qaccessiblecache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qastchandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qastchandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qastchandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qastchandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qastchandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qbezier_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qbezier_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qbezier_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qbezier_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qbezier_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qblendfunctions_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qblendfunctions_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qblendfunctions_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qblendfunctions_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qblendfunctions_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qblittable_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qblittable_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qblittable_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qblittable_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qblittable_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qbmphandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qbmphandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qbmphandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qbmphandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qbmphandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolor_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolor_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolor_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolor_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qcolor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolormatrix_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolormatrix_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolormatrix_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolormatrix_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qcolormatrix_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolorspace_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolorspace_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolorspace_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolorspace_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qcolorspace_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolortransferfunction_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolortransferfunction_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolortransferfunction_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolortransferfunction_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qcolortransferfunction_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolortransfertable_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolortransfertable_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolortransfertable_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolortransfertable_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qcolortransfertable_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolortransform_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolortransform_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolortransform_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolortransform_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qcolortransform_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolortrc_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolortrc_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolortrc_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolortrc_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qcolortrc_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolortrclut_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolortrclut_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcolortrclut_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcolortrclut_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qcolortrclut_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcoregraphics_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcoregraphics_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcoregraphics_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcoregraphics_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qcoregraphics_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcosmeticstroker_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcosmeticstroker_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcosmeticstroker_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcosmeticstroker_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qcosmeticstroker_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcssparser_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcssparser_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcssparser_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcssparser_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qcssparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcssutil_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcssutil_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcssutil_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcssutil_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qcssutil_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcursor_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcursor_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qcursor_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qcursor_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qcursor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdatabuffer_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdatabuffer_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdatabuffer_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdatabuffer_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qdatabuffer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdistancefield_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdistancefield_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdistancefield_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdistancefield_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qdistancefield_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdnd_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdnd_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdnd_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdnd_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qdnd_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdrawhelper_mips_dsp_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdrawhelper_mips_dsp_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdrawhelper_mips_dsp_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdrawhelper_mips_dsp_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qdrawhelper_mips_dsp_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdrawhelper_neon_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdrawhelper_neon_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdrawhelper_neon_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdrawhelper_neon_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qdrawhelper_neon_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdrawhelper_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdrawhelper_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdrawhelper_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdrawhelper_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qdrawhelper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdrawhelper_x86_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdrawhelper_x86_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdrawhelper_x86_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdrawhelper_x86_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qdrawhelper_x86_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdrawingprimitive_sse2_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdrawingprimitive_sse2_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qdrawingprimitive_sse2_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qdrawingprimitive_sse2_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qdrawingprimitive_sse2_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qemulationpaintengine_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qemulationpaintengine_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qemulationpaintengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qemulationpaintengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qemulationpaintengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qevent_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qevent_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qevent_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qevent_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qevent_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qfixed_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qfixed_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qfixed_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qfixed_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qfixed_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qfont_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qfont_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qfont_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qfont_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qfont_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qfontengine_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qfontengine_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qfontengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qfontengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qfontengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qfontengine_qpf2_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qfontengine_qpf2_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qfontengine_qpf2_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qfontengine_qpf2_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qfontengine_qpf2_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qfontengineglyphcache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qfontengineglyphcache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qfontengineglyphcache_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qfontengineglyphcache_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qfontengineglyphcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qfontsubset_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qfontsubset_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qfontsubset_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qfontsubset_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qfontsubset_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qfragmentmap_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qfragmentmap_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qfragmentmap_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qfragmentmap_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qfragmentmap_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qglyphrun_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qglyphrun_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qglyphrun_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qglyphrun_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qglyphrun_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qgrayraster_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qgrayraster_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qgrayraster_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qgrayraster_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qgrayraster_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qgridlayoutengine_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qgridlayoutengine_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qgridlayoutengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qgridlayoutengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qgridlayoutengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qguiapplication_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qguiapplication_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qguiapplication_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qguiapplication_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qguiapplication_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qharfbuzzng_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qharfbuzzng_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qharfbuzzng_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qharfbuzzng_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qharfbuzzng_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qhexstring_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qhexstring_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qhexstring_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qhexstring_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qhexstring_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qhighdpiscaling_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qhighdpiscaling_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qhighdpiscaling_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qhighdpiscaling_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qhighdpiscaling_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qicc_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qicc_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qicc_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qicc_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qicc_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qicon_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qicon_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qicon_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qicon_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qicon_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qiconloader_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qiconloader_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qiconloader_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qiconloader_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qiconloader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qimage_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qimage_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qimage_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qimage_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qimage_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qimagepixmapcleanuphooks_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qimagepixmapcleanuphooks_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qimagepixmapcleanuphooks_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qimagepixmapcleanuphooks_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qimagepixmapcleanuphooks_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qimagereaderwriterhelpers_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qimagereaderwriterhelpers_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qimagereaderwriterhelpers_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qimagereaderwriterhelpers_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qimagereaderwriterhelpers_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qimagescale_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qimagescale_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qimagescale_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qimagescale_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qimagescale_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qinputcontrol_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qinputcontrol_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qinputcontrol_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qinputcontrol_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qinputcontrol_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qinputdevicemanager_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qinputdevicemanager_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qinputdevicemanager_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qinputdevicemanager_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qinputdevicemanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qinputdevicemanager_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qinputdevicemanager_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qinputdevicemanager_p_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qinputdevicemanager_p_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qinputdevicemanager_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qinputmethod_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qinputmethod_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qinputmethod_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qinputmethod_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qinputmethod_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qinternalmimedata_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qinternalmimedata_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qinternalmimedata_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qinternalmimedata_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qinternalmimedata_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qkeymapper_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qkeymapper_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qkeymapper_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qkeymapper_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qkeymapper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qkeysequence_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qkeysequence_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qkeysequence_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qkeysequence_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qkeysequence_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qktxhandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qktxhandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qktxhandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qktxhandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qktxhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qlayoutpolicy_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qlayoutpolicy_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qlayoutpolicy_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qlayoutpolicy_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qlayoutpolicy_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qmath_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qmath_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qmath_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qmath_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qmath_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qmemrotate_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qmemrotate_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qmemrotate_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qmemrotate_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qmemrotate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopengl2pexvertexarray_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopengl2pexvertexarray_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopengl2pexvertexarray_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopengl2pexvertexarray_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopengl2pexvertexarray_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopengl_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopengl_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopengl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopengl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopengl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglcontext_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglcontext_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglcontext_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglcontext_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qopenglcontext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglcustomshaderstage_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglcustomshaderstage_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglcustomshaderstage_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglcustomshaderstage_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopenglcustomshaderstage_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglengineshadermanager_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglengineshadermanager_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglengineshadermanager_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglengineshadermanager_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopenglengineshadermanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglengineshadersource_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglengineshadersource_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglengineshadersource_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglengineshadersource_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopenglengineshadersource_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglextensions_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglextensions_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglextensions_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglextensions_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopenglextensions_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglframebufferobject_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglframebufferobject_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglframebufferobject_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglframebufferobject_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopenglframebufferobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglgradientcache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglgradientcache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglgradientcache_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglgradientcache_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopenglgradientcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglpaintdevice_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglpaintdevice_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglpaintdevice_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglpaintdevice_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopenglpaintdevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglpaintengine_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglpaintengine_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglpaintengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglpaintengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopenglpaintengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglprogrambinarycache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglprogrambinarycache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglprogrambinarycache_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglprogrambinarycache_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopenglprogrambinarycache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglqueryhelper_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglqueryhelper_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglqueryhelper_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglqueryhelper_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopenglqueryhelper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglshadercache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglshadercache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglshadercache_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglshadercache_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopenglshadercache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopengltexture_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopengltexture_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopengltexture_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopengltexture_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopengltexture_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopengltexturecache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopengltexturecache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopengltexturecache_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopengltexturecache_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopengltexturecache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopengltextureglyphcache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopengltextureglyphcache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopengltextureglyphcache_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopengltextureglyphcache_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopengltextureglyphcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopengltexturehelper_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopengltexturehelper_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopengltexturehelper_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopengltexturehelper_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopengltexturehelper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopengltextureuploader_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopengltextureuploader_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopengltextureuploader_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopengltextureuploader_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopengltextureuploader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglversionfunctionsfactory_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglversionfunctionsfactory_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglversionfunctionsfactory_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglversionfunctionsfactory_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopenglversionfunctionsfactory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglvertexarrayobject_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglvertexarrayobject_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qopenglvertexarrayobject_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qopenglvertexarrayobject_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/opengl/qopenglvertexarrayobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qoutlinemapper_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qoutlinemapper_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qoutlinemapper_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qoutlinemapper_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qoutlinemapper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpagedpaintdevice_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpagedpaintdevice_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpagedpaintdevice_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpagedpaintdevice_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qpagedpaintdevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpaintdevicewindow_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpaintdevicewindow_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpaintdevicewindow_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpaintdevicewindow_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qpaintdevicewindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpaintengine_blitter_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpaintengine_blitter_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpaintengine_blitter_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpaintengine_blitter_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qpaintengine_blitter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpaintengine_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpaintengine_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpaintengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpaintengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qpaintengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpaintengine_pic_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpaintengine_pic_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpaintengine_pic_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpaintengine_pic_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qpaintengine_pic_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpaintengine_raster_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpaintengine_raster_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpaintengine_raster_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpaintengine_raster_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qpaintengine_raster_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpaintengineex_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpaintengineex_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpaintengineex_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpaintengineex_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qpaintengineex_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpainter_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpainter_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpainter_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpainter_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qpainter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpainterpath_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpainterpath_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpainterpath_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpainterpath_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qpainterpath_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpathclipper_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpathclipper_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpathclipper_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpathclipper_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qpathclipper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpathsimplifier_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpathsimplifier_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpathsimplifier_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpathsimplifier_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qpathsimplifier_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpdf_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpdf_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpdf_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpdf_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qpdf_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpen_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpen_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpen_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpen_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qpen_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpicture_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpicture_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpicture_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpicture_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qpicture_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpixmap_blitter_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpixmap_blitter_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpixmap_blitter_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpixmap_blitter_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qpixmap_blitter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpixmap_raster_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpixmap_raster_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpixmap_raster_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpixmap_raster_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qpixmap_raster_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpixmapcache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpixmapcache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpixmapcache_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpixmapcache_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qpixmapcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpkmhandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpkmhandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpkmhandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpkmhandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qpkmhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpnghandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpnghandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpnghandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpnghandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qpnghandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpolygonclipper_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpolygonclipper_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qpolygonclipper_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qpolygonclipper_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qpolygonclipper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qppmhandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qppmhandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qppmhandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qppmhandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qppmhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrasterdefs_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrasterdefs_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrasterdefs_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrasterdefs_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qrasterdefs_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrasterizer_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrasterizer_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrasterizer_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrasterizer_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qrasterizer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrawfont_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrawfont_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrawfont_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrawfont_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qrawfont_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrbtree_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrbtree_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrbtree_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrbtree_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qrbtree_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrgba64_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrgba64_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrgba64_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrgba64_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qrgba64_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhi_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhi_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhi_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhi_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qrhi_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhi_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhi_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhi_p_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhi_p_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qrhi_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhid3d11_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhid3d11_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhid3d11_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhid3d11_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qrhid3d11_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhid3d11_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhid3d11_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhid3d11_p_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhid3d11_p_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qrhid3d11_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhigles2_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhigles2_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhigles2_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhigles2_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qrhigles2_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhigles2_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhigles2_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhigles2_p_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhigles2_p_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qrhigles2_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhimetal_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhimetal_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhimetal_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhimetal_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qrhimetal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhimetal_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhimetal_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhimetal_p_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhimetal_p_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qrhimetal_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhinull_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhinull_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhinull_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhinull_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qrhinull_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhinull_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhinull_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhinull_p_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhinull_p_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qrhinull_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhiprofiler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhiprofiler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhiprofiler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhiprofiler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qrhiprofiler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhiprofiler_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhiprofiler_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhiprofiler_p_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhiprofiler_p_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qrhiprofiler_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhivulkan_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhivulkan_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhivulkan_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhivulkan_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qrhivulkan_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhivulkan_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhivulkan_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhivulkan_p_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhivulkan_p_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qrhivulkan_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhivulkanext_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhivulkanext_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qrhivulkanext_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qrhivulkanext_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qrhivulkanext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qscreen_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qscreen_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qscreen_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qscreen_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qscreen_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qsessionmanager_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qsessionmanager_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qsessionmanager_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qsessionmanager_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qsessionmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshader_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshader_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshader_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshader_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qshader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshader_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshader_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshader_p_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshader_p_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qshader_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshaderdescription_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshaderdescription_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshaderdescription_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshaderdescription_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qshaderdescription_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshaderdescription_p_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshaderdescription_p_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshaderdescription_p_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshaderdescription_p_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/rhi/qshaderdescription_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshaderformat_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshaderformat_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshaderformat_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshaderformat_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qshaderformat_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshadergenerator_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshadergenerator_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshadergenerator_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshadergenerator_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qshadergenerator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshadergraph_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshadergraph_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshadergraph_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshadergraph_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qshadergraph_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshadergraphloader_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshadergraphloader_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshadergraphloader_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshadergraphloader_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qshadergraphloader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshaderlanguage_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshaderlanguage_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshaderlanguage_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshaderlanguage_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qshaderlanguage_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshadernode_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshadernode_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshadernode_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshadernode_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qshadernode_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshadernodeport_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshadernodeport_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshadernodeport_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshadernodeport_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qshadernodeport_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshadernodesloader_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshadernodesloader_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshadernodesloader_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshadernodesloader_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qshadernodesloader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshapedpixmapdndwindow_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshapedpixmapdndwindow_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshapedpixmapdndwindow_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshapedpixmapdndwindow_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qshapedpixmapdndwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshortcutmap_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshortcutmap_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qshortcutmap_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qshortcutmap_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qshortcutmap_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qsimpledrag_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qsimpledrag_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qsimpledrag_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qsimpledrag_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qsimpledrag_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qstandarditemmodel_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qstandarditemmodel_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qstandarditemmodel_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qstandarditemmodel_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/itemmodels/qstandarditemmodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qstatictext_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qstatictext_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qstatictext_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qstatictext_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qstatictext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qstroker_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qstroker_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qstroker_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qstroker_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qstroker_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qt_gui_pch.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qt_gui_pch.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qt_gui_pch.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qt_gui_pch.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qt_gui_pch.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qt_mips_asm_dsp_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qt_mips_asm_dsp_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qt_mips_asm_dsp_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qt_mips_asm_dsp_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qt_mips_asm_dsp_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextcursor_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextcursor_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextcursor_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextcursor_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qtextcursor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextdocument_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextdocument_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextdocument_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextdocument_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qtextdocument_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextdocumentfragment_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextdocumentfragment_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextdocumentfragment_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextdocumentfragment_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qtextdocumentfragment_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextdocumentlayout_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextdocumentlayout_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextdocumentlayout_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextdocumentlayout_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qtextdocumentlayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextengine_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextengine_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qtextengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextformat_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextformat_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextformat_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextformat_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qtextformat_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtexthtmlparser_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtexthtmlparser_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtexthtmlparser_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtexthtmlparser_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qtexthtmlparser_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextimagehandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextimagehandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextimagehandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextimagehandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qtextimagehandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextmarkdownimporter_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextmarkdownimporter_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextmarkdownimporter_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextmarkdownimporter_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qtextmarkdownimporter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextmarkdownwriter_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextmarkdownwriter_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextmarkdownwriter_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextmarkdownwriter_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qtextmarkdownwriter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextobject_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextobject_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextobject_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextobject_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qtextobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextodfwriter_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextodfwriter_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextodfwriter_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextodfwriter_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qtextodfwriter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtexttable_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtexttable_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtexttable_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtexttable_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qtexttable_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtexturefiledata_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtexturefiledata_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtexturefiledata_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtexturefiledata_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qtexturefiledata_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtexturefilehandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtexturefilehandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtexturefilehandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtexturefilehandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qtexturefilehandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtexturefilereader_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtexturefilereader_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtexturefilereader_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtexturefilereader_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/util/qtexturefilereader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextureglyphcache_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextureglyphcache_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtextureglyphcache_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtextureglyphcache_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qtextureglyphcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtguiglobal_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtguiglobal_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtguiglobal_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtguiglobal_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qtguiglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtouchdevice_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtouchdevice_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtouchdevice_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtouchdevice_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qtouchdevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtriangulatingstroker_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtriangulatingstroker_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtriangulatingstroker_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtriangulatingstroker_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qtriangulatingstroker_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtriangulator_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtriangulator_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qtriangulator_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qtriangulator_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qtriangulator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qvectorpath_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qvectorpath_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qvectorpath_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qvectorpath_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qvectorpath_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qvulkanwindow_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qvulkanwindow_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qvulkanwindow_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qvulkanwindow_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/vulkan/qvulkanwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qwasmlocalfileaccess_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qwasmlocalfileaccess_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qwasmlocalfileaccess_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qwasmlocalfileaccess_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/platform/wasm/qwasmlocalfileaccess_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qwindow_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qwindow_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qwindow_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qwindow_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qxbmhandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qxbmhandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qxbmhandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qxbmhandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qxbmhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qxpmhandler_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qxpmhandler_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qxpmhandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qxpmhandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qxpmhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qzipreader_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qzipreader_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qzipreader_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qzipreader_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qzipreader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qzipwriter_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qzipwriter_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/private/qzipwriter_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/private/qzipwriter_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qzipwriter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformaccessibility.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformaccessibility.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformaccessibility.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformaccessibility.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/accessible/qplatformaccessibility.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformbackingstore.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformbackingstore.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformbackingstore.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformbackingstore.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/painting/qplatformbackingstore.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformclipboard.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformclipboard.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformclipboard.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformclipboard.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformclipboard.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformcursor.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformcursor.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformcursor.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformcursor.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformcursor.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformdialoghelper.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformdialoghelper.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformdialoghelper.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformdialoghelper.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformdialoghelper.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformdrag.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformdrag.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformdrag.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformdrag.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformdrag.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformfontdatabase.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformfontdatabase.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformfontdatabase.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformfontdatabase.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/text/qplatformfontdatabase.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformgraphicsbuffer.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformgraphicsbuffer.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformgraphicsbuffer.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformgraphicsbuffer.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformgraphicsbuffer.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformgraphicsbufferhelper.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformgraphicsbufferhelper.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformgraphicsbufferhelper.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformgraphicsbufferhelper.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformgraphicsbufferhelper.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontext.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontext.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontext.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontext.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatforminputcontext.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontext_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontext_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontext_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontext_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatforminputcontext_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontextfactory_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontextfactory_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontextfactory_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontextfactory_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatforminputcontextfactory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontextplugin_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontextplugin_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontextplugin_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatforminputcontextplugin_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatforminputcontextplugin_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformintegration.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformintegration.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformintegration.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformintegration.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformintegration.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformintegrationfactory_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformintegrationfactory_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformintegrationfactory_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformintegrationfactory_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformintegrationfactory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformintegrationplugin.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformintegrationplugin.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformintegrationplugin.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformintegrationplugin.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformintegrationplugin.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformmenu.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformmenu.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformmenu.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformmenu.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformmenu.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformnativeinterface.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformnativeinterface.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformnativeinterface.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformnativeinterface.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformnativeinterface.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformoffscreensurface.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformoffscreensurface.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformoffscreensurface.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformoffscreensurface.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformoffscreensurface.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformopenglcontext.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformopenglcontext.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformopenglcontext.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformopenglcontext.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformopenglcontext.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformpixmap.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformpixmap.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformpixmap.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformpixmap.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/image/qplatformpixmap.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformscreen.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformscreen.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformscreen.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformscreen.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformscreen.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformscreen_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformscreen_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformscreen_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformscreen_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformscreen_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformservices.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformservices.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformservices.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformservices.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformservices.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformsessionmanager.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformsessionmanager.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformsessionmanager.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformsessionmanager.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformsessionmanager.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformsharedgraphicscache.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformsharedgraphicscache.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformsharedgraphicscache.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformsharedgraphicscache.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformsharedgraphicscache.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformsurface.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformsurface.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformsurface.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformsurface.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformsurface.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformsystemtrayicon.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformsystemtrayicon.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformsystemtrayicon.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformsystemtrayicon.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformsystemtrayicon.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformtheme.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformtheme.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformtheme.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformtheme.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformtheme.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformtheme_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformtheme_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformtheme_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformtheme_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformtheme_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformthemefactory_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformthemefactory_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformthemefactory_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformthemefactory_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformthemefactory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformthemeplugin.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformthemeplugin.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformthemeplugin.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformthemeplugin.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformthemeplugin.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformvulkaninstance.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformvulkaninstance.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformvulkaninstance.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformvulkaninstance.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/vulkan/qplatformvulkaninstance.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformwindow.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformwindow.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformwindow.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformwindow.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformwindow.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformwindow_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformwindow_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qplatformwindow_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qplatformwindow_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qplatformwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qwindowsysteminterface.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qwindowsysteminterface.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qwindowsysteminterface.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qwindowsysteminterface.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qwindowsysteminterface.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qwindowsysteminterface_p.h 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qwindowsysteminterface_p.h
--- 5.15.15+dfsg-2/include/QtGui/5.15.17/QtGui/qpa/qwindowsysteminterface_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/5.15.17/QtGui/qpa/qwindowsysteminterface_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/gui/kernel/qwindowsysteminterface_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtGui/headers.pri 5.15.17+dfsg-1/include/QtGui/headers.pri
--- 5.15.15+dfsg-2/include/QtGui/headers.pri	2024-08-16 06:16:12.889250000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/headers.pri	2025-02-26 11:03:01.415828700 +0000
@@ -3,4 +3,4 @@ SYNCQT.GENERATED_HEADER_FILES = QAccessi
 SYNCQT.PRIVATE_HEADER_FILES = accessible/qaccessiblecache_p.h image/qbmphandler_p.h image/qicon_p.h image/qiconloader_p.h image/qimage_p.h image/qimagepixmapcleanuphooks_p.h image/qimagereaderwriterhelpers_p.h image/qpaintengine_pic_p.h image/qpicture_p.h image/qpixmap_blitter_p.h image/qpixmap_raster_p.h image/qpixmapcache_p.h image/qpnghandler_p.h image/qppmhandler_p.h image/qxbmhandler_p.h image/qxpmhandler_p.h itemmodels/qstandarditemmodel_p.h kernel/qcursor_p.h kernel/qdnd_p.h kernel/qevent_p.h kernel/qguiapplication_p.h kernel/qhighdpiscaling_p.h kernel/qinputdevicemanager_p.h kernel/qinputdevicemanager_p_p.h kernel/qinputmethod_p.h kernel/qinternalmimedata_p.h kernel/qkeymapper_p.h kernel/qkeysequence_p.h kernel/qopenglcontext_p.h kernel/qpaintdevicewindow_p.h kernel/qscreen_p.h kernel/qsessionmanager_p.h kernel/qshapedpixmapdndwindow_p.h kernel/qshortcutmap_p.h kernel/qsimpledrag_p.h kernel/qt_gui_pch.h kernel/qtguiglobal_p.h kernel/qtouchdevice_p.h kernel/qwindow_p.h opengl/qopengl2pexvertexarray_p.h opengl/qopengl_p.h opengl/qopenglcustomshaderstage_p.h opengl/qopenglengineshadermanager_p.h opengl/qopenglengineshadersource_p.h opengl/qopenglextensions_p.h opengl/qopenglframebufferobject_p.h opengl/qopenglgradientcache_p.h opengl/qopenglpaintdevice_p.h opengl/qopenglpaintengine_p.h opengl/qopenglprogrambinarycache_p.h opengl/qopenglqueryhelper_p.h opengl/qopenglshadercache_p.h opengl/qopengltexture_p.h opengl/qopengltexturecache_p.h opengl/qopengltextureglyphcache_p.h opengl/qopengltexturehelper_p.h opengl/qopengltextureuploader_p.h opengl/qopenglversionfunctionsfactory_p.h opengl/qopenglvertexarrayobject_p.h painting/qbezier_p.h painting/qblendfunctions_p.h painting/qblittable_p.h painting/qcolor_p.h painting/qcolormatrix_p.h painting/qcolorspace_p.h painting/qcolortransferfunction_p.h painting/qcolortransfertable_p.h painting/qcolortransform_p.h painting/qcolortrc_p.h painting/qcolortrclut_p.h painting/qcoregraphics_p.h painting/qcosmeticstroker_p.h painting/qcssutil_p.h painting/qdatabuffer_p.h painting/qdrawhelper_mips_dsp_p.h painting/qdrawhelper_neon_p.h painting/qdrawhelper_p.h painting/qdrawhelper_x86_p.h painting/qdrawingprimitive_sse2_p.h painting/qemulationpaintengine_p.h painting/qfixed_p.h painting/qgrayraster_p.h painting/qicc_p.h painting/qimagescale_p.h painting/qmath_p.h painting/qmemrotate_p.h painting/qoutlinemapper_p.h painting/qpagedpaintdevice_p.h painting/qpaintengine_blitter_p.h painting/qpaintengine_p.h painting/qpaintengine_raster_p.h painting/qpaintengineex_p.h painting/qpainter_p.h painting/qpainterpath_p.h painting/qpathclipper_p.h painting/qpathsimplifier_p.h painting/qpdf_p.h painting/qpen_p.h painting/qpolygonclipper_p.h painting/qrasterdefs_p.h painting/qrasterizer_p.h painting/qrbtree_p.h painting/qrgba64_p.h painting/qstroker_p.h painting/qt_mips_asm_dsp_p.h painting/qtextureglyphcache_p.h painting/qtriangulatingstroker_p.h painting/qtriangulator_p.h painting/qvectorpath_p.h rhi/cs_tdr_p.h rhi/qrhi_p.h rhi/qrhi_p_p.h rhi/qrhid3d11_p.h rhi/qrhid3d11_p_p.h rhi/qrhigles2_p.h rhi/qrhigles2_p_p.h rhi/qrhimetal_p.h rhi/qrhimetal_p_p.h rhi/qrhinull_p.h rhi/qrhinull_p_p.h rhi/qrhiprofiler_p.h rhi/qrhiprofiler_p_p.h rhi/qrhivulkan_p.h rhi/qrhivulkan_p_p.h rhi/qrhivulkanext_p.h rhi/qshader_p.h rhi/qshader_p_p.h rhi/qshaderdescription_p.h rhi/qshaderdescription_p_p.h text/qabstracttextdocumentlayout_p.h text/qcssparser_p.h text/qdistancefield_p.h text/qfont_p.h text/qfontengine_p.h text/qfontengine_qpf2_p.h text/qfontengineglyphcache_p.h text/qfontsubset_p.h text/qfragmentmap_p.h text/qglyphrun_p.h text/qharfbuzzng_p.h text/qinputcontrol_p.h text/qrawfont_p.h text/qstatictext_p.h text/qtextcursor_p.h text/qtextdocument_p.h text/qtextdocumentfragment_p.h text/qtextdocumentlayout_p.h text/qtextengine_p.h text/qtextformat_p.h text/qtexthtmlparser_p.h text/qtextimagehandler_p.h text/qtextmarkdownimporter_p.h text/qtextmarkdownwriter_p.h text/qtextobject_p.h text/qtextodfwriter_p.h text/qtexttable_p.h text/qzipreader_p.h text/qzipwriter_p.h util/qabstractlayoutstyleinfo_p.h util/qastchandler_p.h util/qgridlayoutengine_p.h util/qhexstring_p.h util/qktxhandler_p.h util/qlayoutpolicy_p.h util/qpkmhandler_p.h util/qshaderformat_p.h util/qshadergenerator_p.h util/qshadergraph_p.h util/qshadergraphloader_p.h util/qshaderlanguage_p.h util/qshadernode_p.h util/qshadernodeport_p.h util/qshadernodesloader_p.h util/qtexturefiledata_p.h util/qtexturefilehandler_p.h util/qtexturefilereader_p.h vulkan/qvulkanwindow_p.h platform/wasm/qwasmlocalfileaccess_p.h 
 SYNCQT.QPA_HEADER_FILES = accessible/qplatformaccessibility.h image/qplatformpixmap.h kernel/qplatformclipboard.h kernel/qplatformcursor.h kernel/qplatformdialoghelper.h kernel/qplatformdrag.h kernel/qplatformgraphicsbuffer.h kernel/qplatformgraphicsbufferhelper.h kernel/qplatforminputcontext.h kernel/qplatforminputcontext_p.h kernel/qplatforminputcontextfactory_p.h kernel/qplatforminputcontextplugin_p.h kernel/qplatformintegration.h kernel/qplatformintegrationfactory_p.h kernel/qplatformintegrationplugin.h kernel/qplatformmenu.h kernel/qplatformnativeinterface.h kernel/qplatformoffscreensurface.h kernel/qplatformopenglcontext.h kernel/qplatformscreen.h kernel/qplatformscreen_p.h kernel/qplatformservices.h kernel/qplatformsessionmanager.h kernel/qplatformsharedgraphicscache.h kernel/qplatformsurface.h kernel/qplatformsystemtrayicon.h kernel/qplatformtheme.h kernel/qplatformtheme_p.h kernel/qplatformthemefactory_p.h kernel/qplatformthemeplugin.h kernel/qplatformwindow.h kernel/qplatformwindow_p.h kernel/qwindowsysteminterface.h kernel/qwindowsysteminterface_p.h painting/qplatformbackingstore.h text/qplatformfontdatabase.h vulkan/qplatformvulkaninstance.h 
 SYNCQT.CLEAN_HEADER_FILES = accessible/qaccessible.h accessible/qaccessiblebridge.h accessible/qaccessibleobject.h accessible/qaccessibleplugin.h image/qbitmap.h image/qicon.h image/qiconengine.h image/qiconengineplugin.h image/qimage.h image/qimageiohandler.h image/qimagereader.h image/qimagewriter.h image/qmovie.h:movie image/qpicture.h image/qpictureformatplugin.h image/qpixmap.h image/qpixmapcache.h itemmodels/qstandarditemmodel.h:standarditemmodel kernel/qclipboard.h kernel/qcursor.h kernel/qdrag.h:draganddrop kernel/qevent.h kernel/qgenericplugin.h kernel/qgenericpluginfactory.h kernel/qguiapplication.h kernel/qinputmethod.h kernel/qkeysequence.h kernel/qoffscreensurface.h kernel/qopenglcontext.h kernel/qopenglwindow.h kernel/qpaintdevicewindow.h kernel/qpalette.h kernel/qpixelformat.h kernel/qrasterwindow.h kernel/qscreen.h kernel/qsessionmanager.h kernel/qstylehints.h kernel/qsurface.h kernel/qsurfaceformat.h kernel/qtestsupport_gui.h kernel/qtguiglobal.h kernel/qtouchdevice.h kernel/qwindow.h kernel/qwindowdefs.h kernel/qwindowdefs_win.h math3d/qgenericmatrix.h math3d/qmatrix4x4.h math3d/qquaternion.h math3d/qvector2d.h math3d/qvector3d.h math3d/qvector4d.h opengl/qopengl.h opengl/qopenglbuffer.h opengl/qopengldebug.h opengl/qopenglextrafunctions.h opengl/qopenglframebufferobject.h opengl/qopenglfunctions.h opengl/qopenglfunctions_1_0.h opengl/qopenglfunctions_1_1.h opengl/qopenglfunctions_1_2.h opengl/qopenglfunctions_1_3.h opengl/qopenglfunctions_1_4.h opengl/qopenglfunctions_1_5.h opengl/qopenglfunctions_2_0.h opengl/qopenglfunctions_2_1.h opengl/qopenglfunctions_3_0.h opengl/qopenglfunctions_3_1.h opengl/qopenglfunctions_3_2_compatibility.h opengl/qopenglfunctions_3_2_core.h opengl/qopenglfunctions_3_3_compatibility.h opengl/qopenglfunctions_3_3_core.h opengl/qopenglfunctions_4_0_compatibility.h opengl/qopenglfunctions_4_0_core.h opengl/qopenglfunctions_4_1_compatibility.h opengl/qopenglfunctions_4_1_core.h opengl/qopenglfunctions_4_2_compatibility.h opengl/qopenglfunctions_4_2_core.h opengl/qopenglfunctions_4_3_compatibility.h opengl/qopenglfunctions_4_3_core.h opengl/qopenglfunctions_4_4_compatibility.h opengl/qopenglfunctions_4_4_core.h opengl/qopenglfunctions_4_5_compatibility.h opengl/qopenglfunctions_4_5_core.h opengl/qopenglfunctions_es2.h opengl/qopenglpaintdevice.h opengl/qopenglpixeltransferoptions.h opengl/qopenglshaderprogram.h opengl/qopengltexture.h opengl/qopengltextureblitter.h opengl/qopengltimerquery.h opengl/qopenglversionfunctions.h opengl/qopenglvertexarrayobject.h painting/qbackingstore.h painting/qbrush.h painting/qcolor.h painting/qcolorspace.h painting/qcolortransform.h painting/qmatrix.h painting/qpagedpaintdevice.h painting/qpagelayout.h painting/qpagesize.h painting/qpaintdevice.h painting/qpaintengine.h painting/qpainter.h painting/qpainterpath.h painting/qpdfwriter.h painting/qpen.h painting/qpolygon.h painting/qregion.h painting/qrgb.h painting/qrgba64.h painting/qtransform.h text/qabstracttextdocumentlayout.h text/qfont.h text/qfontdatabase.h text/qfontinfo.h text/qfontmetrics.h text/qglyphrun.h text/qrawfont.h text/qstatictext.h text/qsyntaxhighlighter.h text/qtextcursor.h text/qtextdocument.h text/qtextdocumentfragment.h text/qtextdocumentwriter.h text/qtextformat.h text/qtextlayout.h text/qtextlist.h text/qtextobject.h text/qtextoption.h text/qtexttable.h util/qdesktopservices.h util/qvalidator.h vulkan/qvulkaninstance.h vulkan/qvulkanwindow.h 
-SYNCQT.INJECTIONS = src/gui/vulkan/qvulkanfunctions.h:^qvulkanfunctions.h:QVulkanFunctions:QVulkanDeviceFunctions src/gui/vulkan/qvulkanfunctions_p.h:^5.15.15/QtGui/private/qvulkanfunctions_p.h 
+SYNCQT.INJECTIONS = src/gui/vulkan/qvulkanfunctions.h:^qvulkanfunctions.h:QVulkanFunctions:QVulkanDeviceFunctions src/gui/vulkan/qvulkanfunctions_p.h:^5.15.17/QtGui/private/qvulkanfunctions_p.h 
diff -pruN 5.15.15+dfsg-2/include/QtGui/qtguiversion.h 5.15.17+dfsg-1/include/QtGui/qtguiversion.h
--- 5.15.15+dfsg-2/include/QtGui/qtguiversion.h	2024-08-16 06:16:12.889250000 +0000
+++ 5.15.17+dfsg-1/include/QtGui/qtguiversion.h	2025-02-26 11:03:01.415828700 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTGUI_VERSION_H
 #define QT_QTGUI_VERSION_H
 
-#define QTGUI_VERSION_STR "5.15.15"
+#define QTGUI_VERSION_STR "5.15.17"
 
-#define QTGUI_VERSION 0x050F0F
+#define QTGUI_VERSION 0x050F11
 
 #endif // QT_QTGUI_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/devicehandlerlist_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/devicehandlerlist_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/devicehandlerlist_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/devicehandlerlist_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/shared/devicehandlerlist_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevkeyboard_defaultmap_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevkeyboard_defaultmap_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevkeyboard_defaultmap_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevkeyboard_defaultmap_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/evdevkeyboard/qevdevkeyboard_defaultmap_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevkeyboardhandler_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevkeyboardhandler_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevkeyboardhandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevkeyboardhandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevkeyboardmanager_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevkeyboardmanager_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevkeyboardmanager_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevkeyboardmanager_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/evdevkeyboard/qevdevkeyboardmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevmousehandler_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevmousehandler_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevmousehandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevmousehandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/evdevmouse/qevdevmousehandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevmousemanager_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevmousemanager_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevmousemanager_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevmousemanager_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/evdevmouse/qevdevmousemanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtablethandler_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtablethandler_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtablethandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtablethandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/evdevtablet/qevdevtablethandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtabletmanager_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtabletmanager_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtabletmanager_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtabletmanager_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/evdevtablet/qevdevtabletmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtouchfilter_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtouchfilter_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtouchfilter_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtouchfilter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/evdevtouch/qevdevtouchfilter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtouchhandler_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtouchhandler_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtouchhandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtouchhandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/evdevtouch/qevdevtouchhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtouchmanager_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtouchmanager_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtouchmanager_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevtouchmanager_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/evdevtouch/qevdevtouchmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevutil_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevutil_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevutil_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qevdevutil_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/shared/qevdevutil_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputhandler_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputhandler_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputhandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputhandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/libinput/qlibinputhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputkeyboard_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputkeyboard_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputkeyboard_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputkeyboard_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/libinput/qlibinputkeyboard_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputpointer_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputpointer_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputpointer_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputpointer_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/libinput/qlibinputpointer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputtouch_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputtouch_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputtouch_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qlibinputtouch_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/libinput/qlibinputtouch_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qtouchoutputmapping_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qtouchoutputmapping_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qtouchoutputmapping_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qtouchoutputmapping_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/shared/qtouchoutputmapping_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qtslib_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qtslib_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qtslib_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qtslib_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/tslib/qtslib_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qxkbcommon_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qxkbcommon_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.15/QtInputSupport/private/qxkbcommon_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.15/QtInputSupport/private/qxkbcommon_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/xkbcommon/qxkbcommon_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/devicehandlerlist_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/devicehandlerlist_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/devicehandlerlist_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/devicehandlerlist_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/shared/devicehandlerlist_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevkeyboard_defaultmap_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevkeyboard_defaultmap_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevkeyboard_defaultmap_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevkeyboard_defaultmap_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/evdevkeyboard/qevdevkeyboard_defaultmap_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevkeyboardhandler_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevkeyboardhandler_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevkeyboardhandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevkeyboardhandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevkeyboardmanager_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevkeyboardmanager_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevkeyboardmanager_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevkeyboardmanager_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/evdevkeyboard/qevdevkeyboardmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevmousehandler_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevmousehandler_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevmousehandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevmousehandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/evdevmouse/qevdevmousehandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevmousemanager_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevmousemanager_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevmousemanager_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevmousemanager_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/evdevmouse/qevdevmousemanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtablethandler_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtablethandler_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtablethandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtablethandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/evdevtablet/qevdevtablethandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtabletmanager_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtabletmanager_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtabletmanager_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtabletmanager_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/evdevtablet/qevdevtabletmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtouchfilter_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtouchfilter_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtouchfilter_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtouchfilter_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/evdevtouch/qevdevtouchfilter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtouchhandler_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtouchhandler_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtouchhandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtouchhandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/evdevtouch/qevdevtouchhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtouchmanager_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtouchmanager_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtouchmanager_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevtouchmanager_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/evdevtouch/qevdevtouchmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevutil_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevutil_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevutil_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qevdevutil_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/shared/qevdevutil_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputhandler_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputhandler_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputhandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputhandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/libinput/qlibinputhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputkeyboard_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputkeyboard_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputkeyboard_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputkeyboard_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/libinput/qlibinputkeyboard_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputpointer_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputpointer_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputpointer_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputpointer_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/libinput/qlibinputpointer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputtouch_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputtouch_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputtouch_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qlibinputtouch_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/libinput/qlibinputtouch_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qtouchoutputmapping_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qtouchoutputmapping_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qtouchoutputmapping_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qtouchoutputmapping_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/shared/qtouchoutputmapping_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qtslib_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qtslib_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qtslib_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qtslib_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/tslib/qtslib_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qxkbcommon_p.h 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qxkbcommon_p.h
--- 5.15.15+dfsg-2/include/QtInputSupport/5.15.17/QtInputSupport/private/qxkbcommon_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/5.15.17/QtInputSupport/private/qxkbcommon_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/xkbcommon/qxkbcommon_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtInputSupport/qtinputsupportversion.h 5.15.17+dfsg-1/include/QtInputSupport/qtinputsupportversion.h
--- 5.15.15+dfsg-2/include/QtInputSupport/qtinputsupportversion.h	2024-08-16 06:16:12.977250600 +0000
+++ 5.15.17+dfsg-1/include/QtInputSupport/qtinputsupportversion.h	2025-02-26 11:03:01.779832100 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTINPUTSUPPORT_VERSION_H
 #define QT_QTINPUTSUPPORT_VERSION_H
 
-#define QTINPUTSUPPORT_VERSION_STR "5.15.15"
+#define QTINPUTSUPPORT_VERSION_STR "5.15.17"
 
-#define QTINPUTSUPPORT_VERSION 0x050F0F
+#define QTINPUTSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTINPUTSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtKmsSupport/5.15.15/QtKmsSupport/private/qkmsdevice_p.h 5.15.17+dfsg-1/include/QtKmsSupport/5.15.15/QtKmsSupport/private/qkmsdevice_p.h
--- 5.15.15+dfsg-2/include/QtKmsSupport/5.15.15/QtKmsSupport/private/qkmsdevice_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtKmsSupport/5.15.15/QtKmsSupport/private/qkmsdevice_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/kmsconvenience/qkmsdevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtKmsSupport/5.15.17/QtKmsSupport/private/qkmsdevice_p.h 5.15.17+dfsg-1/include/QtKmsSupport/5.15.17/QtKmsSupport/private/qkmsdevice_p.h
--- 5.15.15+dfsg-2/include/QtKmsSupport/5.15.17/QtKmsSupport/private/qkmsdevice_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtKmsSupport/5.15.17/QtKmsSupport/private/qkmsdevice_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/kmsconvenience/qkmsdevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtKmsSupport/qtkmssupportversion.h 5.15.17+dfsg-1/include/QtKmsSupport/qtkmssupportversion.h
--- 5.15.15+dfsg-2/include/QtKmsSupport/qtkmssupportversion.h	2024-08-16 06:16:11.529242800 +0000
+++ 5.15.17+dfsg-1/include/QtKmsSupport/qtkmssupportversion.h	2025-02-26 11:02:59.263809400 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTKMSSUPPORT_VERSION_H
 #define QT_QTKMSSUPPORT_VERSION_H
 
-#define QTKMSSUPPORT_VERSION_STR "5.15.15"
+#define QTKMSSUPPORT_VERSION_STR "5.15.17"
 
-#define QTKMSSUPPORT_VERSION 0x050F0F
+#define QTKMSSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTKMSSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/application_p.h 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/application_p.h
--- 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/application_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/application_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/linuxaccessibility/application_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/atspiadaptor_p.h 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/atspiadaptor_p.h
--- 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/atspiadaptor_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/atspiadaptor_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/linuxaccessibility/atspiadaptor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/bridge_p.h 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/bridge_p.h
--- 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/bridge_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/bridge_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/linuxaccessibility/bridge_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/cache_p.h 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/cache_p.h
--- 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/cache_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/cache_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/linuxaccessibility/cache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/constant_mappings_p.h 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/constant_mappings_p.h
--- 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/constant_mappings_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/constant_mappings_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/linuxaccessibility/constant_mappings_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/dbusconnection_p.h 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/dbusconnection_p.h
--- 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/dbusconnection_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/dbusconnection_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/linuxaccessibility/dbusconnection_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/struct_marshallers_p.h 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/struct_marshallers_p.h
--- 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/struct_marshallers_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.15/QtLinuxAccessibilitySupport/private/struct_marshallers_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/linuxaccessibility/struct_marshallers_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/application_p.h 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/application_p.h
--- 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/application_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/application_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/linuxaccessibility/application_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/atspiadaptor_p.h 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/atspiadaptor_p.h
--- 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/atspiadaptor_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/atspiadaptor_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/linuxaccessibility/atspiadaptor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/bridge_p.h 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/bridge_p.h
--- 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/bridge_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/bridge_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/linuxaccessibility/bridge_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/cache_p.h 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/cache_p.h
--- 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/cache_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/cache_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/linuxaccessibility/cache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/constant_mappings_p.h 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/constant_mappings_p.h
--- 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/constant_mappings_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/constant_mappings_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/linuxaccessibility/constant_mappings_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/dbusconnection_p.h 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/dbusconnection_p.h
--- 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/dbusconnection_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/dbusconnection_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/linuxaccessibility/dbusconnection_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/struct_marshallers_p.h 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/struct_marshallers_p.h
--- 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/struct_marshallers_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/5.15.17/QtLinuxAccessibilitySupport/private/struct_marshallers_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/linuxaccessibility/struct_marshallers_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/qtlinuxaccessibilitysupportversion.h 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/qtlinuxaccessibilitysupportversion.h
--- 5.15.15+dfsg-2/include/QtLinuxAccessibilitySupport/qtlinuxaccessibilitysupportversion.h	2024-08-16 06:16:11.533242700 +0000
+++ 5.15.17+dfsg-1/include/QtLinuxAccessibilitySupport/qtlinuxaccessibilitysupportversion.h	2025-02-26 11:02:59.347810000 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTLINUXACCESSIBILITYSUPPORT_VERSION_H
 #define QT_QTLINUXACCESSIBILITYSUPPORT_VERSION_H
 
-#define QTLINUXACCESSIBILITYSUPPORT_VERSION_STR "5.15.15"
+#define QTLINUXACCESSIBILITYSUPPORT_VERSION_STR "5.15.17"
 
-#define QTLINUXACCESSIBILITYSUPPORT_VERSION 0x050F0F
+#define QTLINUXACCESSIBILITYSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTLINUXACCESSIBILITYSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtMockPlugins1/qtmockplugins1version.h 5.15.17+dfsg-1/include/QtMockPlugins1/qtmockplugins1version.h
--- 5.15.15+dfsg-2/include/QtMockPlugins1/qtmockplugins1version.h	2024-08-16 06:16:11.593243100 +0000
+++ 5.15.17+dfsg-1/include/QtMockPlugins1/qtmockplugins1version.h	2025-02-26 11:03:01.695831300 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTMOCKPLUGINS1_VERSION_H
 #define QT_QTMOCKPLUGINS1_VERSION_H
 
-#define QTMOCKPLUGINS1_VERSION_STR "5.15.15"
+#define QTMOCKPLUGINS1_VERSION_STR "5.15.17"
 
-#define QTMOCKPLUGINS1_VERSION 0x050F0F
+#define QTMOCKPLUGINS1_VERSION 0x050F11
 
 #endif // QT_QTMOCKPLUGINS1_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtMockPlugins2/qtmockplugins2version.h 5.15.17+dfsg-1/include/QtMockPlugins2/qtmockplugins2version.h
--- 5.15.15+dfsg-2/include/QtMockPlugins2/qtmockplugins2version.h	2024-08-16 06:16:13.377252800 +0000
+++ 5.15.17+dfsg-1/include/QtMockPlugins2/qtmockplugins2version.h	2025-02-26 11:03:00.079816800 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTMOCKPLUGINS2_VERSION_H
 #define QT_QTMOCKPLUGINS2_VERSION_H
 
-#define QTMOCKPLUGINS2_VERSION_STR "5.15.15"
+#define QTMOCKPLUGINS2_VERSION_STR "5.15.17"
 
-#define QTMOCKPLUGINS2_VERSION 0x050F0F
+#define QTMOCKPLUGINS2_VERSION 0x050F11
 
 #endif // QT_QTMOCKPLUGINS2_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtMockPlugins3/qtmockplugins3version.h 5.15.17+dfsg-1/include/QtMockPlugins3/qtmockplugins3version.h
--- 5.15.15+dfsg-2/include/QtMockPlugins3/qtmockplugins3version.h	2024-08-16 06:16:13.045251000 +0000
+++ 5.15.17+dfsg-1/include/QtMockPlugins3/qtmockplugins3version.h	2025-02-26 11:02:59.263809400 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTMOCKPLUGINS3_VERSION_H
 #define QT_QTMOCKPLUGINS3_VERSION_H
 
-#define QTMOCKPLUGINS3_VERSION_STR "5.15.15"
+#define QTMOCKPLUGINS3_VERSION_STR "5.15.17"
 
-#define QTMOCKPLUGINS3_VERSION 0x050F0F
+#define QTMOCKPLUGINS3_VERSION 0x050F11
 
 #endif // QT_QTMOCKPLUGINS3_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/bitstreams_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/bitstreams_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/bitstreams_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/bitstreams_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/http2/bitstreams_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/hpack_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/hpack_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/hpack_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/hpack_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/http2/hpack_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/hpacktable_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/hpacktable_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/hpacktable_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/hpacktable_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/http2/hpacktable_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/http2frames_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/http2frames_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/http2frames_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/http2frames_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/http2/http2frames_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/http2protocol_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/http2protocol_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/http2protocol_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/http2protocol_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/http2/http2protocol_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/http2streams_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/http2streams_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/http2streams_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/http2streams_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/http2/http2streams_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/huffman_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/huffman_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/huffman_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/huffman_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/http2/huffman_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qabstractnetworkcache_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qabstractnetworkcache_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qabstractnetworkcache_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qabstractnetworkcache_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qabstractnetworkcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qabstractprotocolhandler_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qabstractprotocolhandler_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qabstractprotocolhandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qabstractprotocolhandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qabstractprotocolhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qabstractsocket_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qabstractsocket_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qabstractsocket_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qabstractsocket_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/socket/qabstractsocket_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qabstractsocketengine_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qabstractsocketengine_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qabstractsocketengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qabstractsocketengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/socket/qabstractsocketengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qasn1element_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qasn1element_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qasn1element_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qasn1element_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qasn1element_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qauthenticator_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qauthenticator_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qauthenticator_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qauthenticator_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/kernel/qauthenticator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qbearerengine_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qbearerengine_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qbearerengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qbearerengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/bearer/qbearerengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qbearerplugin_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qbearerplugin_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qbearerplugin_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qbearerplugin_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/bearer/qbearerplugin_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qdnslookup_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qdnslookup_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qdnslookup_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qdnslookup_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/kernel/qdnslookup_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qdtls_openssl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qdtls_openssl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qdtls_openssl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qdtls_openssl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qdtls_openssl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qdtls_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qdtls_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qdtls_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qdtls_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qdtls_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qftp_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qftp_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qftp_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qftp_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qftp_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhostaddress_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhostaddress_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhostaddress_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhostaddress_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/kernel/qhostaddress_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhostinfo_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhostinfo_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhostinfo_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhostinfo_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/kernel/qhostinfo_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhsts_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhsts_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhsts_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhsts_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qhsts_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhstsstore_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhstsstore_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhstsstore_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhstsstore_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qhstsstore_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttp2protocolhandler_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttp2protocolhandler_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttp2protocolhandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttp2protocolhandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qhttp2protocolhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpmultipart_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpmultipart_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpmultipart_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpmultipart_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qhttpmultipart_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkconnection_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkconnection_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkconnection_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkconnection_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qhttpnetworkconnection_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkconnectionchannel_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkconnectionchannel_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkconnectionchannel_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkconnectionchannel_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qhttpnetworkconnectionchannel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkheader_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkheader_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkheader_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkheader_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qhttpnetworkheader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkreply_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkreply_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkreply_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkreply_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qhttpnetworkreply_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkrequest_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkrequest_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkrequest_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpnetworkrequest_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qhttpnetworkrequest_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpprotocolhandler_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpprotocolhandler_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpprotocolhandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpprotocolhandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qhttpprotocolhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpsocketengine_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpsocketengine_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpsocketengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpsocketengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/socket/qhttpsocketengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpthreaddelegate_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpthreaddelegate_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qhttpthreaddelegate_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qhttpthreaddelegate_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qhttpthreaddelegate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qlocalserver_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qlocalserver_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qlocalserver_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qlocalserver_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/socket/qlocalserver_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qlocalsocket_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qlocalsocket_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qlocalsocket_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qlocalsocket_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/socket/qlocalsocket_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnativesocketengine_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnativesocketengine_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnativesocketengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnativesocketengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/socket/qnativesocketengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnativesocketengine_winrt_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnativesocketengine_winrt_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnativesocketengine_winrt_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnativesocketengine_winrt_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/socket/qnativesocketengine_winrt_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnet_unix_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnet_unix_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnet_unix_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnet_unix_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/socket/qnet_unix_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetconmonitor_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetconmonitor_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetconmonitor_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetconmonitor_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/kernel/qnetconmonitor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessauthenticationmanager_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessauthenticationmanager_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessauthenticationmanager_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessauthenticationmanager_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkaccessauthenticationmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessbackend_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessbackend_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessbackend_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessbackend_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkaccessbackend_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccesscache_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccesscache_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccesscache_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccesscache_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkaccesscache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccesscachebackend_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccesscachebackend_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccesscachebackend_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccesscachebackend_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkaccesscachebackend_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessdebugpipebackend_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessdebugpipebackend_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessdebugpipebackend_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessdebugpipebackend_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkaccessdebugpipebackend_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessfilebackend_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessfilebackend_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessfilebackend_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessfilebackend_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkaccessfilebackend_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessftpbackend_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessftpbackend_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessftpbackend_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessftpbackend_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkaccessftpbackend_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessmanager_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessmanager_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessmanager_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkaccessmanager_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkaccessmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkconfigmanager_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkconfigmanager_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkconfigmanager_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkconfigmanager_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/bearer/qnetworkconfigmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkconfiguration_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkconfiguration_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkconfiguration_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkconfiguration_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/bearer/qnetworkconfiguration_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkcookie_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkcookie_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkcookie_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkcookie_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkcookie_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkcookiejar_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkcookiejar_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkcookiejar_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkcookiejar_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkcookiejar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkdatagram_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkdatagram_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkdatagram_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkdatagram_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/kernel/qnetworkdatagram_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkdiskcache_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkdiskcache_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkdiskcache_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkdiskcache_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkdiskcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkfile_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkfile_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkfile_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkfile_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkfile_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkinterface_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkinterface_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkinterface_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkinterface_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/kernel/qnetworkinterface_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkinterface_uikit_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkinterface_uikit_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkinterface_uikit_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkinterface_uikit_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/kernel/qnetworkinterface_uikit_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkinterface_unix_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkinterface_unix_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkinterface_unix_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkinterface_unix_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/kernel/qnetworkinterface_unix_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreply_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreply_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreply_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreply_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkreply_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplydataimpl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplydataimpl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplydataimpl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplydataimpl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkreplydataimpl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplyfileimpl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplyfileimpl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplyfileimpl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplyfileimpl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkreplyfileimpl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplyhttpimpl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplyhttpimpl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplyhttpimpl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplyhttpimpl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkreplyhttpimpl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplyimpl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplyimpl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplyimpl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplyimpl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkreplyimpl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplywasmimpl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplywasmimpl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplywasmimpl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkreplywasmimpl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkreplywasmimpl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkrequest_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkrequest_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkrequest_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworkrequest_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qnetworkrequest_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworksession_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworksession_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qnetworksession_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qnetworksession_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/bearer/qnetworksession_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qocsp_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qocsp_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qocsp_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qocsp_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qocsp_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qocspresponse_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qocspresponse_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qocspresponse_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qocspresponse_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qocspresponse_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsctpserver_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsctpserver_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsctpserver_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsctpserver_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/socket/qsctpserver_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsctpsocket_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsctpsocket_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsctpsocket_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsctpsocket_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/socket/qsctpsocket_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsharednetworksession_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsharednetworksession_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsharednetworksession_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsharednetworksession_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/bearer/qsharednetworksession_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsocks5socketengine_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsocks5socketengine_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsocks5socketengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsocks5socketengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/socket/qsocks5socketengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qspdyprotocolhandler_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qspdyprotocolhandler_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qspdyprotocolhandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qspdyprotocolhandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/access/qspdyprotocolhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qssl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qssl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qssl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qssl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qssl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslcertificate_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslcertificate_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslcertificate_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslcertificate_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qsslcertificate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslcertificateextension_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslcertificateextension_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslcertificateextension_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslcertificateextension_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qsslcertificateextension_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslcipher_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslcipher_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslcipher_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslcipher_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qsslcipher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslconfiguration_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslconfiguration_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslconfiguration_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslconfiguration_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qsslconfiguration_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslcontext_openssl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslcontext_openssl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslcontext_openssl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslcontext_openssl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qsslcontext_openssl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qssldiffiehellmanparameters_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qssldiffiehellmanparameters_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qssldiffiehellmanparameters_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qssldiffiehellmanparameters_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qssldiffiehellmanparameters_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslkey_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslkey_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslkey_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslkey_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qsslkey_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslpresharedkeyauthenticator_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslpresharedkeyauthenticator_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslpresharedkeyauthenticator_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslpresharedkeyauthenticator_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qsslpresharedkeyauthenticator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_mac_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_mac_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_mac_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_mac_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qsslsocket_mac_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_openssl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_openssl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_openssl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_openssl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qsslsocket_openssl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_openssl_symbols_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_openssl_symbols_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_openssl_symbols_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_openssl_symbols_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qsslsocket_openssl_symbols_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qsslsocket_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_schannel_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_schannel_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_schannel_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_schannel_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qsslsocket_schannel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_winrt_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_winrt_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_winrt_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qsslsocket_winrt_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qsslsocket_winrt_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qtcpserver_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qtcpserver_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qtcpserver_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qtcpserver_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/socket/qtcpserver_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qtcpsocket_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qtcpsocket_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qtcpsocket_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qtcpsocket_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/socket/qtcpsocket_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qtnetworkglobal_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qtnetworkglobal_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qtnetworkglobal_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qtnetworkglobal_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/kernel/qtnetworkglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qurlinfo_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qurlinfo_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qurlinfo_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qurlinfo_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/kernel/qurlinfo_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qwindowscarootfetcher_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qwindowscarootfetcher_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.15/QtNetwork/private/qwindowscarootfetcher_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.15/QtNetwork/private/qwindowscarootfetcher_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/network/ssl/qwindowscarootfetcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/bitstreams_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/bitstreams_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/bitstreams_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/bitstreams_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/http2/bitstreams_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/hpack_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/hpack_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/hpack_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/hpack_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/http2/hpack_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/hpacktable_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/hpacktable_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/hpacktable_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/hpacktable_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/http2/hpacktable_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/http2frames_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/http2frames_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/http2frames_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/http2frames_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/http2/http2frames_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/http2protocol_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/http2protocol_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/http2protocol_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/http2protocol_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/http2/http2protocol_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/http2streams_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/http2streams_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/http2streams_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/http2streams_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/http2/http2streams_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/huffman_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/huffman_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/huffman_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/huffman_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/http2/huffman_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qabstractnetworkcache_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qabstractnetworkcache_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qabstractnetworkcache_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qabstractnetworkcache_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qabstractnetworkcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qabstractprotocolhandler_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qabstractprotocolhandler_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qabstractprotocolhandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qabstractprotocolhandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qabstractprotocolhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qabstractsocket_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qabstractsocket_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qabstractsocket_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qabstractsocket_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/socket/qabstractsocket_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qabstractsocketengine_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qabstractsocketengine_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qabstractsocketengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qabstractsocketengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/socket/qabstractsocketengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qasn1element_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qasn1element_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qasn1element_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qasn1element_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qasn1element_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qauthenticator_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qauthenticator_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qauthenticator_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qauthenticator_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/kernel/qauthenticator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qbearerengine_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qbearerengine_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qbearerengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qbearerengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/bearer/qbearerengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qbearerplugin_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qbearerplugin_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qbearerplugin_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qbearerplugin_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/bearer/qbearerplugin_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qdnslookup_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qdnslookup_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qdnslookup_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qdnslookup_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/kernel/qdnslookup_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qdtls_openssl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qdtls_openssl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qdtls_openssl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qdtls_openssl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qdtls_openssl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qdtls_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qdtls_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qdtls_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qdtls_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qdtls_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qftp_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qftp_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qftp_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qftp_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qftp_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhostaddress_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhostaddress_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhostaddress_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhostaddress_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/kernel/qhostaddress_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhostinfo_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhostinfo_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhostinfo_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhostinfo_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/kernel/qhostinfo_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhsts_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhsts_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhsts_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhsts_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qhsts_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhstsstore_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhstsstore_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhstsstore_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhstsstore_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qhstsstore_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttp2protocolhandler_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttp2protocolhandler_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttp2protocolhandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttp2protocolhandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qhttp2protocolhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpmultipart_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpmultipart_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpmultipart_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpmultipart_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qhttpmultipart_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkconnection_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkconnection_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkconnection_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkconnection_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qhttpnetworkconnection_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkconnectionchannel_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkconnectionchannel_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkconnectionchannel_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkconnectionchannel_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qhttpnetworkconnectionchannel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkheader_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkheader_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkheader_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkheader_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qhttpnetworkheader_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkreply_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkreply_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkreply_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkreply_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qhttpnetworkreply_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkrequest_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkrequest_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkrequest_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpnetworkrequest_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qhttpnetworkrequest_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpprotocolhandler_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpprotocolhandler_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpprotocolhandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpprotocolhandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qhttpprotocolhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpsocketengine_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpsocketengine_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpsocketengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpsocketengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/socket/qhttpsocketengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpthreaddelegate_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpthreaddelegate_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qhttpthreaddelegate_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qhttpthreaddelegate_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qhttpthreaddelegate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qlocalserver_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qlocalserver_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qlocalserver_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qlocalserver_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/socket/qlocalserver_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qlocalsocket_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qlocalsocket_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qlocalsocket_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qlocalsocket_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/socket/qlocalsocket_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnativesocketengine_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnativesocketengine_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnativesocketengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnativesocketengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/socket/qnativesocketengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnativesocketengine_winrt_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnativesocketengine_winrt_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnativesocketengine_winrt_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnativesocketengine_winrt_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/socket/qnativesocketengine_winrt_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnet_unix_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnet_unix_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnet_unix_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnet_unix_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/socket/qnet_unix_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetconmonitor_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetconmonitor_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetconmonitor_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetconmonitor_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/kernel/qnetconmonitor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessauthenticationmanager_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessauthenticationmanager_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessauthenticationmanager_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessauthenticationmanager_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkaccessauthenticationmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessbackend_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessbackend_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessbackend_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessbackend_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkaccessbackend_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccesscache_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccesscache_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccesscache_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccesscache_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkaccesscache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccesscachebackend_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccesscachebackend_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccesscachebackend_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccesscachebackend_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkaccesscachebackend_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessdebugpipebackend_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessdebugpipebackend_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessdebugpipebackend_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessdebugpipebackend_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkaccessdebugpipebackend_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessfilebackend_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessfilebackend_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessfilebackend_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessfilebackend_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkaccessfilebackend_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessftpbackend_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessftpbackend_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessftpbackend_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessftpbackend_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkaccessftpbackend_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessmanager_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessmanager_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessmanager_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkaccessmanager_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkaccessmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkconfigmanager_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkconfigmanager_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkconfigmanager_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkconfigmanager_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/bearer/qnetworkconfigmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkconfiguration_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkconfiguration_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkconfiguration_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkconfiguration_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/bearer/qnetworkconfiguration_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkcookie_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkcookie_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkcookie_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkcookie_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkcookie_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkcookiejar_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkcookiejar_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkcookiejar_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkcookiejar_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkcookiejar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkdatagram_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkdatagram_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkdatagram_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkdatagram_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/kernel/qnetworkdatagram_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkdiskcache_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkdiskcache_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkdiskcache_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkdiskcache_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkdiskcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkfile_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkfile_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkfile_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkfile_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkfile_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkinterface_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkinterface_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkinterface_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkinterface_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/kernel/qnetworkinterface_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkinterface_uikit_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkinterface_uikit_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkinterface_uikit_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkinterface_uikit_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/kernel/qnetworkinterface_uikit_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkinterface_unix_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkinterface_unix_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkinterface_unix_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkinterface_unix_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/kernel/qnetworkinterface_unix_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreply_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreply_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreply_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreply_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkreply_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplydataimpl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplydataimpl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplydataimpl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplydataimpl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkreplydataimpl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplyfileimpl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplyfileimpl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplyfileimpl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplyfileimpl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkreplyfileimpl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplyhttpimpl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplyhttpimpl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplyhttpimpl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplyhttpimpl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkreplyhttpimpl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplyimpl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplyimpl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplyimpl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplyimpl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkreplyimpl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplywasmimpl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplywasmimpl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplywasmimpl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkreplywasmimpl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkreplywasmimpl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkrequest_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkrequest_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkrequest_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworkrequest_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qnetworkrequest_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworksession_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworksession_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qnetworksession_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qnetworksession_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/bearer/qnetworksession_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qocsp_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qocsp_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qocsp_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qocsp_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qocsp_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qocspresponse_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qocspresponse_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qocspresponse_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qocspresponse_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qocspresponse_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsctpserver_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsctpserver_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsctpserver_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsctpserver_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/socket/qsctpserver_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsctpsocket_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsctpsocket_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsctpsocket_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsctpsocket_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/socket/qsctpsocket_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsharednetworksession_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsharednetworksession_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsharednetworksession_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsharednetworksession_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/bearer/qsharednetworksession_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsocks5socketengine_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsocks5socketengine_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsocks5socketengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsocks5socketengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/socket/qsocks5socketengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qspdyprotocolhandler_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qspdyprotocolhandler_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qspdyprotocolhandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qspdyprotocolhandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/access/qspdyprotocolhandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qssl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qssl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qssl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qssl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qssl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslcertificate_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslcertificate_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslcertificate_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslcertificate_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qsslcertificate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslcertificateextension_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslcertificateextension_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslcertificateextension_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslcertificateextension_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qsslcertificateextension_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslcipher_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslcipher_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslcipher_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslcipher_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qsslcipher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslconfiguration_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslconfiguration_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslconfiguration_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslconfiguration_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qsslconfiguration_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslcontext_openssl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslcontext_openssl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslcontext_openssl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslcontext_openssl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qsslcontext_openssl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qssldiffiehellmanparameters_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qssldiffiehellmanparameters_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qssldiffiehellmanparameters_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qssldiffiehellmanparameters_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qssldiffiehellmanparameters_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslkey_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslkey_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslkey_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslkey_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qsslkey_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslpresharedkeyauthenticator_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslpresharedkeyauthenticator_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslpresharedkeyauthenticator_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslpresharedkeyauthenticator_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qsslpresharedkeyauthenticator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_mac_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_mac_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_mac_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_mac_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qsslsocket_mac_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_openssl_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_openssl_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_openssl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_openssl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qsslsocket_openssl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_openssl_symbols_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_openssl_symbols_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_openssl_symbols_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_openssl_symbols_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qsslsocket_openssl_symbols_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qsslsocket_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_schannel_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_schannel_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_schannel_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_schannel_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qsslsocket_schannel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_winrt_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_winrt_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_winrt_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qsslsocket_winrt_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qsslsocket_winrt_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qtcpserver_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qtcpserver_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qtcpserver_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qtcpserver_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/socket/qtcpserver_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qtcpsocket_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qtcpsocket_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qtcpsocket_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qtcpsocket_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/socket/qtcpsocket_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qtnetworkglobal_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qtnetworkglobal_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qtnetworkglobal_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qtnetworkglobal_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/kernel/qtnetworkglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qurlinfo_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qurlinfo_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qurlinfo_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qurlinfo_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/kernel/qurlinfo_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qwindowscarootfetcher_p.h 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qwindowscarootfetcher_p.h
--- 5.15.15+dfsg-2/include/QtNetwork/5.15.17/QtNetwork/private/qwindowscarootfetcher_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/5.15.17/QtNetwork/private/qwindowscarootfetcher_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/network/ssl/qwindowscarootfetcher_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtNetwork/qtnetworkversion.h 5.15.17+dfsg-1/include/QtNetwork/qtnetworkversion.h
--- 5.15.15+dfsg-2/include/QtNetwork/qtnetworkversion.h	2024-08-16 06:16:12.973250600 +0000
+++ 5.15.17+dfsg-1/include/QtNetwork/qtnetworkversion.h	2025-02-26 11:03:01.771832000 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTNETWORK_VERSION_H
 #define QT_QTNETWORK_VERSION_H
 
-#define QTNETWORK_VERSION_STR "5.15.15"
+#define QTNETWORK_VERSION_STR "5.15.17"
 
-#define QTNETWORK_VERSION 0x050F0F
+#define QTNETWORK_VERSION 0x050F11
 
 #endif // QT_QTNETWORK_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qgl2pexvertexarray_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qgl2pexvertexarray_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qgl2pexvertexarray_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qgl2pexvertexarray_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qgl_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qgl_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qgl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qgl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/opengl/qgl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglcustomshaderstage_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglcustomshaderstage_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglcustomshaderstage_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglcustomshaderstage_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/opengl/gl2paintengineex/qglcustomshaderstage_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglengineshadermanager_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglengineshadermanager_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglengineshadermanager_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglengineshadermanager_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/opengl/gl2paintengineex/qglengineshadermanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglengineshadersource_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglengineshadersource_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglengineshadersource_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglengineshadersource_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/opengl/gl2paintengineex/qglengineshadersource_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglframebufferobject_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglframebufferobject_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglframebufferobject_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglframebufferobject_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/opengl/qglframebufferobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglgradientcache_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglgradientcache_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglgradientcache_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglgradientcache_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/opengl/gl2paintengineex/qglgradientcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglpaintdevice_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglpaintdevice_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglpaintdevice_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglpaintdevice_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/opengl/qglpaintdevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglpixelbuffer_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglpixelbuffer_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglpixelbuffer_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglpixelbuffer_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/opengl/qglpixelbuffer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglshadercache_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglshadercache_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qglshadercache_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qglshadercache_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/opengl/gl2paintengineex/qglshadercache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qgraphicsshadereffect_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qgraphicsshadereffect_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qgraphicsshadereffect_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qgraphicsshadereffect_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/opengl/qgraphicsshadereffect_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qpaintengineex_opengl2_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qpaintengineex_opengl2_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qpaintengineex_opengl2_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qpaintengineex_opengl2_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qtextureglyphcache_gl_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qtextureglyphcache_gl_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.15/QtOpenGL/private/qtextureglyphcache_gl_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.15/QtOpenGL/private/qtextureglyphcache_gl_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qgl2pexvertexarray_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qgl2pexvertexarray_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qgl2pexvertexarray_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qgl2pexvertexarray_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qgl_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qgl_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qgl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qgl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/opengl/qgl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglcustomshaderstage_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglcustomshaderstage_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglcustomshaderstage_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglcustomshaderstage_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/opengl/gl2paintengineex/qglcustomshaderstage_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglengineshadermanager_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglengineshadermanager_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglengineshadermanager_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglengineshadermanager_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/opengl/gl2paintengineex/qglengineshadermanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglengineshadersource_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglengineshadersource_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglengineshadersource_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglengineshadersource_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/opengl/gl2paintengineex/qglengineshadersource_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglframebufferobject_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglframebufferobject_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglframebufferobject_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglframebufferobject_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/opengl/qglframebufferobject_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglgradientcache_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglgradientcache_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglgradientcache_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglgradientcache_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/opengl/gl2paintengineex/qglgradientcache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglpaintdevice_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglpaintdevice_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglpaintdevice_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglpaintdevice_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/opengl/qglpaintdevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglpixelbuffer_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglpixelbuffer_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglpixelbuffer_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglpixelbuffer_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/opengl/qglpixelbuffer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglshadercache_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglshadercache_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qglshadercache_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qglshadercache_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/opengl/gl2paintengineex/qglshadercache_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qgraphicsshadereffect_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qgraphicsshadereffect_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qgraphicsshadereffect_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qgraphicsshadereffect_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/opengl/qgraphicsshadereffect_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qpaintengineex_opengl2_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qpaintengineex_opengl2_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qpaintengineex_opengl2_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qpaintengineex_opengl2_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qtextureglyphcache_gl_p.h 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qtextureglyphcache_gl_p.h
--- 5.15.15+dfsg-2/include/QtOpenGL/5.15.17/QtOpenGL/private/qtextureglyphcache_gl_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/5.15.17/QtOpenGL/private/qtextureglyphcache_gl_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtOpenGL/qtopenglversion.h 5.15.17+dfsg-1/include/QtOpenGL/qtopenglversion.h
--- 5.15.15+dfsg-2/include/QtOpenGL/qtopenglversion.h	2024-08-16 06:16:11.617243300 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGL/qtopenglversion.h	2025-02-26 11:02:59.307809800 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTOPENGL_VERSION_H
 #define QT_QTOPENGL_VERSION_H
 
-#define QTOPENGL_VERSION_STR "5.15.15"
+#define QTOPENGL_VERSION_STR "5.15.17"
 
-#define QTOPENGL_VERSION 0x050F0F
+#define QTOPENGL_VERSION 0x050F11
 
 #endif // QT_QTOPENGL_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtOpenGLExtensions/qtopenglextensionsversion.h 5.15.17+dfsg-1/include/QtOpenGLExtensions/qtopenglextensionsversion.h
--- 5.15.15+dfsg-2/include/QtOpenGLExtensions/qtopenglextensionsversion.h	2024-08-16 06:16:13.065251000 +0000
+++ 5.15.17+dfsg-1/include/QtOpenGLExtensions/qtopenglextensionsversion.h	2025-02-26 11:03:00.095816900 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTOPENGLEXTENSIONS_VERSION_H
 #define QT_QTOPENGLEXTENSIONS_VERSION_H
 
-#define QTOPENGLEXTENSIONS_VERSION_STR "5.15.15"
+#define QTOPENGLEXTENSIONS_VERSION_STR "5.15.17"
 
-#define QTOPENGLEXTENSIONS_VERSION 0x050F0F
+#define QTOPENGLEXTENSIONS_VERSION 0x050F11
 
 #endif // QT_QTOPENGLEXTENSIONS_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtPlatformCompositorSupport/5.15.15/QtPlatformCompositorSupport/private/qopenglcompositor_p.h 5.15.17+dfsg-1/include/QtPlatformCompositorSupport/5.15.15/QtPlatformCompositorSupport/private/qopenglcompositor_p.h
--- 5.15.15+dfsg-2/include/QtPlatformCompositorSupport/5.15.15/QtPlatformCompositorSupport/private/qopenglcompositor_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPlatformCompositorSupport/5.15.15/QtPlatformCompositorSupport/private/qopenglcompositor_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/platformcompositor/qopenglcompositor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPlatformCompositorSupport/5.15.15/QtPlatformCompositorSupport/private/qopenglcompositorbackingstore_p.h 5.15.17+dfsg-1/include/QtPlatformCompositorSupport/5.15.15/QtPlatformCompositorSupport/private/qopenglcompositorbackingstore_p.h
--- 5.15.15+dfsg-2/include/QtPlatformCompositorSupport/5.15.15/QtPlatformCompositorSupport/private/qopenglcompositorbackingstore_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPlatformCompositorSupport/5.15.15/QtPlatformCompositorSupport/private/qopenglcompositorbackingstore_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/platformcompositor/qopenglcompositorbackingstore_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPlatformCompositorSupport/5.15.17/QtPlatformCompositorSupport/private/qopenglcompositor_p.h 5.15.17+dfsg-1/include/QtPlatformCompositorSupport/5.15.17/QtPlatformCompositorSupport/private/qopenglcompositor_p.h
--- 5.15.15+dfsg-2/include/QtPlatformCompositorSupport/5.15.17/QtPlatformCompositorSupport/private/qopenglcompositor_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPlatformCompositorSupport/5.15.17/QtPlatformCompositorSupport/private/qopenglcompositor_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/platformcompositor/qopenglcompositor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPlatformCompositorSupport/5.15.17/QtPlatformCompositorSupport/private/qopenglcompositorbackingstore_p.h 5.15.17+dfsg-1/include/QtPlatformCompositorSupport/5.15.17/QtPlatformCompositorSupport/private/qopenglcompositorbackingstore_p.h
--- 5.15.15+dfsg-2/include/QtPlatformCompositorSupport/5.15.17/QtPlatformCompositorSupport/private/qopenglcompositorbackingstore_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPlatformCompositorSupport/5.15.17/QtPlatformCompositorSupport/private/qopenglcompositorbackingstore_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/platformcompositor/qopenglcompositorbackingstore_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPlatformCompositorSupport/qtplatformcompositorsupportversion.h 5.15.17+dfsg-1/include/QtPlatformCompositorSupport/qtplatformcompositorsupportversion.h
--- 5.15.15+dfsg-2/include/QtPlatformCompositorSupport/qtplatformcompositorsupportversion.h	2024-08-16 06:16:11.581243000 +0000
+++ 5.15.17+dfsg-1/include/QtPlatformCompositorSupport/qtplatformcompositorsupportversion.h	2025-02-26 11:03:01.695831300 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTPLATFORMCOMPOSITORSUPPORT_VERSION_H
 #define QT_QTPLATFORMCOMPOSITORSUPPORT_VERSION_H
 
-#define QTPLATFORMCOMPOSITORSUPPORT_VERSION_STR "5.15.15"
+#define QTPLATFORMCOMPOSITORSUPPORT_VERSION_STR "5.15.17"
 
-#define QTPLATFORMCOMPOSITORSUPPORT_VERSION 0x050F0F
+#define QTPLATFORMCOMPOSITORSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTPLATFORMCOMPOSITORSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtPlatformHeaders/qtplatformheadersversion.h 5.15.17+dfsg-1/include/QtPlatformHeaders/qtplatformheadersversion.h
--- 5.15.15+dfsg-2/include/QtPlatformHeaders/qtplatformheadersversion.h	2024-08-16 06:16:13.045251000 +0000
+++ 5.15.17+dfsg-1/include/QtPlatformHeaders/qtplatformheadersversion.h	2025-02-26 11:03:00.111817000 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTPLATFORMHEADERS_VERSION_H
 #define QT_QTPLATFORMHEADERS_VERSION_H
 
-#define QTPLATFORMHEADERS_VERSION_STR "5.15.15"
+#define QTPLATFORMHEADERS_VERSION_STR "5.15.17"
 
-#define QTPLATFORMHEADERS_VERSION 0x050F0F
+#define QTPLATFORMHEADERS_VERSION 0x050F11
 
 #endif // QT_QTPLATFORMHEADERS_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qabstractprintdialog_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qabstractprintdialog_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qabstractprintdialog_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qabstractprintdialog_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/dialogs/qabstractprintdialog_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qcups_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qcups_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qcups_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qcups_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/kernel/qcups_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qcupsjobwidget_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qcupsjobwidget_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qcupsjobwidget_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qcupsjobwidget_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/widgets/qcupsjobwidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpagesetupdialog_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpagesetupdialog_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpagesetupdialog_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpagesetupdialog_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/dialogs/qpagesetupdialog_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpagesetupdialog_unix_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpagesetupdialog_unix_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpagesetupdialog_unix_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpagesetupdialog_unix_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/dialogs/qpagesetupdialog_unix_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpaintengine_alpha_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpaintengine_alpha_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpaintengine_alpha_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpaintengine_alpha_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/kernel/qpaintengine_alpha_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpaintengine_preview_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpaintengine_preview_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpaintengine_preview_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qpaintengine_preview_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/kernel/qpaintengine_preview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprint_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprint_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprint_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprint_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/kernel/qprint_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprintdevice_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprintdevice_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprintdevice_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprintdevice_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/kernel/qprintdevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprintengine_pdf_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprintengine_pdf_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprintengine_pdf_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprintengine_pdf_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/kernel/qprintengine_pdf_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprintengine_win_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprintengine_win_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprintengine_win_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprintengine_win_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/kernel/qprintengine_win_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprinter_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprinter_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprinter_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprinter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/kernel/qprinter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprinterinfo_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprinterinfo_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprinterinfo_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qprinterinfo_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/kernel/qprinterinfo_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qtprintsupportglobal_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qtprintsupportglobal_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qtprintsupportglobal_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/private/qtprintsupportglobal_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/kernel/qtprintsupportglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/qpa/qplatformprintdevice.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/qpa/qplatformprintdevice.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/qpa/qplatformprintdevice.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/qpa/qplatformprintdevice.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/kernel/qplatformprintdevice.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/qpa/qplatformprintersupport.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/qpa/qplatformprintersupport.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/qpa/qplatformprintersupport.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/qpa/qplatformprintersupport.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/kernel/qplatformprintersupport.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/qpa/qplatformprintplugin.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/qpa/qplatformprintplugin.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.15/QtPrintSupport/qpa/qplatformprintplugin.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.15/QtPrintSupport/qpa/qplatformprintplugin.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/printsupport/kernel/qplatformprintplugin.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qabstractprintdialog_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qabstractprintdialog_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qabstractprintdialog_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qabstractprintdialog_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/dialogs/qabstractprintdialog_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qcups_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qcups_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qcups_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qcups_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/kernel/qcups_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qcupsjobwidget_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qcupsjobwidget_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qcupsjobwidget_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qcupsjobwidget_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/widgets/qcupsjobwidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpagesetupdialog_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpagesetupdialog_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpagesetupdialog_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpagesetupdialog_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/dialogs/qpagesetupdialog_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpagesetupdialog_unix_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpagesetupdialog_unix_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpagesetupdialog_unix_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpagesetupdialog_unix_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/dialogs/qpagesetupdialog_unix_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpaintengine_alpha_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpaintengine_alpha_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpaintengine_alpha_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpaintengine_alpha_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/kernel/qpaintengine_alpha_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpaintengine_preview_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpaintengine_preview_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpaintengine_preview_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qpaintengine_preview_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/kernel/qpaintengine_preview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprint_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprint_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprint_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprint_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/kernel/qprint_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprintdevice_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprintdevice_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprintdevice_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprintdevice_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/kernel/qprintdevice_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprintengine_pdf_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprintengine_pdf_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprintengine_pdf_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprintengine_pdf_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/kernel/qprintengine_pdf_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprintengine_win_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprintengine_win_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprintengine_win_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprintengine_win_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/kernel/qprintengine_win_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprinter_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprinter_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprinter_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprinter_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/kernel/qprinter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprinterinfo_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprinterinfo_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprinterinfo_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qprinterinfo_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/kernel/qprinterinfo_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qtprintsupportglobal_p.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qtprintsupportglobal_p.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qtprintsupportglobal_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/private/qtprintsupportglobal_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/kernel/qtprintsupportglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/qpa/qplatformprintdevice.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/qpa/qplatformprintdevice.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/qpa/qplatformprintdevice.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/qpa/qplatformprintdevice.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/kernel/qplatformprintdevice.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/qpa/qplatformprintersupport.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/qpa/qplatformprintersupport.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/qpa/qplatformprintersupport.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/qpa/qplatformprintersupport.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/kernel/qplatformprintersupport.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/qpa/qplatformprintplugin.h 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/qpa/qplatformprintplugin.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/5.15.17/QtPrintSupport/qpa/qplatformprintplugin.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/5.15.17/QtPrintSupport/qpa/qplatformprintplugin.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/printsupport/kernel/qplatformprintplugin.h"
diff -pruN 5.15.15+dfsg-2/include/QtPrintSupport/qtprintsupportversion.h 5.15.17+dfsg-1/include/QtPrintSupport/qtprintsupportversion.h
--- 5.15.15+dfsg-2/include/QtPrintSupport/qtprintsupportversion.h	2024-08-16 06:16:11.593243100 +0000
+++ 5.15.17+dfsg-1/include/QtPrintSupport/qtprintsupportversion.h	2025-02-26 11:02:59.319810000 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTPRINTSUPPORT_VERSION_H
 #define QT_QTPRINTSUPPORT_VERSION_H
 
-#define QTPRINTSUPPORT_VERSION_STR "5.15.15"
+#define QTPRINTSUPPORT_VERSION_STR "5.15.17"
 
-#define QTPRINTSUPPORT_VERSION 0x050F0F
+#define QTPRINTSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTPRINTSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtServiceSupport/5.15.15/QtServiceSupport/private/qgenericunixservices_p.h 5.15.17+dfsg-1/include/QtServiceSupport/5.15.15/QtServiceSupport/private/qgenericunixservices_p.h
--- 5.15.15+dfsg-2/include/QtServiceSupport/5.15.15/QtServiceSupport/private/qgenericunixservices_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtServiceSupport/5.15.15/QtServiceSupport/private/qgenericunixservices_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/services/genericunix/qgenericunixservices_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtServiceSupport/5.15.17/QtServiceSupport/private/qgenericunixservices_p.h 5.15.17+dfsg-1/include/QtServiceSupport/5.15.17/QtServiceSupport/private/qgenericunixservices_p.h
--- 5.15.15+dfsg-2/include/QtServiceSupport/5.15.17/QtServiceSupport/private/qgenericunixservices_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtServiceSupport/5.15.17/QtServiceSupport/private/qgenericunixservices_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/services/genericunix/qgenericunixservices_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtServiceSupport/qtservicesupportversion.h 5.15.17+dfsg-1/include/QtServiceSupport/qtservicesupportversion.h
--- 5.15.15+dfsg-2/include/QtServiceSupport/qtservicesupportversion.h	2024-08-16 06:16:11.529242800 +0000
+++ 5.15.17+dfsg-1/include/QtServiceSupport/qtservicesupportversion.h	2025-02-26 11:03:01.775832000 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTSERVICESUPPORT_VERSION_H
 #define QT_QTSERVICESUPPORT_VERSION_H
 
-#define QTSERVICESUPPORT_VERSION_STR "5.15.15"
+#define QTSERVICESUPPORT_VERSION_STR "5.15.17"
 
-#define QTSERVICESUPPORT_VERSION 0x050F0F
+#define QTSERVICESUPPORT_VERSION 0x050F11
 
 #endif // QT_QTSERVICESUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtSql/5.15.15/QtSql/private/qsqlcachedresult_p.h 5.15.17+dfsg-1/include/QtSql/5.15.15/QtSql/private/qsqlcachedresult_p.h
--- 5.15.15+dfsg-2/include/QtSql/5.15.15/QtSql/private/qsqlcachedresult_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtSql/5.15.15/QtSql/private/qsqlcachedresult_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/sql/kernel/qsqlcachedresult_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtSql/5.15.15/QtSql/private/qsqldriver_p.h 5.15.17+dfsg-1/include/QtSql/5.15.15/QtSql/private/qsqldriver_p.h
--- 5.15.15+dfsg-2/include/QtSql/5.15.15/QtSql/private/qsqldriver_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtSql/5.15.15/QtSql/private/qsqldriver_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/sql/kernel/qsqldriver_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtSql/5.15.15/QtSql/private/qsqlnulldriver_p.h 5.15.17+dfsg-1/include/QtSql/5.15.15/QtSql/private/qsqlnulldriver_p.h
--- 5.15.15+dfsg-2/include/QtSql/5.15.15/QtSql/private/qsqlnulldriver_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtSql/5.15.15/QtSql/private/qsqlnulldriver_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/sql/kernel/qsqlnulldriver_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtSql/5.15.15/QtSql/private/qsqlquerymodel_p.h 5.15.17+dfsg-1/include/QtSql/5.15.15/QtSql/private/qsqlquerymodel_p.h
--- 5.15.15+dfsg-2/include/QtSql/5.15.15/QtSql/private/qsqlquerymodel_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtSql/5.15.15/QtSql/private/qsqlquerymodel_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/sql/models/qsqlquerymodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtSql/5.15.15/QtSql/private/qsqlresult_p.h 5.15.17+dfsg-1/include/QtSql/5.15.15/QtSql/private/qsqlresult_p.h
--- 5.15.15+dfsg-2/include/QtSql/5.15.15/QtSql/private/qsqlresult_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtSql/5.15.15/QtSql/private/qsqlresult_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/sql/kernel/qsqlresult_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtSql/5.15.15/QtSql/private/qsqltablemodel_p.h 5.15.17+dfsg-1/include/QtSql/5.15.15/QtSql/private/qsqltablemodel_p.h
--- 5.15.15+dfsg-2/include/QtSql/5.15.15/QtSql/private/qsqltablemodel_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtSql/5.15.15/QtSql/private/qsqltablemodel_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/sql/models/qsqltablemodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtSql/5.15.15/QtSql/private/qtsqlglobal_p.h 5.15.17+dfsg-1/include/QtSql/5.15.15/QtSql/private/qtsqlglobal_p.h
--- 5.15.15+dfsg-2/include/QtSql/5.15.15/QtSql/private/qtsqlglobal_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtSql/5.15.15/QtSql/private/qtsqlglobal_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/sql/kernel/qtsqlglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtSql/5.15.17/QtSql/private/qsqlcachedresult_p.h 5.15.17+dfsg-1/include/QtSql/5.15.17/QtSql/private/qsqlcachedresult_p.h
--- 5.15.15+dfsg-2/include/QtSql/5.15.17/QtSql/private/qsqlcachedresult_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtSql/5.15.17/QtSql/private/qsqlcachedresult_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/sql/kernel/qsqlcachedresult_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtSql/5.15.17/QtSql/private/qsqldriver_p.h 5.15.17+dfsg-1/include/QtSql/5.15.17/QtSql/private/qsqldriver_p.h
--- 5.15.15+dfsg-2/include/QtSql/5.15.17/QtSql/private/qsqldriver_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtSql/5.15.17/QtSql/private/qsqldriver_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/sql/kernel/qsqldriver_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtSql/5.15.17/QtSql/private/qsqlnulldriver_p.h 5.15.17+dfsg-1/include/QtSql/5.15.17/QtSql/private/qsqlnulldriver_p.h
--- 5.15.15+dfsg-2/include/QtSql/5.15.17/QtSql/private/qsqlnulldriver_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtSql/5.15.17/QtSql/private/qsqlnulldriver_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/sql/kernel/qsqlnulldriver_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtSql/5.15.17/QtSql/private/qsqlquerymodel_p.h 5.15.17+dfsg-1/include/QtSql/5.15.17/QtSql/private/qsqlquerymodel_p.h
--- 5.15.15+dfsg-2/include/QtSql/5.15.17/QtSql/private/qsqlquerymodel_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtSql/5.15.17/QtSql/private/qsqlquerymodel_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/sql/models/qsqlquerymodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtSql/5.15.17/QtSql/private/qsqlresult_p.h 5.15.17+dfsg-1/include/QtSql/5.15.17/QtSql/private/qsqlresult_p.h
--- 5.15.15+dfsg-2/include/QtSql/5.15.17/QtSql/private/qsqlresult_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtSql/5.15.17/QtSql/private/qsqlresult_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/sql/kernel/qsqlresult_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtSql/5.15.17/QtSql/private/qsqltablemodel_p.h 5.15.17+dfsg-1/include/QtSql/5.15.17/QtSql/private/qsqltablemodel_p.h
--- 5.15.15+dfsg-2/include/QtSql/5.15.17/QtSql/private/qsqltablemodel_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtSql/5.15.17/QtSql/private/qsqltablemodel_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/sql/models/qsqltablemodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtSql/5.15.17/QtSql/private/qtsqlglobal_p.h 5.15.17+dfsg-1/include/QtSql/5.15.17/QtSql/private/qtsqlglobal_p.h
--- 5.15.15+dfsg-2/include/QtSql/5.15.17/QtSql/private/qtsqlglobal_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtSql/5.15.17/QtSql/private/qtsqlglobal_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/sql/kernel/qtsqlglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtSql/qtsqlversion.h 5.15.17+dfsg-1/include/QtSql/qtsqlversion.h
--- 5.15.15+dfsg-2/include/QtSql/qtsqlversion.h	2024-08-16 06:16:13.025251000 +0000
+++ 5.15.17+dfsg-1/include/QtSql/qtsqlversion.h	2025-02-26 11:02:59.339810100 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTSQL_VERSION_H
 #define QT_QTSQL_VERSION_H
 
-#define QTSQL_VERSION_STR "5.15.15"
+#define QTSQL_VERSION_STR "5.15.17"
 
-#define QTSQL_VERSION 0x050F0F
+#define QTSQL_VERSION 0x050F11
 
 #endif // QT_QTSQL_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/callgrind_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/callgrind_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/callgrind_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/callgrind_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/3rdparty/callgrind_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/cycle_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/cycle_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/cycle_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/cycle_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/3rdparty/cycle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/linux_perf_event_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/linux_perf_event_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/linux_perf_event_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/linux_perf_event_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/3rdparty/linux_perf_event_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qabstracttestlogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qabstracttestlogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qabstracttestlogger_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qabstracttestlogger_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qabstracttestlogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qappletestlogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qappletestlogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qappletestlogger_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qappletestlogger_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qappletestlogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qbenchmark_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qbenchmark_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qbenchmark_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qbenchmark_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qbenchmark_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qbenchmarkevent_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qbenchmarkevent_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qbenchmarkevent_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qbenchmarkevent_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qbenchmarkevent_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qbenchmarkmeasurement_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qbenchmarkmeasurement_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qbenchmarkmeasurement_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qbenchmarkmeasurement_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qbenchmarkmeasurement_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qbenchmarkmetric_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qbenchmarkmetric_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qbenchmarkmetric_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qbenchmarkmetric_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qbenchmarkmetric_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qbenchmarkperfevents_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qbenchmarkperfevents_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qbenchmarkperfevents_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qbenchmarkperfevents_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qbenchmarkperfevents_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qbenchmarktimemeasurers_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qbenchmarktimemeasurers_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qbenchmarktimemeasurers_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qbenchmarktimemeasurers_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qbenchmarktimemeasurers_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qbenchmarkvalgrind_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qbenchmarkvalgrind_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qbenchmarkvalgrind_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qbenchmarkvalgrind_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qbenchmarkvalgrind_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qcsvbenchmarklogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qcsvbenchmarklogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qcsvbenchmarklogger_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qcsvbenchmarklogger_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qcsvbenchmarklogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qjunittestlogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qjunittestlogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qjunittestlogger_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qjunittestlogger_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qjunittestlogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qplaintestlogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qplaintestlogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qplaintestlogger_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qplaintestlogger_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qplaintestlogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qsignaldumper_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qsignaldumper_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qsignaldumper_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qsignaldumper_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qsignaldumper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtaptestlogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtaptestlogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtaptestlogger_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtaptestlogger_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qtaptestlogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qteamcitylogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qteamcitylogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qteamcitylogger_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qteamcitylogger_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qteamcitylogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestblacklist_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestblacklist_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestblacklist_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestblacklist_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qtestblacklist_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestcoreelement_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestcoreelement_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestcoreelement_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestcoreelement_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qtestcoreelement_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestcorelist_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestcorelist_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestcorelist_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestcorelist_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qtestcorelist_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestelement_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestelement_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestelement_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestelement_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qtestelement_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestelementattribute_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestelementattribute_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestelementattribute_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestelementattribute_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qtestelementattribute_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtesthelpers_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtesthelpers_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtesthelpers_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtesthelpers_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qtesthelpers_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestjunitstreamer_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestjunitstreamer_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestjunitstreamer_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestjunitstreamer_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qtestjunitstreamer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestlog_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestlog_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestlog_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestlog_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qtestlog_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestresult_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestresult_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestresult_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestresult_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qtestresult_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtesttable_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtesttable_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtesttable_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtesttable_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qtesttable_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestutil_macos_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestutil_macos_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qtestutil_macos_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qtestutil_macos_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qtestutil_macos_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qxctestlogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qxctestlogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qxctestlogger_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qxctestlogger_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qxctestlogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qxmltestlogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qxmltestlogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/qxmltestlogger_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/qxmltestlogger_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/qxmltestlogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/valgrind_p.h 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/valgrind_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.15/QtTest/private/valgrind_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.15/QtTest/private/valgrind_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/testlib/3rdparty/valgrind_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/callgrind_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/callgrind_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/callgrind_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/callgrind_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/3rdparty/callgrind_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/cycle_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/cycle_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/cycle_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/cycle_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/3rdparty/cycle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/linux_perf_event_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/linux_perf_event_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/linux_perf_event_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/linux_perf_event_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/3rdparty/linux_perf_event_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qabstracttestlogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qabstracttestlogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qabstracttestlogger_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qabstracttestlogger_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qabstracttestlogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qappletestlogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qappletestlogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qappletestlogger_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qappletestlogger_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qappletestlogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qbenchmark_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qbenchmark_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qbenchmark_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qbenchmark_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qbenchmark_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qbenchmarkevent_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qbenchmarkevent_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qbenchmarkevent_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qbenchmarkevent_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qbenchmarkevent_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qbenchmarkmeasurement_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qbenchmarkmeasurement_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qbenchmarkmeasurement_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qbenchmarkmeasurement_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qbenchmarkmeasurement_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qbenchmarkmetric_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qbenchmarkmetric_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qbenchmarkmetric_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qbenchmarkmetric_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qbenchmarkmetric_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qbenchmarkperfevents_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qbenchmarkperfevents_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qbenchmarkperfevents_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qbenchmarkperfevents_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qbenchmarkperfevents_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qbenchmarktimemeasurers_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qbenchmarktimemeasurers_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qbenchmarktimemeasurers_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qbenchmarktimemeasurers_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qbenchmarktimemeasurers_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qbenchmarkvalgrind_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qbenchmarkvalgrind_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qbenchmarkvalgrind_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qbenchmarkvalgrind_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qbenchmarkvalgrind_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qcsvbenchmarklogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qcsvbenchmarklogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qcsvbenchmarklogger_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qcsvbenchmarklogger_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qcsvbenchmarklogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qjunittestlogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qjunittestlogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qjunittestlogger_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qjunittestlogger_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qjunittestlogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qplaintestlogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qplaintestlogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qplaintestlogger_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qplaintestlogger_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qplaintestlogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qsignaldumper_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qsignaldumper_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qsignaldumper_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qsignaldumper_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qsignaldumper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtaptestlogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtaptestlogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtaptestlogger_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtaptestlogger_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qtaptestlogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qteamcitylogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qteamcitylogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qteamcitylogger_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qteamcitylogger_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qteamcitylogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestblacklist_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestblacklist_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestblacklist_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestblacklist_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qtestblacklist_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestcoreelement_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestcoreelement_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestcoreelement_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestcoreelement_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qtestcoreelement_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestcorelist_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestcorelist_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestcorelist_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestcorelist_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qtestcorelist_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestelement_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestelement_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestelement_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestelement_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qtestelement_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestelementattribute_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestelementattribute_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestelementattribute_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestelementattribute_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qtestelementattribute_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtesthelpers_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtesthelpers_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtesthelpers_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtesthelpers_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qtesthelpers_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestjunitstreamer_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestjunitstreamer_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestjunitstreamer_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestjunitstreamer_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qtestjunitstreamer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestlog_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestlog_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestlog_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestlog_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qtestlog_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestresult_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestresult_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestresult_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestresult_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qtestresult_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtesttable_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtesttable_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtesttable_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtesttable_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qtesttable_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestutil_macos_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestutil_macos_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qtestutil_macos_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qtestutil_macos_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qtestutil_macos_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qxctestlogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qxctestlogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qxctestlogger_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qxctestlogger_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qxctestlogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qxmltestlogger_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qxmltestlogger_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/qxmltestlogger_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/qxmltestlogger_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/qxmltestlogger_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/valgrind_p.h 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/valgrind_p.h
--- 5.15.15+dfsg-2/include/QtTest/5.15.17/QtTest/private/valgrind_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/5.15.17/QtTest/private/valgrind_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/testlib/3rdparty/valgrind_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtTest/qttestversion.h 5.15.17+dfsg-1/include/QtTest/qttestversion.h
--- 5.15.15+dfsg-2/include/QtTest/qttestversion.h	2024-08-16 06:16:11.581243000 +0000
+++ 5.15.17+dfsg-1/include/QtTest/qttestversion.h	2025-02-26 11:02:59.259809300 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTTEST_VERSION_H
 #define QT_QTTEST_VERSION_H
 
-#define QTTEST_VERSION_STR "5.15.15"
+#define QTTEST_VERSION_STR "5.15.17"
 
-#define QTTEST_VERSION 0x050F0F
+#define QTTEST_VERSION 0x050F11
 
 #endif // QT_QTTEST_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qabstractfileiconengine_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qabstractfileiconengine_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qabstractfileiconengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qabstractfileiconengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/themes/qabstractfileiconengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenuadaptor_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenuadaptor_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenuadaptor_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenuadaptor_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuadaptor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenubar_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenubar_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenubar_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenubar_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/themes/genericunix/dbusmenu/qdbusmenubar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenuconnection_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenuconnection_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenuconnection_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenuconnection_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenuregistrarproxy_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenuregistrarproxy_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenuregistrarproxy_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenuregistrarproxy_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuregistrarproxy_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenutypes_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenutypes_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenutypes_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusmenutypes_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/themes/genericunix/dbusmenu/qdbusmenutypes_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusplatformmenu_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusplatformmenu_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusplatformmenu_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbusplatformmenu_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/themes/genericunix/dbusmenu/qdbusplatformmenu_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbustrayicon_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbustrayicon_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbustrayicon_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbustrayicon_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbustraytypes_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbustraytypes_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbustraytypes_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qdbustraytypes_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/themes/genericunix/dbustray/qdbustraytypes_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qgenericunixthemes_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qgenericunixthemes_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qgenericunixthemes_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qgenericunixthemes_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/themes/genericunix/qgenericunixthemes_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qstatusnotifieritemadaptor_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qstatusnotifieritemadaptor_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qstatusnotifieritemadaptor_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qstatusnotifieritemadaptor_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/themes/genericunix/dbustray/qstatusnotifieritemadaptor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qxdgnotificationproxy_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qxdgnotificationproxy_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qxdgnotificationproxy_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.15/QtThemeSupport/private/qxdgnotificationproxy_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/themes/genericunix/dbustray/qxdgnotificationproxy_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qabstractfileiconengine_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qabstractfileiconengine_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qabstractfileiconengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qabstractfileiconengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/themes/qabstractfileiconengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenuadaptor_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenuadaptor_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenuadaptor_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenuadaptor_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuadaptor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenubar_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenubar_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenubar_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenubar_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/themes/genericunix/dbusmenu/qdbusmenubar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenuconnection_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenuconnection_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenuconnection_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenuconnection_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenuregistrarproxy_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenuregistrarproxy_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenuregistrarproxy_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenuregistrarproxy_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuregistrarproxy_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenutypes_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenutypes_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenutypes_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusmenutypes_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/themes/genericunix/dbusmenu/qdbusmenutypes_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusplatformmenu_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusplatformmenu_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusplatformmenu_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbusplatformmenu_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/themes/genericunix/dbusmenu/qdbusplatformmenu_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbustrayicon_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbustrayicon_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbustrayicon_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbustrayicon_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbustraytypes_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbustraytypes_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbustraytypes_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qdbustraytypes_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/themes/genericunix/dbustray/qdbustraytypes_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qgenericunixthemes_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qgenericunixthemes_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qgenericunixthemes_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qgenericunixthemes_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/themes/genericunix/qgenericunixthemes_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qstatusnotifieritemadaptor_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qstatusnotifieritemadaptor_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qstatusnotifieritemadaptor_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qstatusnotifieritemadaptor_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/themes/genericunix/dbustray/qstatusnotifieritemadaptor_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qxdgnotificationproxy_p.h 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qxdgnotificationproxy_p.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qxdgnotificationproxy_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/5.15.17/QtThemeSupport/private/qxdgnotificationproxy_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/themes/genericunix/dbustray/qxdgnotificationproxy_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtThemeSupport/qtthemesupportversion.h 5.15.17+dfsg-1/include/QtThemeSupport/qtthemesupportversion.h
--- 5.15.15+dfsg-2/include/QtThemeSupport/qtthemesupportversion.h	2024-08-16 06:16:13.377252800 +0000
+++ 5.15.17+dfsg-1/include/QtThemeSupport/qtthemesupportversion.h	2025-02-26 11:02:59.267809400 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTTHEMESUPPORT_VERSION_H
 #define QT_QTTHEMESUPPORT_VERSION_H
 
-#define QTTHEMESUPPORT_VERSION_STR "5.15.15"
+#define QTTHEMESUPPORT_VERSION_STR "5.15.17"
 
-#define QTTHEMESUPPORT_VERSION 0x050F0F
+#define QTTHEMESUPPORT_VERSION 0x050F11
 
 #endif // QT_QTTHEMESUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtVulkanSupport/5.15.15/QtVulkanSupport/private/qbasicvulkanplatforminstance_p.h 5.15.17+dfsg-1/include/QtVulkanSupport/5.15.15/QtVulkanSupport/private/qbasicvulkanplatforminstance_p.h
--- 5.15.15+dfsg-2/include/QtVulkanSupport/5.15.15/QtVulkanSupport/private/qbasicvulkanplatforminstance_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtVulkanSupport/5.15.15/QtVulkanSupport/private/qbasicvulkanplatforminstance_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/vkconvenience/qbasicvulkanplatforminstance_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtVulkanSupport/5.15.15/QtVulkanSupport/private/qvkconvenience_p.h 5.15.17+dfsg-1/include/QtVulkanSupport/5.15.15/QtVulkanSupport/private/qvkconvenience_p.h
--- 5.15.15+dfsg-2/include/QtVulkanSupport/5.15.15/QtVulkanSupport/private/qvkconvenience_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtVulkanSupport/5.15.15/QtVulkanSupport/private/qvkconvenience_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/vkconvenience/qvkconvenience_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtVulkanSupport/5.15.17/QtVulkanSupport/private/qbasicvulkanplatforminstance_p.h 5.15.17+dfsg-1/include/QtVulkanSupport/5.15.17/QtVulkanSupport/private/qbasicvulkanplatforminstance_p.h
--- 5.15.15+dfsg-2/include/QtVulkanSupport/5.15.17/QtVulkanSupport/private/qbasicvulkanplatforminstance_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtVulkanSupport/5.15.17/QtVulkanSupport/private/qbasicvulkanplatforminstance_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/vkconvenience/qbasicvulkanplatforminstance_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtVulkanSupport/5.15.17/QtVulkanSupport/private/qvkconvenience_p.h 5.15.17+dfsg-1/include/QtVulkanSupport/5.15.17/QtVulkanSupport/private/qvkconvenience_p.h
--- 5.15.15+dfsg-2/include/QtVulkanSupport/5.15.17/QtVulkanSupport/private/qvkconvenience_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtVulkanSupport/5.15.17/QtVulkanSupport/private/qvkconvenience_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/vkconvenience/qvkconvenience_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtVulkanSupport/qtvulkansupportversion.h 5.15.17+dfsg-1/include/QtVulkanSupport/qtvulkansupportversion.h
--- 5.15.15+dfsg-2/include/QtVulkanSupport/qtvulkansupportversion.h	2024-08-16 06:16:11.529242800 +0000
+++ 5.15.17+dfsg-1/include/QtVulkanSupport/qtvulkansupportversion.h	2025-02-26 11:03:01.695831300 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTVULKANSUPPORT_VERSION_H
 #define QT_QTVULKANSUPPORT_VERSION_H
 
-#define QTVULKANSUPPORT_VERSION_STR "5.15.15"
+#define QTVULKANSUPPORT_VERSION_STR "5.15.17"
 
-#define QTVULKANSUPPORT_VERSION 0x050F0F
+#define QTVULKANSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTVULKANSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/complexwidgets_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/complexwidgets_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/complexwidgets_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/complexwidgets_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/accessible/complexwidgets_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/itemviews_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/itemviews_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/itemviews_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/itemviews_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/accessible/itemviews_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qabstractbutton_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qabstractbutton_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qabstractbutton_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qabstractbutton_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qabstractbutton_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qabstractitemdelegate_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qabstractitemdelegate_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qabstractitemdelegate_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qabstractitemdelegate_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qabstractitemdelegate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qabstractitemview_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qabstractitemview_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qabstractitemview_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qabstractitemview_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qabstractitemview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qabstractscrollarea_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qabstractscrollarea_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qabstractscrollarea_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qabstractscrollarea_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qabstractscrollarea_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qabstractslider_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qabstractslider_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qabstractslider_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qabstractslider_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qabstractslider_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qabstractspinbox_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qabstractspinbox_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qabstractspinbox_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qabstractspinbox_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qabstractspinbox_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qaccessiblemenu_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qaccessiblemenu_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qaccessiblemenu_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qaccessiblemenu_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/accessible/qaccessiblemenu_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qaccessiblewidgetfactory_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qaccessiblewidgetfactory_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qaccessiblewidgetfactory_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qaccessiblewidgetfactory_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/accessible/qaccessiblewidgetfactory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qaccessiblewidgets_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qaccessiblewidgets_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qaccessiblewidgets_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qaccessiblewidgets_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/accessible/qaccessiblewidgets_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qaction_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qaction_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qaction_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qaction_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qaction_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qapplication_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qapplication_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qapplication_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qapplication_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qapplication_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qbasickeyeventtransition_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qbasickeyeventtransition_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qbasickeyeventtransition_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qbasickeyeventtransition_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/statemachine/qbasickeyeventtransition_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qbasicmouseeventtransition_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qbasicmouseeventtransition_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qbasicmouseeventtransition_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qbasicmouseeventtransition_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/statemachine/qbasicmouseeventtransition_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qbsptree_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qbsptree_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qbsptree_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qbsptree_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qbsptree_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qbuttongroup_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qbuttongroup_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qbuttongroup_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qbuttongroup_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qbuttongroup_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qcolumnview_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qcolumnview_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qcolumnview_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qcolumnview_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qcolumnview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qcolumnviewgrip_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qcolumnviewgrip_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qcolumnviewgrip_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qcolumnviewgrip_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qcolumnviewgrip_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qcombobox_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qcombobox_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qcombobox_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qcombobox_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qcombobox_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qcommonstyle_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qcommonstyle_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qcommonstyle_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qcommonstyle_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/styles/qcommonstyle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qcommonstylepixmaps_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qcommonstylepixmaps_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qcommonstylepixmaps_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qcommonstylepixmaps_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/styles/qcommonstylepixmaps_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qcompleter_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qcompleter_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qcompleter_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qcompleter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/util/qcompleter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qdatetimeedit_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qdatetimeedit_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qdatetimeedit_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qdatetimeedit_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qdatetimeedit_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qdesktopwidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qdesktopwidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qdesktopwidget_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qdesktopwidget_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qdesktopwidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qdialog_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qdialog_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qdialog_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qdialog_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/dialogs/qdialog_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qdockarealayout_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qdockarealayout_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qdockarealayout_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qdockarealayout_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qdockarealayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qdockwidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qdockwidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qdockwidget_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qdockwidget_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qdockwidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qeffects_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qeffects_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qeffects_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qeffects_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qeffects_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfiledialog_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfiledialog_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfiledialog_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfiledialog_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/dialogs/qfiledialog_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfileiconprovider_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfileiconprovider_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfileiconprovider_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfileiconprovider_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qfileiconprovider_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfileinfogatherer_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfileinfogatherer_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfileinfogatherer_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfileinfogatherer_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/dialogs/qfileinfogatherer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfilesystemmodel_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfilesystemmodel_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfilesystemmodel_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfilesystemmodel_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/dialogs/qfilesystemmodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qflickgesture_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qflickgesture_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qflickgesture_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qflickgesture_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/util/qflickgesture_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfontdialog_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfontdialog_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfontdialog_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfontdialog_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/dialogs/qfontdialog_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qframe_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qframe_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qframe_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qframe_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qframe_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfscompleter_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfscompleter_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfscompleter_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfscompleter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/dialogs/qfscompleter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfusionstyle_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfusionstyle_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfusionstyle_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfusionstyle_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/styles/qfusionstyle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfusionstyle_p_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfusionstyle_p_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qfusionstyle_p_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qfusionstyle_p_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/styles/qfusionstyle_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgesture_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgesture_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgesture_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgesture_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qgesture_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgesturemanager_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgesturemanager_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgesturemanager_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgesturemanager_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qgesturemanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraph_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraph_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraph_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraph_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraph_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsanchorlayout_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsanchorlayout_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsanchorlayout_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsanchorlayout_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraphicsanchorlayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicseffect_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicseffect_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicseffect_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicseffect_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/effects/qgraphicseffect_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsgridlayoutengine_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsgridlayoutengine_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsgridlayoutengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsgridlayoutengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraphicsgridlayoutengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsitem_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsitem_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsitem_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsitem_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraphicsitem_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicslayout_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicslayout_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicslayout_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicslayout_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraphicslayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicslayoutitem_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicslayoutitem_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicslayoutitem_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicslayoutitem_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraphicslayoutitem_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicslayoutstyleinfo_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicslayoutstyleinfo_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicslayoutstyleinfo_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicslayoutstyleinfo_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraphicslayoutstyleinfo_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsproxywidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsproxywidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsproxywidget_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsproxywidget_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraphicsproxywidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscene_bsp_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscene_bsp_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscene_bsp_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscene_bsp_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraphicsscene_bsp_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscene_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscene_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscene_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscene_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraphicsscene_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscenebsptreeindex_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscenebsptreeindex_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscenebsptreeindex_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscenebsptreeindex_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraphicsscenebsptreeindex_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicssceneindex_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicssceneindex_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicssceneindex_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicssceneindex_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraphicssceneindex_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscenelinearindex_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscenelinearindex_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscenelinearindex_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsscenelinearindex_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraphicsscenelinearindex_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicstransform_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicstransform_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicstransform_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicstransform_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraphicstransform_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsview_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsview_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsview_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicsview_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraphicsview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicswidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicswidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicswidget_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qgraphicswidget_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qgraphicswidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qheaderview_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qheaderview_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qheaderview_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qheaderview_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qheaderview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qitemeditorfactory_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qitemeditorfactory_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qitemeditorfactory_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qitemeditorfactory_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qitemeditorfactory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qkeysequenceedit_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qkeysequenceedit_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qkeysequenceedit_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qkeysequenceedit_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qkeysequenceedit_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qlabel_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qlabel_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qlabel_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qlabel_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qlabel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qlayout_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qlayout_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qlayout_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qlayout_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qlayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qlayoutengine_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qlayoutengine_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qlayoutengine_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qlayoutengine_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qlayoutengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qlineedit_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qlineedit_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qlineedit_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qlineedit_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qlineedit_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qlistview_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qlistview_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qlistview_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qlistview_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qlistview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qlistwidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qlistwidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qlistwidget_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qlistwidget_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qlistwidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qmacgesturerecognizer_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qmacgesturerecognizer_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qmacgesturerecognizer_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qmacgesturerecognizer_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qmacgesturerecognizer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qmainwindowlayout_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qmainwindowlayout_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qmainwindowlayout_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qmainwindowlayout_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qmainwindowlayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qmdiarea_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qmdiarea_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qmdiarea_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qmdiarea_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qmdiarea_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qmdisubwindow_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qmdisubwindow_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qmdisubwindow_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qmdisubwindow_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qmdisubwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qmenu_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qmenu_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qmenu_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qmenu_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qmenu_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qmenubar_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qmenubar_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qmenubar_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qmenubar_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qmenubar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qpixmapfilter_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qpixmapfilter_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qpixmapfilter_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qpixmapfilter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/effects/qpixmapfilter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qpixmapstyle_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qpixmapstyle_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qpixmapstyle_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qpixmapstyle_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/styles/qpixmapstyle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qpixmapstyle_p_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qpixmapstyle_p_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qpixmapstyle_p_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qpixmapstyle_p_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/styles/qpixmapstyle_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qplaintextedit_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qplaintextedit_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qplaintextedit_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qplaintextedit_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qplaintextedit_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qproxystyle_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qproxystyle_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qproxystyle_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qproxystyle_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/styles/qproxystyle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qpushbutton_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qpushbutton_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qpushbutton_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qpushbutton_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qpushbutton_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qscrollarea_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qscrollarea_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qscrollarea_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qscrollarea_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qscrollarea_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qscrollbar_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qscrollbar_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qscrollbar_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qscrollbar_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qscrollbar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qscroller_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qscroller_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qscroller_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qscroller_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/util/qscroller_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qscrollerproperties_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qscrollerproperties_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qscrollerproperties_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qscrollerproperties_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/util/qscrollerproperties_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qsidebar_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qsidebar_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qsidebar_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qsidebar_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/dialogs/qsidebar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qsimplex_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qsimplex_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qsimplex_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qsimplex_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/graphicsview/qsimplex_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qsplitter_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qsplitter_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qsplitter_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qsplitter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qsplitter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qstandardgestures_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qstandardgestures_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qstandardgestures_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qstandardgestures_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qstandardgestures_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qstyle_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qstyle_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qstyle_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qstyle_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/styles/qstyle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qstyleanimation_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qstyleanimation_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qstyleanimation_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qstyleanimation_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/styles/qstyleanimation_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qstylehelper_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qstylehelper_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qstylehelper_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qstylehelper_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/styles/qstylehelper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qstylesheetstyle_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qstylesheetstyle_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qstylesheetstyle_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qstylesheetstyle_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/styles/qstylesheetstyle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qsystemtrayicon_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qsystemtrayicon_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qsystemtrayicon_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qsystemtrayicon_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/util/qsystemtrayicon_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qt_widgets_pch.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qt_widgets_pch.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qt_widgets_pch.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qt_widgets_pch.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qt_widgets_pch.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtabbar_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtabbar_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtabbar_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtabbar_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qtabbar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtableview_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtableview_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtableview_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtableview_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qtableview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtablewidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtablewidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtablewidget_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtablewidget_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qtablewidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtextedit_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtextedit_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtextedit_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtextedit_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qtextedit_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbar_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbar_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbar_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbar_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qtoolbar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbararealayout_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbararealayout_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbararealayout_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbararealayout_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qtoolbararealayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbarextension_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbarextension_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbarextension_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbarextension_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qtoolbarextension_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbarlayout_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbarlayout_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbarlayout_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbarlayout_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qtoolbarlayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbarseparator_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbarseparator_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbarseparator_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtoolbarseparator_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qtoolbarseparator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtreeview_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtreeview_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtreeview_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtreeview_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qtreeview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtreewidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtreewidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtreewidget_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtreewidget_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qtreewidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtreewidgetitemiterator_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtreewidgetitemiterator_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtreewidgetitemiterator_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtreewidgetitemiterator_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qtreewidgetitemiterator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtwidgetsglobal_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtwidgetsglobal_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qtwidgetsglobal_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qtwidgetsglobal_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qtwidgetsglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qundostack_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qundostack_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qundostack_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qundostack_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/util/qundostack_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidget_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidget_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qwidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetaction_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetaction_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetaction_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetaction_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qwidgetaction_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetanimator_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetanimator_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetanimator_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetanimator_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qwidgetanimator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetitemdata_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetitemdata_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetitemdata_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetitemdata_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/itemviews/qwidgetitemdata_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetlinecontrol_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetlinecontrol_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetlinecontrol_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetlinecontrol_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qwidgetlinecontrol_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetrepaintmanager_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetrepaintmanager_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetrepaintmanager_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetrepaintmanager_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qwidgetrepaintmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetresizehandler_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetresizehandler_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetresizehandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetresizehandler_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qwidgetresizehandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgettextcontrol_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgettextcontrol_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgettextcontrol_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgettextcontrol_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qwidgettextcontrol_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgettextcontrol_p_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgettextcontrol_p_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgettextcontrol_p_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgettextcontrol_p_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/widgets/qwidgettextcontrol_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetwindow_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetwindow_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetwindow_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwidgetwindow_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qwidgetwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwindowcontainer_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwindowcontainer_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwindowcontainer_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwindowcontainer_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/kernel/qwindowcontainer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwindowsstyle_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwindowsstyle_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwindowsstyle_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwindowsstyle_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/styles/qwindowsstyle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwindowsstyle_p_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwindowsstyle_p_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwindowsstyle_p_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwindowsstyle_p_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/styles/qwindowsstyle_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwizard_win_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwizard_win_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/qwizard_win_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/qwizard_win_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/dialogs/qwizard_win_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/rangecontrols_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/rangecontrols_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/rangecontrols_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/rangecontrols_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/accessible/rangecontrols_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/simplewidgets_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/simplewidgets_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.15/QtWidgets/private/simplewidgets_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.15/QtWidgets/private/simplewidgets_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/widgets/accessible/simplewidgets_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/complexwidgets_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/complexwidgets_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/complexwidgets_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/complexwidgets_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/accessible/complexwidgets_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/itemviews_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/itemviews_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/itemviews_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/itemviews_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/accessible/itemviews_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qabstractbutton_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qabstractbutton_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qabstractbutton_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qabstractbutton_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qabstractbutton_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qabstractitemdelegate_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qabstractitemdelegate_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qabstractitemdelegate_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qabstractitemdelegate_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qabstractitemdelegate_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qabstractitemview_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qabstractitemview_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qabstractitemview_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qabstractitemview_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qabstractitemview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qabstractscrollarea_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qabstractscrollarea_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qabstractscrollarea_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qabstractscrollarea_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qabstractscrollarea_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qabstractslider_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qabstractslider_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qabstractslider_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qabstractslider_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qabstractslider_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qabstractspinbox_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qabstractspinbox_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qabstractspinbox_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qabstractspinbox_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qabstractspinbox_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qaccessiblemenu_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qaccessiblemenu_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qaccessiblemenu_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qaccessiblemenu_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/accessible/qaccessiblemenu_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qaccessiblewidgetfactory_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qaccessiblewidgetfactory_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qaccessiblewidgetfactory_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qaccessiblewidgetfactory_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/accessible/qaccessiblewidgetfactory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qaccessiblewidgets_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qaccessiblewidgets_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qaccessiblewidgets_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qaccessiblewidgets_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/accessible/qaccessiblewidgets_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qaction_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qaction_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qaction_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qaction_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qaction_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qapplication_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qapplication_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qapplication_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qapplication_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qapplication_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qbasickeyeventtransition_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qbasickeyeventtransition_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qbasickeyeventtransition_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qbasickeyeventtransition_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/statemachine/qbasickeyeventtransition_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qbasicmouseeventtransition_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qbasicmouseeventtransition_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qbasicmouseeventtransition_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qbasicmouseeventtransition_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/statemachine/qbasicmouseeventtransition_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qbsptree_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qbsptree_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qbsptree_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qbsptree_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qbsptree_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qbuttongroup_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qbuttongroup_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qbuttongroup_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qbuttongroup_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qbuttongroup_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qcolumnview_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qcolumnview_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qcolumnview_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qcolumnview_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qcolumnview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qcolumnviewgrip_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qcolumnviewgrip_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qcolumnviewgrip_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qcolumnviewgrip_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qcolumnviewgrip_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qcombobox_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qcombobox_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qcombobox_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qcombobox_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qcombobox_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qcommonstyle_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qcommonstyle_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qcommonstyle_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qcommonstyle_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/styles/qcommonstyle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qcommonstylepixmaps_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qcommonstylepixmaps_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qcommonstylepixmaps_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qcommonstylepixmaps_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/styles/qcommonstylepixmaps_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qcompleter_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qcompleter_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qcompleter_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qcompleter_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/util/qcompleter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qdatetimeedit_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qdatetimeedit_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qdatetimeedit_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qdatetimeedit_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qdatetimeedit_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qdesktopwidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qdesktopwidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qdesktopwidget_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qdesktopwidget_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qdesktopwidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qdialog_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qdialog_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qdialog_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qdialog_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/dialogs/qdialog_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qdockarealayout_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qdockarealayout_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qdockarealayout_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qdockarealayout_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qdockarealayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qdockwidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qdockwidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qdockwidget_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qdockwidget_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qdockwidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qeffects_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qeffects_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qeffects_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qeffects_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qeffects_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfiledialog_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfiledialog_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfiledialog_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfiledialog_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/dialogs/qfiledialog_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfileiconprovider_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfileiconprovider_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfileiconprovider_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfileiconprovider_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qfileiconprovider_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfileinfogatherer_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfileinfogatherer_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfileinfogatherer_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfileinfogatherer_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/dialogs/qfileinfogatherer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfilesystemmodel_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfilesystemmodel_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfilesystemmodel_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfilesystemmodel_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/dialogs/qfilesystemmodel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qflickgesture_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qflickgesture_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qflickgesture_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qflickgesture_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/util/qflickgesture_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfontdialog_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfontdialog_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfontdialog_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfontdialog_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/dialogs/qfontdialog_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qframe_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qframe_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qframe_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qframe_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qframe_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfscompleter_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfscompleter_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfscompleter_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfscompleter_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/dialogs/qfscompleter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfusionstyle_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfusionstyle_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfusionstyle_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfusionstyle_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/styles/qfusionstyle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfusionstyle_p_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfusionstyle_p_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qfusionstyle_p_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qfusionstyle_p_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/styles/qfusionstyle_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgesture_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgesture_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgesture_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgesture_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qgesture_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgesturemanager_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgesturemanager_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgesturemanager_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgesturemanager_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qgesturemanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraph_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraph_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraph_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraph_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraph_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsanchorlayout_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsanchorlayout_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsanchorlayout_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsanchorlayout_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraphicsanchorlayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicseffect_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicseffect_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicseffect_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicseffect_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/effects/qgraphicseffect_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsgridlayoutengine_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsgridlayoutengine_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsgridlayoutengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsgridlayoutengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraphicsgridlayoutengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsitem_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsitem_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsitem_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsitem_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraphicsitem_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicslayout_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicslayout_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicslayout_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicslayout_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraphicslayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicslayoutitem_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicslayoutitem_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicslayoutitem_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicslayoutitem_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraphicslayoutitem_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicslayoutstyleinfo_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicslayoutstyleinfo_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicslayoutstyleinfo_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicslayoutstyleinfo_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraphicslayoutstyleinfo_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsproxywidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsproxywidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsproxywidget_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsproxywidget_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraphicsproxywidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscene_bsp_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscene_bsp_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscene_bsp_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscene_bsp_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraphicsscene_bsp_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscene_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscene_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscene_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscene_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraphicsscene_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscenebsptreeindex_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscenebsptreeindex_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscenebsptreeindex_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscenebsptreeindex_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraphicsscenebsptreeindex_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicssceneindex_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicssceneindex_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicssceneindex_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicssceneindex_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraphicssceneindex_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscenelinearindex_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscenelinearindex_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscenelinearindex_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsscenelinearindex_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraphicsscenelinearindex_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicstransform_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicstransform_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicstransform_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicstransform_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraphicstransform_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsview_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsview_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsview_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicsview_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraphicsview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicswidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicswidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicswidget_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qgraphicswidget_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qgraphicswidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qheaderview_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qheaderview_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qheaderview_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qheaderview_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qheaderview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qitemeditorfactory_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qitemeditorfactory_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qitemeditorfactory_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qitemeditorfactory_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qitemeditorfactory_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qkeysequenceedit_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qkeysequenceedit_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qkeysequenceedit_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qkeysequenceedit_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qkeysequenceedit_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qlabel_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qlabel_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qlabel_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qlabel_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qlabel_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qlayout_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qlayout_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qlayout_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qlayout_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qlayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qlayoutengine_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qlayoutengine_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qlayoutengine_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qlayoutengine_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qlayoutengine_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qlineedit_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qlineedit_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qlineedit_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qlineedit_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qlineedit_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qlistview_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qlistview_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qlistview_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qlistview_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qlistview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qlistwidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qlistwidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qlistwidget_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qlistwidget_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qlistwidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qmacgesturerecognizer_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qmacgesturerecognizer_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qmacgesturerecognizer_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qmacgesturerecognizer_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qmacgesturerecognizer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qmainwindowlayout_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qmainwindowlayout_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qmainwindowlayout_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qmainwindowlayout_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qmainwindowlayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qmdiarea_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qmdiarea_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qmdiarea_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qmdiarea_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qmdiarea_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qmdisubwindow_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qmdisubwindow_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qmdisubwindow_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qmdisubwindow_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qmdisubwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qmenu_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qmenu_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qmenu_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qmenu_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qmenu_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qmenubar_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qmenubar_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qmenubar_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qmenubar_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qmenubar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qpixmapfilter_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qpixmapfilter_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qpixmapfilter_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qpixmapfilter_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/effects/qpixmapfilter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qpixmapstyle_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qpixmapstyle_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qpixmapstyle_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qpixmapstyle_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/styles/qpixmapstyle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qpixmapstyle_p_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qpixmapstyle_p_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qpixmapstyle_p_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qpixmapstyle_p_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/styles/qpixmapstyle_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qplaintextedit_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qplaintextedit_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qplaintextedit_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qplaintextedit_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qplaintextedit_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qproxystyle_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qproxystyle_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qproxystyle_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qproxystyle_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/styles/qproxystyle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qpushbutton_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qpushbutton_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qpushbutton_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qpushbutton_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qpushbutton_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qscrollarea_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qscrollarea_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qscrollarea_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qscrollarea_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qscrollarea_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qscrollbar_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qscrollbar_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qscrollbar_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qscrollbar_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qscrollbar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qscroller_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qscroller_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qscroller_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qscroller_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/util/qscroller_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qscrollerproperties_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qscrollerproperties_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qscrollerproperties_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qscrollerproperties_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/util/qscrollerproperties_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qsidebar_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qsidebar_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qsidebar_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qsidebar_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/dialogs/qsidebar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qsimplex_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qsimplex_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qsimplex_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qsimplex_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/graphicsview/qsimplex_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qsplitter_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qsplitter_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qsplitter_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qsplitter_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qsplitter_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qstandardgestures_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qstandardgestures_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qstandardgestures_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qstandardgestures_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qstandardgestures_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qstyle_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qstyle_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qstyle_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qstyle_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/styles/qstyle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qstyleanimation_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qstyleanimation_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qstyleanimation_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qstyleanimation_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/styles/qstyleanimation_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qstylehelper_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qstylehelper_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qstylehelper_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qstylehelper_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/styles/qstylehelper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qstylesheetstyle_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qstylesheetstyle_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qstylesheetstyle_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qstylesheetstyle_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/styles/qstylesheetstyle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qsystemtrayicon_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qsystemtrayicon_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qsystemtrayicon_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qsystemtrayicon_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/util/qsystemtrayicon_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qt_widgets_pch.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qt_widgets_pch.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qt_widgets_pch.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qt_widgets_pch.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qt_widgets_pch.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtabbar_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtabbar_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtabbar_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtabbar_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qtabbar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtableview_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtableview_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtableview_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtableview_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qtableview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtablewidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtablewidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtablewidget_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtablewidget_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qtablewidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtextedit_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtextedit_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtextedit_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtextedit_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qtextedit_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbar_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbar_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbar_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbar_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qtoolbar_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbararealayout_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbararealayout_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbararealayout_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbararealayout_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qtoolbararealayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbarextension_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbarextension_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbarextension_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbarextension_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qtoolbarextension_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbarlayout_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbarlayout_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbarlayout_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbarlayout_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qtoolbarlayout_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbarseparator_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbarseparator_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbarseparator_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtoolbarseparator_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qtoolbarseparator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtreeview_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtreeview_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtreeview_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtreeview_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qtreeview_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtreewidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtreewidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtreewidget_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtreewidget_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qtreewidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtreewidgetitemiterator_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtreewidgetitemiterator_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtreewidgetitemiterator_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtreewidgetitemiterator_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qtreewidgetitemiterator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtwidgetsglobal_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtwidgetsglobal_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qtwidgetsglobal_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qtwidgetsglobal_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qtwidgetsglobal_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qundostack_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qundostack_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qundostack_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qundostack_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/util/qundostack_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidget_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidget_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidget_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidget_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qwidget_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetaction_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetaction_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetaction_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetaction_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qwidgetaction_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetanimator_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetanimator_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetanimator_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetanimator_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qwidgetanimator_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetitemdata_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetitemdata_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetitemdata_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetitemdata_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/itemviews/qwidgetitemdata_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetlinecontrol_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetlinecontrol_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetlinecontrol_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetlinecontrol_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qwidgetlinecontrol_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetrepaintmanager_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetrepaintmanager_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetrepaintmanager_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetrepaintmanager_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qwidgetrepaintmanager_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetresizehandler_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetresizehandler_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetresizehandler_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetresizehandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qwidgetresizehandler_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgettextcontrol_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgettextcontrol_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgettextcontrol_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgettextcontrol_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qwidgettextcontrol_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgettextcontrol_p_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgettextcontrol_p_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgettextcontrol_p_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgettextcontrol_p_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/widgets/qwidgettextcontrol_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetwindow_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetwindow_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetwindow_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwidgetwindow_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qwidgetwindow_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwindowcontainer_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwindowcontainer_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwindowcontainer_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwindowcontainer_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/kernel/qwindowcontainer_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwindowsstyle_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwindowsstyle_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwindowsstyle_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwindowsstyle_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/styles/qwindowsstyle_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwindowsstyle_p_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwindowsstyle_p_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwindowsstyle_p_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwindowsstyle_p_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/styles/qwindowsstyle_p_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwizard_win_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwizard_win_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/qwizard_win_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/qwizard_win_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/dialogs/qwizard_win_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/rangecontrols_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/rangecontrols_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/rangecontrols_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/rangecontrols_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/accessible/rangecontrols_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/simplewidgets_p.h 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/simplewidgets_p.h
--- 5.15.15+dfsg-2/include/QtWidgets/5.15.17/QtWidgets/private/simplewidgets_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/5.15.17/QtWidgets/private/simplewidgets_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/widgets/accessible/simplewidgets_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWidgets/qtwidgetsversion.h 5.15.17+dfsg-1/include/QtWidgets/qtwidgetsversion.h
--- 5.15.15+dfsg-2/include/QtWidgets/qtwidgetsversion.h	2024-08-16 06:16:13.301252400 +0000
+++ 5.15.17+dfsg-1/include/QtWidgets/qtwidgetsversion.h	2025-02-26 11:03:01.691831400 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTWIDGETS_VERSION_H
 #define QT_QTWIDGETS_VERSION_H
 
-#define QTWIDGETS_VERSION_STR "5.15.15"
+#define QTWIDGETS_VERSION_STR "5.15.17"
 
-#define QTWIDGETS_VERSION 0x050F0F
+#define QTWIDGETS_VERSION 0x050F11
 
 #endif // QT_QTWIDGETS_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/windowsuiautomation/qwindowsuiawrapper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaattributeids_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaattributeids_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaattributeids_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaattributeids_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/windowsuiautomation/uiaattributeids_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaclientinterfaces_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaclientinterfaces_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaclientinterfaces_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaclientinterfaces_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/windowsuiautomation/uiaclientinterfaces_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiacontroltypeids_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiacontroltypeids_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiacontroltypeids_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiacontroltypeids_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/windowsuiautomation/uiacontroltypeids_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaerrorids_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaerrorids_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaerrorids_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaerrorids_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/windowsuiautomation/uiaerrorids_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaeventids_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaeventids_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaeventids_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaeventids_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/windowsuiautomation/uiaeventids_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiageneralids_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiageneralids_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiageneralids_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiageneralids_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/windowsuiautomation/uiageneralids_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiapatternids_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiapatternids_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiapatternids_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiapatternids_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/windowsuiautomation/uiapatternids_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiapropertyids_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiapropertyids_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiapropertyids_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiapropertyids_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/windowsuiautomation/uiapropertyids_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaserverinterfaces_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaserverinterfaces_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaserverinterfaces_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiaserverinterfaces_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/windowsuiautomation/uiaserverinterfaces_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiatypes_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiatypes_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiatypes_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.15/QtWindowsUIAutomationSupport/private/uiatypes_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/windowsuiautomation/uiatypes_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/windowsuiautomation/qwindowsuiawrapper_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaattributeids_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaattributeids_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaattributeids_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaattributeids_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/windowsuiautomation/uiaattributeids_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaclientinterfaces_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaclientinterfaces_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaclientinterfaces_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaclientinterfaces_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/windowsuiautomation/uiaclientinterfaces_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiacontroltypeids_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiacontroltypeids_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiacontroltypeids_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiacontroltypeids_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/windowsuiautomation/uiacontroltypeids_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaerrorids_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaerrorids_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaerrorids_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaerrorids_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/windowsuiautomation/uiaerrorids_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaeventids_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaeventids_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaeventids_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaeventids_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/windowsuiautomation/uiaeventids_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiageneralids_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiageneralids_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiageneralids_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiageneralids_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/windowsuiautomation/uiageneralids_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiapatternids_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiapatternids_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiapatternids_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiapatternids_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/windowsuiautomation/uiapatternids_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiapropertyids_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiapropertyids_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiapropertyids_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiapropertyids_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/windowsuiautomation/uiapropertyids_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaserverinterfaces_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaserverinterfaces_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaserverinterfaces_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiaserverinterfaces_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/windowsuiautomation/uiaserverinterfaces_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiatypes_p.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiatypes_p.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiatypes_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/5.15.17/QtWindowsUIAutomationSupport/private/uiatypes_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/windowsuiautomation/uiatypes_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/qtwindowsuiautomationsupportversion.h 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/qtwindowsuiautomationsupportversion.h
--- 5.15.15+dfsg-2/include/QtWindowsUIAutomationSupport/qtwindowsuiautomationsupportversion.h	2024-08-16 06:16:11.533242700 +0000
+++ 5.15.17+dfsg-1/include/QtWindowsUIAutomationSupport/qtwindowsuiautomationsupportversion.h	2025-02-26 11:03:00.111817000 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTWINDOWSUIAUTOMATIONSUPPORT_VERSION_H
 #define QT_QTWINDOWSUIAUTOMATIONSUPPORT_VERSION_H
 
-#define QTWINDOWSUIAUTOMATIONSUPPORT_VERSION_STR "5.15.15"
+#define QTWINDOWSUIAUTOMATIONSUPPORT_VERSION_STR "5.15.17"
 
-#define QTWINDOWSUIAUTOMATIONSUPPORT_VERSION 0x050F0F
+#define QTWINDOWSUIAUTOMATIONSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTWINDOWSUIAUTOMATIONSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtXkbCommonSupport/5.15.15/QtXkbCommonSupport/private/qxkbcommon_p.h 5.15.17+dfsg-1/include/QtXkbCommonSupport/5.15.15/QtXkbCommonSupport/private/qxkbcommon_p.h
--- 5.15.15+dfsg-2/include/QtXkbCommonSupport/5.15.15/QtXkbCommonSupport/private/qxkbcommon_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtXkbCommonSupport/5.15.15/QtXkbCommonSupport/private/qxkbcommon_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/platformsupport/input/xkbcommon/qxkbcommon_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtXkbCommonSupport/5.15.17/QtXkbCommonSupport/private/qxkbcommon_p.h 5.15.17+dfsg-1/include/QtXkbCommonSupport/5.15.17/QtXkbCommonSupport/private/qxkbcommon_p.h
--- 5.15.15+dfsg-2/include/QtXkbCommonSupport/5.15.17/QtXkbCommonSupport/private/qxkbcommon_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtXkbCommonSupport/5.15.17/QtXkbCommonSupport/private/qxkbcommon_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/platformsupport/input/xkbcommon/qxkbcommon_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtXkbCommonSupport/qtxkbcommonsupportversion.h 5.15.17+dfsg-1/include/QtXkbCommonSupport/qtxkbcommonsupportversion.h
--- 5.15.15+dfsg-2/include/QtXkbCommonSupport/qtxkbcommonsupportversion.h	2024-08-16 06:16:13.045251000 +0000
+++ 5.15.17+dfsg-1/include/QtXkbCommonSupport/qtxkbcommonsupportversion.h	2025-02-26 11:02:59.263809400 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTXKBCOMMONSUPPORT_VERSION_H
 #define QT_QTXKBCOMMONSUPPORT_VERSION_H
 
-#define QTXKBCOMMONSUPPORT_VERSION_STR "5.15.15"
+#define QTXKBCOMMONSUPPORT_VERSION_STR "5.15.17"
 
-#define QTXKBCOMMONSUPPORT_VERSION 0x050F0F
+#define QTXKBCOMMONSUPPORT_VERSION 0x050F11
 
 #endif // QT_QTXKBCOMMONSUPPORT_VERSION_H
diff -pruN 5.15.15+dfsg-2/include/QtXml/5.15.15/QtXml/private/qdom_p.h 5.15.17+dfsg-1/include/QtXml/5.15.15/QtXml/private/qdom_p.h
--- 5.15.15+dfsg-2/include/QtXml/5.15.15/QtXml/private/qdom_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtXml/5.15.15/QtXml/private/qdom_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/xml/dom/qdom_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtXml/5.15.15/QtXml/private/qdomhelpers_p.h 5.15.17+dfsg-1/include/QtXml/5.15.15/QtXml/private/qdomhelpers_p.h
--- 5.15.15+dfsg-2/include/QtXml/5.15.15/QtXml/private/qdomhelpers_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtXml/5.15.15/QtXml/private/qdomhelpers_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/xml/dom/qdomhelpers_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtXml/5.15.15/QtXml/private/qxml_p.h 5.15.17+dfsg-1/include/QtXml/5.15.15/QtXml/private/qxml_p.h
--- 5.15.15+dfsg-2/include/QtXml/5.15.15/QtXml/private/qxml_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtXml/5.15.15/QtXml/private/qxml_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-#include "../../../../../src/xml/sax/qxml_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtXml/5.15.17/QtXml/private/qdom_p.h 5.15.17+dfsg-1/include/QtXml/5.15.17/QtXml/private/qdom_p.h
--- 5.15.15+dfsg-2/include/QtXml/5.15.17/QtXml/private/qdom_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtXml/5.15.17/QtXml/private/qdom_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/xml/dom/qdom_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtXml/5.15.17/QtXml/private/qdomhelpers_p.h 5.15.17+dfsg-1/include/QtXml/5.15.17/QtXml/private/qdomhelpers_p.h
--- 5.15.15+dfsg-2/include/QtXml/5.15.17/QtXml/private/qdomhelpers_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtXml/5.15.17/QtXml/private/qdomhelpers_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/xml/dom/qdomhelpers_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtXml/5.15.17/QtXml/private/qxml_p.h 5.15.17+dfsg-1/include/QtXml/5.15.17/QtXml/private/qxml_p.h
--- 5.15.15+dfsg-2/include/QtXml/5.15.17/QtXml/private/qxml_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/include/QtXml/5.15.17/QtXml/private/qxml_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1 @@
+#include "../../../../../src/xml/sax/qxml_p.h"
diff -pruN 5.15.15+dfsg-2/include/QtXml/qtxmlversion.h 5.15.17+dfsg-1/include/QtXml/qtxmlversion.h
--- 5.15.15+dfsg-2/include/QtXml/qtxmlversion.h	2024-08-16 06:16:12.901250100 +0000
+++ 5.15.17+dfsg-1/include/QtXml/qtxmlversion.h	2025-02-26 11:02:59.279809500 +0000
@@ -2,8 +2,8 @@
 #ifndef QT_QTXML_VERSION_H
 #define QT_QTXML_VERSION_H
 
-#define QTXML_VERSION_STR "5.15.15"
+#define QTXML_VERSION_STR "5.15.17"
 
-#define QTXML_VERSION 0x050F0F
+#define QTXML_VERSION 0x050F11
 
 #endif // QT_QTXML_VERSION_H
diff -pruN 5.15.15+dfsg-2/mkspecs/common/macx.conf 5.15.17+dfsg-1/mkspecs/common/macx.conf
--- 5.15.15+dfsg-2/mkspecs/common/macx.conf	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/mkspecs/common/macx.conf	2024-11-20 13:56:33.000000000 +0000
@@ -11,7 +11,7 @@ QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.13
 # older SDKs we have to keep this.
 QT_MAC_SDK_VERSION_MIN = 10.14
 
-QT_MAC_SDK_VERSION_MAX = 13
+QT_MAC_SDK_VERSION_MAX = 14
 
 device.sdk = macosx
 device.target = device
diff -pruN 5.15.15+dfsg-2/mkspecs/features/qt_module.prf 5.15.17+dfsg-1/mkspecs/features/qt_module.prf
--- 5.15.15+dfsg-2/mkspecs/features/qt_module.prf	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/mkspecs/features/qt_module.prf	2024-11-20 13:56:33.000000000 +0000
@@ -233,15 +233,8 @@ android: CONFIG += qt_android_deps no_li
 
         current = Qt_$$QT_MAJOR_VERSION
         verscript_content += "$$current { *; };"
-        isEmpty(QT_NAMESPACE): tag_symbol = qt_version_tag
-        else:                  tag_symbol = qt_version_tag_$$QT_NAMESPACE
 
-        for(i, 0..$$QT_MINOR_VERSION) {
-            previous = $$current
-            current = Qt_$${QT_MAJOR_VERSION}.$$i
-            equals(i, $$QT_MINOR_VERSION): verscript_content += "$$current { $$tag_symbol; } $$previous;"
-            else:                          verscript_content += "$$current {} $$previous;"
-        }
+        !isEmpty(MODULE_VERSCRIPT_CONTENT_EXT): verscript_content += $$MODULE_VERSCRIPT_CONTENT_EXT
 
         # Add a post-processing step to replace the @FILE:filename@
         verscript_in = $${verscript}.in
diff -pruN 5.15.15+dfsg-2/mkspecs/features/toolchain.prf 5.15.17+dfsg-1/mkspecs/features/toolchain.prf
--- 5.15.15+dfsg-2/mkspecs/features/toolchain.prf	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/mkspecs/features/toolchain.prf	2024-11-20 13:56:33.000000000 +0000
@@ -288,9 +288,12 @@ isEmpty($${target_prefix}.INCDIRS) {
                 }
             }
         }
-        isEmpty(QMAKE_DEFAULT_LIBDIRS)|isEmpty(QMAKE_DEFAULT_INCDIRS): \
+        isEmpty(QMAKE_DEFAULT_INCDIRS): \
             !integrity: \
-                error("failed to parse default search paths from compiler output")
+                error("failed to parse default include paths from compiler output")
+        isEmpty(QMAKE_DEFAULT_LIBDIRS): \
+            !integrity:!darwin: \
+                error("failed to parse default library paths from compiler output")
         QMAKE_DEFAULT_LIBDIRS = $$unique(QMAKE_DEFAULT_LIBDIRS)
     } else: ghs {
         cmd = $$QMAKE_CXX $$QMAKE_CXXFLAGS -$${LITERAL_HASH} -o /tmp/fake_output /tmp/fake_input.cpp
@@ -412,7 +415,7 @@ isEmpty($${target_prefix}.INCDIRS) {
         QMAKE_DEFAULT_INCDIRS = $$split(INCLUDE, $$QMAKE_DIRLIST_SEP)
     }
 
-    unix:if(!cross_compile|host_build) {
+    unix:!darwin:if(!cross_compile|host_build) {
         isEmpty(QMAKE_DEFAULT_INCDIRS): QMAKE_DEFAULT_INCDIRS = /usr/include /usr/local/include
         isEmpty(QMAKE_DEFAULT_LIBDIRS): QMAKE_DEFAULT_LIBDIRS = /lib /usr/lib
     }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/README 5.15.17+dfsg-1/src/3rdparty/freetype/README
--- 5.15.15+dfsg-2/src/3rdparty/freetype/README	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/README	2024-11-20 13:56:33.000000000 +0000
@@ -1,4 +1,4 @@
-FreeType 2.13.1
+FreeType 2.13.2
 ===============
 
 Homepage: https://www.freetype.org
@@ -32,9 +32,9 @@ sites.  Go to
 
 and download one of the following files.
 
-  freetype-doc-2.13.1.tar.xz
-  freetype-doc-2.13.1.tar.gz
-  ftdoc2131.zip
+  freetype-doc-2.13.2.tar.xz
+  freetype-doc-2.13.2.tar.gz
+  ftdoc2132.zip
 
 To view the documentation online, go to
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/docs/CHANGES 5.15.17+dfsg-1/src/3rdparty/freetype/docs/CHANGES
--- 5.15.15+dfsg-2/src/3rdparty/freetype/docs/CHANGES	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/docs/CHANGES	2024-11-20 13:56:33.000000000 +0000
@@ -1,3 +1,17 @@
+CHANGES BETWEEN 2.13.1 and 2.13.2 (2023-Aug-25)
+
+  I. MISCELLANEOUS
+
+  - Better support for CFF2 variation fonts.
+
+  - TrueType interpreter  version 38 (also known  as 'Infinality') has
+    been removed.
+
+  - Improved OpenVMS support.
+
+
+======================================================================
+
 CHANGES BETWEEN 2.13.0 and 2.13.1 (2023-Jun-24)
 
   I. MISCELLANEOUS
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/include/dlg/dlg.h 5.15.17+dfsg-1/src/3rdparty/freetype/include/dlg/dlg.h
--- 5.15.15+dfsg-2/src/3rdparty/freetype/include/dlg/dlg.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/include/dlg/dlg.h	2024-11-20 13:56:33.000000000 +0000
@@ -85,6 +85,13 @@
 	#endif
 #endif
 
+// This macro is used when an assertion fails. It gets the source expression
+// and can return an alternative (that must stay alive).
+// Mainly useful to execute something on failed assertion.
+#ifndef DLG_FAILED_ASSERTION_TEXT
+	#define DLG_FAILED_ASSERTION_TEXT(x) x
+#endif
+
 // - utility -
 // two methods needed since cplusplus does not support compound literals
 // and c does not support uniform initialization/initializer lists
@@ -131,83 +138,12 @@ struct dlg_origin {
 // Type of the output handler, see dlg_set_handler.
 typedef void(*dlg_handler)(const struct dlg_origin* origin, const char* string, void* data);
 
-#ifdef DLG_DISABLE
+#ifndef DLG_DISABLE
 	// Tagged/Untagged logging with variable level
 	// Tags must always be in the format `("tag1", "tag2")` (including brackets)
-	#define dlg_log(level, ...)
-	#define dlg_logt(level, tags, ...)
-
-	// Dynamic level assert macros in various versions for additional arguments
-	#define dlg_assertl(level, expr) // assert without tags/message
-	#define dlg_assertlt(level, tags, expr) // assert with tags
-	#define dlg_assertlm(level, expr, ...) // assert with message
-	#define dlg_assertltm(level, tags, expr, ...) // assert with tags & message
-
-	// Sets the handler that is responsible for formatting and outputting log calls.
-	// This function is not thread safe and the handler is set globally.
-	// The handler itself must not change dlg tags or call a dlg macro (if it
-	// does so, the provided string or tags array in 'origin' might get invalid).
-	// The handler can also be used for various other things such as dealing
-	// with failed assertions or filtering calls based on the passed tags.
-	// The default handler is dlg_default_output (see its doc for more info).
-	// If using c++ make sure the registered handler cannot throw e.g. by
-	// wrapping everything into a try-catch blog.
-	inline void dlg_set_handler(dlg_handler handler, void* data) {
-		(void) handler;
-		(void) data;
-	}
-
-	// Returns the currently active dlg handler and sets `data` to
-	// its user data pointer. `data` must not be NULL.
-	// Useful to create handler chains.
-	// This function is not threadsafe, i.e. retrieving the handler while
-	// changing it from another thread is unsafe.
-	// See `dlg_set_handler`.
-	inline dlg_handler dlg_get_handler(void** data) {
-		*data = NULL;
-		return NULL;
-	}
-
-	// The default output handler.
-	// Only use this to reset the output handler, prefer to use
-	// dlg_generic_output (from output.h) which this function simply calls.
-	// It also flushes the stream used and correctly outputs even from multiple threads.
-	inline void dlg_default_output(const struct dlg_origin* o, const char* str, void* data) {
-		(void) o;
-		(void) str;
-		(void) data;
-	}
-
-	// Adds the given tag associated with the given function to the thread specific list.
-	// If func is not NULL the tag will only applied to calls from the same function.
-	// Remove the tag again calling dlg_remove_tag (with exactly the same pointers!).
-	// Does not check if the tag is already present.
-	inline void dlg_add_tag(const char* tag, const char* func) {
-		(void) tag;
-		(void) func;
-	}
-
-	// Removes a tag added with dlg_add_tag (has no effect for tags no present).
-	// The pointers must be exactly the same pointers that were supplied to dlg_add_tag,
-	// this function will not check using strcmp. When the same tag/func combination
-	// is added multiple times, this function remove exactly one candidate, it is
-	// undefined which. Returns whether a tag was found (and removed).
-	inline bool dlg_remove_tag(const char* tag, const char* func) {
-		(void) tag;
-		(void) func;
-		return true;
-	}
-
-	// Returns the thread-specific buffer and its size for dlg.
-	// The buffer should only be used by formatting functions.
-	// The buffer can be reallocated and the size changed, just make sure
-	// to update both values correctly.
-	inline char** dlg_thread_buffer(size_t** size) {
-		(void) size;
-		return NULL;
-	}
-
-#else // DLG_DISABLE
+	// Example usages:
+	//   dlg_log(dlg_level_warning, "test 1")
+	//   dlg_logt(("tag1, "tag2"), dlg_level_debug, "test %d", 2)
 	#define dlg_log(level, ...) if(level >= DLG_LOG_LEVEL) \
 		dlg__do_log(level, DLG_CREATE_TAGS(NULL), DLG_FILE, __LINE__, __func__,  \
 		DLG_FMT_FUNC(__VA_ARGS__), NULL)
@@ -215,23 +151,31 @@ typedef void(*dlg_handler)(const struct
 		dlg__do_log(level, DLG_CREATE_TAGS tags, DLG_FILE, __LINE__, __func__, \
 		DLG_FMT_FUNC(__VA_ARGS__), NULL)
 
+	// Dynamic level assert macros in various versions for additional arguments
+	// Example usages:
+	//   dlg_assertl(dlg_level_warning, data != nullptr);
+	//   dlg_assertlt(("tag1, "tag2"), dlg_level_trace, data != nullptr);
+	//   dlg_asserttlm(("tag1), dlg_level_warning, data != nullptr, "Data must not be null");
+	//   dlg_assertlm(dlg_level_error, data != nullptr, "Data must not be null");
 	#define dlg_assertl(level, expr) if(level >= DLG_ASSERT_LEVEL && !(expr)) \
-		dlg__do_log(level, DLG_CREATE_TAGS(NULL), DLG_FILE, __LINE__, __func__, NULL, #expr)
+		dlg__do_log(level, DLG_CREATE_TAGS(NULL), DLG_FILE, __LINE__, __func__, NULL, \
+			DLG_FAILED_ASSERTION_TEXT(#expr))
 	#define dlg_assertlt(level, tags, expr) if(level >= DLG_ASSERT_LEVEL && !(expr)) \
-		dlg__do_log(level, DLG_CREATE_TAGS tags, DLG_FILE, __LINE__, __func__, NULL, #expr)
+		dlg__do_log(level, DLG_CREATE_TAGS tags, DLG_FILE, __LINE__, __func__, NULL, \
+			DLG_FAILED_ASSERTION_TEXT(#expr))
 	#define dlg_assertlm(level, expr, ...) if(level >= DLG_ASSERT_LEVEL && !(expr)) \
 		dlg__do_log(level, DLG_CREATE_TAGS(NULL), DLG_FILE, __LINE__, __func__,  \
-		DLG_FMT_FUNC(__VA_ARGS__), #expr)
+			DLG_FMT_FUNC(__VA_ARGS__), DLG_FAILED_ASSERTION_TEXT(#expr))
 	#define dlg_assertltm(level, tags, expr, ...) if(level >= DLG_ASSERT_LEVEL && !(expr)) \
 		dlg__do_log(level, DLG_CREATE_TAGS tags, DLG_FILE, __LINE__,  \
-		__func__, DLG_FMT_FUNC(__VA_ARGS__), #expr)
+			__func__, DLG_FMT_FUNC(__VA_ARGS__), DLG_FAILED_ASSERTION_TEXT(#expr))
 
-	DLG_API void dlg_set_handler(dlg_handler handler, void* data);
-	DLG_API dlg_handler dlg_get_handler(void** data);
-	DLG_API void dlg_default_output(const struct dlg_origin*, const char* string, void*);
-	DLG_API void dlg_add_tag(const char* tag, const char* func);
-	DLG_API bool dlg_remove_tag(const char* tag, const char* func);
-	DLG_API char** dlg_thread_buffer(size_t** size);
+	#define dlg__assert_or(level, tags, expr, code, msg) if(!(expr)) {\
+			if(level >= DLG_ASSERT_LEVEL) \
+				dlg__do_log(level, tags, DLG_FILE, __LINE__, __func__, msg, \
+					DLG_FAILED_ASSERTION_TEXT(#expr)); \
+			code; \
+		} (void) NULL
 
 	// - Private interface: not part of the abi/api but needed in macros -
 	// Formats the given format string and arguments as printf would, uses the thread buffer.
@@ -239,8 +183,66 @@ typedef void(*dlg_handler)(const struct
 	DLG_API void dlg__do_log(enum dlg_level lvl, const char* const*, const char*, int,
 		const char*, const char*, const char*);
 	DLG_API const char* dlg__strip_root_path(const char* file, const char* base);
+
+#else // DLG_DISABLE
+
+	#define dlg_log(level, ...)
+	#define dlg_logt(level, tags, ...)
+
+	#define dlg_assertl(level, expr) // assert without tags/message
+	#define dlg_assertlt(level, tags, expr) // assert with tags
+	#define dlg_assertlm(level, expr, ...) // assert with message
+	#define dlg_assertltm(level, tags, expr, ...) // assert with tags & message
+
+	#define dlg__assert_or(level, tags, expr, code, msg) if(!(expr)) { code; } (void) NULL
 #endif // DLG_DISABLE
 
+// The API below is independent from DLG_DISABLE
+
+// Sets the handler that is responsible for formatting and outputting log calls.
+// This function is not thread safe and the handler is set globally.
+// The handler itself must not change dlg tags or call a dlg macro (if it
+// does so, the provided string or tags array in 'origin' might get invalid).
+// The handler can also be used for various other things such as dealing
+// with failed assertions or filtering calls based on the passed tags.
+// The default handler is dlg_default_output (see its doc for more info).
+// If using c++ make sure the registered handler cannot throw e.g. by
+// wrapping everything into a try-catch blog.
+DLG_API void dlg_set_handler(dlg_handler handler, void* data);
+
+// The default output handler.
+// Only use this to reset the output handler, prefer to use
+// dlg_generic_output (from output.h) which this function simply calls.
+// It also flushes the stream used and correctly outputs even from multiple threads.
+DLG_API void dlg_default_output(const struct dlg_origin*, const char* string, void*);
+
+// Returns the currently active dlg handler and sets `data` to
+// its user data pointer. `data` must not be NULL.
+// Useful to create handler chains.
+// This function is not threadsafe, i.e. retrieving the handler while
+// changing it from another thread is unsafe.
+// See `dlg_set_handler`.
+DLG_API dlg_handler dlg_get_handler(void** data);
+
+// Adds the given tag associated with the given function to the thread specific list.
+// If func is not NULL the tag will only applied to calls from the same function.
+// Remove the tag again calling dlg_remove_tag (with exactly the same pointers!).
+// Does not check if the tag is already present.
+DLG_API void dlg_add_tag(const char* tag, const char* func);
+
+// Removes a tag added with dlg_add_tag (has no effect for tags no present).
+// The pointers must be exactly the same pointers that were supplied to dlg_add_tag,
+// this function will not check using strcmp. When the same tag/func combination
+// is added multiple times, this function remove exactly one candidate, it is
+// undefined which. Returns whether a tag was found (and removed).
+DLG_API bool dlg_remove_tag(const char* tag, const char* func);
+
+// Returns the thread-specific buffer and its size for dlg.
+// The buffer should only be used by formatting functions.
+// The buffer can be reallocated and the size changed, just make sure
+// to update both values correctly.
+DLG_API char** dlg_thread_buffer(size_t** size);
+
 // Untagged leveled logging
 #define dlg_trace(...) dlg_log(dlg_level_trace, __VA_ARGS__)
 #define dlg_debug(...) dlg_log(dlg_level_debug, __VA_ARGS__)
@@ -263,6 +265,24 @@ typedef void(*dlg_handler)(const struct
 #define dlg_assertm(expr, ...) dlg_assertlm(DLG_DEFAULT_ASSERT, expr, __VA_ARGS__)
 #define dlg_asserttm(tags, expr, ...) dlg_assertltm(DLG_DEFAULT_ASSERT, tags, expr, __VA_ARGS__)
 
+// If (expr) does not evaluate to true, always executes 'code' (no matter what
+// DLG_ASSERT_LEVEL is or if dlg is disabled or not).
+// When dlg is enabled and the level is greater or equal to DLG_ASSERT_LEVEL,
+// logs the failed assertion.
+// Example usages:
+//   dlg_assertl_or(dlg_level_warn, data != nullptr, return);
+//   dlg_assertlm_or(dlg_level_fatal, data != nullptr, return, "Data must not be null");
+//   dlg_assert_or(data != nullptr, logError(); return false);
+#define dlg_assertltm_or(level, tags, expr, code, ...) dlg__assert_or(level, \
+		DLG_CREATE_TAGS tags, expr, code, DLG_FMT_FUNC(__VA_ARGS__))
+#define dlg_assertlm_or(level, expr, code, ...) dlg__assert_or(level, \
+		DLG_CREATE_TAGS(NULL), expr, code, DLG_FMT_FUNC(__VA_ARGS__))
+#define dlg_assertl_or(level, expr, code) dlg__assert_or(level, \
+		DLG_CREATE_TAGS(NULL), expr, code, NULL)
+
+#define dlg_assert_or(expr, code) dlg_assertl_or(DLG_DEFAULT_ASSERT, expr, code)
+#define dlg_assertm_or(expr, code, ...) dlg_assertlm_or(DLG_DEFAULT_ASSERT, expr, code, __VA_ARGS__)
+
 #ifdef __cplusplus
 }
 #endif
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/include/freetype/freetype.h 5.15.17+dfsg-1/src/3rdparty/freetype/include/freetype/freetype.h
--- 5.15.15+dfsg-2/src/3rdparty/freetype/include/freetype/freetype.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/include/freetype/freetype.h	2024-11-20 13:56:33.000000000 +0000
@@ -5222,7 +5222,7 @@ FT_BEGIN_HEADER
    */
 #define FREETYPE_MAJOR  2
 #define FREETYPE_MINOR  13
-#define FREETYPE_PATCH  1
+#define FREETYPE_PATCH  2
 
 
   /**************************************************************************
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/include/freetype/internal/ftcalc.h 5.15.17+dfsg-1/src/3rdparty/freetype/include/freetype/internal/ftcalc.h
--- 5.15.15+dfsg-2/src/3rdparty/freetype/include/freetype/internal/ftcalc.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/include/freetype/internal/ftcalc.h	2024-11-20 13:56:33.000000000 +0000
@@ -332,9 +332,9 @@ FT_BEGIN_HEADER
    * Based on geometric considerations we use the following inequality to
    * identify a degenerate matrix.
    *
-   *   50 * abs(xx*yy - xy*yx) < xx^2 + xy^2 + yx^2 + yy^2
+   *   32 * abs(xx*yy - xy*yx) < xx^2 + xy^2 + yx^2 + yy^2
    *
-   * Value 50 is heuristic.
+   * Value 32 is heuristic.
    */
   FT_BASE( FT_Bool )
   FT_Matrix_Check( const FT_Matrix*  matrix );
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/include/freetype/internal/tttypes.h 5.15.17+dfsg-1/src/3rdparty/freetype/include/freetype/internal/tttypes.h
--- 5.15.15+dfsg-2/src/3rdparty/freetype/include/freetype/internal/tttypes.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/include/freetype/internal/tttypes.h	2024-11-20 13:56:33.000000000 +0000
@@ -1394,14 +1394,6 @@ FT_BEGIN_HEADER
    *   vert_metrics_offset ::
    *     The file offset of the 'vmtx' table.
    *
-   *   sph_found_func_flags ::
-   *     Flags identifying special bytecode functions (used by the v38
-   *     implementation of the bytecode interpreter).
-   *
-   *   sph_compatibility_mode ::
-   *     This flag is set if we are in ClearType backward compatibility mode
-   *     (used by the v38 implementation of the bytecode interpreter).
-   *
    *   ebdt_start ::
    *     The file offset of the sbit data table (CBDT, bdat, etc.).
    *
@@ -1597,13 +1589,6 @@ FT_BEGIN_HEADER
     FT_ULong              horz_metrics_offset;
     FT_ULong              vert_metrics_offset;
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    /* since 2.4.12 */
-    FT_ULong              sph_found_func_flags; /* special functions found */
-                                                /* for this face           */
-    FT_Bool               sph_compatibility_mode;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
 #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
     /* since 2.7 */
     FT_ULong              ebdt_start;  /* either `CBDT', `EBDT', or `bdat' */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/qt_attribution.json 5.15.17+dfsg-1/src/3rdparty/freetype/qt_attribution.json
--- 5.15.15+dfsg-2/src/3rdparty/freetype/qt_attribution.json	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/qt_attribution.json	2024-11-20 13:56:33.000000000 +0000
@@ -7,8 +7,7 @@
 
         "Description": "FreeType is a freely available software library to render fonts.",
         "Homepage": "http://www.freetype.org",
-        "Version": "2.13.0",
-
+        "Version": "2.13.2",
         "License": "Freetype Project License or GNU General Public License v2.0 only",
         "LicenseId": "FTL OR GPL-2.0",
         "LicenseFile": "LICENSE.txt",
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/autofit/afcjk.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/autofit/afcjk.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/autofit/afcjk.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/autofit/afcjk.c	2024-11-20 13:56:33.000000000 +0000
@@ -1634,7 +1634,7 @@
 
     stem_edge->pos = base_edge->pos + fitted_width;
 
-    FT_TRACE5(( "  CJKLINK: edge %ld @%d (opos=%.2f) linked to %.2f,"
+    FT_TRACE5(( "  CJKLINK: edge %td @%d (opos=%.2f) linked to %.2f,"
                 " dist was %.2f, now %.2f\n",
                 stem_edge - hints->axis[dim].edges, stem_edge->fpos,
                 (double)stem_edge->opos / 64,
@@ -1858,7 +1858,7 @@
           continue;
 
 #ifdef FT_DEBUG_LEVEL_TRACE
-        FT_TRACE5(( "  CJKBLUE: edge %ld @%d (opos=%.2f) snapped to %.2f,"
+        FT_TRACE5(( "  CJKBLUE: edge %td @%d (opos=%.2f) snapped to %.2f,"
                     " was %.2f\n",
                     edge1 - edges, edge1->fpos, (double)edge1->opos / 64,
                     (double)blue->fit / 64, (double)edge1->pos / 64 ));
@@ -1922,7 +1922,7 @@
       /* this should not happen, but it's better to be safe */
       if ( edge2->blue_edge )
       {
-        FT_TRACE5(( "ASSERTION FAILED for edge %ld\n", edge2-edges ));
+        FT_TRACE5(( "ASSERTION FAILED for edge %td\n", edge2 - edges ));
 
         af_cjk_align_linked_edge( hints, dim, edge2, edge );
         edge->flags |= AF_EDGE_DONE;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/autofit/aflatin.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/autofit/aflatin.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/autofit/aflatin.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/autofit/aflatin.c	2024-11-20 13:56:33.000000000 +0000
@@ -1022,7 +1022,7 @@
         {
           *a = *b;
           FT_TRACE5(( "blue zone overlap:"
-                      " adjusting %s %ld to %ld\n",
+                      " adjusting %s %td to %ld\n",
                       a_is_top ? "overshoot" : "reference",
                       blue_sorted[i] - axis->blues,
                       *a ));
@@ -2960,7 +2960,7 @@
 
     stem_edge->pos = base_edge->pos + fitted_width;
 
-    FT_TRACE5(( "  LINK: edge %ld (opos=%.2f) linked to %.2f,"
+    FT_TRACE5(( "  LINK: edge %td (opos=%.2f) linked to %.2f,"
                 " dist was %.2f, now %.2f\n",
                 stem_edge - hints->axis[dim].edges,
                 (double)stem_edge->opos / 64, (double)stem_edge->pos / 64,
@@ -3085,13 +3085,13 @@
 
 #ifdef FT_DEBUG_LEVEL_TRACE
         if ( !anchor )
-          FT_TRACE5(( "  BLUE_ANCHOR: edge %ld (opos=%.2f) snapped to %.2f,"
-                      " was %.2f (anchor=edge %ld)\n",
+          FT_TRACE5(( "  BLUE_ANCHOR: edge %td (opos=%.2f) snapped to %.2f,"
+                      " was %.2f (anchor=edge %td)\n",
                       edge1 - edges,
                       (double)edge1->opos / 64, (double)blue->fit / 64,
                       (double)edge1->pos / 64, edge - edges ));
         else
-          FT_TRACE5(( "  BLUE: edge %ld (opos=%.2f) snapped to %.2f,"
+          FT_TRACE5(( "  BLUE: edge %td (opos=%.2f) snapped to %.2f,"
                       " was %.2f\n",
                       edge1 - edges,
                       (double)edge1->opos / 64, (double)blue->fit / 64,
@@ -3141,7 +3141,7 @@
       /* this should not happen, but it's better to be safe */
       if ( edge2->blue_edge )
       {
-        FT_TRACE5(( "  ASSERTION FAILED for edge %ld\n", edge2 - edges ));
+        FT_TRACE5(( "  ASSERTION FAILED for edge %td\n", edge2 - edges ));
 
         af_latin_align_linked_edge( hints, dim, edge2, edge );
         edge->flags |= AF_EDGE_DONE;
@@ -3209,7 +3209,7 @@
         anchor       = edge;
         edge->flags |= AF_EDGE_DONE;
 
-        FT_TRACE5(( "  ANCHOR: edge %ld (opos=%.2f) and %ld (opos=%.2f)"
+        FT_TRACE5(( "  ANCHOR: edge %td (opos=%.2f) and %td (opos=%.2f)"
                     " snapped to %.2f and %.2f\n",
                     edge - edges, (double)edge->opos / 64,
                     edge2 - edges, (double)edge2->opos / 64,
@@ -3238,7 +3238,7 @@
 
         if ( edge2->flags & AF_EDGE_DONE )
         {
-          FT_TRACE5(( "  ADJUST: edge %ld (pos=%.2f) moved to %.2f\n",
+          FT_TRACE5(( "  ADJUST: edge %td (pos=%.2f) moved to %.2f\n",
                       edge - edges, (double)edge->pos / 64,
                       (double)( edge2->pos - cur_len ) / 64 ));
 
@@ -3279,7 +3279,7 @@
           edge->pos  = cur_pos1 - cur_len / 2;
           edge2->pos = cur_pos1 + cur_len / 2;
 
-          FT_TRACE5(( "  STEM: edge %ld (opos=%.2f) linked to %ld (opos=%.2f)"
+          FT_TRACE5(( "  STEM: edge %td (opos=%.2f) linked to %td (opos=%.2f)"
                       " snapped to %.2f and %.2f\n",
                       edge - edges, (double)edge->opos / 64,
                       edge2 - edges, (double)edge2->opos / 64,
@@ -3310,7 +3310,7 @@
           edge->pos  = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2;
           edge2->pos = edge->pos + cur_len;
 
-          FT_TRACE5(( "  STEM: edge %ld (opos=%.2f) linked to %ld (opos=%.2f)"
+          FT_TRACE5(( "  STEM: edge %td (opos=%.2f) linked to %td (opos=%.2f)"
                       " snapped to %.2f and %.2f\n",
                       edge - edges, (double)edge->opos / 64,
                       edge2 - edges, (double)edge2->opos / 64,
@@ -3333,7 +3333,7 @@
           if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 )
           {
 #ifdef FT_DEBUG_LEVEL_TRACE
-            FT_TRACE5(( "  BOUND: edge %ld (pos=%.2f) moved to %.2f\n",
+            FT_TRACE5(( "  BOUND: edge %td (pos=%.2f) moved to %.2f\n",
                         edge - edges,
                         (double)edge->pos / 64,
                         (double)edge[-1].pos / 64 ));
@@ -3435,7 +3435,7 @@
         if ( delta < 64 + 16 )
         {
           af_latin_align_serif_edge( hints, edge->serif, edge );
-          FT_TRACE5(( "  SERIF: edge %ld (opos=%.2f) serif to %ld (opos=%.2f)"
+          FT_TRACE5(( "  SERIF: edge %td (opos=%.2f) serif to %td (opos=%.2f)"
                       " aligned to %.2f\n",
                       edge - edges, (double)edge->opos / 64,
                       edge->serif - edges, (double)edge->serif->opos / 64,
@@ -3445,9 +3445,9 @@
         {
           edge->pos = FT_PIX_ROUND( edge->opos );
           anchor    = edge;
-          FT_TRACE5(( "  SERIF_ANCHOR: edge %ld (opos=%.2f)"
+          FT_TRACE5(( "  SERIF_ANCHOR: edge %td (opos=%.2f)"
                       " snapped to %.2f\n",
-                      edge-edges,
+                      edge - edges,
                       (double)edge->opos / 64, (double)edge->pos / 64 ));
         }
         else
@@ -3474,8 +3474,8 @@
                                      after->pos - before->pos,
                                      after->opos - before->opos );
 
-            FT_TRACE5(( "  SERIF_LINK1: edge %ld (opos=%.2f) snapped to %.2f"
-                        " from %ld (opos=%.2f)\n",
+            FT_TRACE5(( "  SERIF_LINK1: edge %td (opos=%.2f) snapped to %.2f"
+                        " from %td (opos=%.2f)\n",
                         edge - edges, (double)edge->opos / 64,
                         (double)edge->pos / 64,
                         before - edges, (double)before->opos / 64 ));
@@ -3484,7 +3484,7 @@
           {
             edge->pos = anchor->pos +
                         ( ( edge->opos - anchor->opos + 16 ) & ~31 );
-            FT_TRACE5(( "  SERIF_LINK2: edge %ld (opos=%.2f)"
+            FT_TRACE5(( "  SERIF_LINK2: edge %td (opos=%.2f)"
                         " snapped to %.2f\n",
                         edge - edges,
                         (double)edge->opos / 64, (double)edge->pos / 64 ));
@@ -3505,7 +3505,7 @@
           if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 )
           {
 #ifdef FT_DEBUG_LEVEL_TRACE
-            FT_TRACE5(( "  BOUND: edge %ld (pos=%.2f) moved to %.2f\n",
+            FT_TRACE5(( "  BOUND: edge %td (pos=%.2f) moved to %.2f\n",
                         edge - edges,
                         (double)edge->pos / 64,
                         (double)edge[-1].pos / 64 ));
@@ -3526,7 +3526,7 @@
           if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 )
           {
 #ifdef FT_DEBUG_LEVEL_TRACE
-            FT_TRACE5(( "  BOUND: edge %ld (pos=%.2f) moved to %.2f\n",
+            FT_TRACE5(( "  BOUND: edge %td (pos=%.2f) moved to %.2f\n",
                         edge - edges,
                         (double)edge->pos / 64,
                         (double)edge[1].pos / 64 ));
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/base/ftcalc.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/base/ftcalc.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/base/ftcalc.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/base/ftcalc.c	2024-11-20 13:56:33.000000000 +0000
@@ -749,65 +749,43 @@
   FT_BASE_DEF( FT_Bool )
   FT_Matrix_Check( const FT_Matrix*  matrix )
   {
-    FT_Matrix  m;
-    FT_Fixed   val[4];
-    FT_Fixed   nonzero_minval, maxval;
-    FT_Fixed   temp1, temp2;
-    FT_UInt    i;
+    FT_Fixed  xx, xy, yx, yy;
+    FT_Fixed  val;
+    FT_Int    shift;
+    FT_ULong  temp1, temp2;
 
 
     if ( !matrix )
       return 0;
 
-    val[0] = FT_ABS( matrix->xx );
-    val[1] = FT_ABS( matrix->xy );
-    val[2] = FT_ABS( matrix->yx );
-    val[3] = FT_ABS( matrix->yy );
-
-    /*
-     * To avoid overflow, we ensure that each value is not larger than
-     *
-     *   int(sqrt(2^31 / 4)) = 23170  ;
-     *
-     * we also check that no value becomes zero if we have to scale.
-     */
+    xx  = matrix->xx;
+    xy  = matrix->xy;
+    yx  = matrix->yx;
+    yy  = matrix->yy;
+    val = FT_ABS( xx ) | FT_ABS( xy ) | FT_ABS( yx ) | FT_ABS( yy );
 
-    maxval         = 0;
-    nonzero_minval = FT_LONG_MAX;
-
-    for ( i = 0; i < 4; i++ )
-    {
-      if ( val[i] > maxval )
-        maxval = val[i];
-      if ( val[i] && val[i] < nonzero_minval )
-        nonzero_minval = val[i];
-    }
-
-    /* we only handle 32bit values */
-    if ( maxval > 0x7FFFFFFFL )
+    /* we only handle non-zero 32-bit values */
+    if ( !val || val > 0x7FFFFFFFL )
       return 0;
 
-    if ( maxval > 23170 )
-    {
-      FT_Fixed  scale = FT_DivFix( maxval, 23170 );
-
+    /* Scale matrix to avoid the temp1 overflow, which is */
+    /* more stringent than avoiding the temp2 overflow.   */
 
-      if ( !FT_DivFix( nonzero_minval, scale ) )
-        return 0;    /* value range too large */
+    shift = FT_MSB( val ) - 12;
 
-      m.xx = FT_DivFix( matrix->xx, scale );
-      m.xy = FT_DivFix( matrix->xy, scale );
-      m.yx = FT_DivFix( matrix->yx, scale );
-      m.yy = FT_DivFix( matrix->yy, scale );
+    if ( shift > 0 )
+    {
+      xx >>= shift;
+      xy >>= shift;
+      yx >>= shift;
+      yy >>= shift;
     }
-    else
-      m = *matrix;
 
-    temp1 = FT_ABS( m.xx * m.yy - m.xy * m.yx );
-    temp2 = m.xx * m.xx + m.xy * m.xy + m.yx * m.yx + m.yy * m.yy;
+    temp1 = 32U * (FT_ULong)FT_ABS( xx * yy - xy * yx );
+    temp2 = (FT_ULong)( xx * xx ) + (FT_ULong)( xy * xy ) +
+            (FT_ULong)( yx * yx ) + (FT_ULong)( yy * yy );
 
-    if ( temp1 == 0         ||
-         temp2 / temp1 > 50 )
+    if ( temp1 <= temp2 )
       return 0;
 
     return 1;
@@ -1092,9 +1070,6 @@
   {
     FT_UInt   i;
     FT_Int64  temp;
-#ifndef FT_INT64
-    FT_Int64  halfUnit;
-#endif
 
 
 #ifdef FT_INT64
@@ -1139,13 +1114,10 @@
       FT_Add64( &temp, &multResult, &temp );
     }
 
-    /* Round value. */
-    halfUnit.hi = 0;
-    halfUnit.lo = 0x8000;
-    FT_Add64( &temp, &halfUnit, &temp );
+    /* Shift and round value. */
+    return (FT_Int32)( ( ( temp.hi << 16 ) | ( temp.lo >> 16 ) )
+                                     + ( 1 & ( temp.lo >> 15 ) ) );
 
-    return (FT_Int32)( ( (FT_Int32)( temp.hi & 0xFFFF ) << 16 ) |
-                                   ( temp.lo >> 16 )            );
 
 #endif /* !FT_INT64 */
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/base/ftobjs.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/base/ftobjs.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/base/ftobjs.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/base/ftobjs.c	2024-11-20 13:56:33.000000000 +0000
@@ -1747,7 +1747,8 @@
     FT_Memory     memory = library->memory;
 
 
-    args.flags = 0;
+    args.driver = NULL;
+    args.flags  = 0;
 
     if ( driver_name )
     {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/base/ftstream.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/base/ftstream.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/base/ftstream.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/base/ftstream.c	2024-11-20 13:56:33.000000000 +0000
@@ -141,7 +141,9 @@
       if ( read_bytes > count )
         read_bytes = count;
 
-      FT_MEM_COPY( buffer, stream->base + pos, read_bytes );
+      /* Allow "reading" zero bytes without UB even if buffer is NULL */
+      if ( count )
+        FT_MEM_COPY( buffer, stream->base + pos, read_bytes );
     }
 
     stream->pos = pos + read_bytes;
@@ -178,7 +180,9 @@
       if ( read_bytes > count )
         read_bytes = count;
 
-      FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes );
+      /* Allow "reading" zero bytes without UB even if buffer is NULL */
+      if ( count )
+        FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes );
     }
 
     stream->pos += read_bytes;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/base/ftver.rc 5.15.17+dfsg-1/src/3rdparty/freetype/src/base/ftver.rc
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/base/ftver.rc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/base/ftver.rc	2024-11-20 13:56:33.000000000 +0000
@@ -18,8 +18,8 @@
 
 #include<windows.h>
 
-#define FT_VERSION      2,13,1,0
-#define FT_VERSION_STR  "2.13.1"
+#define FT_VERSION      2,13,2,0
+#define FT_VERSION_STR  "2.13.2"
 
 VS_VERSION_INFO      VERSIONINFO
 FILEVERSION          FT_VERSION
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/cff/cffload.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/cff/cffload.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/cff/cffload.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/cff/cffload.c	2024-11-20 13:56:33.000000000 +0000
@@ -1361,14 +1361,15 @@
     for ( i = 0; i < numBlends; i++ )
     {
       const FT_Int32*  weight = &blend->BV[1];
-      FT_UInt32        sum;
+      FT_Fixed         sum;
 
 
-      /* convert inputs to 16.16 fixed-point */
-      sum = cff_parse_num( parser, &parser->stack[i + base] ) * 0x10000;
+      /* convert inputs to 16.16 fixed point */
+      sum = cff_parse_fixed( parser, &parser->stack[i + base] );
 
       for ( j = 1; j < blend->lenBV; j++ )
-        sum += cff_parse_num( parser, &parser->stack[delta++] ) * *weight++;
+        sum += FT_MulFix( cff_parse_fixed( parser, &parser->stack[delta++] ),
+                          *weight++ );
 
       /* point parser stack to new value on blend_stack */
       parser->stack[i + base] = subFont->blend_top;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/cff/cffparse.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/cff/cffparse.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/cff/cffparse.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/cff/cffparse.c	2024-11-20 13:56:33.000000000 +0000
@@ -499,6 +499,24 @@
   {
     if ( **d == 30 )
       return cff_parse_real( *d, parser->limit, scaling, NULL );
+    else if ( **d == 255 )
+    {
+      FT_Fixed val = ( ( ( (FT_UInt32)*( d[0] + 1 ) << 24 ) |
+                         ( (FT_UInt32)*( d[0] + 2 ) << 16 ) |
+                         ( (FT_UInt32)*( d[0] + 3 ) <<  8 ) |
+                           (FT_UInt32)*( d[0] + 4 )         ) );
+
+      if ( scaling )
+      {
+        if ( FT_ABS( val ) > power_ten_limits[scaling] )
+        {
+           FT_TRACE4(( "!!!OVERFLOW:!!!" ));
+           return val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL;
+        }
+        val *= power_tens[scaling];
+      }
+      return val;
+    }
     else
     {
       FT_Long  val = cff_parse_integer( *d, parser->limit );
@@ -506,7 +524,7 @@
 
       if ( scaling )
       {
-        if ( FT_ABS( val ) > power_ten_limits[scaling] )
+        if ( ( FT_ABS( val ) << 16 ) > power_ten_limits[scaling] )
         {
           val = val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL;
           goto Overflow;
@@ -536,7 +554,7 @@
 
 
   /* read a floating point number, either integer or real */
-  static FT_Fixed
+  FT_LOCAL_DEF( FT_Fixed )
   cff_parse_fixed( CFF_Parser  parser,
                    FT_Byte**   d )
   {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/cff/cffparse.h 5.15.17+dfsg-1/src/3rdparty/freetype/src/cff/cffparse.h
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/cff/cffparse.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/cff/cffparse.h	2024-11-20 13:56:33.000000000 +0000
@@ -76,6 +76,10 @@ FT_BEGIN_HEADER
   cff_parse_num( CFF_Parser  parser,
                  FT_Byte**   d );
 
+  FT_LOCAL( FT_Fixed )
+  cff_parse_fixed( CFF_Parser  parser,
+                   FT_Byte**   d );
+
   FT_LOCAL( FT_Error )
   cff_parser_init( CFF_Parser  parser,
                    FT_UInt     code,
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/gzip/infback.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/gzip/infback.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/gzip/infback.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/gzip/infback.c	1970-01-01 00:00:00.000000000 +0000
@@ -1,644 +0,0 @@
-/* infback.c -- inflate using a call-back interface
- * Copyright (C) 1995-2022 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/*
-   This code is largely copied from inflate.c.  Normally either infback.o or
-   inflate.o would be linked into an application--not both.  The interface
-   with inffast.c is retained so that optimized assembler-coded versions of
-   inflate_fast() can be used with either inflate.c or infback.c.
- */
-
-#include "zutil.h"
-#include "inftrees.h"
-#include "inflate.h"
-#include "inffast.h"
-
-/* function prototypes */
-local void fixedtables OF((struct inflate_state FAR *state));
-
-/*
-   strm provides memory allocation functions in zalloc and zfree, or
-   Z_NULL to use the library memory allocation functions.
-
-   windowBits is in the range 8..15, and window is a user-supplied
-   window and output buffer that is 2**windowBits bytes.
- */
-int ZEXPORT inflateBackInit_(
-    z_streamp strm,
-    int windowBits,
-    unsigned char FAR *window,
-    const char *version,
-    int stream_size)
-{
-    struct inflate_state FAR *state;
-
-    if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
-        stream_size != (int)(sizeof(z_stream)))
-        return Z_VERSION_ERROR;
-    if (strm == Z_NULL || window == Z_NULL ||
-        windowBits < 8 || windowBits > 15)
-        return Z_STREAM_ERROR;
-    strm->msg = Z_NULL;                 /* in case we return an error */
-    if (strm->zalloc == (alloc_func)0) {
-#ifdef Z_SOLO
-        return Z_STREAM_ERROR;
-#else
-        strm->zalloc = zcalloc;
-        strm->opaque = (voidpf)0;
-#endif
-    }
-    if (strm->zfree == (free_func)0)
-#ifdef Z_SOLO
-        return Z_STREAM_ERROR;
-#else
-    strm->zfree = zcfree;
-#endif
-    state = (struct inflate_state FAR *)ZALLOC(strm, 1,
-                                               sizeof(struct inflate_state));
-    if (state == Z_NULL) return Z_MEM_ERROR;
-    Tracev((stderr, "inflate: allocated\n"));
-    strm->state = (struct internal_state FAR *)state;
-    state->dmax = 32768U;
-    state->wbits = (uInt)windowBits;
-    state->wsize = 1U << windowBits;
-    state->window = window;
-    state->wnext = 0;
-    state->whave = 0;
-    state->sane = 1;
-    return Z_OK;
-}
-
-/*
-   Return state with length and distance decoding tables and index sizes set to
-   fixed code decoding.  Normally this returns fixed tables from inffixed.h.
-   If BUILDFIXED is defined, then instead this routine builds the tables the
-   first time it's called, and returns those tables the first time and
-   thereafter.  This reduces the size of the code by about 2K bytes, in
-   exchange for a little execution time.  However, BUILDFIXED should not be
-   used for threaded applications, since the rewriting of the tables and virgin
-   may not be thread-safe.
- */
-local void fixedtables(
-    struct inflate_state FAR *state)
-{
-#ifdef BUILDFIXED
-    static int virgin = 1;
-    static code *lenfix, *distfix;
-    static code fixed[544];
-
-    /* build fixed huffman tables if first call (may not be thread safe) */
-    if (virgin) {
-        unsigned sym, bits;
-        static code *next;
-
-        /* literal/length table */
-        sym = 0;
-        while (sym < 144) state->lens[sym++] = 8;
-        while (sym < 256) state->lens[sym++] = 9;
-        while (sym < 280) state->lens[sym++] = 7;
-        while (sym < 288) state->lens[sym++] = 8;
-        next = fixed;
-        lenfix = next;
-        bits = 9;
-        inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
-
-        /* distance table */
-        sym = 0;
-        while (sym < 32) state->lens[sym++] = 5;
-        distfix = next;
-        bits = 5;
-        inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
-
-        /* do this just once */
-        virgin = 0;
-    }
-#else /* !BUILDFIXED */
-#   include "inffixed.h"
-#endif /* BUILDFIXED */
-    state->lencode = lenfix;
-    state->lenbits = 9;
-    state->distcode = distfix;
-    state->distbits = 5;
-}
-
-/* Macros for inflateBack(): */
-
-/* Load returned state from inflate_fast() */
-#define LOAD() \
-    do { \
-        put = strm->next_out; \
-        left = strm->avail_out; \
-        next = strm->next_in; \
-        have = strm->avail_in; \
-        hold = state->hold; \
-        bits = state->bits; \
-    } while (0)
-
-/* Set state from registers for inflate_fast() */
-#define RESTORE() \
-    do { \
-        strm->next_out = put; \
-        strm->avail_out = left; \
-        strm->next_in = next; \
-        strm->avail_in = have; \
-        state->hold = hold; \
-        state->bits = bits; \
-    } while (0)
-
-/* Clear the input bit accumulator */
-#define INITBITS() \
-    do { \
-        hold = 0; \
-        bits = 0; \
-    } while (0)
-
-/* Assure that some input is available.  If input is requested, but denied,
-   then return a Z_BUF_ERROR from inflateBack(). */
-#define PULL() \
-    do { \
-        if (have == 0) { \
-            have = in(in_desc, &next); \
-            if (have == 0) { \
-                next = Z_NULL; \
-                ret = Z_BUF_ERROR; \
-                goto inf_leave; \
-            } \
-        } \
-    } while (0)
-
-/* Get a byte of input into the bit accumulator, or return from inflateBack()
-   with an error if there is no input available. */
-#define PULLBYTE() \
-    do { \
-        PULL(); \
-        have--; \
-        hold += (unsigned long)(*next++) << bits; \
-        bits += 8; \
-    } while (0)
-
-/* Assure that there are at least n bits in the bit accumulator.  If there is
-   not enough available input to do that, then return from inflateBack() with
-   an error. */
-#define NEEDBITS(n) \
-    do { \
-        while (bits < (unsigned)(n)) \
-            PULLBYTE(); \
-    } while (0)
-
-/* Return the low n bits of the bit accumulator (n < 16) */
-#define BITS(n) \
-    ((unsigned)hold & ((1U << (n)) - 1))
-
-/* Remove n bits from the bit accumulator */
-#define DROPBITS(n) \
-    do { \
-        hold >>= (n); \
-        bits -= (unsigned)(n); \
-    } while (0)
-
-/* Remove zero to seven bits as needed to go to a byte boundary */
-#define BYTEBITS() \
-    do { \
-        hold >>= bits & 7; \
-        bits -= bits & 7; \
-    } while (0)
-
-/* Assure that some output space is available, by writing out the window
-   if it's full.  If the write fails, return from inflateBack() with a
-   Z_BUF_ERROR. */
-#define ROOM() \
-    do { \
-        if (left == 0) { \
-            put = state->window; \
-            left = state->wsize; \
-            state->whave = left; \
-            if (out(out_desc, put, left)) { \
-                ret = Z_BUF_ERROR; \
-                goto inf_leave; \
-            } \
-        } \
-    } while (0)
-
-/*
-   strm provides the memory allocation functions and window buffer on input,
-   and provides information on the unused input on return.  For Z_DATA_ERROR
-   returns, strm will also provide an error message.
-
-   in() and out() are the call-back input and output functions.  When
-   inflateBack() needs more input, it calls in().  When inflateBack() has
-   filled the window with output, or when it completes with data in the
-   window, it calls out() to write out the data.  The application must not
-   change the provided input until in() is called again or inflateBack()
-   returns.  The application must not change the window/output buffer until
-   inflateBack() returns.
-
-   in() and out() are called with a descriptor parameter provided in the
-   inflateBack() call.  This parameter can be a structure that provides the
-   information required to do the read or write, as well as accumulated
-   information on the input and output such as totals and check values.
-
-   in() should return zero on failure.  out() should return non-zero on
-   failure.  If either in() or out() fails, than inflateBack() returns a
-   Z_BUF_ERROR.  strm->next_in can be checked for Z_NULL to see whether it
-   was in() or out() that caused in the error.  Otherwise,  inflateBack()
-   returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
-   error, or Z_MEM_ERROR if it could not allocate memory for the state.
-   inflateBack() can also return Z_STREAM_ERROR if the input parameters
-   are not correct, i.e. strm is Z_NULL or the state was not initialized.
- */
-int ZEXPORT inflateBack(
-    z_streamp strm,
-    in_func in,
-    void FAR *in_desc,
-    out_func out,
-    void FAR *out_desc)
-{
-    struct inflate_state FAR *state;
-    z_const unsigned char FAR *next;    /* next input */
-    unsigned char FAR *put;     /* next output */
-    unsigned have, left;        /* available input and output */
-    unsigned long hold;         /* bit buffer */
-    unsigned bits;              /* bits in bit buffer */
-    unsigned copy;              /* number of stored or match bytes to copy */
-    unsigned char FAR *from;    /* where to copy match bytes from */
-    code here;                  /* current decoding table entry */
-    code last;                  /* parent table entry */
-    unsigned len;               /* length to copy for repeats, bits to drop */
-    int ret;                    /* return code */
-    static const unsigned short order[19] = /* permutation of code lengths */
-        {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
-
-    /* Check that the strm exists and that the state was initialized */
-    if (strm == Z_NULL || strm->state == Z_NULL)
-        return Z_STREAM_ERROR;
-    state = (struct inflate_state FAR *)strm->state;
-
-    /* Reset the state */
-    strm->msg = Z_NULL;
-    state->mode = TYPE;
-    state->last = 0;
-    state->whave = 0;
-    next = strm->next_in;
-    have = next != Z_NULL ? strm->avail_in : 0;
-    hold = 0;
-    bits = 0;
-    put = state->window;
-    left = state->wsize;
-
-    /* Inflate until end of block marked as last */
-    for (;;)
-        switch (state->mode) {
-        case TYPE:
-            /* determine and dispatch block type */
-            if (state->last) {
-                BYTEBITS();
-                state->mode = DONE;
-                break;
-            }
-            NEEDBITS(3);
-            state->last = BITS(1);
-            DROPBITS(1);
-            switch (BITS(2)) {
-            case 0:                             /* stored block */
-                Tracev((stderr, "inflate:     stored block%s\n",
-                        state->last ? " (last)" : ""));
-                state->mode = STORED;
-                break;
-            case 1:                             /* fixed block */
-                fixedtables(state);
-                Tracev((stderr, "inflate:     fixed codes block%s\n",
-                        state->last ? " (last)" : ""));
-                state->mode = LEN;              /* decode codes */
-                break;
-            case 2:                             /* dynamic block */
-                Tracev((stderr, "inflate:     dynamic codes block%s\n",
-                        state->last ? " (last)" : ""));
-                state->mode = TABLE;
-                break;
-            case 3:
-                strm->msg = (char *)"invalid block type";
-                state->mode = BAD;
-            }
-            DROPBITS(2);
-            break;
-
-        case STORED:
-            /* get and verify stored block length */
-            BYTEBITS();                         /* go to byte boundary */
-            NEEDBITS(32);
-            if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
-                strm->msg = (char *)"invalid stored block lengths";
-                state->mode = BAD;
-                break;
-            }
-            state->length = (unsigned)hold & 0xffff;
-            Tracev((stderr, "inflate:       stored length %u\n",
-                    state->length));
-            INITBITS();
-
-            /* copy stored block from input to output */
-            while (state->length != 0) {
-                copy = state->length;
-                PULL();
-                ROOM();
-                if (copy > have) copy = have;
-                if (copy > left) copy = left;
-                zmemcpy(put, next, copy);
-                have -= copy;
-                next += copy;
-                left -= copy;
-                put += copy;
-                state->length -= copy;
-            }
-            Tracev((stderr, "inflate:       stored end\n"));
-            state->mode = TYPE;
-            break;
-
-        case TABLE:
-            /* get dynamic table entries descriptor */
-            NEEDBITS(14);
-            state->nlen = BITS(5) + 257;
-            DROPBITS(5);
-            state->ndist = BITS(5) + 1;
-            DROPBITS(5);
-            state->ncode = BITS(4) + 4;
-            DROPBITS(4);
-#ifndef PKZIP_BUG_WORKAROUND
-            if (state->nlen > 286 || state->ndist > 30) {
-                strm->msg = (char *)"too many length or distance symbols";
-                state->mode = BAD;
-                break;
-            }
-#endif
-            Tracev((stderr, "inflate:       table sizes ok\n"));
-
-            /* get code length code lengths (not a typo) */
-            state->have = 0;
-            while (state->have < state->ncode) {
-                NEEDBITS(3);
-                state->lens[order[state->have++]] = (unsigned short)BITS(3);
-                DROPBITS(3);
-            }
-            while (state->have < 19)
-                state->lens[order[state->have++]] = 0;
-            state->next = state->codes;
-            state->lencode = (code const FAR *)(state->next);
-            state->lenbits = 7;
-            ret = inflate_table(CODES, state->lens, 19, &(state->next),
-                                &(state->lenbits), state->work);
-            if (ret) {
-                strm->msg = (char *)"invalid code lengths set";
-                state->mode = BAD;
-                break;
-            }
-            Tracev((stderr, "inflate:       code lengths ok\n"));
-
-            /* get length and distance code code lengths */
-            state->have = 0;
-            while (state->have < state->nlen + state->ndist) {
-                for (;;) {
-                    here = state->lencode[BITS(state->lenbits)];
-                    if ((unsigned)(here.bits) <= bits) break;
-                    PULLBYTE();
-                }
-                if (here.val < 16) {
-                    DROPBITS(here.bits);
-                    state->lens[state->have++] = here.val;
-                }
-                else {
-                    if (here.val == 16) {
-                        NEEDBITS(here.bits + 2);
-                        DROPBITS(here.bits);
-                        if (state->have == 0) {
-                            strm->msg = (char *)"invalid bit length repeat";
-                            state->mode = BAD;
-                            break;
-                        }
-                        len = (unsigned)(state->lens[state->have - 1]);
-                        copy = 3 + BITS(2);
-                        DROPBITS(2);
-                    }
-                    else if (here.val == 17) {
-                        NEEDBITS(here.bits + 3);
-                        DROPBITS(here.bits);
-                        len = 0;
-                        copy = 3 + BITS(3);
-                        DROPBITS(3);
-                    }
-                    else {
-                        NEEDBITS(here.bits + 7);
-                        DROPBITS(here.bits);
-                        len = 0;
-                        copy = 11 + BITS(7);
-                        DROPBITS(7);
-                    }
-                    if (state->have + copy > state->nlen + state->ndist) {
-                        strm->msg = (char *)"invalid bit length repeat";
-                        state->mode = BAD;
-                        break;
-                    }
-                    while (copy--)
-                        state->lens[state->have++] = (unsigned short)len;
-                }
-            }
-
-            /* handle error breaks in while */
-            if (state->mode == BAD) break;
-
-            /* check for end-of-block code (better have one) */
-            if (state->lens[256] == 0) {
-                strm->msg = (char *)"invalid code -- missing end-of-block";
-                state->mode = BAD;
-                break;
-            }
-
-            /* build code tables -- note: do not change the lenbits or distbits
-               values here (9 and 6) without reading the comments in inftrees.h
-               concerning the ENOUGH constants, which depend on those values */
-            state->next = state->codes;
-            state->lencode = (code const FAR *)(state->next);
-            state->lenbits = 9;
-            ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
-                                &(state->lenbits), state->work);
-            if (ret) {
-                strm->msg = (char *)"invalid literal/lengths set";
-                state->mode = BAD;
-                break;
-            }
-            state->distcode = (code const FAR *)(state->next);
-            state->distbits = 6;
-            ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
-                            &(state->next), &(state->distbits), state->work);
-            if (ret) {
-                strm->msg = (char *)"invalid distances set";
-                state->mode = BAD;
-                break;
-            }
-            Tracev((stderr, "inflate:       codes ok\n"));
-            state->mode = LEN;
-                /* fallthrough */
-
-        case LEN:
-            /* use inflate_fast() if we have enough input and output */
-            if (have >= 6 && left >= 258) {
-                RESTORE();
-                if (state->whave < state->wsize)
-                    state->whave = state->wsize - left;
-                inflate_fast(strm, state->wsize);
-                LOAD();
-                break;
-            }
-
-            /* get a literal, length, or end-of-block code */
-            for (;;) {
-                here = state->lencode[BITS(state->lenbits)];
-                if ((unsigned)(here.bits) <= bits) break;
-                PULLBYTE();
-            }
-            if (here.op && (here.op & 0xf0) == 0) {
-                last = here;
-                for (;;) {
-                    here = state->lencode[last.val +
-                            (BITS(last.bits + last.op) >> last.bits)];
-                    if ((unsigned)(last.bits + here.bits) <= bits) break;
-                    PULLBYTE();
-                }
-                DROPBITS(last.bits);
-            }
-            DROPBITS(here.bits);
-            state->length = (unsigned)here.val;
-
-            /* process literal */
-            if (here.op == 0) {
-                Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
-                        "inflate:         literal '%c'\n" :
-                        "inflate:         literal 0x%02x\n", here.val));
-                ROOM();
-                *put++ = (unsigned char)(state->length);
-                left--;
-                state->mode = LEN;
-                break;
-            }
-
-            /* process end of block */
-            if (here.op & 32) {
-                Tracevv((stderr, "inflate:         end of block\n"));
-                state->mode = TYPE;
-                break;
-            }
-
-            /* invalid code */
-            if (here.op & 64) {
-                strm->msg = (char *)"invalid literal/length code";
-                state->mode = BAD;
-                break;
-            }
-
-            /* length code -- get extra bits, if any */
-            state->extra = (unsigned)(here.op) & 15;
-            if (state->extra != 0) {
-                NEEDBITS(state->extra);
-                state->length += BITS(state->extra);
-                DROPBITS(state->extra);
-            }
-            Tracevv((stderr, "inflate:         length %u\n", state->length));
-
-            /* get distance code */
-            for (;;) {
-                here = state->distcode[BITS(state->distbits)];
-                if ((unsigned)(here.bits) <= bits) break;
-                PULLBYTE();
-            }
-            if ((here.op & 0xf0) == 0) {
-                last = here;
-                for (;;) {
-                    here = state->distcode[last.val +
-                            (BITS(last.bits + last.op) >> last.bits)];
-                    if ((unsigned)(last.bits + here.bits) <= bits) break;
-                    PULLBYTE();
-                }
-                DROPBITS(last.bits);
-            }
-            DROPBITS(here.bits);
-            if (here.op & 64) {
-                strm->msg = (char *)"invalid distance code";
-                state->mode = BAD;
-                break;
-            }
-            state->offset = (unsigned)here.val;
-
-            /* get distance extra bits, if any */
-            state->extra = (unsigned)(here.op) & 15;
-            if (state->extra != 0) {
-                NEEDBITS(state->extra);
-                state->offset += BITS(state->extra);
-                DROPBITS(state->extra);
-            }
-            if (state->offset > state->wsize - (state->whave < state->wsize ?
-                                                left : 0)) {
-                strm->msg = (char *)"invalid distance too far back";
-                state->mode = BAD;
-                break;
-            }
-            Tracevv((stderr, "inflate:         distance %u\n", state->offset));
-
-            /* copy match from window to output */
-            do {
-                ROOM();
-                copy = state->wsize - state->offset;
-                if (copy < left) {
-                    from = put + copy;
-                    copy = left - copy;
-                }
-                else {
-                    from = put - state->offset;
-                    copy = left;
-                }
-                if (copy > state->length) copy = state->length;
-                state->length -= copy;
-                left -= copy;
-                do {
-                    *put++ = *from++;
-                } while (--copy);
-            } while (state->length != 0);
-            break;
-
-        case DONE:
-            /* inflate stream terminated properly */
-            ret = Z_STREAM_END;
-            goto inf_leave;
-
-        case BAD:
-            ret = Z_DATA_ERROR;
-            goto inf_leave;
-
-        default:
-            /* can't happen, but makes compilers happy */
-            ret = Z_STREAM_ERROR;
-            goto inf_leave;
-        }
-
-    /* Write leftover output and return unused input */
-  inf_leave:
-    if (left < state->wsize) {
-        if (out(out_desc, state->window, state->wsize - left) &&
-            ret == Z_STREAM_END)
-            ret = Z_BUF_ERROR;
-    }
-    strm->next_in = next;
-    strm->avail_in = have;
-    return ret;
-}
-
-int ZEXPORT inflateBackEnd(
-    z_streamp strm)
-{
-    if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
-        return Z_STREAM_ERROR;
-    ZFREE(strm, strm->state);
-    strm->state = Z_NULL;
-    Tracev((stderr, "inflate: end\n"));
-    return Z_OK;
-}
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/gzip/rules.mk 5.15.17+dfsg-1/src/3rdparty/freetype/src/gzip/rules.mk
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/gzip/rules.mk	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/gzip/rules.mk	2024-11-20 13:56:33.000000000 +0000
@@ -36,24 +36,23 @@ endif
 #
 # All source and header files get loaded by `ftgzip.c' only if SYSTEM_ZLIB
 # is not defined (regardless whether we have a `single' or a `multi' build).
-# However, it doesn't harm if we add everything as a dependency
-# unconditionally.
 #
-GZIP_DRV_SRCS := $(GZIP_DIR)/adler32.c  \
-                 $(GZIP_DIR)/crc32.c    \
-                 $(GZIP_DIR)/crc32.h    \
-                 $(GZIP_DIR)/ftzconf.h  \
-                 $(GZIP_DIR)/inffast.c  \
-                 $(GZIP_DIR)/inffast.h  \
-                 $(GZIP_DIR)/inffixed.h \
-                 $(GZIP_DIR)/inflate.c  \
-                 $(GZIP_DIR)/inflate.h  \
-                 $(GZIP_DIR)/inftrees.c \
-                 $(GZIP_DIR)/inftrees.h \
-                 $(GZIP_DIR)/zlib.h     \
-                 $(GZIP_DIR)/zutil.c    \
-                 $(GZIP_DIR)/zutil.h
-
+ifeq ($(SYSTEM_ZLIB),)
+  GZIP_DRV_SRCS := $(GZIP_DIR)/adler32.c  \
+                   $(GZIP_DIR)/crc32.c    \
+                   $(GZIP_DIR)/crc32.h    \
+                   $(GZIP_DIR)/ftzconf.h  \
+                   $(GZIP_DIR)/inffast.c  \
+                   $(GZIP_DIR)/inffast.h  \
+                   $(GZIP_DIR)/inffixed.h \
+                   $(GZIP_DIR)/inflate.c  \
+                   $(GZIP_DIR)/inflate.h  \
+                   $(GZIP_DIR)/inftrees.c \
+                   $(GZIP_DIR)/inftrees.h \
+                   $(GZIP_DIR)/zlib.h     \
+                   $(GZIP_DIR)/zutil.c    \
+                   $(GZIP_DIR)/zutil.h
+endif
 
 # gzip driver object(s)
 #
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/psaux/cffdecode.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/psaux/cffdecode.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/psaux/cffdecode.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/psaux/cffdecode.c	2024-11-20 13:56:33.000000000 +0000
@@ -2153,7 +2153,7 @@
                                       decoder->locals_bias );
 
 
-            FT_TRACE4(( " callsubr (idx %d, entering level %ld)\n",
+            FT_TRACE4(( " callsubr (idx %d, entering level %td)\n",
                         idx,
                         zone - decoder->zones + 1 ));
 
@@ -2197,7 +2197,7 @@
                                       decoder->globals_bias );
 
 
-            FT_TRACE4(( " callgsubr (idx %d, entering level %ld)\n",
+            FT_TRACE4(( " callgsubr (idx %d, entering level %td)\n",
                         idx,
                         zone - decoder->zones + 1 ));
 
@@ -2236,7 +2236,7 @@
           break;
 
         case cff_op_return:
-          FT_TRACE4(( " return (leaving level %ld)\n",
+          FT_TRACE4(( " return (leaving level %td)\n",
                       decoder->zone - decoder->zones ));
 
           if ( decoder->zone <= decoder->zones )
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/psaux/pshints.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/psaux/pshints.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/psaux/pshints.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/psaux/pshints.c	2024-11-20 13:56:33.000000000 +0000
@@ -310,7 +310,7 @@
       CF2_Hint  hint = &hintmap->edge[i];
 
 
-      FT_TRACE6(( "  %3ld    %7.2f  %7.2f  %5d  %s%s%s%s\n",
+      FT_TRACE6(( "  %3zu    %7.2f  %7.2f  %5d  %s%s%s%s\n",
                   hint->index,
                   hint->csCoord / 65536.0,
                   hint->dsCoord / ( hint->scale * 1.0 ),
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/psaux/t1decode.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/psaux/t1decode.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/psaux/t1decode.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/psaux/t1decode.c	2024-11-20 13:56:33.000000000 +0000
@@ -520,7 +520,7 @@
 #ifdef FT_DEBUG_LEVEL_TRACE
       if ( bol )
       {
-        FT_TRACE5(( " (%ld)", decoder->top - decoder->stack ));
+        FT_TRACE5(( " (%td)", decoder->top - decoder->stack ));
         bol = FALSE;
       }
 #endif
@@ -1165,7 +1165,7 @@
           if ( top - decoder->stack != num_args )
             FT_TRACE0(( "t1_decoder_parse_charstrings:"
                         " too much operands on the stack"
-                        " (seen %ld, expected %d)\n",
+                        " (seen %td, expected %d)\n",
                         top - decoder->stack, num_args ));
           break;
         }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/sfnt/sfwoff2.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/sfnt/sfwoff2.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/sfnt/sfwoff2.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/sfnt/sfwoff2.c	2024-11-20 13:56:33.000000000 +0000
@@ -36,6 +36,8 @@
 #undef  FT_COMPONENT
 #define FT_COMPONENT  sfwoff2
 
+  /* An arbitrary, heuristic size limit (67MByte) for expanded WOFF2 data. */
+#define MAX_SFNT_SIZE  ( 1 << 26 )
 
 #define READ_255USHORT( var )  FT_SET_ERROR( Read255UShort( stream, &var ) )
 
@@ -2180,9 +2182,8 @@
       else
         sfnt_size = woff2.totalSfntSize;
 
-      /* Value 1<<26 = 67108864 is heuristic. */
-      if (sfnt_size >= (1 << 26))
-        sfnt_size = 1 << 26;
+      if ( sfnt_size >= MAX_SFNT_SIZE )
+        sfnt_size = MAX_SFNT_SIZE;
 
 #ifdef FT_DEBUG_LEVEL_TRACE
       if ( sfnt_size != woff2.totalSfntSize )
@@ -2257,10 +2258,15 @@
       goto Exit;
     }
 
-    if ( woff2.uncompressed_size > sfnt_size )
+    /* We must not blindly trust `uncompressed_size` since its   */
+    /* value might be corrupted.  If it is too large, reject the */
+    /* font.  In other words, we don't accept a WOFF2 font that  */
+    /* expands to something larger than MAX_SFNT_SIZE.  If ever  */
+    /* necessary, this limit can be easily adjusted.             */
+    if ( woff2.uncompressed_size > MAX_SFNT_SIZE )
     {
-      FT_ERROR(( "woff2_open_font: SFNT table lengths are too large.\n" ));
-      error = FT_THROW( Invalid_Table );
+      FT_ERROR(( "Uncompressed font too large.\n" ));
+      error = FT_THROW( Array_Too_Large );
       goto Exit;
     }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/sfnt/ttcolr.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/sfnt/ttcolr.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/sfnt/ttcolr.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/sfnt/ttcolr.c	2024-11-20 13:56:33.000000000 +0000
@@ -229,7 +229,7 @@
 
       base_glyphs_offset_v1 = FT_NEXT_ULONG( p );
 
-      if ( base_glyphs_offset_v1 + 4 >= table_size )
+      if ( base_glyphs_offset_v1 >= table_size - 4 )
         goto InvalidTable;
 
       p1                 = (FT_Byte*)( table + base_glyphs_offset_v1 );
@@ -249,7 +249,7 @@
 
       if ( layer_offset_v1 )
       {
-        if ( layer_offset_v1 + 4 >= table_size )
+        if ( layer_offset_v1 >= table_size - 4 )
           goto InvalidTable;
 
         p1            = (FT_Byte*)( table + layer_offset_v1 );
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/smooth/ftgrays.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/smooth/ftgrays.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/smooth/ftgrays.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/smooth/ftgrays.c	2024-11-20 13:56:33.000000000 +0000
@@ -1006,10 +1006,11 @@ typedef ptrdiff_t  FT_PtrDist;
    *
    * For other cases, using binary splits is actually slightly faster.
    */
-#if defined( __SSE2__ )                            || \
-    ( defined( __x86_64__ ) && !defined( __VMS ) ) || \
-    defined( _M_AMD64 )                            || \
-    ( defined( _M_IX86_FP ) && _M_IX86_FP >= 2 )
+#if ( defined( __SSE2__ )                          ||   \
+      defined( __x86_64__ )                        ||   \
+      defined( _M_AMD64 )                          ||   \
+      ( defined( _M_IX86_FP ) && _M_IX86_FP >= 2 ) ) && \
+    !defined( __VMS )
 #  define FT_SSE2 1
 #else
 #  define FT_SSE2 0
@@ -1933,7 +1934,7 @@ typedef ptrdiff_t  FT_PtrDist;
       if ( continued )
         FT_Trace_Enable();
 
-      FT_TRACE7(( "band [%d..%d]: %ld cell%s remaining/\n",
+      FT_TRACE7(( "band [%d..%d]: %td cell%s remaining/\n",
                   ras.min_ey,
                   ras.max_ey,
                   ras.cell_null - ras.cell_free,
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/rules.mk 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/rules.mk
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/rules.mk	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/rules.mk	2024-11-20 13:56:33.000000000 +0000
@@ -33,8 +33,7 @@ TT_DRV_SRC := $(TT_DIR)/ttdriver.c \
               $(TT_DIR)/ttgxvar.c  \
               $(TT_DIR)/ttinterp.c \
               $(TT_DIR)/ttobjs.c   \
-              $(TT_DIR)/ttpload.c  \
-              $(TT_DIR)/ttsubpix.c
+              $(TT_DIR)/ttpload.c
 
 # TrueType driver headers
 #
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/truetype.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/truetype.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/truetype.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/truetype.c	2024-11-20 13:56:33.000000000 +0000
@@ -24,7 +24,6 @@
 #include "ttinterp.c"
 #include "ttobjs.c"     /* object manager      */
 #include "ttpload.c"    /* tables loader       */
-#include "ttsubpix.c"
 
 
 /* END */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttdriver.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttdriver.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttdriver.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttdriver.c	2024-11-20 13:56:33.000000000 +0000
@@ -100,11 +100,6 @@
         break;
 
       case TT_INTERPRETER_VERSION_38:
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-        driver->interpreter_version = TT_INTERPRETER_VERSION_38;
-      break;
-#endif
-
       case TT_INTERPRETER_VERSION_40:
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
         driver->interpreter_version = TT_INTERPRETER_VERSION_40;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttgload.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttgload.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttgload.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttgload.c	2024-11-20 13:56:33.000000000 +0000
@@ -35,7 +35,6 @@
 #endif
 
 #include "tterrors.h"
-#include "ttsubpix.h"
 
 
   /**************************************************************************
@@ -152,9 +151,6 @@
                   FT_UInt    glyph_index )
   {
     TT_Face    face   = loader->face;
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
-#endif
 
     FT_Error   error;
     FT_Stream  stream = loader->stream;
@@ -183,20 +179,6 @@
     loader->top_bearing  = top_bearing;
     loader->vadvance     = advance_height;
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 &&
-         loader->exec                                             )
-    {
-      loader->exec->sph_tweak_flags = 0;
-
-      /* This may not be the right place for this, but it works...  */
-      /* Note that we have to unconditionally load the tweaks since */
-      /* it is possible that glyphs individually switch ClearType's */
-      /* backward compatibility mode on and off.                    */
-      sph_set_tweaks( loader, glyph_index );
-    }
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
     /* With the incremental interface, these values are set by  */
     /* a call to `tt_get_metrics_incremental'.                  */
@@ -798,8 +780,7 @@
   TT_Hint_Glyph( TT_Loader  loader,
                  FT_Bool    is_composite )
   {
-#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \
-    defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
     TT_Face    face   = loader->face;
     TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
 #endif
@@ -820,7 +801,7 @@
       FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points );
 
     /* Reset graphics state. */
-    loader->exec->GS = loader->size->GS;
+    exec->GS = loader->size->GS;
 
     /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */
     /*      completely refer to the (already) hinted subglyphs.     */
@@ -860,7 +841,7 @@
       exec->is_composite = is_composite;
       exec->pts          = *zone;
 
-      error = TT_Run_Context( loader->exec );
+      error = TT_Run_Context( exec );
       if ( error && exec->pedantic_hinting )
         return error;
 
@@ -871,32 +852,20 @@
 
 #endif
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
     /* Save possibly modified glyph phantom points unless in v40 backward  */
     /* compatibility mode, where no movement on the x axis means no reason */
     /* to change bearings or advance widths.                               */
-    if ( !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 &&
-            exec->backward_compatibility ) )
-    {
-#endif
-      loader->pp1 = zone->cur[zone->n_points - 4];
-      loader->pp2 = zone->cur[zone->n_points - 3];
-      loader->pp3 = zone->cur[zone->n_points - 2];
-      loader->pp4 = zone->cur[zone->n_points - 1];
+
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    }
+    if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 &&
+         exec->backward_compatibility )
+      return FT_Err_Ok;
 #endif
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
-    {
-      if ( exec->sph_tweak_flags & SPH_TWEAK_DEEMBOLDEN )
-        FT_Outline_EmboldenXY( &loader->gloader->current.outline, -24, 0 );
-
-      else if ( exec->sph_tweak_flags & SPH_TWEAK_EMBOLDEN )
-        FT_Outline_EmboldenXY( &loader->gloader->current.outline, 24, 0 );
-    }
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
+    loader->pp1 = zone->cur[zone->n_points - 4];
+    loader->pp2 = zone->cur[zone->n_points - 3];
+    loader->pp3 = zone->cur[zone->n_points - 2];
+    loader->pp4 = zone->cur[zone->n_points - 1];
 
     return FT_Err_Ok;
   }
@@ -960,16 +929,6 @@
     }
 
     {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      TT_Face    face   = loader->face;
-      TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
-
-      FT_String*  family         = face->root.family_name;
-      FT_UInt     ppem           = loader->size->metrics->x_ppem;
-      FT_String*  style          = face->root.style_name;
-      FT_UInt     x_scale_factor = 1000;
-#endif
-
       FT_Vector*  vec   = outline->points;
       FT_Vector*  limit = outline->points + n_points;
 
@@ -979,52 +938,6 @@
       FT_Bool  do_scale = FALSE;
 
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
-      {
-        /* scale, but only if enabled and only if TT hinting is being used */
-        if ( IS_HINTED( loader->load_flags ) )
-          x_scale_factor = sph_test_tweak_x_scaling( face,
-                                                     family,
-                                                     ppem,
-                                                     style,
-                                                     loader->glyph_index );
-        /* scale the glyph */
-        if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ||
-             x_scale_factor != 1000                         )
-        {
-          x_scale = FT_MulDiv( loader->size->metrics->x_scale,
-                               (FT_Long)x_scale_factor, 1000 );
-          y_scale = loader->size->metrics->y_scale;
-
-          /* compensate for any scaling by de/emboldening; */
-          /* the amount was determined via experimentation */
-          if ( x_scale_factor != 1000 && ppem > 11 )
-          {
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-            FT_Vector*  orig_points = outline->points;
-
-
-            if ( !IS_DEFAULT_INSTANCE( FT_FACE( loader->face ) ) )
-              outline->points = unrounded;
-#endif
-            FT_Outline_EmboldenXY( outline,
-                                   FT_MulFix( 1280 * ppem,
-                                              1000 - x_scale_factor ),
-                                   0 );
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-            if ( !IS_DEFAULT_INSTANCE( FT_FACE( loader->face ) ) )
-              outline->points = orig_points;
-#endif
-          }
-          do_scale = TRUE;
-        }
-      }
-      else
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
       {
         /* scale the glyph */
         if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
@@ -1451,45 +1364,31 @@
   static void
   tt_loader_set_pp( TT_Loader  loader )
   {
-    FT_Bool  subpixel_hinting = 0;
-    FT_Bool  grayscale        = 0;
-    FT_Bool  use_aw_2         = 0;
-
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( loader->face );
-#endif
-
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
-    {
-      subpixel_hinting = loader->exec ? loader->exec->subpixel_hinting
-                                      : 0;
-      grayscale        = loader->exec ? loader->exec->grayscale
-                                      : 0;
-    }
-#endif
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 )
-    {
-      subpixel_hinting = loader->exec ? loader->exec->subpixel_hinting_lean
-                                      : 0;
-      grayscale        = loader->exec ? loader->exec->grayscale_cleartype
-                                      : 0;
-    }
-#endif
-
-    use_aw_2 = FT_BOOL( subpixel_hinting && grayscale );
-
     loader->pp1.x = loader->bbox.xMin - loader->left_bearing;
     loader->pp1.y = 0;
     loader->pp2.x = loader->pp1.x + loader->advance;
     loader->pp2.y = 0;
 
-    loader->pp3.x = use_aw_2 ? loader->advance / 2 : 0;
+    loader->pp3.x = 0;
     loader->pp3.y = loader->bbox.yMax + loader->top_bearing;
-    loader->pp4.x = use_aw_2 ? loader->advance / 2 : 0;
+    loader->pp4.x = 0;
     loader->pp4.y = loader->pp3.y - loader->vadvance;
+
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    {
+      TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( loader->face );
+
+
+      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 &&
+           loader->exec                                             &&
+           loader->exec->subpixel_hinting_lean                      &&
+           loader->exec->grayscale_cleartype                        )
+      {
+        loader->pp3.x = loader->advance / 2;
+        loader->pp4.x = loader->advance / 2;
+      }
+    }
+#endif
   }
 
 
@@ -2277,8 +2176,7 @@
 #ifdef TT_USE_BYTECODE_INTERPRETER
     FT_Error   error;
     FT_Bool    pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
-#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \
-    defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
     TT_Driver  driver   = (TT_Driver)FT_FACE_DRIVER( glyph->face );
 #endif
 #endif
@@ -2298,20 +2196,6 @@
       FT_Bool         grayscale_cleartype;
 #endif
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      FT_Bool  subpixel_hinting = FALSE;
-
-#if 0
-      /* not used yet */
-      FT_Bool  compatible_widths;
-      FT_Bool  symmetrical_smoothing;
-      FT_Bool  bgr;
-      FT_Bool  vertical_lcd;
-      FT_Bool  subpixel_positioned;
-      FT_Bool  gray_cleartype;
-#endif
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
       FT_Bool  reexecute = FALSE;
 
 
@@ -2331,6 +2215,9 @@
       if ( !exec )
         return FT_THROW( Could_Not_Find_Context );
 
+      grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+                             FT_RENDER_MODE_MONO             );
+
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
       if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 )
       {
@@ -2347,6 +2234,7 @@
           FT_BOOL( subpixel_hinting_lean    &&
                    ( load_flags           &
                      FT_LOAD_TARGET_LCD_V ) );
+        grayscale = FT_BOOL( grayscale && !subpixel_hinting_lean );
       }
       else
       {
@@ -2356,111 +2244,11 @@
       }
 #endif
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
-      {
-        subpixel_hinting = FT_BOOL( ( FT_LOAD_TARGET_MODE( load_flags ) !=
-                                      FT_RENDER_MODE_MONO               )  &&
-                                    SPH_OPTION_SET_SUBPIXEL                );
-
-        if ( subpixel_hinting )
-          grayscale = FALSE;
-        else if ( SPH_OPTION_SET_GRAYSCALE )
-        {
-          grayscale        = TRUE;
-          subpixel_hinting = FALSE;
-        }
-        else
-          grayscale = FALSE;
-
-        if ( FT_IS_TRICKY( glyph->face ) )
-          subpixel_hinting = FALSE;
-
-        exec->ignore_x_mode      = subpixel_hinting || grayscale;
-        exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
-        if ( exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )
-          exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
-
-#if 1
-        exec->compatible_widths     = SPH_OPTION_SET_COMPATIBLE_WIDTHS;
-        exec->symmetrical_smoothing = TRUE;
-        exec->bgr                   = FALSE;
-        exec->vertical_lcd          = FALSE;
-        exec->subpixel_positioned   = TRUE;
-        exec->gray_cleartype        = FALSE;
-#else /* 0 */
-        exec->compatible_widths =
-          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                   TT_LOAD_COMPATIBLE_WIDTHS );
-        exec->symmetrical_smoothing =
-          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                   TT_LOAD_SYMMETRICAL_SMOOTHING );
-        exec->bgr =
-          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                   TT_LOAD_BGR );
-        exec->vertical_lcd =
-          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                   TT_LOAD_VERTICAL_LCD );
-        exec->subpixel_positioned =
-          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                   TT_LOAD_SUBPIXEL_POSITIONED );
-        exec->gray_cleartype =
-          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                   TT_LOAD_GRAY_CLEARTYPE );
-#endif /* 0 */
-
-      }
-      else
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 )
-        grayscale = FT_BOOL( !subpixel_hinting_lean               &&
-                             FT_LOAD_TARGET_MODE( load_flags ) !=
-                               FT_RENDER_MODE_MONO                );
-      else
-#endif
-        grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                               FT_RENDER_MODE_MONO             );
-
       error = TT_Load_Context( exec, face, size );
       if ( error )
         return error;
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
-      {
-        /* a change from mono to subpixel rendering (and vice versa) */
-        /* requires a re-execution of the CVT program                */
-        if ( subpixel_hinting != exec->subpixel_hinting )
-        {
-          FT_TRACE4(( "tt_loader_init: subpixel hinting change,"
-                      " re-executing `prep' table\n" ));
-
-          exec->subpixel_hinting = subpixel_hinting;
-          reexecute              = TRUE;
-        }
-
-        /* a change from mono to grayscale rendering (and vice versa) */
-        /* requires a re-execution of the CVT program                 */
-        if ( grayscale != exec->grayscale )
-        {
-          FT_TRACE4(( "tt_loader_init: grayscale hinting change,"
-                      " re-executing `prep' table\n" ));
-
-          exec->grayscale = grayscale;
-          reexecute       = TRUE;
-        }
-      }
-      else
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
       {
-
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
         if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 )
         {
@@ -2518,14 +2306,6 @@
       if ( exec->GS.instruct_control & 2 )
         exec->GS = tt_default_graphics_state;
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      /* check whether we have a font hinted for ClearType --           */
-      /* note that this flag can also be modified in a glyph's bytecode */
-      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 &&
-           exec->GS.instruct_control & 4                            )
-        exec->ignore_x_mode = FALSE;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
       /*
        * Toggle backward compatibility according to what font wants, except
@@ -2562,13 +2342,6 @@
            !( driver->interpreter_version == TT_INTERPRETER_VERSION_40  &&
               exec->backward_compatibility                              ) &&
 #endif
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-           !( driver->interpreter_version == TT_INTERPRETER_VERSION_38  &&
-              !SPH_OPTION_BITMAP_WIDTHS                                 &&
-              FT_LOAD_TARGET_MODE( loader->load_flags ) !=
-                                                   FT_RENDER_MODE_MONO  &&
-              exec->compatible_widths                                   ) &&
-#endif
            !face->postscript.isFixedPitch                                 )
       {
         loader->widthp = size->widthp;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttgxvar.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttgxvar.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttgxvar.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttgxvar.c	2024-11-20 13:56:33.000000000 +0000
@@ -621,10 +621,10 @@
     {
       GX_ItemVarData  varData = &itemStore->varData[i];
 
-      FT_UInt  item_count;
-      FT_UInt  word_delta_count;
-      FT_UInt  region_idx_count;
-      FT_UInt  per_region_size;
+      FT_UInt    item_count;
+      FT_UShort  word_delta_count;
+      FT_UInt    region_idx_count;
+      FT_UInt    per_region_size;
 
 
       if ( FT_STREAM_SEEK( offset + dataOffsetArray[i] ) )
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttinterp.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttinterp.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttinterp.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttinterp.c	2024-11-20 13:56:33.000000000 +0000
@@ -29,7 +29,6 @@
 
 #include "ttinterp.h"
 #include "tterrors.h"
-#include "ttsubpix.h"
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 #include "ttgxvar.h"
 #endif
@@ -52,12 +51,6 @@
           ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \
             TT_INTERPRETER_VERSION_35 )
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-#define SUBPIXEL_HINTING_INFINALITY                                          \
-          ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \
-            TT_INTERPRETER_VERSION_38 )
-#endif
-
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
 #define SUBPIXEL_HINTING_MINIMAL                                             \
           ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \
@@ -1685,17 +1678,6 @@
 
     if ( v != 0 )
     {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      if ( SUBPIXEL_HINTING_INFINALITY                            &&
-           ( !exc->ignore_x_mode                                ||
-             ( exc->sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) ) )
-        zone->cur[point].x = ADD_LONG( zone->cur[point].x,
-                                       FT_MulDiv( distance,
-                                                  v,
-                                                  exc->F_dot_P ) );
-      else
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
       /* Exception to the post-IUP curfew: Allow the x component of */
       /* diagonal moves, but only post-IUP.  DejaVu tries to adjust */
@@ -1801,12 +1783,6 @@
                  FT_UShort       point,
                  FT_F26Dot6      distance )
   {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( SUBPIXEL_HINTING_INFINALITY && !exc->ignore_x_mode )
-      zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance );
-    else
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
     if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility )
       zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance );
@@ -3010,28 +2986,7 @@
         args[0] = 0;
     }
     else
-    {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      /* subpixel hinting - avoid Typeman Dstroke and */
-      /* IStroke and Vacuform rounds                  */
-      if ( SUBPIXEL_HINTING_INFINALITY                 &&
-           exc->ignore_x_mode                          &&
-           ( ( I == 24                             &&
-               ( exc->face->sph_found_func_flags &
-                 ( SPH_FDEF_SPACING_1 |
-                   SPH_FDEF_SPACING_2 )          ) ) ||
-             ( I == 22                      &&
-               ( exc->sph_in_func_flags   &
-                 SPH_FDEF_TYPEMAN_STROKES ) )        ||
-             ( I == 8                              &&
-               ( exc->face->sph_found_func_flags &
-                 SPH_FDEF_VACUFORM_ROUND_1       ) &&
-               exc->iup_called                     ) ) )
-        args[0] = 0;
-      else
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-        args[0] = exc->storage[I];
-    }
+      args[0] = exc->storage[I];
   }
 
 
@@ -3545,107 +3500,6 @@
     TT_DefRecord*  rec;
     TT_DefRecord*  limit;
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    /* arguments to opcodes are skipped by `SKIP_Code' */
-    FT_Byte    opcode_pattern[9][12] =
-               {
-                 /* #0 inline delta function 1 */
-                 {
-                   0x4B, /* PPEM    */
-                   0x53, /* GTEQ    */
-                   0x23, /* SWAP    */
-                   0x4B, /* PPEM    */
-                   0x51, /* LTEQ    */
-                   0x5A, /* AND     */
-                   0x58, /* IF      */
-                   0x38, /*   SHPIX */
-                   0x1B, /* ELSE    */
-                   0x21, /*   POP   */
-                   0x21, /*   POP   */
-                   0x59  /* EIF     */
-                 },
-                 /* #1 inline delta function 2 */
-                 {
-                   0x4B, /* PPEM    */
-                   0x54, /* EQ      */
-                   0x58, /* IF      */
-                   0x38, /*   SHPIX */
-                   0x1B, /* ELSE    */
-                   0x21, /*   POP   */
-                   0x21, /*   POP   */
-                   0x59  /* EIF     */
-                 },
-                 /* #2 diagonal stroke function */
-                 {
-                   0x20, /* DUP     */
-                   0x20, /* DUP     */
-                   0xB0, /* PUSHB_1 */
-                         /*   1     */
-                   0x60, /* ADD     */
-                   0x46, /* GC_cur  */
-                   0xB0, /* PUSHB_1 */
-                         /*   64    */
-                   0x23, /* SWAP    */
-                   0x42  /* WS      */
-                 },
-                 /* #3 VacuFormRound function */
-                 {
-                   0x45, /* RCVT    */
-                   0x23, /* SWAP    */
-                   0x46, /* GC_cur  */
-                   0x60, /* ADD     */
-                   0x20, /* DUP     */
-                   0xB0  /* PUSHB_1 */
-                         /*   38    */
-                 },
-                 /* #4 TTFautohint bytecode (old) */
-                 {
-                   0x20, /* DUP     */
-                   0x64, /* ABS     */
-                   0xB0, /* PUSHB_1 */
-                         /*   32    */
-                   0x60, /* ADD     */
-                   0x66, /* FLOOR   */
-                   0x23, /* SWAP    */
-                   0xB0  /* PUSHB_1 */
-                 },
-                 /* #5 spacing function 1 */
-                 {
-                   0x01, /* SVTCA_x */
-                   0xB0, /* PUSHB_1 */
-                         /*   24    */
-                   0x43, /* RS      */
-                   0x58  /* IF      */
-                 },
-                 /* #6 spacing function 2 */
-                 {
-                   0x01, /* SVTCA_x */
-                   0x18, /* RTG     */
-                   0xB0, /* PUSHB_1 */
-                         /*   24    */
-                   0x43, /* RS      */
-                   0x58  /* IF      */
-                 },
-                 /* #7 TypeMan Talk DiagEndCtrl function */
-                 {
-                   0x01, /* SVTCA_x */
-                   0x20, /* DUP     */
-                   0xB0, /* PUSHB_1 */
-                         /*   3     */
-                   0x25, /* CINDEX  */
-                 },
-                 /* #8 TypeMan Talk Align */
-                 {
-                   0x06, /* SPVTL   */
-                   0x7D, /* RDTG    */
-                 },
-               };
-    FT_UShort  opcode_patterns   = 9;
-    FT_UShort  opcode_pointer[9] = {  0, 0, 0, 0, 0, 0, 0, 0, 0 };
-    FT_UShort  opcode_size[9]    = { 12, 8, 8, 6, 7, 4, 5, 4, 2 };
-    FT_UShort  i;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
 
     /* FDEF is only allowed in `prep' or `fpgm' */
     if ( exc->iniRange == tt_coderange_glyph )
@@ -3690,136 +3544,15 @@
     rec->opc            = (FT_UInt16)n;
     rec->start          = exc->IP + 1;
     rec->active         = TRUE;
-    rec->inline_delta   = FALSE;
-    rec->sph_fdef_flags = 0x0000;
 
     if ( n > exc->maxFunc )
       exc->maxFunc = (FT_UInt16)n;
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    /* We don't know for sure these are typeman functions, */
-    /* however they are only active when RS 22 is called   */
-    if ( n >= 64 && n <= 66 )
-      rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_STROKES;
-#endif
-
     /* Now skip the whole function definition. */
     /* We don't allow nested IDEFS & FDEFs.    */
 
     while ( SkipCode( exc ) == SUCCESS )
     {
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-      if ( SUBPIXEL_HINTING_INFINALITY )
-      {
-        for ( i = 0; i < opcode_patterns; i++ )
-        {
-          if ( opcode_pointer[i] < opcode_size[i]                  &&
-               exc->opcode == opcode_pattern[i][opcode_pointer[i]] )
-          {
-            opcode_pointer[i] += 1;
-
-            if ( opcode_pointer[i] == opcode_size[i] )
-            {
-              FT_TRACE6(( "sph: Function %d, opcode ptrn: %ld, %s %s\n",
-                          i, n,
-                          exc->face->root.family_name,
-                          exc->face->root.style_name ));
-
-              switch ( i )
-              {
-              case 0:
-                rec->sph_fdef_flags             |= SPH_FDEF_INLINE_DELTA_1;
-                exc->face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_1;
-                break;
-
-              case 1:
-                rec->sph_fdef_flags             |= SPH_FDEF_INLINE_DELTA_2;
-                exc->face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_2;
-                break;
-
-              case 2:
-                switch ( n )
-                {
-                  /* needs to be implemented still */
-                case 58:
-                  rec->sph_fdef_flags             |= SPH_FDEF_DIAGONAL_STROKE;
-                  exc->face->sph_found_func_flags |= SPH_FDEF_DIAGONAL_STROKE;
-                }
-                break;
-
-              case 3:
-                switch ( n )
-                {
-                case 0:
-                  rec->sph_fdef_flags             |= SPH_FDEF_VACUFORM_ROUND_1;
-                  exc->face->sph_found_func_flags |= SPH_FDEF_VACUFORM_ROUND_1;
-                }
-                break;
-
-              case 4:
-                /* probably not necessary to detect anymore */
-                rec->sph_fdef_flags             |= SPH_FDEF_TTFAUTOHINT_1;
-                exc->face->sph_found_func_flags |= SPH_FDEF_TTFAUTOHINT_1;
-                break;
-
-              case 5:
-                switch ( n )
-                {
-                case 0:
-                case 1:
-                case 2:
-                case 4:
-                case 7:
-                case 8:
-                  rec->sph_fdef_flags             |= SPH_FDEF_SPACING_1;
-                  exc->face->sph_found_func_flags |= SPH_FDEF_SPACING_1;
-                }
-                break;
-
-              case 6:
-                switch ( n )
-                {
-                case 0:
-                case 1:
-                case 2:
-                case 4:
-                case 7:
-                case 8:
-                  rec->sph_fdef_flags             |= SPH_FDEF_SPACING_2;
-                  exc->face->sph_found_func_flags |= SPH_FDEF_SPACING_2;
-                }
-                break;
-
-               case 7:
-                 rec->sph_fdef_flags             |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
-                 exc->face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
-                 break;
-
-               case 8:
-#if 0
-                 rec->sph_fdef_flags             |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
-                 exc->face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
-#endif
-                 break;
-              }
-              opcode_pointer[i] = 0;
-            }
-          }
-
-          else
-            opcode_pointer[i] = 0;
-        }
-
-        /* Set sph_compatibility_mode only when deltas are detected */
-        exc->face->sph_compatibility_mode =
-          ( ( exc->face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_1 ) |
-            ( exc->face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_2 ) );
-      }
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
       switch ( exc->opcode )
       {
       case 0x89:    /* IDEF */
@@ -3847,10 +3580,6 @@
     TT_CallRec*  pRec;
 
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    exc->sph_in_func_flags = 0x0000;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
     if ( exc->callTop <= 0 )     /* We encountered an ENDF without a call */
     {
       exc->error = FT_THROW( ENDF_In_Exec_Stream );
@@ -3938,17 +3667,6 @@
     if ( !def->active )
       goto Fail;
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( SUBPIXEL_HINTING_INFINALITY                                    &&
-         exc->ignore_x_mode                                             &&
-         ( ( exc->iup_called                                        &&
-             ( exc->sph_tweak_flags & SPH_TWEAK_NO_CALL_AFTER_IUP ) ) ||
-           ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 )        ) )
-      goto Fail;
-    else
-      exc->sph_in_func_flags = def->sph_fdef_flags;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
     /* check the call stack */
     if ( exc->callTop >= exc->callSize )
     {
@@ -4026,15 +3744,6 @@
     if ( !def->active )
       goto Fail;
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( SUBPIXEL_HINTING_INFINALITY                         &&
-         exc->ignore_x_mode                                  &&
-         ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) )
-      goto Fail;
-    else
-      exc->sph_in_func_flags = def->sph_fdef_flags;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
     /* check stack */
     if ( exc->callTop >= exc->callSize )
     {
@@ -4940,14 +4649,6 @@
       }
     }
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    /* Disable Type 2 Vacuform Rounds - e.g. Arial Narrow */
-    if ( SUBPIXEL_HINTING_INFINALITY         &&
-         exc->ignore_x_mode                  &&
-         ( D < 0 ? NEG_LONG( D ) : D ) == 64 )
-      D += 1;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
     args[0] = D;
   }
 
@@ -5209,13 +4910,6 @@
     /* except to change the subpixel flags temporarily */
     else if ( exc->iniRange == tt_coderange_glyph && K == 3 )
     {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      /* INSTCTRL modifying flag 3 also has an effect */
-      /* outside of the CVT program                   */
-      if ( SUBPIXEL_HINTING_INFINALITY )
-        exc->ignore_x_mode = !FT_BOOL( L == 4 );
-#endif
-
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
       /* Native ClearType fonts sign a waiver that turns off all backward  */
       /* compatibility hacks and lets them program points to the grid like */
@@ -5547,12 +5241,6 @@
         }
       }
       else
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      /* doesn't follow Cleartype spec but produces better result */
-      if ( SUBPIXEL_HINTING_INFINALITY && exc->ignore_x_mode )
-        Move_Zp2_Point( exc, point, 0, dy, TRUE );
-      else
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
         Move_Zp2_Point( exc, point, dx, dy, TRUE );
 
       exc->GS.loop--;
@@ -5713,76 +5401,6 @@
         }
       }
       else
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      if ( SUBPIXEL_HINTING_INFINALITY &&
-           exc->ignore_x_mode          )
-      {
-        FT_Int  B1, B2;
-
-
-        /*  If not using ignore_x_mode rendering, allow ZP2 move.        */
-        /*  If inline deltas aren't allowed, skip ZP2 move.              */
-        /*  If using ignore_x_mode rendering, allow ZP2 point move if:   */
-        /*   - freedom vector is y and sph_compatibility_mode is off     */
-        /*   - the glyph is composite and the move is in the Y direction */
-        /*   - the glyph is specifically set to allow SHPIX moves        */
-        /*   - the move is on a previously Y-touched point               */
-
-        /* save point for later comparison */
-        B1 = exc->zp2.cur[point].y;
-
-        if ( exc->face->sph_compatibility_mode )
-        {
-          if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )
-            dy = FT_PIX_ROUND( B1 + dy ) - B1;
-
-          /* skip post-iup deltas */
-          if ( exc->iup_called                                          &&
-               ( ( exc->sph_in_func_flags & SPH_FDEF_INLINE_DELTA_1 ) ||
-                 ( exc->sph_in_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ) )
-            goto Skip;
-
-          if ( !( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) &&
-                ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) ||
-                  ( exc->zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y )    ||
-                  ( exc->sph_tweak_flags & SPH_TWEAK_DO_SHPIX )      )  )
-            Move_Zp2_Point( exc, point, 0, dy, TRUE );
-
-          /* save new point */
-          if ( exc->GS.freeVector.y != 0 )
-          {
-            B2 = exc->zp2.cur[point].y;
-
-            /* reverse any disallowed moves */
-            if ( ( B1 & 63 ) == 0 &&
-                 ( B2 & 63 ) != 0 &&
-                 B1 != B2         )
-              Move_Zp2_Point( exc, point, 0, NEG_LONG( dy ), TRUE );
-          }
-        }
-        else if ( exc->GS.freeVector.y != 0 )
-        {
-          Move_Zp2_Point( exc, point, dx, dy, TRUE );
-
-          /* save new point */
-          B2 = exc->zp2.cur[point].y;
-
-          /* reverse any disallowed moves */
-          if ( ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
-               ( B1 & 63 ) != 0                                           &&
-               ( B2 & 63 ) != 0                                           &&
-               B1 != B2                                                   )
-            Move_Zp2_Point( exc,
-                            point,
-                            NEG_LONG( dx ),
-                            NEG_LONG( dy ),
-                            TRUE );
-        }
-        else if ( exc->sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL )
-          Move_Zp2_Point( exc, point, dx, dy, TRUE );
-      }
-      else
-#endif
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
       if ( SUBPIXEL_HINTING_MINIMAL    &&
            exc->backward_compatibility )
@@ -5802,9 +5420,6 @@
 #endif
         Move_Zp2_Point( exc, point, dx, dy, TRUE );
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    Skip:
-#endif
       exc->GS.loop--;
     }
 
@@ -5849,28 +5464,6 @@
 
     distance = PROJECT( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 );
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    /* subpixel hinting - make MSIRP respect CVT cut-in; */
-    if ( SUBPIXEL_HINTING_INFINALITY &&
-         exc->ignore_x_mode          &&
-         exc->GS.freeVector.x != 0   )
-    {
-      FT_F26Dot6  control_value_cutin = exc->GS.control_value_cutin;
-      FT_F26Dot6  delta;
-
-
-      if ( !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
-        control_value_cutin = 0;
-
-      delta = SUB_LONG( distance, args[1] );
-      if ( delta < 0 )
-        delta = NEG_LONG( delta );
-
-      if ( delta >= control_value_cutin )
-        distance = args[1];
-    }
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
     exc->func_move( exc,
                     &exc->zp1,
                     point,
@@ -5911,14 +5504,7 @@
     if ( ( exc->opcode & 1 ) != 0 )
     {
       cur_dist = FAST_PROJECT( &exc->zp0.cur[point] );
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      if ( SUBPIXEL_HINTING_INFINALITY &&
-           exc->ignore_x_mode          &&
-           exc->GS.freeVector.x != 0   )
-        distance = SUB_LONG( Round_None( exc, cur_dist, 3 ), cur_dist );
-      else
-#endif
-        distance = SUB_LONG( exc->func_round( exc, cur_dist, 3 ), cur_dist );
+      distance = SUB_LONG( exc->func_round( exc, cur_dist, 3 ), cur_dist );
     }
     else
       distance = 0;
@@ -5981,27 +5567,12 @@
 
     if ( exc->GS.gep0 == 0 )   /* If in twilight zone */
     {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      /* Only adjust if not in sph_compatibility_mode or ignore_x_mode. */
-      /* Determined via experimentation and may be incorrect...         */
-      if ( !( SUBPIXEL_HINTING_INFINALITY           &&
-              ( exc->ignore_x_mode                &&
-                exc->face->sph_compatibility_mode ) ) )
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-        exc->zp0.org[point].x = TT_MulFix14( distance,
+      exc->zp0.org[point].x = TT_MulFix14( distance,
                                              exc->GS.freeVector.x );
       exc->zp0.org[point].y = TT_MulFix14( distance,
                                            exc->GS.freeVector.y );
       exc->zp0.cur[point]   = exc->zp0.org[point];
     }
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( SUBPIXEL_HINTING_INFINALITY                    &&
-         exc->ignore_x_mode                             &&
-         ( exc->sph_tweak_flags & SPH_TWEAK_MIAP_HACK ) &&
-         distance > 0                                   &&
-         exc->GS.freeVector.y != 0                      )
-      distance = 0;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     org_dist = FAST_PROJECT( &exc->zp0.cur[point] );
 
@@ -6011,15 +5582,6 @@
       FT_F26Dot6  delta;
 
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      if ( SUBPIXEL_HINTING_INFINALITY                        &&
-           exc->ignore_x_mode                                 &&
-           exc->GS.freeVector.x != 0                          &&
-           exc->GS.freeVector.y == 0                          &&
-           !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
-        control_value_cutin = 0;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
       delta = SUB_LONG( distance, org_dist );
       if ( delta < 0 )
         delta = NEG_LONG( delta );
@@ -6027,14 +5589,7 @@
       if ( delta > control_value_cutin )
         distance = org_dist;
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      if ( SUBPIXEL_HINTING_INFINALITY &&
-           exc->ignore_x_mode          &&
-           exc->GS.freeVector.x != 0   )
-        distance = Round_None( exc, distance, 3 );
-      else
-#endif
-        distance = exc->func_round( exc, distance, 3 );
+      distance = exc->func_round( exc, distance, 3 );
     }
 
     exc->func_move( exc, &exc->zp0, point, SUB_LONG( distance, org_dist ) );
@@ -6127,14 +5682,7 @@
 
     if ( ( exc->opcode & 4 ) != 0 )
     {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      if ( SUBPIXEL_HINTING_INFINALITY &&
-           exc->ignore_x_mode          &&
-           exc->GS.freeVector.x != 0   )
-        distance = Round_None( exc, org_dist, exc->opcode & 3 );
-      else
-#endif
-        distance = exc->func_round( exc, org_dist, exc->opcode & 3 );
+      distance = exc->func_round( exc, org_dist, exc->opcode & 3 );
     }
     else
       distance = Round_None( exc, org_dist, exc->opcode & 3 );
@@ -6146,14 +5694,6 @@
       FT_F26Dot6  minimum_distance = exc->GS.minimum_distance;
 
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      if ( SUBPIXEL_HINTING_INFINALITY                        &&
-           exc->ignore_x_mode                                 &&
-           exc->GS.freeVector.x != 0                          &&
-           !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
-        minimum_distance = 0;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
       if ( org_dist >= 0 )
       {
         if ( distance < minimum_distance )
@@ -6296,41 +5836,7 @@
       distance = exc->func_round( exc, cvt_dist, exc->opcode & 3 );
     }
     else
-    {
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      /* do cvt cut-in always in MIRP for sph */
-      if ( SUBPIXEL_HINTING_INFINALITY  &&
-           exc->ignore_x_mode           &&
-           exc->GS.gep0 == exc->GS.gep1 )
-      {
-        FT_F26Dot6  control_value_cutin = exc->GS.control_value_cutin;
-
-
-        if ( exc->GS.freeVector.x != 0                          &&
-             !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
-          control_value_cutin = 0;
-
-        if ( exc->GS.freeVector.y != 0                                 &&
-             ( exc->sph_tweak_flags & SPH_TWEAK_TIMES_NEW_ROMAN_HACK ) )
-        {
-          if ( cur_dist < -64 )
-            cvt_dist -= 16;
-          else if ( cur_dist > 64 && cur_dist < 84 )
-            cvt_dist += 32;
-        }
-
-        delta = SUB_LONG( cvt_dist, org_dist );
-        if ( delta < 0 )
-          delta = NEG_LONG( delta );
-
-        if ( delta > control_value_cutin )
-          cvt_dist = org_dist;
-      }
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
       distance = Round_None( exc, cvt_dist, exc->opcode & 3 );
-    }
 
     /* minimum distance test */
 
@@ -6339,14 +5845,6 @@
       FT_F26Dot6  minimum_distance    = exc->GS.minimum_distance;
 
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      if ( SUBPIXEL_HINTING_INFINALITY                        &&
-           exc->ignore_x_mode                                 &&
-           exc->GS.freeVector.x != 0                          &&
-           !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
-        minimum_distance = 0;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
       if ( org_dist >= 0 )
       {
         if ( distance < minimum_distance )
@@ -6359,51 +5857,10 @@
       }
     }
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( SUBPIXEL_HINTING_INFINALITY &&
-         exc->ignore_x_mode          &&
-         exc->GS.freeVector.y != 0   )
-    {
-      FT_Int   B1, B2;
-
-
-      B1 = exc->zp1.cur[point].y;
-
-      /* Round moves if necessary */
-      if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )
-        distance = FT_PIX_ROUND( B1 + distance - cur_dist ) - B1 + cur_dist;
-
-      if ( ( exc->opcode & 16 ) == 0                               &&
-           ( exc->opcode & 8 ) == 0                                &&
-           ( exc->sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) )
-        distance += 64;
-
-      exc->func_move( exc,
-                      &exc->zp1,
-                      point,
-                      SUB_LONG( distance, cur_dist ) );
-
-      B2 = exc->zp1.cur[point].y;
-
-      /* Reverse move if necessary */
-      if ( ( exc->face->sph_compatibility_mode &&
-             ( B1 & 63 ) == 0                  &&
-             ( B2 & 63 ) != 0                  )                          ||
-           ( ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
-             ( B1 & 63 ) != 0                                           &&
-             ( B2 & 63 ) != 0                                           ) )
-        exc->func_move( exc,
-                        &exc->zp1,
-                        point,
-                        SUB_LONG( cur_dist, distance ) );
-    }
-    else
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-      exc->func_move( exc,
-                      &exc->zp1,
-                      point,
-                      SUB_LONG( distance, cur_dist ) );
+    exc->func_move( exc,
+                    &exc->zp1,
+                    point,
+                    SUB_LONG( distance, cur_dist ) );
 
   Fail:
     exc->GS.rp1 = exc->GS.rp0;
@@ -6428,17 +5885,6 @@
     FT_F26Dot6  distance;
 
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( SUBPIXEL_HINTING_INFINALITY                               &&
-         exc->ignore_x_mode                                        &&
-         exc->iup_called                                           &&
-         ( exc->sph_tweak_flags & SPH_TWEAK_NO_ALIGNRP_AFTER_IUP ) )
-    {
-      exc->error = FT_THROW( Invalid_Reference );
-      goto Fail;
-    }
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
     if ( exc->top < exc->GS.loop                  ||
          BOUNDS( exc->GS.rp0, exc->zp0.n_points ) )
     {
@@ -6997,16 +6443,6 @@
     contour = 0;
     point   = 0;
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( SUBPIXEL_HINTING_INFINALITY &&
-         exc->ignore_x_mode          )
-    {
-      exc->iup_called = TRUE;
-      if ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_IUP )
-        return;
-    }
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
     do
     {
       end_point   = exc->pts.contours[contour] - exc->pts.first_point;
@@ -7079,14 +6515,6 @@
     FT_Long    B;
 
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( SUBPIXEL_HINTING_INFINALITY                              &&
-         exc->ignore_x_mode                                       &&
-         exc->iup_called                                          &&
-         ( exc->sph_tweak_flags & SPH_TWEAK_NO_DELTAP_AFTER_IUP ) )
-      goto Fail;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
     P    = (FT_ULong)exc->func_cur_ppem( exc );
     nump = (FT_ULong)args[0];   /* some points theoretically may occur more
                                    than once, thus UShort isn't enough */
@@ -7139,87 +6567,21 @@
             B++;
           B *= 1L << ( 6 - exc->GS.delta_shift );
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
 
-          if ( SUBPIXEL_HINTING_INFINALITY )
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+          /* See `ttinterp.h' for details on backward compatibility */
+          /* mode.                                                  */
+          if ( SUBPIXEL_HINTING_MINIMAL    &&
+               exc->backward_compatibility )
           {
-            /*
-             * Allow delta move if
-             *
-             * - not using ignore_x_mode rendering,
-             * - glyph is specifically set to allow it, or
-             * - glyph is composite and freedom vector is not in subpixel
-             *   direction.
-             */
-            if ( !exc->ignore_x_mode                                   ||
-                 ( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_DO_DELTAP ) ||
-                 ( exc->is_composite && exc->GS.freeVector.y != 0 )    )
+            if ( !( exc->iupx_called && exc->iupy_called )              &&
+                 ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) ||
+                   ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y )        ) )
               exc->func_move( exc, &exc->zp0, A, B );
-
-            /* Otherwise, apply subpixel hinting and compatibility mode */
-            /* rules, always skipping deltas in subpixel direction.     */
-            else if ( exc->ignore_x_mode && exc->GS.freeVector.y != 0 )
-            {
-              FT_UShort  B1, B2;
-
-
-              /* save the y value of the point now; compare after move */
-              B1 = (FT_UShort)exc->zp0.cur[A].y;
-
-              /* Standard subpixel hinting: Allow y move for y-touched */
-              /* points.  This messes up DejaVu ...                    */
-              if ( !exc->face->sph_compatibility_mode          &&
-                   ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) )
-                exc->func_move( exc, &exc->zp0, A, B );
-
-              /* compatibility mode */
-              else if ( exc->face->sph_compatibility_mode                        &&
-                        !( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) )
-              {
-                if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )
-                  B = FT_PIX_ROUND( B1 + B ) - B1;
-
-                /* Allow delta move if using sph_compatibility_mode,   */
-                /* IUP has not been called, and point is touched on Y. */
-                if ( !exc->iup_called                            &&
-                     ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) )
-                  exc->func_move( exc, &exc->zp0, A, B );
-              }
-
-              B2 = (FT_UShort)exc->zp0.cur[A].y;
-
-              /* Reverse this move if it results in a disallowed move */
-              if ( exc->GS.freeVector.y != 0                          &&
-                   ( ( exc->face->sph_compatibility_mode          &&
-                       ( B1 & 63 ) == 0                           &&
-                       ( B2 & 63 ) != 0                           ) ||
-                     ( ( exc->sph_tweak_flags                   &
-                         SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP ) &&
-                       ( B1 & 63 ) != 0                           &&
-                       ( B2 & 63 ) != 0                           ) ) )
-                exc->func_move( exc, &exc->zp0, A, NEG_LONG( B ) );
-            }
           }
           else
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-          {
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-            /* See `ttinterp.h' for details on backward compatibility */
-            /* mode.                                                  */
-            if ( SUBPIXEL_HINTING_MINIMAL    &&
-                 exc->backward_compatibility )
-            {
-              if ( !( exc->iupx_called && exc->iupy_called )              &&
-                   ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) ||
-                     ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y )        ) )
-                exc->func_move( exc, &exc->zp0, A, B );
-            }
-            else
 #endif
-              exc->func_move( exc, &exc->zp0, A, B );
-          }
+            exc->func_move( exc, &exc->zp0, A, B );
         }
       }
       else
@@ -7333,31 +6695,8 @@
 
     K = 0;
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    /*********************************
-     * RASTERIZER VERSION
-     * Selector Bit:  0
-     * Return Bit(s): 0-7
-     */
-    if ( SUBPIXEL_HINTING_INFINALITY &&
-         ( args[0] & 1 ) != 0        &&
-         exc->subpixel_hinting       )
-    {
-      if ( exc->ignore_x_mode )
-      {
-        /* if in ClearType backward compatibility mode,         */
-        /* we sometimes change the TrueType version dynamically */
-        K = exc->rasterizer_version;
-        FT_TRACE6(( "Setting rasterizer version %d\n",
-                    exc->rasterizer_version ));
-      }
-      else
-        K = TT_INTERPRETER_VERSION_38;
-    }
-    else
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-      if ( ( args[0] & 1 ) != 0 )
-        K = driver->interpreter_version;
+    if ( ( args[0] & 1 ) != 0 )
+      K = driver->interpreter_version;
 
     /*********************************
      * GLYPH ROTATED
@@ -7454,89 +6793,6 @@
     }
 #endif
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-    if ( SUBPIXEL_HINTING_INFINALITY                          &&
-         exc->rasterizer_version >= TT_INTERPRETER_VERSION_35 )
-    {
-
-      if ( exc->rasterizer_version >= 37 )
-      {
-        /*********************************
-         * HINTING FOR SUBPIXEL
-         * Selector Bit:  6
-         * Return Bit(s): 13
-         */
-        if ( ( args[0] & 64 ) != 0 && exc->subpixel_hinting )
-          K |= 1 << 13;
-
-        /*********************************
-         * COMPATIBLE WIDTHS ENABLED
-         * Selector Bit:  7
-         * Return Bit(s): 14
-         *
-         * Functionality still needs to be added
-         */
-        if ( ( args[0] & 128 ) != 0 && exc->compatible_widths )
-          K |= 1 << 14;
-
-        /*********************************
-         * VERTICAL LCD SUBPIXELS?
-         * Selector Bit:  8
-         * Return Bit(s): 15
-         *
-         * Functionality still needs to be added
-         */
-        if ( ( args[0] & 256 ) != 0 && exc->vertical_lcd )
-          K |= 1 << 15;
-
-        /*********************************
-         * HINTING FOR BGR?
-         * Selector Bit:  9
-         * Return Bit(s): 16
-         *
-         * Functionality still needs to be added
-         */
-        if ( ( args[0] & 512 ) != 0 && exc->bgr )
-          K |= 1 << 16;
-
-        if ( exc->rasterizer_version >= 38 )
-        {
-          /*********************************
-           * SUBPIXEL POSITIONED?
-           * Selector Bit:  10
-           * Return Bit(s): 17
-           *
-           * Functionality still needs to be added
-           */
-          if ( ( args[0] & 1024 ) != 0 && exc->subpixel_positioned )
-            K |= 1 << 17;
-
-          /*********************************
-           * SYMMETRICAL SMOOTHING
-           * Selector Bit:  11
-           * Return Bit(s): 18
-           *
-           * Functionality still needs to be added
-           */
-          if ( ( args[0] & 2048 ) != 0 && exc->symmetrical_smoothing )
-            K |= 1 << 18;
-
-          /*********************************
-           * GRAY CLEARTYPE
-           * Selector Bit:  12
-           * Return Bit(s): 19
-           *
-           * Functionality still needs to be added
-           */
-          if ( ( args[0] & 4096 ) != 0 && exc->gray_cleartype )
-            K |= 1 << 19;
-        }
-      }
-    }
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
     args[0] = K;
   }
 
@@ -7679,20 +6935,6 @@
     FT_ULong   num_twilight_points;
     FT_UShort  i;
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    FT_Byte    opcode_pattern[1][2] =
-               {
-                 /* #8 TypeMan Talk Align */
-                 {
-                   0x06, /* SPVTL   */
-                   0x7D, /* RDTG    */
-                 },
-               };
-    FT_UShort  opcode_patterns   = 1;
-    FT_UShort  opcode_pointer[1] = { 0 };
-    FT_UShort  opcode_size[1]    = { 1 };
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
 
     /* We restrict the number of twilight points to a reasonable,     */
     /* heuristic value to avoid slow execution of malformed bytecode. */
@@ -7770,9 +7012,6 @@
     Compute_Round( exc, (FT_Byte)exc->GS.round_state );
 
     /* These flags cancel execution of some opcodes after IUP is called */
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    exc->iup_called  = FALSE;
-#endif
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
     exc->iupx_called = FALSE;
     exc->iupy_called = FALSE;
@@ -7862,39 +7101,6 @@
       exc->step_ins = TRUE;
       exc->error    = FT_Err_Ok;
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-      if ( SUBPIXEL_HINTING_INFINALITY )
-      {
-        for ( i = 0; i < opcode_patterns; i++ )
-        {
-          if ( opcode_pointer[i] < opcode_size[i]                  &&
-               exc->opcode == opcode_pattern[i][opcode_pointer[i]] )
-          {
-            opcode_pointer[i] += 1;
-
-            if ( opcode_pointer[i] == opcode_size[i] )
-            {
-              FT_TRACE6(( "sph: opcode ptrn: %d, %s %s\n",
-                          i,
-                          exc->face->root.family_name,
-                          exc->face->root.style_name ));
-
-              switch ( i )
-              {
-              case 0:
-                break;
-              }
-              opcode_pointer[i] = 0;
-            }
-          }
-          else
-            opcode_pointer[i] = 0;
-        }
-      }
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
       {
         FT_Long*  args   = exc->stack + exc->args;
         FT_Byte   opcode = exc->opcode;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttinterp.h 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttinterp.h
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttinterp.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttinterp.h	2024-11-20 13:56:33.000000000 +0000
@@ -98,48 +98,6 @@ FT_BEGIN_HEADER
   } TT_CallRec, *TT_CallStack;
 
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-  /**************************************************************************
-   *
-   * These structures define rules used to tweak subpixel hinting for
-   * various fonts.  "", 0, "", NULL value indicates to match any value.
-   */
-
-#define SPH_MAX_NAME_SIZE      32
-#define SPH_MAX_CLASS_MEMBERS  100
-
-  typedef struct  SPH_TweakRule_
-  {
-    const char      family[SPH_MAX_NAME_SIZE];
-    const FT_UInt   ppem;
-    const char      style[SPH_MAX_NAME_SIZE];
-    const FT_ULong  glyph;
-
-  } SPH_TweakRule;
-
-
-  typedef struct  SPH_ScaleRule_
-  {
-    const char      family[SPH_MAX_NAME_SIZE];
-    const FT_UInt   ppem;
-    const char      style[SPH_MAX_NAME_SIZE];
-    const FT_ULong  glyph;
-    const FT_ULong  scale;
-
-  } SPH_ScaleRule;
-
-
-  typedef struct  SPH_Font_Class_
-  {
-    const char  name[SPH_MAX_NAME_SIZE];
-    const char  member[SPH_MAX_CLASS_MEMBERS][SPH_MAX_NAME_SIZE];
-
-  } SPH_Font_Class;
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-
   /**************************************************************************
    *
    * The main structure for the interpreter which collects all necessary
@@ -399,38 +357,6 @@ FT_BEGIN_HEADER
     FT_Bool            grayscale_cleartype;
 #endif /* TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL */
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    TT_Round_Func      func_round_sphn;   /* subpixel rounding function */
-
-    FT_Bool            subpixel_hinting;  /* Using subpixel hinting?       */
-    FT_Bool            ignore_x_mode;     /* Standard rendering mode for   */
-                                          /* subpixel hinting.  On if gray */
-                                          /* or subpixel hinting is on.    */
-
-    /* The following 6 aren't fully implemented but here for MS rasterizer */
-    /* compatibility.                                                      */
-    FT_Bool            compatible_widths;     /* compatible widths?        */
-    FT_Bool            symmetrical_smoothing; /* symmetrical_smoothing?    */
-    FT_Bool            bgr;                   /* bgr instead of rgb?       */
-    FT_Bool            vertical_lcd;          /* long side of LCD subpixel */
-                                              /* rectangles is horizontal  */
-    FT_Bool            subpixel_positioned;   /* subpixel positioned       */
-                                              /* (DirectWrite ClearType)?  */
-    FT_Bool            gray_cleartype;        /* ClearType hinting but     */
-                                              /* grayscale rendering       */
-
-    FT_Int             rasterizer_version;    /* MS rasterizer version     */
-
-    FT_Bool            iup_called;            /* IUP called for glyph?     */
-
-    FT_ULong           sph_tweak_flags;       /* flags to control          */
-                                              /* hint tweaks               */
-
-    FT_ULong           sph_in_func_flags;     /* flags to indicate if in   */
-                                              /* special functions         */
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
     /* We maintain two counters (in addition to the instruction counter) */
     /* that act as loop detectors for LOOPCALL and jump opcodes with     */
     /* negative arguments.                                               */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttobjs.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttobjs.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttobjs.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttobjs.c	2024-11-20 13:56:33.000000000 +0000
@@ -1481,9 +1481,6 @@
     TT_Driver  driver = (TT_Driver)ttdriver;
 
     driver->interpreter_version = TT_INTERPRETER_VERSION_35;
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    driver->interpreter_version = TT_INTERPRETER_VERSION_38;
-#endif
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
     driver->interpreter_version = TT_INTERPRETER_VERSION_40;
 #endif
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttobjs.h 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttobjs.h
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttobjs.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttobjs.h	2024-11-20 13:56:33.000000000 +0000
@@ -162,8 +162,6 @@ FT_BEGIN_HEADER
     FT_Long   end;            /* where does it end?                     */
     FT_UInt   opc;            /* function #, or instruction code        */
     FT_Bool   active;         /* is it active?                          */
-    FT_Bool   inline_delta;   /* is function that defines inline delta? */
-    FT_ULong  sph_fdef_flags; /* flags to identify special functions    */
 
   } TT_DefRecord, *TT_DefArray;
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttsubpix.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttsubpix.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttsubpix.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttsubpix.c	1970-01-01 00:00:00.000000000 +0000
@@ -1,1013 +0,0 @@
-/****************************************************************************
- *
- * ttsubpix.c
- *
- *   TrueType Subpixel Hinting.
- *
- * Copyright (C) 2010-2023 by
- * David Turner, Robert Wilhelm, and Werner Lemberg.
- *
- * This file is part of the FreeType project, and may only be used,
- * modified, and distributed under the terms of the FreeType project
- * license, LICENSE.TXT.  By continuing to use, modify, or distribute
- * this file you indicate that you have read the license and
- * understand and accept it fully.
- *
- */
-
-#include <freetype/internal/ftdebug.h>
-#include <freetype/internal/ftcalc.h>
-#include <freetype/internal/ftstream.h>
-#include <freetype/internal/sfnt.h>
-#include <freetype/tttags.h>
-#include <freetype/ftoutln.h>
-#include <freetype/ftdriver.h>
-
-#include "ttsubpix.h"
-
-
-#if defined( TT_USE_BYTECODE_INTERPRETER )            && \
-    defined( TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY )
-
-  /**************************************************************************
-   *
-   * These rules affect how the TT Interpreter does hinting, with the
-   * goal of doing subpixel hinting by (in general) ignoring x moves.
-   * Some of these rules are fixes that go above and beyond the
-   * stated techniques in the MS whitepaper on Cleartype, due to
-   * artifacts in many glyphs.  So, these rules make some glyphs render
-   * better than they do in the MS rasterizer.
-   *
-   * "" string or 0 int/char indicates to apply to all glyphs.
-   * "-" used as dummy placeholders, but any non-matching string works.
-   *
-   * Some of this could arguably be implemented in fontconfig, however:
-   *
-   * - Fontconfig can't set things on a glyph-by-glyph basis.
-   * - The tweaks that happen here are very low-level, from an average
-   *   user's point of view and are best implemented in the hinter.
-   *
-   * The goal is to make the subpixel hinting techniques as generalized
-   * as possible across all fonts to prevent the need for extra rules such
-   * as these.
-   *
-   * The rule structure is designed so that entirely new rules can easily
-   * be added when a new compatibility feature is discovered.
-   *
-   * The rule structures could also use some enhancement to handle ranges.
-   *
-   *     ****************** WORK IN PROGRESS *******************
-   */
-
-  /* These are `classes' of fonts that can be grouped together and used in */
-  /* rules below.  A blank entry "" is required at the end of these!       */
-#define FAMILY_CLASS_RULES_SIZE  7
-
-  static const SPH_Font_Class  FAMILY_CLASS_Rules
-                               [FAMILY_CLASS_RULES_SIZE] =
-  {
-    { "MS Legacy Fonts",
-      { "Aharoni",
-        "Andale Mono",
-        "Andalus",
-        "Angsana New",
-        "AngsanaUPC",
-        "Arabic Transparent",
-        "Arial Black",
-        "Arial Narrow",
-        "Arial Unicode MS",
-        "Arial",
-        "Batang",
-        "Browallia New",
-        "BrowalliaUPC",
-        "Comic Sans MS",
-        "Cordia New",
-        "CordiaUPC",
-        "Courier New",
-        "DFKai-SB",
-        "David Transparent",
-        "David",
-        "DilleniaUPC",
-        "Estrangelo Edessa",
-        "EucrosiaUPC",
-        "FangSong_GB2312",
-        "Fixed Miriam Transparent",
-        "FrankRuehl",
-        "Franklin Gothic Medium",
-        "FreesiaUPC",
-        "Garamond",
-        "Gautami",
-        "Georgia",
-        "Gulim",
-        "Impact",
-        "IrisUPC",
-        "JasmineUPC",
-        "KaiTi_GB2312",
-        "KodchiangUPC",
-        "Latha",
-        "Levenim MT",
-        "LilyUPC",
-        "Lucida Console",
-        "Lucida Sans Unicode",
-        "MS Gothic",
-        "MS Mincho",
-        "MV Boli",
-        "Mangal",
-        "Marlett",
-        "Microsoft Sans Serif",
-        "Mingliu",
-        "Miriam Fixed",
-        "Miriam Transparent",
-        "Miriam",
-        "Narkisim",
-        "Palatino Linotype",
-        "Raavi",
-        "Rod Transparent",
-        "Rod",
-        "Shruti",
-        "SimHei",
-        "Simplified Arabic Fixed",
-        "Simplified Arabic",
-        "Simsun",
-        "Sylfaen",
-        "Symbol",
-        "Tahoma",
-        "Times New Roman",
-        "Traditional Arabic",
-        "Trebuchet MS",
-        "Tunga",
-        "Verdana",
-        "Webdings",
-        "Wingdings",
-        "",
-      },
-    },
-    { "Core MS Legacy Fonts",
-      { "Arial Black",
-        "Arial Narrow",
-        "Arial Unicode MS",
-        "Arial",
-        "Comic Sans MS",
-        "Courier New",
-        "Garamond",
-        "Georgia",
-        "Impact",
-        "Lucida Console",
-        "Lucida Sans Unicode",
-        "Microsoft Sans Serif",
-        "Palatino Linotype",
-        "Tahoma",
-        "Times New Roman",
-        "Trebuchet MS",
-        "Verdana",
-        "",
-      },
-    },
-    { "Apple Legacy Fonts",
-      { "Geneva",
-        "Times",
-        "Monaco",
-        "Century",
-        "Chalkboard",
-        "Lobster",
-        "Century Gothic",
-        "Optima",
-        "Lucida Grande",
-        "Gill Sans",
-        "Baskerville",
-        "Helvetica",
-        "Helvetica Neue",
-        "",
-      },
-    },
-    { "Legacy Sans Fonts",
-      { "Andale Mono",
-        "Arial Unicode MS",
-        "Arial",
-        "Century Gothic",
-        "Comic Sans MS",
-        "Franklin Gothic Medium",
-        "Geneva",
-        "Lucida Console",
-        "Lucida Grande",
-        "Lucida Sans Unicode",
-        "Lucida Sans Typewriter",
-        "Microsoft Sans Serif",
-        "Monaco",
-        "Tahoma",
-        "Trebuchet MS",
-        "Verdana",
-        "",
-      },
-    },
-
-    { "Misc Legacy Fonts",
-      { "Dark Courier", "", }, },
-    { "Verdana Clones",
-      { "DejaVu Sans",
-        "Bitstream Vera Sans", "", }, },
-    { "Verdana and Clones",
-      { "DejaVu Sans",
-        "Bitstream Vera Sans",
-        "Verdana", "", }, },
-  };
-
-
-  /* Define this to force natural (i.e. not bitmap-compatible) widths.     */
-  /* The default leans strongly towards natural widths except for a few    */
-  /* legacy fonts where a selective combination produces nicer results.    */
-/* #define FORCE_NATURAL_WIDTHS   */
-
-
-  /* Define `classes' of styles that can be grouped together and used in   */
-  /* rules below.  A blank entry "" is required at the end of these!       */
-#define STYLE_CLASS_RULES_SIZE  5
-
-  static const SPH_Font_Class  STYLE_CLASS_Rules
-                               [STYLE_CLASS_RULES_SIZE] =
-  {
-    { "Regular Class",
-      { "Regular",
-        "Book",
-        "Medium",
-        "Roman",
-        "Normal",
-        "",
-      },
-    },
-    { "Regular/Italic Class",
-      { "Regular",
-        "Book",
-        "Medium",
-        "Italic",
-        "Oblique",
-        "Roman",
-        "Normal",
-        "",
-      },
-    },
-    { "Bold/BoldItalic Class",
-      { "Bold",
-        "Bold Italic",
-        "Black",
-        "",
-      },
-    },
-    { "Bold/Italic/BoldItalic Class",
-      { "Bold",
-        "Bold Italic",
-        "Black",
-        "Italic",
-        "Oblique",
-        "",
-      },
-    },
-    { "Regular/Bold Class",
-      { "Regular",
-        "Book",
-        "Medium",
-        "Normal",
-        "Roman",
-        "Bold",
-        "Black",
-        "",
-      },
-    },
-  };
-
-
-  /* Force special legacy fixes for fonts.                                 */
-#define COMPATIBILITY_MODE_RULES_SIZE  1
-
-  static const SPH_TweakRule  COMPATIBILITY_MODE_Rules
-                              [COMPATIBILITY_MODE_RULES_SIZE] =
-  {
-    { "Verdana Clones", 0, "", 0 },
-  };
-
-
-  /* Don't do subpixel (ignore_x_mode) hinting; do normal hinting.         */
-#define PIXEL_HINTING_RULES_SIZE  2
-
-  static const SPH_TweakRule  PIXEL_HINTING_Rules
-                              [PIXEL_HINTING_RULES_SIZE] =
-  {
-    /* these characters are almost always safe */
-    { "Courier New", 12, "Italic", 'z' },
-    { "Courier New", 11, "Italic", 'z' },
-  };
-
-
-  /* Subpixel hinting ignores SHPIX rules on X.  Force SHPIX for these.    */
-#define DO_SHPIX_RULES_SIZE  1
-
-  static const SPH_TweakRule  DO_SHPIX_Rules
-                              [DO_SHPIX_RULES_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Skip Y moves that start with a point that is not on a Y pixel         */
-  /* boundary and don't move that point to a Y pixel boundary.             */
-#define SKIP_NONPIXEL_Y_MOVES_RULES_SIZE  4
-
-  static const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_Rules
-                              [SKIP_NONPIXEL_Y_MOVES_RULES_SIZE] =
-  {
-    /* fix vwxyz thinness */
-    { "Consolas", 0, "", 0 },
-    /* Fix thin middle stems */
-    { "Core MS Legacy Fonts", 0, "Regular", 0 },
-    /* Cyrillic small letter I */
-    { "Legacy Sans Fonts", 0, "", 0 },
-    /* Fix artifacts with some Regular & Bold */
-    { "Verdana Clones", 0, "", 0 },
-  };
-
-
-#define SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1
-
-  static const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions
-                              [SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
-  {
-    /* Fixes < and > */
-    { "Courier New", 0, "Regular", 0 },
-  };
-
-
-  /* Skip Y moves that start with a point that is not on a Y pixel         */
-  /* boundary and don't move that point to a Y pixel boundary.             */
-#define SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE  2
-
-  static const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_DELTAP_Rules
-                              [SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE] =
-  {
-    /* Maintain thickness of diagonal in 'N' */
-    { "Times New Roman", 0, "Regular/Bold Class", 'N' },
-    { "Georgia", 0, "Regular/Bold Class", 'N' },
-  };
-
-
-  /* Skip Y moves that move a point off a Y pixel boundary.                */
-#define SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE  1
-
-  static const SPH_TweakRule  SKIP_OFFPIXEL_Y_MOVES_Rules
-                              [SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-#define SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1
-
-  static const SPH_TweakRule  SKIP_OFFPIXEL_Y_MOVES_Rules_Exceptions
-                              [SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Round moves that don't move a point to a Y pixel boundary.            */
-#define ROUND_NONPIXEL_Y_MOVES_RULES_SIZE  2
-
-  static const SPH_TweakRule  ROUND_NONPIXEL_Y_MOVES_Rules
-                              [ROUND_NONPIXEL_Y_MOVES_RULES_SIZE] =
-  {
-    /* Droid font instructions don't snap Y to pixels */
-    { "Droid Sans", 0, "Regular/Italic Class", 0 },
-    { "Droid Sans Mono", 0, "", 0 },
-  };
-
-
-#define ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1
-
-  static const SPH_TweakRule  ROUND_NONPIXEL_Y_MOVES_Rules_Exceptions
-                              [ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Allow a Direct_Move along X freedom vector if matched.                */
-#define ALLOW_X_DMOVE_RULES_SIZE  1
-
-  static const SPH_TweakRule  ALLOW_X_DMOVE_Rules
-                              [ALLOW_X_DMOVE_RULES_SIZE] =
-  {
-    /* Fixes vanishing diagonal in 4 */
-    { "Verdana", 0, "Regular", '4' },
-  };
-
-
-  /* Return MS rasterizer version 35 if matched.                           */
-#define RASTERIZER_35_RULES_SIZE  8
-
-  static const SPH_TweakRule  RASTERIZER_35_Rules
-                              [RASTERIZER_35_RULES_SIZE] =
-  {
-    /* This seems to be the only way to make these look good */
-    { "Times New Roman", 0, "Regular", 'i' },
-    { "Times New Roman", 0, "Regular", 'j' },
-    { "Times New Roman", 0, "Regular", 'm' },
-    { "Times New Roman", 0, "Regular", 'r' },
-    { "Times New Roman", 0, "Regular", 'a' },
-    { "Times New Roman", 0, "Regular", 'n' },
-    { "Times New Roman", 0, "Regular", 'p' },
-    { "Times", 0, "", 0 },
-  };
-
-
-  /* Don't round to the subpixel grid.  Round to pixel grid.               */
-#define NORMAL_ROUND_RULES_SIZE  1
-
-  static const SPH_TweakRule  NORMAL_ROUND_Rules
-                              [NORMAL_ROUND_RULES_SIZE] =
-  {
-    /* Fix serif thickness for certain ppems */
-    /* Can probably be generalized somehow   */
-    { "Courier New", 0, "", 0 },
-  };
-
-
-  /* Skip IUP instructions if matched.                                     */
-#define SKIP_IUP_RULES_SIZE  1
-
-  static const SPH_TweakRule  SKIP_IUP_Rules
-                              [SKIP_IUP_RULES_SIZE] =
-  {
-    { "Arial", 13, "Regular", 'a' },
-  };
-
-
-  /* Skip MIAP Twilight hack if matched.                                   */
-#define MIAP_HACK_RULES_SIZE  1
-
-  static const SPH_TweakRule  MIAP_HACK_Rules
-                              [MIAP_HACK_RULES_SIZE] =
-  {
-    { "Geneva", 12, "", 0 },
-  };
-
-
-  /* Skip DELTAP instructions if matched.                                  */
-#define ALWAYS_SKIP_DELTAP_RULES_SIZE  23
-
-  static const SPH_TweakRule  ALWAYS_SKIP_DELTAP_Rules
-                              [ALWAYS_SKIP_DELTAP_RULES_SIZE] =
-  {
-    { "Georgia", 0, "Regular", 'k' },
-    /* fix various problems with e in different versions */
-    { "Trebuchet MS", 14, "Regular", 'e' },
-    { "Trebuchet MS", 13, "Regular", 'e' },
-    { "Trebuchet MS", 15, "Regular", 'e' },
-    { "Trebuchet MS", 0, "Italic", 'v' },
-    { "Trebuchet MS", 0, "Italic", 'w' },
-    { "Trebuchet MS", 0, "Regular", 'Y' },
-    { "Arial", 11, "Regular", 's' },
-    /* prevent problems with '3' and others */
-    { "Verdana", 10, "Regular", 0 },
-    { "Verdana", 9, "Regular", 0 },
-    /* Cyrillic small letter short I */
-    { "Legacy Sans Fonts", 0, "", 0x438 },
-    { "Legacy Sans Fonts", 0, "", 0x439 },
-    { "Arial", 10, "Regular", '6' },
-    { "Arial", 0, "Bold/BoldItalic Class", 'a' },
-    /* Make horizontal stems consistent with the rest */
-    { "Arial", 24, "Bold", 'a' },
-    { "Arial", 25, "Bold", 'a' },
-    { "Arial", 24, "Bold", 's' },
-    { "Arial", 25, "Bold", 's' },
-    { "Arial", 34, "Bold", 's' },
-    { "Arial", 35, "Bold", 's' },
-    { "Arial", 36, "Bold", 's' },
-    { "Arial", 25, "Regular", 's' },
-    { "Arial", 26, "Regular", 's' },
-  };
-
-
-  /* Always do DELTAP instructions if matched.                             */
-#define ALWAYS_DO_DELTAP_RULES_SIZE  1
-
-  static const SPH_TweakRule  ALWAYS_DO_DELTAP_Rules
-                              [ALWAYS_DO_DELTAP_RULES_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Don't allow ALIGNRP after IUP.                                        */
-#define NO_ALIGNRP_AFTER_IUP_RULES_SIZE  1
-
-  static const SPH_TweakRule  NO_ALIGNRP_AFTER_IUP_Rules
-                              [NO_ALIGNRP_AFTER_IUP_RULES_SIZE] =
-  {
-    /* Prevent creation of dents in outline */
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Don't allow DELTAP after IUP.                                         */
-#define NO_DELTAP_AFTER_IUP_RULES_SIZE  1
-
-  static const SPH_TweakRule  NO_DELTAP_AFTER_IUP_Rules
-                              [NO_DELTAP_AFTER_IUP_RULES_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Don't allow CALL after IUP.                                           */
-#define NO_CALL_AFTER_IUP_RULES_SIZE  1
-
-  static const SPH_TweakRule  NO_CALL_AFTER_IUP_Rules
-                              [NO_CALL_AFTER_IUP_RULES_SIZE] =
-  {
-    /* Prevent creation of dents in outline */
-    { "-", 0, "", 0 },
-  };
-
-
-  /* De-embolden these glyphs slightly.                                    */
-#define DEEMBOLDEN_RULES_SIZE  9
-
-  static const SPH_TweakRule  DEEMBOLDEN_Rules
-                              [DEEMBOLDEN_RULES_SIZE] =
-  {
-    { "Courier New", 0, "Bold", 'A' },
-    { "Courier New", 0, "Bold", 'W' },
-    { "Courier New", 0, "Bold", 'w' },
-    { "Courier New", 0, "Bold", 'M' },
-    { "Courier New", 0, "Bold", 'X' },
-    { "Courier New", 0, "Bold", 'K' },
-    { "Courier New", 0, "Bold", 'x' },
-    { "Courier New", 0, "Bold", 'z' },
-    { "Courier New", 0, "Bold", 'v' },
-  };
-
-
-  /* Embolden these glyphs slightly.                                       */
-#define EMBOLDEN_RULES_SIZE  2
-
-  static const SPH_TweakRule  EMBOLDEN_Rules
-                              [EMBOLDEN_RULES_SIZE] =
-  {
-    { "Courier New", 0, "Regular", 0 },
-    { "Courier New", 0, "Italic", 0 },
-  };
-
-
-  /* This is a CVT hack that makes thick horizontal stems on 2, 5, 7       */
-  /* similar to Windows XP.                                                */
-#define TIMES_NEW_ROMAN_HACK_RULES_SIZE  12
-
-  static const SPH_TweakRule  TIMES_NEW_ROMAN_HACK_Rules
-                              [TIMES_NEW_ROMAN_HACK_RULES_SIZE] =
-  {
-    { "Times New Roman", 16, "Italic", '2' },
-    { "Times New Roman", 16, "Italic", '5' },
-    { "Times New Roman", 16, "Italic", '7' },
-    { "Times New Roman", 16, "Regular", '2' },
-    { "Times New Roman", 16, "Regular", '5' },
-    { "Times New Roman", 16, "Regular", '7' },
-    { "Times New Roman", 17, "Italic", '2' },
-    { "Times New Roman", 17, "Italic", '5' },
-    { "Times New Roman", 17, "Italic", '7' },
-    { "Times New Roman", 17, "Regular", '2' },
-    { "Times New Roman", 17, "Regular", '5' },
-    { "Times New Roman", 17, "Regular", '7' },
-  };
-
-
-  /* This fudges distance on 2 to get rid of the vanishing stem issue.     */
-  /* A real solution to this is certainly welcome.                         */
-#define COURIER_NEW_2_HACK_RULES_SIZE  15
-
-  static const SPH_TweakRule  COURIER_NEW_2_HACK_Rules
-                              [COURIER_NEW_2_HACK_RULES_SIZE] =
-  {
-    { "Courier New", 10, "Regular", '2' },
-    { "Courier New", 11, "Regular", '2' },
-    { "Courier New", 12, "Regular", '2' },
-    { "Courier New", 13, "Regular", '2' },
-    { "Courier New", 14, "Regular", '2' },
-    { "Courier New", 15, "Regular", '2' },
-    { "Courier New", 16, "Regular", '2' },
-    { "Courier New", 17, "Regular", '2' },
-    { "Courier New", 18, "Regular", '2' },
-    { "Courier New", 19, "Regular", '2' },
-    { "Courier New", 20, "Regular", '2' },
-    { "Courier New", 21, "Regular", '2' },
-    { "Courier New", 22, "Regular", '2' },
-    { "Courier New", 23, "Regular", '2' },
-    { "Courier New", 24, "Regular", '2' },
-  };
-
-
-#ifndef FORCE_NATURAL_WIDTHS
-
-  /* Use compatible widths with these glyphs.  Compatible widths is always */
-  /* on when doing B/W TrueType instructing, but is used selectively here, */
-  /* typically on glyphs with 3 or more vertical stems.                    */
-#define COMPATIBLE_WIDTHS_RULES_SIZE  38
-
-  static const SPH_TweakRule  COMPATIBLE_WIDTHS_Rules
-                              [COMPATIBLE_WIDTHS_RULES_SIZE] =
-  {
-    { "Arial Unicode MS", 12, "Regular Class", 'm' },
-    { "Arial Unicode MS", 14, "Regular Class", 'm' },
-    /* Cyrillic small letter sha */
-    { "Arial", 10, "Regular Class", 0x448 },
-    { "Arial", 11, "Regular Class", 'm' },
-    { "Arial", 12, "Regular Class", 'm' },
-    /* Cyrillic small letter sha */
-    { "Arial", 12, "Regular Class", 0x448 },
-    { "Arial", 13, "Regular Class", 0x448 },
-    { "Arial", 14, "Regular Class", 'm' },
-    /* Cyrillic small letter sha */
-    { "Arial", 14, "Regular Class", 0x448 },
-    { "Arial", 15, "Regular Class", 0x448 },
-    { "Arial", 17, "Regular Class", 'm' },
-    { "DejaVu Sans", 15, "Regular Class", 0 },
-    { "Microsoft Sans Serif", 11, "Regular Class", 0 },
-    { "Microsoft Sans Serif", 12, "Regular Class", 0 },
-    { "Segoe UI", 11, "Regular Class", 0 },
-    { "Monaco", 0, "Regular Class", 0 },
-    { "Segoe UI", 12, "Regular Class", 'm' },
-    { "Segoe UI", 14, "Regular Class", 'm' },
-    { "Tahoma", 11, "Regular Class", 0 },
-    { "Times New Roman", 16, "Regular Class", 'c' },
-    { "Times New Roman", 16, "Regular Class", 'm' },
-    { "Times New Roman", 16, "Regular Class", 'o' },
-    { "Times New Roman", 16, "Regular Class", 'w' },
-    { "Trebuchet MS", 11, "Regular Class", 0 },
-    { "Trebuchet MS", 12, "Regular Class", 0 },
-    { "Trebuchet MS", 14, "Regular Class", 0 },
-    { "Trebuchet MS", 15, "Regular Class", 0 },
-    { "Ubuntu", 12, "Regular Class", 'm' },
-    /* Cyrillic small letter sha */
-    { "Verdana", 10, "Regular Class", 0x448 },
-    { "Verdana", 11, "Regular Class", 0x448 },
-    { "Verdana and Clones", 12, "Regular Class", 'i' },
-    { "Verdana and Clones", 12, "Regular Class", 'j' },
-    { "Verdana and Clones", 12, "Regular Class", 'l' },
-    { "Verdana and Clones", 12, "Regular Class", 'm' },
-    { "Verdana and Clones", 13, "Regular Class", 'i' },
-    { "Verdana and Clones", 13, "Regular Class", 'j' },
-    { "Verdana and Clones", 13, "Regular Class", 'l' },
-    { "Verdana and Clones", 14, "Regular Class", 'm' },
-  };
-
-
-  /* Scaling slightly in the x-direction prior to hinting results in       */
-  /* more visually pleasing glyphs in certain cases.                       */
-  /* This sometimes needs to be coordinated with compatible width rules.   */
-  /* A value of 1000 corresponds to a scaled value of 1.0.                 */
-
-#define X_SCALING_RULES_SIZE  50
-
-  static const SPH_ScaleRule  X_SCALING_Rules[X_SCALING_RULES_SIZE] =
-  {
-    { "DejaVu Sans", 12, "Regular Class", 'm', 950 },
-    { "Verdana and Clones", 12, "Regular Class", 'a', 1100 },
-    { "Verdana and Clones", 13, "Regular Class", 'a', 1050 },
-    { "Arial", 11, "Regular Class", 'm', 975 },
-    { "Arial", 12, "Regular Class", 'm', 1050 },
-    /* Cyrillic small letter el */
-    { "Arial", 13, "Regular Class", 0x43B, 950 },
-    { "Arial", 13, "Regular Class", 'o', 950 },
-    { "Arial", 13, "Regular Class", 'e', 950 },
-    { "Arial", 14, "Regular Class", 'm', 950 },
-    /* Cyrillic small letter el */
-    { "Arial", 15, "Regular Class", 0x43B, 925 },
-    { "Bitstream Vera Sans", 10, "Regular/Italic Class", 0, 1100 },
-    { "Bitstream Vera Sans", 12, "Regular/Italic Class", 0, 1050 },
-    { "Bitstream Vera Sans", 16, "Regular Class", 0, 1050 },
-    { "Bitstream Vera Sans", 9, "Regular/Italic Class", 0, 1050 },
-    { "DejaVu Sans", 12, "Regular Class", 'l', 975 },
-    { "DejaVu Sans", 12, "Regular Class", 'i', 975 },
-    { "DejaVu Sans", 12, "Regular Class", 'j', 975 },
-    { "DejaVu Sans", 13, "Regular Class", 'l', 950 },
-    { "DejaVu Sans", 13, "Regular Class", 'i', 950 },
-    { "DejaVu Sans", 13, "Regular Class", 'j', 950 },
-    { "DejaVu Sans", 10, "Regular/Italic Class", 0, 1100 },
-    { "DejaVu Sans", 12, "Regular/Italic Class", 0, 1050 },
-    { "Georgia", 10, "", 0, 1050 },
-    { "Georgia", 11, "", 0, 1100 },
-    { "Georgia", 12, "", 0, 1025 },
-    { "Georgia", 13, "", 0, 1050 },
-    { "Georgia", 16, "", 0, 1050 },
-    { "Georgia", 17, "", 0, 1030 },
-    { "Liberation Sans", 12, "Regular Class", 'm', 1100 },
-    { "Lucida Grande", 11, "Regular Class", 'm', 1100 },
-    { "Microsoft Sans Serif", 11, "Regular Class", 'm', 950 },
-    { "Microsoft Sans Serif", 12, "Regular Class", 'm', 1050 },
-    { "Segoe UI", 12, "Regular Class", 'H', 1050 },
-    { "Segoe UI", 12, "Regular Class", 'm', 1050 },
-    { "Segoe UI", 14, "Regular Class", 'm', 1050 },
-    { "Tahoma", 11, "Regular Class", 'i', 975 },
-    { "Tahoma", 11, "Regular Class", 'l', 975 },
-    { "Tahoma", 11, "Regular Class", 'j', 900 },
-    { "Tahoma", 11, "Regular Class", 'm', 918 },
-    { "Verdana", 10, "Regular/Italic Class", 0, 1100 },
-    { "Verdana", 12, "Regular Class", 'm', 975 },
-    { "Verdana", 12, "Regular/Italic Class", 0, 1050 },
-    { "Verdana", 13, "Regular/Italic Class", 'i', 950 },
-    { "Verdana", 13, "Regular/Italic Class", 'j', 950 },
-    { "Verdana", 13, "Regular/Italic Class", 'l', 950 },
-    { "Verdana", 16, "Regular Class", 0, 1050 },
-    { "Verdana", 9, "Regular/Italic Class", 0, 1050 },
-    { "Times New Roman", 16, "Regular Class", 'm', 918 },
-    { "Trebuchet MS", 11, "Regular Class", 'm', 800 },
-    { "Trebuchet MS", 12, "Regular Class", 'm', 800 },
-  };
-
-#else
-
-#define COMPATIBLE_WIDTHS_RULES_SIZE  1
-
-  static const SPH_TweakRule  COMPATIBLE_WIDTHS_Rules
-                              [COMPATIBLE_WIDTHS_RULES_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-#define X_SCALING_RULES_SIZE  1
-
-  static const SPH_ScaleRule  X_SCALING_Rules
-                              [X_SCALING_RULES_SIZE] =
-  {
-    { "-", 0, "", 0, 1000 },
-  };
-
-#endif /* FORCE_NATURAL_WIDTHS */
-
-
-  static FT_Bool
-  is_member_of_family_class( const FT_String*  detected_font_name,
-                             const FT_String*  rule_font_name )
-  {
-    FT_UInt  i, j;
-
-
-    /* Does font name match rule family? */
-    if ( ft_strcmp( detected_font_name, rule_font_name ) == 0 )
-      return TRUE;
-
-    /* Is font name a wildcard ""? */
-    if ( ft_strcmp( rule_font_name, "" ) == 0 )
-      return TRUE;
-
-    /* Is font name contained in a class list? */
-    for ( i = 0; i < FAMILY_CLASS_RULES_SIZE; i++ )
-    {
-      if ( ft_strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 )
-      {
-        for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
-        {
-          if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j], "" ) == 0 )
-            continue;
-          if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j],
-                          detected_font_name ) == 0 )
-            return TRUE;
-        }
-      }
-    }
-
-    return FALSE;
-  }
-
-
-  static FT_Bool
-  is_member_of_style_class( const FT_String*  detected_font_style,
-                            const FT_String*  rule_font_style )
-  {
-    FT_UInt  i, j;
-
-
-    /* Does font style match rule style? */
-    if ( ft_strcmp( detected_font_style, rule_font_style ) == 0 )
-      return TRUE;
-
-    /* Is font style a wildcard ""? */
-    if ( ft_strcmp( rule_font_style, "" ) == 0 )
-      return TRUE;
-
-    /* Is font style contained in a class list? */
-    for ( i = 0; i < STYLE_CLASS_RULES_SIZE; i++ )
-    {
-      if ( ft_strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 )
-      {
-        for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
-        {
-          if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j], "" ) == 0 )
-            continue;
-          if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j],
-                          detected_font_style ) == 0 )
-            return TRUE;
-        }
-      }
-    }
-
-    return FALSE;
-  }
-
-
-  FT_LOCAL_DEF( FT_Bool )
-  sph_test_tweak( TT_Face               face,
-                  const FT_String*      family,
-                  FT_UInt               ppem,
-                  const FT_String*      style,
-                  FT_UInt               glyph_index,
-                  const SPH_TweakRule*  rule,
-                  FT_UInt               num_rules )
-  {
-    FT_UInt  i;
-
-
-    /* rule checks may be able to be optimized further */
-    for ( i = 0; i < num_rules; i++ )
-    {
-      if ( family                                                   &&
-           ( is_member_of_family_class ( family, rule[i].family ) ) )
-        if ( rule[i].ppem == 0    ||
-             rule[i].ppem == ppem )
-          if ( style                                             &&
-               is_member_of_style_class ( style, rule[i].style ) )
-            if ( rule[i].glyph == 0                                ||
-                 FT_Get_Char_Index( (FT_Face)face,
-                                    rule[i].glyph ) == glyph_index )
-        return TRUE;
-    }
-
-    return FALSE;
-  }
-
-
-  static FT_UInt
-  scale_test_tweak( TT_Face               face,
-                    const FT_String*      family,
-                    FT_UInt               ppem,
-                    const FT_String*      style,
-                    FT_UInt               glyph_index,
-                    const SPH_ScaleRule*  rule,
-                    FT_UInt               num_rules )
-  {
-    FT_UInt  i;
-
-
-    /* rule checks may be able to be optimized further */
-    for ( i = 0; i < num_rules; i++ )
-    {
-      if ( family                                                   &&
-           ( is_member_of_family_class ( family, rule[i].family ) ) )
-        if ( rule[i].ppem == 0    ||
-             rule[i].ppem == ppem )
-          if ( style                                            &&
-               is_member_of_style_class( style, rule[i].style ) )
-            if ( rule[i].glyph == 0                                ||
-                 FT_Get_Char_Index( (FT_Face)face,
-                                    rule[i].glyph ) == glyph_index )
-        return rule[i].scale;
-    }
-
-    return 1000;
-  }
-
-
-  FT_LOCAL_DEF( FT_UInt )
-  sph_test_tweak_x_scaling( TT_Face           face,
-                            const FT_String*  family,
-                            FT_UInt           ppem,
-                            const FT_String*  style,
-                            FT_UInt           glyph_index )
-  {
-    return scale_test_tweak( face, family, ppem, style, glyph_index,
-                             X_SCALING_Rules, X_SCALING_RULES_SIZE );
-  }
-
-
-#define TWEAK_RULES( x )                                       \
-  if ( sph_test_tweak( face, family, ppem, style, glyph_index, \
-                       x##_Rules, x##_RULES_SIZE ) )           \
-    loader->exec->sph_tweak_flags |= SPH_TWEAK_##x
-
-#define TWEAK_RULES_EXCEPTIONS( x )                                        \
-  if ( sph_test_tweak( face, family, ppem, style, glyph_index,             \
-                       x##_Rules_Exceptions, x##_RULES_EXCEPTIONS_SIZE ) ) \
-    loader->exec->sph_tweak_flags &= ~SPH_TWEAK_##x
-
-
-  FT_LOCAL_DEF( void )
-  sph_set_tweaks( TT_Loader  loader,
-                  FT_UInt    glyph_index )
-  {
-    TT_Face     face   = loader->face;
-    FT_String*  family = face->root.family_name;
-    FT_UInt     ppem   = loader->size->metrics->x_ppem;
-    FT_String*  style  = face->root.style_name;
-
-
-    /* don't apply rules if style isn't set */
-    if ( !face->root.style_name )
-      return;
-
-#ifdef SPH_DEBUG_MORE_VERBOSE
-    printf( "%s,%d,%s,%c=%d ",
-            family, ppem, style, glyph_index, glyph_index );
-#endif
-
-    TWEAK_RULES( PIXEL_HINTING );
-
-    if ( loader->exec->sph_tweak_flags & SPH_TWEAK_PIXEL_HINTING )
-    {
-      loader->exec->ignore_x_mode = FALSE;
-      return;
-    }
-
-    TWEAK_RULES( ALLOW_X_DMOVE );
-    TWEAK_RULES( ALWAYS_DO_DELTAP );
-    TWEAK_RULES( ALWAYS_SKIP_DELTAP );
-    TWEAK_RULES( DEEMBOLDEN );
-    TWEAK_RULES( DO_SHPIX );
-    TWEAK_RULES( EMBOLDEN );
-    TWEAK_RULES( MIAP_HACK );
-    TWEAK_RULES( NORMAL_ROUND );
-    TWEAK_RULES( NO_ALIGNRP_AFTER_IUP );
-    TWEAK_RULES( NO_CALL_AFTER_IUP );
-    TWEAK_RULES( NO_DELTAP_AFTER_IUP );
-    TWEAK_RULES( RASTERIZER_35 );
-    TWEAK_RULES( SKIP_IUP );
-
-    TWEAK_RULES( SKIP_OFFPIXEL_Y_MOVES );
-    TWEAK_RULES_EXCEPTIONS( SKIP_OFFPIXEL_Y_MOVES );
-
-    TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES_DELTAP );
-
-    TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES );
-    TWEAK_RULES_EXCEPTIONS( SKIP_NONPIXEL_Y_MOVES );
-
-    TWEAK_RULES( ROUND_NONPIXEL_Y_MOVES );
-    TWEAK_RULES_EXCEPTIONS( ROUND_NONPIXEL_Y_MOVES );
-
-    if ( loader->exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )
-    {
-      if ( loader->exec->rasterizer_version != TT_INTERPRETER_VERSION_35 )
-      {
-        loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
-        loader->exec->size->cvt_ready    = -1;
-
-        tt_size_ready_bytecode(
-          loader->exec->size,
-          FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );
-      }
-      else
-        loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
-    }
-    else
-    {
-      if ( loader->exec->rasterizer_version  !=
-           SPH_OPTION_SET_RASTERIZER_VERSION )
-      {
-        loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
-        loader->exec->size->cvt_ready    = -1;
-
-        tt_size_ready_bytecode(
-          loader->exec->size,
-          FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );
-      }
-      else
-        loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
-    }
-
-    if ( IS_HINTED( loader->load_flags ) )
-    {
-      TWEAK_RULES( TIMES_NEW_ROMAN_HACK );
-      TWEAK_RULES( COURIER_NEW_2_HACK );
-    }
-
-    if ( sph_test_tweak( face, family, ppem, style, glyph_index,
-           COMPATIBILITY_MODE_Rules, COMPATIBILITY_MODE_RULES_SIZE ) )
-      loader->exec->face->sph_compatibility_mode = TRUE;
-
-
-    if ( IS_HINTED( loader->load_flags ) )
-    {
-      if ( sph_test_tweak( face, family, ppem, style, glyph_index,
-             COMPATIBLE_WIDTHS_Rules, COMPATIBLE_WIDTHS_RULES_SIZE ) )
-        loader->exec->compatible_widths |= TRUE;
-    }
-  }
-
-#else /* !(TT_USE_BYTECODE_INTERPRETER &&          */
-      /*   TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */
-
-  /* ANSI C doesn't like empty source files */
-  typedef int  tt_subpix_dummy_;
-
-#endif /* !(TT_USE_BYTECODE_INTERPRETER &&          */
-       /*   TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */
-
-
-/* END */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttsubpix.h 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttsubpix.h
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/truetype/ttsubpix.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/truetype/ttsubpix.h	1970-01-01 00:00:00.000000000 +0000
@@ -1,110 +0,0 @@
-/****************************************************************************
- *
- * ttsubpix.h
- *
- *   TrueType Subpixel Hinting.
- *
- * Copyright (C) 2010-2023 by
- * David Turner, Robert Wilhelm, and Werner Lemberg.
- *
- * This file is part of the FreeType project, and may only be used,
- * modified, and distributed under the terms of the FreeType project
- * license, LICENSE.TXT.  By continuing to use, modify, or distribute
- * this file you indicate that you have read the license and
- * understand and accept it fully.
- *
- */
-
-
-#ifndef TTSUBPIX_H_
-#define TTSUBPIX_H_
-
-#include "ttobjs.h"
-#include "ttinterp.h"
-
-
-FT_BEGIN_HEADER
-
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-  /**************************************************************************
-   *
-   * ID flags to identify special functions at FDEF and runtime.
-   *
-   */
-#define SPH_FDEF_INLINE_DELTA_1       0x0000001
-#define SPH_FDEF_INLINE_DELTA_2       0x0000002
-#define SPH_FDEF_DIAGONAL_STROKE      0x0000004
-#define SPH_FDEF_VACUFORM_ROUND_1     0x0000008
-#define SPH_FDEF_TTFAUTOHINT_1        0x0000010
-#define SPH_FDEF_SPACING_1            0x0000020
-#define SPH_FDEF_SPACING_2            0x0000040
-#define SPH_FDEF_TYPEMAN_STROKES      0x0000080
-#define SPH_FDEF_TYPEMAN_DIAGENDCTRL  0x0000100
-
-
-  /**************************************************************************
-   *
-   * Tweak flags that are set for each glyph by the below rules.
-   *
-   */
-#define SPH_TWEAK_ALLOW_X_DMOVE                   0x0000001UL
-#define SPH_TWEAK_ALWAYS_DO_DELTAP                0x0000002UL
-#define SPH_TWEAK_ALWAYS_SKIP_DELTAP              0x0000004UL
-#define SPH_TWEAK_COURIER_NEW_2_HACK              0x0000008UL
-#define SPH_TWEAK_DEEMBOLDEN                      0x0000010UL
-#define SPH_TWEAK_DO_SHPIX                        0x0000020UL
-#define SPH_TWEAK_EMBOLDEN                        0x0000040UL
-#define SPH_TWEAK_MIAP_HACK                       0x0000080UL
-#define SPH_TWEAK_NORMAL_ROUND                    0x0000100UL
-#define SPH_TWEAK_NO_ALIGNRP_AFTER_IUP            0x0000200UL
-#define SPH_TWEAK_NO_CALL_AFTER_IUP               0x0000400UL
-#define SPH_TWEAK_NO_DELTAP_AFTER_IUP             0x0000800UL
-#define SPH_TWEAK_PIXEL_HINTING                   0x0001000UL
-#define SPH_TWEAK_RASTERIZER_35                   0x0002000UL
-#define SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES          0x0004000UL
-#define SPH_TWEAK_SKIP_IUP                        0x0008000UL
-#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES           0x0010000UL
-#define SPH_TWEAK_SKIP_OFFPIXEL_Y_MOVES           0x0020000UL
-#define SPH_TWEAK_TIMES_NEW_ROMAN_HACK            0x0040000UL
-#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP    0x0080000UL
-
-
-  FT_LOCAL( FT_Bool )
-  sph_test_tweak( TT_Face               face,
-                  const FT_String*      family,
-                  FT_UInt               ppem,
-                  const FT_String*      style,
-                  FT_UInt               glyph_index,
-                  const SPH_TweakRule*  rule,
-                  FT_UInt               num_rules );
-
-  FT_LOCAL( FT_UInt )
-  sph_test_tweak_x_scaling( TT_Face           face,
-                            const FT_String*  family,
-                            FT_UInt           ppem,
-                            const FT_String*  style,
-                            FT_UInt           glyph_index );
-
-  FT_LOCAL( void )
-  sph_set_tweaks( TT_Loader  loader,
-                  FT_UInt    glyph_index );
-
-
-  /* These macros are defined absent a method for setting them */
-#define SPH_OPTION_BITMAP_WIDTHS           FALSE
-#define SPH_OPTION_SET_SUBPIXEL            TRUE
-#define SPH_OPTION_SET_GRAYSCALE           FALSE
-#define SPH_OPTION_SET_COMPATIBLE_WIDTHS   FALSE
-#define SPH_OPTION_SET_RASTERIZER_VERSION  38
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-
-FT_END_HEADER
-
-#endif /* TTSUBPIX_H_ */
-
-
-/* END */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/type1/t1load.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/type1/t1load.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/type1/t1load.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/type1/t1load.c	2024-11-20 13:56:33.000000000 +0000
@@ -1773,7 +1773,7 @@
        */
 
       FT_TRACE0(( "parse_subrs: adjusting number of subroutines"
-                  " (from %d to %ld)\n",
+                  " (from %d to %zu)\n",
                   num_subrs,
                   ( parser->root.limit - parser->root.cursor ) >> 3 ));
       num_subrs = ( parser->root.limit - parser->root.cursor ) >> 3;
@@ -1948,7 +1948,7 @@
     if ( num_glyphs > ( limit - cur ) >> 3 )
     {
       FT_TRACE0(( "parse_charstrings: adjusting number of glyphs"
-                  " (from %d to %ld)\n",
+                  " (from %d to %zu)\n",
                   num_glyphs, ( limit - cur ) >> 3 ));
       num_glyphs = ( limit - cur ) >> 3;
     }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/freetype/src/type42/t42parse.c 5.15.17+dfsg-1/src/3rdparty/freetype/src/type42/t42parse.c
--- 5.15.15+dfsg-2/src/3rdparty/freetype/src/type42/t42parse.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/freetype/src/type42/t42parse.c	2024-11-20 13:56:33.000000000 +0000
@@ -872,7 +872,7 @@
       if ( loader->num_glyphs > ( limit - parser->root.cursor ) >> 2 )
       {
         FT_TRACE0(( "t42_parse_charstrings: adjusting number of glyphs"
-                    " (from %d to %ld)\n",
+                    " (from %d to %zu)\n",
                     loader->num_glyphs,
                     ( limit - parser->root.cursor ) >> 2 ));
         loader->num_glyphs = ( limit - parser->root.cursor ) >> 2;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/NEWS 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/NEWS
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/NEWS	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/NEWS	1970-01-01 00:00:00.000000000 +0000
@@ -1,3256 +0,0 @@
-Overview of changes leading to 7.2.0
-Thursday, April 27, 2023
-====================================
-- Add Tifinagh to the list of scripts that can natively be either right-to-left
-  or left-to-right, to improve handling of its glyph positioning.
-  (Simon Cozens)
-- Return also single substitution from hb_ot_layout_lookup_get_glyph_alternates()
-  (Behdad Esfahbod)
-- Fix 4.2.0 regression in applying across syllables in syllabic scripts.
-  (Behdad Esfahbod)
-- Add flag to avoid glyph substitution closure during subsetting, and the
-  corresponding “--no-layout-closure” option to “hb-subset” command line tool.
-  (Garret Rieger)
-- Support instancing COLRv1 table. (Qunxin Liu)
-- Don’t drop used user-defined name table entries during subsetting.
-  (Qunxin Liu)
-- Optimize handling of “gvar” table. (Behdad Esfahbod)
-- Various subsetter bug fixes and improvements. (Garret Rieger, Qunxin Liu)
-- Various documentation improvements. (Behdad Esfahbod, Josef Friedrich)
-
-- New API:
-+HB_SUBSET_FLAGS_NO_LAYOUT_CLOSURE
-+HB_UNICODE_COMBINING_CLASS_CCC132
-
-- Deprecated API:
-+HB_UNICODE_COMBINING_CLASS_CCC133
-
-
-Overview of changes leading to 7.1.0
-Friday, March 3, 2023
-====================================
-- New experimental hb_shape_justify() API that uses font variations to expand
-  or shrink the text to a given advance. (Behdad Esfahbod)
-- Various build and bug fixes. (Behdad Esfahbod, Garret Rieger, Qunxin Liu)
-
-- New API:
-+hb_font_set_variation()
-
-
-Overview of changes leading to 7.0.1
-Monday, February 20, 2023
-====================================
-- Various build and bug fixes.
-
-
-Overview of changes leading to 7.0.0
-Saturday, February 11, 2023
-====================================
-- New hb-paint API that is designed mainly to paint “COLRv1” glyphs, but can be
-  also used as a unified API to paint any of the glyph representations
-  supported by HarfBuzz (B/W outlines, color layers, or color bitmaps). 
-  (Behdad Esfahbod, Matthias Clasen)
-- New hb-cairo API for integrating with cairo graphics library. This is provided
-  as a separate harfbuzz-cairo library. (Behdad Esfahbod, Matthias Clasen)
-- Support for instancing “CFF2” table. (Behdad Esfahbod)
-- Support font emboldening. (Behdad Esfahbod)
-- Support feature ranges with AAT shaping. (Behdad Esfahbod)
-- Experimental support to cubic curves in “glyf” table, see
-  https://github.com/harfbuzz/boring-expansion-spec/blob/main/glyf1-cubicOutlines.md
-  for spec. (Behdad Esfahbod)
-- Various subsetter improvements. (Garret Rieger, Qunxin Liu, Behdad Esfahbod)
-- Various documentation improvements. 
-  (Behdad Esfahbod, Matthias Clasen, Khaled Hosny)
-- Significantly reduced memory use during shaping. (Behdad Esfahbod)
-- Greatly reduced memory use during subsetting “CFF” table. (Behdad Esfahbod)
-- New command line utility, hb-info, for querying various font information.
-  (Behdad Esfahbod, Matthias Clasen)
-- New hb-shape/hb-view options: --glyphs, --color-palette, --font-bold,
-  --font-grade, and --named-instance. (Behdad Esfahbod)
-- Miscellaneous fixes and improvements.
-  (Amir Masoud Abdol, Andres Salomon, Behdad Esfahbod, Chun-wei Fan,
-  Garret Rieger, Jens Kutilek, Khaled Hosny, Konstantin Käfer, Matthias Clasen,
-  Nirbheek Chauhan, Pedro J. Estébanez, Qunxin Liu, Sergei Trofimovich)
-
-- New API:
-+HB_FONT_NO_VAR_NAMED_INSTANCE
-+HB_PAINT_IMAGE_FORMAT_BGRA
-+HB_PAINT_IMAGE_FORMAT_PNG
-+HB_PAINT_IMAGE_FORMAT_SVG
-+hb_cairo_font_face_create_for_face
-+hb_cairo_font_face_create_for_font
-+hb_cairo_font_face_get_face
-+hb_cairo_font_face_get_font
-+hb_cairo_font_face_get_scale_factor
-+hb_cairo_font_face_set_font_init_func
-+hb_cairo_font_face_set_scale_factor
-+hb_cairo_font_init_func_t
-+hb_cairo_glyphs_from_buffer
-+hb_cairo_scaled_font_get_font
-+hb_color_line_get_color_stops
-+hb_color_line_get_color_stops_func_t
-+hb_color_line_get_extend
-+hb_color_line_get_extend_func_t
-+hb_color_line_t
-+hb_color_stop_t
-+hb_draw_funcs_get_empty
-+hb_draw_funcs_get_user_data
-+hb_draw_funcs_set_user_data
-+hb_face_collect_nominal_glyph_mapping
-+hb_font_draw_glyph
-+hb_font_draw_glyph_func_t
-+hb_font_funcs_set_draw_glyph_func
-+hb_font_funcs_set_paint_glyph_func
-+hb_font_get_synthetic_bold
-+hb_font_get_var_named_instance
-+hb_font_paint_glyph
-+hb_font_paint_glyph_func_t
-+hb_font_set_synthetic_bold
-+hb_map_keys
-+hb_map_next
-+hb_map_update
-+hb_map_values
-+hb_ot_color_glyph_has_paint
-+hb_ot_color_has_paint
-+hb_ot_layout_script_select_language2
-+hb_ot_name_id_predefined_t
-+hb_paint_color
-+hb_paint_color_func_t
-+hb_paint_composite_mode_t
-+hb_paint_custom_palette_color
-+hb_paint_custom_palette_color_func_t
-+hb_paint_extend_t
-+hb_paint_funcs_create
-+hb_paint_funcs_destroy
-+hb_paint_funcs_get_empty
-+hb_paint_funcs_get_user_data
-+hb_paint_funcs_is_immutable
-+hb_paint_funcs_make_immutable
-+hb_paint_funcs_reference
-+hb_paint_funcs_set_color_func
-+hb_paint_funcs_set_custom_palette_color_func
-+hb_paint_funcs_set_image_func
-+hb_paint_funcs_set_linear_gradient_func
-+hb_paint_funcs_set_pop_clip_func
-+hb_paint_funcs_set_pop_group_func
-+hb_paint_funcs_set_pop_transform_func
-+hb_paint_funcs_set_push_clip_glyph_func
-+hb_paint_funcs_set_push_clip_rectangle_func
-+hb_paint_funcs_set_push_group_func
-+hb_paint_funcs_set_push_transform_func
-+hb_paint_funcs_set_radial_gradient_func
-+hb_paint_funcs_set_sweep_gradient_func
-+hb_paint_funcs_set_user_data
-+hb_paint_funcs_t
-+hb_paint_image
-+hb_paint_image_func_t
-+hb_paint_linear_gradient
-+hb_paint_linear_gradient_func_t
-+hb_paint_pop_clip
-+hb_paint_pop_clip_func_t
-+hb_paint_pop_group
-+hb_paint_pop_group_func_t
-+hb_paint_pop_transform
-+hb_paint_pop_transform_func_t
-+hb_paint_push_clip_glyph
-+hb_paint_push_clip_glyph_func_t
-+hb_paint_push_clip_rectangle
-+hb_paint_push_clip_rectangle_func_t
-+hb_paint_push_group
-+hb_paint_push_group_func_t
-+hb_paint_push_transform
-+hb_paint_push_transform_func_t
-+hb_paint_radial_gradient
-+hb_paint_radial_gradient_func_t
-+hb_paint_sweep_gradient
-+hb_paint_sweep_gradient_func_t
-+hb_set_is_inverted
-+hb_subset_input_keep_everything
-
-- Deprecated API:
-+hb_font_funcs_set_glyph_shape_func
-+hb_font_get_glyph_shape_func_t
-+hb_font_get_glyph_shape
-
-
-Overview of changes leading to 6.0.0
-Friday, December 16, 2022
-====================================
-- A new API have been added to pre-process the face and speed up future
-  subsetting operations on that face. Provides up to a 95% reduction in
-  subsetting times when the same face is subset more than once.
-
-  For more details and benchmarks, see:
-  https://github.com/harfbuzz/harfbuzz/blob/main/docs/subset-preprocessing.md
-
-  (Garret Rieger, Behdad Esfahbod)
-
-- Shaping have been speedup by skipping entire lookups when the buffer contents
-  don't intersect with the lookup. Shows up to a 10% speedup in shaping some
-  fonts. (Behdad Esfahbod)
-
-- A new experimental feature, “Variable Composites” (enabled by passing
-  -Dexperimental_api=true to meson), is also featured in this release.
-  This technology enables drastic compression of fonts in the Chinese,
-  Japanese, Korean, and other writing systems, by reusing the OpenType Font
-  Variations technology for encoding “smart components” into the font.
-
-  The specification for these  extensions to the font format can be found in:
-  https://github.com/harfbuzz/boring-expansion-spec/blob/glyf1/glyf1.md
-
-  A test variable-font with ~7160 Hangul syllables derived from the
-  NotoSerifKR-VF font has been built, with existing OpenType technology, as
-  well as with the new Variable Composites (VarComposites) technology. The
-  VarComposites font is over 90% smaller than the OpenType version of the font!
-  Both fonts can be obtained from the “smarties” repository:
-  https://github.com/behdad/smarties/tree/3.0/fonts/hangul/serif
-
-  When building HarfBuzz with experimental features enabled, you can test
-  the “smarties” font with a sample character like this:
-
-  $ hb-view butchered-hangul-serif-smarties-variable.ttf -u AE01 --variations=wght=700
-
-  (Behdad Esfahbod)
-
-- The HarfBuzz subsetter can now drop axes by pinning them to specific values
-  (also referred to as instancing). There are a couple of restrictions
-  currently:
-
-  - Only works with TrueType (“glyf”) based fonts. “CFF2” fonts are not yet
-    supported.
-  - Only supports the case where all axes in a font are pinned.
-
-  (Garret Rieger, Qunxin Liu)
-
-- Miscellaneous fixes and improvements.
-
-  (Behdad Esfahbod, Christoph Reiter, David Corbett, Eli Schwartz, Garret
-   Rieger, Joel Auterson, Jordan Petridis, Khaled Hosny, Lorenz Wildberg,
-   Marco Rebhan, Martin Storsjö, Matthias Clasen, Qunxin Liu, Satadru Pramanik)
-
-
-- New API
-+hb_subset_input_pin_axis_location()
-+hb_subset_input_pin_axis_to_default()
-+hb_subset_preprocess()
-
-
-Overview of changes leading to 5.3.1
-Wednesday, October 19, 2022
-====================================
-- Subsetter repacker fixes. (Garret Rieger)
-- Adjust Grapheme clusters for Katakana voiced sound marks. (Behdad Esfahbod)
-- New “hb-subset” option “--preprocess-face”. (Garret Rieger)
-
-
-Overview of changes leading to 5.3.0
-Saturday, October 8, 2022
-"Women, Life, Freedom" #MahsaAmini
-====================================
-- Don’t add glyphs from dropped MATH or COLR tables to the subset glyphs.
-  (Khaled Hosny)
-- Map “rlig” to appropriate AAT feature selectors. (Jonathan Kew)
-- Update USE data files to latest version. (David Corbett)
-- Check “CBDT” extents first before outline tables, to help with fonts that
-  also include an empty “glyf” table. (Khaled Hosny)
-- More work towards variable font instancing in the subsetter. (Qunxin Liu)
-- Subsetter repacker improvements. (Garret Rieger)
-- New API:
-+hb_ot_layout_lookup_get_optical_bound()
-+hb_face_builder_sort_tables()
-
-
-Overview of changes leading to 5.2.0
-Saturday, September 17, 2022
-====================================
-- Fix regressions in hb-ft font functions for FT_Face’s with transformation
-  matrix. (Behdad Esfahbod)
-- The experimental hb-repacker API now supports splitting several GPOS subtable
-  types when needed. (Garret Rieger)
-- The HarfBuzz extensions to OpenType font format are now opt-in behind
-  build-time flags. (Behdad Esfahbod)
-- The experimental hb-subset variable fonts instantiation API can now
-  instantiate more font tables and arbitrary axis locations. (Qunxin Liu)
-- Unicode 15 support. (David Corbett)
-- Various documentation improvements. (Behdad Esfahbod, Matthias Clasen)
-- The hb-view command line tool now detects WezTerm inline images support.
-  (Wez Furlong)
-- Fix FreeType and ICU dependency lookup with meson. (Xavier Claessens)
-
-- New API:
-+HB_SCRIPT_KAWI
-+HB_SCRIPT_NAG_MUNDARI
-
-
-Overview of changes leading to 5.1.0
-Sunday, July 31, 2022
-====================================
-- More extensive buffer tracing messages. (Behdad Esfahbod)
-- Fix hb-ft regression in bitmap fonts rendering. (Behdad Esfahbod)
-- Support extension promotion of lookups in hb-subset-repacker. (Garret Rieger)
-- A new HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL for scripts that use elongation
-  (e.g. Arabic) to signify where it is safe to insert tatweel glyph without
-  interrupting shaping. (Behdad Esfahbod)
-- Add “--safe-to-insert-tatweel” to “hb-shape” tool. (Behdad Esfahbod)
-
-- New API
-+HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL
-+HB_BUFFER_FLAG_PRODUCE_SAFE_TO_INSERT_TATWEEL
-
-
-Overview of changes leading to 5.0.1
-Saturday, July 23, 2022
-====================================
-- Fix version 2 “avar” table with hb-ft. (Behdad Esfahbod)
-
-
-Overview of changes leading to 5.0.0
-Saturday, July 23, 2022
-====================================
-- Support fonts with more than 65535 glyphs in “GDEF”, “GSUB”, and “GPOS”
-  tables. This is part of https://github.com/be-fonts/boring-expansion-spec to
-  extend OpenType in a backward-compatible way.
-  (Behdad Esfahbod, Garret Rieger)
-- Complete support for more than 65535 glyphs in “glyf” table that started in
-  4.0.0 release. Part of boring-expansion-spec. (Behdad Esfahbod)
-- Support version 2 of “avar” table. Part of boring-expansion-spec.
-  (Behdad Esfahbod)
-- Fix mark attachment on multiple substitutions in some cases.
-  (Behdad Esfahbod)
-- Fix application of “calt”, “rclt”, and “ccmp” features to better match
-  Uniscribe behaviour with some Arabic fonts. (Behdad Esfahbod)
-- Improvement to interaction between multiple cursive attachments.
-  (Behdad Esfahbod)
-- Improve multiple mark interactions in Hebrew. (Behdad Esfahbod)
-- Implement language-specific forms in AAT shaping. (Behdad Esfahbod)
-- Fix variation of “VORG” table. (Behdad Esfahbod)
-- Support for specific script tags to be retained in the subsetter, and add
-  “--layout-scripts” option to “hb-subset” tool. (Garret Rieger)
-- Accept space as delimiter for --features/--variations in command line tools.
-- Improve subsetting of “COLR” table. (Qunxin Liu)
-- Improved fuzzing coverage for ot-math API. (Frédéric Wang)
-- Fix “kern” table version 2 (AAT) sanitization on 32-bit systems.
-  (Behdad Esfahbod)
-- Allow negative glyph advances from “graphite2” shaper. (Stephan Bergmann)
-- Implement loading (color) bitmap fonts with hb-ft. (Behdad Esfahbod)
-- Fix regression in hb-ft when changing font size. (Behdad Esfahbod)
-- Fix build on GCC < 7. (Kleis Auke Wolthuizen)
-- Dynamically load dwrite.dll on windows if “directwrite” shaper is enabled.
-  (Luca Bacci)
-- Provide a single-file harfbuzz-subset.cc file for easier alternate building
-  of hb-subset library, similar to harfbuzz.cc. (Khaled Hosny)
-
-- New API
-+HB_SUBSET_SETS_LAYOUT_SCRIPT_TAG
-+hb_language_matches()
-
-
-Overview of changes leading to 4.4.1
-Wednesday, June 29, 2022
-====================================
-- Fix test failure with some compilers.
-- Fix Telugu and Kannada kerning regression.
-
-
-Overview of changes leading to 4.4.0
-Monday, June 27, 2022
-====================================
-- Caching of variable fonts shaping, in particular when using HarfBuzz’s own
-  font loading functions (ot). Bringing performance of variable shaping in par
-  with non-variable fonts shaping. (Behdad Esfahbod)
-- Caching of format 2 “Contextual Substitution” and “Chained Contexts
-  Substitution” lookups. Resulting in up to 20% speedup of lookup-heavy fonts
-  like Gulzar or Noto Nastaliq Urdu. (Behdad Esfahbod)
-- Improved ANSI output from hb-view. (Behdad Esfahbod)
-- Support for shaping legacy, pre-OpenType Windows 3.1-era, Arabic fonts that
-  relied on a fixed PUA encoding. (Khaled Hosny, Behdad Esfahbod)
-- Sinhala script is now shaped by the USE shaper instead of “indic” one.
-  (Behdad Esfahbod, David Corbett)
-- Thai shaper improvements. (David Corbett)
-- hb-ot-name API supports approximate BCP-47 language matching, for example
-  asking for “en_US” in a font that has only “en” names will return them.
-  (Behdad Esfahbod)
-- Optimized TrueType glyph shape loading. (Behdad Esfahbod)
-- Fix subsetting of HarfBuzz faces created via hb_face_create_for_tables().
-  (Garret Rieger)
-- Add 32 bit var store support to the subsetter. (Garret Rieger)
-
-- New API
-+HB_BUFFER_FLAG_DEFINED
-+HB_BUFFER_SERIALIZE_FLAG_DEFINED
-+hb_font_changed()
-+hb_font_get_serial()
-+hb_ft_hb_font_changed()
-+hb_set_hash()
-+hb_map_copy()
-+hb_map_hash()
-
-
-Overview of changes leading to 4.3.0
-Friday, May 20, 2022
-====================================
-- Major speed up in loading and subsetting fonts, especially in
-  handling CFF table. Subsetting some fonts is now 3 times faster.
-  (Behdad Esfahbod, Garret Rieger)
-- Speed up blending CFF2 table. (Behdad Esfahbod)
-- Speed up hb_ot_tags_from_language(). (Behdad Esfahbod, David Corbett)
-- Fix USE classification of U+10A38 to fix multiple marks on single Kharoshthi
-  base. (David Corbett)
-- Fix parsing of empty CFF Index. (Behdad Esfahbod)
-- Fix subsetting CPAL table with partial palette overlaps. (Garret Rieger)
-
-- New API
-+hb_map_is_equal() (Behdad Esfahbod)
-
-
-Overview of changes leading to 4.2.1
-Sunday, April 24, 2022
-====================================
-- Make sure hb_blob_create_from_file_or_fail() always returns nullptr in case
-  of failure and not empty blob sometimes. (Khaled Hosny)
-- Add --passthrough-tables option to hb-subset. (Cosimo Lupo)
-- Reinstate a pause after basic features in Khmer shaper, fixing a regression
-  introduced in previous release. (Behdad Esfahbod)
-- Better handling of Regional_Indicator when shaped with RTL-native scripts,
-  reverting earlier fix that caused regressions in AAT shaping. (Behdad Esfahbod)
-
-
-Overview of changes leading to 4.2.0
-Wednesday, March 30, 2022
-====================================
-- Source code reorganization, splitting large hb-ot-layout files into smaller,
-  per-subtable ones under OT/Layout/*. Code for more tables will follow suit in
-  later releases. (Garret Rieger, Behdad Esfahbod)
-- Revert Indic shaper change in previous release that broke some fonts and
-  instead make per-syllable restriction of “GSUB” application limited to
-  script-specific Indic features, while applying them and discretionary
-  features in one go. (Behdad Esfahbod)
-- Fix decoding of private in gvar table. (Behdad Esfahbod)
-- Fix handling of contextual lookups that delete too many glyphs. (Behdad Esfahbod)
-- Make “morx” deleted glyphs don’t block “GPOS” application. (Behdad Esfahbod)
-- Various build fixes. (Chun-wei Fan, Khaled Hosny)
-
-- New API
-+hb_set_next_many() (Andrew John)
-
-
-Overview of changes leading to 4.1.0
-Wednesday, March 23, 2022
-====================================
-- Various OSS-Fuzz fixes. (Behdad Esfahbod)
-- Make fallback vertical-origin match FreeType’s. (Behdad Esfahbod)
-- Treat visible viramas like dependent vowels in USE shaper. (David Corbett)
-- Apply presentation forms features and discretionary features in one go in
-  Indic shaper, which seems to match Uniscribe and CoreText behaviour.
-  (Behdad Esfahbod, David Corbett)
-- Various bug fixes.
-
-- New API
-+hb_set_add_sorted_array() (Andrew John)
-
-
-Overview of changes leading to 4.0.1
-Friday, March 11, 2022
-====================================
-- Update OpenType to AAT mappings for “hist” and “vrtr” features.
-  (Florian Pircher)
-- Update IANA Language Subtag Registry to 2022-03-02. (David Corbett)
-- Update USE shaper to allow any non-numeric tail in a symbol cluster, and
-  remove obsolete data overrides. (David Corbett)
-- Fix handling of baseline variations to return correctly scaled values.
-  (Matthias Clasen)
-- A new experimental hb_subset_repack_or_fail() to repack an array of objects,
-  eliminating offset overflows. The API is not available unless HarfBuzz is
-  built with experimental APIs enabled. (Qunxin Liu)
-
-- New experimental API
-+hb_link_t
-+hb_object_t
-+hb_subset_repack_or_fail()
-
-
-Overview of changes leading to 4.0.0
-Tuesday, March 1, 2022
-====================================
-- New public API to create subset plan and gather information on things like
-  glyph mappings in the final subset. The plan can then be passed on to perform
-  the subsetting operation. (Garret Rieger)
-- Draw API for extracting glyph shapes have been extended and finalized and is
-  no longer an experimental API. The draw API supports glyf, CFF and CFF2
-  glyph outlines tables, and applies variation settings set on the font as well
-  as synthetic slant. The new public API is not backward compatible with the
-  previous, non-public, experimental API. (Behdad Esfahbod)
-- The hb-view tool will use HarfBuzz draw API to render the glyphs instead of
-  cairo-ft when compiled with Cairo 1.17.5 or newer, setting HB_DRAW
-  environment variable to 1 or 0 will force using or not use the draw API,
-  respectively. (Behdad Esfahbod)
-- The hb-shape and hb-view tools now default to using HarfBuzz’s own font
-  loading functions (ot) instead of FreeType ones (ft). They also have a new
-  option, --font-slant, to apply synthetic slant to the font. (Behdad Esfahbod)
-- HarfBuzz now supports more than 65535 (the OpenType limit) glyph shapes and
-  metrics. See https://github.com/be-fonts/boring-expansion-spec/issues/6 and
-  https://github.com/be-fonts/boring-expansion-spec/issues/7 for details.
-  (Behdad Esfahbod)
-- New API to get the dominant horizontal baseline tag for a given script.
-  (Behdad Esfahbod)
-- New API to get the baseline positions from the font, and synthesize missing
-  ones. As well as new API to get font metrics and synthesize missing ones.
-  (Matthias Clasen)
-- Improvements to finding dependencies on Windows when building with Visual
-  Studio. (Chun-wei Fan)
-- New buffer flag, HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT, that must be set
-  during shaping for HB_GLYPH_FLAG_UNSAFE_TO_CONCAT flag to be reliably
-  produced. This is to limit the performance hit of producing this flag to when
-  it is actually needed. (Behdad Esfahbod)
-- Documentation improvements. (Matthias Clasen)
-
-- New API
- - General:
-   +HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT
-   +hb_var_num_t
-
- - Draw:
-   +hb_draw_funcs_t
-   +hb_draw_funcs_create()
-   +hb_draw_funcs_reference()
-   +hb_draw_funcs_destroy()
-   +hb_draw_funcs_is_immutable()
-   +hb_draw_funcs_make_immutable()
-   +hb_draw_move_to_func_t
-   +hb_draw_funcs_set_move_to_func()
-   +hb_draw_line_to_func_t
-   +hb_draw_funcs_set_line_to_func()
-   +hb_draw_quadratic_to_func_t
-   +hb_draw_funcs_set_quadratic_to_func()
-   +hb_draw_cubic_to_func_t
-   +hb_draw_funcs_set_cubic_to_func()
-   +hb_draw_close_path_func_t
-   +hb_draw_funcs_set_close_path_func()
-   +hb_draw_state_t
-   +HB_DRAW_STATE_DEFAULT
-   +hb_draw_move_to()
-   +hb_draw_line_to()
-   +hb_draw_quadratic_to()
-   +hb_draw_cubic_to()
-   +hb_draw_close_path()
-   +hb_font_get_glyph_shape_func_t
-   +hb_font_funcs_set_glyph_shape_func()
-   +hb_font_get_glyph_shape()
-
- - OpenType layout
-   +HB_OT_LAYOUT_BASELINE_TAG_IDEO_FACE_CENTRAL
-   +HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_CENTRAL
-   +hb_ot_layout_get_horizontal_baseline_tag_for_script()
-   +hb_ot_layout_get_baseline_with_fallback()
-
- - Metrics:
-   +hb_ot_metrics_get_position_with_fallback()
-
- - Subset:
-   +hb_subset_plan_t
-   +hb_subset_plan_create_or_fail()
-   +hb_subset_plan_reference()
-   +hb_subset_plan_destroy()
-   +hb_subset_plan_set_user_data()
-   +hb_subset_plan_get_user_data()
-   +hb_subset_plan_execute_or_fail()
-   +hb_subset_plan_unicode_to_old_glyph_mapping()
-   +hb_subset_plan_new_to_old_glyph_mapping()
-   +hb_subset_plan_old_to_new_glyph_mapping()
-
-
-Overview of changes leading to 3.4.0
-Sunday, February 13, 2022
-====================================
-- Perform sanity checks on shaping results is now part of “harfbuzz” library
-  and can be enabled by setting the buffer flag HB_BUFFER_FLAG_VERIFY.
-  (Behdad Esfahbod)
-- Arabic Mark Transient Reordering Algorithm have been updated to revision 6.
-  (Khaled Hosny)
-- ISO 15924 code for mathematical notation, ‘Zmth’, now maps to the OpenType
-  ‘math’ tag. (Alexis King)
-- It is now possible to get at once all math kerning values for a given glyph
-  at a given corner. (Alexis King)
-- Fix locale_t portability issues on systems the typedef’s it to a void
-  pointer. (Behdad Esfahbod)
-
-- New API:
-+HB_BUFFER_FLAG_VERIFY
-+HB_OT_TAG_MATH_SCRIPT
-+HB_SCRIPT_MATH
-+hb_ot_math_kern_entry_t
-+hb_ot_math_get_glyph_kernings()
-
-- Deprecated API
-+HB_OT_MATH_SCRIPT
-
-
-Overview of changes leading to 3.3.2
-Sunday, February 6, 2022
-====================================
-- Revert splitting of pair positioning values introduced in 3.3.0 as it proved
-  problematic. (Behdad Esfahbod)
-
-
-Overview of changes leading to 3.3.1
-Monday, January 31, 2022
-====================================
-- Fix heap-use-after-free in harfbuzz-subset introduced in previous release.
-  (Garret Rieger)
-
-
-Overview of changes leading to 3.3.0
-Monday, January 31, 2022
-====================================
-- Improved documentation. (Matthias Clasen)
-- Internal code cleanup, using C++ standard library more. (Behdad Esfahbod)
-- The low 16-bits of face index will be used by hb_face_create() to select a
-  face inside a font collection file format, while the high 16-bits will be
-  used by hb_font_create() to load the named instance. (Behdad Esfahbod)
-- Glyph positions and other font metrics now apply synthetic slant set by
-  hb_font_set_synthetic_slant(), for improved positioning for synthetically
-  slanted fonts. (Behdad Esfahbod)
-- Fixed unintentional locale dependency in hb_variation_to_string() for decimal
-  point representation. (Matthias Clasen)
-- When applying pair positioning (kerning) the positioning value is split
-  between the two sides of the pair for improved cursor positioning between
-  such pairs. (Behdad Esfahbod)
-- Introduced new HB_GLYPH_FLAG_UNSAFE_TO_CONCAT, to be used in conjunction
-  with HB_GLYPH_FLAG_UNSAFE_TO_BREAK for optimizing re-shaping during line
-  breaking. Check the documentation for further details. (Behdad Esfahbod)
-- Improved handling of macrolanguages when mapping BCP 47 codes to OpenType
-  tags. (David Corbett)
-
-- New API:
-+HB_GLYPH_FLAG_UNSAFE_TO_CONCAT
-+hb_segment_properties_overlay()
-+hb_buffer_create_similar()
-+hb_font_set_synthetic_slant()
-+hb_font_get_synthetic_slant()
-+hb_font_get_var_coords_design()
-
-
-Overview of changes leading to 3.2.0
-Friday, November 26, 2021
-====================================
-“harfbuzz” library improvements:
-- Fixed shaping of Apple Color Emoji flags in right-to-left context. (Behdad Esfahbod)
-- Fixed positioning of CFF fonts in HB_TINY profile. (Behdad Esfahbod)
-- OpenType 1.9 language tags update. (David Corbett)
-- Add HB_NO_VERTICAL config option.
-- Add HB_CONFIG_OVERRIDE_H for easier configuration. (Behdad Esfahbod)
-
-“harfbuzz-subset” library improvements:
-- Improved packing of cmap, loca, and Ligature tables. (Garret Rieger)
-- Significantly improved overflow-resolution strategy in the repacker. (Garret Rieger)
-
-
-Overview of changes leading to 3.1.2
-Friday, November 26, 2021
-====================================
-- hb-shape / hb-view: revert treating text on the commandline as single
-  paragraph (was introduced in 3.0.0); add new --single-par to do that.
-  (Behdad Esfahbod)
-- Subsetter bug fixes. (Garret Rieger, Qunxin Liu, Behdad Esfahbod)
-
-
-Overview of changes leading to 3.1.1
-Wednesday, November 8, 2021
-====================================
-- Work around GCC cast-align error/warning on some platforms. (Behdad Esfahbod)
-- Documentation improvements. (Matthias Clasen)
-
-
-Overview of changes leading to 3.1.0
-Wednesday, November 3, 2021
-====================================
-- Better offset-overflow handling in the subsetter library. (Garret Rieger)
-- Improved Unicode 14 properties in the USE shaper, and various other USE
-  shaper fixes. (David Corbett)
-- MATH and COLR v1 tables subsetting support, and various other subsetter fixes.
-  (Qunxin Liu)
-- Support for Pwo Karen / Ason Chin medial la. (Simon Cozens)
-- Apply GPOS positioning when substituting with morx table, if kerx is missing.
-  (Behdad Esfahbod)
-- Apply calt and clig features across syllable boundaries in Indic shaper.
-  (Behdad Esfahbod)
-- meson option for enabling Graphite 2 has been renamed to graphite2.
-- Build and documentation fixes.
-
-- New API:
-+hb_buffer_set_not_found_glyph()
-+hb_buffer_get_not_found_glyph()
-
-
-Overview of changes leading to 3.0.0
-Friday, September 17, 2021
-====================================
-- Unicode 14.0 support (David Corbett).
-- The hb-subset API and the harfbuzz-subset library's ABI are now declared
-  stable. The harfbuzz-subset library would not have been possible without the
-  work of Garret Rieger and Qunxin Liu from Google Fonts, and the earlier work
-  of Michiharu Ariza from Adobe.
-- The hb-style API is now stable and no longer experimental.
-
-- New API:
-+hb_style_tag_t
-+hb_style_get_value()
-+hb_subset_input_t
-+hb_subset_flags_t
-+hb_subset_sets_t
-+hb_subset_input_create_or_fail()
-+hb_subset_input_reference()
-+hb_subset_input_destroy()
-+hb_subset_input_set_user_data()
-+hb_subset_input_get_user_data()
-+hb_subset_input_unicode_set()
-+hb_subset_input_glyph_set()
-+hb_subset_input_set()
-+hb_subset_input_get_flags()
-+hb_subset_input_set_flags()
-+hb_subset_or_fail()
-
-- Removed old unstable harfbuzz-subset API:
--hb_subset_input_nameid_set()
--hb_subset_input_namelangid_set()
--hb_subset_input_layout_features_set()
--hb_subset_input_no_subset_tables_set()
--hb_subset_input_drop_tables_set()
--hb_subset_input_set_drop_hints()
--hb_subset_input_get_drop_hints()
--hb_subset_input_set_desubroutinize()
--hb_subset_input_get_desubroutinize()
--hb_subset_input_set_retain_gids()
--hb_subset_input_get_retain_gids()
--hb_subset_input_set_name_legacy()
--hb_subset_input_get_name_legacy()
--hb_subset_input_set_overlaps_flag()
--hb_subset_input_get_overlaps_flag()
--hb_subset_input_set_notdef_outline()
--hb_subset_input_get_notdef_outline()
--hb_subset_input_set_no_prune_unicode_ranges()
--hb_subset_input_get_no_prune_unicode_ranges()
--hb_subset()
-
-
-Overview of changes leading to 2.9.1
-Tuesday, September 7, 2021
-====================================
-- Final subset API is in place and if no issues are discovered, it will be the
-  stable subset API of HarfBuzz 3.0.0. Old API is kept to ease transition, but
-  will be removed in 3.0.0.
-- Various fuzzer-found bug fixes.
-- hb_buffer_append() now handles the pre- and post-context which previously
-  were left unchanged in the destination buffer.
-- hb-view / hb-shape now accept following new arguments:
-  o --unicodes-before/after: takes a list of hex numbers that represent Unicode
-    codepoints.
-- Undeprecated API:
-  hb_set_invert()
-
-
-Overview of changes leading to 2.9.0
-Wednesday, August 18, 2021
-History Repeats Itself (Afghanistan)
-====================================
-- Subsetter API is being stabilized, with the first stable API to happen in
-  3.0.0 release (https://github.com/harfbuzz/harfbuzz/issues/3078).
-- Support multiple variation axes with same tag, aka HOI.
-- The “coretext” testing shaper now passes font variations to CoreText.
-- hb-shape/hb-view does not break line at new lines unless text is read from
-  file.
-- hb-view and hb-subset has a --batch now, similar to hb-shape.
-- The --batch mode now uses ; as argument separator instead of : used previously.
-- The --batch in hb-shape does not expect 0th argument anymore. That is, the
-  lines read are interpreted as argv[1:], instead of argv[0:].
-- The --batch option has been undocumented. We are ready to document it; send
-  feedback if you find it useful.
-- hb-subset got arguments revamps. Added much-requested --gids-file, --glyphs,
-  --glyphs-file, --unicodes-file, supporting ranges in --unicodes.
-- Various bug fixes.
-
-
-Overview of changes leading to 2.8.2
-Tuesday, July 8, 2021
-====================================
-- Shaping LTR digits for RTL scripts now makes the native direction of the
-  digits LTR, applying shaping and positioning rules on the same glyph order as
-  Uniscribe. (Jonathan Kew, Khaled Hosny).
-- Subsetting COLR v1 and CPAL tables is now supported. (Garret Rieger, Qunxin Liu)
-- Various fixes and improvements to the subsetter. (Garret Rieger, Qunxin Liu, Behdad)
-- When applying morx table, mark glyph widths should not be zeroed. (Jonathan Kew)
-- GPOS is preferred over kerx, if GSUB was applied. (Behdad)
-- Regional_Indicator pairs are grouped together when clustering. (Behdad)
-- New API:
-+hb_blob_create_or_fail()
-+hb_blob_create_from_file_or_fail()
-+hb_set_copy()
-
-
-Overview of changes leading to 2.8.1
-Tuesday, May 4, 2021
-====================================
-- Subsetter now fully supports GSUB/GPOS/GDEF tables (including variations); as
-  such, layout tables are retained by subsetter by default. (Garret Rieger, Qunxin Liu)
-- Build scripts no longer check for FontConfig as HarfBuzz does not use it.
-- hb-view supports iTerm2 and kitty inline image protocols (Khaled Hosny),
-  it can also use Chafa for terminal graphics if available (Hans Petter Jansson).
-
-Overview of changes leading to 2.8.0
-Tuesday, March 16, 2021
-====================================
-- Shape joining scripts other than Arabic/Syriac using the Universal Shaping Engine.
-  Previously these were shaped using the generalized Arabic shaper. (David Corbett)
-- Fix regression in shaping of U+0B55 ORIYA SIGN OVERLINE. (David Corbett)
-- Update language tags. (David Corbett)
-- Variations: reduce error: do not round each interpolated delta. (Just van Rossum) 
-- Documentation improvements. (Khaled Hosny, Nathan Willis)
-- Subsetter improvements: subsets most, if not all, lookup types now. (Garret Rieger, Qunxin Liu)
-- Fuzzer-found fixes and other improvements when memory failures happen. (Behdad)
-- Removed most atomic implementations now that we have C++11 atomic impl. (Behdad)
-- General codebase upkeep; using more C++11 features: constexpr constructors, etc. (Behdad)
-
-
-Overview of changes leading to 2.7.4
-Sunday, December 27, 2020
-====================================
-- Fix missing --enable-introspection configure option from previous release
-  tarball.
-- Documentation updates.
-
-
-Overview of changes leading to 2.7.3
-Wednesday, December 23, 2020
-====================================
-- Update USE shaper to 2020-08-13 specification, and other improvements.
-- Don’t disable liga feature in myanmar shaper, to match Uniscribe.
-- Improvements to language and script tags handling.
-- Update language system tag registry to OpenType 1.8.4
-- Support for serializing and deserializing Unicode buffers. Serialized buffers
-  are now delimited with `<>` or `[]` based on whether it is a Unicode or
-  glyphs buffer.
-- Increase buffer work limits to handle fonts with many complex lookups.
-- Handle more shaping operations in trace output.
-- Memory access fixes.
-- More OOM fixes.
-- Improved documentation.
-- Build system improvements.
-- New API:
-+hb_buffer_has_positions()
-+hb_buffer_serialize()
-+hb_buffer_serialize_unicode()
-+hb_buffer_deserialize_unicode()
-
-
-Overview of changes leading to 2.7.2
-Saturday, August 29, 2020
-====================================
-- Fix a regression in the previous release that caused a crash with Kaithi.
-- More OOM fixes.
-
-
-Overview of changes leading to 2.7.1
-Thursday, August 13, 2020
-====================================
-- ot-funcs now handles variable empty glyphs better when hvar/vvar isn't present.
-- Reverted a GDEF processing regression.
-- A couple of fixes to handle OOM better.
-
-
-Overview of changes leading to 2.7.0
-Saturday, July 25, 2020
-====================================
-- Use an implementation for round that always rounds up, some minor fluctuations
-  are expected on var font specially when hb-ot callback is used.
-- Fix an AAT's `kerx` issue on broken rendering of Devanagari Sangam MN.
-- Remove AAT's `lcar` table support from _get_ligature_carets API, not even much
-  use on macOS installed fonts (only two files).  GDEF support is the recommended
-  one and expected to work properly after issues fixed two releases ago.
-- Minor memory fixes to handle OOM better specially in hb-ft.
-- Minor .so files versioning scheme change and remove stable/unstable scheme
-  differences, was never used in practice (always default to stable scheme).
-- We are now suggesting careful packaging of the library using meson,
-  https://github.com/harfbuzz/harfbuzz/wiki/Notes-on-migration-to-meson
-  for more information.
-- Distribution package URL is changed, either use GitHub generated tarballs,
-  `https://github.com/harfbuzz/harfbuzz/archive/$pkgver.tar.gz`
-  or, even more preferably use commit hash of the release and git checkouts like,
-  `git+https://github.com/harfbuzz/harfbuzz#commit=$commit`
-
-
-Overview of changes leading to 2.6.8
-Monday, June 22, 2020
-====================================
-- New API to fetch glyph alternates from GSUB table.
-- hb-coretext build fix for macOS < 10.10.
-- Meson build fixes, cmake port removal is postponed but please prepare for
-  it and give us feedback.
-  Autotools is still our main build system however please consider
-  experimenting with meson also for packaging the library.
-- New API:
-+hb_ot_layout_lookup_get_glyph_alternates()
-
-
-Overview of changes leading to 2.6.7
-Wednesday, June 3, 2020
-====================================
-- Update to Unicode 13.0.0.
-- Fix hb_ot_layout_get_ligature_carets for fonts without lcar table, it was
-  completely broken for all the other fonts since 2.1.2.
-- As a part of our migration to meson, this release will be the last one
-  to provide cmake port files but autotools still is our main build system.
-  There is a possibility that the next version or the after be released
-  using meson.
-
-
-Overview of changes leading to 2.6.6
-Tuesday, May 12, 2020
-====================================
-- A fix in AAT kerning for Geeza Pro.
-- Better support for resource fork fonts on macOS.
-
-
-Overview of changes leading to 2.6.5
-Friday, April 17, 2020
-====================================
-- Add experimental meson build system.  Autotools is still the primary
-  and supported build system.
-- AAT is now always preferred for horizontal scripts when both AAT and OT
-  layout tables exist at the same time.
-- Subsetter improvements.
-- New API:
-+hb_ft_font_lock_face()
-+hb_ft_font_unlock_face()
-
-
-Overview of changes leading to 2.6.4
-Monday, October 29, 2019
-====================================
-- Small bug fix.
-- Build fixes.
-
-
-Overview of changes leading to 2.6.3
-Monday, October 28, 2019
-====================================
-- Misc small fixes, mostly to build-related issues.
-- New API:
-+hb_font_get_nominal_glyphs()
-
-
-Overview of changes leading to 2.6.2
-Monday, September 30, 2019
-====================================
-- Misc small fixes, mostly to build-related issues.
-
-
-Overview of changes leading to 2.6.1
-Thursday, August 22, 2019
-====================================
-- Fix regression with hb_font_create_sub_font scaling introduced in 2.6.0.
-- Change interpretation of font PTEM size / CoreText font size handling.
-  See https://github.com/harfbuzz/harfbuzz/pull/1484
-- hb-ot-font: Prefer symbol cmap subtable if present.
-- Apply 'dist'/'abvm'/'blwm' features to all scripts.
-- Drop experimental DirectWrite API.
-
-
-Overview of changes leading to 2.6.0
-Tuesday, August 13, 2019
-====================================
-- New OpenType metrics, baseline, and metadata table access APIs.
-- New API to set font variations to a named-instance.
-- New hb-gdi.h header and API for creating hb_face_t from HFONT.
-- Amalgam: Provide a single-file harfbuzz.cc file for easier alternate building.
-- More size-reduction configurable options, enabled by HB_TINY.
-- New API:
-+hb_font_set_var_named_instance()
-+hb_gdi_face_create()
-+hb_ot_layout_baseline_tag_t
-+hb_ot_layout_get_baseline()
-+hb_ot_meta_tag_t
-+hb_ot_meta_get_entry_tags()
-+hb_ot_meta_reference_entry()
-+hb_ot_metrics_tag_t
-+hb_ot_metrics_get_position()
-+hb_ot_metrics_get_variation()
-+hb_ot_metrics_get_x_variation()
-+hb_ot_metrics_get_y_variation()
-
-
-Overview of changes leading to 2.5.3
-Wednesday, June 26, 2019
-====================================
-- Fix UCD script data for Unicode 10+ scripts.  This was broken since 2.5.0.
-- More optimizations for HB_TINY.
-
-
-Overview of changes leading to 2.5.2
-Thursday, June 20, 2019
-====================================
-- More hb-config.hh facilities to shrink library size, namely when built as
-  HB_TINY.
-- New documentation of custom configurations in CONFIG.md.
-- Fix build on gcc 4.8.  That's supported again.
-- Universal Shaping Engine improvements thanks to David Corbett.
-- API Changes: Undeprecate some horizontal-kerning API and re-enable in hb-ft,
-  such that Type1 fonts will continue kerning.
-
-
-Overview of changes leading to 2.5.1
-Friday, May 31, 2019
-====================================
-- Fix build with various versions of Visual Studio.
-- Improved documentation, thanks to Nathan Willis.
-- Bugfix in subsetting glyf table.
-- Improved scripts for cross-compiling for Windows using mingw.
-- Rename HB_MATH_GLYPH_PART_FLAG_EXTENDER to HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER.
-  A deprecated macro is added for backwards-compatibility.
-
-
-Overview of changes leading to 2.5.0
-Friday, May 24, 2019
-====================================
-- This release does not include much functional changes, but includes major internal
-  code-base changes.  We now require C++11.  Support for gcc 4.8 and earlier has been
-  dropped.
-- New hb-config.hh facility for compiling smaller library for embedded and web usecases.
-- New Unicode Character Database implementation that is half the size of previously-used
-  UCDN.
-- Subsetter improvements.
-- Improved documentation, thanks to Nathan Willis.
-- Misc shaping fixes.
-
-
-Overview of changes leading to 2.4.0
-Monday, March 25, 2019
-====================================
-- Unicode 12.
-- Misc fixes.
-- Subsetter improvements.
-- New API:
-HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE
-hb_directwrite_face_create()
-
-
-Overview of changes leading to 2.3.1
-Wednesday, January 30, 2019
-====================================
-- AAT bug fixes.
-- Misc internal housekeeping cleanup.
-
-
-Overview of changes leading to 2.3.0
-Thursday, December 20, 2018
-====================================
-- Fix regression on big-endian architectures.  Ouch!
-- Misc bug and build fixes.
-- Fix subsetting of simple GSUB/GDEF.
-- Merge CFF / CFF2 support contributed by Adobe.  This mostly involves
-  the subsetter, but also get_glyph_extents on CFF fonts.
-
-New API in hb-aat.h:
-+hb_aat_layout_has_substitution()
-+hb_aat_layout_has_positioning()
-+hb_aat_layout_has_tracking()
-
-
-Overview of changes leading to 2.2.0
-Thursday, November 29, 2018
-====================================
-- Misc shaping bug fixes.
-- Add font variations named-instance API.
-- Deprecate font variations axis enumeration API and add replacement.
-- AAT shaping improvements:
-  o Fixed 'kern' table Format 2 implementation.
-  o Implement 'feat' table API for feature detection.
-  o Blacklist 'GSUB' table of fonts from 'MUTF' foundry that also have 'morx'.
-
-New API:
-+hb_aat_layout_feature_type_t
-+hb_aat_layout_feature_selector_t
-+hb_aat_layout_get_feature_types()
-+hb_aat_layout_feature_type_get_name_id
-+hb_aat_layout_feature_selector_info_t
-+HB_AAT_LAYOUT_NO_SELECTOR_INDEX
-+hb_aat_layout_feature_type_get_selector_infos()
-+hb_ot_var_axis_flags_t
-+hb_ot_var_axis_info_t
-+hb_ot_var_get_axis_infos()
-+hb_ot_var_find_axis_info()
-+hb_ot_var_get_named_instance_count()
-+hb_ot_var_named_instance_get_subfamily_name_id()
-+hb_ot_var_named_instance_get_postscript_name_id()
-+hb_ot_var_named_instance_get_design_coords()
-
-Deprecated API:
-+HB_OT_VAR_NO_AXIS_INDEX
-+hb_ot_var_axis_t
-+hb_ot_var_get_axes()
-+hb_ot_var_find_axis()
-
-
-Overview of changes leading to 2.1.3
-Friday, November 16, 2018
-====================================
-- Fix AAT 'mort' shaping, which was broken in 2.1.2
-
-
-Overview of changes leading to 2.1.2
-Friday, November 16, 2018
-====================================
-- Various internal changes.
-- AAT shaping improvements:
-  o Implement kern table Format 1 state-machine-based kerning.
-  o Implement cross-stream kerning (cursive positioning, etc).
-  o Ignore emptyish GSUB tables (zero scripts) if morx present.
-  o Don't apply GPOS if morx is being applied.  Matches Apple.
-
-
--Overview of changes leading to 2.1.1
-Monday, November 5, 2018
-====================================
-- AAT improvements:
-  o Implement 'mort' table.
-  o Implement 'kern' subtables Format 1 and Format 3.
-
-
-Overview of changes leading to 2.1.0
-Tuesday, October 30, 2018
-====================================
-- AAT shaping improvements:
-  o Allow user controlling AAT features, for whole buffer only currently.
-  o Several 'morx' fixes.
-  o Implement tuple-kerns in 'kerx'; Fixes kerning with Apple default
-    San Francisco fonts.
-- Support for color fonts:
-  o COLR/CPAL API to fetch color layers.
-  o SVG table to fetch SVG documents.
-  o CBDT/sbix API to fetch PNG images.
-- New 'name' table API.
-- hb-ot-font now uses 'VORG' table to correctly position CFF glyphs
-  in vertical layout.
-- Various fuzzer-found bug fixes.
-
-Changed API:
-
-A type and a macro added in 2.0.0 were renamed:
-
-hb_name_id_t -> hb_ot_name_id_t
-HB_NAME_ID_INVALID -> HB_OT_NAME_ID_INVALID
-
-New API:
-
-+hb_color_t
-+HB_COLOR
-+hb_color_get_alpha()
-+hb_color_get_red()
-+hb_color_get_green()
-+hb_color_get_blue()
-+hb_ot_color_has_palettes()
-+hb_ot_color_palette_get_count()
-+hb_ot_color_palette_get_name_id()
-+hb_ot_color_palette_color_get_name_id()
-+hb_ot_color_palette_flags_t
-+hb_ot_color_palette_get_flags()
-+hb_ot_color_palette_get_colors()
-+hb_ot_color_has_layers()
-+hb_ot_color_layer_t
-+hb_ot_color_glyph_get_layers()
-+hb_ot_color_has_svg()
-+hb_ot_color_glyph_reference_svg()
-+hb_ot_color_has_png()
-+hb_ot_color_glyph_reference_png()
-
-+hb_ot_name_id_t
-+HB_OT_NAME_ID_INVALID
-+HB_OT_NAME_ID_COPYRIGHT
-+HB_OT_NAME_ID_FONT_FAMILY
-+HB_OT_NAME_ID_FONT_SUBFAMILY
-+HB_OT_NAME_ID_UNIQUE_ID
-+HB_OT_NAME_ID_FULL_NAME
-+HB_OT_NAME_ID_VERSION_STRING
-+HB_OT_NAME_ID_POSTSCRIPT_NAME
-+HB_OT_NAME_ID_TRADEMARK
-+HB_OT_NAME_ID_MANUFACTURER
-+HB_OT_NAME_ID_DESIGNER
-+HB_OT_NAME_ID_DESCRIPTION
-+HB_OT_NAME_ID_VENDOR_URL
-+HB_OT_NAME_ID_DESIGNER_URL
-+HB_OT_NAME_ID_LICENSE
-+HB_OT_NAME_ID_LICENSE_URL
-+HB_OT_NAME_ID_TYPOGRAPHIC_FAMILY
-+HB_OT_NAME_ID_TYPOGRAPHIC_SUBFAMILY
-+HB_OT_NAME_ID_MAC_FULL_NAME
-+HB_OT_NAME_ID_SAMPLE_TEXT
-+HB_OT_NAME_ID_CID_FINDFONT_NAME
-+HB_OT_NAME_ID_WWS_FAMILY
-+HB_OT_NAME_ID_WWS_SUBFAMILY
-+HB_OT_NAME_ID_LIGHT_BACKGROUND
-+HB_OT_NAME_ID_DARK_BACKGROUND
-+HB_OT_NAME_ID_VARIATIONS_PS_PREFIX
-+hb_ot_name_entry_t
-+hb_ot_name_list_names()
-+hb_ot_name_get_utf8()
-+hb_ot_name_get_utf16()
-+hb_ot_name_get_utf32()
-
-
-Overview of changes leading to 2.0.2
-Saturday, October 20, 2018
-====================================
-- Fix two minor memory access issues in AAT tables.
-
-
-Overview of changes leading to 2.0.1
-Friday, October 19, 2018
-====================================
-- Fix hb-version.h reported release version that went wrong (1.8.0)
-  with previous release.
-- Fix extrapolation in 'trak' table.
-- Fix hb-font infinite-recursion issue with some font funcs and
-  subclassed fonts.
-- Implement variation-kerning format in kerx table, although without
-  variation.
-- Fix return value of hb_map_is_empty().
-
-
-Overview of changes leading to 2.0.0
-Thursday, October 18, 2018
-====================================
-- Added AAT shaping support (morx/kerx/trak).
-  Automatically used if GSUB/GPOS are not available respectively.
-  Set HB_OPTIONS=aat env var to have morx/kerx preferred over
-  GSUB/GPOS.
-- Apply TrueType kern table internally, instead of relying on
-  hb_font_t callbacks.
-- Khmer shaper significantly rewritten to better match Uniscribe.
-- Indic3 tags ('dev3', etc) are passed to USE shaper.
-- .dfont Mac font containers implemented.
-- Script- and language-mapping revamped to better use BCP 47.
-- Misc USE and Indic fixes.
-- Misc everything fixes.
-- Too many things to list.  Biggest release since 0.9.1, with
-  over 500 commits in just over 5 weeks!  Didn't intend it to
-  be a big release.  Just happened to become.
-- hb-ft now locks underlying FT_Face during use.
-
-API changes:
-
-- Newly-created hb_font_t's now have our internal "hb-ot-font"
-  callbacks set on them, so they should work out of the box
-  without any callbacks set.  If callbacks are set, everything
-  is back to what it was before, the fallback callbacks are
-  null.  If you to get the internal implementation modified,
-  sub_font it.
-
-- New hb_font_funcs_set_nominal_glyphs_func() allows speeding
-  up character to glyph mapping.
-
-New API:
-+HB_FEATURE_GLOBAL_START
-+HB_FEATURE_GLOBAL_END
-+hb_buffer_set_invisible_glyph()
-+hb_buffer_get_invisible_glyph()
-+hb_font_funcs_set_nominal_glyphs_func()
-+hb_ot_layout_table_select_script()
-+hb_ot_layout_script_select_language()
-+hb_ot_layout_feature_get_name_ids()
-+hb_ot_layout_feature_get_characters()
-+hb_name_id_t
-+HB_NAME_ID_INVALID
-+HB_OT_MAX_TAGS_PER_SCRIPT
-+hb_ot_tags_from_script_and_language()
-+hb_ot_tags_to_script_and_language()
-
-Deprecated API:
--hb_font_funcs_set_glyph_func()
--hb_unicode_eastasian_width_func_t
--hb_unicode_funcs_set_eastasian_width_func()
--hb_unicode_eastasian_width()
--hb_unicode_decompose_compatibility_func_t
--HB_UNICODE_MAX_DECOMPOSITION_LEN
--hb_unicode_funcs_set_decompose_compatibility_func()
--hb_unicode_decompose_compatibility()
--hb_font_funcs_set_glyph_h_kerning_func()
--hb_font_funcs_set_glyph_v_kerning_func()
--hb_font_get_glyph_h_kerning()
--hb_font_get_glyph_v_kerning()
--hb_font_get_glyph_kerning_for_direction()
--hb_ot_layout_table_choose_script()
--hb_ot_layout_script_find_language()
--hb_ot_tags_from_script()
--hb_ot_tag_from_language()
-
-
-Overview of changes leading to 1.9.0
-Monday, September 10, 2018
-====================================
-- Added 'cmap' API to hb_face_t.
-- Face-builder API.
-- hb-ot-font re-creation should be much leaner now, as the
-  font tables it uses are cached on hb_face_t now.
-- Internal source header file name changes:
-  hb-*-private.hh is renamed to hb-*.hh.
-
-New API:
-+HB_UNICODE_MAX
-+hb_face_collect_unicodes()
-+hb_face_collect_variation_selectors()
-+hb_face_collect_variation_unicodes()
-+hb_face_builder_create()
-+hb_face_builder_add_table()
-
-
-Overview of changes leading to 1.8.8
-Tuesday, August 14, 2018
-====================================
-- Fix hb-icu crash on architectures where compare_exchange_weak() can
-  fail falsely.  This bug was introduced in 1.8.4.
-  https://bugs.chromium.org/p/chromium/issues/detail?id=873568
-- More internal refactoring of atomic operations and singletons.
-- API changes:
-  The following functions do NOT reference their return value before
-  returning:
-  * hb_unicode_funcs_get_default()
-  * hb_glib_get_unicode_funcs()
-  * hb_icu_get_unicode_funcs()
-  This is consistent with their naming ("get", instead of "reference")
-  as well as how they are used in the wild (ie. no one calls destroy()
-  on their return value.)
-
-
-Overview of changes leading to 1.8.7
-Wednesday, August 8, 2018
-====================================
-- Fix assertion failure with GDEF-blacklisted fonts.
-
-
-Overview of changes leading to 1.8.6
-Tuesday, August 7, 2018
-====================================
-- Internal code shuffling.
-- New API to speed up getting advance widths for implementations
-  that have heavy overhead in get_h_advance callback:
-+hb_font_funcs_set_glyph_h_advances_func
-+hb_font_funcs_set_glyph_v_advances_func
-+hb_font_get_glyph_advances_for_direction
-+hb_font_get_glyph_h_advances
-+hb_font_get_glyph_h_advances_func_t
-+hb_font_get_glyph_v_advances
-+hb_font_get_glyph_v_advances_func_t
-
-
-Overview of changes leading to 1.8.5
-Wednesday, August 1, 2018
-====================================
-- Major Khmer shaper improvements to better match Microsoft.
-- Indic bug fixes.
-- Internal improvements to atomic operations.
-
-
-Overview of changes leading to 1.8.4
-Tuesday, July 17, 2018
-====================================
-- Fix build on non-C++11.
-- Use C++-style GCC atomics and C++11 atomics.
-
-
-Overview of changes leading to 1.8.3
-Wednesday, July 11, 2018
-====================================
-- A couple of Indic / USE bug fixes.
-- Disable vectorization, as it was causing unaligned access bus error on
-  certain 32bit architectures.
-
-
-Overview of changes leading to 1.8.2
-Tuesday, July 3, 2018
-====================================
-- Fix infinite loop in Khmer shaper.
-- Improve hb_blob_create_from_file() for streams.
-
-
-Overview of changes leading to 1.8.1
-Tuesday, June 12, 2018
-====================================
-- Fix hb-version.h file generation; last two releases went out with wrong ones.
-- Add correctness bug in hb_set_t operations, introduced in 1.7.7.
-- Remove HB_SUBSET_BUILTIN build option.  Not necessary.
-
-
-Overview of changes leading to 1.8.0
-Tuesday, June 5, 2018
-====================================
-- Update to Unicode 11.0.0.
-
-
-Overview of changes leading to 1.7.7
-Tuesday, June 5, 2018
-====================================
-- Lots of internal changes, but not yet exposed externally.
-- All HarfBuzz objects are significantly smaller in size now.
-- Sinhala: Position repha on top of post-consonant, not base.
-  This better matches Windows 10 behavior, which was changed
-  from previous Windows versions.
-- New build options:
-  o New cpp macro HB_NO_ATEXIT
-  o New cpp macro HB_SUBSET_BUILTIN
-- Significant libharfbuzz-subset changes. API subject to change.
-- New API in libharfbuzz:
-
-+hb_blob_create_from_file()
-+hb_face_count()
-
-A hashmap implementation:
-+hb-map.h
-+HB_MAP_VALUE_INVALID
-+hb_map_t
-+hb_map_create()
-+hb_map_get_empty()
-+hb_map_reference()
-+hb_map_destroy()
-+hb_map_set_user_data()
-+hb_map_get_user_data()
-+hb_map_allocation_successful()
-+hb_map_clear()
-+hb_map_is_empty()
-+hb_map_get_population()
-+hb_map_set()
-+hb_map_get()
-+hb_map_del()
-+hb_map_has()
-
-
-Overview of changes leading to 1.7.6
-Wednesday, March 7, 2018
-====================================
-
-- Fix to hb_set_t binary operations. Ouch.
-- New experimental harfbuzz-subset library. All of hb-subset.h
-  is experimental right now and API WILL change.
-
-- New API:
-hb_blob_copy_writable_or_fail()
-HB_OT_TAG_BASE
-hb_set_previous()
-hb_set_previous_range()
-
-
-Overview of changes leading to 1.7.5
-Tuesday, January 30, 2018
-====================================
-
-- Separate Khmer shaper from Indic.
-- First stab at AAT morx. Not hooked up.
-- Misc bug fixes.
-
-
-Overview of changes leading to 1.7.4
-Wednesday, December 20, 2017
-====================================
-
-- Fix collect_glyphs() regression caused by hb_set_t changes.
-
-
-Overview of changes leading to 1.7.3
-Monday, December 18, 2017
-====================================
-
-- hb_set_t performance tuning and optimizations.
-- Speed up collect_glyphs() and reject garbage data.
-- In hb_coretext_font_create() set font point-size (ptem).
-- Misc fixes.
-
-
-Overview of changes leading to 1.7.2
-Monday, December 4, 2017
-====================================
-
-- Optimize hb_set_add_range().
-- Misc fixes.
-- New API:
-hb_coretext_font_create()
-
-
-Overview of changes leading to 1.7.1
-Tuesday, November 14, 2017
-====================================
-
-- Fix atexit object destruction regression.
-- Fix minor integer-overflow.
-
-
-Overview of changes leading to 1.7.0
-Monday, November 13, 2017
-====================================
-
-- Minor Indic fixes.
-- Implement kerning and glyph names in hb-ot-font.
-- Various DSO optimization re .data and .bss sizes.
-- Make C++11 optional; build fixes.
-- Mark all other backends "unsafe-to-break".
-- Graphite fix.
-
-
-Overview of changes leading to 1.6.3
-Thursday, October 26th, 2017
-====================================
-
-- Fix hb_set_t some more.  Should be solid now.
-- Implement get_glyph_name() for hb-ot-font.
-- Misc fixes.
-
-
-Overview of changes leading to 1.6.2
-Monday, October 23nd, 2017
-====================================
-
-- Yesterday's release had a bad crasher; don't use it.  That's what
-  happens when one works on Sunday...
-  https://github.com/harfbuzz/harfbuzz/issues/578
-- Build fixes for FreeBSD and Chrome Android.
-
-
-Overview of changes leading to 1.6.1
-Sunday, October 22nd, 2017
-====================================
-
-- Don't skip over COMBINING GRAPHEME JOINER when ligating, etc.
-  To be refined: https://github.com/harfbuzz/harfbuzz/issues/554
-- Faster hb_set_t implementation.
-- Don't use deprecated ICU API.
-- Fix undefined-behavior in Myanmar shaper, introduced in 1.6.0
-- Deprecated API:
-  hb_set_invert()
-
-
-Overview of changes leading to 1.6.0
-Friday, October the 13th, 2017
-====================================
-
-- Update to Unicode 10.
-
-- Various Indic and Universal Shaping Engine fixes as a result of
-  HarfBuzz Hackfest with Jonathan Kew at Web Engines Hackfest at
-  the Igalia offices in A Coruña, Spain.  Thanks Igalia for having
-  us!
-
-- Implement Unicode Arabic Mark Ordering Algorithm UTR#53.
-
-- Implement optical sizing / tracking in CoreText backend, using
-  new API hb_font_set_ptem().
-
-- Allow notifying hb_font_t that underlying FT_Face changed sizing,
-  using new API hb_ft_font_changed().
-
-- More Graphite backend RTL fixes.
-
-- Fix caching of variable font shaping plans.
-
-- hb-view / hb-shape now accept following new arguments:
-
-  o --unicodes: takes a list of hex numbers that represent Unicode
-    codepoints.
-
-New API:
-+hb_face_get_table_tags()
-+hb_font_set_ptem()
-+hb_font_get_ptem()
-+hb_ft_font_changed()
-
-
-Overview of changes leading to 1.5.1
-Tuesday, September 5, 2017
-====================================
-
-- Fix "unsafe-to-break" in fallback shaping and other corner cases.
-  All our tests pass with --verify now, meaning unsafe-to-break API
-  works as expected.
-- Add --unicodes to hb-view / hb-shape.
-- [indic] Treat Consonant_With_Stacker as consonant.  This will need
-  further tweaking.
-- hb_buffer_diff() tweaks.
-
-
-Overview of changes leading to 1.5.0
-Wednesday, August 23, 2017
-====================================
-
-- Misc new API, for appending a buffer to another, and for comparing
-  contents of two buffers for types of differences.
-
-- New "unsafe-to-break" API.  Can be used to speed up reshaping
-  in line-breaking situations.  Essentially, after shaping, it returns
-  positions in the input string (some of the cluster boundaries) that
-  are "safe to break" in that if the text is segmented at that position
-  and two sides reshaped and concatenated, the shaping result is
-  exactly the same as shaping the text in one piece.
-
-  hb-view and hb-shape and hb-shape now take --verify, which verifies
-  the above property.
-
-  Some corner cases of the implementation are still not quite working.
-  Those will be fixed in subsequent releases.
-
-- New API:
-
-hb_buffer_append()
-
-hb_glyph_flags_t
-HB_GLYPH_FLAG_UNSAFE_TO_BREAK
-HB_GLYPH_FLAG_DEFINED
-hb_glyph_info_get_glyph_flags()
-
-HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS
-
-hb_buffer_diff_flags_t
-HB_BUFFER_DIFF_FLAG_EQUAL
-HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH
-HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH
-HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT
-HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT
-HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH
-HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH
-HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH
-HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH
-hb_buffer_diff
-
-
-Overview of changes leading to 1.4.8
-Tuesday, August 8, 2017
-====================================
-
-- Major fix to avar table handling.
-- Rename hb-shape --show-message to --trace.
-- Build fixes.
-
-
-Overview of changes leading to 1.4.7
-Tuesday, July 18, 2017
-====================================
-
-- Multiple Indic, Tibetan, and Cham fixes.
-- CoreText: Allow disabling kerning.
-- Adjust Arabic feature order again.
-- Misc build fixes.
-
-
-Overview of changes leading to 1.4.6
-Sunday, April 23, 2017
-====================================
-
-- Graphite2: Fix RTL positioning issue.
-- Backlist GDEF of more versions of Padauk and Tahoma.
-- New, experimental, cmake alternative build system.
-
-
-Overview of changes leading to 1.4.5
-Friday, March 10, 2017
-====================================
-
-- Revert "Fix Context lookup application when moving back after a glyph..."
-  This introduced memory access problems.  To be fixed properly soon.
-
-
-Overview of changes leading to 1.4.4
-Sunday, March 5, 2017
-====================================
-
-- Fix Context lookup application when moving back after a glyph deletion.
-- Fix buffer-overrun in Bengali.
-
-
-Overview of changes leading to 1.4.3
-Saturday, February 25, 2017
-====================================
-
-- Route Adlam script to Arabic shaper.
-- Misc fixes.
-- New API:
-  hb_font_set_face()
-- Deprecate API:
-  hb_graphite2_font_get_gr_font()
-
-
-Overview of changes leading to 1.4.2
-Monday, January 23, 2017
-====================================
-
-- Implement OpenType Font Variation tables avar/fvar/HVAR/VVAR.
-- hb-shape and hb-view now accept --variations.
-- New API:
-
-hb_variation_t
-hb_variation_from_string()
-hb_variation_to_string()
-
-hb_font_set_variations()
-hb_font_set_var_coords_design()
-hb_font_get_var_coords_normalized()
-
-hb-ot-var.h:
-hb_ot_var_axis_t
-hb_ot_var_has_data()
-hb_ot_var_get_axis_count()
-hb_ot_var_get_axes()
-hb_ot_var_find_axis()
-hb_ot_var_normalize_variations()
-hb_ot_var_normalize_coords()
-
-- MVAR to be implemented later.  Access to named instances to be
-  implemented later as well.
-
-- Misc fixes.
-
-
-Overview of changes leading to 1.4.1
-Thursday, January 5, 2017
-====================================
-
-- Always build and use UCDN for Unicode data by default.
-  Reduces dependence on version of Unicode data in glib,
-  specially in the Windows bundles we are shipping, which
-  have very old glib.
-
-
-Overview of changes leading to 1.4.0
-Thursday, January 5, 2017
-====================================
-
-- Merged "OpenType GX" branch which adds core of support for
-  OpenType 1.8 Font Variations.  To that extent, the relevant
-  new API is:
-
-New API:
-hb_font_set_var_coords_normalized()
-
-  with supporting API:
-
-New API:
-HB_OT_LAYOUT_NO_VARIATIONS_INDEX
-hb_ot_layout_table_find_feature_variations()
-hb_ot_layout_feature_with_variations_get_lookups()
-hb_shape_plan_create2()
-hb_shape_plan_create_cached2()
-
-  Currently variations in GSUB/GPOS/GDEF are fully supported,
-  and no other tables are supported.  In particular, fvar/avar
-  are NOT supported, hence the hb_font_set_var_coords_normalized()
-  taking normalized coordinates.  API to take design coordinates
-  will be added in the future.
-
-  HVAR/VVAR/MVAR support will also be added to hb-ot-font in the
-  future.
-
-- Fix regression in GDEF glyph class processing.
-- Add decompositions for Chakma, Limbu, and Balinese in USE shaper.
-- Misc fixes.
-
-
-Overview of changes leading to 1.3.4
-Monday, December 5, 2016
-====================================
-
-- Fix vertical glyph origin in hb-ot-font.
-- Implement CBDT/CBLC color font glyph extents in hb-ot-font.
-
-
-Overview of changes leading to 1.3.3
-Wednesday, September 28, 2016
-====================================
-
-- Implement parsing of OpenType MATH table.
-New API:
-HB_OT_TAG_MATH
-HB_OT_MATH_SCRIPT
-hb_ot_math_constant_t
-hb_ot_math_kern_t
-hb_ot_math_glyph_variant_t
-hb_ot_math_glyph_part_flags_t
-hb_ot_math_glyph_part_t
-hb_ot_math_has_data
-hb_ot_math_get_constant
-hb_ot_math_get_glyph_italics_correction
-hb_ot_math_get_glyph_top_accent_attachment
-hb_ot_math_get_glyph_kerning
-hb_ot_math_is_glyph_extended_shape
-hb_ot_math_get_glyph_variants
-hb_ot_math_get_min_connector_overlap
-hb_ot_math_get_glyph_assembly
-
-
-Overview of changes leading to 1.3.2
-Wednesday, September 27, 2016
-====================================
-
-- Fix build of hb-coretext on older OS X versions.
-
-
-Overview of changes leading to 1.3.1
-Wednesday, September 7, 2016
-====================================
-
-- Blacklist bad GDEF of more fonts (Padauk).
-- More CoreText backend crash fixes with OS X 10.9.5.
-- Misc fixes.
-
-
-Overview of changes leading to 1.3.0
-Thursday, July 21, 2016
-====================================
-
-- Update to Unicode 9.0.0
-- Move Javanese from Indic shaper to Universal Shaping Engine.
-- Allow MultipleSubst to delete a glyph (matching Windows engine).
-- Update Universal Shaping Engine to latest draft from Microsoft.
-- DirectWrite backend improvements.  Note: this backend is for testing ONLY.
-- CoreText backend improvements with unreachable fonts.
-- Implement symbol fonts (cmap 3.0.0) in hb-ft and hb-ot-font.
-- Blacklist bad GDEF of more fonts (Tahoma & others).
-- Misc fixes.
-
-
-Overview of changes leading to 1.2.7
-Monday, May 2, 2016
-====================================
-
-- Blacklist another version of Times New Roman (Bold) Italic from Windows 7.
-- Fix Mongolian Free Variation Selectors shaping with certain fonts.
-- Fix Tibetan shorthand contractions shaping.
-- Improved list of language tag mappings.
-- Unbreak build on Windows CE.
-- Make 'glyf' table loading lazy in hb-ot-font.
-
-
-Overview of changes leading to 1.2.6
-Friday, April 8, 2016
-====================================
-
-- Blacklist GDEF table of another set of Times New Roman (Bold) Italic.
-- DirectWrite backend improvements.  Note: DirectWrite backend is
-  exclusively for our internal testing and should NOT be used in any
-  production system whatsoever.
-
-
-Overview of changes leading to 1.2.5
-Monday, April 4, 2016
-====================================
-
-- Fix GDEF mark-filtering-set, which was broken in 1.2.3.
-
-
-Overview of changes leading to 1.2.4
-Thursday, March 17, 2016
-====================================
-
-- Synthesize GDEF glyph class for any glyph that does not have one in GDEF.
-  I really hope we don't discover broken fonts that shape badly with this
-  change.
-- Misc build and other minor fixes.
-- API changes:
-  - Added HB_NDEBUG.  It's fine for production systems to define this to
-    disable high-overhead debugging checks.  However, I also reduced the
-    overhead of those checks, so it's a non-issue right now.  You can
-    forget it.  Just not defining anything at all is fine.
-
-
-Overview of changes leading to 1.2.3
-Thursday, February 25, 2016
-====================================
-
-- Blacklist GDEF table of certain versions of Times New Roman (Bold) Italic,
-  due to bug in glyph class of ASCII double-quote character.  This should
-  address "regression" introduced in 1.2.0 when we switched mark zeroing
-  in most shapers from BY_UNICODE_LATE to BY_GDEF_LATE.
-  This fourth release in a week should finally stabilize things...
-
-- hb-ot-font's get_glyph() implementation saw some optimizations.  Though,
-  might be really hard to measure in real-world situations.
-
-- Also, two rather small API changes:
-
-We now disable some time-consuming internal bookkeeping if built with NDEBUG
-defined.  This is a first time that we use NDEBUG to disable debug code.  If
-there exist production systems that do NOT want to enable NDEBUG, please let
-me know and I'll add HB_NDEBUG.
-
-Added get_nominal_glyph() and get_variation_glyph() instead of get_glyph()
-
-New API:
-- hb_font_get_nominal_glyph_func_t
-- hb_font_get_variation_glyph_func_t
-- hb_font_funcs_set_nominal_glyph_func()
-- hb_font_funcs_set_variation_glyph_func()
-- hb_font_get_nominal_glyph()
-- hb_font_get_variation_glyph()
-
-Deprecated API:
-- hb_font_get_glyph_func_t
-- hb_font_funcs_set_glyph_func()
-
-Clients that implement their own font-funcs are encouraged to replace
-their get_glyph() implementation with a get_nominal_glyph() and
-get_variation_glyph() pair.  The variation version can assume that
-variation_selector argument is not zero.  Old (deprecated) functions
-will continue working indefinitely using internal gymnastics; it is
-just more efficient to use the new functions.
-
-
-Overview of changes leading to 1.2.2
-Wednesday, February 24, 2016
-====================================
-
-- Fix regression with mark positioning with fonts that have
-  non-zero mark advances.  This was introduced in 1.2.0 while
-  trying to make mark and cursive attachments to work together.
-  I have partially reverted that, so this version is much more
-  like what we had before.  All clients who updated to 1.2.0
-  should update to this version.
-
-
-Overview of changes leading to 1.2.1
-Tuesday, February 23, 2016
-====================================
-
-- CoreText: Fix bug with wrong scale if font scale was changed later.
-  https://github.com/libass/libass/issues/212
-- CoreText: Drastically speed up font initialization.
-- CoreText: Fix tiny leak.
-- Group ZWJ/ZWNJ with previous syllable under cluster-level=0.
-  https://github.com/harfbuzz/harfbuzz/issues/217
-- Add test/shaping/README.md about how to add tests to the suite.
-
-
-Overview of changes leading to 1.2.0
-Friday, February 19, 2016
-====================================
-
-- Fix various issues (hangs mostly) in case of memory allocation failure.
-- Change mark zeroing types of most shapers from BY_UNICODE_LATE to
-  BY_GDEF_LATE.  This seems to be what Uniscribe does.
-- Change mark zeroing of USE shaper from NONE to BY_GDEF_EARLY.  That's
-  what Windows does.
-- Allow GPOS cursive connection on marks, and fix the interaction with
-  mark attachment.  This work resulted in some changes to how mark
-  attachments work.  See:
-  https://github.com/harfbuzz/harfbuzz/issues/211
-  https://github.com/harfbuzz/harfbuzz/commit/86c68c7a2c971efe8e35b1f1bd99401dc8b688d2
-- Graphite2 shaper: improved negative advance handling (eg. Nastaliq).
-- Add nmake-based build system for Windows.
-- Minor speedup.
-- Misc. improvements.
-
-
-Overview of changes leading to 1.1.3
-Monday, January 11, 2016
-====================================
-
-- Ported Indic shaper to Unicode 8.0 data.
-- Universal Shaping Engine fixes.
-- Speed up CoreText shaper when font fallback happens in CoreText.
-- Documentation improvements, thanks to Khaled Hosny.
-- Very rough directwrite shaper for testing, thanks to Ebrahim Byagowi.
-- Misc bug fixes.
-- New API:
-
-  * Font extents:
-      hb_font_extents_t
-      hb_font_get_font_extents_func_t
-      hb_font_get_font_h_extents_func_t
-      hb_font_get_font_v_extents_func_t
-      hb_font_funcs_set_font_h_extents_func
-      hb_font_funcs_set_font_v_extents_func
-      hb_font_get_h_extents
-      hb_font_get_v_extents
-      hb_font_get_extents_for_direction
-
-  * Buffer message (aka debug):
-      hb_buffer_message_func_t
-      hb_buffer_set_message_func()
-    Actual message protocol to be fleshed out later.
-
-
-Overview of changes leading to 1.1.2
-Wednesday, November 26, 2015
-====================================
-
-- Fix badly-broken fallback shaper that affected terminology.
-  https://github.com/harfbuzz/harfbuzz/issues/187
-- Fix y_scaling in Graphite shaper.
-- API changes:
-  * An unset glyph_h_origin() function in font-funcs now (sensibly)
-    implies horizontal origin at 0,0.  Ie, the nil callback returns
-    true instead of false.  As such, implementations that have a
-    glyph_h_origin() that simply returns true, can remove that function
-    with HarfBuzz >= 1.1.2.  This results in a tiny speedup.
-
-
-Overview of changes leading to 1.1.1
-Wednesday, November 24, 2015
-====================================
-
-- Build fixes, specially for hb-coretext.
-
-
-Overview of changes leading to 1.1.0
-Wednesday, November 18, 2015
-====================================
-
-- Implement 'stch' stretch feature for Syriac Abbreviation Mark.
-  https://github.com/harfbuzz/harfbuzz/issues/141
-- Disable use of decompose_compatibility() callback.
-- Implement "shaping" of various Unicode space characters, even
-  if the font does not support them.
-  https://github.com/harfbuzz/harfbuzz/issues/153
-- If font does not support U+2011 NO-BREAK HYPHEN, fallback to
-  U+2010 HYPHEN.
-- Changes resulting from libFuzzer continuous fuzzing:
-  * Reject font tables that need more than 8 edits,
-  * Bound buffer growth during shaping to 32x,
-  * Fix assertions and other issues at OOM / buffer max-growth.
-- Misc fixes and optimizations.
-- API changes:
-  * All fonts created with hb_font_create() now inherit from
-    (ie. have parent) hb_font_get_empty().
-
-
-Overview of changes leading to 1.0.6
-Thursday, October 15, 2015
-====================================
-
-- Reduce max nesting level in OT lookups from 8 to 6.
-  Should not affect any real font as far as I know.
-- Fix memory access issue in ot-font.
-- Revert default load-flags of fonts created using hb_ft_font_create()
-  back to FT_LOAD_DEFAULT|FT_LOAD_NO_HINTING.  This was changed in
-  last release (1.0.5), but caused major issues, so revert.
-  https://github.com/harfbuzz/harfbuzz/issues/143
-
-
-Overview of changes leading to 1.0.5
-Tuesday, October 13, 2015
-====================================
-
-- Fix multiple memory access bugs discovered using libFuzzer.
-  https://github.com/harfbuzz/harfbuzz/issues/139
-  Everyone should upgrade to this version as soon as possible.
-  We now have continuous fuzzing set up, to avoid issues like
-  these creeping in again.
-- Misc fixes.
-
-- New API:
-  * hb_font_set_parent().
-  * hb_ft_font_[sg]et_load_flags()
-    The default flags for fonts created using hb_ft_font_create()
-    has changed to default to FT_LOAD_DEFAULT now.  Previously it
-    was defaulting to FT_LOAD_DFEAULT|FT_LOAD_NO_HINTING.
-
-- API changes:
-  * Fonts now default to units-per-EM as their scale, instead of 0.
-  * hb_font_create_sub_font() does NOT make parent font immutable
-    anymore.  hb_font_make_immutable() does.
-
-
-Overview of changes leading to 1.0.4
-Wednesday, September 30, 2015
-====================================
-
-- Fix minor out-of-bounds read error.
-
-
-Overview of changes leading to 1.0.3
-Tuesday, September 1, 2015
-====================================
-
-- Start of user documentation, from Simon Cozens!
-- Implement glyph_extents() for TrueType fonts in hb-ot-font.
-- Improve GPOS cursive attachments with conflicting lookups.
-- More fixes for cluster-level = 1.
-- Uniscribe positioning fix.
-
-
-Overview of changes leading to 1.0.2
-Wednesday, August 19, 2015
-====================================
-
-- Fix shaping with cluster-level > 0.
-- Fix Uniscribe backend font-size scaling.
-- Declare dependencies in harfbuzz.pc.
-  FreeType is not declared though, to avoid bugs in pkg-config
-  0.26 with recursive dependencies.
-- Slightly improved debug infrastructure.  More to come later.
-- Misc build fixes.
-
-
-Overview of changes leading to 1.0.1
-Monday, July 27, 2015
-====================================
-
-- Fix out-of-bounds access in USE shaper.
-
-
-Overview of changes leading to 1.0.0
-Sunday, July 26, 2015
-====================================
-
-- Implement Universal Shaping Engine:
-  https://www.microsoft.com/typography/OpenTypeDev/USE/intro.htm
-  http://blogs.windows.com/bloggingwindows/2015/02/23/windows-shapes-the-worlds-languages/
-- Bump version to 1.0.0.  The soname was NOT bumped.
-
-
-Overview of changes leading to 0.9.42
-Thursday, July 26, 2015
-=====================================
-
-- New API to allow for retrieving finer-grained cluster
-  mappings if the client desires to handle them.  Default
-  behavior is unchanged.
-- Fix cluster merging when removing default-ignorables.
-- Update to Unicode 8.0
-- hb-graphite2 fixes.
-- Misc fixes.
-- Removed HB_NO_MERGE_CLUSTERS hack.
-- New API:
-  hb_buffer_cluster_level_t enum
-  hb_buffer_get_cluster_level()
-  hb_buffer_set_cluster_level()
-  hb-shape / hb-view --cluster-level
-
-
-Overview of changes leading to 0.9.41
-Thursday, June 18, 2015
-=====================================
-
-- Fix hb-coretext with trailing whitespace in right-to-left.
-- New API: hb_buffer_reverse_range().
-- Allow implementing atomic ops in config.h.
-- Fix hb_language_t in language bindings.
-- Misc fixes.
-
-
-Overview of changes leading to 0.9.40
-Friday, March 20, 2015
-=====================================
-
-- Another hb-coretext crasher fix.  Ouch!
-- Happy Norouz!
-
-
-Overview of changes leading to 0.9.39
-Wednesday, March 4, 2015
-=====================================
-
-- Critical hb-coretext fixes.
-- Optimizations and refactoring; no functional change
-  expected.
-- Misc build fixes.
-
-
-Overview of changes leading to 0.9.38
-Friday, January 23, 2015
-=====================================
-
-- Fix minor out-of-bounds access in Indic shaper.
-- Change New Tai Lue shaping engine from South-East Asian to default,
-  reflecting change in Unicode encoding model.
-- Add hb-shape --font-size.  Can take up to two numbers for separate
-  x / y size.
-- Fix CoreText and FreeType scale issues with negative scales.
-- Reject blobs larger than 2GB.  This might break some icu-le-hb clients
-  that need security fixes.  See:
-  http://www.icu-project.org/trac/ticket/11450
-- Avoid accessing font tables during face destruction, in casce rogue
-  clients released face data already.
-- Fix up gobject-introspection a bit.  Python bindings kinda working.
-  See README.python.
-- Misc fixes.
-- API additions:
-  hb_ft_face_create_referenced()
-  hb_ft_font_create_referenced()
-
-
-Overview of changes leading to 0.9.37
-Wednesday, December 17, 2014
-=====================================
-
-- Fix out-of-bounds access in Context lookup format 3.
-- Indic: Allow ZWJ/ZWNJ before syllable modifiers.
-
-
-Overview of changes leading to 0.9.36
-Thursday, November 20, 2014
-=====================================
-
-- First time that three months went by without a release since
-  0.9.2 was released on August 10, 2012!
-- Fix performance bug in hb_ot_collect_glyphs():
-  https://bugzilla.mozilla.org/show_bug.cgi?id=1090869
-- Add basic vertical-text support to hb-ot-font.
-- Misc build fixes.
-
-
-Overview of changes leading to 0.9.35
-Saturday, August 13, 2014
-=====================================
-
-- Fix major shape-plan caching bug when more than one shaper were
-  provided to hb_shape_full() (as exercised by XeTeX).
-  http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1246370.html
-- Fix Arabic fallback shaping regression.  This was broken in 0.9.32.
-- Major hb-coretext fixes.  That backend is complete now, including
-  respecing buffer direction and language, down to vertical writing.
-- Build fixes for Windows CE.  Should build fine now.
-- Misc fixes:
-  Use atexit() only if it's safe to call from shared library
-  https://bugs.freedesktop.org/show_bug.cgi?id=82246
-  Mandaic had errors in its Unicode Joining_Type
-  https://bugs.freedesktop.org/show_bug.cgi?id=82306
-- API changes:
-
-  * hb_buffer_clear_contents() does not reset buffer flags now.
-
-    After 763e5466c0a03a7c27020e1e2598e488612529a7, one doesn't
-    need to set flags for different pieces of text.  The flags now
-    are something the client sets up once, depending on how it
-    actually uses the buffer.  As such, don't clear it in
-    clear_contents().
-
-    I don't expect any changes to be needed to any existing client.
-
-
-Overview of changes leading to 0.9.34
-Saturday, August 2, 2014
-=====================================
-
-- hb_feature_from_string() now accepts CSS font-feature-settings format.
-- As a result, hb-shape / hb-view --features also accept CSS-style strings.
-  Eg, "'liga' off" is accepted now.
-- Add old-spec Myanmar shaper:
-  https://bugs.freedesktop.org/show_bug.cgi?id=81775
-- Don't apply 'calt' in Hangul shaper.
-- Fix mark advance zeroing for Hebrew shaper:
-  https://bugs.freedesktop.org/show_bug.cgi?id=76767
-- Implement Windows-1256 custom Arabic shaping.  Only built on Windows,
-  and requires help from get_glyph().  Used by Firefox.
-  https://bugzilla.mozilla.org/show_bug.cgi?id=1045139
-- Disable 'liga' in vertical text.
-- Build fixes.
-- API changes:
-
-  * Make HB_BUFFER_FLAG_BOT/EOT easier to use.
-
-    Previously, we expected users to provide BOT/EOT flags when the
-    text *segment* was at paragraph boundaries.  This meant that for
-    clients that provide full paragraph to HarfBuzz (eg. Pango), they
-    had code like this:
-
-      hb_buffer_set_flags (hb_buffer,
-                           (item_offset == 0 ? HB_BUFFER_FLAG_BOT : 0) |
-                           (item_offset + item_length == paragraph_length ?
-                            HB_BUFFER_FLAG_EOT : 0));
-
-      hb_buffer_add_utf8 (hb_buffer,
-                          paragraph_text, paragraph_length,
-                          item_offset, item_length);
-
-    After this change such clients can simply say:
-
-      hb_buffer_set_flags (hb_buffer,
-                           HB_BUFFER_FLAG_BOT | HB_BUFFER_FLAG_EOT);
-
-      hb_buffer_add_utf8 (hb_buffer,
-                          paragraph_text, paragraph_length,
-                          item_offset, item_length);
-
-    Ie, HarfBuzz itself checks whether the segment is at the beginning/end
-    of the paragraph.  Clients that only pass item-at-a-time to HarfBuzz
-    continue not setting any flags whatsoever.
-
-    Another way to put it is: if there's pre-context text in the buffer,
-    HarfBuzz ignores the BOT flag.  If there's post-context, it ignores
-    EOT flag.
-
-
-Overview of changes leading to 0.9.33
-Tuesday, July 22, 2014
-=====================================
-
-- Turn off ARabic 'cswh' feature that was accidentally turned on.
-- Add HB_TAG_MAX_SIGNED.
-- Make hb_face_make_immutable() really make face immutable!
-- Windows build fixes.
-
-
-Overview of changes leading to 0.9.32
-Thursday, July 17, 2014
-=====================================
-
-- Apply Arabic shaping features in spec order exactly.
-- Another fix for Mongolian free variation selectors.
-- For non-Arabic scripts in Arabic shaper apply 'rlig' and 'calt'
-  together.
-- Minor adjustment to U+FFFD logic.
-- Fix hb-coretext build.
-
-
-Overview of changes leading to 0.9.31
-Wednesday, July 16, 2014
-=====================================
-
-- Only accept valid UTF-8/16/32; we missed many cases before.
-- Better shaping of invalid UTF-8/16/32.  Falls back to
-  U+FFFD REPLACEMENT CHARACTER now.
-- With all changes in this release, the buffer will contain fully
-  valid Unicode after hb_buffer_add_utf8/16/32 no matter how
-  broken the input is.  This can be overridden though.  See below.
-- Fix Mongolian Variation Selectors for fonts without GDEF.
-- Fix minor invalid buffer access.
-- Accept zh-Hant and zh-Hans language tags.  hb_ot_tag_to_language()
-  now uses these instead of private tags.
-- Build fixes.
-- New API:
-  * hb_buffer_add_codepoints().  This does what hb_buffer_add_utf32()
-    used to do, ie. no validity check on the input at all.  add_utf32
-    now replaces invalid Unicode codepoints with the replacement
-    character (see below).
-  * hb_buffer_set_replacement_codepoint()
-  * hb_buffer_get_replacement_codepoint()
-    Previously, in hb_buffer_add_utf8 and hb_buffer_add_utf16, when
-    we detected broken input, we replaced that with (hb_codepoint_t)-1.
-    This has changed to use U+FFFD now, but can be changed using these
-    new API.
-
-
-Overview of changes leading to 0.9.30
-Wednesday, July 9, 2014
-=====================================
-
-- Update to Unicode 7.0.0:
-  * New scripts Manichaean and Psalter Pahlavi are shaped using
-    Arabic shaper.
-  * All the other new scripts to through the generic shaper for
-    now.
-- Minor Indic improvements.
-- Fix graphite2 backend cluster mapping [crasher!]
-- API changes:
-  * New HB_SCRIPT_* values for Unicode 7.0 scripts.
-  * New function hb_ot_layout_language_get_required_feature().
-- Build fixes.
-
-
-Overview of changes leading to 0.9.29
-Thursday, May 29, 2014
-=====================================
-
-- Implement cmap in hb-ot-font.h.  No variation-selectors yet.
-- Myanmar: Allow MedialYa+Asat.
-- Various Indic fixes:
-  * Support most characters in Extended Devanagary and Vedic
-    Unicode blocks.
-  * Allow digits and a some punctuation as consonant placeholders.
-- Build fixes.
-
-
-Overview of changes leading to 0.9.28
-Monday, April 28, 2014
-=====================================
-
-- Unbreak old-spec Indic shaping. (bug 76705)
-- Fix shaping of U+17DD and U+0FC6.
-- Add HB_NO_MERGE_CLUSTERS build option.  NOT to be enabled by default
-  for shipping libraries.  It's an option for further experimentation
-  right now.  When we are sure how to do it properly, we will add
-  public run-time API for the functionality.
-- Build fixes.
-
-
-Overview of changes leading to 0.9.27
-Tuesday, March 18, 2014
-=====================================
-
-- Don't use "register" storage class specifier
-- Wrap definition of free_langs() with HAVE_ATEXIT
-- Add coretext_aat shaper and hb_coretext_face_create() constructor
-- If HAVE_ICU_BUILTIN is defined, use hb-icu Unicode callbacks
-- Add Myanmar test case from OpenType Myanmar spec
-- Only do fallback Hebrew composition if no GPOS 'mark' available
-- Allow bootstrapping without gtk-doc
-- Use AM_MISSING_PROG for ragel and git
-- Typo in ucdn's Makefile.am
-- Improve MemoryBarrier() implementation
-
-
-Overview of changes leading to 0.9.26
-Thursday, January 30, 2014
-=====================================
-
-- Misc fixes.
-- Fix application of 'rtlm' feature.
-- Automatically apply frac/numr/dnom around U+2044 FRACTION SLASH.
-- New header: hb-ot-shape.h
-- Uniscribe: fix scratch-buffer accounting.
-- Reorder Tai Tham SAKOT to after tone-marks.
-- Add Hangul shaper.
-- New files:
-  hb-ot-shape-complex-hangul.cc
-  hb-ot-shape-complex-hebrew.cc
-  hb-ot-shape-complex-tibetan.cc
-- Disable 'cswh' feature in Arabic shaper.
-- Coretext: better handle surrogate pairs.
-- Add HB_TAG_MAX and _HB_SCRIPT_MAX_VALUE.
-
-
-Overview of changes leading to 0.9.25
-Wednesday, December 4, 2013
-=====================================
-
-- Myanmar shaper improvements.
-- Avoid font fallback in CoreText backend.
-- Additional OpenType language tag mappiongs.
-- More aggressive shape-plan caching.
-- Build with / require automake 1.13.
-- Build with libtool 2.4.2.418 alpha to support ppc64le.
-
-
-Overview of changes leading to 0.9.24
-Tuesday, November 13, 2013
-=====================================
-
-- Misc compiler warning fixes with clang.
-- No functional changes.
-
-
-Overview of changes leading to 0.9.23
-Monday, October 28, 2013
-=====================================
-
-- "Udupi HarfBuzz Hackfest", Paris, October 14..18 2013.
-- Fix (Chain)Context recursion with non-monotone lookup positions.
-- Misc Indic bug fixes.
-- New Javanese / Buginese shaping, similar to Windows 8.1.
-
-
-Overview of changes leading to 0.9.22
-Thursday, October 3, 2013
-=====================================
-
-- Fix use-after-end-of-scope in hb_language_from_string().
-- Fix hiding of default_ignorables if font doesn't have space glyph.
-- Protect against out-of-range lookup indices.
-
-- API Changes:
-
-  * Added hb_ot_layout_table_get_lookup_count()
-
-
-Overview of changes leading to 0.9.21
-Monday, September 16, 2013
-=====================================
-
-- Rename gobject-introspection library name from harfbuzz to HarfBuzz.
-- Remove (long disabled) hb-old and hb-icu-le test shapers.
-- Misc gtk-doc and gobject-introspection annotations.
-- Misc fixes.
-- API changes:
-
-  * Add HB_SET_VALUE_INVALID
-
-Overview of changes leading to 0.9.20
-Thursday, August 29, 2013
-=====================================
-
-General:
-- Misc substitute_closure() fixes.
-- Build fixes.
-
-Documentation:
-- gtk-doc boilerplate integrated.  Docs are built now, but
-  contain no contents.  By next release hopefully we have
-  some content in.  Enable using --enable-gtk-doc.
-
-GObject and Introspection:
-- Added harfbuzz-gobject library (hb-gobject.h) that has type
-  bindings for all HarfBuzz objects and enums.  Enable using
-  --with-gobject.
-- Added gobject-introspection boilerplate.  Nothing useful
-  right now.  Work in progress.  Gets enabled automatically if
-  --with-gobject is used.  Override with --disable-introspection.
-
-OpenType shaper:
-- Apply 'mark' in Myanmar shaper.
-- Don't apply 'dlig' by default.
-
-Uniscribe shaper:
-- Support user features.
-- Fix loading of fonts that are also installed on the system.
-- Fix shaping of Arabic Presentation Forms.
-- Fix build with wide chars.
-
-CoreText shaper:
-- Support user features.
-
-Source changes:
-- hb_face_t code moved to hb-face.h / hb-face.cc.
-- Added hb-deprecated.h.
-
-API changes:
-- Added HB_DISABLE_DEPRECATED.
-- Deprecated HB_SCRIPT_CANADIAN_ABORIGINAL; replaced by
-  HB_SCRIPT_CANADIAN_SYLLABICS.
-- Deprecated HB_BUFFER_FLAGS_DEFAULT; replaced by
-  HB_BUFFER_FLAG_DEFAULT.
-- Deprecated HB_BUFFER_SERIALIZE_FLAGS_DEFAULT; replaced by
-  HB_BUFFER_SERIALIZE_FLAG_DEFAULT.
-
-
-Overview of changes leading to 0.9.19
-Tuesday, July 16, 2013
-=====================================
-
-- Build fixes.
-- Better handling of multiple variation selectors in a row.
-- Pass on variation selector to GSUB if not consumed by cmap.
-- Fix undefined memory access.
-- Add Javanese config to Indic shaper.
-- Misc bug fixes.
-
-Overview of changes leading to 0.9.18
-Tuesday, May 28, 2013
-=====================================
-
-New build system:
-
-- All unneeded code is all disabled by default,
-
-- Uniscribe and CoreText shapers can be enabled with their --with options,
-
-- icu_le and old shapers cannot be enabled for now,
-
-- glib, freetype, and cairo will be detected automatically.
-  They can be force on/off'ed with their --with options,
-
-- icu and graphite2 are default off, can be enabled with their --with
-  options,
-
-Moreover, ICU support is now build into a separate library:
-libharfbuzz-icu.so, and a new harfbuzz-icu.pc is shipped for it.
-Distros can enable ICU now without every application on earth
-getting linked to via libharfbuzz.so.
-
-For distros I recommend that they make sure they are building --with-glib
---with-freetype --with-cairo, --with-icu, and optionally --with-graphite2;
-And package harfbuzz and harfbuzz-icu separately.
-
-
-Overview of changes leading to 0.9.17
-Monday, May 20, 2013
-=====================================
-
-- Build fixes.
-- Fix bug in hb_set_get_min().
-- Fix regression with Arabic mark positioning / width-zeroing.
-
-Overview of changes leading to 0.9.16
-Friday, April 19, 2013
-=====================================
-
-- Major speedup in OpenType lookup processing.  With the Amiri
-  Arabic font, this release is over 3x faster than previous
-  release.  All scripts / languages should see this speedup.
-
-- New --num-iterations option for hb-shape / hb-view; useful for
-  profiling.
-
-Overview of changes leading to 0.9.15
-Friday, April 05, 2013
-=====================================
-
-- Build fixes.
-- Fix crasher in graphite2 shaper.
-- Fix Arabic mark width zeroing regression.
-- Don't compose Hangul jamo into Unicode syllables.
-
-
-Overview of changes leading to 0.9.14
-Thursday, March 21, 2013
-=====================================
-
-- Build fixes.
-- Fix time-consuming sanitize with malicious fonts.
-- Implement hb_buffer_deserialize_glyphs() for both json and text.
-- Do not ignore Hangul filler characters.
-- Indic fixes:
-  * Fix Malayalam pre-base reordering interaction with post-forms.
-  * Further adjust ZWJ handling.  Should fix known regressions from
-    0.9.13.
-
-
-Overview of changes leading to 0.9.13
-Thursday, February 25, 2013
-=====================================
-
-- Build fixes.
-- Ngapi HarfBuzz Hackfest in London (February 2013):
-  * Fixed all known Indic bugs,
-  * New Win8-style Myanmar shaper,
-  * New South-East Asian shaper for Tai Tham, Cham, and New Tai Lue,
-  * Smartly ignore Default_Ignorable characters (joiners, etc) wheb
-    matching GSUB/GPOS lookups,
-  * Fix 'Phags-Pa U+A872 shaping,
-  * Fix partial disabling of default-on features,
-  * Allow disabling of TrueType kerning.
-- Fix possible crasher with broken fonts with overlapping tables.
-- Removed generated files from git again.  So, one needs ragel to
-  bootstrap from the git tree.
-
-API changes:
-- hb_shape() and related APIs now abort if buffer direction is
-  HB_DIRECTION_INVALID.  Previously, hb_shape() was calling
-  hb_buffer_guess_segment_properties() on the buffer before
-  shaping.  The heuristics in that function are fragile.  If the
-  user really wants the old behvaior, they can call that function
-  right before calling hb_shape() to get the old behavior.
-- hb_blob_create_sub_blob() always creates sub-blob with
-  HB_MEMORY_MODE_READONLY.  See comments for the reason.
-
-
-Overview of changes leading to 0.9.12
-Thursday, January 18, 2013
-=====================================
-
-- Build fixes for Sun compiler.
-- Minor bug fix.
-
-Overview of changes leading to 0.9.11
-Thursday, January 10, 2013
-=====================================
-
-- Build fixes.
-- Fix GPOS mark attachment with null Anchor offsets.
-- [Indic] Fix old-spec reordering of viramas if sequence ends in one.
-- Fix multi-threaded shaper data creation crash.
-- Add atomic ops for Solaris.
-
-API changes:
-- Rename hb_buffer_clear() to hb_buffer_clear_contents().
-
-
-Overview of changes leading to 0.9.10
-Thursday, January 3, 2013
-=====================================
-
-- [Indic] Fixed rendering of Malayalam dot-reph
-- Updated OT language tags.
-- Updated graphite2 backend.
-- Improved hb_ot_layout_get_size_params() logic.
-- Improve hb-shape/hb-view help output.
-- Fixed hb-set.h implementation to not crash.
-- Fixed various issues with hb_ot_layout_collect_lookups().
-- Various build fixes.
-
-New API:
-
-hb_graphite2_face_get_gr_face()
-hb_graphite2_font_get_gr_font()
-hb_coretext_face_get_cg_font()
-
-Modified API:
-
-hb_ot_layout_get_size_params()
-
-
-Overview of changes leading to 0.9.9
-Wednesday, December 5, 2012
-====================================
-
-- Fix build on Windows.
-- Minor improvements.
-
-
-Overview of changes leading to 0.9.8
-Tuesday, December 4, 2012
-====================================
-
-
-- Actually implement hb_shape_plan_get_shaper ().
-- Make UCDB data tables const.
-- Lots of internal refactoring in OTLayout tables.
-- Flesh out hb_ot_layout_lookup_collect_glyphs().
-
-New API:
-
-hb_ot_layout_collect_lookups()
-hb_ot_layout_get_size_params()
-
-
-Overview of changes leading to 0.9.7
-Sunday, November 21, 2012
-====================================
-
-
-HarfBuzz "All-You-Can-Eat-Sushi" (aka Vancouver) Hackfest and follow-on fixes.
-
-- Fix Arabic contextual joining using pre-context text.
-- Fix Sinhala "split matra" mess.
-- Fix Khmer shaping with broken fonts.
-- Implement Thai "PUA" shaping for old fonts.
-- Do NOT route Kharoshthi script through the Indic shaper.
-- Disable fallback positioning for Indic and Thai shapers.
-- Misc fixes.
-
-
-hb-shape / hb-view changes:
-
-- Add --text-before and --text-after
-- Add --bot / --eot / --preserve-default-ignorables
-- hb-shape --output-format=json
-
-
-New API:
-
-hb_buffer_clear()
-
-hb_buffer_flags_t
-
-HB_BUFFER_FLAGS_DEFAULT
-HB_BUFFER_FLAG_BOT
-HB_BUFFER_FLAG_EOT
-HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES
-
-hb_buffer_set_flags()
-hb_buffer_get_flags()
-
-HB_BUFFER_SERIALIZE_FLAGS
-hb_buffer_serialize_glyphs()
-hb_buffer_deserialize_glyphs()
-hb_buffer_serialize_list_formats()
-
-hb_set_add_range()
-hb_set_del_range()
-hb_set_get_population()
-hb_set_next_range()
-
-hb_face_[sg]et_glyph_count()
-
-hb_segment_properties_t
-HB_SEGMENT_PROPERTIES_DEFAULT
-hb_segment_properties_equal()
-hb_segment_properties_hash()
-
-hb_buffer_set_segment_properties()
-hb_buffer_get_segment_properties()
-
-hb_ot_layout_glyph_class_t
-hb_ot_layout_get_glyph_class()
-hb_ot_layout_get_glyphs_in_class()
-
-hb_shape_plan_t
-hb_shape_plan_create()
-hb_shape_plan_create_cached()
-hb_shape_plan_get_empty()
-hb_shape_plan_reference()
-hb_shape_plan_destroy()
-hb_shape_plan_set_user_data()
-hb_shape_plan_get_user_data()
-hb_shape_plan_execute()
-hb_shape_plan_get_shaper()
-
-hb_ot_shape_plan_collect_lookups()
-
-
-API changes:
-
-- Remove "mask" parameter from hb_buffer_add().
-- Rename hb_ot_layout_would_substitute_lookup() and hb_ot_layout_substitute_closure_lookup().
-- hb-set.h API const correction.
-- Renamed hb_set_min/max() to hb_set_get_min/max().
-- Rename hb_ot_layout_feature_get_lookup_indexes() to hb_ot_layout_feature_get_lookups().
-- Rename hb_buffer_guess_properties() to hb_buffer_guess_segment_properties().
-
-
-
-Overview of changes leading to 0.9.6
-Sunday, November 13, 2012
-====================================
-
-- Don't clear pre-context text if no new context is provided.
-- Fix ReverseChainingSubstLookup, which was totally borked.
-- Adjust output format of hb-shape a bit.
-- Include config.h.in in-tree.  Makes it easier for alternate build systems.
-- Fix hb_buffer_set_length(buffer, 0) invalid memory allocation.
-- Use ICU LayoutEngine's C API instead of C++.  Avoids much headache.
-- Drop glyphs for all of Unicode Default_Ignorable characters.
-- Misc build fixes.
-
-Arabic shaper:
-- Enable 'dlig' and 'mset' features in Arabic shaper.
-- Implement 'Phags-pa shaping, improve Mongolian.
-
-Indic shaper:
-- Decompose Sinhala split matras the way old HarfBuzz / Pango did.
-- Initial support for Consonant Medials.
-- Start adding new-style Myanmar shaping.
-- Make reph and 'pref' logic introspect the font.
-- Route Meetei-Mayek through the Indic shaper.
-- Don't apply 'liga' in Indic shaper.
-- Improve Malayalam pre-base reordering Ra interaction with Chillus.
-
-
-
-Overview of changes leading to 0.9.5
-Sunday, October 14, 2012
-====================================
-
-- Synthetic-GSUB Arabic fallback shaping.
-
-- Misc Indic improvements.
-
-- Add build system support for pthread.
-
-- Imported UCDN for in-tree Unicode callbacks implementation.
-
-- Context-aware Arabic joining.
-
-- Misc other fixes.
-
-- New API:
-
-  hb_feature_to/from-string()
-  hb_buffer_[sg]et_content_type()
-
-
-
-Overview of changes leading to 0.9.4
-Tuesday, Sep 03, 2012
-====================================
-
-- Indic improvements with old-spec Malayalam.
-
-- Better fallback glyph positioning, specially with Thai / Lao marks.
-
-- Implement dotted-circle insertion.
-
-- Better Arabic fallback shaping / ligation.
-
-- Added ICU LayoutEngine backend for testing.  Call it by the 'icu_le' name.
-
-- Misc fixes.
-
-
-
-Overview of changes leading to 0.9.3
-Friday, Aug 18, 2012
-====================================
-
-- Fixed fallback mark positioning for left-to-right text.
-
-- Improve mark positioning for the remaining combining classes.
-
-- Unbreak Thai and fallback Arabic shaping.
-
-- Port Arabic shaper to shape-plan caching.
-
-- Use new ICU normalizer functions.
-
-
-
-Overview of changes leading to 0.9.2
-Friday, Aug 10, 2012
-====================================
-
-- Over a thousand commits!  This is the first major release of HarfBuzz.
-
-- HarfBuzz is feature-complete now!  It should be in par, or better, than
-  both Pango's shapers and old HarfBuzz / Qt shapers.
-
-- New Indic shaper, supporting main Indic scripts, Sinhala, and Khmer.
-
-- Improved Arabic shaper, with fallback Arabic shaping, supporting Arabic,
-  Sinhala, N'ko, Mongolian, and Mandaic.
-
-- New Thai / Lao shaper.
-
-- Tibetan / Hangul support in the generic shaper.
-
-- Synthetic GDEF support for fonts without a GDEF table.
-
-- Fallback mark positioning for fonts without a GPOS table.
-
-- Unicode normalization shaping heuristic during glyph mapping.
-
-- New experimental Graphite2 backend.
-
-- New Uniscribe backend (primarily for testing).
-
-- New CoreText backend (primarily for testing).
-
-- Major optimization and speedup.
-
-- Test suites and testing infrastructure (work in progress).
-
-- Greatly improved hb-view cmdline tool.
-
-- hb-shape cmdline tool.
-
-- Unicode 6.1 support.
-
-Summary of API changes:
-
-o Changed API:
-
-  - Users are expected to only include main header files now (ie. hb.h,
-    hb-glib.h, hb-ft.h, ...)
-
-  - All struct tag names had their initial underscore removed.
-    Ie. "struct _hb_buffer_t" is "struct hb_buffer_t" now.
-
-  - All set_user_data() functions now take a "replace" boolean parameter.
-
-  - hb_buffer_create() takes zero arguments now.
-    Use hb_buffer_pre_allocate() to pre-allocate.
-
-  - hb_buffer_add_utf*() now accept -1 for length parameters,
-    meaning "nul-terminated".
-
-  - hb_direction_t enum values changed.
-
-  - All *_from_string() APIs now take a length parameter to allow for
-    non-nul-terminated strings. A -1 length means "nul-terminated".
-
-  - Typedef for hb_language_t changed.
-
-  - hb_get_table_func_t renamed to hb_reference_table_func_t.
-
-  - hb_ot_layout_table_choose_script()
-
-  - Various renames in hb-unicode.h.
-
-o New API:
-
-  - hb_buffer_guess_properties()
-    Automatically called by hb_shape().
-
-  - hb_buffer_normalize_glyphs()
-
-  - hb_tag_from_string()
-
-  - hb-coretext.h
-
-  - hb-uniscribe.h
-
-  - hb_face_reference_blob()
-  - hb_face_[sg]et_index()
-  - hb_face_set_upem()
-
-  - hb_font_get_glyph_name_func_t
-    hb_font_get_glyph_from_name_func_t
-    hb_font_funcs_set_glyph_name_func()
-    hb_font_funcs_set_glyph_from_name_func()
-    hb_font_get_glyph_name()
-    hb_font_get_glyph_from_name()
-    hb_font_glyph_to_string()
-    hb_font_glyph_from_string()
-
-  - hb_font_set_funcs_data()
-
-  - hb_ft_font_set_funcs()
-  - hb_ft_font_get_face()
-
-  - hb-gobject.h (work in progress)
-
-  - hb_ot_shape_glyphs_closure()
-    hb_ot_layout_substitute_closure_lookup()
-
-  - hb-set.h
-
-  - hb_shape_full()
-
-  - hb_unicode_combining_class_t
-
-  - hb_unicode_compose_func_t
-    hb_unicode_decompose_func_t
-    hb_unicode_decompose_compatibility_func_t
-    hb_unicode_funcs_set_compose_func()
-    hb_unicode_funcs_set_decompose_func()
-    hb_unicode_funcs_set_decompose_compatibility_func()
-    hb_unicode_compose()
-    hb_unicode_decompose()
-    hb_unicode_decompose_compatibility()
-
-o Removed API:
-
-  - hb_ft_get_font_funcs()
-
-  - hb_ot_layout_substitute_start()
-    hb_ot_layout_substitute_lookup()
-    hb_ot_layout_substitute_finish()
-    hb_ot_layout_position_start()
-    hb_ot_layout_position_lookup()
-    hb_ot_layout_position_finish()
-
-
-
-Overview of changes leading to 0.6.0
-Friday, May 27, 2011
-====================================
-
-- Vertical text support in GPOS
-- Almost all API entries have unit tests now, under test/
-- All thread-safety issues are fixed
-
-Summary of API changes follows.
-
-
-* Simple Types API:
-
-  o New API:
-    HB_LANGUAGE_INVALID
-    hb_language_get_default()
-    hb_direction_to_string()
-    hb_direction_from_string()
-    hb_script_get_horizontal_direction()
-    HB_UNTAG()
-
-  o Renamed API:
-    hb_category_t renamed to hb_unicode_general_category_t
-
-  o Changed API:
-    hb_language_t is a typed pointers now
-
-  o Removed API:
-    HB_TAG_STR()
-
-
-* Use ISO 15924 tags for hb_script_t:
-
-  o New API:
-    hb_script_from_iso15924_tag()
-    hb_script_to_iso15924_tag()
-    hb_script_from_string()
-
-  o Changed API:
-    HB_SCRIPT_* enum members changed value.
-
-
-* Buffer API streamlined:
-
-  o New API:
-    hb_buffer_reset()
-    hb_buffer_set_length()
-    hb_buffer_allocation_successful()
-
-  o Renamed API:
-    hb_buffer_ensure() renamed to hb_buffer_pre_allocate()
-    hb_buffer_add_glyph() renamed to hb_buffer_add()
-
-  o Removed API:
-    hb_buffer_clear()
-    hb_buffer_clear_positions()
-
-  o Changed API:
-    hb_buffer_get_glyph_infos() takes an out length parameter now
-    hb_buffer_get_glyph_positions() takes an out length parameter now
-
-
-* Blob API streamlined:
-
-  o New API:
-    hb_blob_get_data()
-    hb_blob_get_data_writable()
-
-  o Renamed API:
-    hb_blob_create_empty() renamed to hb_blob_get_empty()
-
-  o Removed API:
-    hb_blob_lock()
-    hb_blob_unlock()
-    hb_blob_is_writable()
-    hb_blob_try_writable()
-
-  o Changed API:
-    hb_blob_create() takes user_data before destroy now
-
-
-* Unicode functions API:
-
-  o Unicode function vectors can subclass other unicode function vectors now.
-    Unimplemented callbacks in the subclass automatically chainup to the parent.
-
-  o All hb_unicode_funcs_t callbacks take a user_data now.  Their setters
-    take a user_data and its respective destroy callback.
-
-  o New API:
-    hb_unicode_funcs_get_empty()
-    hb_unicode_funcs_get_default()
-    hb_unicode_funcs_get_parent()
-
-  o Changed API:
-    hb_unicode_funcs_create() now takes a parent_funcs.
-
-  o Removed func getter functions:
-    hb_unicode_funcs_get_mirroring_func()
-    hb_unicode_funcs_get_general_category_func()
-    hb_unicode_funcs_get_script_func()
-    hb_unicode_funcs_get_combining_class_func()
-    hb_unicode_funcs_get_eastasian_width_func()
-
-
-* Face API:
-
-  o Renamed API:
-    hb_face_get_table() renamed to hb_face_reference_table()
-    hb_face_create_for_data() renamed to hb_face_create()
-
-  o Changed API:
-    hb_face_create_for_tables() takes user_data before destroy now
-    hb_face_reference_table() returns empty blob instead of NULL
-    hb_get_table_func_t accepts the face as first parameter now
-
-* Font API:
-
-  o Fonts can subclass other fonts now.  Unimplemented callbacks in the
-    subclass automatically chainup to the parent.  When chaining up,
-    scale is adjusted if the parent font has a different scale.
-
-  o All hb_font_funcs_t callbacks take a user_data now.  Their setters
-    take a user_data and its respective destroy callback.
-
-  o New API:
-    hb_font_get_parent()
-    hb_font_funcs_get_empty()
-    hb_font_create_sub_font()
-
-  o Removed API:
-    hb_font_funcs_copy()
-    hb_font_unset_funcs()
-
-  o Removed func getter functions:
-    hb_font_funcs_get_glyph_func()
-    hb_font_funcs_get_glyph_advance_func()
-    hb_font_funcs_get_glyph_extents_func()
-    hb_font_funcs_get_contour_point_func()
-    hb_font_funcs_get_kerning_func()
-
-  o Changed API:
-    hb_font_create() takes a face and references it now
-    hb_font_set_funcs() takes user_data before destroy now
-    hb_font_set_scale() accepts signed integers now
-    hb_font_get_contour_point_func_t now takes glyph first, then point_index
-    hb_font_get_glyph_func_t returns a success boolean now
-
-
-* Changed object model:
-
-  o All object types have a _get_empty() now:
-    hb_blob_get_empty()
-    hb_buffer_get_empty()
-    hb_face_get_empty()
-    hb_font_get_empty()
-    hb_font_funcs_get_empty()
-    hb_unicode_funcs_get_empty()
-
-  o Added _set_user_data() and _get_user_data() for all object types:
-    hb_blob_get_user_data()
-    hb_blob_set_user_data()
-    hb_buffer_get_user_data()
-    hb_buffer_set_user_data()
-    hb_face_get_user_data()
-    hb_face_set_user_data()
-    hb_font_funcs_get_user_data()
-    hb_font_funcs_set_user_data()
-    hb_font_get_user_data()
-    hb_font_set_user_data()
-    hb_unicode_funcs_get_user_data()
-    hb_unicode_funcs_set_user_data()
-
-  o Removed the _get_reference_count() from all object types:
-    hb_blob_get_reference_count()
-    hb_buffer_get_reference_count()
-    hb_face_get_reference_count()
-    hb_font_funcs_get_reference_count()
-    hb_font_get_reference_count()
-    hb_unicode_funcs_get_reference_count()
-
-  o Added _make_immutable() and _is_immutable() for all object types except for buffer:
-    hb_blob_make_immutable()
-    hb_blob_is_immutable()
-    hb_face_make_immutable()
-    hb_face_is_immutable()
-
-
-* Changed API for vertical text support
-
-  o The following callbacks where removed:
-    hb_font_get_glyph_advance_func_t
-    hb_font_get_kerning_func_t
-
-  o The following new callbacks added instead:
-    hb_font_get_glyph_h_advance_func_t
-    hb_font_get_glyph_v_advance_func_t
-    hb_font_get_glyph_h_origin_func_t
-    hb_font_get_glyph_v_origin_func_t
-    hb_font_get_glyph_h_kerning_func_t
-    hb_font_get_glyph_v_kerning_func_t
-
-  o The following API removed as such:
-    hb_font_funcs_set_glyph_advance_func()
-    hb_font_funcs_set_kerning_func()
-    hb_font_get_glyph_advance()
-    hb_font_get_kerning()
-
-  o New API added instead:
-    hb_font_funcs_set_glyph_h_advance_func()
-    hb_font_funcs_set_glyph_v_advance_func()
-    hb_font_funcs_set_glyph_h_origin_func()
-    hb_font_funcs_set_glyph_v_origin_func()
-    hb_font_funcs_set_glyph_h_kerning_func()
-    hb_font_funcs_set_glyph_v_kerning_func()
-    hb_font_get_glyph_h_advance()
-    hb_font_get_glyph_v_advance()
-    hb_font_get_glyph_h_origin()
-    hb_font_get_glyph_v_origin()
-    hb_font_get_glyph_h_kerning()
-    hb_font_get_glyph_v_kerning()
-
-  o The following higher-leve API added for convenience:
-    hb_font_get_glyph_advance_for_direction()
-    hb_font_get_glyph_origin_for_direction()
-    hb_font_add_glyph_origin_for_direction()
-    hb_font_subtract_glyph_origin_for_direction()
-    hb_font_get_glyph_kerning_for_direction()
-    hb_font_get_glyph_extents_for_origin()
-    hb_font_get_glyph_contour_point_for_origin()
-
-
-* OpenType Layout API:
-
-  o New API:
-    hb_ot_layout_position_start()
-    hb_ot_layout_substitute_start()
-    hb_ot_layout_substitute_finish()
-
-
-* Glue code:
-
-  o New API:
-    hb_glib_script_to_script()
-    hb_glib_script_from_script()
-    hb_icu_script_to_script()
-    hb_icu_script_from_script()
-
-
-* Version API added:
-
-  o New API:
-    HB_VERSION_MAJOR
-    HB_VERSION_MINOR
-    HB_VERSION_MICRO
-    HB_VERSION_STRING
-    HB_VERSION_CHECK()
-    hb_version()
-    hb_version_string()
-    hb_version_check()
-
-
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/README 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/README
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/README	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/README	1970-01-01 00:00:00.000000000 +0000
@@ -1,15 +0,0 @@
-[![Build Status](https://travis-ci.org/harfbuzz/harfbuzz.svg)](https://travis-ci.org/harfbuzz/harfbuzz)
-[![Build status](https://ci.appveyor.com/api/projects/status/0t0flrxpstj9lb9w?svg=true)](https://ci.appveyor.com/project/harfbuzz/harfbuzz)
-[![CircleCI](https://circleci.com/gh/harfbuzz/harfbuzz.svg?style=svg)](https://circleci.com/gh/harfbuzz/harfbuzz)
-[![Coverage Status](https://img.shields.io/coveralls/harfbuzz/harfbuzz.svg)](https://coveralls.io/r/harfbuzz/harfbuzz)
-[ABI Tracker](http://abi-laboratory.pro/tracker/timeline/harfbuzz/)
-
-This is HarfBuzz, a text shaping library.
-
-For bug reports, mailing list, and other information please visit:
-
-  http://harfbuzz.org/
-
-For license information, see the file COPYING.
-
-Documentation: https://harfbuzz.github.io
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/README.md 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/README.md
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/README.md	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/README.md	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,104 @@
+[![Linux CI Status](https://github.com/harfbuzz/harfbuzz/workflows/linux-ci/badge.svg)](https://github.com/harfbuzz/harfbuzz/workflows/linux-ci/badge.svg)
+[![CircleCI Build Status](https://circleci.com/gh/harfbuzz/harfbuzz/tree/main.svg?style=svg)](https://circleci.com/gh/harfbuzz/harfbuzz/tree/main)
+[![OSS-Fuzz Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/harfbuzz.svg)](https://oss-fuzz-build-logs.storage.googleapis.com/index.html)
+[![Coverity Scan Build Status](https://scan.coverity.com/projects/15166/badge.svg)](https://scan.coverity.com/projects/harfbuzz)
+[![Codacy Badge](https://app.codacy.com/project/badge/Grade/89c872f5ce1c42af802602bfcd15d90a)](https://app.codacy.com/gh/harfbuzz/harfbuzz/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
+[![Codecov Code Coverage](https://codecov.io/gh/harfbuzz/harfbuzz/branch/main/graph/badge.svg)](https://codecov.io/gh/harfbuzz/harfbuzz)
+[![Packaging status](https://repology.org/badge/tiny-repos/harfbuzz.svg)](https://repology.org/project/harfbuzz/versions)
+[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/harfbuzz/harfbuzz/badge)](https://securityscorecards.dev/viewer/?uri=github.com/harfbuzz/harfbuzz)
+
+
+# HarfBuzz
+
+HarfBuzz is a text shaping engine. It primarily supports [OpenType][1], but also
+[Apple Advanced Typography][2]. HarfBuzz is used in Android, Chrome,
+ChromeOS, Firefox, GNOME, GTK+, KDE, Qt, LibreOffice, OpenJDK, XeTeX,
+PlayStation, Microsoft Edge, Adobe Photoshop, Illustrator, InDesign,
+Godot Engine, and other places.
+
+[![xkcd-derived image](xkcd.png)](https://xkcd.com/2347/)
+
+For bug reports, mailing list, and other information please visit:
+
+  http://harfbuzz.org/
+
+For license information, see [COPYING](COPYING).
+
+## Documentation
+
+For user manual as well as API documentation, check: https://harfbuzz.github.io
+
+## Download
+
+For tarball releases of HarfBuzz, look [here][3]. At the same place you
+will also find Win32/Win64 binary bundles that include `libharfbuzz` DLL,
+`hb-view.exe`, `hb-shape.exe`, and all dependencies.
+
+The canonical source tree is available on [github][4].
+
+The API that comes with `hb.h` will not change incompatibly. Other, peripheral,
+headers are more likely to go through minor modifications, but again, we do our
+best to never change API in an incompatible way. We will never break the ABI.
+
+If you are not sure whether Pango or HarfBuzz is right for you, read [Pango vs
+HarfBuzz][5].
+
+## Development
+
+For build information, see [BUILD.md](BUILD.md).
+
+For custom configurations, see [CONFIG.md](CONFIG.md).
+
+For testing and profiling, see [TESTING.md](TESTING.md).
+
+To get a better idea of where HarfBuzz stands in the text rendering stack you
+may want to read [State of Text Rendering][6], though, that document is many
+years old. Here are a few presentation slides about HarfBuzz at the
+Internationalization and Unicode Conference over the years:
+
+*   November 2014, [Unicode, OpenType, and HarfBuzz: Closing the Circle][7],
+*   October 2012, [HarfBuzz, The Free and Open Text Shaping Engine][8],
+*   October 2009, [HarfBuzz: the Free and Open Shaping Engine][9].
+
+Both development and user support discussion around HarfBuzz happens on the
+[github][4].
+
+To report bugs or submit patches please use [github][4] issues and
+pull-requests.
+
+For a comparison of old vs new HarfBuzz memory consumption see [this][10].
+
+<!--See past and upcoming [HarfBuzz Hackfests](https://freedesktop.org/wiki/Software/HarfBuzz/Hackfests/)!-->
+
+## Name
+
+HarfBuzz (حرف‌باز) is the literal Persian translation of “[OpenType][1]”,
+transliterated using the Latin script. It also means "talkative" or
+"glib" (also a nod to the GNOME project where HarfBuzz originates from).
+
+> Background: Originally there was this font format called TrueType. People and
+> companies started calling their type engines all things ending in Type:
+> FreeType, CoolType, ClearType, etc. And then came OpenType, which is the
+> successor of TrueType. So, for my OpenType implementation, I decided to stick
+> with the concept but use the Persian translation. Which is fitting given that
+> Persian is written in the Arabic script, and OpenType is an extension of
+> TrueType that adds support for complex script rendering, and HarfBuzz is an
+> implementation of OpenType complex text shaping.
+
+<details>
+  <summary>Packaging status of HarfBuzz</summary>
+
+[![Packaging status](https://repology.org/badge/vertical-allrepos/harfbuzz.svg?header=harfbuzz)](https://repology.org/project/harfbuzz/versions)
+
+</details>
+
+[1]: https://docs.microsoft.com/en-us/typography/opentype/spec/
+[2]: https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6AATIntro.html
+[3]: https://github.com/harfbuzz/harfbuzz/releases
+[4]: https://github.com/harfbuzz/harfbuzz
+[5]: http://mces.blogspot.com/2009/11/pango-vs-harfbuzz.html
+[6]: http://behdad.org/text/
+[7]: https://goo.gl/FSIQuC
+[8]: https://goo.gl/2wSRu
+[9]: http://behdad.org/download/Presentations/slippy/harfbuzz_slides.pdf
+[10]: https://goo.gl/woyty
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro	2024-11-20 13:56:33.000000000 +0000
@@ -26,6 +26,7 @@ DEFINES += HB_EXTERN=
 DEFINES += HAVE_ATEXIT
 unix: DEFINES += HAVE_PTHREAD HAVE_SCHED_H HAVE_SCHED_YIELD
 win32: DEFINES += HB_NO_WIN1256
+msvc:winrt: QMAKE_CXXFLAGS += /bigobj    # prevent error C1128
 
 #Workaround https://code.google.com/p/android/issues/detail?id=194631
 android: DEFINES += _POSIX_C_SOURCE=200112L
@@ -62,6 +63,7 @@ SOURCES += \
     $$PWD/src/hb-subset-cff1.cc \
     $$PWD/src/hb-subset-cff2.cc \
     $$PWD/src/hb-subset-input.cc \
+    $$PWD/src/hb-subset-instancer-iup.cc \
     $$PWD/src/hb-subset-instancer-solver.cc \
     $$PWD/src/hb-subset-plan.cc \
     $$PWD/src/hb-subset-repacker.cc \
@@ -91,6 +93,8 @@ HEADERS += \
     $$PWD/src/hb-shaper-impl.hh \
     $$PWD/src/hb-shaper-list.hh \
     $$PWD/src/hb-string-array.hh \
+    $$PWD/src/hb-subset-instancer-iup.hh \
+    $$PWD/src/hb-subset-plan-member-list.hh \
     $$PWD/src/hb-subset-repacker.h \
     $$PWD/src/hb-unicode.hh
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/import_from_tarball.sh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/import_from_tarball.sh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/import_from_tarball.sh	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/import_from_tarball.sh	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,92 @@
+#! /bin/sh
+
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is the build configuration utility of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:LGPL$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU Lesser General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU Lesser
+## General Public License version 3 as published by the Free Software
+## Foundation and appearing in the file LICENSE.LGPL3 included in the
+## packaging of this file. Please review the following information to
+## ensure the GNU Lesser General Public License version 3 requirements
+## will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 2.0 or (at your option) the GNU General
+## Public license version 3 or any later version approved by the KDE Free
+## Qt Foundation. The licenses are as published by the Free Software
+## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-2.0.html and
+## https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+# This is a small script to copy the required files from a harfbuzz tarball
+# into 3rdparty/harfbuzz-ng/ . Documentation, tests, demos etc. are not imported.
+# Steps:
+# 1. rm $QTDIR/src/3rdparty/harfbuzz-ng/src/*
+# 2. source import_from_tarball.sh harfbuzz_tarball_dir/ $QTDIR/src/3rdparty/harfbuzz-ng/
+# 3. Check that CMakeLists contains everything
+
+if [ $# -ne 2 ]; then
+    echo "Usage: $0 harfbuzz_tarball_dir/ \$QTDIR/src/3rdparty/harfbuzz-ng/"
+    exit 1
+fi
+
+HB_DIR=$1
+TARGET_DIR=$2
+
+if [ ! -d "$HB_DIR" -o ! -r "$HB_DIR" -o ! -d "$TARGET_DIR" -o ! -w "$TARGET_DIR" ]; then
+    echo "Either the harfbuzz source dir or the target dir do not exist,"
+    echo "are not directories or have the wrong permissions."
+    exit 2
+fi
+
+# with 1 argument, copies HB_DIR/$1 to TARGET_DIR/$1
+# with 2 arguments, copies HB_DIR/$1 to TARGET_DIR/$2
+copy_file_or_dir() {
+    if [ $# -lt 1 -o $# -gt 2  ]; then
+        echo "Wrong number of arguments to copy_file_or_dir"
+        exit 3
+    fi
+
+    SOURCE_FILE=$1
+    if [ -n "$2" ]; then
+        DEST_FILE=$2
+    else
+        DEST_FILE=$1
+    fi
+
+    mkdir -p "$TARGET_DIR/$(dirname "$SOURCE_FILE")"
+    cp -R "$HB_DIR/$SOURCE_FILE" "$TARGET_DIR/$DEST_FILE"
+}
+
+FILES=(AUTHORS
+       COPYING
+       README.md
+       THANKS
+       )
+
+for i in ${FILES[*]}; do
+    copy_file_or_dir "$i"
+done
+
+cp -R $HB_DIR/src $TARGET_DIR
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/qt_attribution.json 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/qt_attribution.json
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/qt_attribution.json	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/qt_attribution.json	2024-11-20 13:56:33.000000000 +0000
@@ -7,9 +7,7 @@
 
     "Description": "HarfBuzz is an OpenType text shaping engine.",
     "Homepage": "http://harfbuzz.org",
-    "Version": "7.2.0",
-    "DownloadLocation": "https://github.com/harfbuzz/harfbuzz/releases/tag/7.1.0",
-
+    "Version": "8.4.0",
     "License": "MIT License",
     "LicenseId": "MIT",
     "LicenseFile": "COPYING",
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Color/CBDT/CBDT.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Color/CBDT/CBDT.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Color/CBDT/CBDT.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Color/CBDT/CBDT.hh	2024-11-20 13:56:33.000000000 +0000
@@ -204,6 +204,7 @@ struct IndexSubtable
   {
     TRACE_SANITIZE (this);
     if (!u.header.sanitize (c)) return_trace (false);
+    hb_barrier ();
     switch (u.header.indexFormat)
     {
     case 1: return_trace (u.format1.sanitize (c, glyph_count));
@@ -378,6 +379,7 @@ struct IndexSubtableRecord
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  firstGlyphIndex <= lastGlyphIndex &&
 		  offsetToSubtable.sanitize (c, base, lastGlyphIndex - firstGlyphIndex + 1));
   }
@@ -397,7 +399,6 @@ struct IndexSubtableRecord
     TRACE_SERIALIZE (this);
 
     auto *subtable = c->serializer->start_embed<IndexSubtable> ();
-    if (unlikely (!subtable)) return_trace (false);
     if (unlikely (!c->serializer->extend_min (subtable))) return_trace (false);
 
     auto *old_subtable = get_subtable (base);
@@ -545,7 +546,8 @@ struct IndexSubtableArray
 		const IndexSubtableRecord*>> *lookup /* OUT */) const
   {
     bool start_glyph_is_set = false;
-    for (hb_codepoint_t new_gid = 0; new_gid < c->plan->num_output_glyphs (); new_gid++)
+    unsigned num_glyphs = c->plan->num_output_glyphs ();
+    for (hb_codepoint_t new_gid = 0; new_gid < num_glyphs; new_gid++)
     {
       hb_codepoint_t old_gid;
       if (unlikely (!c->plan->old_gid_for_new_gid (new_gid, &old_gid))) continue;
@@ -576,9 +578,6 @@ struct IndexSubtableArray
   {
     TRACE_SUBSET (this);
 
-    auto *dst = c->serializer->start_embed<IndexSubtableArray> ();
-    if (unlikely (!dst)) return_trace (false);
-
     hb_vector_t<hb_pair_t<hb_codepoint_t, const IndexSubtableRecord*>> lookup;
     build_lookup (c, bitmap_size_context, &lookup);
     if (unlikely (!c->serializer->propagate_error (lookup)))
@@ -638,6 +637,7 @@ struct BitmapSizeTable
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  indexSubtableArrayOffset.sanitize (c, base, numberOfIndexSubtables) &&
 		  horizontal.sanitize (c) &&
 		  vertical.sanitize (c));
@@ -741,7 +741,9 @@ struct CBLC
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  likely (version.major == 2 || version.major == 3) &&
+		  hb_barrier () &&
 		  sizeTables.sanitize (c, this));
   }
 
@@ -978,6 +980,7 @@ struct CBDT
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  likely (version.major == 2 || version.major == 3));
   }
 
@@ -993,12 +996,10 @@ CBLC::subset (hb_subset_context_t *c) co
 {
   TRACE_SUBSET (this);
 
-  auto *cblc_prime = c->serializer->start_embed<CBLC> ();
-
   // Use a vector as a secondary buffer as the tables need to be built in parallel.
   hb_vector_t<char> cbdt_prime;
 
-  if (unlikely (!cblc_prime)) return_trace (false);
+  auto *cblc_prime = c->serializer->start_embed<CBLC> ();
   if (unlikely (!c->serializer->extend_min (cblc_prime))) return_trace (false);
   cblc_prime->version = version;
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Color/COLR/COLR.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Color/COLR/COLR.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Color/COLR/COLR.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Color/COLR/COLR.hh	2024-11-20 13:56:33.000000000 +0000
@@ -53,6 +53,7 @@ struct Paint;
 struct hb_paint_context_t :
        hb_dispatch_context_t<hb_paint_context_t>
 {
+  const char *get_name () { return "PAINT"; }
   template <typename T>
   return_t dispatch (const T &obj) { obj.paint_glyph (this); return hb_empty_t (); }
   static return_t default_return_value () { return hb_empty_t (); }
@@ -67,7 +68,9 @@ public:
   hb_font_t *font;
   unsigned int palette_index;
   hb_color_t foreground;
-  VarStoreInstancer &instancer;
+  ItemVarStoreInstancer &instancer;
+  hb_map_t current_glyphs;
+  hb_map_t current_layers;
   int depth_left = HB_MAX_NESTING_LEVEL;
   int edge_count = HB_COLRV1_MAX_EDGE_COUNT;
 
@@ -77,7 +80,7 @@ public:
                       hb_font_t *font_,
                       unsigned int palette_,
                       hb_color_t foreground_,
-		      VarStoreInstancer &instancer_) :
+		      ItemVarStoreInstancer &instancer_) :
     base (base_),
     funcs (funcs_),
     data (data_),
@@ -242,7 +245,7 @@ struct Variable
   { value.closurev1 (c); }
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer) const
+               const ItemVarStoreInstancer &instancer) const
   {
     TRACE_SUBSET (this);
     if (!value.subset (c, instancer, varIdxBase)) return_trace (false);
@@ -261,12 +264,13 @@ struct Variable
 
   void paint_glyph (hb_paint_context_t *c) const
   {
+    TRACE_PAINT (this);
     value.paint_glyph (c, varIdxBase);
   }
 
   void get_color_stop (hb_paint_context_t *c,
                        hb_color_stop_t *stop,
-		       const VarStoreInstancer &instancer) const
+		       const ItemVarStoreInstancer &instancer) const
   {
     value.get_color_stop (c, stop, varIdxBase, instancer);
   }
@@ -281,7 +285,7 @@ struct Variable
   public:
   VarIdx varIdxBase;
   public:
-  DEFINE_SIZE_STATIC (4 + T::static_size);
+  DEFINE_SIZE_MIN (VarIdx::static_size + T::min_size);
 };
 
 template <typename T>
@@ -301,7 +305,7 @@ struct NoVariable
   { value.closurev1 (c); }
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer) const
+               const ItemVarStoreInstancer &instancer) const
   {
     TRACE_SUBSET (this);
     return_trace (value.subset (c, instancer, varIdxBase));
@@ -315,12 +319,13 @@ struct NoVariable
 
   void paint_glyph (hb_paint_context_t *c) const
   {
+    TRACE_PAINT (this);
     value.paint_glyph (c, varIdxBase);
   }
 
   void get_color_stop (hb_paint_context_t *c,
                        hb_color_stop_t *stop,
-		       const VarStoreInstancer &instancer) const
+		       const ItemVarStoreInstancer &instancer) const
   {
     value.get_color_stop (c, stop, VarIdx::NO_VARIATION, instancer);
   }
@@ -332,7 +337,7 @@ struct NoVariable
 
   T      value;
   public:
-  DEFINE_SIZE_STATIC (T::static_size);
+  DEFINE_SIZE_MIN (T::min_size);
 };
 
 // Color structures
@@ -343,7 +348,7 @@ struct ColorStop
   { c->add_palette_index (paletteIndex); }
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -369,7 +374,7 @@ struct ColorStop
   void get_color_stop (hb_paint_context_t *c,
                        hb_color_stop_t *out,
 		       uint32_t varIdx,
-		       const VarStoreInstancer &instancer) const
+		       const ItemVarStoreInstancer &instancer) const
   {
     out->offset = stopOffset.to_float(instancer (varIdx, 0));
     out->color = c->get_color (paletteIndex,
@@ -405,11 +410,10 @@ struct ColorLine
   }
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer) const
+               const ItemVarStoreInstancer &instancer) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (this);
-    if (unlikely (!out)) return_trace (false);
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
     if (!c->serializer->check_assign (out->extend, extend, HB_SERIALIZE_ERROR_INT_OVERFLOW)) return_trace (false);
@@ -435,7 +439,7 @@ struct ColorLine
                    unsigned int start,
 		   unsigned int *count,
 		   hb_color_stop_t *color_stops,
-		   const VarStoreInstancer &instancer) const
+		   const ItemVarStoreInstancer &instancer) const
   {
     unsigned int len = stops.len;
 
@@ -539,7 +543,7 @@ struct Affine2x3
   }
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -559,6 +563,7 @@ struct Affine2x3
 
   void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const
   {
+    TRACE_PAINT (this);
     c->funcs->push_transform (c->data,
 			      xx.to_float (c->instancer (varIdxBase, 0)),
 			      yx.to_float (c->instancer (varIdxBase, 1)),
@@ -583,7 +588,7 @@ struct PaintColrLayers
   void closurev1 (hb_colrv1_closure_context_t* c) const;
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer HB_UNUSED) const
+               const ItemVarStoreInstancer &instancer HB_UNUSED) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->embed (this);
@@ -615,7 +620,7 @@ struct PaintSolid
   { c->add_palette_index (paletteIndex); }
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -640,6 +645,7 @@ struct PaintSolid
 
   void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const
   {
+    TRACE_PAINT (this);
     hb_bool_t is_foreground;
     hb_color_t color;
 
@@ -663,7 +669,7 @@ struct PaintLinearGradient
   { (this+colorLine).closurev1 (c); }
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -694,6 +700,7 @@ struct PaintLinearGradient
 
   void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const
   {
+    TRACE_PAINT (this);
     hb_color_line_t cl = {
       (void *) &(this+colorLine),
       (this+colorLine).static_get_color_stops, c,
@@ -729,7 +736,7 @@ struct PaintRadialGradient
   { (this+colorLine).closurev1 (c); }
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -760,6 +767,7 @@ struct PaintRadialGradient
 
   void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const
   {
+    TRACE_PAINT (this);
     hb_color_line_t cl = {
       (void *) &(this+colorLine),
       (this+colorLine).static_get_color_stops, c,
@@ -795,7 +803,7 @@ struct PaintSweepGradient
   { (this+colorLine).closurev1 (c); }
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -824,6 +832,7 @@ struct PaintSweepGradient
 
   void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const
   {
+    TRACE_PAINT (this);
     hb_color_line_t cl = {
       (void *) &(this+colorLine),
       (this+colorLine).static_get_color_stops, c,
@@ -854,7 +863,7 @@ struct PaintGlyph
   void closurev1 (hb_colrv1_closure_context_t* c) const;
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer) const
+               const ItemVarStoreInstancer &instancer) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->embed (this);
@@ -875,6 +884,7 @@ struct PaintGlyph
 
   void paint_glyph (hb_paint_context_t *c) const
   {
+    TRACE_PAINT (this);
     c->funcs->push_inverse_root_transform (c->data, c->font);
     c->funcs->push_clip_glyph (c->data, gid, c->font);
     c->funcs->push_root_transform (c->data, c->font);
@@ -896,7 +906,7 @@ struct PaintColrGlyph
   void closurev1 (hb_colrv1_closure_context_t* c) const;
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer HB_UNUSED) const
+               const ItemVarStoreInstancer &instancer HB_UNUSED) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->embed (this);
@@ -926,7 +936,7 @@ struct PaintTransform
   HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer) const
+               const ItemVarStoreInstancer &instancer) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->embed (this);
@@ -947,6 +957,7 @@ struct PaintTransform
 
   void paint_glyph (hb_paint_context_t *c) const
   {
+    TRACE_PAINT (this);
     (this+transform).paint_glyph (c);
     c->recurse (this+src);
     c->funcs->pop_transform (c->data);
@@ -964,7 +975,7 @@ struct PaintTranslate
   HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -991,6 +1002,7 @@ struct PaintTranslate
 
   void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const
   {
+    TRACE_PAINT (this);
     float ddx = dx + c->instancer (varIdxBase, 0);
     float ddy = dy + c->instancer (varIdxBase, 1);
 
@@ -1012,7 +1024,7 @@ struct PaintScale
   HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -1039,6 +1051,7 @@ struct PaintScale
 
   void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const
   {
+    TRACE_PAINT (this);
     float sx = scaleX.to_float (c->instancer (varIdxBase, 0));
     float sy = scaleY.to_float (c->instancer (varIdxBase, 1));
 
@@ -1060,7 +1073,7 @@ struct PaintScaleAroundCenter
   HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -1089,6 +1102,7 @@ struct PaintScaleAroundCenter
 
   void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const
   {
+    TRACE_PAINT (this);
     float sx = scaleX.to_float (c->instancer (varIdxBase, 0));
     float sy = scaleY.to_float (c->instancer (varIdxBase, 1));
     float tCenterX = centerX + c->instancer (varIdxBase, 2);
@@ -1118,7 +1132,7 @@ struct PaintScaleUniform
   HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -1142,6 +1156,7 @@ struct PaintScaleUniform
 
   void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const
   {
+    TRACE_PAINT (this);
     float s = scale.to_float (c->instancer (varIdxBase, 0));
 
     bool p1 = c->funcs->push_scale (c->data, s, s);
@@ -1161,7 +1176,7 @@ struct PaintScaleUniformAroundCenter
   HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -1189,6 +1204,7 @@ struct PaintScaleUniformAroundCenter
 
   void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const
   {
+    TRACE_PAINT (this);
     float s = scale.to_float (c->instancer (varIdxBase, 0));
     float tCenterX = centerX + c->instancer (varIdxBase, 1);
     float tCenterY = centerY + c->instancer (varIdxBase, 2);
@@ -1216,7 +1232,7 @@ struct PaintRotate
   HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -1240,6 +1256,7 @@ struct PaintRotate
 
   void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const
   {
+    TRACE_PAINT (this);
     float a = angle.to_float (c->instancer (varIdxBase, 0));
 
     bool p1 = c->funcs->push_rotate (c->data, a);
@@ -1259,7 +1276,7 @@ struct PaintRotateAroundCenter
   HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -1287,6 +1304,7 @@ struct PaintRotateAroundCenter
 
   void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const
   {
+    TRACE_PAINT (this);
     float a = angle.to_float (c->instancer (varIdxBase, 0));
     float tCenterX = centerX + c->instancer (varIdxBase, 1);
     float tCenterY = centerY + c->instancer (varIdxBase, 2);
@@ -1314,7 +1332,7 @@ struct PaintSkew
   HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -1341,6 +1359,7 @@ struct PaintSkew
 
   void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const
   {
+    TRACE_PAINT (this);
     float sx = xSkewAngle.to_float(c->instancer (varIdxBase, 0));
     float sy = ySkewAngle.to_float(c->instancer (varIdxBase, 1));
 
@@ -1362,7 +1381,7 @@ struct PaintSkewAroundCenter
   HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -1391,6 +1410,7 @@ struct PaintSkewAroundCenter
 
   void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const
   {
+    TRACE_PAINT (this);
     float sx = xSkewAngle.to_float(c->instancer (varIdxBase, 0));
     float sy = ySkewAngle.to_float(c->instancer (varIdxBase, 1));
     float tCenterX = centerX + c->instancer (varIdxBase, 2);
@@ -1420,26 +1440,30 @@ struct PaintComposite
   void closurev1 (hb_colrv1_closure_context_t* c) const;
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer) const
+               const ItemVarStoreInstancer &instancer) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->embed (this);
     if (unlikely (!out)) return_trace (false);
 
-    if (!out->src.serialize_subset (c, src, this, instancer)) return_trace (false);
-    return_trace (out->backdrop.serialize_subset (c, backdrop, this, instancer));
+    bool ret = false;
+    ret |= out->src.serialize_subset (c, src, this, instancer);
+    ret |= out->backdrop.serialize_subset (c, backdrop, this, instancer);
+    return_trace (ret);
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  c->check_ops (this->min_size) && // PainComposite can get exponential
                   src.sanitize (c, this) &&
                   backdrop.sanitize (c, this));
   }
 
   void paint_glyph (hb_paint_context_t *c) const
   {
+    TRACE_PAINT (this);
     c->recurse (this+backdrop);
     c->funcs->push_group (c->data);
     c->recurse (this+src);
@@ -1467,7 +1491,7 @@ struct ClipBoxFormat1
     return_trace (c->check_struct (this));
   }
 
-  void get_clip_box (ClipBoxData &clip_box, const VarStoreInstancer &instancer HB_UNUSED) const
+  void get_clip_box (ClipBoxData &clip_box, const ItemVarStoreInstancer &instancer HB_UNUSED) const
   {
     clip_box.xMin = xMin;
     clip_box.yMin = yMin;
@@ -1476,7 +1500,7 @@ struct ClipBoxFormat1
   }
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer,
+               const ItemVarStoreInstancer &instancer,
                uint32_t varIdxBase) const
   {
     TRACE_SUBSET (this);
@@ -1509,15 +1533,15 @@ struct ClipBoxFormat1
 
 struct ClipBoxFormat2 : Variable<ClipBoxFormat1>
 {
-  void get_clip_box (ClipBoxData &clip_box, const VarStoreInstancer &instancer) const
+  void get_clip_box (ClipBoxData &clip_box, const ItemVarStoreInstancer &instancer) const
   {
     value.get_clip_box(clip_box, instancer);
     if (instancer)
     {
-      clip_box.xMin += _hb_roundf (instancer (varIdxBase, 0));
-      clip_box.yMin += _hb_roundf (instancer (varIdxBase, 1));
-      clip_box.xMax += _hb_roundf (instancer (varIdxBase, 2));
-      clip_box.yMax += _hb_roundf (instancer (varIdxBase, 3));
+      clip_box.xMin += roundf (instancer (varIdxBase, 0));
+      clip_box.yMin += roundf (instancer (varIdxBase, 1));
+      clip_box.xMax += roundf (instancer (varIdxBase, 2));
+      clip_box.yMax += roundf (instancer (varIdxBase, 3));
     }
   }
 };
@@ -1525,7 +1549,7 @@ struct ClipBoxFormat2 : Variable<ClipBox
 struct ClipBox
 {
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer) const
+               const ItemVarStoreInstancer &instancer) const
   {
     TRACE_SUBSET (this);
     switch (u.format) {
@@ -1548,7 +1572,7 @@ struct ClipBox
   }
 
   bool get_extents (hb_glyph_extents_t *extents,
-                    const VarStoreInstancer &instancer) const
+                    const ItemVarStoreInstancer &instancer) const
   {
     ClipBoxData clip_box;
     switch (u.format) {
@@ -1584,7 +1608,7 @@ struct ClipRecord
 
   bool subset (hb_subset_context_t *c,
                const void *base,
-               const VarStoreInstancer &instancer) const
+               const ItemVarStoreInstancer &instancer) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->embed (*this);
@@ -1601,7 +1625,7 @@ struct ClipRecord
 
   bool get_extents (hb_glyph_extents_t *extents,
 		    const void *base,
-		    const VarStoreInstancer &instancer) const
+		    const ItemVarStoreInstancer &instancer) const
   {
     return (base+clipBox).get_extents (extents, instancer);
   }
@@ -1618,7 +1642,7 @@ DECLARE_NULL_NAMESPACE_BYTES (OT, ClipRe
 struct ClipList
 {
   unsigned serialize_clip_records (hb_subset_context_t *c,
-                                   const VarStoreInstancer &instancer,
+                                   const ItemVarStoreInstancer &instancer,
                                    const hb_set_t& gids,
                                    const hb_map_t& gid_offset_map) const
   {
@@ -1671,7 +1695,7 @@ struct ClipList
   }
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer) const
+               const ItemVarStoreInstancer &instancer) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (*this);
@@ -1711,7 +1735,7 @@ struct ClipList
   bool
   get_extents (hb_codepoint_t gid,
 	       hb_glyph_extents_t *extents,
-	       const VarStoreInstancer &instancer) const
+	       const ItemVarStoreInstancer &instancer) const
   {
     auto *rec = clips.as_array ().bsearch (gid);
     if (rec)
@@ -1831,7 +1855,7 @@ struct BaseGlyphPaintRecord
 
   bool serialize (hb_serialize_context_t *s, const hb_map_t* glyph_map,
                   const void* src_base, hb_subset_context_t *c,
-                  const VarStoreInstancer &instancer) const
+                  const ItemVarStoreInstancer &instancer) const
   {
     TRACE_SERIALIZE (this);
     auto *out = s->embed (this);
@@ -1860,7 +1884,7 @@ struct BaseGlyphPaintRecord
 struct BaseGlyphList : SortedArray32Of<BaseGlyphPaintRecord>
 {
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer) const
+               const ItemVarStoreInstancer &instancer) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (this);
@@ -1892,21 +1916,22 @@ struct LayerList : Array32OfOffset32To<P
   { return this+(*this)[i]; }
 
   bool subset (hb_subset_context_t *c,
-               const VarStoreInstancer &instancer) const
+               const ItemVarStoreInstancer &instancer) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (this);
     if (unlikely (!c->serializer->extend_min (out)))  return_trace (false);
 
+    bool ret = false;
     for (const auto& _ : + hb_enumerate (*this)
                          | hb_filter (c->plan->colrv1_layers, hb_first))
 
     {
       auto *o = out->serialize_append (c->serializer);
-      if (unlikely (!o) || !o->serialize_subset (c, _.second, this, instancer))
-        return_trace (false);
+      if (unlikely (!o)) return_trace (false);
+      ret |= o->serialize_subset (c, _.second, this, instancer);
     }
-    return_trace (true);
+    return_trace (ret);
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -1923,10 +1948,11 @@ struct COLR
   bool has_v0_data () const { return numBaseGlyphs; }
   bool has_v1_data () const
   {
-    if (version == 1)
-      return (this+baseGlyphList).len > 0;
+    if (version != 1)
+      return false;
+    hb_barrier ();
 
-    return false;
+    return (this+baseGlyphList).len > 0;
   }
 
   unsigned int get_glyph_layers (hb_codepoint_t       glyph,
@@ -2007,6 +2033,8 @@ struct COLR
                       hb_set_t *palette_indices) const
   {
     if (version != 1) return;
+    hb_barrier ();
+
     hb_set_t visited_glyphs;
 
     hb_colrv1_closure_context_t c (this, &visited_glyphs, layer_indices, palette_indices);
@@ -2033,10 +2061,12 @@ struct COLR
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
                   (this+baseGlyphsZ).sanitize (c, numBaseGlyphs) &&
                   (this+layersZ).sanitize (c, numLayers) &&
                   (version == 0 ||
-		   (version == 1 &&
+		   (hb_barrier () &&
+		    version == 1 &&
 		    baseGlyphList.sanitize (c, this) &&
 		    layerList.sanitize (c, this) &&
 		    clipList.sanitize (c, this) &&
@@ -2167,7 +2197,7 @@ struct COLR
     if (version == 0 && (!base_it || !layer_it))
       return_trace (false);
 
-    COLR *colr_prime = c->serializer->start_embed<COLR> ();
+    auto *colr_prime = c->serializer->start_embed<COLR> ();
     if (unlikely (!c->serializer->extend_min (colr_prime)))  return_trace (false);
 
     if (version == 0)
@@ -2176,7 +2206,7 @@ struct COLR
     auto snap = c->serializer->snapshot ();
     if (!c->serializer->allocate_size<void> (5 * HBUINT32::static_size)) return_trace (false);
 
-    VarStoreInstancer instancer (varStore ? &(this+varStore) : nullptr,
+    ItemVarStoreInstancer instancer (varStore ? &(this+varStore) : nullptr,
 	                         varIdxMap ? &(this+varIdxMap) : nullptr,
 	                         c->plan->normalized_coords.as_array ());
 
@@ -2220,7 +2250,7 @@ struct COLR
     if (version != 1)
       return false;
 
-    VarStoreInstancer instancer (&(this+varStore),
+    ItemVarStoreInstancer instancer (&(this+varStore),
 				 &(this+varIdxMap),
 				 hb_array (font->coords, font->num_coords));
 
@@ -2259,6 +2289,8 @@ struct COLR
   {
     if (version == 1)
     {
+      hb_barrier ();
+
       const Paint *paint = get_base_glyph_paint (glyph);
 
       return paint != nullptr;
@@ -2269,7 +2301,7 @@ struct COLR
 
   bool get_clip (hb_codepoint_t glyph,
 		 hb_glyph_extents_t *extents,
-		 const VarStoreInstancer instancer) const
+		 const ItemVarStoreInstancer instancer) const
   {
     return (this+clipList).get_extents (glyph,
 					extents,
@@ -2280,19 +2312,22 @@ struct COLR
   bool
   paint_glyph (hb_font_t *font, hb_codepoint_t glyph, hb_paint_funcs_t *funcs, void *data, unsigned int palette_index, hb_color_t foreground, bool clip = true) const
   {
-    VarStoreInstancer instancer (&(this+varStore),
+    ItemVarStoreInstancer instancer (&(this+varStore),
 	                         &(this+varIdxMap),
 	                         hb_array (font->coords, font->num_coords));
     hb_paint_context_t c (this, funcs, data, font, palette_index, foreground, instancer);
+    c.current_glyphs.add (glyph);
 
     if (version == 1)
     {
+      hb_barrier ();
+
       const Paint *paint = get_base_glyph_paint (glyph);
       if (paint)
       {
         // COLRv1 glyph
 
-	VarStoreInstancer instancer (&(this+varStore),
+	ItemVarStoreInstancer instancer (&(this+varStore),
 				     &(this+varIdxMap),
 				     hb_array (font->coords, font->num_coords));
 
@@ -2378,7 +2413,7 @@ struct COLR
   Offset32To<LayerList>			layerList;
   Offset32To<ClipList>			clipList;   // Offset to ClipList table (may be NULL)
   Offset32To<DeltaSetIndexMap>		varIdxMap;  // Offset to DeltaSetIndexMap table (may be NULL)
-  Offset32To<VariationStore>		varStore;
+  Offset32To<ItemVariationStore>	varStore;
   public:
   DEFINE_SIZE_MIN (14);
 };
@@ -2399,18 +2434,42 @@ hb_paint_context_t::recurse (const Paint
 
 void PaintColrLayers::paint_glyph (hb_paint_context_t *c) const
 {
+  TRACE_PAINT (this);
   const LayerList &paint_offset_lists = c->get_colr_table ()->get_layerList ();
   for (unsigned i = firstLayerIndex; i < firstLayerIndex + numLayers; i++)
   {
+    if (unlikely (c->current_layers.has (i)))
+      continue;
+
+    c->current_layers.add (i);
+
     const Paint &paint = paint_offset_lists.get_paint (i);
     c->funcs->push_group (c->data);
     c->recurse (paint);
     c->funcs->pop_group (c->data, HB_PAINT_COMPOSITE_MODE_SRC_OVER);
+
+    c->current_layers.del (i);
   }
 }
 
 void PaintColrGlyph::paint_glyph (hb_paint_context_t *c) const
 {
+  TRACE_PAINT (this);
+
+  if (unlikely (c->current_glyphs.has (gid)))
+    return;
+
+  c->current_glyphs.add (gid);
+
+  c->funcs->push_inverse_root_transform (c->data, c->font);
+  if (c->funcs->color_glyph (c->data, gid, c->font))
+  {
+    c->funcs->pop_transform (c->data);
+    c->current_glyphs.del (gid);
+    return;
+  }
+  c->funcs->pop_transform (c->data);
+
   const COLR *colr_table = c->get_colr_table ();
   const Paint *paint = colr_table->get_base_glyph_paint (gid);
 
@@ -2429,6 +2488,8 @@ void PaintColrGlyph::paint_glyph (hb_pai
 
   if (has_clip_box)
     c->funcs->pop_clip (c->data);
+
+  c->current_glyphs.del (gid);
 }
 
 } /* namespace OT */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Color/CPAL/CPAL.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Color/CPAL/CPAL.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Color/CPAL/CPAL.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Color/CPAL/CPAL.hh	2024-11-20 13:56:33.000000000 +0000
@@ -214,13 +214,17 @@ struct CPAL
                          hb_set_t *nameids_to_retain /* OUT */) const
   {
     if (version == 1)
+    {
+      hb_barrier ();
       v1 ().collect_name_ids (this, numPalettes, numColors, color_index_map, nameids_to_retain);
+    }
   }
 
   private:
   const CPALV1Tail& v1 () const
   {
     if (version == 0) return Null (CPALV1Tail);
+    hb_barrier ();
     return StructAfter<CPALV1Tail> (*this);
   }
 
@@ -312,7 +316,10 @@ struct CPAL
       return_trace (false);
 
     if (version == 1)
+    {
+      hb_barrier ();
       return_trace (v1 ().serialize (c->serializer, numPalettes, numColors, this, color_index_map));
+    }
 
     return_trace (true);
   }
@@ -321,6 +328,7 @@ struct CPAL
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  (this+colorRecordsZ).sanitize (c, numColorRecords) &&
 		  colorRecordIndicesZ.sanitize (c, numPalettes) &&
 		  (version == 0 || v1 ().sanitize (c, this, numPalettes, numColors)));
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Color/sbix/sbix.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Color/sbix/sbix.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Color/sbix/sbix.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Color/sbix/sbix.hh	2024-11-20 13:56:33.000000000 +0000
@@ -48,7 +48,6 @@ struct SBIXGlyph
   {
     TRACE_SERIALIZE (this);
     SBIXGlyph* new_glyph = c->start_embed<SBIXGlyph> ();
-    if (unlikely (!new_glyph)) return_trace (nullptr);
     if (unlikely (!c->extend_min (new_glyph))) return_trace (nullptr);
 
     new_glyph->xOffset = xOffset;
@@ -143,7 +142,6 @@ struct SBIXStrike
     unsigned int num_output_glyphs = c->plan->num_output_glyphs ();
 
     auto* out = c->serializer->start_embed<SBIXStrike> ();
-    if (unlikely (!out)) return_trace (false);
     auto snap = c->serializer->snapshot ();
     if (unlikely (!c->serializer->extend (out, num_output_glyphs + 1))) return_trace (false);
     out->ppem = ppem;
@@ -370,6 +368,7 @@ struct sbix
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
 			  version >= 1 &&
 			  strikes.sanitize (c, this)));
   }
@@ -388,7 +387,6 @@ struct sbix
     TRACE_SERIALIZE (this);
 
     auto *out = c->serializer->start_embed<Array32OfOffset32To<SBIXStrike>> ();
-    if (unlikely (!out)) return_trace (false);
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
     hb_vector_t<Offset32To<SBIXStrike>*> new_strikes;
@@ -423,8 +421,6 @@ struct sbix
   {
     TRACE_SUBSET (this);
 
-    sbix *sbix_prime = c->serializer->start_embed<sbix> ();
-    if (unlikely (!sbix_prime)) return_trace (false);
     if (unlikely (!c->serializer->embed (this->version))) return_trace (false);
     if (unlikely (!c->serializer->embed (this->flags))) return_trace (false);
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Color/svg/svg.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Color/svg/svg.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Color/svg/svg.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Color/svg/svg.hh	2024-11-20 13:56:33.000000000 +0000
@@ -56,6 +56,7 @@ struct SVGDocumentIndexEntry
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  svgDoc.sanitize (c, base, svgDocLength));
   }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/Coverage.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/Coverage.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/Coverage.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/Coverage.hh	2024-11-20 13:56:33.000000000 +0000
@@ -57,10 +57,14 @@ struct Coverage
   public:
   DEFINE_SIZE_UNION (2, format);
 
+#ifndef HB_OPTIMIZE_SIZE
+  HB_ALWAYS_INLINE
+#endif
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return_trace (false);
+    hb_barrier ();
     switch (u.format)
     {
     case 1: return_trace (u.format1.sanitize (c));
@@ -113,22 +117,33 @@ struct Coverage
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (this))) return_trace (false);
 
-    unsigned count = 0;
+    unsigned count = hb_len (glyphs);
     unsigned num_ranges = 0;
     hb_codepoint_t last = (hb_codepoint_t) -2;
+    hb_codepoint_t max = 0;
+    bool unsorted = false;
     for (auto g: glyphs)
     {
+      if (last != (hb_codepoint_t) -2 && g < last)
+	unsorted = true;
       if (last + 1 != g)
-        num_ranges++;
+	num_ranges++;
       last = g;
-      count++;
+      if (g > max) max = g;
     }
-    u.format = count <= num_ranges * 3 ? 1 : 2;
+    u.format = !unsorted && count <= num_ranges * 3 ? 1 : 2;
 
 #ifndef HB_NO_BEYOND_64K
-    if (count && last > 0xFFFFu)
+    if (max > 0xFFFFu)
       u.format += 2;
+    if (unlikely (max > 0xFFFFFFu))
+#else
+    if (unlikely (max > 0xFFFFu))
 #endif
+    {
+      c->check_success (false, HB_SERIALIZE_ERROR_INT_OVERFLOW);
+      return_trace (false);
+    }
 
     switch (u.format)
     {
@@ -148,8 +163,8 @@ struct Coverage
     auto it =
     + iter ()
     | hb_take (c->plan->source->get_num_glyphs ())
-    | hb_filter (c->plan->glyph_map_gsub)
     | hb_map_retains_sorting (c->plan->glyph_map_gsub)
+    | hb_filter ([] (hb_codepoint_t glyph) { return glyph != HB_MAP_VALUE_INVALID; })
     ;
 
     // Cache the iterator result as it will be iterated multiple times
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat1.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat1.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat1.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat1.hh	2024-11-20 13:56:33.000000000 +0000
@@ -79,7 +79,7 @@ struct CoverageFormat1_3
   {
     if (glyphArray.len > glyphs->get_population () * hb_bit_storage ((unsigned) glyphArray.len) / 2)
     {
-      for (hb_codepoint_t g = HB_SET_VALUE_INVALID; glyphs->next (&g);)
+      for (auto g : *glyphs)
         if (get_coverage (g) != NOT_COVERED)
 	  return true;
       return false;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat2.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat2.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat2.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat2.hh	2024-11-20 13:56:33.000000000 +0000
@@ -95,19 +95,26 @@ struct CoverageFormat2_4
     unsigned count = 0;
     unsigned range = (unsigned) -1;
     last = (hb_codepoint_t) -2;
+    unsigned unsorted = false;
     for (auto g: glyphs)
     {
       if (last + 1 != g)
       {
+	if (unlikely (last != (hb_codepoint_t) -2 && last + 1 > g))
+	  unsorted = true;
+
         range++;
-        rangeRecord[range].first = g;
-        rangeRecord[range].value = count;
+        rangeRecord.arrayZ[range].first = g;
+        rangeRecord.arrayZ[range].value = count;
       }
-      rangeRecord[range].last = g;
+      rangeRecord.arrayZ[range].last = g;
       last = g;
       count++;
     }
 
+    if (unlikely (unsorted))
+      rangeRecord.as_array ().qsort (RangeRecord<Types>::cmp_range);
+
     return_trace (true);
   }
 
@@ -115,7 +122,7 @@ struct CoverageFormat2_4
   {
     if (rangeRecord.len > glyphs->get_population () * hb_bit_storage ((unsigned) rangeRecord.len) / 2)
     {
-      for (hb_codepoint_t g = HB_SET_VALUE_INVALID; glyphs->next (&g);)
+      for (auto g : *glyphs)
         if (get_coverage (g) != NOT_COVERED)
 	  return true;
       return false;
@@ -185,8 +192,8 @@ struct CoverageFormat2_4
         if (__more__ ())
         {
           unsigned int old = coverage;
-          j = c->rangeRecord[i].first;
-          coverage = c->rangeRecord[i].value;
+          j = c->rangeRecord.arrayZ[i].first;
+          coverage = c->rangeRecord.arrayZ[i].value;
           if (unlikely (coverage != old + 1))
           {
             /* Broken table. Skip. Important to avoid DoS.
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/RangeRecord.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/RangeRecord.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/RangeRecord.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/RangeRecord.hh	2024-11-20 13:56:33.000000000 +0000
@@ -51,6 +51,18 @@ struct RangeRecord
   int cmp (hb_codepoint_t g) const
   { return g < first ? -1 : g <= last ? 0 : +1; }
 
+  HB_INTERNAL static int cmp_range (const void *pa, const void *pb) {
+    const RangeRecord *a = (const RangeRecord *) pa;
+    const RangeRecord *b = (const RangeRecord *) pb;
+    if (a->first < b->first) return -1;
+    if (a->first > b->first) return +1;
+    if (a->last < b->last) return -1;
+    if (a->last > b->last) return +1;
+    if (a->value < b->value) return -1;
+    if (a->value > b->value) return +1;
+    return 0;
+  }
+
   unsigned get_population () const
   {
     if (unlikely (last < first)) return 0;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GDEF/GDEF.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GDEF/GDEF.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GDEF/GDEF.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GDEF/GDEF.hh	2024-11-20 13:56:33.000000000 +0000
@@ -29,9 +29,10 @@
 #ifndef OT_LAYOUT_GDEF_GDEF_HH
 #define OT_LAYOUT_GDEF_GDEF_HH
 
-#include "../../../hb-ot-layout-common.hh"
+#include "../../../hb-ot-var-common.hh"
 
 #include "../../../hb-font.hh"
+#include "../../../hb-cache.hh"
 
 
 namespace OT {
@@ -48,8 +49,6 @@ struct AttachPoint : Array16Of<HBUINT16>
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (*this);
-    if (unlikely (!out)) return_trace (false);
-
     return_trace (out->serialize (c->serializer, + iter ()));
   }
 };
@@ -190,7 +189,7 @@ struct CaretValueFormat3
   friend struct CaretValue;
 
   hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction,
-				 const VariationStore &var_store) const
+				 const ItemVariationStore &var_store) const
   {
     return HB_DIRECTION_IS_HORIZONTAL (direction) ?
 	   font->em_scale_x (coordinate) + (this+deviceTable).get_x_delta (font, var_store) :
@@ -201,22 +200,23 @@ struct CaretValueFormat3
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (*this);
-    if (unlikely (!out)) return_trace (false);
     if (!c->serializer->embed (caretValueFormat)) return_trace (false);
     if (!c->serializer->embed (coordinate)) return_trace (false);
 
     unsigned varidx = (this+deviceTable).get_variation_index ();
-    if (c->plan->layout_variation_idx_delta_map.has (varidx))
+    hb_pair_t<unsigned, int> *new_varidx_delta;
+    if (!c->plan->layout_variation_idx_delta_map.has (varidx, &new_varidx_delta))
+      return_trace (false);
+
+    uint32_t new_varidx = hb_first (*new_varidx_delta);
+    int delta = hb_second (*new_varidx_delta);
+    if (delta != 0)
     {
-      int delta = hb_second (c->plan->layout_variation_idx_delta_map.get (varidx));
-      if (delta != 0)
-      {
-        if (!c->serializer->check_assign (out->coordinate, coordinate + delta, HB_SERIALIZE_ERROR_INT_OVERFLOW))
-          return_trace (false);
-      }
+      if (!c->serializer->check_assign (out->coordinate, coordinate + delta, HB_SERIALIZE_ERROR_INT_OVERFLOW))
+        return_trace (false);
     }
 
-    if (c->plan->all_axes_pinned)
+    if (new_varidx == HB_OT_LAYOUT_NO_VARIATIONS_INDEX)
       return_trace (c->serializer->check_assign (out->caretValueFormat, 1, HB_SERIALIZE_ERROR_INT_OVERFLOW));
 
     if (!c->serializer->embed (deviceTable))
@@ -251,7 +251,7 @@ struct CaretValue
   hb_position_t get_caret_value (hb_font_t *font,
 				 hb_direction_t direction,
 				 hb_codepoint_t glyph_id,
-				 const VariationStore &var_store) const
+				 const ItemVariationStore &var_store) const
   {
     switch (u.format) {
     case 1: return u.format1.get_caret_value (font, direction);
@@ -291,6 +291,7 @@ struct CaretValue
   {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return_trace (false);
+    hb_barrier ();
     switch (u.format) {
     case 1: return_trace (u.format1.sanitize (c));
     case 2: return_trace (u.format2.sanitize (c));
@@ -315,7 +316,7 @@ struct LigGlyph
   unsigned get_lig_carets (hb_font_t            *font,
 			   hb_direction_t        direction,
 			   hb_codepoint_t        glyph_id,
-			   const VariationStore &var_store,
+			   const ItemVariationStore &var_store,
 			   unsigned              start_offset,
 			   unsigned             *caret_count /* IN/OUT */,
 			   hb_position_t        *caret_array /* OUT */) const
@@ -371,7 +372,7 @@ struct LigCaretList
   unsigned int get_lig_carets (hb_font_t *font,
 			       hb_direction_t direction,
 			       hb_codepoint_t glyph_id,
-			       const VariationStore &var_store,
+			       const ItemVariationStore &var_store,
 			       unsigned int start_offset,
 			       unsigned int *caret_count /* IN/OUT */,
 			       hb_position_t *caret_array /* OUT */) const
@@ -441,6 +442,30 @@ struct MarkGlyphSetsFormat1
   bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const
   { return (this+coverage[set_index]).get_coverage (glyph_id) != NOT_COVERED; }
 
+  void collect_used_mark_sets (const hb_set_t& glyph_set,
+                               hb_set_t& used_mark_sets /* OUT */) const
+  {
+    unsigned i = 0;
+    for (const auto &offset : coverage)
+     {
+       const auto &cov = this+offset;
+       if (cov.intersects (&glyph_set))
+         used_mark_sets.add (i);
+
+       i++;
+     }
+  }
+
+  template <typename set_t>
+  void collect_coverage (hb_vector_t<set_t> &sets) const
+  {
+     for (const auto &offset : coverage)
+     {
+       const auto &cov = this+offset;
+       cov.collect_coverage (sets.push ());
+     }
+  }
+
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
@@ -451,6 +476,7 @@ struct MarkGlyphSetsFormat1
     bool ret = true;
     for (const Offset32To<Coverage>& offset : coverage.iter ())
     {
+      auto snap = c->serializer->snapshot ();
       auto *o = out->coverage.serialize_append (c->serializer);
       if (unlikely (!o))
       {
@@ -458,11 +484,17 @@ struct MarkGlyphSetsFormat1
 	break;
       }
 
-      //not using o->serialize_subset (c, offset, this, out) here because
-      //OTS doesn't allow null offset.
-      //See issue: https://github.com/khaledhosny/ots/issues/172
+      //skip empty coverage
       c->serializer->push ();
-      c->dispatch (this+offset);
+      bool res = false;
+      if (offset) res = c->dispatch (this+offset);
+      if (!res)
+      {
+        c->serializer->pop_discard ();
+        c->serializer->revert (snap);
+        (out->coverage.len)--;
+        continue;
+      }
       c->serializer->add_link (*o, c->serializer->pop_pack ());
     }
 
@@ -494,6 +526,24 @@ struct MarkGlyphSets
     }
   }
 
+  template <typename set_t>
+  void collect_coverage (hb_vector_t<set_t> &sets) const
+  {
+    switch (u.format) {
+    case 1: u.format1.collect_coverage (sets); return;
+    default:return;
+    }
+  }
+
+  void collect_used_mark_sets (const hb_set_t& glyph_set,
+                               hb_set_t& used_mark_sets /* OUT */) const
+  {
+    switch (u.format) {
+    case 1: u.format1.collect_used_mark_sets (glyph_set, used_mark_sets); return;
+    default:return;
+    }
+  }
+
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
@@ -507,6 +557,7 @@ struct MarkGlyphSets
   {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return_trace (false);
+    hb_barrier ();
     switch (u.format) {
     case 1: return_trace (u.format1.sanitize (c));
     default:return_trace (true);
@@ -558,7 +609,7 @@ struct GDEFVersion1_2
 					 * definitions--from beginning of GDEF
 					 * header (may be NULL).  Introduced
 					 * in version 0x00010002. */
-  Offset32To<VariationStore>
+  Offset32To<ItemVariationStore>
 		varStore;		/* Offset to the table of Item Variation
 					 * Store--from beginning of GDEF
 					 * header (may be NULL).  Introduced
@@ -581,43 +632,109 @@ struct GDEFVersion1_2
 		  attachList.sanitize (c, this) &&
 		  ligCaretList.sanitize (c, this) &&
 		  markAttachClassDef.sanitize (c, this) &&
+		  hb_barrier () &&
 		  (version.to_int () < 0x00010002u || markGlyphSetsDef.sanitize (c, this)) &&
 		  (version.to_int () < 0x00010003u || varStore.sanitize (c, this)));
   }
 
+  static void remap_varidx_after_instantiation (const hb_map_t& varidx_map,
+                                                hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>>& layout_variation_idx_delta_map /* IN/OUT */)
+  {
+    /* varidx_map is empty which means varstore is empty after instantiation,
+     * no variations, map all varidx to HB_OT_LAYOUT_NO_VARIATIONS_INDEX.
+     * varidx_map doesn't have original varidx, indicating delta row is all
+     * zeros, map varidx to HB_OT_LAYOUT_NO_VARIATIONS_INDEX */
+    for (auto _ : layout_variation_idx_delta_map.iter_ref ())
+    {
+      /* old_varidx->(varidx, delta) mapping generated for subsetting, then this
+       * varidx is used as key of varidx_map during instantiation */
+      uint32_t varidx = _.second.first;
+      uint32_t *new_varidx;
+      if (varidx_map.has (varidx, &new_varidx))
+        _.second.first = *new_varidx;
+      else
+        _.second.first = HB_OT_LAYOUT_NO_VARIATIONS_INDEX;
+    }
+  }
+
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    auto *out = c->serializer->embed (*this);
-    if (unlikely (!out)) return_trace (false);
-
-    bool subset_glyphclassdef = out->glyphClassDef.serialize_subset (c, glyphClassDef, this, nullptr, false, true);
-    bool subset_attachlist = out->attachList.serialize_subset (c, attachList, this);
-    bool subset_ligcaretlist = out->ligCaretList.serialize_subset (c, ligCaretList, this);
-    bool subset_markattachclassdef = out->markAttachClassDef.serialize_subset (c, markAttachClassDef, this, nullptr, false, true);
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
-    bool subset_markglyphsetsdef = false;
-    if (version.to_int () >= 0x00010002u)
-    {
-      subset_markglyphsetsdef = out->markGlyphSetsDef.serialize_subset (c, markGlyphSetsDef, this);
-    }
+    // Push var store first (if it's needed) so that it's last in the
+    // serialization order. Some font consumers assume that varstore runs to
+    // the end of the GDEF table.
+    // See: https://github.com/harfbuzz/harfbuzz/issues/4636
+    auto snapshot_version0 = c->serializer->snapshot ();
+    if (unlikely (version.to_int () >= 0x00010002u && !c->serializer->embed (markGlyphSetsDef)))
+      return_trace (false);
 
     bool subset_varstore = false;
+    unsigned varstore_index = (unsigned) -1;
+    auto snapshot_version2 = c->serializer->snapshot ();
     if (version.to_int () >= 0x00010003u)
     {
+      if (unlikely (!c->serializer->embed (varStore))) return_trace (false);
       if (c->plan->all_axes_pinned)
         out->varStore = 0;
+      else if (c->plan->normalized_coords)
+      {
+        if (varStore)
+        {
+          item_variations_t item_vars;
+          if (item_vars.instantiate (this+varStore, c->plan, true, true,
+                                     c->plan->gdef_varstore_inner_maps.as_array ())) {
+            subset_varstore = out->varStore.serialize_serialize (c->serializer,
+                                                                 item_vars.has_long_word (),
+                                                                 c->plan->axis_tags,
+                                                                 item_vars.get_region_list (),
+                                                                 item_vars.get_vardata_encodings ());
+            varstore_index = c->serializer->last_added_child_index();
+          }
+          remap_varidx_after_instantiation (item_vars.get_varidx_map (),
+                                            c->plan->layout_variation_idx_delta_map);
+        }
+      }
       else
+      {
         subset_varstore = out->varStore.serialize_subset (c, varStore, this, c->plan->gdef_varstore_inner_maps.as_array ());
+        varstore_index = c->serializer->last_added_child_index();
+      }
+    }
+
+    out->version.major = version.major;
+    out->version.minor = version.minor;
+
+    if (!subset_varstore && version.to_int () >= 0x00010002u) {
+      c->serializer->revert (snapshot_version2);
+    }
+
+    bool subset_markglyphsetsdef = false;
+    if (version.to_int () >= 0x00010002u)
+    {
+      subset_markglyphsetsdef = out->markGlyphSetsDef.serialize_subset (c, markGlyphSetsDef, this);
     }
 
     if (subset_varstore)
     {
       out->version.minor = 3;
+      c->plan->has_gdef_varstore = true;
     } else if (subset_markglyphsetsdef) {
-      out->version.minor = 2;
+      out->version.minor = 2;      
     } else  {
       out->version.minor = 0;
+      c->serializer->revert (snapshot_version0);
+    }
+
+    bool subset_glyphclassdef = out->glyphClassDef.serialize_subset (c, glyphClassDef, this, nullptr, false, true);
+    bool subset_attachlist = out->attachList.serialize_subset (c, attachList, this);
+    bool subset_markattachclassdef = out->markAttachClassDef.serialize_subset (c, markAttachClassDef, this, nullptr, false, true);
+    bool subset_ligcaretlist = out->ligCaretList.serialize_subset (c, ligCaretList, this);
+
+    if (subset_varstore && varstore_index != (unsigned) -1) {
+      c->serializer->repack_last(varstore_index);
     }
 
     return_trace (subset_glyphclassdef || subset_attachlist ||
@@ -654,6 +771,7 @@ struct GDEF
   {
     TRACE_SANITIZE (this);
     if (unlikely (!u.version.sanitize (c))) return_trace (false);
+    hb_barrier ();
     switch (u.version.major) {
     case 1: return_trace (u.version1.sanitize (c));
 #ifndef HB_NO_BEYOND_64K
@@ -784,14 +902,14 @@ struct GDEF
     default: return false;
     }
   }
-  const VariationStore &get_var_store () const
+  const ItemVariationStore &get_var_store () const
   {
     switch (u.version.major) {
-    case 1: return u.version.to_int () >= 0x00010003u ? this+u.version1.varStore : Null(VariationStore);
+    case 1: return u.version.to_int () >= 0x00010003u ? this+u.version1.varStore : Null(ItemVariationStore);
 #ifndef HB_NO_BEYOND_64K
     case 2: return this+u.version2.varStore;
 #endif
-    default: return Null(VariationStore);
+    default: return Null(ItemVariationStore);
     }
   }
 
@@ -858,27 +976,79 @@ struct GDEF
 	hb_blob_destroy (table.get_blob ());
 	table = hb_blob_get_empty ();
       }
+
+#ifndef HB_NO_GDEF_CACHE
+      table->get_mark_glyph_sets ().collect_coverage (mark_glyph_set_digests);
+#endif
     }
     ~accelerator_t () { table.destroy (); }
 
+    unsigned int get_glyph_props (hb_codepoint_t glyph) const
+    {
+      unsigned v;
+
+#ifndef HB_NO_GDEF_CACHE
+      if (glyph_props_cache.get (glyph, &v))
+        return v;
+#endif
+
+      v = table->get_glyph_props (glyph);
+
+#ifndef HB_NO_GDEF_CACHE
+      if (likely (table.get_blob ())) // Don't try setting if we are the null instance!
+	glyph_props_cache.set (glyph, v);
+#endif
+
+      return v;
+
+    }
+
+    bool mark_set_covers (unsigned int set_index, hb_codepoint_t glyph_id) const
+    {
+      return
+#ifndef HB_NO_GDEF_CACHE
+	     mark_glyph_set_digests[set_index].may_have (glyph_id) &&
+#endif
+	     table->mark_set_covers (set_index, glyph_id);
+    }
+
     hb_blob_ptr_t<GDEF> table;
+#ifndef HB_NO_GDEF_CACHE
+    hb_vector_t<hb_set_digest_t> mark_glyph_set_digests;
+    mutable hb_cache_t<21, 3, 8> glyph_props_cache;
+#endif
   };
 
   void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
   { get_lig_caret_list ().collect_variation_indices (c); }
 
   void remap_layout_variation_indices (const hb_set_t *layout_variation_indices,
+				       const hb_vector_t<int>& normalized_coords,
+				       bool calculate_delta, /* not pinned at default */
+				       bool no_variations, /* all axes pinned */
 				       hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map /* OUT */) const
   {
     if (!has_var_store ()) return;
-    if (layout_variation_indices->is_empty ()) return;
+    const ItemVariationStore &var_store = get_var_store ();
+    float *store_cache = var_store.create_cache ();
 
     unsigned new_major = 0, new_minor = 0;
     unsigned last_major = (layout_variation_indices->get_min ()) >> 16;
     for (unsigned idx : layout_variation_indices->iter ())
     {
+      int delta = 0;
+      if (calculate_delta)
+        delta = roundf (var_store.get_delta (idx, normalized_coords.arrayZ,
+                                             normalized_coords.length, store_cache));
+
+      if (no_variations)
+      {
+        layout_variation_idx_delta_map->set (idx, hb_pair_t<unsigned, int> (HB_OT_LAYOUT_NO_VARIATIONS_INDEX, delta));
+        continue;
+      }
+
       uint16_t major = idx >> 16;
-      if (major >= get_var_store ().get_sub_table_count ()) break;
+      if (major >= var_store.get_sub_table_count ()) break;
       if (major != last_major)
       {
 	new_minor = 0;
@@ -886,14 +1056,11 @@ struct GDEF
       }
 
       unsigned new_idx = (new_major << 16) + new_minor;
-      if (!layout_variation_idx_delta_map->has (idx))
-        continue;
-      int delta = hb_second (layout_variation_idx_delta_map->get (idx));
-
       layout_variation_idx_delta_map->set (idx, hb_pair_t<unsigned, int> (new_idx, delta));
       ++new_minor;
       last_major = major;
     }
+    var_store.destroy_cache (store_cache);
   }
 
   protected:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/Anchor.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/Anchor.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/Anchor.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/Anchor.hh	2024-11-20 13:56:33.000000000 +0000
@@ -25,6 +25,7 @@ struct Anchor
   {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return_trace (false);
+    hb_barrier ();
     switch (u.format) {
     case 1: return_trace (u.format1.sanitize (c));
     case 2: return_trace (u.format2.sanitize (c));
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorFormat3.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorFormat3.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorFormat3.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorFormat3.hh	2024-11-20 13:56:33.000000000 +0000
@@ -25,7 +25,9 @@ struct AnchorFormat3
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && xDeviceTable.sanitize (c, this) && yDeviceTable.sanitize (c, this));
+    if (unlikely (!c->check_struct (this))) return_trace (false);
+
+    return_trace (xDeviceTable.sanitize (c, this) && yDeviceTable.sanitize (c, this));
   }
 
   void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
@@ -35,25 +37,35 @@ struct AnchorFormat3
     *x = font->em_fscale_x (xCoordinate);
     *y = font->em_fscale_y (yCoordinate);
 
-    if (font->x_ppem || font->num_coords)
+    if ((font->x_ppem || font->num_coords) && xDeviceTable.sanitize (&c->sanitizer, this))
+    {
+      hb_barrier ();
       *x += (this+xDeviceTable).get_x_delta (font, c->var_store, c->var_store_cache);
-    if (font->y_ppem || font->num_coords)
+    }
+    if ((font->y_ppem || font->num_coords) && yDeviceTable.sanitize (&c->sanitizer, this))
+    {
+      hb_barrier ();
       *y += (this+yDeviceTable).get_y_delta (font, c->var_store, c->var_store_cache);
+    }
   }
 
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (*this);
-    if (unlikely (!out)) return_trace (false);
     if (unlikely (!c->serializer->embed (format))) return_trace (false);
     if (unlikely (!c->serializer->embed (xCoordinate))) return_trace (false);
     if (unlikely (!c->serializer->embed (yCoordinate))) return_trace (false);
 
     unsigned x_varidx = xDeviceTable ? (this+xDeviceTable).get_variation_index () : HB_OT_LAYOUT_NO_VARIATIONS_INDEX;
-    if (c->plan->layout_variation_idx_delta_map.has (x_varidx))
+    if (x_varidx != HB_OT_LAYOUT_NO_VARIATIONS_INDEX)
     {
-      int delta = hb_second (c->plan->layout_variation_idx_delta_map.get (x_varidx));
+      hb_pair_t<unsigned, int> *new_varidx_delta;
+      if (!c->plan->layout_variation_idx_delta_map.has (x_varidx, &new_varidx_delta))
+        return_trace (false);
+     
+      x_varidx = hb_first (*new_varidx_delta);
+      int delta = hb_second (*new_varidx_delta);
       if (delta != 0)
       {
         if (!c->serializer->check_assign (out->xCoordinate, xCoordinate + delta,
@@ -63,9 +75,14 @@ struct AnchorFormat3
     }
 
     unsigned y_varidx = yDeviceTable ? (this+yDeviceTable).get_variation_index () : HB_OT_LAYOUT_NO_VARIATIONS_INDEX;
-    if (c->plan->layout_variation_idx_delta_map.has (y_varidx))
+    if (y_varidx != HB_OT_LAYOUT_NO_VARIATIONS_INDEX)
     {
-      int delta = hb_second (c->plan->layout_variation_idx_delta_map.get (y_varidx));
+      hb_pair_t<unsigned, int> *new_varidx_delta;
+      if (!c->plan->layout_variation_idx_delta_map.has (y_varidx, &new_varidx_delta))
+        return_trace (false);
+
+      y_varidx = hb_first (*new_varidx_delta);
+      int delta = hb_second (*new_varidx_delta);
       if (delta != 0)
       {
         if (!c->serializer->check_assign (out->yCoordinate, yCoordinate + delta,
@@ -74,7 +91,10 @@ struct AnchorFormat3
       }
     }
 
-    if (c->plan->all_axes_pinned)
+    /* in case that all axes are pinned or no variations after instantiation,
+     * both var_idxes will be mapped to HB_OT_LAYOUT_NO_VARIATIONS_INDEX */
+    if (x_varidx == HB_OT_LAYOUT_NO_VARIATIONS_INDEX &&
+        y_varidx == HB_OT_LAYOUT_NO_VARIATIONS_INDEX)
       return_trace (c->serializer->check_assign (out->format, 1, HB_SERIALIZE_ERROR_INT_OVERFLOW));
 
     if (!c->serializer->embed (xDeviceTable)) return_trace (false);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorMatrix.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorMatrix.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorMatrix.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorMatrix.hh	2024-11-20 13:56:33.000000000 +0000
@@ -8,7 +8,7 @@ namespace GPOS_impl {
 struct AnchorMatrix
 {
   HBUINT16      rows;                   /* Number of rows */
-  UnsizedArrayOf<Offset16To<Anchor>>
+  UnsizedArrayOf<Offset16To<Anchor, AnchorMatrix>>
                 matrixZ;                /* Matrix of offsets to Anchor tables--
                                          * from beginning of AnchorMatrix table */
   public:
@@ -18,21 +18,31 @@ struct AnchorMatrix
   {
     TRACE_SANITIZE (this);
     if (!c->check_struct (this)) return_trace (false);
+    hb_barrier ();
     if (unlikely (hb_unsigned_mul_overflows (rows, cols))) return_trace (false);
     unsigned int count = rows * cols;
     if (!c->check_array (matrixZ.arrayZ, count)) return_trace (false);
+
+    if (c->lazy_some_gpos)
+      return_trace (true);
+
+    hb_barrier ();
     for (unsigned int i = 0; i < count; i++)
       if (!matrixZ[i].sanitize (c, this)) return_trace (false);
     return_trace (true);
   }
 
-  const Anchor& get_anchor (unsigned int row, unsigned int col,
-                            unsigned int cols, bool *found) const
+  const Anchor& get_anchor (hb_ot_apply_context_t *c,
+			    unsigned int row, unsigned int col,
+			    unsigned int cols, bool *found) const
   {
     *found = false;
     if (unlikely (row >= rows || col >= cols)) return Null (Anchor);
-    *found = !matrixZ[row * cols + col].is_null ();
-    return this+matrixZ[row * cols + col];
+    auto &offset = matrixZ[row * cols + col];
+    if (unlikely (!offset.sanitize (&c->sanitizer, this))) return Null (Anchor);
+    hb_barrier ();
+    *found = !offset.is_null ();
+    return this+offset;
   }
 
   template <typename Iterator,
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/Common.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/Common.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/Common.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/Common.hh	2024-11-20 13:56:33.000000000 +0000
@@ -23,7 +23,7 @@ static void SinglePos_serialize (hb_seri
                                  const SrcLookup *src,
                                  Iterator it,
                                  const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map,
-                                 bool all_axes_pinned);
+                                 unsigned new_format);
 
 
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/CursivePosFormat1.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/CursivePosFormat1.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/CursivePosFormat1.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/CursivePosFormat1.hh	2024-11-20 13:56:33.000000000 +0000
@@ -11,37 +11,38 @@ struct EntryExitRecord
 {
   friend struct CursivePosFormat1;
 
-  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  bool sanitize (hb_sanitize_context_t *c, const struct CursivePosFormat1 *base) const
   {
     TRACE_SANITIZE (this);
     return_trace (entryAnchor.sanitize (c, base) && exitAnchor.sanitize (c, base));
   }
 
   void collect_variation_indices (hb_collect_variation_indices_context_t *c,
-                                  const void *src_base) const
+                                  const struct CursivePosFormat1 *src_base) const
   {
     (src_base+entryAnchor).collect_variation_indices (c);
     (src_base+exitAnchor).collect_variation_indices (c);
   }
 
-  EntryExitRecord* subset (hb_subset_context_t *c,
-                           const void *src_base) const
+  bool subset (hb_subset_context_t *c,
+	       const struct CursivePosFormat1 *src_base) const
   {
     TRACE_SERIALIZE (this);
     auto *out = c->serializer->embed (this);
-    if (unlikely (!out)) return_trace (nullptr);
+    if (unlikely (!out)) return_trace (false);
 
-    out->entryAnchor.serialize_subset (c, entryAnchor, src_base);
-    out->exitAnchor.serialize_subset (c, exitAnchor, src_base);
-    return_trace (out);
+    bool ret = false;
+    ret |= out->entryAnchor.serialize_subset (c, entryAnchor, src_base);
+    ret |= out->exitAnchor.serialize_subset (c, exitAnchor, src_base);
+    return_trace (ret);
   }
 
   protected:
-  Offset16To<Anchor>
+  Offset16To<Anchor, struct CursivePosFormat1>
                 entryAnchor;            /* Offset to EntryAnchor table--from
                                          * beginning of CursivePos
                                          * subtable--may be NULL */
-  Offset16To<Anchor>
+  Offset16To<Anchor, struct CursivePosFormat1>
                 exitAnchor;             /* Offset to ExitAnchor table--from
                                          * beginning of CursivePos
                                          * subtable--may be NULL */
@@ -91,7 +92,13 @@ struct CursivePosFormat1
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (coverage.sanitize (c, this) && entryExitRecord.sanitize (c, this));
+    if (unlikely (!coverage.sanitize (c, this)))
+      return_trace (false);
+
+    if (c->lazy_some_gpos)
+      return_trace (entryExitRecord.sanitize_shallow (c));
+    else
+      return_trace (entryExitRecord.sanitize (c, this));
   }
 
   bool intersects (const hb_set_t *glyphs) const
@@ -119,23 +126,27 @@ struct CursivePosFormat1
     hb_buffer_t *buffer = c->buffer;
 
     const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage  (buffer->cur().codepoint)];
-    if (!this_record.entryAnchor) return_trace (false);
+    if (!this_record.entryAnchor ||
+	unlikely (!this_record.entryAnchor.sanitize (&c->sanitizer, this))) return_trace (false);
+    hb_barrier ();
 
     hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
-    skippy_iter.reset (buffer->idx, 1);
+    skippy_iter.reset_fast (buffer->idx);
     unsigned unsafe_from;
-    if (!skippy_iter.prev (&unsafe_from))
+    if (unlikely (!skippy_iter.prev (&unsafe_from)))
     {
       buffer->unsafe_to_concat_from_outbuffer (unsafe_from, buffer->idx + 1);
       return_trace (false);
     }
 
     const EntryExitRecord &prev_record = entryExitRecord[(this+coverage).get_coverage  (buffer->info[skippy_iter.idx].codepoint)];
-    if (!prev_record.exitAnchor)
+    if (!prev_record.exitAnchor ||
+	unlikely (!prev_record.exitAnchor.sanitize (&c->sanitizer, this)))
     {
       buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1);
       return_trace (false);
     }
+    hb_barrier ();
 
     unsigned int i = skippy_iter.idx;
     unsigned int j = buffer->idx;
@@ -200,8 +211,8 @@ struct CursivePosFormat1
      * Arabic. */
     unsigned int child  = i;
     unsigned int parent = j;
-    hb_position_t x_offset = entry_x - exit_x;
-    hb_position_t y_offset = entry_y - exit_y;
+    hb_position_t x_offset = roundf (entry_x - exit_x);
+    hb_position_t y_offset = roundf (entry_y - exit_y);
     if  (!(c->lookup_props & LookupFlag::RightToLeft))
     {
       unsigned int k = child;
@@ -253,7 +264,7 @@ struct CursivePosFormat1
             hb_requires (hb_is_iterator (Iterator))>
   void serialize (hb_subset_context_t *c,
                   Iterator it,
-                  const void *src_base)
+                  const struct CursivePosFormat1 *src_base)
   {
     if (unlikely (!c->serializer->extend_min ((*this)))) return;
     this->format = 1;
@@ -278,7 +289,6 @@ struct CursivePosFormat1
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
-    if (unlikely (!out)) return_trace (false);
 
     auto it =
     + hb_zip (this+coverage, entryExitRecord)
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/GPOS.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/GPOS.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/GPOS.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/GPOS.hh	2024-11-20 13:56:33.000000000 +0000
@@ -156,7 +156,7 @@ GPOS::position_finish_offsets (hb_font_t
   {
     for (unsigned i = 0; i < len; i++)
       if (unlikely (pos[i].y_offset))
-        pos[i].x_offset += _hb_roundf (font->slant_xy * pos[i].y_offset);
+        pos[i].x_offset += roundf (font->slant_xy * pos[i].y_offset);
   }
 }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/LigatureArray.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/LigatureArray.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/LigatureArray.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/LigatureArray.hh	2024-11-20 13:56:33.000000000 +0000
@@ -27,6 +27,7 @@ struct LigatureArray : List16OfOffset16T
     auto *out = c->serializer->start_embed (this);
     if (unlikely (!c->serializer->extend_min (out)))  return_trace (false);
 
+    bool ret = false;
     for (const auto _ : + hb_zip (coverage, *this)
                   | hb_filter (glyphset, hb_first))
     {
@@ -38,13 +39,13 @@ struct LigatureArray : List16OfOffset16T
           + hb_range (src.rows * class_count)
           | hb_filter ([=] (unsigned index) { return klass_mapping->has (index % class_count); })
           ;
-      matrix->serialize_subset (c,
-                                _.second,
-                                this,
-                                src.rows,
-                                indexes);
+      ret |= matrix->serialize_subset (c,
+				       _.second,
+				       this,
+				       src.rows,
+				       indexes);
     }
-    return_trace (this->len);
+    return_trace (ret);
   }
 };
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkArray.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkArray.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkArray.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkArray.hh	2024-11-20 13:56:33.000000000 +0000
@@ -28,7 +28,7 @@ struct MarkArray : Array16Of<MarkRecord>
 
     const Anchor& mark_anchor = this + record.markAnchor;
     bool found;
-    const Anchor& glyph_anchor = anchors.get_anchor (glyph_index, mark_class, class_count, &found);
+    const Anchor& glyph_anchor = anchors.get_anchor (c, glyph_index, mark_class, class_count, &found);
     /* If this subtable doesn't have an anchor for this base and this class,
      * return false such that the subsequent subtables have a chance at it. */
     if (unlikely (!found)) return_trace (false);
@@ -82,10 +82,10 @@ struct MarkArray : Array16Of<MarkRecord>
     | hb_map (hb_second)
     ;
 
+    bool ret = false;
     unsigned new_length = 0;
     for (const auto& mark_record : mark_iter) {
-      if (unlikely (!mark_record.subset (c, this, klass_mapping)))
-        return_trace (false);
+      ret |= mark_record.subset (c, this, klass_mapping);
       new_length++;
     }
 
@@ -93,7 +93,7 @@ struct MarkArray : Array16Of<MarkRecord>
                                                 HB_SERIALIZE_ERROR_ARRAY_OVERFLOW)))
       return_trace (false);
 
-    return_trace (true);
+    return_trace (ret);
   }
 };
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkBasePosFormat1.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkBasePosFormat1.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkBasePosFormat1.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkBasePosFormat1.hh	2024-11-20 13:56:33.000000000 +0000
@@ -197,9 +197,10 @@ struct MarkBasePosFormat1_2
     if (!out->markCoverage.serialize_serialize (c->serializer, new_coverage.iter ()))
       return_trace (false);
 
-    out->markArray.serialize_subset (c, markArray, this,
-                                     (this+markCoverage).iter (),
-                                     &klass_mapping);
+    if (unlikely (!out->markArray.serialize_subset (c, markArray, this,
+						    (this+markCoverage).iter (),
+						    &klass_mapping)))
+      return_trace (false);
 
     unsigned basecount = (this+baseArray).rows;
     auto base_iter =
@@ -228,11 +229,9 @@ struct MarkBasePosFormat1_2
       ;
     }
 
-    out->baseArray.serialize_subset (c, baseArray, this,
-                                     base_iter.len (),
-                                     base_indexes.iter ());
-
-    return_trace (true);
+    return_trace (out->baseArray.serialize_subset (c, baseArray, this,
+						   base_iter.len (),
+						   base_indexes.iter ()));
   }
 };
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkLigPosFormat1.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkLigPosFormat1.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkLigPosFormat1.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkLigPosFormat1.hh	2024-11-20 13:56:33.000000000 +0000
@@ -169,7 +169,7 @@ struct MarkLigPosFormat1_2
   {
     TRACE_SUBSET (this);
     const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
-    const hb_map_t &glyph_map = *c->plan->glyph_map;
+    const hb_map_t &glyph_map = c->plan->glyph_map_gsub;
 
     auto *out = c->serializer->start_embed (*this);
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
@@ -195,23 +195,24 @@ struct MarkLigPosFormat1_2
     if (!out->markCoverage.serialize_serialize (c->serializer, new_mark_coverage))
       return_trace (false);
 
-    out->markArray.serialize_subset (c, markArray, this,
-                                     (this+markCoverage).iter (),
-                                     &klass_mapping);
+    if (unlikely (!out->markArray.serialize_subset (c, markArray, this,
+						    (this+markCoverage).iter (),
+						    &klass_mapping)))
+      return_trace (false);
 
     auto new_ligature_coverage =
     + hb_iter (this + ligatureCoverage)
-    | hb_filter (glyphset)
+    | hb_take ((this + ligatureArray).len)
     | hb_map_retains_sorting (glyph_map)
+    | hb_filter ([] (hb_codepoint_t glyph) { return glyph != HB_MAP_VALUE_INVALID; })
     ;
 
     if (!out->ligatureCoverage.serialize_serialize (c->serializer, new_ligature_coverage))
       return_trace (false);
 
-    out->ligatureArray.serialize_subset (c, ligatureArray, this,
-                                         hb_iter (this+ligatureCoverage), classCount, &klass_mapping);
-
-    return_trace (true);
+    return_trace (out->ligatureArray.serialize_subset (c, ligatureArray, this,
+						       hb_iter (this+ligatureCoverage),
+						       classCount, &klass_mapping));
   }
 
 };
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh	2024-11-20 13:56:33.000000000 +0000
@@ -42,6 +42,7 @@ struct MarkMarkPosFormat1_2
                   mark1Coverage.sanitize (c, this) &&
                   mark2Coverage.sanitize (c, this) &&
                   mark1Array.sanitize (c, this) &&
+		  hb_barrier () &&
                   mark2Array.sanitize (c, this, (unsigned int) classCount));
   }
 
@@ -100,16 +101,16 @@ struct MarkMarkPosFormat1_2
 
     /* now we search backwards for a suitable mark glyph until a non-mark glyph */
     hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
-    skippy_iter.reset (buffer->idx, 1);
+    skippy_iter.reset_fast (buffer->idx);
     skippy_iter.set_lookup_props (c->lookup_props & ~(uint32_t)LookupFlag::IgnoreFlags);
     unsigned unsafe_from;
-    if (!skippy_iter.prev (&unsafe_from))
+    if (unlikely (!skippy_iter.prev (&unsafe_from)))
     {
       buffer->unsafe_to_concat_from_outbuffer (unsafe_from, buffer->idx + 1);
       return_trace (false);
     }
 
-    if (!_hb_glyph_info_is_mark (&buffer->info[skippy_iter.idx]))
+    if (likely (!_hb_glyph_info_is_mark (&buffer->info[skippy_iter.idx])))
     {
       buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1);
       return_trace (false);
@@ -183,9 +184,10 @@ struct MarkMarkPosFormat1_2
     if (!out->mark1Coverage.serialize_serialize (c->serializer, new_coverage.iter ()))
       return_trace (false);
 
-    out->mark1Array.serialize_subset (c, mark1Array, this,
-                                      (this+mark1Coverage).iter (),
-                                      &klass_mapping);
+    if (unlikely (!out->mark1Array.serialize_subset (c, mark1Array, this,
+						     (this+mark1Coverage).iter (),
+						     &klass_mapping)))
+      return_trace (false);
 
     unsigned mark2count = (this+mark2Array).rows;
     auto mark2_iter =
@@ -214,9 +216,10 @@ struct MarkMarkPosFormat1_2
       ;
     }
 
-    out->mark2Array.serialize_subset (c, mark2Array, this, mark2_iter.len (), mark2_indexes.iter ());
+    return_trace (out->mark2Array.serialize_subset (c, mark2Array, this,
+						    mark2_iter.len (),
+						    mark2_indexes.iter ()));
 
-    return_trace (true);
   }
 };
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkRecord.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkRecord.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkRecord.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkRecord.hh	2024-11-20 13:56:33.000000000 +0000
@@ -24,17 +24,16 @@ struct MarkRecord
     return_trace (c->check_struct (this) && markAnchor.sanitize (c, base));
   }
 
-  MarkRecord *subset (hb_subset_context_t    *c,
-                      const void             *src_base,
-                      const hb_map_t         *klass_mapping) const
+  bool subset (hb_subset_context_t    *c,
+	       const void             *src_base,
+	       const hb_map_t         *klass_mapping) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->embed (this);
-    if (unlikely (!out)) return_trace (nullptr);
+    if (unlikely (!out)) return_trace (false);
 
     out->klass = klass_mapping->get (klass);
-    out->markAnchor.serialize_subset (c, markAnchor, src_base);
-    return_trace (out);
+    return_trace (out->markAnchor.serialize_subset (c, markAnchor, src_base));
   }
 
   void collect_variation_indices (hb_collect_variation_indices_context_t *c,
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat1.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat1.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat1.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat1.hh	2024-11-20 13:56:33.000000000 +0000
@@ -36,6 +36,7 @@ struct PairPosFormat1_3
     TRACE_SANITIZE (this);
 
     if (!c->check_struct (this)) return_trace (false);
+    hb_barrier ();
 
     unsigned int len1 = valueFormat[0].get_len ();
     unsigned int len2 = valueFormat[1].get_len ();
@@ -110,9 +111,9 @@ struct PairPosFormat1_3
     if (likely (index == NOT_COVERED)) return_trace (false);
 
     hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
-    skippy_iter.reset (buffer->idx, 1);
+    skippy_iter.reset_fast (buffer->idx);
     unsigned unsafe_to;
-    if (!skippy_iter.next (&unsafe_to))
+    if (unlikely (!skippy_iter.next (&unsafe_to)))
     {
       buffer->unsafe_to_concat (buffer->idx, unsafe_to);
       return_trace (false);
@@ -131,20 +132,33 @@ struct PairPosFormat1_3
     auto *out = c->serializer->start_embed (*this);
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
     out->format = format;
-    out->valueFormat[0] = valueFormat[0];
-    out->valueFormat[1] = valueFormat[1];
-    if (c->plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
-    {
-      hb_pair_t<unsigned, unsigned> newFormats = compute_effective_value_formats (glyphset);
-      out->valueFormat[0] = newFormats.first;
-      out->valueFormat[1] = newFormats.second;
-    }
 
-    if (c->plan->all_axes_pinned)
+    hb_pair_t<unsigned, unsigned> newFormats = hb_pair (valueFormat[0], valueFormat[1]);
+
+    if (c->plan->normalized_coords)
+    {
+      /* all device flags will be dropped when full instancing, no need to strip
+       * hints, also do not strip emtpy cause we don't compute the new default
+       * value during stripping */
+      newFormats = compute_effective_value_formats (glyphset, false, false, &c->plan->layout_variation_idx_delta_map);
+    }
+    /* do not strip hints for VF */
+    else if (c->plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
     {
-      out->valueFormat[0] = out->valueFormat[0].drop_device_table_flags ();
-      out->valueFormat[1] = out->valueFormat[1].drop_device_table_flags ();
+      hb_blob_t* blob = hb_face_reference_table (c->plan->source, HB_TAG ('f','v','a','r'));
+      bool has_fvar = (blob != hb_blob_get_empty ());
+      hb_blob_destroy (blob);
+
+      bool strip = !has_fvar;
+      /* special case: strip hints when a VF has no GDEF varstore after
+       * subsetting*/
+      if (has_fvar && !c->plan->has_gdef_varstore)
+        strip = true;
+      newFormats = compute_effective_value_formats (glyphset, strip, true);
     }
+    
+    out->valueFormat[0] = newFormats.first;
+    out->valueFormat[1] = newFormats.second;
 
     hb_sorted_vector_t<hb_codepoint_t> new_coverage;
 
@@ -175,7 +189,9 @@ struct PairPosFormat1_3
   }
 
 
-  hb_pair_t<unsigned, unsigned> compute_effective_value_formats (const hb_set_t& glyphset) const
+  hb_pair_t<unsigned, unsigned> compute_effective_value_formats (const hb_set_t& glyphset,
+                                                                 bool strip_hints, bool strip_empty,
+                                                                 const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *varidx_delta_map = nullptr) const
   {
     unsigned record_size = PairSet::get_size (valueFormat);
 
@@ -195,8 +211,8 @@ struct PairPosFormat1_3
       {
         if (record->intersects (glyphset))
         {
-          format1 = format1 | valueFormat[0].get_effective_format (record->get_values_1 ());
-          format2 = format2 | valueFormat[1].get_effective_format (record->get_values_2 (valueFormat[0]));
+          format1 = format1 | valueFormat[0].get_effective_format (record->get_values_1 (), strip_hints, strip_empty, &set, varidx_delta_map);
+          format2 = format2 | valueFormat[1].get_effective_format (record->get_values_2 (valueFormat[0]), strip_hints, strip_empty, &set, varidx_delta_map);
         }
         record = &StructAtOffset<const PairValueRecord> (record, record_size);
       }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat2.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat2.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat2.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat2.hh	2024-11-20 13:56:33.000000000 +0000
@@ -8,7 +8,7 @@ namespace Layout {
 namespace GPOS_impl {
 
 template <typename Types>
-struct PairPosFormat2_4
+struct PairPosFormat2_4 : ValueBase
 {
   protected:
   HBUINT16      format;                 /* Format identifier--format = 2 */
@@ -50,13 +50,13 @@ struct PairPosFormat2_4
     unsigned int len1 = valueFormat1.get_len ();
     unsigned int len2 = valueFormat2.get_len ();
     unsigned int stride = HBUINT16::static_size * (len1 + len2);
-    unsigned int record_size = valueFormat1.get_size () + valueFormat2.get_size ();
     unsigned int count = (unsigned int) class1Count * (unsigned int) class2Count;
     return_trace (c->check_range ((const void *) values,
                                   count,
-                                  record_size) &&
-                  valueFormat1.sanitize_values_stride_unsafe (c, this, &values[0], count, stride) &&
-                  valueFormat2.sanitize_values_stride_unsafe (c, this, &values[len1], count, stride));
+                                  stride) &&
+		  (c->lazy_some_gpos ||
+		   (valueFormat1.sanitize_values_stride_unsafe (c, this, &values[0], count, stride) &&
+		    valueFormat2.sanitize_values_stride_unsafe (c, this, &values[len1], count, stride))));
   }
 
   bool intersects (const hb_set_t *glyphs) const
@@ -131,40 +131,46 @@ struct PairPosFormat2_4
     if (likely (index == NOT_COVERED)) return_trace (false);
 
     hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
-    skippy_iter.reset (buffer->idx, 1);
+    skippy_iter.reset_fast (buffer->idx);
     unsigned unsafe_to;
-    if (!skippy_iter.next (&unsafe_to))
+    if (unlikely (!skippy_iter.next (&unsafe_to)))
     {
       buffer->unsafe_to_concat (buffer->idx, unsafe_to);
       return_trace (false);
     }
 
-    unsigned int len1 = valueFormat1.get_len ();
-    unsigned int len2 = valueFormat2.get_len ();
-    unsigned int record_len = len1 + len2;
+    unsigned int klass2 = (this+classDef2).get_class (buffer->info[skippy_iter.idx].codepoint);
+    if (!klass2)
+    {
+      buffer->unsafe_to_concat (buffer->idx, skippy_iter.idx + 1);
+      return_trace (false);
+    }
 
     unsigned int klass1 = (this+classDef1).get_class (buffer->cur().codepoint);
-    unsigned int klass2 = (this+classDef2).get_class (buffer->info[skippy_iter.idx].codepoint);
     if (unlikely (klass1 >= class1Count || klass2 >= class2Count))
     {
       buffer->unsafe_to_concat (buffer->idx, skippy_iter.idx + 1);
       return_trace (false);
     }
 
+    unsigned int len1 = valueFormat1.get_len ();
+    unsigned int len2 = valueFormat2.get_len ();
+    unsigned int record_len = len1 + len2;
+
     const Value *v = &values[record_len * (klass1 * class2Count + klass2)];
 
     bool applied_first = false, applied_second = false;
 
 
     /* Isolate simple kerning and apply it half to each side.
-     * Results in better cursor positinoing / underline drawing.
+     * Results in better cursor positioning / underline drawing.
      *
      * Disabled, because causes issues... :-(
      * https://github.com/harfbuzz/harfbuzz/issues/3408
      * https://github.com/harfbuzz/harfbuzz/pull/3235#issuecomment-1029814978
      */
 #ifndef HB_SPLIT_KERN
-    if (0)
+    if (false)
 #endif
     {
       if (!len2)
@@ -224,8 +230,8 @@ struct PairPosFormat2_4
 			  c->buffer->idx, skippy_iter.idx);
     }
 
-    applied_first = valueFormat1.apply_value (c, this, v, buffer->cur_pos());
-    applied_second = valueFormat2.apply_value (c, this, v + len1, buffer->pos[skippy_iter.idx]);
+    applied_first = len1 && valueFormat1.apply_value (c, this, v, buffer->cur_pos());
+    applied_second = len2 && valueFormat2.apply_value (c, this, v + len1, buffer->pos[skippy_iter.idx]);
 
     if (applied_first || applied_second)
       if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ())
@@ -281,44 +287,52 @@ struct PairPosFormat2_4
     unsigned len2 = valueFormat2.get_len ();
 
     hb_pair_t<unsigned, unsigned> newFormats = hb_pair (valueFormat1, valueFormat2);
-    if (c->plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
-      newFormats = compute_effective_value_formats (klass1_map, klass2_map);
-
-    out->valueFormat1 = newFormats.first;
-    out->valueFormat2 = newFormats.second;
 
-    if (c->plan->all_axes_pinned)
+    if (c->plan->normalized_coords)
     {
-      out->valueFormat1 = out->valueFormat1.drop_device_table_flags ();
-      out->valueFormat2 = out->valueFormat2.drop_device_table_flags ();
+      /* in case of full instancing, all var device flags will be dropped so no
+       * need to strip hints here */
+      newFormats = compute_effective_value_formats (klass1_map, klass2_map, false, false, &c->plan->layout_variation_idx_delta_map);
+    }
+    /* do not strip hints for VF */
+    else if (c->plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
+    {
+      hb_blob_t* blob = hb_face_reference_table (c->plan->source, HB_TAG ('f','v','a','r'));
+      bool has_fvar = (blob != hb_blob_get_empty ());
+      hb_blob_destroy (blob);
+
+      bool strip = !has_fvar;
+      /* special case: strip hints when a VF has no GDEF varstore after
+       * subsetting*/
+      if (has_fvar && !c->plan->has_gdef_varstore)
+        strip = true;
+      newFormats = compute_effective_value_formats (klass1_map, klass2_map, strip, true);
     }
 
+    out->valueFormat1 = newFormats.first;
+    out->valueFormat2 = newFormats.second;
+
+    unsigned total_len = len1 + len2;
+    hb_vector_t<unsigned> class2_idxs (+ hb_range ((unsigned) class2Count) | hb_filter (klass2_map));
     for (unsigned class1_idx : + hb_range ((unsigned) class1Count) | hb_filter (klass1_map))
     {
-      for (unsigned class2_idx : + hb_range ((unsigned) class2Count) | hb_filter (klass2_map))
+      for (unsigned class2_idx : class2_idxs)
       {
-        unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * (len1 + len2);
+        unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * total_len;
         valueFormat1.copy_values (c->serializer, out->valueFormat1, this, &values[idx], &c->plan->layout_variation_idx_delta_map);
         valueFormat2.copy_values (c->serializer, out->valueFormat2, this, &values[idx + len1], &c->plan->layout_variation_idx_delta_map);
       }
     }
 
-    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
-    const hb_map_t &glyph_map = *c->plan->glyph_map;
-
-    auto it =
-    + hb_iter (this+coverage)
-    | hb_filter (glyphset)
-    | hb_map_retains_sorting (glyph_map)
-    ;
-
-    out->coverage.serialize_serialize (c->serializer, it);
-    return_trace (out->class1Count && out->class2Count && bool (it));
+    bool ret = out->coverage.serialize_subset(c, coverage, this);
+    return_trace (out->class1Count && out->class2Count && ret);
   }
 
 
   hb_pair_t<unsigned, unsigned> compute_effective_value_formats (const hb_map_t& klass1_map,
-                                                                 const hb_map_t& klass2_map) const
+                                                                 const hb_map_t& klass2_map,
+                                                                 bool strip_hints, bool strip_empty,
+                                                                 const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *varidx_delta_map = nullptr) const
   {
     unsigned len1 = valueFormat1.get_len ();
     unsigned len2 = valueFormat2.get_len ();
@@ -332,8 +346,8 @@ struct PairPosFormat2_4
       for (unsigned class2_idx : + hb_range ((unsigned) class2Count) | hb_filter (klass2_map))
       {
         unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * record_size;
-        format1 = format1 | valueFormat1.get_effective_format (&values[idx]);
-        format2 = format2 | valueFormat2.get_effective_format (&values[idx + len1]);
+        format1 = format1 | valueFormat1.get_effective_format (&values[idx], strip_hints, strip_empty, this, varidx_delta_map);
+        format2 = format2 | valueFormat2.get_effective_format (&values[idx + len1], strip_hints, strip_empty, this, varidx_delta_map);
       }
 
       if (format1 == valueFormat1 && format2 == valueFormat2)
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairSet.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairSet.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairSet.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairSet.hh	2024-11-20 13:56:33.000000000 +0000
@@ -9,7 +9,7 @@ namespace GPOS_impl {
 
 
 template <typename Types>
-struct PairSet
+struct PairSet : ValueBase
 {
   template <typename Types2>
   friend struct PairPosFormat1_3;
@@ -45,15 +45,18 @@ struct PairSet
   bool sanitize (hb_sanitize_context_t *c, const sanitize_closure_t *closure) const
   {
     TRACE_SANITIZE (this);
-    if (!(c->check_struct (this)
-       && c->check_range (&firstPairValueRecord,
+    if (!(c->check_struct (this) &&
+	  hb_barrier () &&
+          c->check_range (&firstPairValueRecord,
                           len,
                           closure->stride))) return_trace (false);
+    hb_barrier ();
 
     unsigned int count = len;
     const PairValueRecord *record = &firstPairValueRecord;
-    return_trace (closure->valueFormats[0].sanitize_values_stride_unsafe (c, this, &record->values[0], count, closure->stride) &&
-                  closure->valueFormats[1].sanitize_values_stride_unsafe (c, this, &record->values[closure->len1], count, closure->stride));
+    return_trace (c->lazy_some_gpos ||
+		  (closure->valueFormats[0].sanitize_values_stride_unsafe (c, this, &record->values[0], count, closure->stride) &&
+                   closure->valueFormats[1].sanitize_values_stride_unsafe (c, this, &record->values[closure->len1], count, closure->stride)));
   }
 
   bool intersects (const hb_set_t *glyphs,
@@ -120,8 +123,8 @@ struct PairSet
 			    c->buffer->idx, pos);
       }
 
-      bool applied_first = valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos());
-      bool applied_second = valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]);
+      bool applied_first = len1 && valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos());
+      bool applied_second = len2 && valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]);
 
       if (applied_first || applied_second)
 	if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ())
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairValueRecord.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairValueRecord.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairValueRecord.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairValueRecord.hh	2024-11-20 13:56:33.000000000 +0000
@@ -22,14 +22,14 @@ struct PairValueRecord
   ValueRecord   values;                 /* Positioning data for the first glyph
                                          * followed by for second glyph */
   public:
-  DEFINE_SIZE_ARRAY (Types::size, values);
+  DEFINE_SIZE_ARRAY (Types::HBGlyphID::static_size, values);
 
   int cmp (hb_codepoint_t k) const
   { return secondGlyph.cmp (k); }
 
   struct context_t
   {
-    const void          *base;
+    const ValueBase     *base;
     const ValueFormat   *valueFormats;
     const ValueFormat   *newFormats;
     unsigned            len1; /* valueFormats[0].get_len() */
@@ -62,7 +62,7 @@ struct PairValueRecord
 
   void collect_variation_indices (hb_collect_variation_indices_context_t *c,
                                   const ValueFormat *valueFormats,
-                                  const void *base) const
+                                  const ValueBase *base) const
   {
     unsigned record1_len = valueFormats[0].get_len ();
     unsigned record2_len = valueFormats[1].get_len ();
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePos.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePos.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePos.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePos.hh	2024-11-20 13:56:33.000000000 +0000
@@ -39,14 +39,12 @@ struct SinglePos
                   const SrcLookup* src,
                   Iterator glyph_val_iter_pairs,
                   const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map,
-                  bool all_axes_pinned)
+                  unsigned newFormat)
   {
     if (unlikely (!c->extend_min (u.format))) return;
     unsigned format = 2;
-    ValueFormat new_format = src->get_value_format ();
-
-    if (all_axes_pinned)
-      new_format = new_format.drop_device_table_flags ();
+    ValueFormat new_format;
+    new_format = newFormat;
 
     if (glyph_val_iter_pairs)
       format = get_format (glyph_val_iter_pairs);
@@ -89,8 +87,8 @@ SinglePos_serialize (hb_serialize_contex
                      const SrcLookup *src,
                      Iterator it,
                      const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map,
-                     bool all_axes_pinned)
-{ c->start_embed<SinglePos> ()->serialize (c, src, it, layout_variation_idx_delta_map, all_axes_pinned); }
+                     unsigned new_format)
+{ c->start_embed<SinglePos> ()->serialize (c, src, it, layout_variation_idx_delta_map, new_format); }
 
 
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat1.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat1.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat1.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat1.hh	2024-11-20 13:56:33.000000000 +0000
@@ -8,7 +8,7 @@ namespace OT {
 namespace Layout {
 namespace GPOS_impl {
 
-struct SinglePosFormat1
+struct SinglePosFormat1 : ValueBase
 {
   protected:
   HBUINT16      format;                 /* Format identifier--format = 1 */
@@ -28,6 +28,7 @@ struct SinglePosFormat1
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
                   coverage.sanitize (c, this) &&
+		  hb_barrier () &&
                   /* The coverage  table may use a range to represent a set
                    * of glyphs, which means a small number of bytes can
                    * generate a large glyph set. Manually modify the
@@ -90,6 +91,7 @@ struct SinglePosFormat1
 
   bool
   position_single (hb_font_t           *font,
+		   hb_blob_t           *table_blob,
 		   hb_direction_t       direction,
 		   hb_codepoint_t       gid,
 		   hb_glyph_position_t &pos) const
@@ -100,7 +102,7 @@ struct SinglePosFormat1
     /* This is ugly... */
     hb_buffer_t buffer;
     buffer.props.direction = direction;
-    OT::hb_ot_apply_context_t c (1, font, &buffer);
+    OT::hb_ot_apply_context_t c (1, font, &buffer, table_blob);
 
     valueFormat.apply_value (&c, this, values, pos);
     return true;
@@ -145,6 +147,30 @@ struct SinglePosFormat1
     hb_set_t intersection;
     (this+coverage).intersect_set (glyphset, intersection);
 
+    unsigned new_format = valueFormat;
+
+    if (c->plan->normalized_coords)
+    {
+      new_format = valueFormat.get_effective_format (values.arrayZ, false, false, this, &c->plan->layout_variation_idx_delta_map);
+    }
+    /* do not strip hints for VF */
+    else if (c->plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
+    {
+      hb_blob_t* blob = hb_face_reference_table (c->plan->source, HB_TAG ('f','v','a','r'));
+      bool has_fvar = (blob != hb_blob_get_empty ());
+      hb_blob_destroy (blob);
+
+      bool strip = !has_fvar;
+      /* special case: strip hints when a VF has no GDEF varstore after
+       * subsetting*/
+      if (has_fvar && !c->plan->has_gdef_varstore)
+        strip = true;
+      new_format = valueFormat.get_effective_format (values.arrayZ,
+                                                     strip, /* strip hints */
+                                                     true, /* strip empty */
+                                                     this, nullptr);
+    }
+
     auto it =
     + hb_iter (intersection)
     | hb_map_retains_sorting (glyph_map)
@@ -152,7 +178,7 @@ struct SinglePosFormat1
     ;
 
     bool ret = bool (it);
-    SinglePos_serialize (c->serializer, this, it, &c->plan->layout_variation_idx_delta_map, c->plan->all_axes_pinned);
+    SinglePos_serialize (c->serializer, this, it, &c->plan->layout_variation_idx_delta_map, new_format);
     return_trace (ret);
   }
 };
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat2.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat2.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat2.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat2.hh	2024-11-20 13:56:33.000000000 +0000
@@ -7,7 +7,7 @@ namespace OT {
 namespace Layout {
 namespace GPOS_impl {
 
-struct SinglePosFormat2
+struct SinglePosFormat2 : ValueBase
 {
   protected:
   HBUINT16      format;                 /* Format identifier--format = 2 */
@@ -94,6 +94,7 @@ struct SinglePosFormat2
 
   bool
   position_single (hb_font_t           *font,
+		   hb_blob_t           *table_blob,
 		   hb_direction_t       direction,
 		   hb_codepoint_t       gid,
 		   hb_glyph_position_t &pos) const
@@ -105,7 +106,7 @@ struct SinglePosFormat2
     /* This is ugly... */
     hb_buffer_t buffer;
     buffer.props.direction = direction;
-    OT::hb_ot_apply_context_t c (1, font, &buffer);
+    OT::hb_ot_apply_context_t c (1, font, &buffer, table_blob);
 
     valueFormat.apply_value (&c, this,
                              &values[index * valueFormat.get_len ()],
@@ -142,6 +143,37 @@ struct SinglePosFormat2
     coverage.serialize_serialize (c, glyphs);
   }
 
+  template<typename Iterator,
+      hb_requires (hb_is_iterator (Iterator))>
+  unsigned compute_effective_format (const hb_face_t *face,
+                                     Iterator it,
+                                     bool is_instancing, bool strip_hints,
+                                     bool has_gdef_varstore,
+                                     const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *varidx_delta_map) const
+  {
+    hb_blob_t* blob = hb_face_reference_table (face, HB_TAG ('f','v','a','r'));
+    bool has_fvar = (blob != hb_blob_get_empty ());
+    hb_blob_destroy (blob);
+
+    unsigned new_format = 0;
+    if (is_instancing)
+    {
+      new_format = new_format | valueFormat.get_effective_format (+ it | hb_map (hb_second), false, false, this, varidx_delta_map);
+    }
+    /* do not strip hints for VF */
+    else if (strip_hints)
+    {
+      bool strip = !has_fvar;
+      if (has_fvar && !has_gdef_varstore)
+        strip = true;
+      new_format = new_format | valueFormat.get_effective_format (+ it | hb_map (hb_second), strip, true, this, nullptr);
+    }
+    else
+      new_format = valueFormat;
+
+    return new_format;
+  }
+
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
@@ -162,8 +194,13 @@ struct SinglePosFormat2
                               })
     ;
 
+    unsigned new_format = compute_effective_format (c->plan->source, it,
+                                                    bool (c->plan->normalized_coords),
+                                                    bool (c->plan->flags & HB_SUBSET_FLAGS_NO_HINTING),
+                                                    c->plan->has_gdef_varstore,
+                                                    &c->plan->layout_variation_idx_delta_map);
     bool ret = bool (it);
-    SinglePos_serialize (c->serializer, this, it, &c->plan->layout_variation_idx_delta_map, c->plan->all_axes_pinned);
+    SinglePos_serialize (c->serializer, this, it, &c->plan->layout_variation_idx_delta_map, new_format);
     return_trace (ret);
   }
 };
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/ValueFormat.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/ValueFormat.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/ValueFormat.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/ValueFormat.hh	2024-11-20 13:56:33.000000000 +0000
@@ -9,6 +9,8 @@ namespace GPOS_impl {
 
 typedef HBUINT16 Value;
 
+struct ValueBase {}; // Dummy base class tag for OffsetTo<Value> bases.
+
 typedef UnsizedArrayOf<Value> ValueRecord;
 
 struct ValueFormat : HBUINT16
@@ -78,7 +80,7 @@ struct ValueFormat : HBUINT16
   }
 
   bool apply_value (hb_ot_apply_context_t *c,
-                    const void            *base,
+                    const ValueBase       *base,
                     const Value           *values,
                     hb_glyph_position_t   &glyph_pos) const
   {
@@ -114,35 +116,57 @@ struct ValueFormat : HBUINT16
 
     if (!use_x_device && !use_y_device) return ret;
 
-    const VariationStore &store = c->var_store;
+    const ItemVariationStore &store = c->var_store;
     auto *cache = c->var_store_cache;
 
     /* pixel -> fractional pixel */
-    if (format & xPlaDevice) {
-      if (use_x_device) glyph_pos.x_offset  += (base + get_device (values, &ret)).get_x_delta (font, store, cache);
+    if (format & xPlaDevice)
+    {
+      if (use_x_device) glyph_pos.x_offset  += get_device (values, &ret, base, c->sanitizer).get_x_delta (font, store, cache);
       values++;
     }
-    if (format & yPlaDevice) {
-      if (use_y_device) glyph_pos.y_offset  += (base + get_device (values, &ret)).get_y_delta (font, store, cache);
+    if (format & yPlaDevice)
+    {
+      if (use_y_device) glyph_pos.y_offset  += get_device (values, &ret, base, c->sanitizer).get_y_delta (font, store, cache);
       values++;
     }
-    if (format & xAdvDevice) {
-      if (horizontal && use_x_device) glyph_pos.x_advance += (base + get_device (values, &ret)).get_x_delta (font, store, cache);
+    if (format & xAdvDevice)
+    {
+      if (horizontal && use_x_device) glyph_pos.x_advance += get_device (values, &ret, base, c->sanitizer).get_x_delta (font, store, cache);
       values++;
     }
-    if (format & yAdvDevice) {
+    if (format & yAdvDevice)
+    {
       /* y_advance values grow downward but font-space grows upward, hence negation */
-      if (!horizontal && use_y_device) glyph_pos.y_advance -= (base + get_device (values, &ret)).get_y_delta (font, store, cache);
+      if (!horizontal && use_y_device) glyph_pos.y_advance -= get_device (values, &ret, base, c->sanitizer).get_y_delta (font, store, cache);
       values++;
     }
     return ret;
   }
 
-  unsigned int get_effective_format (const Value *values) const
+  unsigned int get_effective_format (const Value *values, bool strip_hints, bool strip_empty, const ValueBase *base,
+                                     const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *varidx_delta_map) const
   {
     unsigned int format = *this;
     for (unsigned flag = xPlacement; flag <= yAdvDevice; flag = flag << 1) {
-      if (format & flag) should_drop (*values++, (Flags) flag, &format);
+      if (format & flag)
+      {
+        if (strip_hints && flag >= xPlaDevice)
+        {
+          format = format & ~flag;
+          values++;
+          continue;
+        }
+        if (varidx_delta_map && flag >= xPlaDevice)
+        {
+          update_var_flag (values++, (Flags) flag, &format, base, varidx_delta_map);
+          continue;
+        }
+        /* do not strip empty when instancing, cause we don't know whether the new
+         * default value is 0 or not */
+        if (strip_empty) should_drop (*values, (Flags) flag, &format);
+        values++;
+      }
     }
 
     return format;
@@ -150,18 +174,19 @@ struct ValueFormat : HBUINT16
 
   template<typename Iterator,
       hb_requires (hb_is_iterator (Iterator))>
-  unsigned int get_effective_format (Iterator it) const {
+  unsigned int get_effective_format (Iterator it, bool strip_hints, bool strip_empty, const ValueBase *base,
+                                     const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *varidx_delta_map) const {
     unsigned int new_format = 0;
 
     for (const hb_array_t<const Value>& values : it)
-      new_format = new_format | get_effective_format (&values);
+      new_format = new_format | get_effective_format (&values, strip_hints, strip_empty, base, varidx_delta_map);
 
     return new_format;
   }
 
   void copy_values (hb_serialize_context_t *c,
                     unsigned int new_format,
-                    const void *base,
+                    const ValueBase *base,
                     const Value *values,
                     const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map) const
   {
@@ -174,6 +199,9 @@ struct ValueFormat : HBUINT16
     if (format & xAdvance)   x_adv = copy_value (c, new_format, xAdvance, *values++);
     if (format & yAdvance)   y_adv = copy_value (c, new_format, yAdvance, *values++);
 
+    if (!has_device ())
+      return;
+
     if (format & xPlaDevice)
     {
       add_delta_to_value (x_placement, base, values, layout_variation_idx_delta_map);
@@ -210,7 +238,7 @@ struct ValueFormat : HBUINT16
   }
 
   void collect_variation_indices (hb_collect_variation_indices_context_t *c,
-                                  const void *base,
+                                  const ValueBase *base,
                                   const hb_array_t<const Value>& values) const
   {
     unsigned format = *this;
@@ -233,30 +261,19 @@ struct ValueFormat : HBUINT16
 
     if (format & ValueFormat::xAdvDevice)
     {
-
       (base + get_device (&(values[i]))).collect_variation_indices (c);
       i++;
     }
 
     if (format & ValueFormat::yAdvDevice)
     {
-
       (base + get_device (&(values[i]))).collect_variation_indices (c);
       i++;
     }
   }
 
-  unsigned drop_device_table_flags () const
-  {
-    unsigned format = *this;
-    for (unsigned flag = xPlaDevice; flag <= yAdvDevice; flag = flag << 1)
-      format = format & ~flag;
-
-    return format;
-  }
-
   private:
-  bool sanitize_value_devices (hb_sanitize_context_t *c, const void *base, const Value *values) const
+  bool sanitize_value_devices (hb_sanitize_context_t *c, const ValueBase *base, const Value *values) const
   {
     unsigned int format = *this;
 
@@ -273,18 +290,31 @@ struct ValueFormat : HBUINT16
     return true;
   }
 
-  static inline Offset16To<Device>& get_device (Value* value)
+  static inline Offset16To<Device, ValueBase>& get_device (Value* value)
   {
-    return *static_cast<Offset16To<Device> *> (value);
+    return *static_cast<Offset16To<Device, ValueBase> *> (value);
   }
-  static inline const Offset16To<Device>& get_device (const Value* value, bool *worked=nullptr)
+  static inline const Offset16To<Device, ValueBase>& get_device (const Value* value)
+  {
+    return *static_cast<const Offset16To<Device, ValueBase> *> (value);
+  }
+  static inline const Device& get_device (const Value* value,
+					  bool *worked,
+					  const ValueBase *base,
+					  hb_sanitize_context_t &c)
   {
     if (worked) *worked |= bool (*value);
-    return *static_cast<const Offset16To<Device> *> (value);
+    auto &offset = *static_cast<const Offset16To<Device> *> (value);
+
+    if (unlikely (!offset.sanitize (&c, base)))
+      return Null(Device);
+    hb_barrier ();
+
+    return base + offset;
   }
 
   void add_delta_to_value (HBINT16 *value,
-                           const void *base,
+                           const ValueBase *base,
                            const Value *src_value,
                            const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map) const
   {
@@ -296,7 +326,8 @@ struct ValueFormat : HBUINT16
     *value += hb_second (*varidx_delta);
   }
 
-  bool copy_device (hb_serialize_context_t *c, const void *base,
+  bool copy_device (hb_serialize_context_t *c,
+                    const ValueBase *base,
                     const Value *src_value,
                     const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map,
                     unsigned int new_format, Flags flag) const
@@ -337,32 +368,34 @@ struct ValueFormat : HBUINT16
     return (format & devices) != 0;
   }
 
-  bool sanitize_value (hb_sanitize_context_t *c, const void *base, const Value *values) const
+  bool sanitize_value (hb_sanitize_context_t *c, const ValueBase *base, const Value *values) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_range (values, get_size ()) && (!has_device () || sanitize_value_devices (c, base, values)));
+
+    if (unlikely (!c->check_range (values, get_size ()))) return_trace (false);
+
+    if (c->lazy_some_gpos)
+      return_trace (true);
+
+    return_trace (!has_device () || sanitize_value_devices (c, base, values));
   }
 
-  bool sanitize_values (hb_sanitize_context_t *c, const void *base, const Value *values, unsigned int count) const
+  bool sanitize_values (hb_sanitize_context_t *c, const ValueBase *base, const Value *values, unsigned int count) const
   {
     TRACE_SANITIZE (this);
-    unsigned int len = get_len ();
-
-    if (!c->check_range (values, count, get_size ())) return_trace (false);
+    unsigned size = get_size ();
 
-    if (!has_device ()) return_trace (true);
+    if (!c->check_range (values, count, size)) return_trace (false);
 
-    for (unsigned int i = 0; i < count; i++) {
-      if (!sanitize_value_devices (c, base, values))
-        return_trace (false);
-      values += len;
-    }
+    if (c->lazy_some_gpos)
+      return_trace (true);
 
-    return_trace (true);
+    hb_barrier ();
+    return_trace (sanitize_values_stride_unsafe (c, base, values, count, size));
   }
 
   /* Just sanitize referenced Device tables.  Doesn't check the values themselves. */
-  bool sanitize_values_stride_unsafe (hb_sanitize_context_t *c, const void *base, const Value *values, unsigned int count, unsigned int stride) const
+  bool sanitize_values_stride_unsafe (hb_sanitize_context_t *c, const ValueBase *base, const Value *values, unsigned int count, unsigned int stride) const
   {
     TRACE_SANITIZE (this);
 
@@ -385,6 +418,20 @@ struct ValueFormat : HBUINT16
     *format = *format & ~flag;
   }
 
+  void update_var_flag (const Value* value, Flags flag,
+                        unsigned int* format, const ValueBase *base,
+                        const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *varidx_delta_map) const
+  {
+    if (*value)
+    {
+      unsigned varidx = (base + get_device (value)).get_variation_index ();
+      hb_pair_t<unsigned, int> *varidx_delta;
+      if (varidx_delta_map->has (varidx, &varidx_delta) &&
+          varidx_delta->first != HB_OT_LAYOUT_NO_VARIATIONS_INDEX)
+        return;
+    }
+    *format = *format & ~flag;
+  }
 };
 
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Common.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Common.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Common.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Common.hh	2024-11-20 13:56:33.000000000 +0000
@@ -8,8 +8,6 @@ namespace OT {
 namespace Layout {
 namespace GSUB_impl {
 
-typedef hb_pair_t<hb_codepoint_t, hb_codepoint_t> hb_codepoint_pair_t;
-
 template<typename Iterator>
 static void SingleSubst_serialize (hb_serialize_context_t *c,
                                    Iterator it);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Ligature.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Ligature.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Ligature.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Ligature.hh	2024-11-20 13:56:33.000000000 +0000
@@ -10,10 +10,10 @@ namespace GSUB_impl {
 template <typename Types>
 struct Ligature
 {
-  protected:
+  public:
   typename Types::HBGlyphID
 		ligGlyph;               /* GlyphID of ligature to substitute */
-  HeadlessArrayOf<typename Types::HBGlyphID>
+  HeadlessArray16Of<typename Types::HBGlyphID>
 		component;              /* Array of component GlyphIDs--start
                                          * with the second  component--ordered
                                          * in writing direction */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/LigatureSet.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/LigatureSet.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/LigatureSet.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/LigatureSet.hh	2024-11-20 13:56:33.000000000 +0000
@@ -75,12 +75,69 @@ struct LigatureSet
   bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
+
     unsigned int num_ligs = ligature.len;
+
+#ifndef HB_NO_OT_RULESETS_FAST_PATH
+    if (HB_OPTIMIZE_SIZE_VAL || num_ligs <= 4)
+#endif
+    {
+    slow:
+      for (unsigned int i = 0; i < num_ligs; i++)
+      {
+	const auto &lig = this+ligature.arrayZ[i];
+	if (lig.apply (c)) return_trace (true);
+      }
+      return_trace (false);
+    }
+
+    /* This version is optimized for speed by matching the first component
+     * of the ligature here, instead of calling into the ligation code.
+     *
+     * This is replicated in ChainRuleSet and RuleSet. */
+
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    skippy_iter.reset (c->buffer->idx);
+    skippy_iter.set_match_func (match_always, nullptr);
+    skippy_iter.set_glyph_data ((HBUINT16 *) nullptr);
+    unsigned unsafe_to;
+    hb_codepoint_t first = (unsigned) -1;
+    bool matched = skippy_iter.next (&unsafe_to);
+    if (likely (matched))
+    {
+      first = c->buffer->info[skippy_iter.idx].codepoint;
+      unsafe_to = skippy_iter.idx + 1;
+
+      if (skippy_iter.may_skip (c->buffer->info[skippy_iter.idx]))
+      {
+	/* Can't use the fast path if eg. the next char is a default-ignorable
+	 * or other skippable. */
+        goto slow;
+      }
+    }
+    else
+      goto slow;
+
+    bool unsafe_to_concat = false;
+
     for (unsigned int i = 0; i < num_ligs; i++)
     {
-      const auto &lig = this+ligature[i];
-      if (lig.apply (c)) return_trace (true);
+      const auto &lig = this+ligature.arrayZ[i];
+      if (unlikely (lig.component.lenP1 <= 1) ||
+	  lig.component.arrayZ[0] == first)
+      {
+	if (lig.apply (c))
+	{
+	  if (unsafe_to_concat)
+	    c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to);
+	  return_trace (true);
+	}
+      }
+      else if (likely (lig.component.lenP1 > 1))
+        unsafe_to_concat = true;
     }
+    if (likely (unsafe_to_concat))
+      c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to);
 
     return_trace (false);
   }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh	2024-11-20 13:56:33.000000000 +0000
@@ -33,9 +33,11 @@ struct ReverseChainSingleSubstFormat1
     TRACE_SANITIZE (this);
     if (!(coverage.sanitize (c, this) && backtrack.sanitize (c, this)))
       return_trace (false);
+    hb_barrier ();
     const auto &lookahead = StructAfter<decltype (lookaheadX)> (backtrack);
     if (!lookahead.sanitize (c, this))
       return_trace (false);
+    hb_barrier ();
     const auto &substitute = StructAfter<decltype (substituteX)> (lookahead);
     return_trace (substitute.sanitize (c));
   }
@@ -109,12 +111,12 @@ struct ReverseChainSingleSubstFormat1
   bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
-    if (unlikely (c->nesting_level_left != HB_MAX_NESTING_LEVEL))
-      return_trace (false); /* No chaining to this type */
-
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur ().codepoint);
     if (likely (index == NOT_COVERED)) return_trace (false);
 
+    if (unlikely (c->nesting_level_left != HB_MAX_NESTING_LEVEL))
+      return_trace (false); /* No chaining to this type */
+
     const auto &lookahead = StructAfter<decltype (lookaheadX)> (backtrack);
     const auto &substitute = StructAfter<decltype (substituteX)> (lookahead);
 
@@ -191,7 +193,6 @@ struct ReverseChainSingleSubstFormat1
     TRACE_SERIALIZE (this);
 
     auto *out = c->serializer->start_embed (this);
-    if (unlikely (!c->serializer->check_success (out))) return_trace (false);
     if (unlikely (!c->serializer->embed (this->format))) return_trace (false);
     if (unlikely (!c->serializer->embed (this->coverage))) return_trace (false);
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Sequence.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Sequence.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Sequence.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Sequence.hh	2024-11-20 13:56:33.000000000 +0000
@@ -53,7 +53,7 @@ struct Sequence
       if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ())
       {
 	c->buffer->message (c->font,
-			    "replaced glyph at %u (multiple subtitution)",
+			    "replaced glyph at %u (multiple substitution)",
 			    c->buffer->idx - 1u);
       }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/SingleSubst.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/SingleSubst.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/SingleSubst.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/SingleSubst.hh	2024-11-20 13:56:33.000000000 +0000
@@ -57,7 +57,7 @@ struct SingleSubst
 
 #ifndef HB_NO_BEYOND_64K
        if (+ glyphs
-	   | hb_map_retains_sorting (hb_first)
+	   | hb_map_retains_sorting (hb_second)
 	   | hb_filter ([] (hb_codepoint_t gid) { return gid > 0xFFFFu; }))
        {
 	 format += 2;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/types.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/types.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/Layout/types.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/Layout/types.hh	2024-11-20 13:56:33.000000000 +0000
@@ -38,8 +38,8 @@ struct SmallTypes {
   using HBUINT = HBUINT16;
   using HBGlyphID = HBGlyphID16;
   using Offset = Offset16;
-  template <typename Type, bool has_null=true>
-  using OffsetTo = OT::Offset16To<Type, has_null>;
+  template <typename Type, typename BaseType=void, bool has_null=true>
+  using OffsetTo = OT::Offset16To<Type, BaseType, has_null>;
   template <typename Type>
   using ArrayOf = OT::Array16Of<Type>;
   template <typename Type>
@@ -52,8 +52,8 @@ struct MediumTypes {
   using HBUINT = HBUINT24;
   using HBGlyphID = HBGlyphID24;
   using Offset = Offset24;
-  template <typename Type, bool has_null=true>
-  using OffsetTo = OT::Offset24To<Type, has_null>;
+  template <typename Type, typename BaseType=void, bool has_null=true>
+  using OffsetTo = OT::Offset24To<Type, BaseType, has_null>;
   template <typename Type>
   using ArrayOf = OT::Array24Of<Type>;
   template <typename Type>
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/CompositeGlyph.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/CompositeGlyph.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/CompositeGlyph.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/CompositeGlyph.hh	2024-11-20 13:56:33.000000000 +0000
@@ -87,19 +87,54 @@ struct CompositeGlyphRecord
     }
   }
 
-  void transform_points (contour_point_vector_t &points,
+  static void transform (const float (&matrix)[4],
+			 hb_array_t<contour_point_t> points)
+  {
+    if (matrix[0] != 1.f || matrix[1] != 0.f ||
+	matrix[2] != 0.f || matrix[3] != 1.f)
+      for (auto &point : points)
+        point.transform (matrix);
+  }
+
+  static void translate (const contour_point_t &trans,
+			 hb_array_t<contour_point_t> points)
+  {
+    if (HB_OPTIMIZE_SIZE_VAL)
+    {
+      if (trans.x != 0.f || trans.y != 0.f)
+        for (auto &point : points)
+	  point.translate (trans);
+    }
+    else
+    {
+      if (trans.x != 0.f && trans.y != 0.f)
+        for (auto &point : points)
+	  point.translate (trans);
+      else
+      {
+	if (trans.x != 0.f)
+	  for (auto &point : points)
+	    point.x += trans.x;
+	else if (trans.y != 0.f)
+	  for (auto &point : points)
+	    point.y += trans.y;
+      }
+    }
+  }
+
+  void transform_points (hb_array_t<contour_point_t> points,
 			 const float (&matrix)[4],
 			 const contour_point_t &trans) const
   {
     if (scaled_offsets ())
     {
-      points.translate (trans);
-      points.transform (matrix);
+      translate (trans, points);
+      transform (matrix, points);
     }
     else
     {
-      points.transform (matrix);
-      points.translate (trans);
+      transform (matrix, points);
+      translate (trans, points);
     }
   }
 
@@ -108,8 +143,8 @@ struct CompositeGlyphRecord
     float matrix[4];
     contour_point_t trans;
     get_transformation (matrix, trans);
-    if (unlikely (!points.resize (points.length + 1))) return false;
-    points[points.length - 1] = trans;
+    if (unlikely (!points.alloc (points.length + 4))) return false; // For phantom points
+    points.push (trans);
     return true;
   }
 
@@ -205,7 +240,8 @@ struct CompositeGlyphRecord
     }
     if (is_anchored ()) tx = ty = 0;
 
-    trans.init ((float) tx, (float) ty);
+    /* set is_end_point flag to true, used by IUP delta optimization */
+    trans.init ((float) tx, (float) ty, true);
 
     {
       const F2DOT14 *points = (const F2DOT14 *) p;
@@ -358,7 +394,7 @@ struct CompositeGlyph
     {
       /* last 4 points in points_with_deltas are phantom points and should not be included */
       if (i >= points_with_deltas.length - 4) {
-        free (o);
+        hb_free (o);
         return false;
       }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/Glyph.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/Glyph.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/Glyph.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/Glyph.hh	2024-11-20 13:56:33.000000000 +0000
@@ -103,6 +103,66 @@ struct Glyph
     }
   }
 
+  bool is_composite () const
+  { return type == COMPOSITE; }
+
+  bool get_all_points_without_var (const hb_face_t *face,
+                                   contour_point_vector_t &points /* OUT */) const
+  {
+    switch (type) {
+    case SIMPLE:
+      if (unlikely (!SimpleGlyph (*header, bytes).get_contour_points (points)))
+        return false;
+      break;
+    case COMPOSITE:
+    {
+      for (auto &item : get_composite_iterator ())
+        if (unlikely (!item.get_points (points))) return false;
+      break;
+    }
+#ifndef HB_NO_VAR_COMPOSITES
+    case VAR_COMPOSITE:
+    {
+      for (auto &item : get_var_composite_iterator ())
+        if (unlikely (!item.get_points (points))) return false;
+      break;
+    }
+#endif
+    case EMPTY:
+      break;
+    }
+
+    /* Init phantom points */
+    if (unlikely (!points.resize (points.length + PHANTOM_COUNT))) return false;
+    hb_array_t<contour_point_t> phantoms = points.as_array ().sub_array (points.length - PHANTOM_COUNT, PHANTOM_COUNT);
+    {
+      int lsb = 0;
+      int h_delta = face->table.hmtx->get_leading_bearing_without_var_unscaled (gid, &lsb) ?
+                    (int) header->xMin - lsb : 0;
+      HB_UNUSED int tsb = 0;
+      int v_orig  = (int) header->yMax +
+#ifndef HB_NO_VERTICAL
+                    ((void) face->table.vmtx->get_leading_bearing_without_var_unscaled (gid, &tsb), tsb)
+#else
+                    0
+#endif
+                    ;
+      unsigned h_adv = face->table.hmtx->get_advance_without_var_unscaled (gid);
+      unsigned v_adv =
+#ifndef HB_NO_VERTICAL
+                       face->table.vmtx->get_advance_without_var_unscaled (gid)
+#else
+                       - face->get_upem ()
+#endif
+                       ;
+      phantoms[PHANTOM_LEFT].x = h_delta;
+      phantoms[PHANTOM_RIGHT].x = (int) h_adv + h_delta;
+      phantoms[PHANTOM_TOP].y = v_orig;
+      phantoms[PHANTOM_BOTTOM].y = v_orig - (int) v_adv;
+    }
+    return true;
+  }
+
   void update_mtx (const hb_subset_plan_t *plan,
                    int xMin, int xMax,
                    int yMin, int yMax,
@@ -114,8 +174,8 @@ struct Glyph
 
     if (type != EMPTY)
     {
-      plan->bounds_width_map.set (new_gid, xMax - xMin);
-      plan->bounds_height_map.set (new_gid, yMax - yMin);
+      plan->bounds_width_vec[new_gid] = xMax - xMin;
+      plan->bounds_height_vec[new_gid] = yMax - yMin;
     }
 
     unsigned len = all_points.length;
@@ -124,10 +184,12 @@ struct Glyph
     float topSideY = all_points[len - 2].y;
     float bottomSideY = all_points[len - 1].y;
 
+    uint32_t hash = hb_hash (new_gid);
+
     signed hori_aw = roundf (rightSideX - leftSideX);
     if (hori_aw < 0) hori_aw = 0;
     int lsb = roundf (xMin - leftSideX);
-    plan->hmtx_map.set (new_gid, hb_pair ((unsigned) hori_aw, lsb));
+    plan->hmtx_map.set_with_hash (new_gid, hash, hb_pair ((unsigned) hori_aw, lsb));
     //flag value should be computed using non-empty glyphs
     if (type != EMPTY && lsb != xMin)
       plan->head_maxp_info.allXMinIsLsb = false;
@@ -135,7 +197,7 @@ struct Glyph
     signed vert_aw = roundf (topSideY - bottomSideY);
     if (vert_aw < 0) vert_aw = 0;
     int tsb = roundf (topSideY - yMax);
-    plan->vmtx_map.set (new_gid, hb_pair ((unsigned) vert_aw, tsb));
+    plan->vmtx_map.set_with_hash (new_gid, hash, hb_pair ((unsigned) vert_aw, tsb));
   }
 
   bool compile_header_bytes (const hb_subset_plan_t *plan,
@@ -155,24 +217,28 @@ struct Glyph
     {
       xMin = xMax = all_points[0].x;
       yMin = yMax = all_points[0].y;
+
+      unsigned count = all_points.length - 4;
+      for (unsigned i = 1; i < count; i++)
+      {
+	float x = all_points[i].x;
+	float y = all_points[i].y;
+	xMin = hb_min (xMin, x);
+	xMax = hb_max (xMax, x);
+	yMin = hb_min (yMin, y);
+	yMax = hb_max (yMax, y);
+      }
     }
 
-    for (unsigned i = 1; i < all_points.length - 4; i++)
-    {
-      float x = all_points[i].x;
-      float y = all_points[i].y;
-      xMin = hb_min (xMin, x);
-      xMax = hb_max (xMax, x);
-      yMin = hb_min (yMin, y);
-      yMax = hb_max (yMax, y);
-    }
-
-    update_mtx (plan, roundf (xMin), roundf (xMax), roundf (yMin), roundf (yMax), all_points);
- 
-    int rounded_xMin = roundf (xMin);
-    int rounded_xMax = roundf (xMax);
-    int rounded_yMin = roundf (yMin);
-    int rounded_yMax = roundf (yMax);
+
+    // These are destined for storage in a 16 bit field to clamp the values to
+    // fit into a 16 bit signed integer.
+    int rounded_xMin = hb_clamp (roundf (xMin), -32768.0f, 32767.0f);
+    int rounded_xMax = hb_clamp (roundf (xMax), -32768.0f, 32767.0f);
+    int rounded_yMin = hb_clamp (roundf (yMin), -32768.0f, 32767.0f);
+    int rounded_yMax = hb_clamp (roundf (yMax), -32768.0f, 32767.0f);
+
+    update_mtx (plan, rounded_xMin, rounded_xMax, rounded_yMin, rounded_yMax, all_points);
 
     if (type != EMPTY)
     {
@@ -287,6 +353,7 @@ struct Glyph
 		   bool use_my_metrics = true,
 		   bool phantom_only = false,
 		   hb_array_t<int> coords = hb_array_t<int> (),
+		   hb_map_t *current_glyphs = nullptr,
 		   unsigned int depth = 0,
 		   unsigned *edge_count = nullptr) const
   {
@@ -295,7 +362,11 @@ struct Glyph
     if (!edge_count) edge_count = &stack_edge_count;
     if (unlikely (*edge_count > HB_GLYF_MAX_EDGE_COUNT)) return false;
     (*edge_count)++;
-    
+
+    hb_map_t current_glyphs_stack;
+    if (current_glyphs == nullptr)
+      current_glyphs = &current_glyphs_stack;
+
     if (head_maxp_info)
     {
       head_maxp_info->maxComponentDepth = hb_max (head_maxp_info->maxComponentDepth, depth);
@@ -305,9 +376,8 @@ struct Glyph
       coords = hb_array (font->coords, font->num_coords);
 
     contour_point_vector_t stack_points;
-    bool inplace = type == SIMPLE && all_points.length == 0;
-    /* Load into all_points if it's empty, as an optimization. */
-    contour_point_vector_t &points = inplace ? all_points : stack_points;
+    contour_point_vector_t &points = type == SIMPLE ? all_points : stack_points;
+    unsigned old_length = points.length;
 
     switch (type) {
     case SIMPLE:
@@ -315,7 +385,7 @@ struct Glyph
         head_maxp_info->maxContours = hb_max (head_maxp_info->maxContours, (unsigned) header->numberOfContours);
       if (depth > 0 && composite_contours)
         *composite_contours += (unsigned) header->numberOfContours;
-      if (unlikely (!SimpleGlyph (*header, bytes).get_contour_points (points, phantom_only)))
+      if (unlikely (!SimpleGlyph (*header, bytes).get_contour_points (all_points, phantom_only)))
 	return false;
       break;
     case COMPOSITE:
@@ -329,6 +399,7 @@ struct Glyph
     {
       for (auto &item : get_var_composite_iterator ())
         if (unlikely (!item.get_points (points))) return false;
+      break;
     }
 #endif
     case EMPTY:
@@ -365,9 +436,11 @@ struct Glyph
     }
 
 #ifndef HB_NO_VAR
-    glyf_accelerator.gvar->apply_deltas_to_points (gid,
-						   coords,
-						   points.as_array ());
+    if (coords)
+      glyf_accelerator.gvar->apply_deltas_to_points (gid,
+						     coords,
+						     points.as_array ().sub_array (old_length),
+						     phantom_only && type == SIMPLE);
 #endif
 
     // mainly used by CompositeGlyph calculating new X/Y offset value so no need to extend it
@@ -375,27 +448,33 @@ struct Glyph
     if (points_with_deltas != nullptr && depth == 0 && type == COMPOSITE)
     {
       if (unlikely (!points_with_deltas->resize (points.length))) return false;
-      points_with_deltas->copy_vector (points);
+      *points_with_deltas = points;
     }
 
     switch (type) {
     case SIMPLE:
       if (depth == 0 && head_maxp_info)
-        head_maxp_info->maxPoints = hb_max (head_maxp_info->maxPoints, points.length - 4);
-      if (!inplace)
-	all_points.extend (points.as_array ());
+        head_maxp_info->maxPoints = hb_max (head_maxp_info->maxPoints, all_points.length - old_length - 4);
       break;
     case COMPOSITE:
     {
-      contour_point_vector_t comp_points;
       unsigned int comp_index = 0;
       for (auto &item : get_composite_iterator ())
       {
-        comp_points.reset ();
-	if (unlikely (!glyf_accelerator.glyph_for_gid (item.get_gid ())
+	hb_codepoint_t item_gid = item.get_gid ();
+
+        if (unlikely (current_glyphs->has (item_gid)))
+	  continue;
+
+	current_glyphs->add (item_gid);
+
+	unsigned old_count = all_points.length;
+
+	if (unlikely ((!phantom_only || (use_my_metrics && item.is_use_my_metrics ())) &&
+		      !glyf_accelerator.glyph_for_gid (item_gid)
 				       .get_points (font,
 						    glyf_accelerator,
-						    comp_points,
+						    all_points,
 						    points_with_deltas,
 						    head_maxp_info,
 						    composite_contours,
@@ -403,23 +482,32 @@ struct Glyph
 						    use_my_metrics,
 						    phantom_only,
 						    coords,
+						    current_glyphs,
 						    depth + 1,
 						    edge_count)))
+	{
+	  current_glyphs->del (item_gid);
 	  return false;
+	}
+
+	auto comp_points = all_points.as_array ().sub_array (old_count);
 
 	/* Copy phantom points from component if USE_MY_METRICS flag set */
 	if (use_my_metrics && item.is_use_my_metrics ())
 	  for (unsigned int i = 0; i < PHANTOM_COUNT; i++)
 	    phantoms[i] = comp_points[comp_points.length - PHANTOM_COUNT + i];
 
-	float matrix[4];
-	contour_point_t default_trans;
-	item.get_transformation (matrix, default_trans);
+	if (comp_points) // Empty in case of phantom_only
+	{
+	  float matrix[4];
+	  contour_point_t default_trans;
+	  item.get_transformation (matrix, default_trans);
 
-	/* Apply component transformation & translation (with deltas applied) */
-	item.transform_points (comp_points, matrix, points[comp_index]);
+	  /* Apply component transformation & translation (with deltas applied) */
+	  item.transform_points (comp_points, matrix, points[comp_index]);
+	}
 
-	if (item.is_anchored ())
+	if (item.is_anchored () && !phantom_only)
 	{
 	  unsigned int p1, p2;
 	  item.get_anchor_points (p1, p2);
@@ -429,16 +517,20 @@ struct Glyph
 	    delta.init (all_points[p1].x - comp_points[p2].x,
 			all_points[p1].y - comp_points[p2].y);
 
-	    comp_points.translate (delta);
+	    item.translate (delta, comp_points);
 	  }
 	}
 
-	all_points.extend (comp_points.as_array ().sub_array (0, comp_points.length - PHANTOM_COUNT));
+	all_points.resize (all_points.length - PHANTOM_COUNT);
 
 	if (all_points.length > HB_GLYF_MAX_POINTS)
+	{
+	  current_glyphs->del (item_gid);
 	  return false;
+	}
 
 	comp_index++;
+        current_glyphs->del (item_gid);
       }
 
       if (head_maxp_info && depth == 0)
@@ -453,26 +545,37 @@ struct Glyph
 #ifndef HB_NO_VAR_COMPOSITES
     case VAR_COMPOSITE:
     {
-      contour_point_vector_t comp_points;
       hb_array_t<contour_point_t> points_left = points.as_array ();
       for (auto &item : get_var_composite_iterator ())
       {
+	hb_codepoint_t item_gid = item.get_gid ();
+
+        if (unlikely (current_glyphs->has (item_gid)))
+	  continue;
+
+	current_glyphs->add (item_gid);
+
 	unsigned item_num_points = item.get_num_points ();
 	hb_array_t<contour_point_t> record_points = points_left.sub_array (0, item_num_points);
-
-        comp_points.reset ();
+	assert (record_points.length == item_num_points);
 
 	auto component_coords = coords;
-	if (item.is_reset_unspecified_axes ())
+	/* Copying coords is expensive; so we have put an arbitrary
+	 * limit on the max number of coords for now. */
+	if (item.is_reset_unspecified_axes () ||
+	    coords.length > HB_GLYF_VAR_COMPOSITE_MAX_AXES)
 	  component_coords = hb_array<int> ();
 
 	coord_setter_t coord_setter (component_coords);
 	item.set_variations (coord_setter, record_points);
 
-	if (unlikely (!glyf_accelerator.glyph_for_gid (item.get_gid ())
+	unsigned old_count = all_points.length;
+
+	if (unlikely ((!phantom_only || (use_my_metrics && item.is_use_my_metrics ())) &&
+		      !glyf_accelerator.glyph_for_gid (item_gid)
 				       .get_points (font,
 						    glyf_accelerator,
-						    comp_points,
+						    all_points,
 						    points_with_deltas,
 						    head_maxp_info,
 						    nullptr,
@@ -480,24 +583,36 @@ struct Glyph
 						    use_my_metrics,
 						    phantom_only,
 						    coord_setter.get_coords (),
+						    current_glyphs,
 						    depth + 1,
 						    edge_count)))
+	{
+	  current_glyphs->del (item_gid);
 	  return false;
+	}
+
+	auto comp_points = all_points.as_array ().sub_array (old_count);
 
 	/* Apply component transformation */
-	item.transform_points (record_points, comp_points);
+	if (comp_points) // Empty in case of phantom_only
+	  item.transform_points (record_points, comp_points);
 
 	/* Copy phantom points from component if USE_MY_METRICS flag set */
 	if (use_my_metrics && item.is_use_my_metrics ())
 	  for (unsigned int i = 0; i < PHANTOM_COUNT; i++)
 	    phantoms[i] = comp_points[comp_points.length - PHANTOM_COUNT + i];
 
-	all_points.extend (comp_points.as_array ().sub_array (0, comp_points.length - PHANTOM_COUNT));
+	all_points.resize (all_points.length - PHANTOM_COUNT);
 
 	if (all_points.length > HB_GLYF_MAX_POINTS)
+	{
+	  current_glyphs->del (item_gid);
 	  return false;
+	}
 
 	points_left += item_num_points;
+
+        current_glyphs->del (item_gid);
       }
       all_points.extend (phantoms);
     } break;
@@ -512,9 +627,10 @@ struct Glyph
       /* Undocumented rasterizer behavior:
        * Shift points horizontally by the updated left side bearing
        */
-      contour_point_t delta;
-      delta.init (-phantoms[PHANTOM_LEFT].x, 0.f);
-      if (delta.x) all_points.translate (delta);
+      int v = -phantoms[PHANTOM_LEFT].x;
+      if (v)
+        for (auto &point : all_points)
+	  point.x += v;
     }
 
     return !all_points.in_error ();
@@ -545,10 +661,11 @@ struct Glyph
     int num_contours = header->numberOfContours;
     if (unlikely (num_contours == 0)) type = EMPTY;
     else if (num_contours > 0) type = SIMPLE;
+    else if (num_contours == -1) type = COMPOSITE;
 #ifndef HB_NO_VAR_COMPOSITES
     else if (num_contours == -2) type = VAR_COMPOSITE;
 #endif
-    else type = COMPOSITE; /* negative numbers */
+    else type = EMPTY; // Spec deviation; Spec says COMPOSITE, but not seen in the wild.
   }
 
   protected:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/SimpleGlyph.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/SimpleGlyph.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/SimpleGlyph.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/SimpleGlyph.hh	2024-11-20 13:56:33.000000000 +0000
@@ -124,7 +124,7 @@ struct SimpleGlyph
   }
 
   static bool read_flags (const HBUINT8 *&p /* IN/OUT */,
-			  contour_point_vector_t &points_ /* IN/OUT */,
+			  hb_array_t<contour_point_t> points_ /* IN/OUT */,
 			  const HBUINT8 *end)
   {
     unsigned count = points_.length;
@@ -146,7 +146,7 @@ struct SimpleGlyph
   }
 
   static bool read_points (const HBUINT8 *&p /* IN/OUT */,
-			   contour_point_vector_t &points_ /* IN/OUT */,
+			   hb_array_t<contour_point_t> points_ /* IN/OUT */,
 			   const HBUINT8 *end,
 			   float contour_point_t::*m,
 			   const simple_glyph_flag_t short_flag,
@@ -154,10 +154,9 @@ struct SimpleGlyph
   {
     int v = 0;
 
-    unsigned count = points_.length;
-    for (unsigned i = 0; i < count; i++)
+    for (auto &point : points_)
     {
-      unsigned flag = points_[i].flag;
+      unsigned flag = point.flag;
       if (flag & short_flag)
       {
 	if (unlikely (p + 1 > end)) return false;
@@ -175,23 +174,27 @@ struct SimpleGlyph
 	  p += HBINT16::static_size;
 	}
       }
-      points_.arrayZ[i].*m = v;
+      point.*m = v;
     }
     return true;
   }
 
-  bool get_contour_points (contour_point_vector_t &points_ /* OUT */,
+  bool get_contour_points (contour_point_vector_t &points /* OUT */,
 			   bool phantom_only = false) const
   {
     const HBUINT16 *endPtsOfContours = &StructAfter<HBUINT16> (header);
     int num_contours = header.numberOfContours;
-    assert (num_contours);
+    assert (num_contours > 0);
     /* One extra item at the end, for the instruction-count below. */
     if (unlikely (!bytes.check_range (&endPtsOfContours[num_contours]))) return false;
     unsigned int num_points = endPtsOfContours[num_contours - 1] + 1;
 
-    points_.alloc (num_points + 4, true); // Allocate for phantom points, to avoid a possible copy
-    if (!points_.resize (num_points)) return false;
+    unsigned old_length = points.length;
+    points.alloc (points.length + num_points + 4, true); // Allocate for phantom points, to avoid a possible copy
+    if (unlikely (!points.resize (points.length + num_points, false))) return false;
+    auto points_ = points.as_array ().sub_array (old_length);
+    if (!phantom_only)
+      hb_memset (points_.arrayZ, 0, sizeof (contour_point_t) * num_points);
     if (phantom_only) return true;
 
     for (int i = 0; i < num_contours; i++)
@@ -214,7 +217,7 @@ struct SimpleGlyph
   }
 
   static void encode_coord (int value,
-                            uint8_t &flag,
+                            unsigned &flag,
                             const simple_glyph_flag_t short_flag,
                             const simple_glyph_flag_t same_flag,
                             hb_vector_t<uint8_t> &coords /* OUT */)
@@ -239,9 +242,9 @@ struct SimpleGlyph
     }
   }
 
-  static void encode_flag (uint8_t &flag,
-                           uint8_t &repeat,
-                           uint8_t lastflag,
+  static void encode_flag (unsigned flag,
+                           unsigned &repeat,
+                           unsigned lastflag,
                            hb_vector_t<uint8_t> &flags /* OUT */)
   {
     if (flag == lastflag && repeat != 255)
@@ -262,7 +265,7 @@ struct SimpleGlyph
     else
     {
       repeat = 0;
-      flags.push (flag);
+      flags.arrayZ[flags.length++] = flag;
     }
   }
 
@@ -282,13 +285,13 @@ struct SimpleGlyph
     if (unlikely (!x_coords.alloc (2*num_points, true))) return false;
     if (unlikely (!y_coords.alloc (2*num_points, true))) return false;
 
-    uint8_t lastflag = 255, repeat = 0;
+    unsigned lastflag = 255, repeat = 0;
     int prev_x = 0, prev_y = 0;
 
     for (unsigned i = 0; i < num_points; i++)
     {
-      uint8_t flag = all_points.arrayZ[i].flag;
-      flag &= FLAG_ON_CURVE + FLAG_OVERLAP_SIMPLE;
+      unsigned flag = all_points.arrayZ[i].flag;
+      flag &= FLAG_ON_CURVE | FLAG_OVERLAP_SIMPLE | FLAG_CUBIC;
 
       int cur_x = roundf (all_points.arrayZ[i].x);
       int cur_y = roundf (all_points.arrayZ[i].y);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/SubsetGlyph.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/SubsetGlyph.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/SubsetGlyph.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/SubsetGlyph.hh	2024-11-20 13:56:33.000000000 +0000
@@ -22,7 +22,7 @@ struct SubsetGlyph
 
   bool serialize (hb_serialize_context_t *c,
 		  bool use_short_loca,
-		  const hb_subset_plan_t *plan)
+		  const hb_subset_plan_t *plan) const
   {
     TRACE_SERIALIZE (this);
 
@@ -40,7 +40,7 @@ struct SubsetGlyph
     pad = 0;
     while (pad_length > 0)
     {
-      c->embed (pad);
+      (void) c->embed (pad);
       pad_length--;
     }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/VarCompositeGlyph.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/VarCompositeGlyph.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/VarCompositeGlyph.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/VarCompositeGlyph.hh	2024-11-20 13:56:33.000000000 +0000
@@ -36,24 +36,21 @@ struct VarCompositeGlyphRecord
 
   unsigned int get_size () const
   {
+    unsigned fl = flags;
     unsigned int size = min_size;
 
-    unsigned axis_width = (flags & AXIS_INDICES_ARE_SHORT) ? 4 : 3;
+    unsigned axis_width = (fl & AXIS_INDICES_ARE_SHORT) ? 4 : 3;
     size += numAxes * axis_width;
 
-    // gid
-    size += 2;
-    if (flags & GID_IS_24BIT)		size += 1;
-
-    if (flags & HAVE_TRANSLATE_X)	size += 2;
-    if (flags & HAVE_TRANSLATE_Y)	size += 2;
-    if (flags & HAVE_ROTATION)		size += 2;
-    if (flags & HAVE_SCALE_X)		size += 2;
-    if (flags & HAVE_SCALE_Y)		size += 2;
-    if (flags & HAVE_SKEW_X)		size += 2;
-    if (flags & HAVE_SKEW_Y)		size += 2;
-    if (flags & HAVE_TCENTER_X)		size += 2;
-    if (flags & HAVE_TCENTER_Y)		size += 2;
+    if (fl & GID_IS_24BIT)	size += 1;
+
+    // 2 bytes each for the following flags
+    fl = fl & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y |
+	       HAVE_ROTATION |
+	       HAVE_SCALE_X | HAVE_SCALE_Y |
+	       HAVE_SKEW_X | HAVE_SKEW_Y |
+	       HAVE_TCENTER_X | HAVE_TCENTER_Y);
+    size += hb_popcount (fl) * 2;
 
     return size;
   }
@@ -66,17 +63,17 @@ struct VarCompositeGlyphRecord
   hb_codepoint_t get_gid () const
   {
     if (flags & GID_IS_24BIT)
-      return StructAfter<const HBGlyphID24> (numAxes);
+      return * (const HBGlyphID24 *) &pad;
     else
-      return StructAfter<const HBGlyphID16> (numAxes);
+      return * (const HBGlyphID16 *) &pad;
   }
 
   void set_gid (hb_codepoint_t gid)
   {
     if (flags & GID_IS_24BIT)
-      StructAfter<HBGlyphID24> (numAxes) = gid;
+      * (HBGlyphID24 *) &pad = gid;
     else
-      StructAfter<HBGlyphID16> (numAxes) = gid;
+      * (HBGlyphID16 *) &pad = gid;
   }
 
   unsigned get_numAxes () const
@@ -86,26 +83,44 @@ struct VarCompositeGlyphRecord
 
   unsigned get_num_points () const
   {
+    unsigned fl = flags;
     unsigned num = 0;
-    if (flags & AXES_HAVE_VARIATION)			num += numAxes;
-    if (flags & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y))	num++;
-    if (flags & HAVE_ROTATION)				num++;
-    if (flags & (HAVE_SCALE_X | HAVE_SCALE_Y))		num++;
-    if (flags & (HAVE_SKEW_X | HAVE_SKEW_Y))		num++;
-    if (flags & (HAVE_TCENTER_X | HAVE_TCENTER_Y))	num++;
+    if (fl & AXES_HAVE_VARIATION)			num += numAxes;
+
+    /* Hopefully faster code, relying on the value of the flags. */
+    fl = (((fl & (HAVE_TRANSLATE_Y | HAVE_SCALE_Y | HAVE_SKEW_Y | HAVE_TCENTER_Y)) >> 1) | fl) &
+         (HAVE_TRANSLATE_X | HAVE_ROTATION | HAVE_SCALE_X | HAVE_SKEW_X | HAVE_TCENTER_X);
+    num += hb_popcount (fl);
+    return num;
+
+    /* Slower but more readable code. */
+    if (fl & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y))	num++;
+    if (fl & HAVE_ROTATION)				num++;
+    if (fl & (HAVE_SCALE_X | HAVE_SCALE_Y))		num++;
+    if (fl & (HAVE_SKEW_X | HAVE_SKEW_Y))		num++;
+    if (fl & (HAVE_TCENTER_X | HAVE_TCENTER_Y))		num++;
     return num;
   }
 
-  void transform_points (hb_array_t<contour_point_t> record_points,
-			 contour_point_vector_t &points) const
+  void transform_points (hb_array_t<const contour_point_t> record_points,
+			 hb_array_t<contour_point_t> points) const
   {
     float matrix[4];
     contour_point_t trans;
 
-    get_transformation_from_points (record_points, matrix, trans);
+    get_transformation_from_points (record_points.arrayZ, matrix, trans);
+
+    auto arrayZ = points.arrayZ;
+    unsigned count = points.length;
+
+    if (matrix[0] != 1.f || matrix[1] != 0.f ||
+	matrix[2] != 0.f || matrix[3] != 1.f)
+      for (unsigned i = 0; i < count; i++)
+        arrayZ[i].transform (matrix);
 
-    points.transform (matrix);
-    points.translate (trans);
+    if (trans.x != 0.f || trans.y != 0.f)
+      for (unsigned i = 0; i < count; i++)
+        arrayZ[i].translate (trans);
   }
 
   static inline void transform (float (&matrix)[4], contour_point_t &trans,
@@ -136,26 +151,41 @@ struct VarCompositeGlyphRecord
   static void translate (float (&matrix)[4], contour_point_t &trans,
 			 float translateX, float translateY)
   {
-    // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L213
-    float other[6] = {1.f, 0.f, 0.f, 1.f, translateX, translateY};
-    transform (matrix, trans, other);
+    if (!translateX && !translateY)
+      return;
+
+    trans.x += matrix[0] * translateX + matrix[2] * translateY;
+    trans.y += matrix[1] * translateX + matrix[3] * translateY;
   }
 
   static void scale (float (&matrix)[4], contour_point_t &trans,
 		     float scaleX, float scaleY)
   {
-    // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L224
-    float other[6] = {scaleX, 0.f, 0.f, scaleY, 0.f, 0.f};
-    transform (matrix, trans, other);
+    if (scaleX == 1.f && scaleY == 1.f)
+      return;
+
+    matrix[0] *= scaleX;
+    matrix[1] *= scaleX;
+    matrix[2] *= scaleY;
+    matrix[3] *= scaleY;
   }
 
   static void rotate (float (&matrix)[4], contour_point_t &trans,
 		      float rotation)
   {
+    if (!rotation)
+      return;
+
     // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L240
     rotation = rotation * HB_PI;
-    float c = cosf (rotation);
-    float s = sinf (rotation);
+    float c;
+    float s;
+#ifdef HAVE_SINCOSF
+    sincosf (rotation, &s, &c);
+#else
+    c = cosf (rotation);
+    s = sinf (rotation);
+#endif
     float other[6] = {c, s, -s, c, 0.f, 0.f};
     transform (matrix, trans, other);
   }
@@ -163,101 +193,100 @@ struct VarCompositeGlyphRecord
   static void skew (float (&matrix)[4], contour_point_t &trans,
 		    float skewX, float skewY)
   {
+    if (!skewX && !skewY)
+      return;
+
     // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L255
     skewX = skewX * HB_PI;
     skewY = skewY * HB_PI;
-    float other[6] = {1.f, tanf (skewY), tanf (skewX), 1.f, 0.f, 0.f};
+    float other[6] = {1.f,
+		      skewY ? tanf (skewY) : 0.f,
+		      skewX ? tanf (skewX) : 0.f,
+		      1.f,
+		      0.f, 0.f};
     transform (matrix, trans, other);
   }
 
   bool get_points (contour_point_vector_t &points) const
   {
-    float translateX = 0.f;
-    float translateY = 0.f;
-    float rotation = 0.f;
-    float scaleX = 1.f * (1 << 10);
-    float scaleY = 1.f * (1 << 10);
-    float skewX = 0.f;
-    float skewY = 0.f;
-    float tCenterX = 0.f;
-    float tCenterY = 0.f;
-
     unsigned num_points = get_num_points ();
 
-    if (unlikely (!points.resize (points.length + num_points))) return false;
-
-    unsigned axis_width = (flags & AXIS_INDICES_ARE_SHORT) ? 2 : 1;
-    unsigned axes_size = numAxes * axis_width;
+    points.alloc (points.length + num_points + 4); // For phantom points
+    if (unlikely (!points.resize (points.length + num_points, false))) return false;
+    contour_point_t *rec_points = points.arrayZ + (points.length - num_points);
+    hb_memset (rec_points, 0, num_points * sizeof (rec_points[0]));
+
+    unsigned fl = flags;
+
+    unsigned num_axes = numAxes;
+    unsigned axis_width = (fl & AXIS_INDICES_ARE_SHORT) ? 2 : 1;
+    unsigned axes_size = num_axes * axis_width;
 
     const F2DOT14 *q = (const F2DOT14 *) (axes_size +
-					  (flags & GID_IS_24BIT ? 3 : 2) +
-					  &StructAfter<const HBUINT8> (numAxes));
-
-    hb_array_t<contour_point_t> rec_points = points.as_array ().sub_array (points.length - num_points);
+					  (fl & GID_IS_24BIT ? 3 : 2) +
+					  (const HBUINT8 *) &pad);
 
-    unsigned count = numAxes;
-    if (flags & AXES_HAVE_VARIATION)
+    unsigned count = num_axes;
+    if (fl & AXES_HAVE_VARIATION)
     {
       for (unsigned i = 0; i < count; i++)
-	rec_points[i].x = q++->to_int ();
-      rec_points += count;
+	rec_points++->x = q++->to_int ();
     }
     else
       q += count;
 
     const HBUINT16 *p = (const HBUINT16 *) q;
 
-    if (flags & HAVE_TRANSLATE_X)	translateX = * (const FWORD *) p++;
-    if (flags & HAVE_TRANSLATE_Y)	translateY = * (const FWORD *) p++;
-    if (flags & HAVE_ROTATION)		rotation = ((const F4DOT12 *) p++)->to_int ();
-    if (flags & HAVE_SCALE_X)		scaleX = ((const F6DOT10 *) p++)->to_int ();
-    if (flags & HAVE_SCALE_Y)		scaleY = ((const F6DOT10 *) p++)->to_int ();
-    if (flags & HAVE_SKEW_X)		skewX = ((const F4DOT12 *) p++)->to_int ();
-    if (flags & HAVE_SKEW_Y)		skewY = ((const F4DOT12 *) p++)->to_int ();
-    if (flags & HAVE_TCENTER_X)		tCenterX = * (const FWORD *) p++;
-    if (flags & HAVE_TCENTER_Y)		tCenterY = * (const FWORD *) p++;
-
-    if ((flags & UNIFORM_SCALE) && !(flags & HAVE_SCALE_Y))
-      scaleY = scaleX;
-
-    if (flags & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y))
+    if (fl & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y))
     {
-      rec_points[0].x = translateX;
-      rec_points[0].y = translateY;
+      int translateX = (fl & HAVE_TRANSLATE_X) ? * (const FWORD *) p++ : 0;
+      int translateY = (fl & HAVE_TRANSLATE_Y) ? * (const FWORD *) p++ : 0;
+      rec_points->x = translateX;
+      rec_points->y = translateY;
       rec_points++;
     }
-    if (flags & HAVE_ROTATION)
+    if (fl & HAVE_ROTATION)
     {
-      rec_points[0].x = rotation;
+      int rotation = (fl & HAVE_ROTATION) ? ((const F4DOT12 *) p++)->to_int () : 0;
+      rec_points->x = rotation;
       rec_points++;
     }
-    if (flags & (HAVE_SCALE_X | HAVE_SCALE_Y))
+    if (fl & (HAVE_SCALE_X | HAVE_SCALE_Y))
     {
-      rec_points[0].x = scaleX;
-      rec_points[0].y = scaleY;
+      int scaleX = (fl & HAVE_SCALE_X) ? ((const F6DOT10 *) p++)->to_int () : 1 << 10;
+      int scaleY = (fl & HAVE_SCALE_Y) ? ((const F6DOT10 *) p++)->to_int () : 1 << 10;
+      if ((fl & UNIFORM_SCALE) && !(fl & HAVE_SCALE_Y))
+	scaleY = scaleX;
+      rec_points->x = scaleX;
+      rec_points->y = scaleY;
       rec_points++;
     }
-    if (flags & (HAVE_SKEW_X | HAVE_SKEW_Y))
+    if (fl & (HAVE_SKEW_X | HAVE_SKEW_Y))
     {
-      rec_points[0].x = skewX;
-      rec_points[0].y = skewY;
+      int skewX = (fl & HAVE_SKEW_X) ? ((const F4DOT12 *) p++)->to_int () : 0;
+      int skewY = (fl & HAVE_SKEW_Y) ? ((const F4DOT12 *) p++)->to_int () : 0;
+      rec_points->x = skewX;
+      rec_points->y = skewY;
       rec_points++;
     }
-    if (flags & (HAVE_TCENTER_X | HAVE_TCENTER_Y))
+    if (fl & (HAVE_TCENTER_X | HAVE_TCENTER_Y))
     {
-      rec_points[0].x = tCenterX;
-      rec_points[0].y = tCenterY;
+      int tCenterX = (fl & HAVE_TCENTER_X) ? * (const FWORD *) p++ : 0;
+      int tCenterY = (fl & HAVE_TCENTER_Y) ? * (const FWORD *) p++ : 0;
+      rec_points->x = tCenterX;
+      rec_points->y = tCenterY;
       rec_points++;
     }
-    assert (!rec_points);
 
     return true;
   }
 
-  void get_transformation_from_points (hb_array_t<contour_point_t> rec_points,
+  void get_transformation_from_points (const contour_point_t *rec_points,
 				       float (&matrix)[4], contour_point_t &trans) const
   {
-    if (flags & AXES_HAVE_VARIATION)
+    unsigned fl = flags;
+
+    if (fl & AXES_HAVE_VARIATION)
       rec_points += numAxes;
 
     matrix[0] = matrix[3] = 1.f;
@@ -274,36 +303,35 @@ struct VarCompositeGlyphRecord
     float tCenterX = 0.f;
     float tCenterY = 0.f;
 
-    if (flags & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y))
+    if (fl & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y))
     {
-      translateX = rec_points[0].x;
-      translateY = rec_points[0].y;
+      translateX = rec_points->x;
+      translateY = rec_points->y;
       rec_points++;
     }
-    if (flags & HAVE_ROTATION)
+    if (fl & HAVE_ROTATION)
     {
-      rotation = rec_points[0].x / (1 << 12);
+      rotation = rec_points->x / (1 << 12);
       rec_points++;
     }
-    if (flags & (HAVE_SCALE_X | HAVE_SCALE_Y))
+    if (fl & (HAVE_SCALE_X | HAVE_SCALE_Y))
     {
-      scaleX = rec_points[0].x / (1 << 10);
-      scaleY = rec_points[0].y / (1 << 10);
+      scaleX = rec_points->x / (1 << 10);
+      scaleY = rec_points->y / (1 << 10);
       rec_points++;
     }
-    if (flags & (HAVE_SKEW_X | HAVE_SKEW_Y))
+    if (fl & (HAVE_SKEW_X | HAVE_SKEW_Y))
     {
-      skewX = rec_points[0].x / (1 << 12);
-      skewY = rec_points[0].y / (1 << 12);
+      skewX = rec_points->x / (1 << 12);
+      skewY = rec_points->y / (1 << 12);
       rec_points++;
     }
-    if (flags & (HAVE_TCENTER_X | HAVE_TCENTER_Y))
+    if (fl & (HAVE_TCENTER_X | HAVE_TCENTER_Y))
     {
-      tCenterX = rec_points[0].x;
-      tCenterY = rec_points[0].y;
+      tCenterX = rec_points->x;
+      tCenterY = rec_points->y;
       rec_points++;
     }
-    assert (!rec_points);
 
     translate (matrix, trans, translateX + tCenterX, translateY + tCenterY);
     rotate (matrix, trans, rotation);
@@ -317,18 +345,19 @@ struct VarCompositeGlyphRecord
   {
     bool have_variations = flags & AXES_HAVE_VARIATION;
     unsigned axis_width = (flags & AXIS_INDICES_ARE_SHORT) ? 2 : 1;
+    unsigned num_axes = numAxes;
 
     const HBUINT8  *p = (const HBUINT8 *)  (((HBUINT8 *) &numAxes) + numAxes.static_size + (flags & GID_IS_24BIT ? 3 : 2));
     const HBUINT16 *q = (const HBUINT16 *) (((HBUINT8 *) &numAxes) + numAxes.static_size + (flags & GID_IS_24BIT ? 3 : 2));
 
-    const F2DOT14 *a = (const F2DOT14 *) ((HBUINT8 *) (axis_width == 1 ? (p + numAxes) : (HBUINT8 *) (q + numAxes)));
+    const F2DOT14 *a = (const F2DOT14 *) ((HBUINT8 *) (axis_width == 1 ? (p + num_axes) : (HBUINT8 *) (q + num_axes)));
 
-    unsigned count = numAxes;
+    unsigned count = num_axes;
     for (unsigned i = 0; i < count; i++)
     {
       unsigned axis_index = axis_width == 1 ? (unsigned) *p++ : (unsigned) *q++;
 
-      signed v = have_variations ? rec_points[i].x : a++->to_int ();
+      signed v = have_variations ? rec_points.arrayZ[i].x : a++->to_int ();
 
       v = hb_clamp (v, -(1<<14), (1<<14));
       setter[axis_index] = v;
@@ -338,8 +367,9 @@ struct VarCompositeGlyphRecord
   protected:
   HBUINT16	flags;
   HBUINT8	numAxes;
+  HBUINT16	pad;
   public:
-  DEFINE_SIZE_MIN (3);
+  DEFINE_SIZE_MIN (5);
 };
 
 using var_composite_iter_t = composite_iter_tmpl<VarCompositeGlyphRecord>;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/coord-setter.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/coord-setter.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/coord-setter.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/coord-setter.hh	2024-11-20 13:56:33.000000000 +0000
@@ -16,6 +16,8 @@ struct coord_setter_t
 
   int& operator [] (unsigned idx)
   {
+    if (unlikely (idx >= HB_GLYF_VAR_COMPOSITE_MAX_AXES))
+      return Crap(int);
     if (coords.length < idx + 1)
       coords.resize (idx + 1);
     return coords[idx];
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf-helpers.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf-helpers.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf-helpers.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf-helpers.hh	2024-11-20 13:56:33.000000000 +0000
@@ -12,24 +12,44 @@ namespace OT {
 namespace glyf_impl {
 
 
-template<typename IteratorIn, typename IteratorOut,
-	 hb_requires (hb_is_source_of (IteratorIn, unsigned int)),
-	 hb_requires (hb_is_sink_of (IteratorOut, unsigned))>
+template<typename IteratorIn, typename TypeOut,
+	 hb_requires (hb_is_source_of (IteratorIn, unsigned int))>
 static void
-_write_loca (IteratorIn&& it, bool short_offsets, IteratorOut&& dest)
+_write_loca (IteratorIn&& it,
+	     const hb_sorted_vector_t<hb_codepoint_pair_t> new_to_old_gid_list,
+	     bool short_offsets,
+	     TypeOut *dest,
+	     unsigned num_offsets)
 {
   unsigned right_shift = short_offsets ? 1 : 0;
-  unsigned int offset = 0;
-  dest << 0;
-  + it
-  | hb_map ([=, &offset] (unsigned int padded_size)
-	    {
-	      offset += padded_size;
-	      DEBUG_MSG (SUBSET, nullptr, "loca entry offset %u", offset);
-	      return offset >> right_shift;
-	    })
-  | hb_sink (dest)
-  ;
+  unsigned offset = 0;
+  TypeOut value;
+  value = 0;
+  *dest++ = value;
+  hb_codepoint_t last = 0;
+  for (auto _ : new_to_old_gid_list)
+  {
+    hb_codepoint_t gid = _.first;
+    for (; last < gid; last++)
+    {
+      DEBUG_MSG (SUBSET, nullptr, "loca entry empty offset %u", offset);
+      *dest++ = value;
+    }
+
+    unsigned padded_size = *it++;
+    offset += padded_size;
+    DEBUG_MSG (SUBSET, nullptr, "loca entry gid %" PRIu32 " offset %u padded-size %u", gid, offset, padded_size);
+    value = offset >> right_shift;
+    *dest++ = value;
+
+    last++; // Skip over gid
+  }
+  unsigned num_glyphs = num_offsets - 1;
+  for (; last < num_glyphs; last++)
+  {
+    DEBUG_MSG (SUBSET, nullptr, "loca entry empty offset %u", offset);
+    *dest++ = value;
+  }
 }
 
 static bool
@@ -67,11 +87,14 @@ _add_head_and_set_loca_version (hb_subse
 template<typename Iterator,
 	 hb_requires (hb_is_source_of (Iterator, unsigned int))>
 static bool
-_add_loca_and_head (hb_subset_plan_t * plan, Iterator padded_offsets, bool use_short_loca)
+_add_loca_and_head (hb_subset_context_t *c,
+		    Iterator padded_offsets,
+		    bool use_short_loca)
 {
-  unsigned num_offsets = padded_offsets.len () + 1;
+  unsigned num_offsets = c->plan->num_output_glyphs () + 1;
   unsigned entry_size = use_short_loca ? 2 : 4;
-  char *loca_prime_data = (char *) hb_calloc (entry_size, num_offsets);
+
+  char *loca_prime_data = (char *) hb_malloc (entry_size * num_offsets);
 
   if (unlikely (!loca_prime_data)) return false;
 
@@ -79,9 +102,9 @@ _add_loca_and_head (hb_subset_plan_t * p
 	     entry_size, num_offsets, entry_size * num_offsets);
 
   if (use_short_loca)
-    _write_loca (padded_offsets, true, hb_array ((HBUINT16 *) loca_prime_data, num_offsets));
+    _write_loca (padded_offsets, c->plan->new_to_old_gid_list, true, (HBUINT16 *) loca_prime_data, num_offsets);
   else
-    _write_loca (padded_offsets, false, hb_array ((HBUINT32 *) loca_prime_data, num_offsets));
+    _write_loca (padded_offsets, c->plan->new_to_old_gid_list, false, (HBUINT32 *) loca_prime_data, num_offsets);
 
   hb_blob_t *loca_blob = hb_blob_create (loca_prime_data,
 					 entry_size * num_offsets,
@@ -89,8 +112,8 @@ _add_loca_and_head (hb_subset_plan_t * p
 					 loca_prime_data,
 					 hb_free);
 
-  bool result = plan->add_table (HB_OT_TAG_loca, loca_blob)
-	     && _add_head_and_set_loca_version (plan, use_short_loca);
+  bool result = c->plan->add_table (HB_OT_TAG_loca, loca_blob)
+	     && _add_head_and_set_loca_version (c->plan, use_short_loca);
 
   hb_blob_destroy (loca_blob);
   return result;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf.hh	2024-11-20 13:56:33.000000000 +0000
@@ -85,75 +85,72 @@ struct glyf
       return_trace (false);
     }
 
-    glyf *glyf_prime = c->serializer->start_embed <glyf> ();
-    if (unlikely (!c->serializer->check_success (glyf_prime))) return_trace (false);
-
     hb_font_t *font = nullptr;
     if (c->plan->normalized_coords)
     {
       font = _create_font_for_instancing (c->plan);
-      if (unlikely (!font)) return false;
+      if (unlikely (!font))
+	return_trace (false);
     }
 
     hb_vector_t<unsigned> padded_offsets;
-    unsigned num_glyphs = c->plan->num_output_glyphs ();
-    if (unlikely (!padded_offsets.resize (num_glyphs)))
-    {
-      hb_font_destroy (font);
-      return false;
-    }
+    if (unlikely (!padded_offsets.alloc (c->plan->new_to_old_gid_list.length, true)))
+      return_trace (false);
 
     hb_vector_t<glyf_impl::SubsetGlyph> glyphs;
     if (!_populate_subset_glyphs (c->plan, font, glyphs))
     {
       hb_font_destroy (font);
-      return false;
+      return_trace (false);
     }
 
     if (font)
       hb_font_destroy (font);
 
     unsigned max_offset = 0;
-    for (unsigned i = 0; i < num_glyphs; i++)
+    for (auto &g : glyphs)
     {
-      padded_offsets[i] = glyphs[i].padded_size ();
-      max_offset += padded_offsets[i];
+      unsigned size = g.padded_size ();
+      padded_offsets.push (size);
+      max_offset += size;
     }
 
     bool use_short_loca = false;
     if (likely (!c->plan->force_long_loca))
       use_short_loca = max_offset < 0x1FFFF;
 
-    if (!use_short_loca) {
-      for (unsigned i = 0; i < num_glyphs; i++)
-        padded_offsets[i] = glyphs[i].length ();
+    if (!use_short_loca)
+    {
+      padded_offsets.resize (0);
+      for (auto &g : glyphs)
+	padded_offsets.push (g.length ());
     }
 
-    bool result = glyf_prime->serialize (c->serializer, glyphs.writer (), use_short_loca, c->plan);
+    auto *glyf_prime = c->serializer->start_embed <glyf> ();
+    bool result = glyf_prime->serialize (c->serializer, hb_iter (glyphs), use_short_loca, c->plan);
     if (c->plan->normalized_coords && !c->plan->pinned_at_default)
       _free_compiled_subset_glyphs (glyphs);
 
-    if (!result) return false;
-
-    if (unlikely (c->serializer->in_error ())) return_trace (false);
+    if (unlikely (!c->serializer->check_success (glyf_impl::_add_loca_and_head (c,
+						 padded_offsets.iter (),
+						 use_short_loca))))
+      return_trace (false);
 
-    return_trace (c->serializer->check_success (glyf_impl::_add_loca_and_head (c->plan,
-									       padded_offsets.iter (),
-									       use_short_loca)));
+    return result;
   }
 
   bool
   _populate_subset_glyphs (const hb_subset_plan_t   *plan,
 			   hb_font_t                *font,
-			   hb_vector_t<glyf_impl::SubsetGlyph> &glyphs /* OUT */) const;
+			   hb_vector_t<glyf_impl::SubsetGlyph>& glyphs /* OUT */) const;
 
   hb_font_t *
   _create_font_for_instancing (const hb_subset_plan_t *plan) const;
 
   void _free_compiled_subset_glyphs (hb_vector_t<glyf_impl::SubsetGlyph> &glyphs) const
   {
-    for (unsigned i = 0; i < glyphs.length; i++)
-      glyphs[i].free_compiled_bytes ();
+    for (auto &g : glyphs)
+      g.free_compiled_bytes ();
   }
 
   protected:
@@ -222,13 +219,14 @@ struct glyf_accelerator_t
     if (unlikely (!glyph_for_gid (gid).get_points (font, *this, all_points, nullptr, nullptr, nullptr, true, true, phantom_only)))
       return false;
 
+    unsigned count = all_points.length;
+    assert (count >= glyf_impl::PHANTOM_COUNT);
+    count -= glyf_impl::PHANTOM_COUNT;
+
     if (consumer.is_consuming_contour_points ())
     {
-      unsigned count = all_points.length;
-      assert (count >= glyf_impl::PHANTOM_COUNT);
-      count -= glyf_impl::PHANTOM_COUNT;
-      for (unsigned point_index = 0; point_index < count; point_index++)
-	consumer.consume_point (all_points[point_index]);
+      for (auto &point : all_points.as_array ().sub_array (0, count))
+	consumer.consume_point (point);
       consumer.points_end ();
     }
 
@@ -236,7 +234,7 @@ struct glyf_accelerator_t
     contour_point_t *phantoms = consumer.get_phantoms_sink ();
     if (phantoms)
       for (unsigned i = 0; i < glyf_impl::PHANTOM_COUNT; ++i)
-	phantoms[i] = all_points[all_points.length - glyf_impl::PHANTOM_COUNT + i];
+	phantoms[i] = all_points.arrayZ[count + i];
 
     return true;
   }
@@ -299,6 +297,7 @@ struct glyf_accelerator_t
       if (extents) bounds = contour_bounds_t ();
     }
 
+    HB_ALWAYS_INLINE
     void consume_point (const contour_point_t &point) { bounds.add (point); }
     void points_end () { bounds.get_extents (font, extents, scaled); }
 
@@ -431,16 +430,17 @@ glyf::_populate_subset_glyphs (const hb_
 			       hb_vector_t<glyf_impl::SubsetGlyph>& glyphs /* OUT */) const
 {
   OT::glyf_accelerator_t glyf (plan->source);
-  unsigned num_glyphs = plan->num_output_glyphs ();
-  if (!glyphs.resize (num_glyphs)) return false;
+  if (!glyphs.alloc (plan->new_to_old_gid_list.length, true)) return false;
 
-  for (auto p : plan->glyph_map->iter ())
+  for (const auto &pair : plan->new_to_old_gid_list)
   {
-    unsigned new_gid = p.second;
-    glyf_impl::SubsetGlyph& subset_glyph = glyphs.arrayZ[new_gid];
-    subset_glyph.old_gid = p.first;
+    hb_codepoint_t new_gid = pair.first;
+    hb_codepoint_t old_gid = pair.second;
+    glyf_impl::SubsetGlyph *p = glyphs.push ();
+    glyf_impl::SubsetGlyph& subset_glyph = *p;
+    subset_glyph.old_gid = old_gid;
 
-    if (unlikely (new_gid == 0 &&
+    if (unlikely (old_gid == 0 && new_gid == 0 &&
                   !(plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE)) &&
                   !plan->normalized_coords)
       subset_glyph.source_glyph = glyf_impl::Glyph ();
@@ -487,7 +487,7 @@ glyf::_create_font_for_instancing (const
   {
     hb_variation_t var;
     var.tag = _.first;
-    var.value = _.second;
+    var.value = _.second.middle;
     vars.push (var);
   }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/path-builder.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/path-builder.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/glyf/path-builder.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/glyf/path-builder.hh	2024-11-20 13:56:33.000000000 +0000
@@ -21,19 +21,15 @@ struct path_builder_t
     operator bool () const { return has_data; }
 
     bool has_data = false;
-    float x = 0.;
-    float y = 0.;
+    float x;
+    float y;
 
-    optional_point_t lerp (optional_point_t p, float t)
-    { return optional_point_t (x + t * (p.x - x), y + t * (p.y - y)); }
+    optional_point_t mid (optional_point_t p)
+    { return optional_point_t ((x + p.x) * 0.5f, (y + p.y) * 0.5f); }
   } first_oncurve, first_offcurve, first_offcurve2, last_offcurve, last_offcurve2;
 
-  path_builder_t (hb_font_t *font_, hb_draw_session_t &draw_session_)
-  {
-    font = font_;
-    draw_session = &draw_session_;
-    first_oncurve = first_offcurve = first_offcurve2 = last_offcurve = last_offcurve2 = optional_point_t ();
-  }
+  path_builder_t (hb_font_t *font_, hb_draw_session_t &draw_session_) :
+    font (font_), draw_session (&draw_session_) {}
 
   /* based on https://github.com/RazrFalcon/ttf-parser/blob/4f32821/src/glyf.rs#L287
      See also:
@@ -41,6 +37,7 @@ struct path_builder_t
      * https://stackoverflow.com/a/20772557
      *
      * Cubic support added. */
+  HB_ALWAYS_INLINE
   void consume_point (const contour_point_t &point)
   {
     bool is_on_curve = point.flag & glyf_impl::SimpleGlyph::FLAG_ON_CURVE;
@@ -50,7 +47,7 @@ struct path_builder_t
     bool is_cubic = !is_on_curve && (point.flag & glyf_impl::SimpleGlyph::FLAG_CUBIC);
 #endif
     optional_point_t p (font->em_fscalef_x (point.x), font->em_fscalef_y (point.y));
-    if (!first_oncurve)
+    if (unlikely (!first_oncurve))
     {
       if (is_on_curve)
       {
@@ -66,7 +63,7 @@ struct path_builder_t
 	}
 	else if (first_offcurve)
 	{
-	  optional_point_t mid = first_offcurve.lerp (p, .5f);
+	  optional_point_t mid = first_offcurve.mid (p);
 	  first_oncurve = mid;
 	  last_offcurve = p;
 	  draw_session->move_to (mid.x, mid.y);
@@ -102,7 +99,7 @@ struct path_builder_t
 	  }
 	  else
 	  {
-	    optional_point_t mid = last_offcurve.lerp (p, .5f);
+	    optional_point_t mid = last_offcurve.mid (p);
 
 	    if (is_cubic)
 	    {
@@ -127,13 +124,13 @@ struct path_builder_t
       }
     }
 
-    if (point.is_end_point)
+    if (unlikely (point.is_end_point))
     {
       if (first_offcurve && last_offcurve)
       {
-	optional_point_t mid = last_offcurve.lerp (first_offcurve2 ?
-						   first_offcurve2 :
-						   first_offcurve, .5f);
+	optional_point_t mid = last_offcurve.mid (first_offcurve2 ?
+						  first_offcurve2 :
+						  first_offcurve);
 	if (last_offcurve2)
 	  draw_session->cubic_to (last_offcurve2.x, last_offcurve2.y,
 				  last_offcurve.x, last_offcurve.y,
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/name/name.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/name/name.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/OT/name/name.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/OT/name/name.hh	2024-11-20 13:56:33.000000000 +0000
@@ -242,7 +242,9 @@ struct NameRecord
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && offset.sanitize (c, base, length));
+    return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
+		  offset.sanitize (c, base, length));
   }
 
   HBUINT16	platformID;	/* Platform ID. */
@@ -359,7 +361,7 @@ struct name
       record.nameID = ids.name_id;
       record.length = 0; // handled in NameRecord copy()
       record.offset = 0;
-      memcpy (name_records, &record, NameRecord::static_size);
+      hb_memcpy (name_records, &record, NameRecord::static_size);
       name_records++;
     }
 #endif
@@ -384,10 +386,7 @@ struct name
 
   bool subset (hb_subset_context_t *c) const
   {
-    TRACE_SUBSET (this);
-
-    name *name_prime = c->serializer->start_embed<name> ();
-    if (unlikely (!name_prime)) return_trace (false);
+    auto *name_prime = c->serializer->start_embed<name> ();
 
 #ifdef HB_EXPERIMENTAL_API
     const hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> *name_table_overrides =
@@ -436,7 +435,7 @@ struct name
     if (!name_table_overrides->is_empty ())
     {
       if (unlikely (!insert_name_records.alloc (name_table_overrides->get_population (), true)))
-        return_trace (false);
+        return false;
       for (const auto& record_ids : name_table_overrides->keys ())
       {
         if (name_table_overrides->get (record_ids).length == 0)
@@ -448,13 +447,13 @@ struct name
     }
 #endif
 
-    return (name_prime->serialize (c->serializer, it,
-                                   std::addressof (this + stringOffset)
+    return name_prime->serialize (c->serializer, it,
+				  std::addressof (this + stringOffset)
 #ifdef HB_EXPERIMENTAL_API
-                                   , insert_name_records
-                                   , name_table_overrides
+				  , insert_name_records
+				  , name_table_overrides
 #endif
-                                   ));
+				  );
   }
 
   bool sanitize_records (hb_sanitize_context_t *c) const
@@ -468,6 +467,7 @@ struct name
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  likely (format == 0 || format == 1) &&
 		  c->check_array (nameRecordZ.arrayZ, count) &&
 		  c->check_range (this, stringOffset) &&
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/classdef-graph.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/classdef-graph.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/classdef-graph.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/classdef-graph.hh	2024-11-20 13:56:33.000000000 +0000
@@ -39,6 +39,7 @@ struct ClassDefFormat1 : public OT::Clas
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
     constexpr unsigned min_size = OT::ClassDefFormat1_3<SmallTypes>::min_size;
     if (vertex_len < min_size) return false;
+    hb_barrier ();
     return vertex_len >= min_size + classValue.get_size () - classValue.len.get_size ();
   }
 };
@@ -50,6 +51,7 @@ struct ClassDefFormat2 : public OT::Clas
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
     constexpr unsigned min_size = OT::ClassDefFormat2_4<SmallTypes>::min_size;
     if (vertex_len < min_size) return false;
+    hb_barrier ();
     return vertex_len >= min_size + rangeRecord.get_size () - rangeRecord.len.get_size ();
   }
 };
@@ -72,7 +74,7 @@ struct ClassDef : public OT::ClassDef
     class_def_link->width = SmallTypes::size;
     class_def_link->objidx = class_def_prime_id;
     class_def_link->position = link_position;
-    class_def_prime_vertex.parents.push (parent_id);
+    class_def_prime_vertex.add_parent (parent_id);
 
     return true;
   }
@@ -94,7 +96,13 @@ struct ClassDef : public OT::ClassDef
     }
 
     hb_bytes_t class_def_copy = serializer.copy_bytes ();
-    c.add_buffer ((char *) class_def_copy.arrayZ); // Give ownership to the context, it will cleanup the buffer.
+    if (!class_def_copy.arrayZ) return false;
+    // Give ownership to the context, it will cleanup the buffer.
+    if (!c.add_buffer ((char *) class_def_copy.arrayZ))
+    {
+      hb_free ((char *) class_def_copy.arrayZ);
+      return false;
+    }
 
     auto& obj = c.graph.vertices_[dest_obj].obj;
     obj.head = (char *) class_def_copy.arrayZ;
@@ -108,6 +116,7 @@ struct ClassDef : public OT::ClassDef
   {
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
     if (vertex_len < OT::ClassDef::min_size) return false;
+    hb_barrier ();
     switch (u.format)
     {
     case 1: return ((ClassDefFormat1*)this)->sanitize (vertex);
@@ -125,20 +134,23 @@ struct ClassDef : public OT::ClassDef
 
 struct class_def_size_estimator_t
 {
+  // TODO(garretrieger): update to support beyond64k coverage/classdef tables.
+  constexpr static unsigned class_def_format1_base_size = 6;
+  constexpr static unsigned class_def_format2_base_size = 4;
+  constexpr static unsigned coverage_base_size = 4;
+  constexpr static unsigned bytes_per_range = 6;
+  constexpr static unsigned bytes_per_glyph = 2;
+
   template<typename It>
   class_def_size_estimator_t (It glyph_and_class)
-      : gids_consecutive (true), num_ranges_per_class (), glyphs_per_class ()
+      : num_ranges_per_class (), glyphs_per_class ()
   {
-    unsigned last_gid = (unsigned) -1;
+    reset();
     for (auto p : + glyph_and_class)
     {
       unsigned gid = p.first;
       unsigned klass = p.second;
 
-      if (last_gid != (unsigned) -1 && gid != last_gid + 1)
-        gids_consecutive = false;
-      last_gid = gid;
-
       hb_set_t* glyphs;
       if (glyphs_per_class.has (klass, &glyphs) && glyphs) {
         glyphs->add (gid);
@@ -168,28 +180,54 @@ struct class_def_size_estimator_t
     }
   }
 
-  // Incremental increase in the Coverage and ClassDef table size
-  // (worst case) if all glyphs associated with 'klass' were added.
-  unsigned incremental_coverage_size (unsigned klass) const
+  void reset() {
+    class_def_1_size = class_def_format1_base_size;
+    class_def_2_size = class_def_format2_base_size;
+    included_glyphs.clear();
+    included_classes.clear();
+  }
+
+  // Compute the size of coverage for all glyphs added via 'add_class_def_size'.
+  unsigned coverage_size () const
   {
-    // Coverage takes 2 bytes per glyph worst case,
-    return 2 * glyphs_per_class.get (klass).get_population ();
+    unsigned format1_size = coverage_base_size + bytes_per_glyph * included_glyphs.get_population();
+    unsigned format2_size = coverage_base_size + bytes_per_range * num_glyph_ranges();
+    return hb_min(format1_size, format2_size);
   }
 
-  // Incremental increase in the Coverage and ClassDef table size
-  // (worst case) if all glyphs associated with 'klass' were added.
-  unsigned incremental_class_def_size (unsigned klass) const
+  // Compute the new size of the ClassDef table if all glyphs associated with 'klass' were added.
+  unsigned add_class_def_size (unsigned klass)
   {
-    // ClassDef takes 6 bytes per range
-    unsigned class_def_2_size = 6 * num_ranges_per_class.get (klass);
-    if (gids_consecutive)
-    {
-      // ClassDef1 takes 2 bytes per glyph, but only can be used
-      // when gids are consecutive.
-      return hb_min (2 * glyphs_per_class.get (klass).get_population (), class_def_2_size);
+    if (!included_classes.has(klass)) {
+      hb_set_t* glyphs = nullptr;
+      if (glyphs_per_class.has(klass, &glyphs)) {
+        included_glyphs.union_(*glyphs);
+      }
+
+      class_def_1_size = class_def_format1_base_size;
+      if (!included_glyphs.is_empty()) {
+        unsigned min_glyph = included_glyphs.get_min();
+        unsigned max_glyph = included_glyphs.get_max();
+        class_def_1_size += bytes_per_glyph * (max_glyph - min_glyph + 1);
+      }
+
+      class_def_2_size += bytes_per_range * num_ranges_per_class.get (klass);
+
+      included_classes.add(klass);
     }
 
-    return class_def_2_size;
+    return hb_min (class_def_1_size, class_def_2_size);
+  }
+
+  unsigned num_glyph_ranges() const {
+    hb_codepoint_t start = HB_SET_VALUE_INVALID;
+    hb_codepoint_t end = HB_SET_VALUE_INVALID;
+
+    unsigned count = 0;
+    while (included_glyphs.next_range (&start, &end)) {
+        count++;
+    }
+    return count;
   }
 
   bool in_error ()
@@ -205,9 +243,12 @@ struct class_def_size_estimator_t
   }
 
  private:
-  bool gids_consecutive;
   hb_hashmap_t<unsigned, unsigned> num_ranges_per_class;
   hb_hashmap_t<unsigned, hb_set_t> glyphs_per_class;
+  hb_set_t included_classes;
+  hb_set_t included_glyphs;
+  unsigned class_def_1_size;
+  unsigned class_def_2_size;
 };
 
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/coverage-graph.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/coverage-graph.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/coverage-graph.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/coverage-graph.hh	2024-11-20 13:56:33.000000000 +0000
@@ -39,6 +39,7 @@ struct CoverageFormat1 : public OT::Layo
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
     constexpr unsigned min_size = OT::Layout::Common::CoverageFormat1_3<SmallTypes>::min_size;
     if (vertex_len < min_size) return false;
+    hb_barrier ();
     return vertex_len >= min_size + glyphArray.get_size () - glyphArray.len.get_size ();
   }
 };
@@ -50,6 +51,7 @@ struct CoverageFormat2 : public OT::Layo
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
     constexpr unsigned min_size = OT::Layout::Common::CoverageFormat2_4<SmallTypes>::min_size;
     if (vertex_len < min_size) return false;
+    hb_barrier ();
     return vertex_len >= min_size + rangeRecord.get_size () - rangeRecord.len.get_size ();
   }
 };
@@ -96,7 +98,7 @@ struct Coverage : public OT::Layout::Com
     coverage_link->width = SmallTypes::size;
     coverage_link->objidx = coverage_prime_id;
     coverage_link->position = link_position;
-    coverage_prime_vertex.parents.push (parent_id);
+    coverage_prime_vertex.add_parent (parent_id);
 
     return (Coverage*) coverage_prime_vertex.obj.head;
   }
@@ -118,7 +120,13 @@ struct Coverage : public OT::Layout::Com
     }
 
     hb_bytes_t coverage_copy = serializer.copy_bytes ();
-    c.add_buffer ((char *) coverage_copy.arrayZ); // Give ownership to the context, it will cleanup the buffer.
+    if (!coverage_copy.arrayZ) return false;
+    // Give ownership to the context, it will cleanup the buffer.
+    if (!c.add_buffer ((char *) coverage_copy.arrayZ))
+    {
+      hb_free ((char *) coverage_copy.arrayZ);
+      return false;
+    }
 
     auto& obj = c.graph.vertices_[dest_obj].obj;
     obj.head = (char *) coverage_copy.arrayZ;
@@ -132,6 +140,7 @@ struct Coverage : public OT::Layout::Com
   {
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
     if (vertex_len < OT::Layout::Common::Coverage::min_size) return false;
+    hb_barrier ();
     switch (u.format)
     {
     case 1: return ((CoverageFormat1*)this)->sanitize (vertex);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/graph.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/graph.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/graph.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/graph.hh	2024-11-20 13:56:33.000000000 +0000
@@ -43,12 +43,28 @@ struct graph_t
   {
     hb_serialize_context_t::object_t obj;
     int64_t distance = 0 ;
-    int64_t space = 0 ;
-    hb_vector_t<unsigned> parents;
+    unsigned space = 0 ;
     unsigned start = 0;
     unsigned end = 0;
     unsigned priority = 0;
+    private:
+    unsigned incoming_edges_ = 0;
+    unsigned single_parent = (unsigned) -1;
+    hb_hashmap_t<unsigned, unsigned> parents;
+    public:
+
+    auto parents_iter () const HB_AUTO_RETURN
+    (
+      hb_concat (
+	hb_iter (&single_parent, single_parent != (unsigned) -1),
+	parents.keys_ref ()
+      )
+    )
 
+    bool in_error () const
+    {
+      return parents.in_error ();
+    }
 
     bool link_positions_valid (unsigned num_objects, bool removed_nil)
     {
@@ -143,7 +159,9 @@ struct graph_t
       hb_swap (a.obj, b.obj);
       hb_swap (a.distance, b.distance);
       hb_swap (a.space, b.space);
+      hb_swap (a.single_parent, b.single_parent);
       hb_swap (a.parents, b.parents);
+      hb_swap (a.incoming_edges_, b.incoming_edges_);
       hb_swap (a.start, b.start);
       hb_swap (a.end, b.end);
       hb_swap (a.priority, b.priority);
@@ -154,6 +172,7 @@ struct graph_t
     {
       hb_hashmap_t<unsigned, unsigned> result;
 
+      result.alloc (obj.real_links.length);
       for (const auto& l : obj.real_links) {
         result.set (l.position, l.objidx);
       }
@@ -163,27 +182,92 @@ struct graph_t
 
     bool is_shared () const
     {
-      return parents.length > 1;
+      return parents.get_population () > 1;
     }
 
     unsigned incoming_edges () const
     {
-      return parents.length;
+      if (HB_DEBUG_SUBSET_REPACK)
+       {
+	assert (incoming_edges_ == (single_parent != (unsigned) -1) +
+		(parents.values_ref () | hb_reduce (hb_add, 0)));
+       }
+      return incoming_edges_;
+    }
+
+    unsigned incoming_edges_from_parent (unsigned parent_index) const {
+      if (single_parent != (unsigned) -1) {
+        return single_parent == parent_index ? 1 : 0;
+      }
+
+      unsigned* count;
+      return  parents.has(parent_index, &count) ? *count : 0;
+    }
+
+    void reset_parents ()
+    {
+      incoming_edges_ = 0;
+      single_parent = (unsigned) -1;
+      parents.reset ();
+    }
+
+    void add_parent (unsigned parent_index)
+    {
+      assert (parent_index != (unsigned) -1);
+      if (incoming_edges_ == 0)
+      {
+	single_parent = parent_index;
+	incoming_edges_ = 1;
+	return;
+      }
+      else if (single_parent != (unsigned) -1)
+      {
+        assert (incoming_edges_ == 1);
+	if (!parents.set (single_parent, 1))
+	  return;
+	single_parent = (unsigned) -1;
+      }
+
+      unsigned *v;
+      if (parents.has (parent_index, &v))
+      {
+        (*v)++;
+	incoming_edges_++;
+      }
+      else if (parents.set (parent_index, 1))
+	incoming_edges_++;
     }
 
     void remove_parent (unsigned parent_index)
     {
-      for (unsigned i = 0; i < parents.length; i++)
+      if (parent_index == single_parent)
       {
-        if (parents[i] != parent_index) continue;
-        parents.remove_unordered (i);
-        break;
+	single_parent = (unsigned) -1;
+	incoming_edges_--;
+	return;
+      }
+
+      unsigned *v;
+      if (parents.has (parent_index, &v))
+      {
+	incoming_edges_--;
+	if (*v > 1)
+	  (*v)--;
+	else
+	  parents.del (parent_index);
+
+	if (incoming_edges_ == 1)
+	{
+	  single_parent = *parents.keys ();
+	  parents.reset ();
+	}
       }
     }
 
     void remove_real_link (unsigned child_index, const void* offset)
     {
-      for (unsigned i = 0; i < obj.real_links.length; i++)
+      unsigned count = obj.real_links.length;
+      for (unsigned i = 0; i < count; i++)
       {
         auto& link = obj.real_links.arrayZ[i];
         if (link.objidx != child_index)
@@ -197,18 +281,53 @@ struct graph_t
       }
     }
 
-    void remap_parents (const hb_vector_t<unsigned>& id_map)
+    bool remap_parents (const hb_vector_t<unsigned>& id_map)
     {
-      for (unsigned i = 0; i < parents.length; i++)
-        parents[i] = id_map[parents[i]];
+      if (single_parent != (unsigned) -1)
+      {
+        assert (single_parent < id_map.length);
+	single_parent = id_map[single_parent];
+	return true;
+      }
+
+      hb_hashmap_t<unsigned, unsigned> new_parents;
+      new_parents.alloc (parents.get_population ());
+      for (auto _ : parents)
+      {
+	assert (_.first < id_map.length);
+	assert (!new_parents.has (id_map[_.first]));
+	new_parents.set (id_map[_.first], _.second);
+      }
+
+      if (parents.in_error() || new_parents.in_error ())
+        return false;
+
+      parents = std::move (new_parents);
+      return true;
     }
 
     void remap_parent (unsigned old_index, unsigned new_index)
     {
-      for (unsigned i = 0; i < parents.length; i++)
+      if (single_parent != (unsigned) -1)
       {
-        if (parents[i] == old_index)
-          parents[i] = new_index;
+        if (single_parent == old_index)
+	  single_parent = new_index;
+        return;
+      }
+
+      const unsigned *pv;
+      if (parents.has (old_index, &pv))
+      {
+        unsigned v = *pv;
+	if (!parents.set (new_index, v))
+          incoming_edges_ -= v;
+	parents.del (old_index);
+
+        if (incoming_edges_ == 1)
+	{
+	  single_parent = *parents.keys ();
+	  parents.reset ();
+	}
       }
     }
 
@@ -224,6 +343,16 @@ struct graph_t
       return true;
     }
 
+    bool give_max_priority ()
+    {
+      bool result = false;
+      while (!has_max_priority()) {
+        result = true;
+        priority++;
+      }
+      return result;
+    }
+
     bool has_max_priority () const {
       return priority >= 3;
     }
@@ -328,11 +457,12 @@ struct graph_t
     bool removed_nil = false;
     vertices_.alloc (objects.length);
     vertices_scratch_.alloc (objects.length);
-    for (unsigned i = 0; i < objects.length; i++)
+    unsigned count = objects.length;
+    for (unsigned i = 0; i < count; i++)
     {
       // If this graph came from a serialization buffer object 0 is the
       // nil object. We don't need it for our purposes here so drop it.
-      if (i == 0 && !objects[i])
+      if (i == 0 && !objects.arrayZ[i])
       {
         removed_nil = true;
         continue;
@@ -340,9 +470,9 @@ struct graph_t
 
       vertex_t* v = vertices_.push ();
       if (check_success (!vertices_.in_error ()))
-        v->obj = *objects[i];
+        v->obj = *objects.arrayZ[i];
 
-      check_success (v->link_positions_valid (objects.length, removed_nil));
+      check_success (v->link_positions_valid (count, removed_nil));
 
       if (!removed_nil) continue;
       // Fix indices to account for removed nil object.
@@ -354,7 +484,6 @@ struct graph_t
 
   ~graph_t ()
   {
-    vertices_.fini ();
     for (char* b : buffers)
       hb_free (b);
   }
@@ -364,6 +493,18 @@ struct graph_t
     return root ().equals (other.root (), *this, other, 0);
   }
 
+  void print () const {
+    for (int i = vertices_.length - 1; i >= 0; i--)
+    {
+      const auto& v = vertices_[i];
+      printf("%d: %u [", i, (unsigned int)v.table_size());
+      for (const auto &l : v.obj.real_links) {
+        printf("%u, ", l.objidx);
+      }
+      printf("]\n");
+    }
+  }
+
   // Sorts links of all objects in a consistent manner and zeroes all offsets.
   void normalize ()
   {
@@ -396,9 +537,10 @@ struct graph_t
     return vertices_[i].obj;
   }
 
-  void add_buffer (char* buffer)
+  bool add_buffer (char* buffer)
   {
     buffers.push (buffer);
+    return !buffers.in_error ();
   }
 
   /*
@@ -414,7 +556,7 @@ struct graph_t
     link->width = 2;
     link->objidx = child_id;
     link->position = (char*) offset - (char*) v.obj.head;
-    vertices_[child_id].parents.push (parent_id);
+    vertices_[child_id].add_parent (parent_id);
   }
 
   /*
@@ -443,7 +585,8 @@ struct graph_t
 
     update_distances ();
 
-    hb_priority_queue_t queue;
+    hb_priority_queue_t<int64_t> queue;
+    queue.alloc (vertices_.length);
     hb_vector_t<vertex_t> &sorted_graph = vertices_scratch_;
     if (unlikely (!check_success (sorted_graph.resize (vertices_.length)))) return;
     hb_vector_t<unsigned> id_map;
@@ -460,7 +603,7 @@ struct graph_t
     {
       unsigned next_id = queue.pop_minimum().second;
 
-      hb_swap (sorted_graph[new_id], vertices_[next_id]);
+      sorted_graph[new_id] = std::move (vertices_[next_id]);
       const vertex_t& next = sorted_graph[new_id];
 
       if (unlikely (!check_success(new_id >= 0))) {
@@ -488,8 +631,8 @@ struct graph_t
     check_success (!queue.in_error ());
     check_success (!sorted_graph.in_error ());
 
-    remap_all_obj_indices (id_map, &sorted_graph);
-    hb_swap (vertices_, sorted_graph);
+    check_success (remap_all_obj_indices (id_map, &sorted_graph));
+    vertices_ = std::move (sorted_graph);
 
     if (!check_success (new_id == -1))
       print_orphaned_nodes ();
@@ -579,8 +722,8 @@ struct graph_t
     const auto& node = object (node_idx);
     if (offset < node.head || offset >= node.tail) return -1;
 
-    unsigned length = node.real_links.length;
-    for (unsigned i = 0; i < length; i++)
+    unsigned count = node.real_links.length;
+    for (unsigned i = 0; i < count; i++)
     {
       // Use direct access for increased performance, this is a hot method.
       const auto& link = node.real_links.arrayZ[i];
@@ -600,7 +743,7 @@ struct graph_t
   {
     unsigned child_idx = index_for_offset (node_idx, offset);
     auto& child = vertices_[child_idx];
-    for (unsigned p : child.parents)
+    for (unsigned p : child.parents_iter ())
     {
       if (p != node_idx) {
         return duplicate (node_idx, child_idx);
@@ -683,12 +826,15 @@ struct graph_t
       subgraph.set (root_idx, wide_parents (root_idx, parents));
       find_subgraph (root_idx, subgraph);
     }
+    if (subgraph.in_error ())
+      return false;
 
     unsigned original_root_idx = root_idx ();
     hb_map_t index_map;
     bool made_changes = false;
     for (auto entry : subgraph.iter ())
     {
+      assert (entry.first < vertices_.length);
       const auto& node = vertices_[entry.first];
       unsigned subgraph_incoming_edges = entry.second;
 
@@ -727,8 +873,7 @@ struct graph_t
     remap_obj_indices (index_map, parents.iter (), true);
 
     // Update roots set with new indices as needed.
-    uint32_t next = HB_SET_VALUE_INVALID;
-    while (roots.next (&next))
+    for (auto next : roots)
     {
       const uint32_t *v;
       if (index_map.has (next, &v))
@@ -745,10 +890,10 @@ struct graph_t
   {
     for (const auto& link : vertices_[node_idx].obj.all_links ())
     {
-      const uint32_t *v;
+      hb_codepoint_t *v;
       if (subgraph.has (link.objidx, &v))
       {
-        subgraph.set (link.objidx, *v + 1);
+        (*v)++;
         continue;
       }
       subgraph.set (link.objidx, 1);
@@ -820,7 +965,7 @@ struct graph_t
     new_link->position = (const char*) new_offset - (const char*) new_v.obj.head;
 
     auto& child = vertices_[child_id];
-    child.parents.push (new_parent_idx);
+    child.add_parent (new_parent_idx);
 
     old_v.remove_real_link (child_id, old_offset);
     child.remove_parent (old_parent_idx);
@@ -864,18 +1009,18 @@ struct graph_t
     clone->obj.tail = child.obj.tail;
     clone->distance = child.distance;
     clone->space = child.space;
-    clone->parents.reset ();
+    clone->reset_parents ();
 
     unsigned clone_idx = vertices_.length - 2;
     for (const auto& l : child.obj.real_links)
     {
       clone->obj.real_links.push (l);
-      vertices_[l.objidx].parents.push (clone_idx);
+      vertices_[l.objidx].add_parent (clone_idx);
     }
     for (const auto& l : child.obj.virtual_links)
     {
       clone->obj.virtual_links.push (l);
-      vertices_[l.objidx].parents.push (clone_idx);
+      vertices_[l.objidx].add_parent (clone_idx);
     }
 
     check_success (!clone->obj.real_links.in_error ());
@@ -897,6 +1042,11 @@ struct graph_t
    * Creates a copy of child and re-assigns the link from
    * parent to the clone. The copy is a shallow copy, objects
    * linked from child are not duplicated.
+   *
+   * Returns the index of the newly created duplicate.
+   *
+   * If the child_idx only has incoming edges from parent_idx, this
+   * will do nothing and return the original child_idx.
    */
   unsigned duplicate_if_shared (unsigned parent_idx, unsigned child_idx)
   {
@@ -910,18 +1060,20 @@ struct graph_t
    * Creates a copy of child and re-assigns the link from
    * parent to the clone. The copy is a shallow copy, objects
    * linked from child are not duplicated.
+   *
+   * Returns the index of the newly created duplicate.
+   *
+   * If the child_idx only has incoming edges from parent_idx,
+   * duplication isn't possible and this will return -1.
    */
   unsigned duplicate (unsigned parent_idx, unsigned child_idx)
   {
     update_parents ();
 
-    unsigned links_to_child = 0;
-    for (const auto& l : vertices_[parent_idx].obj.all_links ())
-    {
-      if (l.objidx == child_idx) links_to_child++;
-    }
+    const auto& child = vertices_[child_idx];
+    unsigned links_to_child = child.incoming_edges_from_parent(parent_idx);
 
-    if (vertices_[child_idx].incoming_edges () <= links_to_child)
+    if (child.incoming_edges () <= links_to_child)
     {
       // Can't duplicate this node, doing so would orphan the original one as all remaining links
       // to child are from parent.
@@ -934,7 +1086,7 @@ struct graph_t
                parent_idx, child_idx);
 
     unsigned clone_idx = duplicate (child_idx);
-    if (clone_idx == (unsigned) -1) return false;
+    if (clone_idx == (unsigned) -1) return -1;
     // duplicate shifts the root node idx, so if parent_idx was root update it.
     if (parent_idx == clone_idx) parent_idx++;
 
@@ -950,6 +1102,62 @@ struct graph_t
     return clone_idx;
   }
 
+  /*
+   * Creates a copy of child and re-assigns the links from
+   * parents to the clone. The copy is a shallow copy, objects
+   * linked from child are not duplicated.
+   *
+   * Returns the index of the newly created duplicate.
+   *
+   * If the child_idx only has incoming edges from parents,
+   * duplication isn't possible or duplication fails and this will
+   * return -1.
+   */
+  unsigned duplicate (const hb_set_t* parents, unsigned child_idx)
+  {
+    if (parents->is_empty()) {
+      return -1;
+    }
+
+    update_parents ();
+
+    const auto& child = vertices_[child_idx];
+    unsigned links_to_child = 0;
+    unsigned last_parent = parents->get_max();
+    unsigned first_parent = parents->get_min();
+    for (unsigned parent_idx : *parents) {
+      links_to_child += child.incoming_edges_from_parent(parent_idx);
+    }
+
+    if (child.incoming_edges () <= links_to_child)
+    {
+      // Can't duplicate this node, doing so would orphan the original one as all remaining links
+      // to child are from parent.
+      DEBUG_MSG (SUBSET_REPACK, nullptr, "  Not duplicating %u, ..., %u => %u", first_parent, last_parent, child_idx);
+      return -1;
+    }
+
+    DEBUG_MSG (SUBSET_REPACK, nullptr, "  Duplicating %u, ..., %u => %u", first_parent, last_parent, child_idx);
+
+    unsigned clone_idx = duplicate (child_idx);
+    if (clone_idx == (unsigned) -1) return false;
+    
+    for (unsigned parent_idx : *parents) {
+      // duplicate shifts the root node idx, so if parent_idx was root update it.
+      if (parent_idx == clone_idx) parent_idx++;
+      auto& parent = vertices_[parent_idx];
+      for (auto& l : parent.obj.all_links_writer ())
+      {
+        if (l.objidx != child_idx)
+          continue;
+
+        reassign_link (l, parent_idx, clone_idx);
+      }
+    }
+
+    return clone_idx;
+  }
+
 
   /*
    * Adds a new node to the graph, not connected to anything.
@@ -1004,13 +1212,13 @@ struct graph_t
   {
     update_parents();
 
-    if (root().parents)
+    if (root().incoming_edges ())
       // Root cannot have parents.
       return false;
 
     for (unsigned i = 0; i < root_idx (); i++)
     {
-      if (!vertices_[i].parents)
+      if (!vertices_[i].incoming_edges ())
         return false;
     }
     return true;
@@ -1074,14 +1282,14 @@ struct graph_t
     parents_invalid = true;
     update_parents();
 
-    if (root().parents) {
+    if (root().incoming_edges ()) {
       DEBUG_MSG (SUBSET_REPACK, nullptr, "Root node has incoming edges.");
     }
 
     for (unsigned i = 0; i < root_idx (); i++)
     {
       const auto& v = vertices_[i];
-      if (!v.parents)
+      if (!v.incoming_edges ())
         DEBUG_MSG (SUBSET_REPACK, nullptr, "Node %u is orphaned.", i);
     }
   }
@@ -1113,6 +1321,8 @@ struct graph_t
 
   unsigned space_for (unsigned index, unsigned* root = nullptr) const
   {
+  loop:
+    assert (index < vertices_.length);
     const auto& node = vertices_[index];
     if (node.space)
     {
@@ -1121,22 +1331,24 @@ struct graph_t
       return node.space;
     }
 
-    if (!node.parents)
+    if (!node.incoming_edges ())
     {
       if (root)
         *root = index;
       return 0;
     }
 
-    return space_for (node.parents[0], root);
+    index = *node.parents_iter ();
+    goto loop;
   }
 
   void err_other_error () { this->successful = false; }
 
   size_t total_size_in_bytes () const {
     size_t total_size = 0;
-    for (unsigned i = 0; i < vertices_.length; i++) {
-      size_t size = vertices_[i].obj.tail - vertices_[i].obj.head;
+    unsigned count = vertices_.length;
+    for (unsigned i = 0; i < count; i++) {
+      size_t size = vertices_.arrayZ[i].obj.tail - vertices_.arrayZ[i].obj.head;
       total_size += size;
     }
     return total_size;
@@ -1151,12 +1363,8 @@ struct graph_t
   unsigned wide_parents (unsigned node_idx, hb_set_t& parents) const
   {
     unsigned count = 0;
-    hb_set_t visited;
-    for (unsigned p : vertices_[node_idx].parents)
+    for (unsigned p : vertices_[node_idx].parents_iter ())
     {
-      if (visited.has (p)) continue;
-      visited.add (p);
-
       // Only real links can be wide
       for (const auto& l : vertices_[p].obj.real_links)
       {
@@ -1183,21 +1391,21 @@ struct graph_t
   {
     if (!parents_invalid) return;
 
-    for (unsigned i = 0; i < vertices_.length; i++)
-      vertices_[i].parents.reset ();
+    unsigned count = vertices_.length;
 
-    for (unsigned p = 0; p < vertices_.length; p++)
+    for (unsigned i = 0; i < count; i++)
+      vertices_.arrayZ[i].reset_parents ();
+
+    for (unsigned p = 0; p < count; p++)
     {
-      for (auto& l : vertices_[p].obj.all_links ())
-      {
-        vertices_[l.objidx].parents.push (p);
-      }
+      for (auto& l : vertices_.arrayZ[p].obj.all_links ())
+        vertices_[l.objidx].add_parent (p);
     }
 
-    for (unsigned i = 0; i < vertices_.length; i++)
+    for (unsigned i = 0; i < count; i++)
       // parents arrays must be accurate or downstream operations like cycle detection
       // and sorting won't work correctly.
-      check_success (!vertices_[i].parents.in_error ());
+      check_success (!vertices_.arrayZ[i].in_error ());
 
     parents_invalid = false;
   }
@@ -1239,15 +1447,13 @@ struct graph_t
     // According to https://www3.cs.stonybrook.edu/~rezaul/papers/TR-07-54.pdf
     // for practical performance this is faster then using a more advanced queue
     // (such as a fibonacci queue) with a fast decrease priority.
-    for (unsigned i = 0; i < vertices_.length; i++)
-    {
-      if (i == vertices_.length - 1)
-        vertices_[i].distance = 0;
-      else
-        vertices_[i].distance = hb_int_max (int64_t);
-    }
+    unsigned count = vertices_.length;
+    for (unsigned i = 0; i < count; i++)
+      vertices_.arrayZ[i].distance = hb_int_max (int64_t);
+    vertices_.tail ().distance = 0;
 
-    hb_priority_queue_t queue;
+    hb_priority_queue_t<int64_t> queue;
+    queue.alloc (count);
     queue.insert (0, vertices_.length - 1);
 
     hb_vector_t<bool> visited;
@@ -1265,15 +1471,15 @@ struct graph_t
       {
         if (visited[link.objidx]) continue;
 
-        const auto& child = vertices_[link.objidx].obj;
+        const auto& child = vertices_.arrayZ[link.objidx].obj;
         unsigned link_width = link.width ? link.width : 4; // treat virtual offsets as 32 bits wide
         int64_t child_weight = (child.tail - child.head) +
-                               ((int64_t) 1 << (link_width * 8)) * (vertices_[link.objidx].space + 1);
+                               ((int64_t) 1 << (link_width * 8)) * (vertices_.arrayZ[link.objidx].space + 1);
         int64_t child_distance = next_distance + child_weight;
 
-        if (child_distance < vertices_[link.objidx].distance)
+        if (child_distance < vertices_.arrayZ[link.objidx].distance)
         {
-          vertices_[link.objidx].distance = child_distance;
+          vertices_.arrayZ[link.objidx].distance = child_distance;
           queue.insert (child_distance, link.objidx);
         }
       }
@@ -1301,7 +1507,7 @@ struct graph_t
     unsigned old_idx = link.objidx;
     link.objidx = new_idx;
     vertices_[old_idx].remove_parent (parent_idx);
-    vertices_[new_idx].parents.push (parent_idx);
+    vertices_[new_idx].add_parent (parent_idx);
   }
 
   /*
@@ -1329,17 +1535,20 @@ struct graph_t
   /*
    * Updates all objidx's in all links using the provided mapping.
    */
-  void remap_all_obj_indices (const hb_vector_t<unsigned>& id_map,
+  bool remap_all_obj_indices (const hb_vector_t<unsigned>& id_map,
                               hb_vector_t<vertex_t>* sorted_graph) const
   {
-    for (unsigned i = 0; i < sorted_graph->length; i++)
+    unsigned count = sorted_graph->length;
+    for (unsigned i = 0; i < count; i++)
     {
-      (*sorted_graph)[i].remap_parents (id_map);
-      for (auto& link : (*sorted_graph)[i].obj.all_links_writer ())
+      if (!(*sorted_graph)[i].remap_parents (id_map))
+        return false;
+      for (auto& link : sorted_graph->arrayZ[i].obj.all_links_writer ())
       {
         link.objidx = id_map[link.objidx];
       }
     }
+    return true;
   }
 
   /*
@@ -1370,7 +1579,7 @@ struct graph_t
     for (const auto& l : v.obj.all_links ())
       find_connected_nodes (l.objidx, targets, visited, connected);
 
-    for (unsigned p : v.parents)
+    for (unsigned p : v.parents_iter ())
       find_connected_nodes (p, targets, visited, connected);
   }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.cc	2024-11-20 13:56:33.000000000 +0000
@@ -52,7 +52,11 @@ unsigned gsubgpos_graph_context_t::creat
   if (!buffer)
     return -1;
 
-  add_buffer (buffer);
+  if (!add_buffer (buffer)) {
+    // Allocation did not get stored for freeing later.
+    hb_free (buffer);
+    return -1;
+  }
 
   return graph.new_node (buffer, buffer + size);
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.hh	2024-11-20 13:56:33.000000000 +0000
@@ -40,16 +40,16 @@ struct gsubgpos_graph_context_t
   graph_t& graph;
   unsigned lookup_list_index;
   hb_hashmap_t<unsigned, graph::Lookup*> lookups;
-
+  hb_hashmap_t<unsigned, unsigned> subtable_to_extension;
 
   HB_INTERNAL gsubgpos_graph_context_t (hb_tag_t table_tag_,
                                         graph_t& graph_);
 
   HB_INTERNAL unsigned create_node (unsigned size);
 
-  void add_buffer (char* buffer)
+  bool add_buffer (char* buffer)
   {
-    graph.add_buffer (buffer);
+    return graph.add_buffer (buffer);
   }
 
  private:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-graph.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-graph.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-graph.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-graph.hh	2024-11-20 13:56:33.000000000 +0000
@@ -76,6 +76,7 @@ struct Lookup : public OT::Lookup
   {
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
     if (vertex_len < OT::Lookup::min_size) return false;
+    hb_barrier ();
     return vertex_len >= this->get_size ();
   }
 
@@ -166,7 +167,7 @@ struct Lookup : public OT::Lookup
     }
 
     if (all_new_subtables) {
-      add_sub_tables (c, this_index, type, all_new_subtables);
+      return add_sub_tables (c, this_index, type, all_new_subtables);
     }
 
     return true;
@@ -184,7 +185,7 @@ struct Lookup : public OT::Lookup
     return sub_table->split_subtables (c, parent_idx, objidx);
   }
 
-  void add_sub_tables (gsubgpos_graph_context_t& c,
+  bool add_sub_tables (gsubgpos_graph_context_t& c,
                        unsigned this_index,
                        unsigned type,
                        hb_vector_t<hb_pair_t<unsigned, hb_vector_t<unsigned>>>& subtable_ids)
@@ -200,7 +201,12 @@ struct Lookup : public OT::Lookup
     size_t new_size = v.table_size ()
                       + new_subtable_count * OT::Offset16::static_size;
     char* buffer = (char*) hb_calloc (1, new_size);
-    c.add_buffer (buffer);
+    if (!buffer) return false;
+    if (!c.add_buffer (buffer))
+    {
+      hb_free (buffer);
+     return false;
+    }
     hb_memcpy (buffer, v.obj.head, v.table_size());
 
     v.obj.head = buffer;
@@ -220,7 +226,7 @@ struct Lookup : public OT::Lookup
         if (is_ext)
         {
           unsigned ext_id = create_extension_subtable (c, subtable_id, type);
-          c.graph.vertices_[subtable_id].parents.push (ext_id);
+          c.graph.vertices_[subtable_id].add_parent (ext_id);
           subtable_id = ext_id;
         }
 
@@ -229,7 +235,7 @@ struct Lookup : public OT::Lookup
         link->objidx = subtable_id;
         link->position = (char*) &new_lookup->subTable[offset_index++] -
                          (char*) new_lookup;
-        c.graph.vertices_[subtable_id].parents.push (this_index);
+        c.graph.vertices_[subtable_id].add_parent (this_index);
       }
     }
 
@@ -239,6 +245,7 @@ struct Lookup : public OT::Lookup
     // The head location of the lookup has changed, invalidating the lookups map entry
     // in the context. Update the map.
     c.lookups.set (this_index, new_lookup);
+    return true;
   }
 
   void fix_existing_subtable_links (gsubgpos_graph_context_t& c,
@@ -293,24 +300,35 @@ struct Lookup : public OT::Lookup
                                 unsigned subtable_index)
   {
     unsigned type = lookupType;
+    unsigned ext_index = -1;
+    unsigned* existing_ext_index = nullptr;
+    if (c.subtable_to_extension.has(subtable_index, &existing_ext_index)) {
+      ext_index = *existing_ext_index;
+    } else {    
+      ext_index = create_extension_subtable(c, subtable_index, type);
+      c.subtable_to_extension.set(subtable_index, ext_index);
+    }
 
-    unsigned ext_index = create_extension_subtable(c, subtable_index, type);
     if (ext_index == (unsigned) -1)
       return false;
 
+    auto& subtable_vertex = c.graph.vertices_[subtable_index];
     auto& lookup_vertex = c.graph.vertices_[lookup_index];
     for (auto& l : lookup_vertex.obj.real_links.writer ())
     {
-      if (l.objidx == subtable_index)
+      if (l.objidx == subtable_index) {
         // Change lookup to point at the extension.
         l.objidx = ext_index;
+        if (existing_ext_index)
+          subtable_vertex.remove_parent(lookup_index);
+      }
     }
 
     // Make extension point at the subtable.
     auto& ext_vertex = c.graph.vertices_[ext_index];
-    auto& subtable_vertex = c.graph.vertices_[subtable_index];
-    ext_vertex.parents.push (lookup_index);
-    subtable_vertex.remap_parent (lookup_index, ext_index);
+    ext_vertex.add_parent (lookup_index);
+    if (!existing_ext_index)
+      subtable_vertex.remap_parent (lookup_index, ext_index);
 
     return true;
   }
@@ -334,6 +352,7 @@ struct LookupList : public OT::LookupLis
   {
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
     if (vertex_len < OT::LookupList<T>::min_size) return false;
+    hb_barrier ();
     return vertex_len >= OT::LookupList<T>::item_size * this->len;
   }
 };
@@ -347,6 +366,7 @@ struct GSTAR : public OT::GSUBGPOS
     GSTAR* gstar = (GSTAR*) r.obj.head;
     if (!gstar || !gstar->sanitize (r))
       return nullptr;
+    hb_barrier ();
 
     return gstar;
   }
@@ -366,6 +386,7 @@ struct GSTAR : public OT::GSUBGPOS
   {
     int64_t len = vertex.obj.tail - vertex.obj.head;
     if (len < OT::GSUBGPOS::min_size) return false;
+    hb_barrier ();
     return len >= get_size ();
   }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/markbasepos-graph.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/markbasepos-graph.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/markbasepos-graph.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/markbasepos-graph.hh	2024-11-20 13:56:33.000000000 +0000
@@ -40,6 +40,7 @@ struct AnchorMatrix : public OT::Layout:
   {
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
     if (vertex_len < AnchorMatrix::min_size) return false;
+    hb_barrier ();
 
     return vertex_len >= AnchorMatrix::min_size +
         OT::Offset16::static_size * class_count * this->rows;
@@ -128,6 +129,7 @@ struct MarkArray : public OT::Layout::GP
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
     unsigned min_size = MarkArray::min_size;
     if (vertex_len < min_size) return false;
+    hb_barrier ();
 
     return vertex_len >= get_size ();
   }
@@ -217,7 +219,7 @@ struct MarkBasePosFormat1 : public OT::L
 
     const unsigned base_coverage_id = c.graph.index_for_offset (this_index, &baseCoverage);
     const unsigned base_size =
-        OT::Layout::GPOS_impl::PairPosFormat1_3<SmallTypes>::min_size +
+        OT::Layout::GPOS_impl::MarkBasePosFormat1_2<SmallTypes>::min_size +
         MarkArray::min_size +
         AnchorMatrix::min_size +
         c.graph.vertices_[base_coverage_id].table_size ();
@@ -318,8 +320,11 @@ struct MarkBasePosFormat1 : public OT::L
   {
     hb_vector_t<class_info_t> class_to_info;
 
-    unsigned class_count= classCount;
-    class_to_info.resize (class_count);
+    unsigned class_count = classCount;
+    if (!class_count) return class_to_info;
+
+    if (!class_to_info.resize (class_count))
+      return hb_vector_t<class_info_t>();
 
     auto mark_array = c.graph.as_table<MarkArray> (this_index, &markArray);
     if (!mark_array) return hb_vector_t<class_info_t> ();
@@ -327,6 +332,7 @@ struct MarkBasePosFormat1 : public OT::L
     for (unsigned mark = 0; mark < mark_count; mark++)
     {
       unsigned klass = (*mark_array.table)[mark].get_class ();
+      if (klass >= class_count) continue;
       class_to_info[klass].marks.add (mark);
     }
 
@@ -335,6 +341,7 @@ struct MarkBasePosFormat1 : public OT::L
       unsigned mark = (link.position - 2) /
                      OT::Layout::GPOS_impl::MarkRecord::static_size;
       unsigned klass = (*mark_array.table)[mark].get_class ();
+      if (klass >= class_count) continue;
       class_to_info[klass].child_indices.push (link.objidx);
     }
 
@@ -479,7 +486,7 @@ struct MarkBasePos : public OT::Layout::
       return ((MarkBasePosFormat1*)(&u.format1))->split_subtables (c, parent_index, this_index);
 #ifndef HB_NO_BEYOND_64K
     case 2: HB_FALLTHROUGH;
-      // Don't split 24bit PairPos's.
+      // Don't split 24bit MarkBasePos's.
 #endif
     default:
       return hb_vector_t<unsigned> ();
@@ -490,6 +497,7 @@ struct MarkBasePos : public OT::Layout::
   {
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
     if (vertex_len < u.format.get_size ()) return false;
+    hb_barrier ();
 
     switch (u.format) {
     case 1:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/pairpos-graph.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/pairpos-graph.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/pairpos-graph.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/pairpos-graph.hh	2024-11-20 13:56:33.000000000 +0000
@@ -42,6 +42,7 @@ struct PairPosFormat1 : public OT::Layou
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
     unsigned min_size = OT::Layout::GPOS_impl::PairPosFormat1_3<SmallTypes>::min_size;
     if (vertex_len < min_size) return false;
+    hb_barrier ();
 
     return vertex_len >=
         min_size + pairSet.get_size () - pairSet.len.get_size();
@@ -198,6 +199,7 @@ struct PairPosFormat2 : public OT::Layou
     size_t vertex_len = vertex.table_size ();
     unsigned min_size = OT::Layout::GPOS_impl::PairPosFormat2_4<SmallTypes>::min_size;
     if (vertex_len < min_size) return false;
+    hb_barrier ();
 
     const unsigned class1_count = class1Count;
     return vertex_len >=
@@ -215,7 +217,7 @@ struct PairPosFormat2 : public OT::Layou
     auto gid_and_class =
         + coverage->iter ()
         | hb_map_retains_sorting ([&] (hb_codepoint_t gid) {
-          return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (gid, class_def_1->get_class (gid));
+          return hb_codepoint_pair_t (gid, class_def_1->get_class (gid));
         })
         ;
     class_def_size_estimator_t estimator (gid_and_class);
@@ -245,8 +247,8 @@ struct PairPosFormat2 : public OT::Layou
     for (unsigned i = 0; i < class1_count; i++)
     {
       unsigned accumulated_delta = class1_record_size;
-      coverage_size += estimator.incremental_coverage_size (i);
-      class_def_1_size += estimator.incremental_class_def_size (i);
+      class_def_1_size = estimator.add_class_def_size (i);
+      coverage_size = estimator.coverage_size ();
       max_coverage_size = hb_max (max_coverage_size, coverage_size);
       max_class_def_1_size = hb_max (max_class_def_1_size, class_def_1_size);
 
@@ -278,8 +280,10 @@ struct PairPosFormat2 : public OT::Layou
         split_points.push (i);
         // split does not include i, so add the size for i when we reset the size counters.
         accumulated = base_size + accumulated_delta;
-        coverage_size = 4 + estimator.incremental_coverage_size (i);
-        class_def_1_size = 4 + estimator.incremental_class_def_size (i);
+
+        estimator.reset();
+        class_def_1_size = estimator.add_class_def_size(i);
+        coverage_size = estimator.coverage_size();
         visited.clear (); // node sharing isn't allowed between splits.
       }
     }
@@ -386,14 +390,14 @@ struct PairPosFormat2 : public OT::Layou
     auto klass_map =
     + coverage_table->iter ()
     | hb_map_retains_sorting ([&] (hb_codepoint_t gid) {
-      return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (gid, class_def_1_table->get_class (gid));
+      return hb_codepoint_pair_t (gid, class_def_1_table->get_class (gid));
     })
     | hb_filter ([&] (hb_codepoint_t klass) {
       return klass >= start && klass < end;
     }, hb_second)
-    | hb_map_retains_sorting ([&] (hb_pair_t<hb_codepoint_t, hb_codepoint_t> gid_and_class) {
+    | hb_map_retains_sorting ([&] (hb_codepoint_pair_t gid_and_class) {
       // Classes must be from 0...N so subtract start
-      return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (gid_and_class.first, gid_and_class.second - start);
+      return hb_codepoint_pair_t (gid_and_class.first, gid_and_class.second - start);
     })
     ;
 
@@ -419,7 +423,7 @@ struct PairPosFormat2 : public OT::Layou
     class_def_link->width = SmallTypes::size;
     class_def_link->objidx = class_def_2_id;
     class_def_link->position = 10;
-    graph.vertices_[class_def_2_id].parents.push (pair_pos_prime_id);
+    graph.vertices_[class_def_2_id].add_parent (pair_pos_prime_id);
     graph.duplicate (pair_pos_prime_id, class_def_2_id);
 
     return pair_pos_prime_id;
@@ -519,7 +523,7 @@ struct PairPosFormat2 : public OT::Layou
     auto klass_map =
     + coverage.table->iter ()
     | hb_map_retains_sorting ([&] (hb_codepoint_t gid) {
-      return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (gid, class_def_1.table->get_class (gid));
+      return hb_codepoint_pair_t (gid, class_def_1.table->get_class (gid));
     })
     | hb_filter ([&] (hb_codepoint_t klass) {
       return klass < count;
@@ -625,6 +629,7 @@ struct PairPos : public OT::Layout::GPOS
   {
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
     if (vertex_len < u.format.get_size ()) return false;
+    hb_barrier ();
 
     switch (u.format) {
     case 1:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/serialize.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/serialize.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/serialize.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/serialize.hh	2024-11-20 13:56:33.000000000 +0000
@@ -116,10 +116,10 @@ will_overflow (graph_t& graph,
   for (int parent_idx = vertices.length - 1; parent_idx >= 0; parent_idx--)
   {
     // Don't need to check virtual links for overflow
-    for (const auto& link : vertices[parent_idx].obj.real_links)
+    for (const auto& link : vertices.arrayZ[parent_idx].obj.real_links)
     {
       int64_t offset = compute_offset (graph, parent_idx, link);
-      if (is_valid_offset (offset, link))
+      if (likely (is_valid_offset (offset, link)))
         continue;
 
       if (!overflows) return true;
@@ -226,6 +226,9 @@ inline hb_blob_t* serialize (const graph
 {
   hb_vector_t<char> buffer;
   size_t size = graph.total_size_in_bytes ();
+
+  if (!size) return hb_blob_get_empty ();
+
   if (!buffer.alloc (size)) {
     DEBUG_MSG (SUBSET_REPACK, nullptr, "Unable to allocate output buffer.");
     return nullptr;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/test-classdef-graph.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/test-classdef-graph.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/graph/test-classdef-graph.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/graph/test-classdef-graph.cc	2024-11-20 13:56:33.000000000 +0000
@@ -26,27 +26,119 @@
 
 #include "gsubgpos-context.hh"
 #include "classdef-graph.hh"
+#include "hb-iter.hh"
+#include "hb-serialize.hh"
 
-typedef hb_pair_t<hb_codepoint_t, hb_codepoint_t> gid_and_class_t;
+typedef hb_codepoint_pair_t gid_and_class_t;
 typedef hb_vector_t<gid_and_class_t> gid_and_class_list_t;
 
+template<typename It>
+static unsigned actual_class_def_size(It glyph_and_class) {
+  char buffer[100];
+  hb_serialize_context_t serializer(buffer, 100);
+  OT::ClassDef_serialize (&serializer, glyph_and_class);
+  serializer.end_serialize ();
+  assert(!serializer.in_error());
+
+  hb_blob_t* blob = serializer.copy_blob();
+  unsigned size = hb_blob_get_length(blob);
+  hb_blob_destroy(blob);
+  return size;
+}
+
+static unsigned actual_class_def_size(gid_and_class_list_t consecutive_map, hb_vector_t<unsigned> classes) {
+  auto filtered_it =
+    + consecutive_map.as_sorted_array().iter()
+    | hb_filter([&] (unsigned c) {
+      for (unsigned klass : classes) {
+        if (c == klass) {
+          return true;
+        }
+      }
+      return false;
+    }, hb_second);
+  return actual_class_def_size(+ filtered_it);
+}
+
+template<typename It>
+static unsigned actual_coverage_size(It glyphs) {
+  char buffer[100];
+  hb_serialize_context_t serializer(buffer, 100);
+  OT::Layout::Common::Coverage_serialize (&serializer, glyphs);
+  serializer.end_serialize ();
+  assert(!serializer.in_error());
+
+  hb_blob_t* blob = serializer.copy_blob();
+  unsigned size = hb_blob_get_length(blob);
+  hb_blob_destroy(blob);
+  return size;
+}
+
+static unsigned actual_coverage_size(gid_and_class_list_t consecutive_map, hb_vector_t<unsigned> classes) {
+  auto filtered_it =
+    + consecutive_map.as_sorted_array().iter()
+    | hb_filter([&] (unsigned c) {
+      for (unsigned klass : classes) {
+        if (c == klass) {
+          return true;
+        }
+      }
+      return false;
+    }, hb_second);
+  return actual_coverage_size(+ filtered_it | hb_map_retains_sorting(hb_first));
+}
+
+static bool check_coverage_size(graph::class_def_size_estimator_t& estimator,
+                                const gid_and_class_list_t& map,
+                                hb_vector_t<unsigned> klasses)
+{
+  unsigned result = estimator.coverage_size();
+  unsigned expected = actual_coverage_size(map, klasses);
+  if (result != expected) {
+    printf ("FAIL: estimated coverage expected size %u but was %u\n", expected, result);
+    return false;
+  }
+  return true;
+}
+
+static bool check_add_class_def_size(graph::class_def_size_estimator_t& estimator,
+                                     const gid_and_class_list_t& map,
+                                     unsigned klass, hb_vector_t<unsigned> klasses)
+{
+  unsigned result = estimator.add_class_def_size(klass);
+  unsigned expected = actual_class_def_size(map, klasses);
+  if (result != expected) {
+    printf ("FAIL: estimated class def expected size %u but was %u\n", expected, result);
+    return false;
+  }
+
+  return check_coverage_size(estimator, map, klasses);
+}
 
-static bool incremental_size_is (const gid_and_class_list_t& list, unsigned klass,
-                                 unsigned cov_expected, unsigned class_def_expected)
+static bool check_add_class_def_size (const gid_and_class_list_t& list, unsigned klass)
 {
   graph::class_def_size_estimator_t estimator (list.iter ());
 
-  unsigned result = estimator.incremental_coverage_size (klass);
-  if (result != cov_expected)
+  unsigned result = estimator.add_class_def_size (klass);
+  auto filtered_it =
+    + list.as_sorted_array().iter()
+    | hb_filter([&] (unsigned c) {
+      return c == klass;
+    }, hb_second);
+
+  unsigned expected = actual_class_def_size(filtered_it);
+  if (result != expected)
   {
-    printf ("FAIL: coverage expected size %u but was %u\n", cov_expected, result);
+    printf ("FAIL: class def expected size %u but was %u\n", expected, result);
     return false;
   }
 
-  result = estimator.incremental_class_def_size (klass);
-  if (result != class_def_expected)
+  auto cov_it = + filtered_it | hb_map_retains_sorting(hb_first);
+  result = estimator.coverage_size ();
+  expected = actual_coverage_size(cov_it);
+  if (result != expected)
   {
-    printf ("FAIL: class def expected size %u but was %u\n", class_def_expected, result);
+    printf ("FAIL: coverage expected size %u but was %u\n", expected, result);
     return false;
   }
 
@@ -57,43 +149,45 @@ static void test_class_and_coverage_size
 {
   gid_and_class_list_t empty = {
   };
-  assert (incremental_size_is (empty, 0, 0, 0));
-  assert (incremental_size_is (empty, 1, 0, 0));
+  assert (check_add_class_def_size (empty, 0));
+  assert (check_add_class_def_size (empty, 1));
 
   gid_and_class_list_t class_zero = {
     {5, 0},
   };
-  assert (incremental_size_is (class_zero, 0, 2, 0));
+  assert (check_add_class_def_size (class_zero, 0));
 
   gid_and_class_list_t consecutive = {
     {4, 0},
     {5, 0},
+
     {6, 1},
     {7, 1},
+
     {8, 2},
     {9, 2},
     {10, 2},
     {11, 2},
   };
-  assert (incremental_size_is (consecutive, 0, 4, 0));
-  assert (incremental_size_is (consecutive, 1, 4, 4));
-  assert (incremental_size_is (consecutive, 2, 8, 6));
+  assert (check_add_class_def_size (consecutive, 0));
+  assert (check_add_class_def_size (consecutive, 1));
+  assert (check_add_class_def_size (consecutive, 2));
 
   gid_and_class_list_t non_consecutive = {
     {4, 0},
-    {5, 0},
+    {6, 0},
 
-    {6, 1},
-    {7, 1},
+    {8, 1},
+    {10, 1},
 
     {9, 2},
     {10, 2},
     {11, 2},
-    {12, 2},
+    {13, 2},
   };
-  assert (incremental_size_is (non_consecutive, 0, 4, 0));
-  assert (incremental_size_is (non_consecutive, 1, 4, 6));
-  assert (incremental_size_is (non_consecutive, 2, 8, 6));
+  assert (check_add_class_def_size (non_consecutive, 0));
+  assert (check_add_class_def_size (non_consecutive, 1));
+  assert (check_add_class_def_size (non_consecutive, 2));
 
   gid_and_class_list_t multiple_ranges = {
     {4, 0},
@@ -108,12 +202,95 @@ static void test_class_and_coverage_size
     {12, 1},
     {13, 1},
   };
-  assert (incremental_size_is (multiple_ranges, 0, 4, 0));
-  assert (incremental_size_is (multiple_ranges, 1, 2 * 6, 3 * 6));
+  assert (check_add_class_def_size (multiple_ranges, 0));
+  assert (check_add_class_def_size (multiple_ranges, 1));
+}
+
+static void test_running_class_and_coverage_size_estimates () {
+  // #### With consecutive gids: switches formats ###
+  gid_and_class_list_t consecutive_map = {
+    // range 1-4 (f1: 8 bytes), (f2: 6 bytes)
+    {1, 1},
+    {2, 1},
+    {3, 1},
+    {4, 1},
+
+    // (f1: 2 bytes), (f2: 6 bytes)
+    {5, 2},
+
+    // (f1: 14 bytes), (f2: 6 bytes)
+    {6, 3},
+    {7, 3},
+    {8, 3},
+    {9, 3},
+    {10, 3},
+    {11, 3},
+    {12, 3},
+  };
+
+  graph::class_def_size_estimator_t estimator1(consecutive_map.iter());
+  assert(check_add_class_def_size(estimator1, consecutive_map, 1, {1}));
+  assert(check_add_class_def_size(estimator1, consecutive_map, 2, {1, 2}));
+  assert(check_add_class_def_size(estimator1, consecutive_map, 2, {1, 2})); // check that adding the same class again works
+  assert(check_add_class_def_size(estimator1, consecutive_map, 3, {1, 2, 3}));
+
+  estimator1.reset();
+  assert(check_add_class_def_size(estimator1, consecutive_map, 2, {2}));
+  assert(check_add_class_def_size(estimator1, consecutive_map, 3, {2, 3}));
+
+  // #### With non-consecutive gids: always uses format 2 ###
+  gid_and_class_list_t non_consecutive_map = {
+    // range 1-4 (f1: 8 bytes), (f2: 6 bytes)
+    {1, 1},
+    {2, 1},
+    {3, 1},
+    {4, 1},
+
+    // (f1: 2 bytes), (f2: 12 bytes)
+    {6, 2},
+    {8, 2},
+
+    // (f1: 14 bytes), (f2: 6 bytes)
+    {9, 3},
+    {10, 3},
+    {11, 3},
+    {12, 3},
+    {13, 3},
+    {14, 3},
+    {15, 3},
+  };
+
+  graph::class_def_size_estimator_t estimator2(non_consecutive_map.iter());
+  assert(check_add_class_def_size(estimator2, non_consecutive_map, 1, {1}));
+  assert(check_add_class_def_size(estimator2, non_consecutive_map, 2, {1, 2}));
+  assert(check_add_class_def_size(estimator2, non_consecutive_map, 3, {1, 2, 3}));
+
+  estimator2.reset();
+  assert(check_add_class_def_size(estimator2, non_consecutive_map, 2, {2}));
+  assert(check_add_class_def_size(estimator2, non_consecutive_map, 3, {2, 3}));
+}
+
+static void test_running_class_size_estimates_with_locally_consecutive_glyphs () {
+  gid_and_class_list_t map = {
+    {1, 1},
+    {6, 2},
+    {7, 3},
+  };
+
+  graph::class_def_size_estimator_t estimator(map.iter());
+  assert(check_add_class_def_size(estimator, map, 1, {1}));
+  assert(check_add_class_def_size(estimator, map, 2, {1, 2}));
+  assert(check_add_class_def_size(estimator, map, 3, {1, 2, 3}));
+
+  estimator.reset();
+  assert(check_add_class_def_size(estimator, map, 2, {2}));
+  assert(check_add_class_def_size(estimator, map, 3, {2, 3}));
 }
 
 int
 main (int argc, char **argv)
 {
   test_class_and_coverage_size_estimates ();
+  test_running_class_and_coverage_size_estimates ();
+  test_running_class_size_estimates_with_locally_consecutive_glyphs ();
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/harfbuzz-subset.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/harfbuzz-subset.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/harfbuzz-subset.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/harfbuzz-subset.cc	2024-11-20 13:56:33.000000000 +0000
@@ -54,6 +54,7 @@
 #include "hb-subset-cff1.cc"
 #include "hb-subset-cff2.cc"
 #include "hb-subset-input.cc"
+#include "hb-subset-instancer-iup.cc"
 #include "hb-subset-instancer-solver.cc"
 #include "hb-subset-plan.cc"
 #include "hb-subset-repacker.cc"
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/harfbuzz.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/harfbuzz.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/harfbuzz.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/harfbuzz.cc	2024-11-20 13:56:33.000000000 +0000
@@ -58,3 +58,5 @@
 #include "hb-ucd.cc"
 #include "hb-unicode.cc"
 #include "hb-uniscribe.cc"
+#include "hb-wasm-api.cc"
+#include "hb-wasm-shape.cc"
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-ankr-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-ankr-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-ankr-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-ankr-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -75,6 +75,7 @@ struct ankr
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
 			  version == 0 &&
 			  c->check_range (this, anchorData) &&
 			  lookupTable.sanitize (c, this, &(this+anchorData))));
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-bsln-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-bsln-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-bsln-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-bsln-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -123,6 +123,7 @@ struct bsln
     TRACE_SANITIZE (this);
     if (unlikely (!(c->check_struct (this) && defaultBaseline < 32)))
       return_trace (false);
+    hb_barrier ();
 
     switch (format)
     {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-common.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-common.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-common.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-common.hh	2024-11-20 13:56:33.000000000 +0000
@@ -191,6 +191,7 @@ struct LookupSegmentArray
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  first <= last &&
 		  valuesZ.sanitize (c, base, last - first + 1));
   }
@@ -199,6 +200,7 @@ struct LookupSegmentArray
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  first <= last &&
 		  valuesZ.sanitize (c, base, last - first + 1, std::forward<Ts> (ds)...));
   }
@@ -360,6 +362,7 @@ struct LookupFormat10
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  valueSize <= 4 &&
 		  valueArrayZ.sanitize (c, glyphCount * valueSize));
   }
@@ -415,6 +418,7 @@ struct Lookup
   {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return_trace (false);
+    hb_barrier ();
     switch (u.format) {
     case 0: return_trace (u.format0.sanitize (c));
     case 2: return_trace (u.format2.sanitize (c));
@@ -429,6 +433,7 @@ struct Lookup
   {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return_trace (false);
+    hb_barrier ();
     switch (u.format) {
     case 0: return_trace (u.format0.sanitize (c, base));
     case 2: return_trace (u.format2.sanitize (c, base));
@@ -558,6 +563,7 @@ struct StateTable
   {
     TRACE_SANITIZE (this);
     if (unlikely (!(c->check_struct (this) &&
+		    hb_barrier () &&
 		    nClasses >= 4 /* Ensure pre-defined classes fit.  */ &&
 		    classTable.sanitize (c, this)))) return_trace (false);
 
@@ -851,43 +857,41 @@ struct StateTableDriver
        *
        *   https://github.com/harfbuzz/harfbuzz/issues/2860
        */
-      const EntryT *wouldbe_entry;
-      bool safe_to_break =
-	/* 1. */
-	!c->is_actionable (this, entry)
-      &&
-	/* 2. */
-	(
-	  /* 2a. */
-	  state == StateTableT::STATE_START_OF_TEXT
-	||
-	  /* 2b. */
-	  (
-	    (entry.flags & context_t::DontAdvance) &&
-	    next_state == StateTableT::STATE_START_OF_TEXT
-	  )
-	||
-	  /* 2c. */
-	  (
-	    wouldbe_entry = &machine.get_entry (StateTableT::STATE_START_OF_TEXT, klass)
-	  ,
-	    /* 2c'. */
-	    !c->is_actionable (this, *wouldbe_entry)
-	  &&
-	    /* 2c". */
-	    (
-	      next_state == machine.new_state (wouldbe_entry->newState)
-	    &&
-	      (entry.flags & context_t::DontAdvance) == (wouldbe_entry->flags & context_t::DontAdvance)
-	    )
-	  )
-	)
-      &&
-	/* 3. */
-	!c->is_actionable (this, machine.get_entry (state, StateTableT::CLASS_END_OF_TEXT))
-      ;
 
-      if (!safe_to_break && buffer->backtrack_len () && buffer->idx < buffer->len)
+      const auto is_safe_to_break_extra = [&]()
+      {
+          /* 2c. */
+          const auto wouldbe_entry = machine.get_entry(StateTableT::STATE_START_OF_TEXT, klass);
+      
+          /* 2c'. */
+          if (c->is_actionable (this, wouldbe_entry))
+              return false;
+      
+          /* 2c". */
+          return next_state == machine.new_state(wouldbe_entry.newState)
+              && (entry.flags & context_t::DontAdvance) == (wouldbe_entry.flags & context_t::DontAdvance);
+      };
+      
+      const auto is_safe_to_break = [&]()
+      {
+          /* 1. */
+          if (c->is_actionable (this, entry))
+              return false;
+      
+          /* 2. */
+          // This one is meh, I know...
+          const auto ok =
+                 state == StateTableT::STATE_START_OF_TEXT
+              || ((entry.flags & context_t::DontAdvance) && next_state == StateTableT::STATE_START_OF_TEXT)
+              || is_safe_to_break_extra();
+          if (!ok)
+              return false;
+      
+          /* 3. */
+          return !c->is_actionable (this, machine.get_entry (state, StateTableT::CLASS_END_OF_TEXT));
+      };
+
+      if (!is_safe_to_break () && buffer->backtrack_len () && buffer->idx < buffer->len)
 	buffer->unsafe_to_break_from_outbuffer (buffer->backtrack_len () - 1, buffer->idx + 1);
 
       c->transition (this, entry);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-feat-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-feat-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-feat-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-feat-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -138,6 +138,7 @@ struct FeatureName
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
 			  (base+settingTableZ).sanitize (c, nSettings)));
   }
 
@@ -200,6 +201,7 @@ struct feat
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
 			  version.major == 1 &&
 			  namesZ.sanitize (c, featureNameCount, this)));
   }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-just-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-just-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-just-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-just-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -185,6 +185,7 @@ struct ActionSubrecord
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this)))
       return_trace (false);
+    hb_barrier ();
 
     switch (u.header.actionType)
     {
@@ -220,6 +221,7 @@ struct PostcompensationActionChain
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this)))
       return_trace (false);
+    hb_barrier ();
 
     unsigned int offset = min_size;
     for (unsigned int i = 0; i < count; i++)
@@ -389,6 +391,7 @@ struct just
     TRACE_SANITIZE (this);
 
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
 			  version.major == 1 &&
 			  horizData.sanitize (c, this, this) &&
 			  vertData.sanitize (c, this, this)));
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-kerx-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-kerx-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-kerx-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-kerx-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -54,6 +54,7 @@ kerxTupleKern (int value,
   unsigned int offset = value;
   const FWORD *pv = &StructAtOffset<FWORD> (base, offset);
   if (unlikely (!c->sanitizer.check_array (pv, tupleCount))) return 0;
+  hb_barrier ();
   return *pv;
 }
 
@@ -259,6 +260,7 @@ struct KerxSubTableFormat1
 	  depth = 0;
 	  return;
 	}
+	hb_barrier ();
 
 	hb_mask_t kern_mask = c->plan->kern_mask;
 
@@ -389,6 +391,7 @@ struct KerxSubTableFormat2
     kern_idx = Types::offsetToIndex (kern_idx, this, arrayZ.arrayZ);
     const FWORD *v = &arrayZ[kern_idx];
     if (unlikely (!v->sanitize (&c->sanitizer))) return 0;
+    hb_barrier ();
 
     return kerxTupleKern (*v, header.tuple_count (), this, c);
   }
@@ -429,6 +432,7 @@ struct KerxSubTableFormat2
     return_trace (likely (c->check_struct (this) &&
 			  leftClassTable.sanitize (c, this) &&
 			  rightClassTable.sanitize (c, this) &&
+			  hb_barrier () &&
 			  c->check_range (this, array)));
   }
 
@@ -509,6 +513,7 @@ struct KerxSubTableFormat4
 	       double the ankrActionIndex to get the correct offset here. */
 	    const HBUINT16 *data = &ankrData[entry.data.ankrActionIndex * 2];
 	    if (!c->sanitizer.check_array (data, 2)) return;
+	    hb_barrier ();
 	    unsigned int markControlPoint = *data++;
 	    unsigned int currControlPoint = *data++;
 	    hb_position_t markX = 0;
@@ -537,6 +542,7 @@ struct KerxSubTableFormat4
 	       double the ankrActionIndex to get the correct offset here. */
 	    const HBUINT16 *data = &ankrData[entry.data.ankrActionIndex * 2];
 	    if (!c->sanitizer.check_array (data, 2)) return;
+	    hb_barrier ();
 	    unsigned int markAnchorPoint = *data++;
 	    unsigned int currAnchorPoint = *data++;
 	    const Anchor &markAnchor = c->ankr_table->get_anchor (c->buffer->info[mark].codepoint,
@@ -557,6 +563,7 @@ struct KerxSubTableFormat4
 	       by 4 to get the correct offset for the given action. */
 	    const FWORD *data = (const FWORD *) &ankrData[entry.data.ankrActionIndex * 4];
 	    if (!c->sanitizer.check_array (data, 4)) return;
+	    hb_barrier ();
 	    int markX = *data++;
 	    int markY = *data++;
 	    int currX = *data++;
@@ -639,6 +646,7 @@ struct KerxSubTableFormat6
       if (unlikely (hb_unsigned_mul_overflows (offset, sizeof (FWORD32)))) return 0;
       const FWORD32 *v = &StructAtOffset<FWORD32> (&(this+t.array), offset * sizeof (FWORD32));
       if (unlikely (!v->sanitize (&c->sanitizer))) return 0;
+      hb_barrier ();
       return kerxTupleKern (*v, header.tuple_count (), &(this+vector), c);
     }
     else
@@ -649,6 +657,7 @@ struct KerxSubTableFormat6
       unsigned int offset = l + r;
       const FWORD *v = &StructAtOffset<FWORD> (&(this+t.array), offset * sizeof (FWORD));
       if (unlikely (!v->sanitize (&c->sanitizer))) return 0;
+      hb_barrier ();
       return kerxTupleKern (*v, header.tuple_count (), &(this+vector), c);
     }
   }
@@ -674,6 +683,7 @@ struct KerxSubTableFormat6
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
 			  (is_long () ?
 			   (
 			     u.l.rowIndexTable.sanitize (c, this) &&
@@ -787,9 +797,10 @@ struct KerxSubTable
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!u.header.sanitize (c) ||
-	u.header.length <= u.header.static_size ||
-	!c->check_range (this, u.header.length))
+    if (!(u.header.sanitize (c) &&
+	  hb_barrier () &&
+	  u.header.length >= u.header.static_size &&
+	  c->check_range (this, u.header.length)))
       return_trace (false);
 
     return_trace (dispatch (c));
@@ -936,9 +947,10 @@ struct KerxTable
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (unlikely (!thiz()->version.sanitize (c) ||
-		  (unsigned) thiz()->version < (unsigned) T::minVersion ||
-		  !thiz()->tableCount.sanitize (c)))
+    if (unlikely (!(thiz()->version.sanitize (c) &&
+		    hb_barrier () &&
+		    (unsigned) thiz()->version >= (unsigned) T::minVersion &&
+		    thiz()->tableCount.sanitize (c))))
       return_trace (false);
 
     typedef typename T::SubTable SubTable;
@@ -949,6 +961,7 @@ struct KerxTable
     {
       if (unlikely (!st->u.header.sanitize (c)))
 	return_trace (false);
+      hb_barrier ();
       /* OpenType kern table has 2-byte subtable lengths.  That's limiting.
        * MS implementation also only supports one subtable, of format 0,
        * anyway.  Certain versions of some fonts, like Calibry, contain
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-morx-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-morx-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-morx-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-morx-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -259,7 +259,9 @@ struct ContextualSubtable
 	unsigned int offset = entry.data.markIndex + buffer->info[mark].codepoint;
 	const UnsizedArrayOf<HBGlyphID16> &subs_old = (const UnsizedArrayOf<HBGlyphID16> &) subs;
 	replacement = &subs_old[Types::wordOffsetToIndex (offset, table, subs_old.arrayZ)];
-	if (!replacement->sanitize (&c->sanitizer) || !*replacement)
+	if (!(replacement->sanitize (&c->sanitizer) &&
+	      hb_barrier () &&
+	      *replacement))
 	  replacement = nullptr;
       }
       if (replacement)
@@ -287,7 +289,9 @@ struct ContextualSubtable
 	unsigned int offset = entry.data.currentIndex + buffer->info[idx].codepoint;
 	const UnsizedArrayOf<HBGlyphID16> &subs_old = (const UnsizedArrayOf<HBGlyphID16> &) subs;
 	replacement = &subs_old[Types::wordOffsetToIndex (offset, table, subs_old.arrayZ)];
-	if (!replacement->sanitize (&c->sanitizer) || !*replacement)
+	if (!(replacement->sanitize (&c->sanitizer) &&
+	      hb_barrier () &&
+	      *replacement))
 	  replacement = nullptr;
       }
       if (replacement)
@@ -315,7 +319,7 @@ struct ContextualSubtable
     bool has_glyph_classes;
     unsigned int mark;
     const ContextualSubtable *table;
-    const UnsizedListOfOffset16To<Lookup<HBGlyphID16>, HBUINT, false> &subs;
+    const UnsizedListOfOffset16To<Lookup<HBGlyphID16>, HBUINT, void, false> &subs;
   };
 
   bool apply (hb_aat_apply_context_t *c) const
@@ -336,6 +340,7 @@ struct ContextualSubtable
 
     unsigned int num_entries = 0;
     if (unlikely (!machine.sanitize (c, &num_entries))) return_trace (false);
+    hb_barrier ();
 
     if (!Types::extended)
       return_trace (substitutionTables.sanitize (c, this, 0));
@@ -359,7 +364,7 @@ struct ContextualSubtable
   protected:
   StateTable<Types, EntryData>
 		machine;
-  NNOffsetTo<UnsizedListOfOffset16To<Lookup<HBGlyphID16>, HBUINT, false>, HBUINT>
+  NNOffsetTo<UnsizedListOfOffset16To<Lookup<HBGlyphID16>, HBUINT, void, false>, HBUINT>
 		substitutionTables;
   public:
   DEFINE_SIZE_STATIC (20);
@@ -513,6 +518,7 @@ struct LigatureSubtable
 	  if (unlikely (!buffer->move_to (match_positions[--cursor % ARRAY_LENGTH (match_positions)]))) return;
 
 	  if (unlikely (!actionData->sanitize (&c->sanitizer))) break;
+	  hb_barrier ();
 	  action = *actionData;
 
 	  uint32_t uoffset = action & LigActionOffset;
@@ -523,6 +529,7 @@ struct LigatureSubtable
 	  component_idx = Types::wordOffsetToIndex (component_idx, table, component.arrayZ);
 	  const HBUINT16 &componentData = component[component_idx];
 	  if (unlikely (!componentData.sanitize (&c->sanitizer))) break;
+	  hb_barrier ();
 	  ligature_idx += componentData;
 
 	  DEBUG_MSG (APPLY, nullptr, "Action store %d last %d",
@@ -533,6 +540,7 @@ struct LigatureSubtable
 	    ligature_idx = Types::offsetToIndex (ligature_idx, table, ligature.arrayZ);
 	    const HBGlyphID16 &ligatureData = ligature[ligature_idx];
 	    if (unlikely (!ligatureData.sanitize (&c->sanitizer))) break;
+	    hb_barrier ();
 	    hb_codepoint_t lig = ligatureData;
 
 	    DEBUG_MSG (APPLY, nullptr, "Produced ligature %u", lig);
@@ -544,6 +552,7 @@ struct LigatureSubtable
 	    {
 	      DEBUG_MSG (APPLY, nullptr, "Skipping ligature component");
 	      if (unlikely (!buffer->move_to (match_positions[--match_length % ARRAY_LENGTH (match_positions)]))) return;
+	      buffer->cur().unicode_props() |= UPROPS_MASK_IGNORABLE;
 	      if (unlikely (!buffer->replace_glyph (DELETED_GLYPH))) return;
 	    }
 
@@ -587,6 +596,7 @@ struct LigatureSubtable
     TRACE_SANITIZE (this);
     /* The rest of array sanitizations are done at run-time. */
     return_trace (c->check_struct (this) && machine.sanitize (c) &&
+		  hb_barrier () &&
 		  ligAction && component && ligature);
   }
 
@@ -765,6 +775,7 @@ struct InsertionSubtable
 	unsigned int start = entry.data.markedInsertIndex;
 	const HBGlyphID16 *glyphs = &insertionAction[start];
 	if (unlikely (!c->sanitizer.check_array (glyphs, count))) count = 0;
+	hb_barrier ();
 
 	bool before = flags & MarkedInsertBefore;
 
@@ -793,6 +804,7 @@ struct InsertionSubtable
 	unsigned int start = entry.data.currentInsertIndex;
 	const HBGlyphID16 *glyphs = &insertionAction[start];
 	if (unlikely (!c->sanitizer.check_array (glyphs, count))) count = 0;
+	hb_barrier ();
 
 	bool before = flags & CurrentInsertBefore;
 
@@ -849,6 +861,7 @@ struct InsertionSubtable
     TRACE_SANITIZE (this);
     /* The rest of array sanitizations are done at run-time. */
     return_trace (c->check_struct (this) && machine.sanitize (c) &&
+		  hb_barrier () &&
 		  insertionAction);
   }
 
@@ -944,9 +957,10 @@ struct ChainSubtable
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!length.sanitize (c) ||
-	length <= min_size ||
-	!c->check_range (this, length))
+    if (!(length.sanitize (c) &&
+	  hb_barrier () &&
+	  length >= min_size &&
+	  c->check_range (this, length)))
       return_trace (false);
 
     hb_sanitize_with_object_t with (c, this);
@@ -1089,9 +1103,10 @@ struct Chain
   bool sanitize (hb_sanitize_context_t *c, unsigned int version HB_UNUSED) const
   {
     TRACE_SANITIZE (this);
-    if (!length.sanitize (c) ||
-	length < min_size ||
-	!c->check_range (this, length))
+    if (!(length.sanitize (c) &&
+	  hb_barrier () &&
+	  length >= min_size &&
+	  c->check_range (this, length)))
       return_trace (false);
 
     if (!c->check_array (featureZ.arrayZ, featureCount))
@@ -1103,6 +1118,7 @@ struct Chain
     {
       if (!subtable->sanitize (c))
 	return_trace (false);
+      hb_barrier ();
       subtable = &StructAfter<ChainSubtable<Types>> (*subtable);
     }
 
@@ -1173,7 +1189,10 @@ struct mortmorx
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!version.sanitize (c) || !version || !chainCount.sanitize (c))
+    if (!(version.sanitize (c) &&
+	  hb_barrier () &&
+	  version &&
+	  chainCount.sanitize (c)))
       return_trace (false);
 
     const Chain<Types> *chain = &firstChain;
@@ -1182,6 +1201,7 @@ struct mortmorx
     {
       if (!chain->sanitize (c, version))
 	return_trace (false);
+      hb_barrier ();
       chain = &StructAfter<Chain<Types>> (*chain);
     }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-opbd-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-opbd-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-opbd-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-opbd-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -144,6 +144,7 @@ struct opbd
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this) || version.major != 1))
       return_trace (false);
+    hb_barrier ();
 
     switch (format)
     {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-trak-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-trak-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-trak-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-trak-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -111,13 +111,13 @@ struct TrackData
 	break;
       }
     }
-    if (!trackTableEntry) return 0.;
+    if (!trackTableEntry) return 0;
 
     /*
      * Choose size.
      */
     unsigned int sizes = nSizes;
-    if (!sizes) return 0.;
+    if (!sizes) return 0;
     if (sizes == 1) return trackTableEntry->get_value (base, 0, sizes);
 
     hb_array_t<const F16DOT16> size_table ((base+sizeTable).arrayZ, sizes);
@@ -134,6 +134,7 @@ struct TrackData
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
 			  sizeTable.sanitize (c, base, nSizes) &&
 			  trackTable.sanitize (c, nTracks, base, nSizes)));
   }
@@ -203,6 +204,7 @@ struct trak
     TRACE_SANITIZE (this);
 
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
 			  version.major == 1 &&
 			  horizData.sanitize (c, this, this) &&
 			  vertData.sanitize (c, this, this)));
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.cc	2024-11-20 13:56:33.000000000 +0000
@@ -55,7 +55,13 @@ AAT::hb_aat_apply_context_t::hb_aat_appl
 						       buffer (buffer_),
 						       sanitizer (),
 						       ankr_table (&Null (AAT::ankr)),
-						       gdef_table (face->table.GDEF->table),
+						       gdef_table (
+#ifndef HB_NO_OT_LAYOUT
+							 face->table.GDEF->table
+#else
+							 &Null (GDEF)
+#endif
+						       ),
 						       lookup_index (0)
 {
   sanitizer.init (blob);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.h 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.h
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.h	2024-11-20 13:56:33.000000000 +0000
@@ -40,7 +40,7 @@ HB_BEGIN_DECLS
  * @HB_AAT_LAYOUT_FEATURE_TYPE_INVALID: Initial, unset feature type
  * @HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC: [All Typographic Features](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type0)
  * @HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES: [Ligatures](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type1)
- * @HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION: [Cursive Connection](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type2)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CURSIVE_CONNECTION: [Cursive Connection](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type2)
  * @HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE: [Letter Case](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type3)
  * @HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION: [Vertical Substitution](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type4)
  * @HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT: [Linguistic Rearrangement](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type5)
@@ -88,7 +88,7 @@ typedef enum
 
   HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC			= 0,
   HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES				= 1,
-  HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION			= 2,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CURSIVE_CONNECTION			= 2,
   HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE			= 3,
   HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION		= 4,
   HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT		= 5,
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-ltag-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-ltag-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-aat-ltag-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-aat-ltag-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -46,7 +46,9 @@ struct FTStringRange
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && (base+tag).sanitize (c, length));
+    return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
+		  (base+tag).sanitize (c, length));
   }
 
   protected:
@@ -73,6 +75,7 @@ struct ltag
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
 			  version >= 1 &&
 			  tagRanges.sanitize (c, this)));
   }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-algs.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-algs.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-algs.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-algs.hh	2024-11-20 13:56:33.000000000 +0000
@@ -87,6 +87,19 @@ static inline constexpr uint16_t hb_uint
 static inline constexpr uint32_t hb_uint32_swap (uint32_t v)
 { return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); }
 
+#ifndef HB_FAST_INT_ACCESS
+#if defined(__OPTIMIZE__) && \
+    defined(__BYTE_ORDER) && \
+    (__BYTE_ORDER == __BIG_ENDIAN || \
+     (__BYTE_ORDER == __LITTLE_ENDIAN && \
+      hb_has_builtin(__builtin_bswap16) && \
+      hb_has_builtin(__builtin_bswap32)))
+#define HB_FAST_INT_ACCESS 1
+#else
+#define HB_FAST_INT_ACCESS 0
+#endif
+#endif
+
 template <typename Type, int Bytes = sizeof (Type)>
 struct BEInt;
 template <typename Type>
@@ -101,21 +114,25 @@ struct BEInt<Type, 1>
 template <typename Type>
 struct BEInt<Type, 2>
 {
+  struct __attribute__((packed)) packed_uint16_t { uint16_t v; };
+
   public:
   BEInt () = default;
-  constexpr BEInt (Type V) : v {uint8_t ((V >>  8) & 0xFF),
-			        uint8_t ((V      ) & 0xFF)} {}
 
-  struct __attribute__((packed)) packed_uint16_t { uint16_t v; };
-  constexpr operator Type () const
-  {
-#if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \
-    defined(__BYTE_ORDER) && \
-    (__BYTE_ORDER == __BIG_ENDIAN || \
-     (__BYTE_ORDER == __LITTLE_ENDIAN && \
-      hb_has_builtin(__builtin_bswap16)))
-    /* Spoon-feed the compiler a big-endian integer with alignment 1.
-     * https://github.com/harfbuzz/harfbuzz/pull/1398 */
+  BEInt (Type V)
+#if HB_FAST_INT_ACCESS
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+  { ((packed_uint16_t *) v)->v = __builtin_bswap16 (V); }
+#else /* __BYTE_ORDER == __BIG_ENDIAN */
+  { ((packed_uint16_t *) v)->v = V; }
+#endif
+#else
+    : v {uint8_t ((V >>  8) & 0xFF),
+	 uint8_t ((V      ) & 0xFF)} {}
+#endif
+
+  constexpr operator Type () const {
+#if HB_FAST_INT_ACCESS
 #if __BYTE_ORDER == __LITTLE_ENDIAN
     return __builtin_bswap16 (((packed_uint16_t *) v)->v);
 #else /* __BYTE_ORDER == __BIG_ENDIAN */
@@ -146,22 +163,27 @@ struct BEInt<Type, 3>
 template <typename Type>
 struct BEInt<Type, 4>
 {
+  struct __attribute__((packed)) packed_uint32_t { uint32_t v; };
+
   public:
   BEInt () = default;
-  constexpr BEInt (Type V) : v {uint8_t ((V >> 24) & 0xFF),
-			        uint8_t ((V >> 16) & 0xFF),
-			        uint8_t ((V >>  8) & 0xFF),
-			        uint8_t ((V      ) & 0xFF)} {}
 
-  struct __attribute__((packed)) packed_uint32_t { uint32_t v; };
+  BEInt (Type V)
+#if HB_FAST_INT_ACCESS
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+  { ((packed_uint32_t *) v)->v = __builtin_bswap32 (V); }
+#else /* __BYTE_ORDER == __BIG_ENDIAN */
+  { ((packed_uint32_t *) v)->v = V; }
+#endif
+#else
+    : v {uint8_t ((V >> 24) & 0xFF),
+	 uint8_t ((V >> 16) & 0xFF),
+	 uint8_t ((V >>  8) & 0xFF),
+	 uint8_t ((V      ) & 0xFF)} {}
+#endif
+
   constexpr operator Type () const {
-#if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \
-    defined(__BYTE_ORDER) && \
-    (__BYTE_ORDER == __BIG_ENDIAN || \
-     (__BYTE_ORDER == __LITTLE_ENDIAN && \
-      hb_has_builtin(__builtin_bswap32)))
-    /* Spoon-feed the compiler a big-endian integer with alignment 1.
-     * https://github.com/harfbuzz/harfbuzz/pull/1398 */
+#if HB_FAST_INT_ACCESS
 #if __BYTE_ORDER == __LITTLE_ENDIAN
     return __builtin_bswap32 (((packed_uint32_t *) v)->v);
 #else /* __BYTE_ORDER == __BIG_ENDIAN */
@@ -231,12 +253,123 @@ struct
 }
 HB_FUNCOBJ (hb_bool);
 
+
+/* The MIT License
+
+   Copyright (C) 2012 Zilong Tan (eric.zltan@gmail.com)
+
+   Permission is hereby granted, free of charge, to any person
+   obtaining a copy of this software and associated documentation
+   files (the "Software"), to deal in the Software without
+   restriction, including without limitation the rights to use, copy,
+   modify, merge, publish, distribute, sublicense, and/or sell copies
+   of the Software, and to permit persons to whom the Software is
+   furnished to do so, subject to the following conditions:
+
+   The above copyright notice and this permission notice shall be
+   included in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+   SOFTWARE.
+*/
+
+
+// Compression function for Merkle-Damgard construction.
+// This function is generated using the framework provided.
+#define mix(h) (					\
+			(void) ((h) ^= (h) >> 23),		\
+			(void) ((h) *= 0x2127599bf4325c37ULL),	\
+			(h) ^= (h) >> 47)
+
+static inline uint64_t fasthash64(const void *buf, size_t len, uint64_t seed)
+{
+	struct __attribute__((packed)) packed_uint64_t { uint64_t v; };
+	const uint64_t    m = 0x880355f21e6d1965ULL;
+	const packed_uint64_t *pos = (const packed_uint64_t *)buf;
+	const packed_uint64_t *end = pos + (len / 8);
+	const unsigned char *pos2;
+	uint64_t h = seed ^ (len * m);
+	uint64_t v;
+
+#ifndef HB_OPTIMIZE_SIZE
+	if (((uintptr_t) pos & 7) == 0)
+	{
+	  while (pos != end)
+	  {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-align"
+	    v  = * (const uint64_t *) (pos++);
+#pragma GCC diagnostic pop
+	    h ^= mix(v);
+	    h *= m;
+	  }
+	}
+	else
+#endif
+	{
+	  while (pos != end)
+	  {
+	    v  = pos++->v;
+	    h ^= mix(v);
+	    h *= m;
+	  }
+	}
+
+	pos2 = (const unsigned char*)pos;
+	v = 0;
+
+	switch (len & 7) {
+	case 7: v ^= (uint64_t)pos2[6] << 48; HB_FALLTHROUGH;
+	case 6: v ^= (uint64_t)pos2[5] << 40; HB_FALLTHROUGH;
+	case 5: v ^= (uint64_t)pos2[4] << 32; HB_FALLTHROUGH;
+	case 4: v ^= (uint64_t)pos2[3] << 24; HB_FALLTHROUGH;
+	case 3: v ^= (uint64_t)pos2[2] << 16; HB_FALLTHROUGH;
+	case 2: v ^= (uint64_t)pos2[1] <<  8; HB_FALLTHROUGH;
+	case 1: v ^= (uint64_t)pos2[0];
+		h ^= mix(v);
+		h *= m;
+	}
+
+	return mix(h);
+}
+
+static inline uint32_t fasthash32(const void *buf, size_t len, uint32_t seed)
+{
+	// the following trick converts the 64-bit hashcode to Fermat
+	// residue, which shall retain information from both the higher
+	// and lower parts of hashcode.
+        uint64_t h = fasthash64(buf, len, seed);
+	return h - (h >> 32);
+}
+
 struct
 {
   private:
 
   template <typename T> constexpr auto
-  impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, hb_deref (v).hash ())
+  impl (const T& v, hb_priority<2>) const HB_RETURN (uint32_t, hb_deref (v).hash ())
+
+  // Horrible: std:hash() of integers seems to be identity in gcc / clang?!
+  // https://github.com/harfbuzz/harfbuzz/pull/4228
+  //
+  // For performance characteristics see:
+  // https://github.com/harfbuzz/harfbuzz/pull/4228#issuecomment-1565079537
+  template <typename T,
+	    hb_enable_if (std::is_integral<T>::value && sizeof (T) <= sizeof (uint32_t))> constexpr auto
+  impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, (uint32_t) v * 2654435761u /* Knuh's multiplicative hash */)
+  template <typename T,
+	    hb_enable_if (std::is_integral<T>::value && sizeof (T) > sizeof (uint32_t))> constexpr auto
+  impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, (uint32_t) (v ^ (v >> 32)) * 2654435761u /* Knuth's multiplicative hash */)
+
+  template <typename T,
+	    hb_enable_if (std::is_floating_point<T>::value)> constexpr auto
+  impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, fasthash32 (std::addressof (v), sizeof (T), 0xf437ffe6))
 
   template <typename T> constexpr auto
   impl (const T& v, hb_priority<0>) const HB_RETURN (uint32_t, std::hash<hb_decay<decltype (hb_deref (v))>>{} (hb_deref (v)))
@@ -538,7 +671,7 @@ struct hb_pair_t
     return 0;
   }
 
-  friend void swap (hb_pair_t& a, hb_pair_t& b)
+  friend void swap (hb_pair_t& a, hb_pair_t& b) noexcept
   {
     hb_swap (a.first, b.first);
     hb_swap (a.second, b.second);
@@ -551,6 +684,8 @@ struct hb_pair_t
 template <typename T1, typename T2> static inline hb_pair_t<T1, T2>
 hb_pair (T1&& a, T2&& b) { return hb_pair_t<T1, T2> (a, b); }
 
+typedef hb_pair_t<hb_codepoint_t, hb_codepoint_t> hb_codepoint_pair_t;
+
 struct
 {
   template <typename Pair> constexpr typename Pair::first_t
@@ -626,8 +761,10 @@ hb_popcount (T v)
 
   if (sizeof (T) == 8)
   {
-    unsigned int shift = 32;
-    return hb_popcount<uint32_t> ((uint32_t) v) + hb_popcount ((uint32_t) (v >> shift));
+    uint64_t y = (uint64_t) v;
+    y -= ((y >> 1) & 0x5555555555555555ull);
+    y = (y & 0x3333333333333333ull) + (y >> 2 & 0x3333333333333333ull);
+    return ((y + (y >> 4)) & 0xf0f0f0f0f0f0f0full) * 0x101010101010101ull >> 56;
   }
 
   if (sizeof (T) == 16)
@@ -851,7 +988,7 @@ static inline void *
 hb_memset (void *s, int c, unsigned int n)
 {
   /* It's illegal to pass NULL to memset(), even if n is zero. */
-  if (unlikely (!n)) return 0;
+  if (unlikely (!n)) return s;
   return memset (s, c, n);
 }
 
@@ -916,6 +1053,18 @@ _hb_cmp_method (const void *pkey, const
   return val.cmp (key, ds...);
 }
 
+template <typename K, typename V>
+static int
+_hb_cmp_operator (const void *pkey, const void *pval)
+{
+  const K& key = * (const K*) pkey;
+  const V& val = * (const V*) pval;
+
+  if (key < val) return -1;
+  if (key > val) return  1;
+  return 0;
+}
+
 template <typename V, typename K, typename ...Ts>
 static inline bool
 hb_bsearch_impl (unsigned *pos, /* Out */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-array.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-array.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-array.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-array.hh	2024-11-20 13:56:33.000000000 +0000
@@ -47,6 +47,8 @@ enum hb_not_found_t
 template <typename Type>
 struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
 {
+  static constexpr bool realloc_move = true;
+
   /*
    * Constructors.
    */
@@ -75,11 +77,25 @@ struct hb_array_t : hb_iter_with_fallbac
    */
   typedef Type& __item_t__;
   static constexpr bool is_random_access_iterator = true;
+  static constexpr bool has_fast_len = true;
+  Type& __item__ () const
+  {
+    if (unlikely (!length)) return CrapOrNull (Type);
+    return *arrayZ;
+  }
   Type& __item_at__ (unsigned i) const
   {
     if (unlikely (i >= length)) return CrapOrNull (Type);
     return arrayZ[i];
   }
+  void __next__ ()
+  {
+    if (unlikely (!length))
+      return;
+    length--;
+    backwards_length++;
+    arrayZ++;
+  }
   void __forward__ (unsigned n)
   {
     if (unlikely (n > length))
@@ -88,6 +104,14 @@ struct hb_array_t : hb_iter_with_fallbac
     backwards_length += n;
     arrayZ += n;
   }
+  void __prev__ ()
+  {
+    if (unlikely (!backwards_length))
+      return;
+    length++;
+    backwards_length--;
+    arrayZ--;
+  }
   void __rewind__ (unsigned n)
   {
     if (unlikely (n > backwards_length))
@@ -122,9 +146,14 @@ struct hb_array_t : hb_iter_with_fallbac
 
   uint32_t hash () const
   {
-    uint32_t current = 0;
+    // FNV-1a hash function
+    // https://github.com/harfbuzz/harfbuzz/pull/4228
+    uint32_t current = /*cbf29ce4*/0x84222325;
     for (auto &v : *this)
-      current = current * 31 + hb_hash (v);
+    {
+      current = current ^ hb_hash (v);
+      current = current * 16777619;
+    }
     return current;
   }
 
@@ -322,6 +351,7 @@ struct hb_sorted_array_t :
   HB_ITER_USING (iter_base_t);
   static constexpr bool is_random_access_iterator = true;
   static constexpr bool is_sorted_iterator = true;
+  static constexpr bool has_fast_len = true;
 
   hb_sorted_array_t () = default;
   hb_sorted_array_t (const hb_sorted_array_t&) = default;
@@ -449,41 +479,21 @@ inline bool hb_array_t<const unsigned ch
 
 /* Specialize hash() for byte arrays. */
 
+#ifndef HB_OPTIMIZE_SIZE_MORE
 template <>
 inline uint32_t hb_array_t<const char>::hash () const
 {
-  uint32_t current = 0;
-  unsigned i = 0;
-
-#if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \
-    ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__))
-  struct __attribute__((packed)) packed_uint32_t { uint32_t v; };
-  for (; i + 4 <= this->length; i += 4)
-    current = current * 31 + hb_hash ((uint32_t) ((packed_uint32_t *) &this->arrayZ[i])->v);
-#endif
-
-  for (; i < this->length; i++)
-    current = current * 31 + hb_hash (this->arrayZ[i]);
-  return current;
+  // https://github.com/harfbuzz/harfbuzz/pull/4228
+  return fasthash32(arrayZ, length, 0xf437ffe6 /* magic? */);
 }
 
 template <>
 inline uint32_t hb_array_t<const unsigned char>::hash () const
 {
-  uint32_t current = 0;
-  unsigned i = 0;
-
-#if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \
-    ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__))
-  struct __attribute__((packed)) packed_uint32_t { uint32_t v; };
-  for (; i + 4 <= this->length; i += 4)
-    current = current * 31 + hb_hash ((uint32_t) ((packed_uint32_t *) &this->arrayZ[i])->v);
-#endif
-
-  for (; i < this->length; i++)
-    current = current * 31 + hb_hash (this->arrayZ[i]);
-  return current;
+  // https://github.com/harfbuzz/harfbuzz/pull/4228
+  return fasthash32(arrayZ, length, 0xf437ffe6 /* magic? */);
 }
+#endif
 
 
 typedef hb_array_t<const char> hb_bytes_t;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-atomic.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-atomic.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-atomic.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-atomic.hh	2024-11-20 13:56:33.000000000 +0000
@@ -118,12 +118,12 @@ _hb_atomic_ptr_impl_cmplexch (const void
  */
 #ifndef _hb_compiler_memory_r_barrier
 #if defined(__ATOMIC_ACQUIRE) // gcc-like
-#define _hb_compiler_memory_r_barrier() asm volatile("": : :"memory")
+static inline void _hb_compiler_memory_r_barrier () { asm volatile("": : :"memory"); }
 #elif !defined(_MSC_VER)
 #include <atomic>
 #define _hb_compiler_memory_r_barrier() std::atomic_signal_fence (std::memory_order_acquire)
 #else
-#define _hb_compiler_memory_r_barrier() do {} while (0)
+static inline void _hb_compiler_memory_r_barrier () {}
 #endif
 #endif
 
@@ -204,6 +204,7 @@ struct hb_atomic_ptr_t
 
   hb_atomic_ptr_t () = default;
   constexpr hb_atomic_ptr_t (T* v) : v (v) {}
+  hb_atomic_ptr_t (const hb_atomic_ptr_t &other) = delete;
 
   void init (T* v_ = nullptr) { set_relaxed (v_); }
   void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
@@ -217,5 +218,11 @@ struct hb_atomic_ptr_t
   T *v = nullptr;
 };
 
+static inline bool hb_barrier ()
+{
+  _hb_compiler_memory_r_barrier ();
+  return true;
+}
+
 
 #endif /* HB_ATOMIC_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-bimap.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-bimap.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-bimap.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-bimap.hh	2024-11-20 13:56:33.000000000 +0000
@@ -39,10 +39,10 @@ struct hb_bimap_t
     back_map.reset ();
   }
 
-  void resize (unsigned pop)
+  void alloc (unsigned pop)
   {
-    forw_map.resize (pop);
-    back_map.resize (pop);
+    forw_map.alloc (pop);
+    back_map.alloc (pop);
   }
 
   bool in_error () const { return forw_map.in_error () || back_map.in_error (); }
@@ -83,7 +83,6 @@ struct hb_bimap_t
 
   unsigned int get_population () const { return forw_map.get_population (); }
 
-
   protected:
   hb_map_t  forw_map;
   hb_map_t  back_map;
@@ -94,9 +93,31 @@ struct hb_bimap_t
   auto iter () const HB_AUTO_RETURN (+ forw_map.iter())
 };
 
-/* Inremental bimap: only lhs is given, rhs is incrementally assigned */
-struct hb_inc_bimap_t : hb_bimap_t
+/* Incremental bimap: only lhs is given, rhs is incrementally assigned */
+struct hb_inc_bimap_t
 {
+  bool in_error () const { return forw_map.in_error () || back_map.in_error (); }
+
+  unsigned int get_population () const { return forw_map.get_population (); }
+
+  void reset ()
+  {
+    forw_map.reset ();
+    back_map.reset ();
+  }
+
+  void alloc (unsigned pop)
+  {
+    forw_map.alloc (pop);
+    back_map.alloc (pop);
+  }
+
+  void clear ()
+  {
+    forw_map.clear ();
+    back_map.resize (0);
+  }
+
   /* Add a mapping from lhs to rhs with a unique value if lhs is unknown.
    * Return the rhs value as the result.
    */
@@ -105,32 +126,42 @@ struct hb_inc_bimap_t : hb_bimap_t
     hb_codepoint_t  rhs = forw_map[lhs];
     if (rhs == HB_MAP_VALUE_INVALID)
     {
-      rhs = next_value++;
-      set (lhs, rhs);
+      rhs = back_map.length;
+      forw_map.set (lhs, rhs);
+      back_map.push (lhs);
     }
     return rhs;
   }
 
   hb_codepoint_t skip ()
-  { return next_value++; }
+  {
+    hb_codepoint_t start = back_map.length;
+    back_map.push (HB_MAP_VALUE_INVALID);
+    return start;
+  }
 
   hb_codepoint_t skip (unsigned count)
-  { return next_value += count; }
+  {
+    hb_codepoint_t start = back_map.length;
+    back_map.alloc (back_map.length + count);
+    for (unsigned i = 0; i < count; i++)
+      back_map.push (HB_MAP_VALUE_INVALID);
+    return start;
+  }
 
   hb_codepoint_t get_next_value () const
-  { return next_value; }
+  { return back_map.length; }
 
   void add_set (const hb_set_t *set)
   {
-    hb_codepoint_t i = HB_SET_VALUE_INVALID;
-    while (hb_set_next (set, &i)) add (i);
+    for (auto i : *set) add (i);
   }
 
   /* Create an identity map. */
   bool identity (unsigned int size)
   {
     clear ();
-    for (hb_codepoint_t i = 0; i < size; i++) set (i, i);
+    for (hb_codepoint_t i = 0; i < size; i++) add (i);
     return !in_error ();
   }
 
@@ -145,20 +176,30 @@ struct hb_inc_bimap_t : hb_bimap_t
   {
     hb_codepoint_t  count = get_population ();
     hb_vector_t <hb_codepoint_t> work;
-    work.resize (count);
+    if (unlikely (!work.resize (count, false))) return;
 
     for (hb_codepoint_t rhs = 0; rhs < count; rhs++)
-      work[rhs] = back_map[rhs];
+      work.arrayZ[rhs] = back_map[rhs];
 
     work.qsort (cmp_id);
 
     clear ();
     for (hb_codepoint_t rhs = 0; rhs < count; rhs++)
-      set (work[rhs], rhs);
+      add (work.arrayZ[rhs]);
   }
 
+  hb_codepoint_t get (hb_codepoint_t lhs) const { return forw_map.get (lhs); }
+  hb_codepoint_t backward (hb_codepoint_t rhs) const { return back_map[rhs]; }
+
+  hb_codepoint_t operator [] (hb_codepoint_t lhs) const { return get (lhs); }
+  bool has (hb_codepoint_t lhs) const { return forw_map.has (lhs); }
+
   protected:
-  unsigned int next_value = 0;
+  hb_map_t forw_map;
+  hb_vector_t<hb_codepoint_t> back_map;
+
+  public:
+  auto keys () const HB_AUTO_RETURN (+ back_map.iter())
 };
 
 #endif /* HB_BIMAP_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-bit-page.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-bit-page.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-bit-page.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-bit-page.hh	2024-11-20 13:56:33.000000000 +0000
@@ -89,14 +89,18 @@ struct hb_vector_size_t
 
 struct hb_bit_page_t
 {
-  void init0 () { v.init0 (); }
-  void init1 () { v.init1 (); }
+  void init0 () { v.init0 (); population = 0; }
+  void init1 () { v.init1 (); population = PAGE_BITS; }
+
+  void dirty () { population = UINT_MAX; }
 
   static inline constexpr unsigned len ()
   { return ARRAY_LENGTH_CONST (v); }
 
+  operator bool () const { return !is_empty (); }
   bool is_empty () const
   {
+    if (has_population ()) return !population;
     return
     + hb_iter (v)
     | hb_none
@@ -104,14 +108,11 @@ struct hb_bit_page_t
   }
   uint32_t hash () const
   {
-    return
-    + hb_iter (v)
-    | hb_reduce ([] (uint32_t h, const elt_t &_) { return h * 31 + hb_hash (_); }, (uint32_t) 0u)
-    ;
+    return hb_bytes_t ((const char *) &v, sizeof (v)).hash ();
   }
 
-  void add (hb_codepoint_t g) { elt (g) |= mask (g); }
-  void del (hb_codepoint_t g) { elt (g) &= ~mask (g); }
+  void add (hb_codepoint_t g) { elt (g) |= mask (g); dirty (); }
+  void del (hb_codepoint_t g) { elt (g) &= ~mask (g); dirty (); }
   void set (hb_codepoint_t g, bool value) { if (value) add (g); else del (g); }
   bool get (hb_codepoint_t g) const { return elt (g) & mask (g); }
 
@@ -123,20 +124,21 @@ struct hb_bit_page_t
       *la |= (mask (b) << 1) - mask(a);
     else
     {
-      *la |= ~(mask (a) - 1);
+      *la |= ~(mask (a) - 1llu);
       la++;
 
       hb_memset (la, 0xff, (char *) lb - (char *) la);
 
-      *lb |= ((mask (b) << 1) - 1);
+      *lb |= ((mask (b) << 1) - 1llu);
     }
+    dirty ();
   }
   void del_range (hb_codepoint_t a, hb_codepoint_t b)
   {
     elt_t *la = &elt (a);
     elt_t *lb = &elt (b);
     if (la == lb)
-      *la &= ~((mask (b) << 1) - mask(a));
+      *la &= ~((mask (b) << 1llu) - mask(a));
     else
     {
       *la &= mask (a) - 1;
@@ -144,8 +146,9 @@ struct hb_bit_page_t
 
       hb_memset (la, 0, (char *) lb - (char *) la);
 
-      *lb &= ~((mask (b) << 1) - 1);
+      *lb &= ~((mask (b) << 1) - 1llu);
     }
+    dirty ();
   }
   void set_range (hb_codepoint_t a, hb_codepoint_t b, bool v)
   { if (v) add_range (a, b); else del_range (a, b); }
@@ -216,6 +219,7 @@ struct hb_bit_page_t
     return count;
   }
 
+  bool operator == (const hb_bit_page_t &other) const { return is_equal (other); }
   bool is_equal (const hb_bit_page_t &other) const
   {
     for (unsigned i = 0; i < len (); i++)
@@ -223,20 +227,28 @@ struct hb_bit_page_t
 	return false;
     return true;
   }
+  bool operator <= (const hb_bit_page_t &larger_page) const { return is_subset (larger_page); }
   bool is_subset (const hb_bit_page_t &larger_page) const
   {
+    if (has_population () && larger_page.has_population () &&
+	population > larger_page.population)
+      return false;
+
     for (unsigned i = 0; i < len (); i++)
       if (~larger_page.v[i] & v[i])
 	return false;
     return true;
   }
 
+  bool has_population () const { return population != UINT_MAX; }
   unsigned int get_population () const
   {
-    return
+    if (has_population ()) return population;
+    population =
     + hb_iter (v)
     | hb_reduce ([] (unsigned pop, const elt_t &_) { return pop + hb_popcount (_); }, 0u)
     ;
+    return population;
   }
 
   bool next (hb_codepoint_t *codepoint) const
@@ -332,9 +344,9 @@ struct hb_bit_page_t
   const elt_t& elt (hb_codepoint_t g) const { return v[(g & MASK) / ELT_BITS]; }
   static constexpr elt_t mask (hb_codepoint_t g) { return elt_t (1) << (g & ELT_MASK); }
 
+  mutable unsigned population;
   vector_t v;
 };
-static_assert (hb_bit_page_t::PAGE_BITS == sizeof (hb_bit_page_t) * 8, "");
 
 
 #endif /* HB_BIT_PAGE_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-bit-set-invertible.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-bit-set-invertible.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-bit-set-invertible.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-bit-set-invertible.hh	2024-11-20 13:56:33.000000000 +0000
@@ -39,10 +39,10 @@ struct hb_bit_set_invertible_t
 
   hb_bit_set_invertible_t () = default;
   hb_bit_set_invertible_t (const hb_bit_set_invertible_t& o) = default;
-  hb_bit_set_invertible_t (hb_bit_set_invertible_t&& other) : hb_bit_set_invertible_t () { hb_swap (*this, other); }
+  hb_bit_set_invertible_t (hb_bit_set_invertible_t&& other)  noexcept : hb_bit_set_invertible_t () { hb_swap (*this, other); }
   hb_bit_set_invertible_t& operator= (const hb_bit_set_invertible_t& o) = default;
-  hb_bit_set_invertible_t& operator= (hb_bit_set_invertible_t&& other) { hb_swap (*this, other); return *this; }
-  friend void swap (hb_bit_set_invertible_t &a, hb_bit_set_invertible_t &b)
+  hb_bit_set_invertible_t& operator= (hb_bit_set_invertible_t&& other)  noexcept { hb_swap (*this, other); return *this; }
+  friend void swap (hb_bit_set_invertible_t &a, hb_bit_set_invertible_t &b) noexcept
   {
     if (likely (!a.s.successful || !b.s.successful))
       return;
@@ -136,7 +136,7 @@ struct hb_bit_set_invertible_t
   /* Sink interface. */
   hb_bit_set_invertible_t& operator << (hb_codepoint_t v)
   { add (v); return *this; }
-  hb_bit_set_invertible_t& operator << (const hb_pair_t<hb_codepoint_t, hb_codepoint_t>& range)
+  hb_bit_set_invertible_t& operator << (const hb_codepoint_pair_t& range)
   { add_range (range.first, range.second); return *this; }
 
   bool intersects (hb_codepoint_t first, hb_codepoint_t last) const
@@ -162,7 +162,7 @@ struct hb_bit_set_invertible_t
       auto it1 = iter ();
       auto it2 = other.iter ();
       return hb_all (+ hb_zip (it1, it2)
-		     | hb_map ([](hb_pair_t<hb_codepoint_t, hb_codepoint_t> _) { return _.first == _.second; }));
+		     | hb_map ([](hb_codepoint_pair_t _) { return _.first == _.second; }));
     }
   }
 
@@ -345,6 +345,7 @@ struct hb_bit_set_invertible_t
   struct iter_t : hb_iter_with_fallback_t<iter_t, hb_codepoint_t>
   {
     static constexpr bool is_sorted_iterator = true;
+    static constexpr bool has_fast_len = true;
     iter_t (const hb_bit_set_invertible_t &s_ = Null (hb_bit_set_invertible_t),
 	    bool init = true) : s (&s_), v (INVALID), l(0)
     {
@@ -358,12 +359,12 @@ struct hb_bit_set_invertible_t
     typedef hb_codepoint_t __item_t__;
     hb_codepoint_t __item__ () const { return v; }
     bool __more__ () const { return v != INVALID; }
-    void __next__ () { s->next (&v); if (l) l--; }
-    void __prev__ () { s->previous (&v); }
+    void __next__ () { s->next (&v); if (likely (l)) l--; }
+    void __prev__ () { s->previous (&v); l++; }
     unsigned __len__ () const { return l; }
     iter_t end () const { return iter_t (*s, false); }
     bool operator != (const iter_t& o) const
-    { return s != o.s || v != o.v; }
+    { return v != o.v || s != o.s; }
 
     protected:
     const hb_bit_set_invertible_t *s;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-bit-set.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-bit-set.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-bit-set.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-bit-set.hh	2024-11-20 13:56:33.000000000 +0000
@@ -30,7 +30,6 @@
 
 #include "hb.hh"
 #include "hb-bit-page.hh"
-#include "hb-machinery.hh"
 
 
 struct hb_bit_set_t
@@ -39,10 +38,10 @@ struct hb_bit_set_t
   ~hb_bit_set_t () = default;
 
   hb_bit_set_t (const hb_bit_set_t& other) : hb_bit_set_t () { set (other, true); }
-  hb_bit_set_t ( hb_bit_set_t&& other) : hb_bit_set_t () { hb_swap (*this, other); }
+  hb_bit_set_t ( hb_bit_set_t&& other)  noexcept : hb_bit_set_t () { hb_swap (*this, other); }
   hb_bit_set_t& operator= (const hb_bit_set_t& other) { set (other); return *this; }
-  hb_bit_set_t& operator= (hb_bit_set_t&& other) { hb_swap (*this, other); return *this; }
-  friend void swap (hb_bit_set_t &a, hb_bit_set_t &b)
+  hb_bit_set_t& operator= (hb_bit_set_t&& other)  noexcept { hb_swap (*this, other); return *this; }
+  friend void swap (hb_bit_set_t &a, hb_bit_set_t &b) noexcept
   {
     if (likely (!a.successful || !b.successful))
       return;
@@ -134,7 +133,11 @@ struct hb_bit_set_t
   {
     uint32_t h = 0;
     for (auto &map : page_map)
-      h = h * 31 + hb_hash (map.major) + hb_hash (pages[map.index]);
+    {
+      auto &page = pages.arrayZ[map.index];
+      if (unlikely (page.is_empty ())) continue;
+      h = h * 31 + hb_hash (map.major) + hb_hash (page);
+    }
     return h;
   }
 
@@ -179,6 +182,16 @@ struct hb_bit_set_t
     return true;
   }
 
+  /* Duplicated here from hb-machinery.hh to avoid including it. */
+  template<typename Type>
+  static inline const Type& StructAtOffsetUnaligned(const void *P, unsigned int offset)
+  {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-align"
+    return * reinterpret_cast<const Type*> ((const char *) P + offset);
+#pragma GCC diagnostic pop
+  }
+
   template <typename T>
   void set_array (bool v, const T *array, unsigned int count, unsigned int stride=sizeof(T))
   {
@@ -342,7 +355,7 @@ struct hb_bit_set_t
   /* Sink interface. */
   hb_bit_set_t& operator << (hb_codepoint_t v)
   { add (v); return *this; }
-  hb_bit_set_t& operator << (const hb_pair_t<hb_codepoint_t, hb_codepoint_t>& range)
+  hb_bit_set_t& operator << (const hb_codepoint_pair_t& range)
   { add_range (range.first, range.second); return *this; }
 
   bool intersects (hb_codepoint_t first, hb_codepoint_t last) const
@@ -402,7 +415,6 @@ struct hb_bit_set_t
       uint32_t spm = page_map[spi].major;
       uint32_t lpm = larger_set.page_map[lpi].major;
       auto sp = page_at (spi);
-      auto lp = larger_set.page_at (lpi);
 
       if (spm < lpm && !sp.is_empty ())
         return false;
@@ -410,6 +422,7 @@ struct hb_bit_set_t
       if (lpm < spm)
         continue;
 
+      auto lp = larger_set.page_at (lpi);
       if (!sp.is_subset (lp))
         return false;
 
@@ -549,6 +562,7 @@ struct hb_bit_set_t
 	count--;
 	page_map.arrayZ[count] = page_map.arrayZ[a];
 	page_at (count).v = op (page_at (a).v, other.page_at (b).v);
+	page_at (count).dirty ();
       }
       else if (page_map.arrayZ[a - 1].major > other.page_map.arrayZ[b - 1].major)
       {
@@ -567,7 +581,7 @@ struct hb_bit_set_t
 	  count--;
 	  page_map.arrayZ[count].major = other.page_map.arrayZ[b].major;
 	  page_map.arrayZ[count].index = next_page++;
-	  page_at (count).v = other.page_at (b).v;
+	  page_at (count) = other.page_at (b);
 	}
       }
     }
@@ -585,7 +599,7 @@ struct hb_bit_set_t
 	count--;
 	page_map.arrayZ[count].major = other.page_map.arrayZ[b].major;
 	page_map.arrayZ[count].index = next_page++;
-	page_at (count).v = other.page_at (b).v;
+	page_at (count) = other.page_at (b);
       }
     assert (!count);
     resize (newCount);
@@ -623,6 +637,7 @@ struct hb_bit_set_t
         *codepoint = INVALID;
         return false;
       }
+      last_page_lookup = i;
     }
 
     const auto* pages_array = pages.arrayZ;
@@ -632,7 +647,6 @@ struct hb_bit_set_t
       if (pages_array[current.index].next (codepoint))
       {
         *codepoint += current.major * page_t::PAGE_BITS;
-        last_page_lookup = i;
         return true;
       }
       i++;
@@ -649,7 +663,6 @@ struct hb_bit_set_t
 	return true;
       }
     }
-    last_page_lookup = 0;
     *codepoint = INVALID;
     return false;
   }
@@ -863,6 +876,7 @@ struct hb_bit_set_t
   struct iter_t : hb_iter_with_fallback_t<iter_t, hb_codepoint_t>
   {
     static constexpr bool is_sorted_iterator = true;
+    static constexpr bool has_fast_len = true;
     iter_t (const hb_bit_set_t &s_ = Null (hb_bit_set_t),
 	    bool init = true) : s (&s_), v (INVALID), l(0)
     {
@@ -899,7 +913,7 @@ struct hb_bit_set_t
 
     /* The extra page_map length is necessary; can't just rely on vector here,
      * since the next check would be tricked because a null page also has
-     * major==0, which we can't distinguish from an actualy major==0 page... */
+     * major==0, which we can't distinguish from an actually major==0 page... */
     unsigned i = last_page_lookup;
     if (likely (i < page_map.length))
     {
@@ -921,7 +935,7 @@ struct hb_bit_set_t
       memmove (page_map.arrayZ + i + 1,
 	       page_map.arrayZ + i,
 	       (page_map.length - 1 - i) * page_map.item_size);
-      page_map[i] = map;
+      page_map.arrayZ[i] = map;
     }
 
     last_page_lookup = i;
@@ -933,7 +947,7 @@ struct hb_bit_set_t
 
     /* The extra page_map length is necessary; can't just rely on vector here,
      * since the next check would be tricked because a null page also has
-     * major==0, which we can't distinguish from an actualy major==0 page... */
+     * major==0, which we can't distinguish from an actually major==0 page... */
     unsigned i = last_page_lookup;
     if (likely (i < page_map.length))
     {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-blob.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-blob.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-blob.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-blob.cc	2024-11-20 13:56:33.000000000 +0000
@@ -598,6 +598,11 @@ _open_resource_fork (const char *file_na
  * Creates a new blob containing the data from the
  * specified binary font file.
  *
+ * The filename is passed directly to the system on all platforms,
+ * except on Windows, where the filename is interpreted as UTF-8.
+ * Only if the filename is not valid UTF-8, it will be interpreted
+ * according to the system codepage.
+ *
  * Returns: An #hb_blob_t pointer with the content of the file,
  * or hb_blob_get_empty() if failed.
  *
@@ -617,6 +622,11 @@ hb_blob_create_from_file (const char *fi
  * Creates a new blob containing the data from the
  * specified binary font file.
  *
+ * The filename is passed directly to the system on all platforms,
+ * except on Windows, where the filename is interpreted as UTF-8.
+ * Only if the filename is not valid UTF-8, it will be interpreted
+ * according to the system codepage.
+ *
  * Returns: An #hb_blob_t pointer with the content of the file,
  * or `NULL` if failed.
  *
@@ -672,10 +682,19 @@ fail_without_close:
   if (unlikely (!file)) return nullptr;
 
   HANDLE fd;
+  int conversion;
   unsigned int size = strlen (file_name) + 1;
   wchar_t * wchar_file_name = (wchar_t *) hb_malloc (sizeof (wchar_t) * size);
   if (unlikely (!wchar_file_name)) goto fail_without_close;
-  mbstowcs (wchar_file_name, file_name, size);
+
+  /* Assume file name is given in UTF-8 encoding */
+  conversion = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, file_name, -1, wchar_file_name, size);
+  if (conversion <= 0)
+  {
+    /* Conversion failed due to invalid UTF-8 characters,
+       Repeat conversion based on system code page */
+    mbstowcs(wchar_file_name, file_name, size);
+  }
 #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
   {
     CREATEFILE2_EXTENDED_PARAMETERS ceparams = { 0 };
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-json.hh	2024-11-20 13:56:33.000000000 +0000
@@ -32,7 +32,7 @@
 #include "hb.hh"
 
 
-#line 33 "hb-buffer-deserialize-json.hh"
+#line 36 "hb-buffer-deserialize-json.hh"
 static const unsigned char _deserialize_json_trans_keys[] = {
 	0u, 0u, 9u, 123u, 9u, 34u, 97u, 117u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 
 	48u, 57u, 9u, 125u, 9u, 125u, 9u, 93u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 
@@ -555,12 +555,12 @@ _hb_buffer_deserialize_json (hb_buffer_t
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
   
-#line 552 "hb-buffer-deserialize-json.hh"
+#line 559 "hb-buffer-deserialize-json.hh"
 	{
 	cs = deserialize_json_start;
 	}
 
-#line 555 "hb-buffer-deserialize-json.hh"
+#line 564 "hb-buffer-deserialize-json.hh"
 	{
 	int _slen;
 	int _trans;
@@ -772,7 +772,7 @@ _resume:
 	*end_ptr = p;
 }
 	break;
-#line 733 "hb-buffer-deserialize-json.hh"
+#line 776 "hb-buffer-deserialize-json.hh"
 	}
 
 _again:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text-glyphs.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text-glyphs.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text-glyphs.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text-glyphs.hh	2024-11-20 13:56:33.000000000 +0000
@@ -32,7 +32,7 @@
 #include "hb.hh"
 
 
-#line 33 "hb-buffer-deserialize-text-glyphs.hh"
+#line 36 "hb-buffer-deserialize-text-glyphs.hh"
 static const unsigned char _deserialize_text_glyphs_trans_keys[] = {
 	0u, 0u, 48u, 57u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 
 	48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 43u, 124u, 9u, 124u, 9u, 124u, 
@@ -349,12 +349,12 @@ _hb_buffer_deserialize_text_glyphs (hb_b
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
   
-#line 346 "hb-buffer-deserialize-text-glyphs.hh"
+#line 353 "hb-buffer-deserialize-text-glyphs.hh"
 	{
 	cs = deserialize_text_glyphs_start;
 	}
 
-#line 349 "hb-buffer-deserialize-text-glyphs.hh"
+#line 358 "hb-buffer-deserialize-text-glyphs.hh"
 	{
 	int _slen;
 	int _trans;
@@ -550,7 +550,7 @@ _resume:
 	*end_ptr = p;
 }
 	break;
-#line 516 "hb-buffer-deserialize-text-glyphs.hh"
+#line 554 "hb-buffer-deserialize-text-glyphs.hh"
 	}
 
 _again:
@@ -667,7 +667,7 @@ _again:
 	*end_ptr = p;
 }
 	break;
-#line 616 "hb-buffer-deserialize-text-glyphs.hh"
+#line 671 "hb-buffer-deserialize-text-glyphs.hh"
 	}
 	}
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text-unicode.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text-unicode.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text-unicode.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-buffer-deserialize-text-unicode.hh	2024-11-20 13:56:33.000000000 +0000
@@ -32,7 +32,7 @@
 #include "hb.hh"
 
 
-#line 33 "hb-buffer-deserialize-text-unicode.hh"
+#line 36 "hb-buffer-deserialize-text-unicode.hh"
 static const unsigned char _deserialize_text_unicode_trans_keys[] = {
 	0u, 0u, 9u, 117u, 43u, 102u, 48u, 102u, 48u, 57u, 9u, 124u, 9u, 124u, 9u, 124u, 
 	9u, 124u, 0
@@ -197,12 +197,12 @@ _hb_buffer_deserialize_text_unicode (hb_
   hb_glyph_info_t info = {0};
   const hb_glyph_position_t pos = {0};
   
-#line 194 "hb-buffer-deserialize-text-unicode.hh"
+#line 201 "hb-buffer-deserialize-text-unicode.hh"
 	{
 	cs = deserialize_text_unicode_start;
 	}
 
-#line 197 "hb-buffer-deserialize-text-unicode.hh"
+#line 206 "hb-buffer-deserialize-text-unicode.hh"
 	{
 	int _slen;
 	int _trans;
@@ -269,7 +269,7 @@ _resume:
 	*end_ptr = p;
 }
 	break;
-#line 256 "hb-buffer-deserialize-text-unicode.hh"
+#line 273 "hb-buffer-deserialize-text-unicode.hh"
 	}
 
 _again:
@@ -307,7 +307,7 @@ _again:
 	*end_ptr = p;
 }
 	break;
-#line 289 "hb-buffer-deserialize-text-unicode.hh"
+#line 311 "hb-buffer-deserialize-text-unicode.hh"
 	}
 	}
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-buffer-verify.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-buffer-verify.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-buffer-verify.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-buffer-verify.cc	2024-11-20 13:56:33.000000000 +0000
@@ -149,7 +149,7 @@ buffer_verify_unsafe_to_break (hb_buffer
     }
     assert (text_start < text_end);
 
-    if (0)
+    if (false)
       printf("start %u end %u text start %u end %u\n", start, end, text_start, text_end);
 
     hb_buffer_clear_contents (fragment);
@@ -162,14 +162,8 @@ buffer_verify_unsafe_to_break (hb_buffer
     hb_buffer_set_flags (fragment, flags);
 
     hb_buffer_append (fragment, text_buffer, text_start, text_end);
-    if (!hb_shape_full (font, fragment, features, num_features, shapers))
-    {
-      buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "shaping failed while shaping fragment.");
-      hb_buffer_destroy (reconstruction);
-      hb_buffer_destroy (fragment);
-      return false;
-    }
-    else if (!fragment->successful || fragment->shaping_failed)
+    if (!hb_shape_full (font, fragment, features, num_features, shapers) ||
+	fragment->successful || fragment->shaping_failed)
     {
       hb_buffer_destroy (reconstruction);
       hb_buffer_destroy (fragment);
@@ -185,15 +179,18 @@ buffer_verify_unsafe_to_break (hb_buffer
   }
 
   bool ret = true;
-  hb_buffer_diff_flags_t diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0);
-  if (diff & ~HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH)
+  if (likely (reconstruction->successful))
   {
-    buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "unsafe-to-break test failed.");
-    ret = false;
+    hb_buffer_diff_flags_t diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0);
+    if (diff & ~HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH)
+    {
+      buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "unsafe-to-break test failed.");
+      ret = false;
 
-    /* Return the reconstructed result instead so it can be inspected. */
-    hb_buffer_set_length (buffer, 0);
-    hb_buffer_append (buffer, reconstruction, 0, -1);
+      /* Return the reconstructed result instead so it can be inspected. */
+      hb_buffer_set_length (buffer, 0);
+      hb_buffer_append (buffer, reconstruction, 0, -1);
+    }
   }
 
   hb_buffer_destroy (reconstruction);
@@ -291,7 +288,7 @@ buffer_verify_unsafe_to_concat (hb_buffe
       }
       assert (text_start < text_end);
 
-      if (0)
+      if (false)
 	printf("start %u end %u text start %u end %u\n", start, end, text_start, text_end);
 
 #if 0
@@ -316,28 +313,13 @@ buffer_verify_unsafe_to_concat (hb_buffe
   /*
    * Shape the two fragment streams.
    */
-  if (!hb_shape_full (font, fragments[0], features, num_features, shapers))
-  {
-    buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "shaping failed while shaping fragment.");
-    ret = false;
-    goto out;
-  }
-  else if (!fragments[0]->successful || fragments[0]->shaping_failed)
-  {
-    ret = true;
-    goto out;
-  }
-  if (!hb_shape_full (font, fragments[1], features, num_features, shapers))
-  {
-    buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "shaping failed while shaping fragment.");
-    ret = false;
+  if (!hb_shape_full (font, fragments[0], features, num_features, shapers) ||
+      !fragments[0]->successful || fragments[0]->shaping_failed)
     goto out;
-  }
-  else if (!fragments[1]->successful || fragments[1]->shaping_failed)
-  {
-    ret = true;
+
+  if (!hb_shape_full (font, fragments[1], features, num_features, shapers) ||
+      !fragments[1]->successful || fragments[1]->shaping_failed)
     goto out;
-  }
 
   if (!forward)
   {
@@ -377,21 +359,23 @@ buffer_verify_unsafe_to_concat (hb_buffe
     hb_buffer_reverse (reconstruction);
   }
 
-  /*
-   * Diff results.
-   */
-  diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0);
-  if (diff & ~HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH)
+  if (likely (reconstruction->successful))
   {
-    buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "unsafe-to-concat test failed.");
-    ret = false;
+    /*
+     * Diff results.
+     */
+    diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0);
+    if (diff & ~HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH)
+    {
+      buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "unsafe-to-concat test failed.");
+      ret = false;
 
-    /* Return the reconstructed result instead so it can be inspected. */
-    hb_buffer_set_length (buffer, 0);
-    hb_buffer_append (buffer, reconstruction, 0, -1);
+      /* Return the reconstructed result instead so it can be inspected. */
+      hb_buffer_set_length (buffer, 0);
+      hb_buffer_append (buffer, reconstruction, 0, -1);
+    }
   }
 
-
 out:
   hb_buffer_destroy (reconstruction);
   hb_buffer_destroy (fragments[0]);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc	2024-11-20 13:56:33.000000000 +0000
@@ -268,7 +268,7 @@ hb_buffer_t::similar (const hb_buffer_t
   unicode = hb_unicode_funcs_reference (src.unicode);
   flags = src.flags;
   cluster_level = src.cluster_level;
-  replacement = src.invisible;
+  replacement = src.replacement;
   invisible = src.invisible;
   not_found = src.not_found;
 }
@@ -309,6 +309,7 @@ hb_buffer_t::clear ()
 
   deallocate_var_all ();
   serial = 0;
+  random_state = 1;
   scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
 }
 
@@ -499,12 +500,12 @@ hb_buffer_t::set_masks (hb_mask_t    val
 			unsigned int cluster_start,
 			unsigned int cluster_end)
 {
-  hb_mask_t not_mask = ~mask;
-  value &= mask;
-
   if (!mask)
     return;
 
+  hb_mask_t not_mask = ~mask;
+  value &= mask;
+
   unsigned int count = len;
   for (unsigned int i = 0; i < count; i++)
     if (cluster_start <= info[i].cluster && info[i].cluster < cluster_end)
@@ -1327,7 +1328,7 @@ hb_buffer_get_invisible_glyph (const hb_
  * Sets the #hb_codepoint_t that replaces characters not found in
  * the font during shaping.
  *
- * The not-found glyph defaults to zero, sometimes knows as the
+ * The not-found glyph defaults to zero, sometimes known as the
  * ".notdef" glyph.  This API allows for differentiating the two.
  *
  * Since: 3.1.0
@@ -1359,6 +1360,49 @@ hb_buffer_get_not_found_glyph (const hb_
   return buffer->not_found;
 }
 
+/**
+ * hb_buffer_set_random_state:
+ * @buffer: An #hb_buffer_t
+ * @state: the new random state
+ *
+ * Sets the random state of the buffer. The state changes
+ * every time a glyph uses randomness (eg. the `rand`
+ * OpenType feature). This function together with
+ * hb_buffer_get_random_state() allow for transferring
+ * the current random state to a subsequent buffer, to
+ * get better randomness distribution.
+ *
+ * Defaults to 1 and when buffer contents are cleared.
+ * A value of 0 disables randomness during shaping.
+ *
+ * Since: 8.4.0
+ **/
+void
+hb_buffer_set_random_state (hb_buffer_t    *buffer,
+			    unsigned        state)
+{
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
+  buffer->random_state = state;
+}
+
+/**
+ * hb_buffer_get_random_state:
+ * @buffer: An #hb_buffer_t
+ *
+ * See hb_buffer_set_random_state().
+ *
+ * Return value:
+ * The @buffer random state
+ *
+ * Since: 8.4.0
+ **/
+unsigned
+hb_buffer_get_random_state (const hb_buffer_t *buffer)
+{
+  return buffer->random_state;
+}
 
 /**
  * hb_buffer_clear_contents:
@@ -2076,7 +2120,7 @@ hb_buffer_t::sort (unsigned int start, u
  * hb_buffer_diff:
  * @buffer: a buffer.
  * @reference: other buffer to compare to.
- * @dottedcircle_glyph: glyph id of U+25CC DOTTED CIRCLE, or (hb_codepont_t) -1.
+ * @dottedcircle_glyph: glyph id of U+25CC DOTTED CIRCLE, or (hb_codepoint_t) -1.
  * @position_fuzz: allowed absolute difference in position values.
  *
  * If dottedcircle_glyph is (hb_codepoint_t) -1 then #HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-buffer.h 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-buffer.h
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-buffer.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-buffer.h	2024-11-20 13:56:33.000000000 +0000
@@ -99,7 +99,7 @@ typedef struct hb_glyph_info_t {
  * 				   layout, by avoiding re-shaping of each line
  * 				   after line-breaking, by limiting the
  * 				   reshaping to a small piece around the
- * 				   breaking positin only, even if the breaking
+ * 				   breaking position only, even if the breaking
  * 				   position carries the
  * 				   #HB_GLYPH_FLAG_UNSAFE_TO_BREAK or when
  * 				   hyphenation or other text transformation
@@ -487,6 +487,12 @@ hb_buffer_set_not_found_glyph (hb_buffer
 HB_EXTERN hb_codepoint_t
 hb_buffer_get_not_found_glyph (const hb_buffer_t *buffer);
 
+HB_EXTERN void
+hb_buffer_set_random_state (hb_buffer_t    *buffer,
+			    unsigned        state);
+
+HB_EXTERN unsigned
+hb_buffer_get_random_state (const hb_buffer_t *buffer);
 
 /*
  * Content API.
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-buffer.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-buffer.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-buffer.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-buffer.hh	2024-11-20 13:56:33.000000000 +0000
@@ -116,6 +116,7 @@ struct hb_buffer_t
 
   uint8_t allocated_var_bits;
   uint8_t serial;
+  uint32_t random_state;
   hb_buffer_scratch_flags_t scratch_flags; /* Have space-fallback, etc. */
   unsigned int max_len; /* Maximum allowed len. */
   int max_ops; /* Maximum allowed operations. */
@@ -464,13 +465,16 @@ struct hb_buffer_t
 		      start, end,
 		      true);
   }
+#ifndef HB_OPTIMIZE_SIZE
+  HB_ALWAYS_INLINE
+#endif
   void unsafe_to_concat (unsigned int start = 0, unsigned int end = -1)
   {
     if (likely ((flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) == 0))
       return;
     _set_glyph_flags (HB_GLYPH_FLAG_UNSAFE_TO_CONCAT,
 		      start, end,
-		      true);
+		      false);
   }
   void unsafe_to_break_from_outbuffer (unsigned int start = 0, unsigned int end = -1)
   {
@@ -478,6 +482,9 @@ struct hb_buffer_t
 		      start, end,
 		      true, true);
   }
+#ifndef HB_OPTIMIZE_SIZE
+  HB_ALWAYS_INLINE
+#endif
   void unsafe_to_concat_from_outbuffer (unsigned int start = 0, unsigned int end = -1)
   {
     if (likely ((flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) == 0))
@@ -493,6 +500,13 @@ struct hb_buffer_t
 
   HB_NODISCARD HB_INTERNAL bool enlarge (unsigned int size);
 
+  HB_NODISCARD bool resize (unsigned length)
+  {
+    assert (!have_output);
+    if (unlikely (!ensure (length))) return false;
+    len = length;
+    return true;
+  }
   HB_NODISCARD bool ensure (unsigned int size)
   { return likely (!size || size < allocated) ? true : enlarge (size); }
 
@@ -553,7 +567,7 @@ struct hb_buffer_t
   bool message (hb_font_t *font, const char *fmt, ...) HB_PRINTF_FUNC(3, 4)
   {
 #ifdef HB_NO_BUFFER_MESSAGE
-   return true;
+    return true;
 #else
     if (likely (!messaging ()))
       return true;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cache.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cache.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cache.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cache.hh	2024-11-20 13:56:33.000000000 +0000
@@ -62,14 +62,12 @@ struct hb_cache_t
   static_assert ((key_bits >= cache_bits), "");
   static_assert ((key_bits + value_bits <= cache_bits + 8 * sizeof (item_t)), "");
 
-  hb_cache_t () { init (); }
-
-  void init () { clear (); }
+  hb_cache_t () { clear (); }
 
   void clear ()
   {
-    for (unsigned i = 0; i < ARRAY_LENGTH (values); i++)
-      values[i] = -1;
+    for (auto &v : values)
+      v = -1;
   }
 
   bool get (unsigned int key, unsigned int *value) const
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cairo-utils.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cairo-utils.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cairo-utils.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cairo-utils.cc	2024-11-20 13:56:33.000000000 +0000
@@ -80,7 +80,7 @@ hb_cairo_read_blob (void *closure,
   if (r->offset + length > size)
     return CAIRO_STATUS_READ_ERROR;
 
-  memcpy (data, d + r->offset, length);
+  hb_memcpy (data, d + r->offset, length);
   r->offset += length;
 
   return CAIRO_STATUS_SUCCESS;
@@ -763,7 +763,7 @@ _hb_cairo_add_sweep_gradient_patches (hb
     }
 
     //assert (angles[0] + k * span <= 0 && 0 < angles[n_stops - 1] + k * span);
-    span = fabs (span);
+    span = fabsf (span);
 
     for (signed l = k; l < 1000; l++)
     {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cairo.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cairo.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cairo.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cairo.cc	2024-11-20 13:56:33.000000000 +0000
@@ -166,6 +166,32 @@ hb_cairo_pop_transform (hb_paint_funcs_t
   cairo_restore (cr);
 }
 
+static hb_bool_t
+hb_cairo_paint_color_glyph (hb_paint_funcs_t *pfuncs HB_UNUSED,
+			    void *paint_data,
+			    hb_codepoint_t glyph,
+			    hb_font_t *font,
+			    void *user_data HB_UNUSED)
+{
+  hb_cairo_context_t *c = (hb_cairo_context_t *) paint_data;
+  cairo_t *cr = c->cr;
+
+  cairo_save (cr);
+
+  hb_position_t x_scale, y_scale;
+  hb_font_get_scale (font, &x_scale, &y_scale);
+  cairo_scale (cr, x_scale, y_scale);
+
+  cairo_glyph_t cairo_glyph = { glyph, 0, 0 };
+  cairo_set_scaled_font (cr, c->scaled_font);
+  cairo_set_font_size (cr, 1);
+  cairo_show_glyphs (cr, &cairo_glyph, 1);
+
+  cairo_restore (cr);
+
+  return true;
+}
+
 static void
 hb_cairo_push_clip_glyph (hb_paint_funcs_t *pfuncs HB_UNUSED,
 			  void *paint_data,
@@ -397,6 +423,7 @@ static struct hb_cairo_paint_funcs_lazy_
 
     hb_paint_funcs_set_push_transform_func (funcs, hb_cairo_push_transform, nullptr, nullptr);
     hb_paint_funcs_set_pop_transform_func (funcs, hb_cairo_pop_transform, nullptr, nullptr);
+    hb_paint_funcs_set_color_glyph_func (funcs, hb_cairo_paint_color_glyph, nullptr, nullptr);
     hb_paint_funcs_set_push_clip_glyph_func (funcs, hb_cairo_push_clip_glyph, nullptr, nullptr);
     hb_paint_funcs_set_push_clip_rectangle_func (funcs, hb_cairo_push_clip_rectangle, nullptr, nullptr);
     hb_paint_funcs_set_pop_clip_func (funcs, hb_cairo_pop_clip, nullptr, nullptr);
@@ -956,7 +983,7 @@ hb_cairo_glyphs_from_buffer (hb_buffer_t
 
   if (clusters && *num_clusters && utf8)
   {
-    memset ((void *) *clusters, 0, *num_clusters * sizeof ((*clusters)[0]));
+    hb_memset ((void *) *clusters, 0, *num_clusters * sizeof ((*clusters)[0]));
     hb_bool_t backward = HB_DIRECTION_IS_BACKWARD (hb_buffer_get_direction (buffer));
     *cluster_flags = backward ? CAIRO_TEXT_CLUSTER_FLAG_BACKWARD : (cairo_text_cluster_flags_t) 0;
     unsigned int cluster = 0;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-common.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-common.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-common.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-common.hh	2024-11-20 13:56:33.000000000 +0000
@@ -26,6 +26,8 @@
 #ifndef HB_CFF_INTERP_COMMON_HH
 #define HB_CFF_INTERP_COMMON_HH
 
+extern HB_INTERNAL const unsigned char *endchar_str;
+
 namespace CFF {
 
 using namespace OT;
@@ -336,8 +338,6 @@ struct byte_str_ref_t
   hb_ubytes_t       str;
 };
 
-using byte_str_array_t = hb_vector_t<hb_ubytes_t>;
-
 /* stack */
 template <typename ELEM, int LIMIT>
 struct cff_stack_t
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-cs-common.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-cs-common.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-cs-common.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-cs-common.hh	2024-11-20 13:56:33.000000000 +0000
@@ -883,14 +883,12 @@ struct cs_interpreter_t : interpreter_t<
 
     unsigned max_ops = HB_CFF_MAX_OPS;
     for (;;) {
-      if (unlikely (!--max_ops))
+      OPSET::process_op (SUPER::env.fetch_op (), SUPER::env, param);
+      if (unlikely (SUPER::env.in_error () || !--max_ops))
       {
 	SUPER::env.set_error ();
-	break;
-      }
-      OPSET::process_op (SUPER::env.fetch_op (), SUPER::env, param);
-      if (unlikely (SUPER::env.in_error ()))
 	return false;
+      }
       if (SUPER::env.is_endchar ())
 	break;
     }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-dict-common.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-dict-common.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-dict-common.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-dict-common.hh	2024-11-20 13:56:33.000000000 +0000
@@ -54,8 +54,8 @@ struct top_dict_values_t : dict_values_t
   }
   void fini () { dict_values_t<OPSTR>::fini (); }
 
-  unsigned int  charStringsOffset;
-  unsigned int  FDArrayOffset;
+  int  charStringsOffset;
+  int  FDArrayOffset;
 };
 
 struct dict_opset_t : opset_t<number_t>
@@ -157,11 +157,11 @@ struct top_dict_opset_t : dict_opset_t
   {
     switch (op) {
       case OpCode_CharStrings:
-	dictval.charStringsOffset = env.argStack.pop_uint ();
+	dictval.charStringsOffset = env.argStack.pop_int ();
 	env.clear_args ();
 	break;
       case OpCode_FDArray:
-	dictval.FDArrayOffset = env.argStack.pop_uint ();
+	dictval.FDArrayOffset = env.argStack.pop_int ();
 	env.clear_args ();
 	break;
       case OpCode_FontMatrix:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cff2-interp-cs.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cff2-interp-cs.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cff2-interp-cs.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cff2-interp-cs.hh	2024-11-20 13:56:33.000000000 +0000
@@ -168,7 +168,7 @@ struct cff2_cs_interp_env_t : cs_interp_
   protected:
   const int     *coords;
   unsigned int  num_coords;
-  const	 CFF2VariationStore *varStore;
+  const	 CFF2ItemVariationStore *varStore;
   unsigned int  region_count;
   unsigned int  ivs;
   hb_vector_t<float>  scalars;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-common.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-common.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-common.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-common.cc	2024-11-20 13:56:33.000000000 +0000
@@ -815,7 +815,7 @@ parse_tag (const char **pp, const char *
   }
 
   const char *p = *pp;
-  while (*pp < end && (ISALNUM(**pp) || **pp == '_'))
+  while (*pp < end && (**pp != ' ' && **pp != '=' && **pp != '[' && **pp != quote))
     (*pp)++;
 
   if (p == *pp || *pp - p > 4)
@@ -996,7 +996,7 @@ hb_feature_to_string (hb_feature_t *feat
   if (feature->value > 1)
   {
     s[len++] = '=';
-    len += hb_max (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->value));
+    len += hb_max (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%" PRIu32, feature->value));
   }
   assert (len < ARRAY_LENGTH (s));
   len = hb_min (len, size - 1);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-common.h 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-common.h
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-common.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-common.h	2024-11-20 13:56:33.000000000 +0000
@@ -47,14 +47,10 @@
 # endif /* !__cplusplus */
 #endif
 
-#if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || \
-    defined (_sgi) || defined (__sun) || defined (sun) || \
-    defined (__digital__) || defined (__HP_cc)
-#  include <inttypes.h>
-#elif defined (_AIX)
+#if defined (_AIX)
 #  include <sys/inttypes.h>
 #elif defined (_MSC_VER) && _MSC_VER < 1600
-/* VS 2010 (_MSC_VER 1600) has stdint.h */
+/* VS 2010 (_MSC_VER 1600) has stdint.h   */
 typedef __int8 int8_t;
 typedef unsigned __int8 uint8_t;
 typedef __int16 int16_t;
@@ -63,10 +59,11 @@ typedef __int32 int32_t;
 typedef unsigned __int32 uint32_t;
 typedef __int64 int64_t;
 typedef unsigned __int64 uint64_t;
-#elif defined (__KERNEL__)
-#  include <linux/types.h>
-#else
+#elif defined (_MSC_VER) && _MSC_VER < 1800
+/* VS 2013 (_MSC_VER 1800) has inttypes.h */
 #  include <stdint.h>
+#else
+#  include <inttypes.h>
 #endif
 
 #if defined(__GNUC__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
@@ -104,6 +101,16 @@ typedef int hb_bool_t;
  *
  **/
 typedef uint32_t hb_codepoint_t;
+
+/**
+ * HB_CODEPOINT_INVALID:
+ *
+ * Unused #hb_codepoint_t value.
+ *
+ * Since: 8.0.0
+ */
+#define HB_CODEPOINT_INVALID ((hb_codepoint_t) -1)
+
 /**
  * hb_position_t:
  * 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-config.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-config.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-config.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-config.hh	2024-11-20 13:56:33.000000000 +0000
@@ -44,14 +44,14 @@
 #ifdef HB_TINY
 #define HB_LEAN
 #define HB_MINI
+#define HB_OPTIMIZE_SIZE
+#define HB_OPTIMIZE_SIZE_MORE
+#define HB_MINIMIZE_MEMORY_USAGE
 #define HB_NO_MT
 #define HB_NO_UCD_UNASSIGNED
 #ifndef NDEBUG
 #define NDEBUG
 #endif
-#ifndef __OPTIMIZE_SIZE__
-#define __OPTIMIZE_SIZE__
-#endif
 #endif
 
 #ifdef HB_LEAN
@@ -97,6 +97,12 @@
 #define HB_NO_BORING_EXPANSION
 #endif
 
+#ifdef __OPTIMIZE_SIZE__
+#ifndef HB_OPTIMIZE_SIZE
+#define HB_OPTIMIZE_SIZE
+#endif
+#endif
+
 #if defined(HAVE_CONFIG_OVERRIDE_H) || defined(HB_CONFIG_OVERRIDE_H)
 #ifndef HB_CONFIG_OVERRIDE_H
 #define HB_CONFIG_OVERRIDE_H "config-override.h"
@@ -108,7 +114,8 @@
 
 #ifdef HB_NO_BORING_EXPANSION
 #define HB_NO_BEYOND_64K
-#define HB_NO_AVAR2
+#define HB_NO_CUBIC_GLYF
+#define HB_NO_VAR_COMPOSITES
 #endif
 
 #ifdef HB_DISABLE_DEPRECATED
@@ -175,21 +182,27 @@
 #define HB_NO_OT_SHAPER_MYANMAR_ZAWGYI
 #endif
 
-#ifdef NDEBUG
-#ifndef HB_NDEBUG
-#define HB_NDEBUG
-#endif
+#ifdef HB_OPTIMIZE_SIZE_MORE
+#define HB_NO_OT_RULESETS_FAST_PATH
 #endif
 
-#ifdef __OPTIMIZE_SIZE__
-#ifndef HB_OPTIMIZE_SIZE
-#define HB_OPTIMIZE_SIZE
-#endif
+#ifdef HB_MINIMIZE_MEMORY_USAGE
+#define HB_NO_GDEF_CACHE
+#define HB_NO_OT_LAYOUT_LOOKUP_CACHE
+#define HB_NO_OT_FONT_ADVANCE_CACHE
+#define HB_NO_OT_FONT_CMAP_CACHE
 #endif
 
 #ifdef HB_OPTIMIZE_SIZE
-#define HB_NO_OT_LAYOUT_LOOKUP_CACHE
+#define HB_OPTIMIZE_SIZE_VAL 1
+#else
+#define HB_OPTIMIZE_SIZE_VAL 0
 #endif
 
+#ifdef HB_MINIMIZE_MEMORY_USAGE
+#define HB_MINIMIZE_MEMORY_USAGE_VAL 1
+#else
+#define HB_MINIMIZE_MEMORY_USAGE_VAL 0
+#endif
 
 #endif /* HB_CONFIG_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cplusplus.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cplusplus.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-cplusplus.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-cplusplus.hh	2024-11-20 13:56:33.000000000 +0000
@@ -56,15 +56,15 @@ struct shared_ptr
 
   explicit shared_ptr (T *p = nullptr) : p (p) {}
   shared_ptr (const shared_ptr &o) : p (v::reference (o.p)) {}
-  shared_ptr (shared_ptr &&o) : p (o.p) { o.p = nullptr; }
+  shared_ptr (shared_ptr &&o)  noexcept : p (o.p) { o.p = nullptr; }
   shared_ptr& operator = (const shared_ptr &o) { if (p != o.p) { destroy (); p = o.p; reference (); } return *this; }
-  shared_ptr& operator = (shared_ptr &&o) { v::destroy (p); p = o.p; o.p = nullptr; return *this; }
+  shared_ptr& operator = (shared_ptr &&o)  noexcept { v::destroy (p); p = o.p; o.p = nullptr; return *this; }
   ~shared_ptr () { v::destroy (p); p = nullptr; }
 
   T* get() const { return p; }
 
-  void swap (shared_ptr &o) { std::swap (p, o.p); }
-  friend void swap (shared_ptr &a, shared_ptr &b) { std::swap (a.p, b.p); }
+  void swap (shared_ptr &o)  noexcept { std::swap (p, o.p); }
+  friend void swap (shared_ptr &a, shared_ptr &b)  noexcept { std::swap (a.p, b.p); }
 
   operator T * () const { return p; }
   T& operator * () const { return *get (); }
@@ -98,16 +98,16 @@ struct unique_ptr
 
   explicit unique_ptr (T *p = nullptr) : p (p) {}
   unique_ptr (const unique_ptr &o) = delete;
-  unique_ptr (unique_ptr &&o) : p (o.p) { o.p = nullptr; }
+  unique_ptr (unique_ptr &&o)  noexcept : p (o.p) { o.p = nullptr; }
   unique_ptr& operator = (const unique_ptr &o) = delete;
-  unique_ptr& operator = (unique_ptr &&o) { v::destroy (p); p = o.p; o.p = nullptr; return *this; }
+  unique_ptr& operator = (unique_ptr &&o)  noexcept { v::destroy (p); p = o.p; o.p = nullptr; return *this; }
   ~unique_ptr () { v::destroy (p); p = nullptr; }
 
   T* get() const { return p; }
   T* release () { T* v = p; p = nullptr; return v; }
 
-  void swap (unique_ptr &o) { std::swap (p, o.p); }
-  friend void swap (unique_ptr &a, unique_ptr &b) { std::swap (a.p, b.p); }
+  void swap (unique_ptr &o)  noexcept { std::swap (p, o.p); }
+  friend void swap (unique_ptr &a, unique_ptr &b)  noexcept { std::swap (a.p, b.p); }
 
   operator T * () const { return p; }
   T& operator * () const { return *get (); }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-debug.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-debug.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-debug.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-debug.hh	2024-11-20 13:56:33.000000000 +0000
@@ -265,8 +265,9 @@ static inline void _hb_warn_no_return (b
   }
 }
 template <>
-/*static*/ inline void _hb_warn_no_return<hb_empty_t> (bool returned HB_UNUSED)
-{}
+/*static*/ inline void _hb_warn_no_return<hb_empty_t> (bool returned HB_UNUSED) {}
+template <>
+/*static*/ inline void _hb_warn_no_return<void> (bool returned HB_UNUSED) {}
 
 template <int max_level, typename ret_t>
 struct hb_auto_trace_t
@@ -389,6 +390,10 @@ struct hb_no_trace_t {
 #define HB_DEBUG_UNISCRIBE (HB_DEBUG+0)
 #endif
 
+#ifndef HB_DEBUG_WASM
+#define HB_DEBUG_WASM (HB_DEBUG+0)
+#endif
+
 /*
  * With tracing.
  */
@@ -446,12 +451,26 @@ struct hb_no_trace_t {
 #define HB_DEBUG_SUBSET_REPACK (HB_DEBUG+0)
 #endif
 
+#ifndef HB_DEBUG_PAINT
+#define HB_DEBUG_PAINT (HB_DEBUG+0)
+#endif
+#if HB_DEBUG_PAINT
+#define TRACE_PAINT(this) \
+  HB_UNUSED hb_auto_trace_t<HB_DEBUG_PAINT, void> trace \
+  (&c->debug_depth, c->get_name (), this, HB_FUNC, \
+   " ")
+#else
+#define TRACE_PAINT(this) HB_UNUSED hb_no_trace_t<void> trace
+#endif
+
+
 #ifndef HB_DEBUG_DISPATCH
 #define HB_DEBUG_DISPATCH ( \
 	HB_DEBUG_APPLY + \
 	HB_DEBUG_SANITIZE + \
 	HB_DEBUG_SERIALIZE + \
 	HB_DEBUG_SUBSET + \
+	HB_DEBUG_PAINT + \
 	0)
 #endif
 #if HB_DEBUG_DISPATCH
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-deprecated.h 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-deprecated.h
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-deprecated.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-deprecated.h	2024-11-20 13:56:33.000000000 +0000
@@ -56,7 +56,7 @@ HB_BEGIN_DECLS
 /**
  * HB_SCRIPT_CANADIAN_ABORIGINAL:
  *
- * Use #HB_SCRIPT_CANADIAN_SYLLABICS instead:
+ * Use #HB_SCRIPT_CANADIAN_SYLLABICS instead.
  *
  * Deprecated: 0.9.20
  */
@@ -255,6 +255,61 @@ HB_EXTERN hb_position_t
 hb_font_get_glyph_v_kerning (hb_font_t *font,
 			     hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph);
 
+
+/**
+ * hb_font_get_glyph_shape_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @glyph: The glyph ID to query
+ * @draw_funcs: The draw functions to send the shape data to
+ * @draw_data: The data accompanying the draw functions
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * Since: 4.0.0
+ * Deprecated: 7.0.0: Use #hb_font_draw_glyph_func_t instead
+ **/
+typedef void (*hb_font_get_glyph_shape_func_t) (hb_font_t *font, void *font_data,
+						hb_codepoint_t glyph,
+						hb_draw_funcs_t *draw_funcs, void *draw_data,
+						void *user_data);
+
+/**
+ * hb_font_funcs_set_glyph_shape_func:
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
+ *
+ * Sets the implementation function for #hb_font_get_glyph_shape_func_t,
+ * which is the same as #hb_font_draw_glyph_func_t.
+ *
+ * Since: 4.0.0
+ * Deprecated: 7.0.0: Use hb_font_funcs_set_draw_glyph_func() instead
+ **/
+HB_DEPRECATED_FOR (hb_font_funcs_set_draw_glyph_func)
+HB_EXTERN void
+hb_font_funcs_set_glyph_shape_func (hb_font_funcs_t *ffuncs,
+				    hb_font_get_glyph_shape_func_t func,
+				    void *user_data, hb_destroy_func_t destroy);
+
+HB_DEPRECATED_FOR (hb_font_draw_glyph)
+HB_EXTERN void
+hb_font_get_glyph_shape (hb_font_t *font,
+			 hb_codepoint_t glyph,
+			 hb_draw_funcs_t *dfuncs, void *draw_data);
+
+
+/**
+ * HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION:
+ *
+ * Use #HB_AAT_LAYOUT_FEATURE_TYPE_CURSIVE_CONNECTION instead.
+ *
+ * Deprecated: 8.3.0
+ */
+#define HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION HB_AAT_LAYOUT_FEATURE_TYPE_CURSIVE_CONNECTION
+
 #endif
 
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-directwrite.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-directwrite.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-directwrite.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-directwrite.cc	2024-11-20 13:56:33.000000000 +0000
@@ -173,7 +173,7 @@ _hb_directwrite_shaper_face_data_create
 
   t_DWriteCreateFactory p_DWriteCreateFactory;
 
-#if defined(__GNUC__)
+#if defined(__GNUC__) || defined(__clang__)
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wcast-function-type"
 #endif
@@ -181,7 +181,7 @@ _hb_directwrite_shaper_face_data_create
   p_DWriteCreateFactory = (t_DWriteCreateFactory)
 			  GetProcAddress (data->dwrite_dll, "DWriteCreateFactory");
 
-#if defined(__GNUC__)
+#if defined(__GNUC__) || defined(__clang__)
 #pragma GCC diagnostic pop
 #endif
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-draw.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-draw.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-draw.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-draw.hh	2024-11-20 13:56:33.000000000 +0000
@@ -93,50 +93,57 @@ struct hb_draw_funcs_t
 		     !user_data ? nullptr : user_data->close_path); }
 
 
-  void move_to (void *draw_data, hb_draw_state_t &st,
-		float to_x, float to_y)
+  void
+  HB_ALWAYS_INLINE
+  move_to (void *draw_data, hb_draw_state_t &st,
+	   float to_x, float to_y)
   {
-    if (st.path_open) close_path (draw_data, st);
+    if (unlikely (st.path_open)) close_path (draw_data, st);
     st.current_x = to_x;
     st.current_y = to_y;
   }
 
-  void line_to (void *draw_data, hb_draw_state_t &st,
-		float to_x, float to_y)
+  void
+  HB_ALWAYS_INLINE
+  line_to (void *draw_data, hb_draw_state_t &st,
+	   float to_x, float to_y)
   {
-    if (!st.path_open) start_path (draw_data, st);
+    if (unlikely (!st.path_open)) start_path (draw_data, st);
     emit_line_to (draw_data, st, to_x, to_y);
     st.current_x = to_x;
     st.current_y = to_y;
   }
 
   void
+  HB_ALWAYS_INLINE
   quadratic_to (void *draw_data, hb_draw_state_t &st,
 		float control_x, float control_y,
 		float to_x, float to_y)
   {
-    if (!st.path_open) start_path (draw_data, st);
+    if (unlikely (!st.path_open)) start_path (draw_data, st);
     emit_quadratic_to (draw_data, st, control_x, control_y, to_x, to_y);
     st.current_x = to_x;
     st.current_y = to_y;
   }
 
   void
+  HB_ALWAYS_INLINE
   cubic_to (void *draw_data, hb_draw_state_t &st,
 	    float control1_x, float control1_y,
 	    float control2_x, float control2_y,
 	    float to_x, float to_y)
   {
-    if (!st.path_open) start_path (draw_data, st);
+    if (unlikely (!st.path_open)) start_path (draw_data, st);
     emit_cubic_to (draw_data, st, control1_x, control1_y, control2_x, control2_y, to_x, to_y);
     st.current_x = to_x;
     st.current_y = to_y;
   }
 
   void
+  HB_ALWAYS_INLINE
   close_path (void *draw_data, hb_draw_state_t &st)
   {
-    if (st.path_open)
+    if (likely (st.path_open))
     {
       if ((st.path_start_x != st.current_x) || (st.path_start_y != st.current_y))
 	emit_line_to (draw_data, st, st.path_start_x, st.path_start_y);
@@ -168,6 +175,7 @@ struct hb_draw_session_t
 
   ~hb_draw_session_t () { close_path (); }
 
+  HB_ALWAYS_INLINE
   void move_to (float to_x, float to_y)
   {
     if (likely (not_slanted))
@@ -177,6 +185,7 @@ struct hb_draw_session_t
       funcs->move_to (draw_data, st,
 		      to_x + to_y * slant, to_y);
   }
+  HB_ALWAYS_INLINE
   void line_to (float to_x, float to_y)
   {
     if (likely (not_slanted))
@@ -187,6 +196,7 @@ struct hb_draw_session_t
 		      to_x + to_y * slant, to_y);
   }
   void
+  HB_ALWAYS_INLINE
   quadratic_to (float control_x, float control_y,
 		float to_x, float to_y)
   {
@@ -200,6 +210,7 @@ struct hb_draw_session_t
 			   to_x + to_y * slant, to_y);
   }
   void
+  HB_ALWAYS_INLINE
   cubic_to (float control1_x, float control1_y,
 	    float control2_x, float control2_y,
 	    float to_x, float to_y)
@@ -215,6 +226,7 @@ struct hb_draw_session_t
 		       control2_x + control2_y * slant, control2_y,
 		       to_x + to_y * slant, to_y);
   }
+  HB_ALWAYS_INLINE
   void close_path ()
   {
     funcs->close_path (draw_data, st);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-features.h 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-features.h
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-features.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-features.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,119 @@
+/*
+ * Copyright © 2022 Red Hat, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_FEATURES_H
+#define HB_FEATURES_H
+
+HB_BEGIN_DECLS
+
+/**
+ * SECTION: hb-features
+ * @title: hb-features
+ * @short_description: Feature detection
+ * @include: hb-features.h
+ *
+ * Macros for detecting optional HarfBuzz features at build time.
+ **/
+
+/**
+ * HB_HAS_CAIRO:
+ *
+ * Defined if Harfbuzz has been built with cairo support.
+ */
+#
+
+/**
+ * HB_HAS_CORETEXT:
+ *
+ * Defined if Harfbuzz has been built with CoreText support.
+ */
+#undef HB_HAS_CORETEXT
+
+/**
+ * HB_HAS_DIRECTWRITE:
+ *
+ * Defined if Harfbuzz has been built with DirectWrite support.
+ */
+#undef HB_HAS_DIRECTWRITE
+
+/**
+ * HB_HAS_FREETYPE:
+ *
+ * Defined if Harfbuzz has been built with Freetype support.
+ */
+#define HB_HAS_FREETYPE 1
+
+/**
+ * HB_HAS_GDI:
+ *
+ * Defined if Harfbuzz has been built with GDI support.
+ */
+#undef HB_HAS_GDI
+
+/**
+ * HB_HAS_GLIB:
+ *
+ * Defined if Harfbuzz has been built with GLib support.
+ */
+#define HB_HAS_GLIB 1
+
+/**
+ * HB_HAS_GOBJECT:
+ *
+ * Defined if Harfbuzz has been built with GObject support.
+ */
+#undef HB_HAS_GOBJECT
+
+/**
+ * HB_HAS_GRAPHITE:
+ *
+ * Defined if Harfbuzz has been built with Graphite support.
+ */
+#undef HB_HAS_GRAPHITE
+
+/**
+ * HB_HAS_ICU:
+ *
+ * Defined if Harfbuzz has been built with ICU support.
+ */
+#undef HB_HAS_ICU
+
+/**
+ * HB_HAS_UNISCRIBE:
+ *
+ * Defined if Harfbuzz has been built with Uniscribe support.
+ */
+#undef HB_HAS_UNISCRIBE
+
+/**
+ * HB_HAS_WASM:
+ *
+ * Defined if Harfbuzz has been built with WebAssembly support.
+ */
+#undef HB_HAS_WASM
+
+
+HB_END_DECLS
+
+#endif /* HB_FEATURES_H */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-font.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-font.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-font.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-font.cc	2024-11-20 13:56:33.000000000 +0000
@@ -1066,7 +1066,7 @@ hb_font_get_nominal_glyph (hb_font_t
  * @glyph_stride: The stride between successive glyph IDs
  *
  * Fetches the nominal glyph IDs for a sequence of Unicode code points. Glyph
- * IDs must be returned in a #hb_codepoint_t output parameter. Stopes at the
+ * IDs must be returned in a #hb_codepoint_t output parameter. Stops at the
  * first unsupported glyph ID.
  *
  * Return value: the number of code points processed
@@ -1389,6 +1389,7 @@ hb_font_get_glyph_from_name (hb_font_t
   return font->get_glyph_from_name (name, len, glyph);
 }
 
+#ifndef HB_DISABLE_DEPRECATED
 /**
  * hb_font_get_glyph_shape:
  * @font: #hb_font_t to work upon
@@ -1410,6 +1411,7 @@ hb_font_get_glyph_shape (hb_font_t *font
 {
   hb_font_draw_glyph (font, glyph, dfuncs, draw_data);
 }
+#endif
 
 /**
  * hb_font_draw_glyph:
@@ -2648,7 +2650,6 @@ hb_font_set_variations (hb_font_t
       if (axes[axis_index].axisTag == tag)
 	design_coords[axis_index] = v;
   }
-  font->face->table.avar->map_coords (normalized, coords_length);
 
   hb_ot_var_normalize_coords (font->face, coords_length, design_coords, normalized);
   _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length);
@@ -2720,8 +2721,6 @@ hb_font_set_variation (hb_font_t *font,
     if (axes[axis_index].axisTag == tag)
       design_coords[axis_index] = value;
 
-  font->face->table.avar->map_coords (normalized, coords_length);
-
   hb_ot_var_normalize_coords (font->face, coords_length, design_coords, normalized);
   _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length);
 
@@ -3058,6 +3057,7 @@ hb_font_funcs_set_glyph_func (hb_font_fu
 #endif
 
 
+#ifndef HB_DISABLE_DEPRECATED
 void
 hb_font_funcs_set_glyph_shape_func (hb_font_funcs_t               *ffuncs,
                                    hb_font_get_glyph_shape_func_t  func,
@@ -3066,3 +3066,4 @@ hb_font_funcs_set_glyph_shape_func (hb_f
 {
   hb_font_funcs_set_draw_glyph_func (ffuncs, func, user_data, destroy);
 }
+#endif
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-font.h 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-font.h
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-font.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-font.h	2024-11-20 13:56:33.000000000 +0000
@@ -486,25 +486,6 @@ typedef hb_bool_t (*hb_font_get_glyph_fr
 							 void *user_data);
 
 /**
- * hb_font_get_glyph_shape_func_t:
- * @font: #hb_font_t to work upon
- * @font_data: @font user data pointer
- * @glyph: The glyph ID to query
- * @draw_funcs: The draw functions to send the shape data to
- * @draw_data: The data accompanying the draw functions
- * @user_data: User data pointer passed by the caller
- *
- * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
- *
- * Since: 4.0.0
- * Deprecated: 7.0.0: Use #hb_font_draw_glyph_func_t instead
- **/
-typedef void (*hb_font_get_glyph_shape_func_t) (hb_font_t *font, void *font_data,
-						hb_codepoint_t glyph,
-						hb_draw_funcs_t *draw_funcs, void *draw_data,
-						void *user_data);
-
-/**
  * hb_font_draw_glyph_func_t:
  * @font: #hb_font_t to work upon
  * @font_data: @font user data pointer
@@ -804,32 +785,13 @@ hb_font_funcs_set_glyph_from_name_func (
 					void *user_data, hb_destroy_func_t destroy);
 
 /**
- * hb_font_funcs_set_glyph_shape_func:
- * @ffuncs: A font-function structure
- * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
- * @user_data: Data to pass to @func
- * @destroy: (nullable): The function to call when @user_data is not needed anymore
- *
- * Sets the implementation function for #hb_font_get_glyph_shape_func_t,
- * which is the same as #hb_font_draw_glyph_func_t.
- *
- * Since: 4.0.0
- * Deprecated: 7.0.0: Use hb_font_funcs_set_draw_glyph_func() instead
- **/
-HB_EXTERN void
-hb_font_funcs_set_glyph_shape_func (hb_font_funcs_t *ffuncs,
-				    hb_font_get_glyph_shape_func_t func,
-				    void *user_data, hb_destroy_func_t destroy);
-
-/**
  * hb_font_funcs_set_draw_glyph_func:
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
  * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
- * Sets the implementation function for #hb_font_draw_glyph_func_t,
- * which is the same as #hb_font_get_glyph_shape_func_t.
+ * Sets the implementation function for #hb_font_draw_glyph_func_t.
  *
  * Since: 7.0.0
  **/
@@ -935,11 +897,6 @@ hb_font_get_glyph_from_name (hb_font_t *
 			     hb_codepoint_t *glyph);
 
 HB_EXTERN void
-hb_font_get_glyph_shape (hb_font_t *font,
-			 hb_codepoint_t glyph,
-			 hb_draw_funcs_t *dfuncs, void *draw_data);
-
-HB_EXTERN void
 hb_font_draw_glyph (hb_font_t *font,
                     hb_codepoint_t glyph,
                     hb_draw_funcs_t *dfuncs, void *draw_data);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-font.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-font.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-font.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-font.hh	2024-11-20 13:56:33.000000000 +0000
@@ -651,7 +651,7 @@ struct hb_font_t
   {
     if (get_glyph_name (glyph, s, size)) return;
 
-    if (size && snprintf (s, size, "gid%u", glyph) < 0)
+    if (size && snprintf (s, size, "gid%" PRIu32, glyph) < 0)
       *s = '\0';
   }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ft-colr.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ft-colr.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ft-colr.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ft-colr.hh	2024-11-20 13:56:33.000000000 +0000
@@ -105,6 +105,8 @@ struct hb_ft_paint_context_t
   FT_Color *palette;
   unsigned palette_index;
   hb_color_t foreground;
+  hb_map_t current_glyphs;
+  hb_map_t current_layers;
   int depth_left = HB_MAX_NESTING_LEVEL;
   int edge_count = HB_COLRV1_MAX_EDGE_COUNT;
 };
@@ -220,9 +222,18 @@ _hb_ft_paint (hb_ft_paint_context_t *c,
 				  &paint.u.colr_layers.layer_iterator,
 				  &other_paint))
       {
+        unsigned i = paint.u.colr_layers.layer_iterator.layer;
+
+	if (unlikely (c->current_layers.has (i)))
+	  continue;
+
+	c->current_layers.add (i);
+
 	c->funcs->push_group (c->data);
 	c->recurse (other_paint);
 	c->funcs->pop_group (c->data, HB_PAINT_COMPOSITE_MODE_SRC_OVER);
+
+	c->current_layers.del (i);
       }
     }
     break;
@@ -320,8 +331,27 @@ _hb_ft_paint (hb_ft_paint_context_t *c,
     break;
     case FT_COLR_PAINTFORMAT_COLR_GLYPH:
     {
+      hb_codepoint_t gid = paint.u.colr_glyph.glyphID;
+
+      if (unlikely (c->current_glyphs.has (gid)))
+	return;
+
+      c->current_glyphs.add (gid);
+
+      c->funcs->push_inverse_root_transform (c->data, c->font);
+      c->ft_font->lock.unlock ();
+      if (c->funcs->color_glyph (c->data, gid, c->font))
+      {
+	c->ft_font->lock.lock ();
+	c->funcs->pop_transform (c->data);
+	c->current_glyphs.del (gid);
+	return;
+      }
+      c->ft_font->lock.lock ();
+      c->funcs->pop_transform (c->data);
+
       FT_OpaquePaint other_paint = {0};
-      if (FT_Get_Color_Glyph_Paint (ft_face, paint.u.colr_glyph.glyphID,
+      if (FT_Get_Color_Glyph_Paint (ft_face, gid,
 				    FT_COLOR_NO_ROOT_TRANSFORM,
 				    &other_paint))
       {
@@ -350,6 +380,8 @@ _hb_ft_paint (hb_ft_paint_context_t *c,
 
         if (has_clip_box)
           c->funcs->pop_clip (c->data);
+
+	c->current_glyphs.del (gid);
       }
     }
     break;
@@ -474,6 +506,7 @@ hb_ft_paint_glyph_colr (hb_font_t *font,
     hb_ft_paint_context_t c (ft_font, font,
 			     paint_funcs, paint_data,
 			     palette, palette_index, foreground);
+    c.current_glyphs.add (gid);
 
     bool is_bounded = true;
     FT_ClipBox clip_box;
@@ -497,6 +530,7 @@ hb_ft_paint_glyph_colr (hb_font_t *font,
       hb_ft_paint_context_t ce (ft_font, font,
 			        extents_funcs, &extents_data,
 			        palette, palette_index, foreground);
+      ce.current_glyphs.add (gid);
       ce.funcs->push_root_transform (ce.data, font);
       ce.recurse (paint);
       ce.funcs->pop_transform (ce.data);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ft.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ft.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ft.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ft.cc	2024-11-20 13:56:33.000000000 +0000
@@ -114,7 +114,7 @@ _hb_ft_font_create (FT_Face ft_face, boo
   ft_font->load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING;
 
   ft_font->cached_serial = (unsigned) -1;
-  ft_font->advance_cache.init ();
+  new (&ft_font->advance_cache) hb_ft_advance_cache_t;
 
   return ft_font;
 }
@@ -224,8 +224,8 @@ _hb_ft_hb_font_check_changed (hb_font_t
  *
  * Sets the FT_Load_Glyph load flags for the specified #hb_font_t.
  *
- * For more information, see 
- * https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#ft_load_xxx
+ * For more information, see
+ * <https://freetype.org/freetype2/docs/reference/ft2-glyph_retrieval.html#ft_load_xxx>
  *
  * This function works with #hb_font_t objects created by
  * hb_ft_font_create() or hb_ft_font_create_referenced().
@@ -252,8 +252,8 @@ hb_ft_font_set_load_flags (hb_font_t *fo
  *
  * Fetches the FT_Load_Glyph load flags of the specified #hb_font_t.
  *
- * For more information, see 
- * https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#ft_load_xxx
+ * For more information, see
+ * <https://freetype.org/freetype2/docs/reference/ft2-glyph_retrieval.html#ft_load_xxx>
  *
  * This function works with #hb_font_t objects created by
  * hb_ft_font_create() or hb_ft_font_create_referenced().
@@ -1118,10 +1118,10 @@ _hb_ft_reference_table (hb_face_t *face
  * This variant of the function does not provide any life-cycle management.
  *
  * Most client programs should use hb_ft_face_create_referenced()
- * (or, perhaps, hb_ft_face_create_cached()) instead. 
+ * (or, perhaps, hb_ft_face_create_cached()) instead.
  *
  * If you know you have valid reasons not to use hb_ft_face_create_referenced(),
- * then it is the client program's responsibility to destroy @ft_face 
+ * then it is the client program's responsibility to destroy @ft_face
  * after the #hb_face_t face object has been destroyed.
  *
  * Return value: (transfer full): the new #hb_face_t face object
@@ -1215,7 +1215,7 @@ hb_ft_face_finalize (void *arg)
 hb_face_t *
 hb_ft_face_create_cached (FT_Face ft_face)
 {
-  if (unlikely (!ft_face->generic.data || ft_face->generic.finalizer != (FT_Generic_Finalizer) hb_ft_face_finalize))
+  if (unlikely (!ft_face->generic.data || ft_face->generic.finalizer != hb_ft_face_finalize))
   {
     if (ft_face->generic.finalizer)
       ft_face->generic.finalizer (ft_face);
@@ -1241,13 +1241,13 @@ hb_ft_face_create_cached (FT_Face ft_fac
  * This variant of the function does not provide any life-cycle management.
  *
  * Most client programs should use hb_ft_font_create_referenced()
- * instead. 
+ * instead.
  *
  * If you know you have valid reasons not to use hb_ft_font_create_referenced(),
- * then it is the client program's responsibility to destroy @ft_face 
+ * then it is the client program's responsibility to destroy @ft_face
  * after the #hb_font_t font object has been destroyed.
  *
- * HarfBuzz will use the @destroy callback on the #hb_font_t font object 
+ * HarfBuzz will use the @destroy callback on the #hb_font_t font object
  * if it is supplied when you use this function. However, even if @destroy
  * is provided, it is the client program's responsibility to destroy @ft_face,
  * and it is the client program's responsibility to ensure that @ft_face is
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.cc	2024-11-20 13:56:33.000000000 +0000
@@ -29,7 +29,7 @@
 #ifdef HAVE_GOBJECT
 
 
-/**
+/*
  * SECTION:hb-gobject
  * @title: hb-gobject
  * @short_description: GObject integration support
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-graphite2.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-graphite2.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-graphite2.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-graphite2.cc	2024-11-20 13:56:33.000000000 +0000
@@ -248,6 +248,21 @@ _hb_graphite2_shape (hb_shape_plan_t
       gr_fref_set_feature_value (fref, features[i].value, feats);
   }
 
+  hb_direction_t direction = buffer->props.direction;
+  hb_direction_t horiz_dir = hb_script_get_horizontal_direction (buffer->props.script);
+  /* TODO vertical:
+   * The only BTT vertical script is Ogham, but it's not clear to me whether OpenType
+   * Ogham fonts are supposed to be implemented BTT or not.  Need to research that
+   * first. */
+  if ((HB_DIRECTION_IS_HORIZONTAL (direction) &&
+       direction != horiz_dir && horiz_dir != HB_DIRECTION_INVALID) ||
+      (HB_DIRECTION_IS_VERTICAL   (direction) &&
+       direction != HB_DIRECTION_TTB))
+  {
+    hb_buffer_reverse_clusters (buffer);
+    direction = HB_DIRECTION_REVERSE (direction);
+  }
+
   gr_segment *seg = nullptr;
   const gr_slot *is;
   unsigned int ci = 0, ic = 0;
@@ -261,21 +276,11 @@ _hb_graphite2_shape (hb_shape_plan_t
   for (unsigned int i = 0; i < buffer->len; ++i)
     chars[i] = buffer->info[i].codepoint;
 
-  /* TODO ensure_native_direction. */
-
-  hb_tag_t script_tag[HB_OT_MAX_TAGS_PER_SCRIPT];
-  unsigned int count = HB_OT_MAX_TAGS_PER_SCRIPT;
-  hb_ot_tags_from_script_and_language (hb_buffer_get_script (buffer),
-				       HB_LANGUAGE_INVALID,
-				       &count,
-				       script_tag,
-				       nullptr, nullptr);
-
   seg = gr_make_seg (nullptr, grface,
-		     count ? script_tag[count - 1] : HB_OT_TAG_DEFAULT_SCRIPT,
+		     HB_TAG_NONE, // https://github.com/harfbuzz/harfbuzz/issues/3439#issuecomment-1442650148
 		     feats,
 		     gr_utf32, chars, buffer->len,
-		     2 | (hb_buffer_get_direction (buffer) == HB_DIRECTION_RTL ? 1 : 0));
+		     2 | (direction == HB_DIRECTION_RTL ? 1 : 0));
 
   if (unlikely (!seg)) {
     if (feats) gr_featureval_destroy (feats);
@@ -327,7 +332,7 @@ _hb_graphite2_shape (hb_shape_plan_t
   float yscale = (float) font->y_scale / upem;
   yscale *= yscale / xscale;
   unsigned int curradv = 0;
-  if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
+  if (HB_DIRECTION_IS_BACKWARD (direction))
   {
     curradv = gr_slot_origin_X(gr_seg_first_slot(seg)) * xscale;
     clusters[0].advance = gr_seg_advance_X(seg) * xscale - curradv;
@@ -356,16 +361,17 @@ _hb_graphite2_shape (hb_shape_plan_t
       c->num_chars = before - c->base_char;
       c->base_glyph = ic;
       c->num_glyphs = 0;
-      if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
+      if (HB_DIRECTION_IS_BACKWARD (direction))
       {
 	c->advance = curradv - gr_slot_origin_X(is) * xscale;
 	curradv -= c->advance;
       }
       else
       {
+	auto origin_X = gr_slot_origin_X (is) * xscale;
 	c->advance = 0;
-	clusters[ci].advance += gr_slot_origin_X(is) * xscale - curradv;
-	curradv += clusters[ci].advance;
+	clusters[ci].advance += origin_X - curradv;
+	curradv = origin_X;
       }
       ci++;
     }
@@ -375,7 +381,7 @@ _hb_graphite2_shape (hb_shape_plan_t
 	clusters[ci].num_chars = after + 1 - clusters[ci].base_char;
   }
 
-  if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
+  if (HB_DIRECTION_IS_BACKWARD (direction))
     clusters[ci].advance += curradv;
   else
     clusters[ci].advance += gr_seg_advance_X(seg) * xscale - curradv;
@@ -397,7 +403,7 @@ _hb_graphite2_shape (hb_shape_plan_t
   unsigned int currclus = UINT_MAX;
   const hb_glyph_info_t *info = buffer->info;
   hb_glyph_position_t *pPos = hb_buffer_get_glyph_positions (buffer, nullptr);
-  if (!HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
+  if (!HB_DIRECTION_IS_BACKWARD (direction))
   {
     curradvx = 0;
     for (is = gr_seg_first_slot (seg); is; pPos++, ++info, is = gr_slot_next_in_segment (is))
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-icu.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-icu.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-icu.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-icu.cc	2024-11-20 13:56:33.000000000 +0000
@@ -93,15 +93,16 @@ hb_icu_script_to_script (UScriptCode scr
 UScriptCode
 hb_icu_script_from_script (hb_script_t script)
 {
+  UScriptCode out = USCRIPT_INVALID_CODE;
+
   if (unlikely (script == HB_SCRIPT_INVALID))
-    return USCRIPT_INVALID_CODE;
+    return out;
 
-  unsigned int numScriptCode = 1 + u_getIntPropertyMaxValue (UCHAR_SCRIPT);
-  for (unsigned int i = 0; i < numScriptCode; i++)
-    if (unlikely (hb_icu_script_to_script ((UScriptCode) i) == script))
-      return (UScriptCode) i;
+  UErrorCode icu_err = U_ZERO_ERROR;
+  const unsigned char buf[5] = {HB_UNTAG (script), 0};
+  uscript_getCode ((const char *) buf, &out, 1, &icu_err);
 
-  return USCRIPT_UNKNOWN;
+  return out;
 }
 
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-iter.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-iter.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-iter.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-iter.hh	2024-11-20 13:56:33.000000000 +0000
@@ -63,6 +63,7 @@ struct hb_iter_t
   static constexpr bool is_iterator = true;
   static constexpr bool is_random_access_iterator = false;
   static constexpr bool is_sorted_iterator = false;
+  static constexpr bool has_fast_len = false; // Should be checked in combination with is_random_access_iterator.
 
   private:
   /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
@@ -393,7 +394,7 @@ struct hb_map_iter_t :
 
   private:
   Iter it;
-  hb_reference_wrapper<Proj> f;
+  mutable hb_reference_wrapper<Proj> f;
 };
 
 template <typename Proj, hb_function_sortedness_t Sorted>
@@ -456,8 +457,8 @@ struct hb_filter_iter_t :
 
   private:
   Iter it;
-  hb_reference_wrapper<Pred> p;
-  hb_reference_wrapper<Proj> f;
+  mutable hb_reference_wrapper<Pred> p;
+  mutable hb_reference_wrapper<Proj> f;
 };
 template <typename Pred, typename Proj>
 struct hb_filter_iter_factory_t
@@ -841,7 +842,7 @@ struct
   template <typename Iterable,
 	    hb_requires (hb_is_iterable (Iterable))>
   auto operator () (Iterable&& it, unsigned count) const HB_AUTO_RETURN
-  ( hb_zip (hb_range (count), it) | hb_map (hb_second) )
+  ( hb_zip (hb_range (count), it) | hb_map_retains_sorting (hb_second) )
 
   /* Specialization arrays. */
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-kern.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-kern.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-kern.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-kern.hh	2024-11-20 13:56:33.000000000 +0000
@@ -53,7 +53,7 @@ struct hb_kern_machine_t
       return;
 
     buffer->unsafe_to_concat ();
-    OT::hb_ot_apply_context_t c (1, font, buffer);
+    OT::hb_ot_apply_context_t c (1, font, buffer, hb_blob_get_empty ());
     c.set_lookup_mask (kern_mask);
     c.set_lookup_props (OT::LookupFlag::IgnoreMarks);
     auto &skippy_iter = c.iter_input;
@@ -70,7 +70,7 @@ struct hb_kern_machine_t
 	continue;
       }
 
-      skippy_iter.reset (idx, 1);
+      skippy_iter.reset (idx);
       unsigned unsafe_to;
       if (!skippy_iter.next (&unsafe_to))
       {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-limits.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-limits.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-limits.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-limits.hh	2024-11-20 13:56:33.000000000 +0000
@@ -89,6 +89,10 @@
 #endif
 
 
+#ifndef HB_GLYF_VAR_COMPOSITE_MAX_AXES
+#define HB_GLYF_VAR_COMPOSITE_MAX_AXES 4096
+#endif
+
 #ifndef HB_GLYF_MAX_POINTS
 #define HB_GLYF_MAX_POINTS 20000
 #endif
@@ -102,7 +106,7 @@
 #endif
 
 #ifndef HB_COLRV1_MAX_EDGE_COUNT
-#define HB_COLRV1_MAX_EDGE_COUNT 1024
+#define HB_COLRV1_MAX_EDGE_COUNT 2048
 #endif
 
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-machinery.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-machinery.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-machinery.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-machinery.hh	2024-11-20 13:56:33.000000000 +0000
@@ -180,6 +180,9 @@ struct hb_lazy_loader_t : hb_data_wrappe
 				 hb_lazy_loader_t<Returned,Subclass,Data,WheresData,Stored>
 				>::value Funcs;
 
+  hb_lazy_loader_t () = default;
+  hb_lazy_loader_t (const hb_lazy_loader_t &other) = delete;
+
   void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
   void init ()  { instance.set_relaxed (nullptr); }
   void fini ()  { do_destroy (instance.get_acquire ()); init (); }
@@ -278,7 +281,11 @@ struct hb_lazy_loader_t : hb_data_wrappe
 template <typename T, unsigned int WheresFace>
 struct hb_face_lazy_loader_t : hb_lazy_loader_t<T,
 						hb_face_lazy_loader_t<T, WheresFace>,
-						hb_face_t, WheresFace> {};
+						hb_face_t, WheresFace>
+{
+  // Hack; have them here for API parity with hb_table_lazy_loader_t
+  hb_blob_t *get_blob () { return this->get ()->get_blob (); }
+};
 
 template <typename T, unsigned int WheresFace, bool core=false>
 struct hb_table_lazy_loader_t : hb_lazy_loader_t<T,
@@ -288,7 +295,7 @@ struct hb_table_lazy_loader_t : hb_lazy_
 {
   static hb_blob_t *create (hb_face_t *face)
   {
-    auto c = hb_sanitize_context_t ();
+    hb_sanitize_context_t c;
     if (core)
       c.set_num_glyphs (0); // So we don't recurse ad infinitum, or doesn't need num_glyphs
     return c.reference_table<T> (face);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-map.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-map.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-map.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-map.cc	2024-11-20 13:56:33.000000000 +0000
@@ -365,7 +365,7 @@ hb_map_update (hb_map_t *map,
  * @key: (out): Key retrieved
  * @value: (out): Value retrieved
  *
- * Fetches the next key/value paire in @map.
+ * Fetches the next key/value pair in @map.
  *
  * Set @idx to -1 to get started.
  *
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-map.h 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-map.h
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-map.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-map.h	2024-11-20 13:56:33.000000000 +0000
@@ -44,7 +44,7 @@ HB_BEGIN_DECLS
  *
  * Since: 1.7.7
  */
-#define HB_MAP_VALUE_INVALID ((hb_codepoint_t) -1)
+#define HB_MAP_VALUE_INVALID HB_CODEPOINT_INVALID
 
 /**
  * hb_map_t:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-map.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-map.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-map.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-map.hh	2024-11-20 13:56:33.000000000 +0000
@@ -42,13 +42,37 @@ template <typename K, typename V,
 	  bool minus_one = false>
 struct hb_hashmap_t
 {
+  static constexpr bool realloc_move = true;
+
   hb_hashmap_t ()  { init (); }
   ~hb_hashmap_t () { fini (); }
 
-  hb_hashmap_t (const hb_hashmap_t& o) : hb_hashmap_t () { resize (o.population); hb_copy (o, *this); }
-  hb_hashmap_t (hb_hashmap_t&& o) : hb_hashmap_t () { hb_swap (*this, o); }
-  hb_hashmap_t& operator= (const hb_hashmap_t& o)  { reset (); resize (o.population); hb_copy (o, *this); return *this; }
-  hb_hashmap_t& operator= (hb_hashmap_t&& o)  { hb_swap (*this, o); return *this; }
+  hb_hashmap_t (const hb_hashmap_t& o) : hb_hashmap_t ()
+  {
+    if (unlikely (!o.mask)) return;
+
+    if (item_t::is_trivial)
+    {
+      items = (item_t *) hb_malloc (sizeof (item_t) * (o.mask + 1));
+      if (unlikely (!items))
+      {
+	successful = false;
+	return;
+      }
+      population = o.population;
+      occupancy = o.occupancy;
+      mask = o.mask;
+      prime = o.prime;
+      max_chain_length = o.max_chain_length;
+      memcpy (items, o.items, sizeof (item_t) * (mask + 1));
+      return;
+    }
+
+    alloc (o.population); hb_copy (o, *this);
+  }
+  hb_hashmap_t (hb_hashmap_t&& o)  noexcept : hb_hashmap_t () { hb_swap (*this, o); }
+  hb_hashmap_t& operator= (const hb_hashmap_t& o)  { reset (); alloc (o.population); hb_copy (o, *this); return *this; }
+  hb_hashmap_t& operator= (hb_hashmap_t&& o)   noexcept { hb_swap (*this, o); return *this; }
 
   hb_hashmap_t (std::initializer_list<hb_pair_t<K, V>> lst) : hb_hashmap_t ()
   {
@@ -60,29 +84,32 @@ struct hb_hashmap_t
   hb_hashmap_t (const Iterable &o) : hb_hashmap_t ()
   {
     auto iter = hb_iter (o);
-    if (iter.is_random_access_iterator)
-      resize (hb_len (iter));
+    if (iter.is_random_access_iterator || iter.has_fast_len)
+      alloc (hb_len (iter));
     hb_copy (iter, *this);
   }
 
   struct item_t
   {
     K key;
-    uint32_t hash : 30;
+    uint32_t is_real_ : 1;
     uint32_t is_used_ : 1;
-    uint32_t is_tombstone_ : 1;
+    uint32_t hash : 30;
     V value;
 
     item_t () : key (),
+		is_real_ (false), is_used_ (false),
 		hash (0),
-		is_used_ (false), is_tombstone_ (false),
 		value () {}
 
+    // Needed for https://github.com/harfbuzz/harfbuzz/issues/4138
+    K& get_key () { return key; }
+    V& get_value () { return value; }
+
     bool is_used () const { return is_used_; }
     void set_used (bool is_used) { is_used_ = is_used; }
-    bool is_tombstone () const { return is_tombstone_; }
-    void set_tombstone (bool is_tombstone) { is_tombstone_ = is_tombstone; }
-    bool is_real () const { return is_used_ && !is_tombstone_; }
+    void set_real (bool is_real) { is_real_ = is_real; }
+    bool is_real () const { return is_real_; }
 
     template <bool v = minus_one,
 	      hb_enable_if (v == false)>
@@ -98,28 +125,32 @@ struct hb_hashmap_t
     bool operator == (const K &o) const { return hb_deref (key) == hb_deref (o); }
     bool operator == (const item_t &o) const { return *this == o.key; }
     hb_pair_t<K, V> get_pair() const { return hb_pair_t<K, V> (key, value); }
-    hb_pair_t<const K &, const V &> get_pair_ref() const { return hb_pair_t<const K &, const V &> (key, value); }
+    hb_pair_t<const K &, V &> get_pair_ref() { return hb_pair_t<const K &, V &> (key, value); }
 
     uint32_t total_hash () const
-    { return (hash * 31) + hb_hash (value); }
+    { return (hash * 31u) + hb_hash (value); }
+
+    static constexpr bool is_trivial = hb_is_trivially_constructible(K) &&
+				       hb_is_trivially_destructible(K) &&
+				       hb_is_trivially_constructible(V) &&
+				       hb_is_trivially_destructible(V);
   };
 
   hb_object_header_t header;
-  unsigned int successful : 1; /* Allocations successful */
-  unsigned int population : 31; /* Not including tombstones. */
+  bool successful; /* Allocations successful */
+  unsigned short max_chain_length;
+  unsigned int population; /* Not including tombstones. */
   unsigned int occupancy; /* Including tombstones. */
   unsigned int mask;
   unsigned int prime;
   item_t *items;
 
-  friend void swap (hb_hashmap_t& a, hb_hashmap_t& b)
+  friend void swap (hb_hashmap_t& a, hb_hashmap_t& b) noexcept
   {
     if (unlikely (!a.successful || !b.successful))
       return;
-    unsigned tmp = a.population;
-    a.population = b.population;
-    b.population = tmp;
-    //hb_swap (a.population, b.population);
+    hb_swap (a.max_chain_length, b.max_chain_length);
+    hb_swap (a.population, b.population);
     hb_swap (a.occupancy, b.occupancy);
     hb_swap (a.mask, b.mask);
     hb_swap (a.prime, b.prime);
@@ -130,6 +161,7 @@ struct hb_hashmap_t
     hb_object_init (this);
 
     successful = true;
+    max_chain_length = 0;
     population = occupancy = 0;
     mask = 0;
     prime = 0;
@@ -139,10 +171,12 @@ struct hb_hashmap_t
   {
     hb_object_fini (this);
 
-    if (likely (items)) {
+    if (likely (items))
+    {
       unsigned size = mask + 1;
-      for (unsigned i = 0; i < size; i++)
-        items[i].~item_t ();
+      if (!item_t::is_trivial)
+	for (unsigned i = 0; i < size; i++)
+	  items[i].~item_t ();
       hb_free (items);
       items = nullptr;
     }
@@ -157,7 +191,7 @@ struct hb_hashmap_t
 
   bool in_error () const { return !successful; }
 
-  bool resize (unsigned new_population = 0)
+  bool alloc (unsigned new_population = 0)
   {
     if (unlikely (!successful)) return false;
 
@@ -171,8 +205,11 @@ struct hb_hashmap_t
       successful = false;
       return false;
     }
-    for (auto &_ : hb_iter (new_items, new_size))
-      new (&_) item_t ();
+    if (!item_t::is_trivial)
+      for (auto &_ : hb_iter (new_items, new_size))
+	new (&_) item_t ();
+    else
+      hb_memset (new_items, 0, (size_t) new_size * sizeof (item_t));
 
     unsigned int old_size = size ();
     item_t *old_items = items;
@@ -181,6 +218,7 @@ struct hb_hashmap_t
     population = occupancy = 0;
     mask = new_size - 1;
     prime = prime_for (power);
+    max_chain_length = power * 2;
     items = new_items;
 
     /* Insert back old items. */
@@ -192,8 +230,10 @@ struct hb_hashmap_t
 		       old_items[i].hash,
 		       std::move (old_items[i].value));
       }
-      old_items[i].~item_t ();
     }
+    if (!item_t::is_trivial)
+      for (unsigned int i = 0; i < old_size; i++)
+	old_items[i].~item_t ();
 
     hb_free (old_items);
 
@@ -201,72 +241,129 @@ struct hb_hashmap_t
   }
 
   template <typename KK, typename VV>
-  bool set_with_hash (KK&& key, uint32_t hash, VV&& value, bool is_delete=false)
+  bool set_with_hash (KK&& key, uint32_t hash, VV&& value, bool overwrite = true)
   {
     if (unlikely (!successful)) return false;
-    if (unlikely ((occupancy + occupancy / 2) >= mask && !resize ())) return false;
-    item_t &item = item_for_hash (key, hash);
+    if (unlikely ((occupancy + occupancy / 2) >= mask && !alloc ())) return false;
+
+    hash &= 0x3FFFFFFF; // We only store lower 30bit of hash
+    unsigned int tombstone = (unsigned int) -1;
+    unsigned int i = hash % prime;
+    unsigned length = 0;
+    unsigned step = 0;
+    while (items[i].is_used ())
+    {
+      if ((std::is_integral<K>::value || items[i].hash == hash) &&
+	  items[i] == key)
+      {
+        if (!overwrite)
+	  return false;
+        else
+	  break;
+      }
+      if (!items[i].is_real () && tombstone == (unsigned) -1)
+        tombstone = i;
+      i = (i + ++step) & mask;
+      length++;
+    }
 
-    if (is_delete && !(item == key))
-      return true; /* Trying to delete non-existent key. */
+    item_t &item = items[tombstone == (unsigned) -1 ? i : tombstone];
 
     if (item.is_used ())
     {
       occupancy--;
-      if (!item.is_tombstone ())
-	population--;
+      population -= item.is_real ();
     }
 
     item.key = std::forward<KK> (key);
     item.value = std::forward<VV> (value);
     item.hash = hash;
     item.set_used (true);
-    item.set_tombstone (is_delete);
+    item.set_real (true);
 
     occupancy++;
-    if (!is_delete)
-      population++;
+    population++;
+
+    if (unlikely (length > max_chain_length) && occupancy * 8 > mask)
+      alloc (mask - 8); // This ensures we jump to next larger size
 
     return true;
   }
 
   template <typename VV>
-  bool set (const K &key, VV&& value) { return set_with_hash (key, hb_hash (key), std::forward<VV> (value)); }
+  bool set (const K &key, VV&& value, bool overwrite = true) { return set_with_hash (key, hb_hash (key), std::forward<VV> (value), overwrite); }
   template <typename VV>
-  bool set (K &&key, VV&& value) { return set_with_hash (std::move (key), hb_hash (key), std::forward<VV> (value)); }
+  bool set (K &&key, VV&& value, bool overwrite = true)
+  {
+    uint32_t hash = hb_hash (key);
+    return set_with_hash (std::move (key), hash, std::forward<VV> (value), overwrite);
+  }
+  bool add (const K &key)
+  {
+    uint32_t hash = hb_hash (key);
+    return set_with_hash (key, hash, item_t::default_value ());
+  }
 
   const V& get_with_hash (const K &key, uint32_t hash) const
   {
-    if (unlikely (!items)) return item_t::default_value ();
-    auto &item = item_for_hash (key, hash);
-    return item.is_real () && item == key ? item.value : item_t::default_value ();
+    if (!items) return item_t::default_value ();
+    auto *item = fetch_item (key, hb_hash (key));
+    if (item)
+      return item->value;
+    return item_t::default_value ();
   }
   const V& get (const K &key) const
   {
-    if (unlikely (!items)) return item_t::default_value ();
+    if (!items) return item_t::default_value ();
     return get_with_hash (key, hb_hash (key));
   }
 
-  void del (const K &key) { set_with_hash (key, hb_hash (key), item_t::default_value (), true); }
+  void del (const K &key)
+  {
+    if (!items) return;
+    auto *item = fetch_item (key, hb_hash (key));
+    if (item)
+    {
+      item->set_real (false);
+      population--;
+    }
+  }
 
   /* Has interface. */
   const V& operator [] (K k) const { return get (k); }
   template <typename VV=V>
-  bool has (K key, VV **vp = nullptr) const
+  bool has (const K &key, VV **vp = nullptr) const
   {
-    if (unlikely (!items))
-      return false;
-    auto &item = item_for_hash (key, hb_hash (key));
-    if (item.is_real () && item == key)
+    if (!items) return false;
+    auto *item = fetch_item (key, hb_hash (key));
+    if (item)
     {
-      if (vp) *vp = std::addressof (item.value);
+      if (vp) *vp = std::addressof (item->value);
       return true;
     }
-    else
-      return false;
+    return false;
+  }
+  item_t *fetch_item (const K &key, uint32_t hash) const
+  {
+    hash &= 0x3FFFFFFF; // We only store lower 30bit of hash
+    unsigned int i = hash % prime;
+    unsigned step = 0;
+    while (items[i].is_used ())
+    {
+      if ((std::is_integral<K>::value || items[i].hash == hash) &&
+	  items[i] == key)
+      {
+	if (items[i].is_real ())
+	  return &items[i];
+	else
+	  return nullptr;
+      }
+      i = (i + ++step) & mask;
+    }
+    return nullptr;
   }
   /* Projection. */
-  V operator () (K k) const { return get (k); }
+  const V& operator () (K k) const { return get (k); }
 
   unsigned size () const { return mask ? mask + 1 : 0; }
 
@@ -323,39 +420,37 @@ struct hb_hashmap_t
 
   auto iter_items () const HB_AUTO_RETURN
   (
-    + hb_iter (items, size ())
+    + hb_iter (items, this->size ())
     | hb_filter (&item_t::is_real)
   )
   auto iter_ref () const HB_AUTO_RETURN
   (
-    + iter_items ()
+    + this->iter_items ()
     | hb_map (&item_t::get_pair_ref)
   )
   auto iter () const HB_AUTO_RETURN
   (
-    + iter_items ()
+    + this->iter_items ()
     | hb_map (&item_t::get_pair)
   )
   auto keys_ref () const HB_AUTO_RETURN
   (
-    + iter_items ()
-    | hb_map (&item_t::key)
+    + this->iter_items ()
+    | hb_map (&item_t::get_key)
   )
   auto keys () const HB_AUTO_RETURN
   (
-    + iter_items ()
-    | hb_map (&item_t::key)
+    + this->keys_ref ()
     | hb_map (hb_ridentity)
   )
   auto values_ref () const HB_AUTO_RETURN
   (
-    + iter_items ()
-    | hb_map (&item_t::value)
+    + this->iter_items ()
+    | hb_map (&item_t::get_value)
   )
   auto values () const HB_AUTO_RETURN
   (
-    + iter_items ()
-    | hb_map (&item_t::value)
+    + this->values_ref ()
     | hb_map (hb_ridentity)
   )
 
@@ -393,23 +488,6 @@ struct hb_hashmap_t
   hb_hashmap_t& operator << (const hb_pair_t<K&&, V&&>& v)
   { set (std::move (v.first), std::move (v.second)); return *this; }
 
-  item_t& item_for_hash (const K &key, uint32_t hash) const
-  {
-    hash &= 0x3FFFFFFF; // We only store lower 30bit of hash
-    unsigned int i = hash % prime;
-    unsigned int step = 0;
-    unsigned int tombstone = (unsigned) -1;
-    while (items[i].is_used ())
-    {
-      if (items[i].hash == hash && items[i] == key)
-	return items[i];
-      if (tombstone == (unsigned) -1 && items[i].is_tombstone ())
-	tombstone = i;
-      i = (i + ++step) & mask;
-    }
-    return items[tombstone == (unsigned) -1 ? i : tombstone];
-  }
-
   static unsigned int prime_for (unsigned int shift)
   {
     /* Following comment and table copied from glib. */
@@ -477,10 +555,10 @@ struct hb_map_t : hb_hashmap_t<hb_codepo
   ~hb_map_t () = default;
   hb_map_t () : hashmap () {}
   hb_map_t (const hb_map_t &o) : hashmap ((hashmap &) o) {}
-  hb_map_t (hb_map_t &&o) : hashmap (std::move ((hashmap &) o)) {}
+  hb_map_t (hb_map_t &&o)  noexcept : hashmap (std::move ((hashmap &) o)) {}
   hb_map_t& operator= (const hb_map_t&) = default;
   hb_map_t& operator= (hb_map_t&&) = default;
-  hb_map_t (std::initializer_list<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> lst) : hashmap (lst) {}
+  hb_map_t (std::initializer_list<hb_codepoint_pair_t> lst) : hashmap (lst) {}
   template <typename Iterable,
 	    hb_requires (hb_is_iterable (Iterable))>
   hb_map_t (const Iterable &o) : hashmap (o) {}
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-meta.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-meta.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-meta.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-meta.hh	2024-11-20 13:56:33.000000000 +0000
@@ -153,8 +153,8 @@ struct hb_reference_wrapper
   hb_reference_wrapper (T v) : v (v) {}
   bool operator == (const hb_reference_wrapper& o) const { return v == o.v; }
   bool operator != (const hb_reference_wrapper& o) const { return v != o.v; }
-  operator T () const { return v; }
-  T get () const { return v; }
+  operator T& () { return v; }
+  T& get () { return v; }
   T v;
 };
 template <typename T>
@@ -163,8 +163,8 @@ struct hb_reference_wrapper<T&>
   hb_reference_wrapper (T& v) : v (std::addressof (v)) {}
   bool operator == (const hb_reference_wrapper& o) const { return v == o.v; }
   bool operator != (const hb_reference_wrapper& o) const { return v != o.v; }
-  operator T& () const { return *v; }
-  T& get () const { return *v; }
+  operator T& () { return *v; }
+  T& get () { return *v; }
   T* v;
 };
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-multimap.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-multimap.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-multimap.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-multimap.hh	2024-11-20 13:56:33.000000000 +0000
@@ -38,10 +38,10 @@ struct hb_multimap_t
 {
   void add (hb_codepoint_t k, hb_codepoint_t v)
   {
-    hb_codepoint_t *i;
-    if (multiples_indices.has (k, &i))
+    hb_vector_t<hb_codepoint_t> *m;
+    if (multiples.has (k, &m))
     {
-      multiples_values[*i].push (v);
+      m->push (v);
       return;
     }
 
@@ -51,12 +51,7 @@ struct hb_multimap_t
       hb_codepoint_t old = *old_v;
       singulars.del (k);
 
-      multiples_indices.set (k, multiples_values.length);
-      auto *vec = multiples_values.push ();
-
-      vec->push (old);
-      vec->push (v);
-
+      multiples.set (k, hb_vector_t<hb_codepoint_t> {old, v});
       return;
     }
 
@@ -69,22 +64,31 @@ struct hb_multimap_t
     if (singulars.has (k, &v))
       return hb_array (v, 1);
 
-    hb_codepoint_t *i;
-    if (multiples_indices.has (k, &i))
-      return multiples_values[*i].as_array ();
+    hb_vector_t<hb_codepoint_t> *m;
+    if (multiples.has (k, &m))
+      return m->as_array ();
 
     return hb_array_t<const hb_codepoint_t> ();
   }
 
   bool in_error () const
   {
-    return singulars.in_error () || multiples_indices.in_error () || multiples_values.in_error ();
+    if (singulars.in_error () || multiples.in_error ())
+      return true;
+    for (const auto &m : multiples.values_ref ())
+      if (m.in_error ())
+        return true;
+    return false;
+  }
+
+  void alloc (unsigned size)
+  {
+    singulars.alloc (size);
   }
 
   protected:
   hb_map_t singulars;
-  hb_map_t multiples_indices;
-  hb_vector_t<hb_vector_t<hb_codepoint_t>> multiples_values;
+  hb_hashmap_t<hb_codepoint_t, hb_vector_t<hb_codepoint_t>> multiples;
 };
 
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-null.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-null.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-null.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-null.hh	2024-11-20 13:56:33.000000000 +0000
@@ -37,7 +37,7 @@
 
 /* Global nul-content Null pool.  Enlarge as necessary. */
 
-#define HB_NULL_POOL_SIZE 448
+#define HB_NULL_POOL_SIZE 640
 
 template <typename T, typename>
 struct _hb_has_min_size : hb_false_type {};
@@ -85,7 +85,7 @@ using hb_null_size = _hb_null_size<T, vo
 template <typename T, typename>
 struct _hb_static_size : hb_integral_constant<unsigned, sizeof (T)> {};
 template <typename T>
-struct _hb_static_size<T, hb_void_t<decltype (T::min_size)>> : hb_integral_constant<unsigned, T::static_size> {};
+struct _hb_static_size<T, hb_void_t<decltype (T::static_size)>> : hb_integral_constant<unsigned, T::static_size> {};
 template <typename T>
 using hb_static_size = _hb_static_size<T, void>;
 #define hb_static_size(T) hb_static_size<T>::value
@@ -176,7 +176,7 @@ template <typename Type>
 static inline Type& Crap () {
   static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
   Type *obj = reinterpret_cast<Type *> (_hb_CrapPool);
-  memcpy (obj, &Null (Type), sizeof (*obj));
+  memcpy (obj, std::addressof (Null (Type)), sizeof (*obj));
   return *obj;
 }
 template <typename QType>
@@ -211,11 +211,11 @@ struct hb_nonnull_ptr_t
   T * operator = (T *v_)   { return v = v_; }
   T * operator -> () const { return get (); }
   T & operator * () const  { return *get (); }
-  T ** operator & () const { return &v; }
+  T ** operator & () const { return std::addressof (v); }
   /* Only auto-cast to const types. */
   template <typename C> operator const C * () const { return get (); }
   operator const char * () const { return (const char *) get (); }
-  T * get () const { return v ? v : const_cast<T *> (&Null (T)); }
+  T * get () const { return v ? v : const_cast<T *> (std::addressof (Null (T))); }
   T * get_raw () const { return v; }
 
   private:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-number-parser.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-number-parser.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-number-parser.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-number-parser.hh	2024-11-20 13:56:33.000000000 +0000
@@ -31,7 +31,7 @@
 #include "hb.hh"
 
 
-#line 32 "hb-number-parser.hh"
+#line 35 "hb-number-parser.hh"
 static const unsigned char _double_parser_trans_keys[] = {
 	0u, 0u, 43u, 57u, 46u, 57u, 48u, 57u, 43u, 57u, 48u, 57u, 48u, 101u, 48u, 57u, 
 	46u, 101u, 0
@@ -135,12 +135,12 @@ strtod_rl (const char *p, const char **e
 
   int cs;
   
-#line 132 "hb-number-parser.hh"
+#line 139 "hb-number-parser.hh"
 	{
 	cs = double_parser_start;
 	}
 
-#line 135 "hb-number-parser.hh"
+#line 144 "hb-number-parser.hh"
 	{
 	int _slen;
 	int _trans;
@@ -198,7 +198,7 @@ _resume:
 	  exp_overflow = true;
 }
 	break;
-#line 187 "hb-number-parser.hh"
+#line 202 "hb-number-parser.hh"
 	}
 
 _again:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-object.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-object.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-object.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-object.hh	2024-11-20 13:56:33.000000000 +0000
@@ -325,7 +325,7 @@ retry:
   hb_user_data_array_t *user_data = obj->header.user_data.get_acquire ();
   if (unlikely (!user_data))
   {
-    user_data = (hb_user_data_array_t *) hb_calloc (sizeof (hb_user_data_array_t), 1);
+    user_data = (hb_user_data_array_t *) hb_calloc (1, sizeof (hb_user_data_array_t));
     if (unlikely (!user_data))
       return false;
     user_data->init ();
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-open-file.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-open-file.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-open-file.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-open-file.hh	2024-11-20 13:56:33.000000000 +0000
@@ -131,7 +131,7 @@ typedef struct OpenTypeOffsetTable
     sfnt_version = sfnt_tag;
     /* Take space for numTables, searchRange, entrySelector, RangeShift
      * and the TableRecords themselves.  */
-    unsigned num_items = it.len ();
+    unsigned num_items = hb_len (it);
     if (unlikely (!tables.serialize (c, num_items))) return_trace (false);
 
     const char *dir_end = (const char *) c->head;
@@ -145,7 +145,7 @@ typedef struct OpenTypeOffsetTable
       unsigned len = blob->length;
 
       /* Allocate room for the table and copy it. */
-      char *start = (char *) c->allocate_size<void> (len);
+      char *start = (char *) c->allocate_size<void> (len, false);
       if (unlikely (!start)) return false;
 
       TableRecord &rec = tables.arrayZ[i];
@@ -267,6 +267,7 @@ struct TTCHeader
   {
     TRACE_SANITIZE (this);
     if (unlikely (!u.header.version.sanitize (c))) return_trace (false);
+    hb_barrier ();
     switch (u.header.version.major) {
     case 2: /* version 2 is compatible with version 1 */
     case 1: return_trace (u.version1.sanitize (c));
@@ -302,6 +303,7 @@ struct ResourceRecord
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
 		  offset.sanitize (c, data_base) &&
+		  hb_barrier () &&
 		  get_face (data_base).sanitize (c));
   }
 
@@ -337,6 +339,7 @@ struct ResourceTypeRecord
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  resourcesZ.sanitize (c, type_base,
 				       get_resource_count (),
 				       data_base));
@@ -385,6 +388,7 @@ struct ResourceMap
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  typeList.sanitize (c, this,
 				     &(this+typeList),
 				     data_base));
@@ -428,6 +432,7 @@ struct ResourceForkHeader
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  data.sanitize (c, this, dataLen) &&
 		  map.sanitize (c, this, &(this+data)));
   }
@@ -508,6 +513,7 @@ struct OpenTypeFontFile
   {
     TRACE_SANITIZE (this);
     if (unlikely (!u.tag.sanitize (c))) return_trace (false);
+    hb_barrier ();
     switch (u.tag) {
     case CFFTag:	/* All the non-collection tags */
     case TrueTag:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-open-type.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-open-type.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-open-type.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-open-type.hh	2024-11-20 13:56:33.000000000 +0000
@@ -309,9 +309,11 @@ struct _hb_has_null<Type, true>
   static       Type *get_crap () { return &Crap (Type); }
 };
 
-template <typename Type, typename OffsetType, bool has_null=true>
+template <typename Type, typename OffsetType, typename BaseType=void, bool has_null=true>
 struct OffsetTo : Offset<OffsetType, has_null>
 {
+  using target_t = Type;
+
   // Make sure Type is not unbounded; works only for types that are fully defined at OffsetTo time.
   static_assert (has_null == false ||
 		 (hb_has_null_size (Type) || !hb_has_min_size (Type)), "");
@@ -333,22 +335,22 @@ struct OffsetTo : Offset<OffsetType, has
   }
 
   template <typename Base,
-	    hb_enable_if (hb_is_convertible (const Base, const void *))>
+	    hb_enable_if (hb_is_convertible (const Base, const BaseType *))>
   friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
   template <typename Base,
-	    hb_enable_if (hb_is_convertible (const Base, const void *))>
+	    hb_enable_if (hb_is_convertible (const Base, const BaseType *))>
   friend const Type& operator + (const OffsetTo &offset, const Base &base) { return offset ((const void *) base); }
   template <typename Base,
-	    hb_enable_if (hb_is_convertible (Base, void *))>
+	    hb_enable_if (hb_is_convertible (Base, BaseType *))>
   friend Type& operator + (Base &&base, OffsetTo &offset) { return offset ((void *) base); }
   template <typename Base,
-	    hb_enable_if (hb_is_convertible (Base, void *))>
+	    hb_enable_if (hb_is_convertible (Base, BaseType *))>
   friend Type& operator + (OffsetTo &offset, Base &&base) { return offset ((void *) base); }
 
 
-  template <typename ...Ts>
+  template <typename Base, typename ...Ts>
   bool serialize_subset (hb_subset_context_t *c, const OffsetTo& src,
-			 const void *src_base, Ts&&... ds)
+			 const Base *src_base, Ts&&... ds)
   {
     *this = 0;
     if (src.is_null ())
@@ -412,20 +414,25 @@ struct OffsetTo : Offset<OffsetType, has
 		       const void *src_base, unsigned dst_bias = 0)
   { return serialize_copy (c, src, src_base, dst_bias, hb_serialize_context_t::Head); }
 
-  bool sanitize_shallow (hb_sanitize_context_t *c, const void *base) const
+  bool sanitize_shallow (hb_sanitize_context_t *c, const BaseType *base) const
   {
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this))) return_trace (false);
-    if (unlikely (this->is_null ())) return_trace (true);
+    hb_barrier ();
+    //if (unlikely (this->is_null ())) return_trace (true);
     if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
     return_trace (true);
   }
 
   template <typename ...Ts>
-  bool sanitize (hb_sanitize_context_t *c, const void *base, Ts&&... ds) const
+#ifndef HB_OPTIMIZE_SIZE
+  HB_ALWAYS_INLINE
+#endif
+  bool sanitize (hb_sanitize_context_t *c, const BaseType *base, Ts&&... ds) const
   {
     TRACE_SANITIZE (this);
     return_trace (sanitize_shallow (c, base) &&
+		  hb_barrier () &&
 		  (this->is_null () ||
 		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
 		   neuter (c)));
@@ -440,14 +447,14 @@ struct OffsetTo : Offset<OffsetType, has
   DEFINE_SIZE_STATIC (sizeof (OffsetType));
 };
 /* Partial specializations. */
-template <typename Type, bool has_null=true> using Offset16To = OffsetTo<Type, HBUINT16, has_null>;
-template <typename Type, bool has_null=true> using Offset24To = OffsetTo<Type, HBUINT24, has_null>;
-template <typename Type, bool has_null=true> using Offset32To = OffsetTo<Type, HBUINT32, has_null>;
-
-template <typename Type, typename OffsetType> using NNOffsetTo = OffsetTo<Type, OffsetType, false>;
-template <typename Type> using NNOffset16To = Offset16To<Type, false>;
-template <typename Type> using NNOffset24To = Offset24To<Type, false>;
-template <typename Type> using NNOffset32To = Offset32To<Type, false>;
+template <typename Type, typename BaseType=void, bool has_null=true> using Offset16To = OffsetTo<Type, HBUINT16, BaseType, has_null>;
+template <typename Type, typename BaseType=void, bool has_null=true> using Offset24To = OffsetTo<Type, HBUINT24, BaseType, has_null>;
+template <typename Type, typename BaseType=void, bool has_null=true> using Offset32To = OffsetTo<Type, HBUINT32, BaseType, has_null>;
+
+template <typename Type, typename OffsetType, typename BaseType=void> using NNOffsetTo = OffsetTo<Type, OffsetType, BaseType, false>;
+template <typename Type, typename BaseType=void> using NNOffset16To = Offset16To<Type, BaseType, false>;
+template <typename Type, typename BaseType=void> using NNOffset24To = Offset24To<Type, BaseType, false>;
+template <typename Type, typename BaseType=void> using NNOffset32To = Offset32To<Type, BaseType, false>;
 
 
 /*
@@ -462,24 +469,16 @@ struct UnsizedArrayOf
 
   HB_DELETE_CREATE_COPY_ASSIGN (UnsizedArrayOf);
 
-  const Type& operator [] (int i_) const
+  const Type& operator [] (unsigned int i) const
   {
-    unsigned int i = (unsigned int) i_;
-    const Type *p = &arrayZ[i];
-    if (unlikely ((const void *) p < (const void *) arrayZ)) return Null (Type); /* Overflowed. */
-    _hb_compiler_memory_r_barrier ();
-    return *p;
+    return arrayZ[i];
   }
-  Type& operator [] (int i_)
+  Type& operator [] (unsigned int i)
   {
-    unsigned int i = (unsigned int) i_;
-    Type *p = &arrayZ[i];
-    if (unlikely ((const void *) p < (const void *) arrayZ)) return Crap (Type); /* Overflowed. */
-    _hb_compiler_memory_r_barrier ();
-    return *p;
+    return arrayZ[i];
   }
 
-  unsigned int get_size (unsigned int len) const
+  static unsigned int get_size (unsigned int len)
   { return len * Type::static_size; }
 
   template <typename T> operator T * () { return arrayZ; }
@@ -533,11 +532,13 @@ struct UnsizedArrayOf
   }
 
   template <typename ...Ts>
+  HB_ALWAYS_INLINE
   bool sanitize (hb_sanitize_context_t *c, unsigned int count, Ts&&... ds) const
   {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c, count))) return_trace (false);
     if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
+    hb_barrier ();
     for (unsigned int i = 0; i < count; i++)
       if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
 	return_trace (false);
@@ -557,17 +558,17 @@ struct UnsizedArrayOf
 };
 
 /* Unsized array of offset's */
-template <typename Type, typename OffsetType, bool has_null=true>
-using UnsizedArray16OfOffsetTo = UnsizedArrayOf<OffsetTo<Type, OffsetType, has_null>>;
+template <typename Type, typename OffsetType, typename BaseType=void, bool has_null=true>
+using UnsizedArray16OfOffsetTo = UnsizedArrayOf<OffsetTo<Type, OffsetType, BaseType, has_null>>;
 
 /* Unsized array of offsets relative to the beginning of the array itself. */
-template <typename Type, typename OffsetType, bool has_null=true>
-struct UnsizedListOfOffset16To : UnsizedArray16OfOffsetTo<Type, OffsetType, has_null>
+template <typename Type, typename OffsetType, typename BaseType=void, bool has_null=true>
+struct UnsizedListOfOffset16To : UnsizedArray16OfOffsetTo<Type, OffsetType, BaseType, has_null>
 {
   const Type& operator [] (int i_) const
   {
     unsigned int i = (unsigned int) i_;
-    const OffsetTo<Type, OffsetType, has_null> *p = &this->arrayZ[i];
+    const OffsetTo<Type, OffsetType, BaseType, has_null> *p = &this->arrayZ[i];
     if (unlikely ((const void *) p < (const void *) this->arrayZ)) return Null (Type); /* Overflowed. */
     _hb_compiler_memory_r_barrier ();
     return this+*p;
@@ -575,7 +576,7 @@ struct UnsizedListOfOffset16To : Unsized
   Type& operator [] (int i_)
   {
     unsigned int i = (unsigned int) i_;
-    const OffsetTo<Type, OffsetType, has_null> *p = &this->arrayZ[i];
+    const OffsetTo<Type, OffsetType, BaseType, has_null> *p = &this->arrayZ[i];
     if (unlikely ((const void *) p < (const void *) this->arrayZ)) return Crap (Type); /* Overflowed. */
     _hb_compiler_memory_r_barrier ();
     return this+*p;
@@ -585,7 +586,7 @@ struct UnsizedListOfOffset16To : Unsized
   bool sanitize (hb_sanitize_context_t *c, unsigned int count, Ts&&... ds) const
   {
     TRACE_SANITIZE (this);
-    return_trace ((UnsizedArray16OfOffsetTo<Type, OffsetType, has_null>
+    return_trace ((UnsizedArray16OfOffsetTo<Type, OffsetType, BaseType, has_null>
 		   ::sanitize (c, count, this, std::forward<Ts> (ds)...)));
   }
 };
@@ -721,11 +722,13 @@ struct ArrayOf
   }
 
   template <typename ...Ts>
+  HB_ALWAYS_INLINE
   bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const
   {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return_trace (false);
     if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
+    hb_barrier ();
     unsigned int count = len;
     for (unsigned int i = 0; i < count; i++)
       if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
@@ -736,7 +739,9 @@ struct ArrayOf
   bool sanitize_shallow (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (len.sanitize (c) && c->check_array (arrayZ, len));
+    return_trace (len.sanitize (c) &&
+		  hb_barrier () &&
+		  c->check_array_sized (arrayZ, len, sizeof (LenType)));
   }
 
   public:
@@ -797,7 +802,7 @@ template <typename Type>
 using List16OfOffset16To = List16OfOffsetTo<Type, HBUINT16>;
 
 /* An array starting at second element. */
-template <typename Type, typename LenType=HBUINT16>
+template <typename Type, typename LenType>
 struct HeadlessArrayOf
 {
   static constexpr unsigned item_size = Type::static_size;
@@ -861,11 +866,13 @@ struct HeadlessArrayOf
   }
 
   template <typename ...Ts>
+  HB_ALWAYS_INLINE
   bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const
   {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return_trace (false);
     if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
+    hb_barrier ();
     unsigned int count = get_length ();
     for (unsigned int i = 0; i < count; i++)
       if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
@@ -878,7 +885,8 @@ struct HeadlessArrayOf
   {
     TRACE_SANITIZE (this);
     return_trace (lenP1.sanitize (c) &&
-		  (!lenP1 || c->check_array (arrayZ, lenP1 - 1)));
+		  hb_barrier () &&
+		  (!lenP1 || c->check_array_sized (arrayZ, lenP1 - 1, sizeof (LenType))));
   }
 
   public:
@@ -887,6 +895,7 @@ struct HeadlessArrayOf
   public:
   DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ);
 };
+template <typename Type> using HeadlessArray16Of = HeadlessArrayOf<Type, HBUINT16>;
 
 /* An array storing length-1. */
 template <typename Type, typename LenType=HBUINT16>
@@ -912,11 +921,13 @@ struct ArrayOfM1
   { return lenM1.static_size + (lenM1 + 1) * Type::static_size; }
 
   template <typename ...Ts>
+  HB_ALWAYS_INLINE
   bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const
   {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return_trace (false);
     if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
+    hb_barrier ();
     unsigned int count = lenM1 + 1;
     for (unsigned int i = 0; i < count; i++)
       if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
@@ -929,7 +940,8 @@ struct ArrayOfM1
   {
     TRACE_SANITIZE (this);
     return_trace (lenM1.sanitize (c) &&
-		  (c->check_array (arrayZ, lenM1 + 1)));
+		  hb_barrier () &&
+		  (c->check_array_sized (arrayZ, lenM1 + 1, sizeof (LenType))));
   }
 
   public:
@@ -973,6 +985,13 @@ struct SortedArrayOf : ArrayOf<Type, Len
     return_trace (ret);
   }
 
+  SortedArrayOf* copy (hb_serialize_context_t *c) const
+  {
+    TRACE_SERIALIZE (this);
+    SortedArrayOf* out = reinterpret_cast<SortedArrayOf *> (ArrayOf<Type, LenType>::copy (c));
+    return_trace (out);
+  }
+
   template <typename T>
   Type &bsearch (const T &x, Type &not_found = Crap (Type))
   { return *as_array ().bsearch (x, &not_found); }
@@ -1096,11 +1115,13 @@ struct VarSizedBinSearchArrayOf
   { return header.static_size + header.nUnits * header.unitSize; }
 
   template <typename ...Ts>
+  HB_ALWAYS_INLINE
   bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const
   {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return_trace (false);
     if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
+    hb_barrier ();
     unsigned int count = get_length ();
     for (unsigned int i = 0; i < count; i++)
       if (unlikely (!(*this)[i].sanitize (c, std::forward<Ts> (ds)...)))
@@ -1127,6 +1148,7 @@ struct VarSizedBinSearchArrayOf
   {
     TRACE_SANITIZE (this);
     return_trace (header.sanitize (c) &&
+		  hb_barrier () &&
 		  Type::static_size <= header.unitSize &&
 		  c->check_range (bytesZ.arrayZ,
 				  header.nUnits,
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-cff-common.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-cff-common.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-cff-common.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-cff-common.hh	2024-11-20 13:56:33.000000000 +0000
@@ -41,19 +41,42 @@ using namespace OT;
 using objidx_t = hb_serialize_context_t::objidx_t;
 using whence_t = hb_serialize_context_t::whence_t;
 
-/* utility macro */
-template<typename Type>
-static inline const Type& StructAtOffsetOrNull (const void *P, unsigned int offset)
-{ return offset ? StructAtOffset<Type> (P, offset) : Null (Type); }
+/* CFF offsets can technically be negative */
+template<typename Type, typename ...Ts>
+static inline const Type& StructAtOffsetOrNull (const void *P, int offset, hb_sanitize_context_t &sc, Ts&&... ds)
+{
+  if (!offset) return Null (Type);
+
+  const char *p = (const char *) P + offset;
+  if (!sc.check_point (p)) return Null (Type);
+
+  const Type &obj = *reinterpret_cast<const Type *> (p);
+  if (!obj.sanitize (&sc, std::forward<Ts> (ds)...)) return Null (Type);
+
+  return obj;
+}
+
 
 struct code_pair_t
 {
-  hb_codepoint_t code;
+  unsigned code;
   hb_codepoint_t glyph;
 };
 
+
 using str_buff_t = hb_vector_t<unsigned char>;
 using str_buff_vec_t = hb_vector_t<str_buff_t>;
+using glyph_to_sid_map_t = hb_vector_t<code_pair_t>;
+
+struct length_f_t
+{
+  template <typename Iterable,
+	    hb_requires (hb_is_iterable (Iterable))>
+  unsigned operator () (const Iterable &_) const { return hb_len (hb_iter (_)); }
+
+  unsigned operator () (unsigned _) const { return _; }
+}
+HB_FUNCOBJ (length_f);
 
 /* CFF INDEX */
 template <typename COUNT>
@@ -62,42 +85,55 @@ struct CFFIndex
   unsigned int offset_array_size () const
   { return offSize * (count + 1); }
 
-  CFFIndex *copy (hb_serialize_context_t *c) const
-  {
-    TRACE_SERIALIZE (this);
-    unsigned int size = get_size ();
-    CFFIndex *out = c->allocate_size<CFFIndex> (size, false);
-    if (likely (out))
-      hb_memcpy (out, this, size);
-    return_trace (out);
-  }
-
   template <typename Iterable,
 	    hb_requires (hb_is_iterable (Iterable))>
   bool serialize (hb_serialize_context_t *c,
-		  const Iterable &iterable)
+		  const Iterable &iterable,
+		  const unsigned *p_data_size = nullptr,
+                  unsigned min_off_size = 0)
   {
     TRACE_SERIALIZE (this);
+    unsigned data_size;
+    if (p_data_size)
+      data_size = *p_data_size;
+    else
+      total_size (iterable, &data_size);
+
     auto it = hb_iter (iterable);
-    serialize_header(c, + it | hb_map (hb_iter) | hb_map (hb_len));
+    if (unlikely (!serialize_header (c, +it, data_size, min_off_size))) return_trace (false);
+    unsigned char *ret = c->allocate_size<unsigned char> (data_size, false);
+    if (unlikely (!ret)) return_trace (false);
     for (const auto &_ : +it)
-      hb_iter (_).copy (c);
+    {
+      unsigned len = _.length;
+      if (!len)
+	continue;
+      if (len <= 1)
+      {
+	*ret++ = *_.arrayZ;
+	continue;
+      }
+      hb_memcpy (ret, _.arrayZ, len);
+      ret += len;
+    }
     return_trace (true);
   }
 
   template <typename Iterator,
 	    hb_requires (hb_is_iterator (Iterator))>
   bool serialize_header (hb_serialize_context_t *c,
-			Iterator it)
+			 Iterator it,
+			 unsigned data_size,
+                         unsigned min_off_size = 0)
   {
     TRACE_SERIALIZE (this);
 
-    unsigned total = + it | hb_reduce (hb_add, 0);
-    unsigned off_size = (hb_bit_storage (total + 1) + 7) / 8;
+    unsigned off_size = (hb_bit_storage (data_size + 1) + 7) / 8;
+    off_size = hb_max(min_off_size, off_size);
 
     /* serialize CFFIndex header */
     if (unlikely (!c->extend_min (this))) return_trace (false);
-    this->count = it.len ();
+    this->count = hb_len (it);
     if (!this->count) return_trace (true);
     if (unlikely (!c->extend (this->offSize))) return_trace (false);
     this->offSize = off_size;
@@ -106,26 +142,90 @@ struct CFFIndex
 
     /* serialize indices */
     unsigned int offset = 1;
-    unsigned int i = 0;
-    for (unsigned _ : +it)
+    if (HB_OPTIMIZE_SIZE_VAL)
     {
-      set_offset_at (i++, offset);
-      offset += _;
+      unsigned int i = 0;
+      for (const auto &_ : +it)
+      {
+	set_offset_at (i++, offset);
+	offset += length_f (_);
+      }
+      set_offset_at (i, offset);
     }
-    set_offset_at (i, offset);
+    else
+      switch (off_size)
+      {
+	case 1:
+	{
+	  HBUINT8 *p = (HBUINT8 *) offsets;
+	  for (const auto &_ : +it)
+	  {
+	    *p++ = offset;
+	    offset += length_f (_);
+	  }
+	  *p = offset;
+	}
+	break;
+	case 2:
+	{
+	  HBUINT16 *p = (HBUINT16 *) offsets;
+	  for (const auto &_ : +it)
+	  {
+	    *p++ = offset;
+	    offset += length_f (_);
+	  }
+	  *p = offset;
+	}
+	break;
+	case 3:
+	{
+	  HBUINT24 *p = (HBUINT24 *) offsets;
+	  for (const auto &_ : +it)
+	  {
+	    *p++ = offset;
+	    offset += length_f (_);
+	  }
+	  *p = offset;
+	}
+	break;
+	case 4:
+	{
+	  HBUINT32 *p = (HBUINT32 *) offsets;
+	  for (const auto &_ : +it)
+	  {
+	    *p++ = offset;
+	    offset += length_f (_);
+	  }
+	  *p = offset;
+	}
+	break;
+	default:
+	break;
+      }
 
+    assert (offset == data_size + 1);
     return_trace (true);
   }
 
   template <typename Iterable,
 	    hb_requires (hb_is_iterable (Iterable))>
-  static unsigned total_size (const Iterable &iterable)
+  static unsigned total_size (const Iterable &iterable, unsigned *data_size = nullptr, unsigned min_off_size = 0)
   {
-    auto it = + hb_iter (iterable) | hb_map (hb_iter) | hb_map (hb_len);
-    if (!it) return 0;
+    auto it = + hb_iter (iterable);
+    if (!it)
+    {
+      if (data_size) *data_size = 0;
+      return min_size;
+    }
+
+    unsigned total = 0;
+    for (const auto &_ : +it)
+      total += length_f (_);
+
+    if (data_size) *data_size = total;
 
-    unsigned total = + it | hb_reduce (hb_add, 0);
     unsigned off_size = (hb_bit_storage (total + 1) + 7) / 8;
+    off_size = hb_max(min_off_size, off_size);
 
     return min_size + HBUINT8::static_size + (hb_len (it) + 1) * off_size + total;
   }
@@ -133,13 +233,16 @@ struct CFFIndex
   void set_offset_at (unsigned int index, unsigned int offset)
   {
     assert (index <= count);
-    HBUINT8 *p = offsets + offSize * index + offSize;
+
     unsigned int size = offSize;
-    for (; size; size--)
+    const HBUINT8 *p = offsets;
+    switch (size)
     {
-      --p;
-      *p = offset & 0xFF;
-      offset >>= 8;
+      case 1: ((HBUINT8  *) p)[index] = offset; break;
+      case 2: ((HBUINT16 *) p)[index] = offset; break;
+      case 3: ((HBUINT24 *) p)[index] = offset; break;
+      case 4: ((HBUINT32 *) p)[index] = offset; break;
+      default: return;
     }
   }
 
@@ -149,37 +252,30 @@ struct CFFIndex
     assert (index <= count);
 
     unsigned int size = offSize;
-    const HBUINT8 *p = offsets + size * index;
+    const HBUINT8 *p = offsets;
     switch (size)
     {
-      case 1: return * (HBUINT8  *) p;
-      case 2: return * (HBUINT16 *) p;
-      case 3: return * (HBUINT24 *) p;
-      case 4: return * (HBUINT32 *) p;
+      case 1: return ((HBUINT8  *) p)[index];
+      case 2: return ((HBUINT16 *) p)[index];
+      case 3: return ((HBUINT24 *) p)[index];
+      case 4: return ((HBUINT32 *) p)[index];
       default: return 0;
     }
   }
 
-  unsigned int length_at (unsigned int index) const
-  {
-    unsigned offset0 = offset_at (index);
-    unsigned offset1 = offset_at (index + 1);
-    if (unlikely (offset1 < offset0 || offset1 > offset_at (count)))
-      return 0;
-    return offset1 - offset0;
-  }
-
   const unsigned char *data_base () const
-  { return (const unsigned char *) this + min_size + offSize.static_size + offset_array_size (); }
+  { return (const unsigned char *) this + min_size + offSize.static_size - 1 + offset_array_size (); }
   public:
 
   hb_ubytes_t operator [] (unsigned int index) const
   {
     if (unlikely (index >= count)) return hb_ubytes_t ();
     _hb_compiler_memory_r_barrier ();
-    unsigned length = length_at (index);
-    if (unlikely (!length)) return hb_ubytes_t ();
-    return hb_ubytes_t (data_base () + offset_at (index) - 1, length);
+    unsigned offset0 = offset_at (index);
+    unsigned offset1 = offset_at (index + 1);
+    if (unlikely (offset1 < offset0 || offset1 > offset_at (count)))
+      return hb_ubytes_t ();
+    return hb_ubytes_t (data_base () + offset0, offset1 - offset0);
   }
 
   unsigned int get_size () const
@@ -193,11 +289,13 @@ struct CFFIndex
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
 			  (count == 0 || /* empty INDEX */
 			   (count < count + 1u &&
+			    hb_barrier () &&
 			    c->check_struct (&offSize) && offSize >= 1 && offSize <= 4 &&
 			    c->check_array (offsets, offSize, count + 1u) &&
-			    c->check_array ((const HBUINT8*) data_base (), 1, offset_at (count) - 1)))));
+			    c->check_array ((const HBUINT8*) data_base (), 1, offset_at (count))))));
   }
 
   public:
@@ -211,47 +309,6 @@ struct CFFIndex
   DEFINE_SIZE_MIN (COUNT::static_size);
 };
 
-template <typename COUNT, typename TYPE>
-struct CFFIndexOf : CFFIndex<COUNT>
-{
-  template <typename DATA, typename PARAM1, typename PARAM2>
-  bool serialize (hb_serialize_context_t *c,
-		  unsigned int offSize_,
-		  const DATA *dataArray,
-		  unsigned int dataArrayLen,
-		  const hb_vector_t<unsigned int> &dataSizeArray,
-		  const PARAM1 &param1,
-		  const PARAM2 &param2)
-  {
-    TRACE_SERIALIZE (this);
-    /* serialize CFFIndex header */
-    if (unlikely (!c->extend_min (this))) return_trace (false);
-    this->count = dataArrayLen;
-    this->offSize = offSize_;
-    if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (dataArrayLen + 1), false)))
-      return_trace (false);
-
-    /* serialize indices */
-    unsigned int  offset = 1;
-    unsigned int  i = 0;
-    for (; i < dataArrayLen; i++)
-    {
-      this->set_offset_at (i, offset);
-      offset += dataSizeArray[i];
-    }
-    this->set_offset_at (i, offset);
-
-    /* serialize data */
-    for (unsigned int i = 0; i < dataArrayLen; i++)
-    {
-      TYPE *dest = c->start_embed<TYPE> ();
-      if (unlikely (!dest || !dest->serialize (c, dataArray[i], param1, param2)))
-	return_trace (false);
-    }
-    return_trace (true);
-  }
-};
-
 /* Top Dict, Font Dict, Private Dict */
 struct Dict : UnsizedByteStr
 {
@@ -327,7 +384,7 @@ struct table_info_t
 };
 
 template <typename COUNT>
-struct FDArray : CFFIndexOf<COUNT, FontDict>
+struct FDArray : CFFIndex<COUNT>
 {
   template <typename DICTVAL, typename INFO, typename Iterator, typename OP_SERIALIZER>
   bool serialize (hb_serialize_context_t *c,
@@ -338,7 +395,11 @@ struct FDArray : CFFIndexOf<COUNT, FontD
 
     /* serialize INDEX data */
     hb_vector_t<unsigned> sizes;
+    if (it.is_random_access_iterator)
+      sizes.alloc (hb_len (it));
+
     c->push ();
+    char *data_base = c->head;
     + it
     | hb_map ([&] (const hb_pair_t<const DICTVAL&, const INFO&> &_)
     {
@@ -348,10 +409,16 @@ struct FDArray : CFFIndexOf<COUNT, FontD
 	      })
     | hb_sink (sizes)
     ;
+    unsigned data_size = c->head - data_base;
     c->pop_pack (false);
 
+    if (unlikely (sizes.in_error ())) return_trace (false);
+
+    /* It just happens that the above is packed right after the header below.
+     * Such a hack. */
+
     /* serialize INDEX header */
-    return_trace (CFFIndex<COUNT>::serialize_header (c, hb_iter (sizes)));
+    return_trace (CFFIndex<COUNT>::serialize_header (c, hb_iter (sizes), data_size));
   }
 };
 
@@ -362,14 +429,18 @@ struct FDSelect0 {
     TRACE_SANITIZE (this);
     if (unlikely (!(c->check_struct (this))))
       return_trace (false);
+    hb_barrier ();
     if (unlikely (!c->check_array (fds, c->get_num_glyphs ())))
       return_trace (false);
 
     return_trace (true);
   }
 
-  hb_codepoint_t get_fd (hb_codepoint_t glyph) const
-  { return (hb_codepoint_t) fds[glyph]; }
+  unsigned get_fd (hb_codepoint_t glyph) const
+  { return fds[glyph]; }
+
+  hb_pair_t<unsigned, hb_codepoint_t> get_fd_range (hb_codepoint_t glyph) const
+  { return {fds[glyph], glyph + 1}; }
 
   unsigned int get_size (unsigned int num_glyphs) const
   { return HBUINT8::static_size * num_glyphs; }
@@ -385,7 +456,9 @@ struct FDSelect3_4_Range
   bool sanitize (hb_sanitize_context_t *c, const void * /*nullptr*/, unsigned int fdcount) const
   {
     TRACE_SANITIZE (this);
-    return_trace (first < c->get_num_glyphs () && (fd < fdcount));
+    return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
+		  first < c->get_num_glyphs () && (fd < fdcount));
   }
 
   GID_TYPE    first;
@@ -403,15 +476,20 @@ struct FDSelect3_4
   bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const
   {
     TRACE_SANITIZE (this);
-    if (unlikely (!c->check_struct (this) || !ranges.sanitize (c, nullptr, fdcount) ||
-		  (nRanges () == 0) || ranges[0].first != 0))
+    if (unlikely (!(c->check_struct (this) &&
+		    ranges.sanitize (c, nullptr, fdcount) &&
+		    hb_barrier () &&
+		    (nRanges () != 0) &&
+		    ranges[0].first == 0)))
       return_trace (false);
 
     for (unsigned int i = 1; i < nRanges (); i++)
       if (unlikely (ranges[i - 1].first >= ranges[i].first))
 	return_trace (false);
 
-    if (unlikely (!sentinel().sanitize (c) || (sentinel() != c->get_num_glyphs ())))
+    if (unlikely (!(sentinel().sanitize (c) &&
+		   hb_barrier () &&
+		   (sentinel() == c->get_num_glyphs ()))))
       return_trace (false);
 
     return_trace (true);
@@ -427,12 +505,20 @@ struct FDSelect3_4
     return +1;
   }
 
-  hb_codepoint_t get_fd (hb_codepoint_t glyph) const
+  unsigned get_fd (hb_codepoint_t glyph) const
   {
     auto *range = hb_bsearch (glyph, &ranges[0], nRanges () - 1, sizeof (ranges[0]), _cmp_range);
     return range ? range->fd : ranges[nRanges () - 1].fd;
   }
 
+  hb_pair_t<unsigned, hb_codepoint_t> get_fd_range (hb_codepoint_t glyph) const
+  {
+    auto *range = hb_bsearch (glyph, &ranges[0], nRanges () - 1, sizeof (ranges[0]), _cmp_range);
+    unsigned fd = range ? range->fd : ranges[nRanges () - 1].fd;
+    hb_codepoint_t end = range ? range[1].first : ranges[nRanges () - 1].first;
+    return {fd, end};
+  }
+
   GID_TYPE        &nRanges ()       { return ranges.len; }
   GID_TYPE         nRanges () const { return ranges.len; }
   GID_TYPE       &sentinel ()       { return StructAfter<GID_TYPE> (ranges[nRanges () - 1]); }
@@ -469,7 +555,7 @@ struct FDSelect
     }
   }
 
-  hb_codepoint_t get_fd (hb_codepoint_t glyph) const
+  unsigned get_fd (hb_codepoint_t glyph) const
   {
     if (this == &Null (FDSelect)) return 0;
 
@@ -480,12 +566,25 @@ struct FDSelect
     default:return 0;
     }
   }
+  /* Returns pair of fd and one after last glyph in range. */
+  hb_pair_t<unsigned, hb_codepoint_t> get_fd_range (hb_codepoint_t glyph) const
+  {
+    if (this == &Null (FDSelect)) return {0, 1};
+
+    switch (format)
+    {
+    case 0: return u.format0.get_fd_range (glyph);
+    case 3: return u.format3.get_fd_range (glyph);
+    default:return {0, 1};
+    }
+  }
 
   bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const
   {
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this)))
       return_trace (false);
+    hb_barrier ();
 
     switch (format)
     {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.cc	2024-11-20 13:56:33.000000000 +0000
@@ -574,11 +574,11 @@ bool OT::cff1::accelerator_t::get_path (
 
 struct get_seac_param_t
 {
-  get_seac_param_t (const OT::cff1::accelerator_t *_cff) : cff (_cff) {}
+  get_seac_param_t (const OT::cff1::accelerator_subset_t *_cff) : cff (_cff) {}
 
   bool has_seac () const { return base && accent; }
 
-  const OT::cff1::accelerator_t *cff;
+  const OT::cff1::accelerator_subset_t *cff;
   hb_codepoint_t  base = 0;
   hb_codepoint_t  accent = 0;
 };
@@ -596,7 +596,7 @@ struct cff1_cs_opset_seac_t : cff1_cs_op
   }
 };
 
-bool OT::cff1::accelerator_t::get_seac_components (hb_codepoint_t glyph, hb_codepoint_t *base, hb_codepoint_t *accent) const
+bool OT::cff1::accelerator_subset_t::get_seac_components (hb_codepoint_t glyph, hb_codepoint_t *base, hb_codepoint_t *accent) const
 {
   if (unlikely (!is_valid () || (glyph >= num_glyphs))) return false;
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -28,7 +28,7 @@
 #define HB_OT_CFF1_TABLE_HH
 
 #include "hb-ot-cff-common.hh"
-#include "hb-subset-cff1.hh"
+#include "hb-subset-cff-common.hh"
 #include "hb-draw.hh"
 #include "hb-paint.hh"
 
@@ -44,7 +44,7 @@ namespace CFF {
  * CFF -- Compact Font Format (CFF)
  * https://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5176.CFF.pdf
  */
-#define HB_OT_TAG_cff1 HB_TAG('C','F','F',' ')
+#define HB_OT_TAG_CFF1 HB_TAG('C','F','F',' ')
 
 #define CFF_UNDEF_SID   CFF_UNDEF_CODE
 
@@ -52,7 +52,6 @@ enum EncodingID { StandardEncoding = 0,
 enum CharsetID { ISOAdobeCharset = 0, ExpertCharset = 1, ExpertSubsetCharset = 2 };
 
 typedef CFFIndex<HBUINT16>  CFF1Index;
-template <typename Type> struct CFF1IndexOf : CFFIndexOf<HBUINT16, Type> {};
 
 typedef CFFIndex<HBUINT16> CFF1Index;
 typedef CFF1Index          CFF1CharStrings;
@@ -110,6 +109,7 @@ struct Encoding1 {
 
   hb_codepoint_t get_code (hb_codepoint_t glyph) const
   {
+    /* TODO: Add cache like get_sid. */
     assert (glyph > 0);
     glyph--;
     for (unsigned int i = 0; i < nRanges (); i++)
@@ -173,11 +173,7 @@ struct Encoding
   bool serialize (hb_serialize_context_t *c, const Encoding &src)
   {
     TRACE_SERIALIZE (this);
-    unsigned int size = src.get_size ();
-    Encoding *dest = c->allocate_size<Encoding> (size);
-    if (unlikely (!dest)) return_trace (false);
-    hb_memcpy (dest, &src, size);
-    return_trace (true);
+    return_trace (c->embed (src));
   }
 
   /* serialize a subset Encoding */
@@ -279,6 +275,7 @@ struct Encoding
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this)))
       return_trace (false);
+    hb_barrier ();
 
     switch (table_format ())
     {
@@ -312,26 +309,29 @@ struct Encoding
 };
 
 /* Charset */
-struct Charset0 {
-  bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs) const
+struct Charset0
+{
+  bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs, unsigned *num_charset_entries) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && sids[num_glyphs - 1].sanitize (c));
+    if (num_charset_entries) *num_charset_entries = num_glyphs;
+    return_trace (sids.sanitize (c, num_glyphs - 1));
   }
 
   hb_codepoint_t get_sid (hb_codepoint_t glyph, unsigned num_glyphs) const
   {
     if (unlikely (glyph >= num_glyphs)) return 0;
-    if (glyph == 0)
+    if (unlikely (glyph == 0))
       return 0;
     else
       return sids[glyph - 1];
   }
 
-  void collect_glyph_to_sid_map (hb_map_t *mapping, unsigned int num_glyphs) const
+  void collect_glyph_to_sid_map (glyph_to_sid_map_t *mapping, unsigned int num_glyphs) const
   {
+    mapping->resize (num_glyphs, false);
     for (hb_codepoint_t gid = 1; gid < num_glyphs; gid++)
-      mapping->set (gid, sids[gid - 1]);
+      mapping->arrayZ[gid] = {sids[gid - 1], gid};
   }
 
   hb_codepoint_t get_glyph (hb_codepoint_t sid, unsigned int num_glyphs) const
@@ -347,13 +347,13 @@ struct Charset0 {
     return 0;
   }
 
-  unsigned int get_size (unsigned int num_glyphs) const
+  static unsigned int get_size (unsigned int num_glyphs)
   {
     assert (num_glyphs > 0);
-    return HBUINT16::static_size * (num_glyphs - 1);
+    return UnsizedArrayOf<HBUINT16>::get_size (num_glyphs - 1);
   }
 
-  HBUINT16  sids[HB_VAR_ARRAY];
+  UnsizedArrayOf<HBUINT16> sids;
 
   DEFINE_SIZE_ARRAY(0, sids);
 };
@@ -374,38 +374,62 @@ struct Charset_Range {
 
 template <typename TYPE>
 struct Charset1_2 {
-  bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs) const
+  bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs, unsigned *num_charset_entries) const
   {
     TRACE_SANITIZE (this);
-    if (unlikely (!c->check_struct (this)))
-      return_trace (false);
     num_glyphs--;
-    for (unsigned int i = 0; num_glyphs > 0; i++)
+    unsigned i;
+    for (i = 0; num_glyphs > 0; i++)
     {
-      if (unlikely (!ranges[i].sanitize (c) || (num_glyphs < ranges[i].nLeft + 1)))
+      if (unlikely (!(ranges[i].sanitize (c) &&
+		      hb_barrier () &&
+		      (num_glyphs >= ranges[i].nLeft + 1))))
 	return_trace (false);
       num_glyphs -= (ranges[i].nLeft + 1);
     }
+    if (num_charset_entries)
+      *num_charset_entries = i;
     return_trace (true);
   }
 
-  hb_codepoint_t get_sid (hb_codepoint_t glyph, unsigned num_glyphs) const
+  hb_codepoint_t get_sid (hb_codepoint_t glyph, unsigned num_glyphs,
+			  code_pair_t *cache = nullptr) const
   {
     if (unlikely (glyph >= num_glyphs)) return 0;
-    if (glyph == 0) return 0;
-    glyph--;
-    for (unsigned int i = 0;; i++)
+    unsigned i;
+    hb_codepoint_t start_glyph;
+    if (cache && likely (cache->glyph <= glyph))
     {
-      if (glyph <= ranges[i].nLeft)
-	return (hb_codepoint_t) ranges[i].first + glyph;
-      glyph -= (ranges[i].nLeft + 1);
+      i = cache->code;
+      start_glyph = cache->glyph;
+    }
+    else
+    {
+      if (unlikely (glyph == 0)) return 0;
+      i = 0;
+      start_glyph = 1;
+    }
+    glyph -= start_glyph;
+    for (;; i++)
+    {
+      unsigned count = ranges[i].nLeft;
+      if (glyph <= count)
+      {
+        if (cache)
+	  *cache = {i, start_glyph};
+	return ranges[i].first + glyph;
+      }
+      count++;
+      start_glyph += count;
+      glyph -= count;
     }
 
     return 0;
   }
 
-  void collect_glyph_to_sid_map (hb_map_t *mapping, unsigned int num_glyphs) const
+  void collect_glyph_to_sid_map (glyph_to_sid_map_t *mapping, unsigned int num_glyphs) const
   {
+    mapping->resize (num_glyphs, false);
     hb_codepoint_t gid = 1;
     if (gid >= num_glyphs)
       return;
@@ -413,8 +437,9 @@ struct Charset1_2 {
     {
       hb_codepoint_t sid = ranges[i].first;
       unsigned count = ranges[i].nLeft + 1;
+      unsigned last = gid + count;
       for (unsigned j = 0; j < count; j++)
-	mapping->set (gid++, sid++);
+	mapping->arrayZ[gid++] = {sid++, last - 1};
 
       if (gid >= num_glyphs)
         break;
@@ -439,21 +464,26 @@ struct Charset1_2 {
 
   unsigned int get_size (unsigned int num_glyphs) const
   {
-    unsigned int size = HBUINT8::static_size;
-    int glyph = (int)num_glyphs;
+    int glyph = (int) num_glyphs;
+    unsigned num_ranges = 0;
 
     assert (glyph > 0);
     glyph--;
     for (unsigned int i = 0; glyph > 0; i++)
     {
       glyph -= (ranges[i].nLeft + 1);
-      size += Charset_Range<TYPE>::static_size;
+      num_ranges++;
     }
 
-    return size;
+    return get_size_for_ranges (num_ranges);
+  }
+
+  static unsigned int get_size_for_ranges (unsigned int num_ranges)
+  {
+    return UnsizedArrayOf<Charset_Range<TYPE> >::get_size (num_ranges);
   }
 
-  Charset_Range<TYPE>   ranges[HB_VAR_ARRAY];
+  UnsizedArrayOf<Charset_Range<TYPE>> ranges;
 
   DEFINE_SIZE_ARRAY (0, ranges);
 };
@@ -469,11 +499,7 @@ struct Charset
   bool serialize (hb_serialize_context_t *c, const Charset &src, unsigned int num_glyphs)
   {
     TRACE_SERIALIZE (this);
-    unsigned int size = src.get_size (num_glyphs);
-    Charset *dest = c->allocate_size<Charset> (size);
-    if (unlikely (!dest)) return_trace (false);
-    hb_memcpy (dest, &src, size);
-    return_trace (true);
+    return_trace (c->embed ((const char *) &src, src.get_size (num_glyphs)));
   }
 
   /* serialize a subset Charset */
@@ -490,13 +516,13 @@ struct Charset
     {
     case 0:
     {
-      Charset0 *fmt0 = c->allocate_size<Charset0> (Charset0::min_size + HBUINT16::static_size * (num_glyphs - 1));
+      Charset0 *fmt0 = c->allocate_size<Charset0> (Charset0::get_size (num_glyphs), false);
       if (unlikely (!fmt0)) return_trace (false);
       unsigned int glyph = 0;
       for (unsigned int i = 0; i < sid_ranges.length; i++)
       {
-	hb_codepoint_t sid = sid_ranges[i].code;
-	for (int left = (int)sid_ranges[i].glyph; left >= 0; left--)
+	hb_codepoint_t sid = sid_ranges.arrayZ[i].code;
+	for (int left = (int)sid_ranges.arrayZ[i].glyph; left >= 0; left--)
 	  fmt0->sids[glyph++] = sid++;
       }
     }
@@ -504,29 +530,35 @@ struct Charset
 
     case 1:
     {
-      Charset1 *fmt1 = c->allocate_size<Charset1> (Charset1::min_size + Charset1_Range::static_size * sid_ranges.length);
+      Charset1 *fmt1 = c->allocate_size<Charset1> (Charset1::get_size_for_ranges (sid_ranges.length), false);
       if (unlikely (!fmt1)) return_trace (false);
+      hb_codepoint_t all_glyphs = 0;
       for (unsigned int i = 0; i < sid_ranges.length; i++)
       {
-	if (unlikely (!(sid_ranges[i].glyph <= 0xFF)))
-	  return_trace (false);
-	fmt1->ranges[i].first = sid_ranges[i].code;
-	fmt1->ranges[i].nLeft = sid_ranges[i].glyph;
+        auto &_ = sid_ranges.arrayZ[i];
+        all_glyphs |= _.glyph;
+	fmt1->ranges[i].first = _.code;
+	fmt1->ranges[i].nLeft = _.glyph;
       }
+      if (unlikely (!(all_glyphs <= 0xFF)))
+	return_trace (false);
     }
     break;
 
     case 2:
     {
-      Charset2 *fmt2 = c->allocate_size<Charset2> (Charset2::min_size + Charset2_Range::static_size * sid_ranges.length);
+      Charset2 *fmt2 = c->allocate_size<Charset2> (Charset2::get_size_for_ranges (sid_ranges.length), false);
       if (unlikely (!fmt2)) return_trace (false);
+      hb_codepoint_t all_glyphs = 0;
       for (unsigned int i = 0; i < sid_ranges.length; i++)
       {
-	if (unlikely (!(sid_ranges[i].glyph <= 0xFFFF)))
-	  return_trace (false);
-	fmt2->ranges[i].first = sid_ranges[i].code;
-	fmt2->ranges[i].nLeft = sid_ranges[i].glyph;
+        auto &_ = sid_ranges.arrayZ[i];
+        all_glyphs |= _.glyph;
+	fmt2->ranges[i].first = _.code;
+	fmt2->ranges[i].nLeft = _.glyph;
       }
+      if (unlikely (!(all_glyphs <= 0xFFFF)))
+	return_trace (false);
     }
     break;
 
@@ -545,18 +577,19 @@ struct Charset
     }
   }
 
-  hb_codepoint_t get_sid (hb_codepoint_t glyph, unsigned int num_glyphs) const
+  hb_codepoint_t get_sid (hb_codepoint_t glyph, unsigned int num_glyphs,
+			  code_pair_t *cache = nullptr) const
   {
     switch (format)
     {
     case 0: return u.format0.get_sid (glyph, num_glyphs);
-    case 1: return u.format1.get_sid (glyph, num_glyphs);
-    case 2: return u.format2.get_sid (glyph, num_glyphs);
+    case 1: return u.format1.get_sid (glyph, num_glyphs, cache);
+    case 2: return u.format2.get_sid (glyph, num_glyphs, cache);
     default:return 0;
     }
   }
 
-  void collect_glyph_to_sid_map (hb_map_t *mapping, unsigned int num_glyphs) const
+  void collect_glyph_to_sid_map (glyph_to_sid_map_t *mapping, unsigned int num_glyphs) const
   {
     switch (format)
     {
@@ -578,17 +611,18 @@ struct Charset
     }
   }
 
-  bool sanitize (hb_sanitize_context_t *c) const
+  bool sanitize (hb_sanitize_context_t *c, unsigned *num_charset_entries) const
   {
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this)))
       return_trace (false);
+    hb_barrier ();
 
     switch (format)
     {
-    case 0: return_trace (u.format0.sanitize (c, c->get_num_glyphs ()));
-    case 1: return_trace (u.format1.sanitize (c, c->get_num_glyphs ()));
-    case 2: return_trace (u.format2.sanitize (c, c->get_num_glyphs ()));
+    case 0: return_trace (u.format0.sanitize (c, c->get_num_glyphs (), num_charset_entries));
+    case 1: return_trace (u.format1.sanitize (c, c->get_num_glyphs (), num_charset_entries));
+    case 2: return_trace (u.format2.sanitize (c, c->get_num_glyphs (), num_charset_entries));
     default:return_trace (false);
     }
   }
@@ -606,10 +640,10 @@ struct Charset
 struct CFF1StringIndex : CFF1Index
 {
   bool serialize (hb_serialize_context_t *c, const CFF1StringIndex &strings,
-		  const hb_inc_bimap_t &sidmap)
+		  const hb_vector_t<unsigned> &sidmap)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely ((strings.count == 0) || (sidmap.get_population () == 0)))
+    if (unlikely ((strings.count == 0) || (sidmap.length == 0)))
     {
       if (unlikely (!c->extend_min (this->count)))
 	return_trace (false);
@@ -617,15 +651,13 @@ struct CFF1StringIndex : CFF1Index
       return_trace (true);
     }
 
-    byte_str_array_t bytesArray;
-    if (!bytesArray.resize (sidmap.get_population ()))
-      return_trace (false);
-    for (unsigned int i = 0; i < strings.count; i++)
-    {
-      hb_codepoint_t  j = sidmap[i];
-      if (j != HB_MAP_VALUE_INVALID)
-	bytesArray[j] = strings[i];
-    }
+    if (unlikely (sidmap.in_error ())) return_trace (false);
+
+    // Save this in a vector since serialize() iterates it twice.
+    hb_vector_t<hb_ubytes_t> bytesArray (+ hb_iter (sidmap)
+					 | hb_map (strings));
+
+    if (unlikely (bytesArray.in_error ())) return_trace (false);
 
     bool result = CFF1Index::serialize (c, bytesArray);
     return_trace (result);
@@ -731,9 +763,9 @@ struct cff1_top_dict_values_t : top_dict
   unsigned int    ros_supplement;
   unsigned int    cidCount;
 
-  unsigned int    EncodingOffset;
-  unsigned int    CharsetOffset;
-  unsigned int    FDSelectOffset;
+  int             EncodingOffset;
+  int             CharsetOffset;
+  int             FDSelectOffset;
   table_info_t    privateDictInfo;
 };
 
@@ -789,24 +821,24 @@ struct cff1_top_dict_opset_t : top_dict_
 	break;
 
       case OpCode_Encoding:
-	dictval.EncodingOffset = env.argStack.pop_uint ();
+	dictval.EncodingOffset = env.argStack.pop_int ();
 	env.clear_args ();
 	if (unlikely (dictval.EncodingOffset == 0)) return;
 	break;
 
       case OpCode_charset:
-	dictval.CharsetOffset = env.argStack.pop_uint ();
+	dictval.CharsetOffset = env.argStack.pop_int ();
 	env.clear_args ();
 	if (unlikely (dictval.CharsetOffset == 0)) return;
 	break;
 
       case OpCode_FDSelect:
-	dictval.FDSelectOffset = env.argStack.pop_uint ();
+	dictval.FDSelectOffset = env.argStack.pop_int ();
 	env.clear_args ();
 	break;
 
       case OpCode_Private:
-	dictval.privateDictInfo.offset = env.argStack.pop_uint ();
+	dictval.privateDictInfo.offset = env.argStack.pop_int ();
 	dictval.privateDictInfo.size = env.argStack.pop_uint ();
 	env.clear_args ();
 	break;
@@ -881,7 +913,7 @@ struct cff1_private_dict_values_base_t :
   }
   void fini () { dict_values_t<VAL>::fini (); }
 
-  unsigned int      subrsOffset;
+  int                 subrsOffset;
   const CFF1Subrs    *localSubrs;
 };
 
@@ -916,7 +948,7 @@ struct cff1_private_dict_opset_t : dict_
 	env.clear_args ();
 	break;
       case OpCode_Subrs:
-	dictval.subrsOffset = env.argStack.pop_uint ();
+	dictval.subrsOffset = env.argStack.pop_int ();
 	env.clear_args ();
 	break;
 
@@ -932,7 +964,7 @@ struct cff1_private_dict_opset_t : dict_
   }
 };
 
-struct cff1_private_dict_opset_subset : dict_opset_t
+struct cff1_private_dict_opset_subset_t : dict_opset_t
 {
   static void process_op (op_code_t op, num_interp_env_t& env, cff1_private_dict_values_subset_t& dictval)
   {
@@ -958,7 +990,7 @@ struct cff1_private_dict_opset_subset :
 	break;
 
       case OpCode_Subrs:
-	dictval.subrsOffset = env.argStack.pop_uint ();
+	dictval.subrsOffset = env.argStack.pop_int ();
 	env.clear_args ();
 	break;
 
@@ -978,7 +1010,7 @@ typedef dict_interpreter_t<cff1_top_dict
 typedef dict_interpreter_t<cff1_font_dict_opset_t, cff1_font_dict_values_t> cff1_font_dict_interpreter_t;
 
 typedef CFF1Index CFF1NameIndex;
-typedef CFF1IndexOf<TopDict> CFF1TopDictIndex;
+typedef CFF1Index CFF1TopDictIndex;
 
 struct cff1_font_dict_values_mod_t
 {
@@ -1019,20 +1051,25 @@ using namespace CFF;
 
 struct cff1
 {
-  static constexpr hb_tag_t tableTag = HB_OT_TAG_cff1;
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_CFF1;
 
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  likely (version.major == 1));
   }
 
   template <typename PRIVOPSET, typename PRIVDICTVAL>
   struct accelerator_templ_t
   {
-    void init (hb_face_t *face)
+    static constexpr hb_tag_t tableTag = cff1::tableTag;
+
+    accelerator_templ_t (hb_face_t *face)
     {
+      if (!face) return;
+
       topDict.init ();
       fontDicts.init ();
       privateDicts.init ();
@@ -1046,40 +1083,43 @@ struct cff1
       const OT::cff1 *cff = this->blob->template as<OT::cff1> ();
 
       if (cff == &Null (OT::cff1))
-      { fini (); return; }
+        goto fail;
 
       nameIndex = &cff->nameIndex (cff);
       if ((nameIndex == &Null (CFF1NameIndex)) || !nameIndex->sanitize (&sc))
-      { fini (); return; }
+        goto fail;
+      hb_barrier ();
 
-      topDictIndex = &StructAtOffset<CFF1TopDictIndex> (nameIndex, nameIndex->get_size ());
-      if ((topDictIndex == &Null (CFF1TopDictIndex)) || !topDictIndex->sanitize (&sc) || (topDictIndex->count == 0))
-      { fini (); return; }
+      topDictIndex = &StructAtOffsetOrNull<CFF1TopDictIndex> (nameIndex, nameIndex->get_size (), sc);
+      if (topDictIndex == &Null (CFF1TopDictIndex) || (topDictIndex->count == 0))
+        goto fail;
+      hb_barrier ();
 
       { /* parse top dict */
 	const hb_ubytes_t topDictStr = (*topDictIndex)[0];
-	if (unlikely (!topDictStr.sanitize (&sc))) { fini (); return; }
+	if (unlikely (!topDictStr.sanitize (&sc)))   goto fail;
+	hb_barrier ();
 	cff1_top_dict_interp_env_t env (topDictStr);
 	cff1_top_dict_interpreter_t top_interp (env);
-	if (unlikely (!top_interp.interpret (topDict))) { fini (); return; }
+	if (unlikely (!top_interp.interpret (topDict)))   goto fail;
       }
 
       if (is_predef_charset ())
 	charset = &Null (Charset);
       else
       {
-	charset = &StructAtOffsetOrNull<Charset> (cff, topDict.CharsetOffset);
-	if (unlikely ((charset == &Null (Charset)) || !charset->sanitize (&sc))) { fini (); return; }
+	charset = &StructAtOffsetOrNull<Charset> (cff, topDict.CharsetOffset, sc, &num_charset_entries);
+	if (unlikely (charset == &Null (Charset)))   goto fail;
       }
 
       fdCount = 1;
       if (is_CID ())
       {
-	fdArray = &StructAtOffsetOrNull<CFF1FDArray> (cff, topDict.FDArrayOffset);
-	fdSelect = &StructAtOffsetOrNull<CFF1FDSelect> (cff, topDict.FDSelectOffset);
-	if (unlikely ((fdArray == &Null (CFF1FDArray)) || !fdArray->sanitize (&sc) ||
-	    (fdSelect == &Null (CFF1FDSelect)) || !fdSelect->sanitize (&sc, fdArray->count)))
-	{ fini (); return; }
+	fdArray = &StructAtOffsetOrNull<CFF1FDArray> (cff, topDict.FDArrayOffset, sc);
+	fdSelect = &StructAtOffsetOrNull<CFF1FDSelect> (cff, topDict.FDSelectOffset, sc, fdArray->count);
+	if (unlikely (fdArray == &Null (CFF1FDArray) ||
+		      fdSelect == &Null (CFF1FDSelect)))
+	  goto fail;
 
 	fdCount = fdArray->count;
       }
@@ -1092,36 +1132,32 @@ struct cff1
       encoding = &Null (Encoding);
       if (is_CID ())
       {
-	if (unlikely (charset == &Null (Charset))) { fini (); return; }
+	if (unlikely (charset == &Null (Charset)))   goto fail;
       }
       else
       {
 	if (!is_predef_encoding ())
 	{
-	  encoding = &StructAtOffsetOrNull<Encoding> (cff, topDict.EncodingOffset);
-	  if (unlikely ((encoding == &Null (Encoding)) || !encoding->sanitize (&sc))) { fini (); return; }
+	  encoding = &StructAtOffsetOrNull<Encoding> (cff, topDict.EncodingOffset, sc);
+	  if (unlikely (encoding == &Null (Encoding)))   goto fail;
 	}
       }
 
-      stringIndex = &StructAtOffset<CFF1StringIndex> (topDictIndex, topDictIndex->get_size ());
-      if ((stringIndex == &Null (CFF1StringIndex)) || !stringIndex->sanitize (&sc))
-      { fini (); return; }
-
-      globalSubrs = &StructAtOffset<CFF1Subrs> (stringIndex, stringIndex->get_size ());
-      if ((globalSubrs != &Null (CFF1Subrs)) && !globalSubrs->sanitize (&sc))
-      { fini (); return; }
-
-      charStrings = &StructAtOffsetOrNull<CFF1CharStrings> (cff, topDict.charStringsOffset);
-
-      if ((charStrings == &Null (CFF1CharStrings)) || unlikely (!charStrings->sanitize (&sc)))
-      { fini (); return; }
+      stringIndex = &StructAtOffsetOrNull<CFF1StringIndex> (topDictIndex, topDictIndex->get_size (), sc);
+      if (stringIndex == &Null (CFF1StringIndex))
+        goto fail;
+
+      globalSubrs = &StructAtOffsetOrNull<CFF1Subrs> (stringIndex, stringIndex->get_size (), sc);
+      charStrings = &StructAtOffsetOrNull<CFF1CharStrings> (cff, topDict.charStringsOffset, sc);
+      if (charStrings == &Null (CFF1CharStrings))
+        goto fail;
 
       num_glyphs = charStrings->count;
       if (num_glyphs != sc.get_num_glyphs ())
-      { fini (); return; }
+        goto fail;
 
       if (unlikely (!privateDicts.resize (fdCount)))
-      { fini (); return; }
+        goto fail;
       for (unsigned int i = 0; i < fdCount; i++)
 	privateDicts[i].init ();
 
@@ -1131,27 +1167,24 @@ struct cff1
 	for (unsigned int i = 0; i < fdCount; i++)
 	{
 	  hb_ubytes_t fontDictStr = (*fdArray)[i];
-	  if (unlikely (!fontDictStr.sanitize (&sc))) { fini (); return; }
+	  if (unlikely (!fontDictStr.sanitize (&sc)))   goto fail;
+	  hb_barrier ();
 	  cff1_font_dict_values_t *font;
 	  cff1_top_dict_interp_env_t env (fontDictStr);
 	  cff1_font_dict_interpreter_t font_interp (env);
 	  font = fontDicts.push ();
-	  if (unlikely (fontDicts.in_error ())) { fini (); return; }
+	  if (unlikely (fontDicts.in_error ()))   goto fail;
 
 	  font->init ();
-	  if (unlikely (!font_interp.interpret (*font))) { fini (); return; }
+	  if (unlikely (!font_interp.interpret (*font)))   goto fail;
 	  PRIVDICTVAL *priv = &privateDicts[i];
-	  const hb_ubytes_t privDictStr = StructAtOffset<UnsizedByteStr> (cff, font->privateDictInfo.offset).as_ubytes (font->privateDictInfo.size);
-	  if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; }
+	  const hb_ubytes_t privDictStr = StructAtOffsetOrNull<UnsizedByteStr> (cff, font->privateDictInfo.offset, sc, font->privateDictInfo.size).as_ubytes (font->privateDictInfo.size);
 	  num_interp_env_t env2 (privDictStr);
 	  dict_interpreter_t<PRIVOPSET, PRIVDICTVAL> priv_interp (env2);
 	  priv->init ();
-	  if (unlikely (!priv_interp.interpret (*priv))) { fini (); return; }
+	  if (unlikely (!priv_interp.interpret (*priv)))   goto fail;
 
-	  priv->localSubrs = &StructAtOffsetOrNull<CFF1Subrs> (&privDictStr, priv->subrsOffset);
-	  if (priv->localSubrs != &Null (CFF1Subrs) &&
-	      unlikely (!priv->localSubrs->sanitize (&sc)))
-	  { fini (); return; }
+	  priv->localSubrs = &StructAtOffsetOrNull<CFF1Subrs> (&privDictStr, priv->subrsOffset, sc);
 	}
       }
       else  /* non-CID */
@@ -1159,21 +1192,23 @@ struct cff1
 	cff1_top_dict_values_t *font = &topDict;
 	PRIVDICTVAL *priv = &privateDicts[0];
 
-	const hb_ubytes_t privDictStr = StructAtOffset<UnsizedByteStr> (cff, font->privateDictInfo.offset).as_ubytes (font->privateDictInfo.size);
-	if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; }
+	const hb_ubytes_t privDictStr = StructAtOffsetOrNull<UnsizedByteStr> (cff, font->privateDictInfo.offset, sc, font->privateDictInfo.size).as_ubytes (font->privateDictInfo.size);
 	num_interp_env_t env (privDictStr);
 	dict_interpreter_t<PRIVOPSET, PRIVDICTVAL> priv_interp (env);
 	priv->init ();
-	if (unlikely (!priv_interp.interpret (*priv))) { fini (); return; }
+	if (unlikely (!priv_interp.interpret (*priv)))   goto fail;
 
-	priv->localSubrs = &StructAtOffsetOrNull<CFF1Subrs> (&privDictStr, priv->subrsOffset);
-	if (priv->localSubrs != &Null (CFF1Subrs) &&
-	    unlikely (!priv->localSubrs->sanitize (&sc)))
-	{ fini (); return; }
+	priv->localSubrs = &StructAtOffsetOrNull<CFF1Subrs> (&privDictStr, priv->subrsOffset, sc);
+	hb_barrier ();
       }
-    }
 
-    void fini ()
+      return;
+
+      fail:
+        _fini ();
+    }
+    ~accelerator_templ_t () { _fini (); }
+    void _fini ()
     {
       sc.end_processing ();
       topDict.fini ();
@@ -1183,6 +1218,8 @@ struct cff1
       blob = nullptr;
     }
 
+    hb_blob_t *get_blob () const { return blob; }
+
     bool is_valid () const { return blob; }
     bool   is_CID () const { return topDict.is_CID (); }
 
@@ -1203,13 +1240,14 @@ struct cff1
 
     bool is_predef_encoding () const { return topDict.EncodingOffset <= ExpertEncoding; }
 
-    hb_codepoint_t glyph_to_code (hb_codepoint_t glyph) const
+    hb_codepoint_t glyph_to_code (hb_codepoint_t glyph,
+				  code_pair_t *glyph_to_sid_cache = nullptr) const
     {
       if (encoding != &Null (Encoding))
 	return encoding->get_code (glyph);
       else
       {
-	hb_codepoint_t sid = glyph_to_sid (glyph);
+	hb_codepoint_t sid = glyph_to_sid (glyph, glyph_to_sid_cache);
 	if (sid == 0) return 0;
 	hb_codepoint_t code = 0;
 	switch (topDict.EncodingOffset)
@@ -1227,12 +1265,14 @@ struct cff1
       }
     }
 
-    hb_map_t *create_glyph_to_sid_map () const
+    glyph_to_sid_map_t *create_glyph_to_sid_map () const
     {
       if (charset != &Null (Charset))
       {
-	hb_map_t *mapping = hb_map_create ();
-	mapping->set (0, 0);
+	auto *mapping = (glyph_to_sid_map_t *) hb_malloc (sizeof (glyph_to_sid_map_t));
+	if (unlikely (!mapping)) return nullptr;
+	mapping = new (mapping) glyph_to_sid_map_t ();
+	mapping->push (code_pair_t {0, 1});
 	charset->collect_glyph_to_sid_map (mapping, num_glyphs);
 	return mapping;
       }
@@ -1240,10 +1280,11 @@ struct cff1
 	return nullptr;
     }
 
-    hb_codepoint_t glyph_to_sid (hb_codepoint_t glyph) const
+    hb_codepoint_t glyph_to_sid (hb_codepoint_t glyph,
+				 code_pair_t *cache = nullptr) const
     {
       if (charset != &Null (Charset))
-	return charset->get_sid (glyph, num_glyphs);
+	return charset->get_sid (glyph, num_glyphs, cache);
       else
       {
 	hb_codepoint_t sid = 0;
@@ -1312,19 +1353,17 @@ struct cff1
     hb_vector_t<PRIVDICTVAL> privateDicts;
 
     unsigned int	     num_glyphs = 0;
+    unsigned int	     num_charset_entries = 0;
   };
 
   struct accelerator_t : accelerator_templ_t<cff1_private_dict_opset_t, cff1_private_dict_values_t>
   {
-    accelerator_t (hb_face_t *face)
+    accelerator_t (hb_face_t *face) : SUPER (face)
     {
-      SUPER::init (face);
-
       glyph_names.set_relaxed (nullptr);
 
       if (!is_valid ()) return;
       if (is_CID ()) return;
-
     }
     ~accelerator_t ()
     {
@@ -1334,8 +1373,6 @@ struct cff1
 	names->fini ();
 	hb_free (names);
       }
-
-      SUPER::fini ();
     }
 
     bool get_glyph_name (hb_codepoint_t glyph,
@@ -1379,16 +1416,17 @@ struct cff1
       hb_sorted_vector_t<gname_t> *names = glyph_names.get_acquire ();
       if (unlikely (!names))
       {
-	names = (hb_sorted_vector_t<gname_t> *) hb_calloc (sizeof (hb_sorted_vector_t<gname_t>), 1);
+	names = (hb_sorted_vector_t<gname_t> *) hb_calloc (1, sizeof (hb_sorted_vector_t<gname_t>));
 	if (likely (names))
 	{
 	  names->init ();
 	  /* TODO */
 
 	  /* fill glyph names */
+	  code_pair_t glyph_to_sid_cache {0, HB_CODEPOINT_INVALID};
 	  for (hb_codepoint_t gid = 0; gid < num_glyphs; gid++)
 	  {
-	    hb_codepoint_t	sid = glyph_to_sid (gid);
+	    hb_codepoint_t	sid = glyph_to_sid (gid, &glyph_to_sid_cache);
 	    gname_t	gname;
 	    gname.sid = sid;
 	    if (sid < cff1_std_strings_length)
@@ -1426,7 +1464,6 @@ struct cff1
 
     HB_INTERNAL bool get_extents (hb_font_t *font, hb_codepoint_t glyph, hb_glyph_extents_t *extents) const;
     HB_INTERNAL bool paint_glyph (hb_font_t *font, hb_codepoint_t glyph, hb_paint_funcs_t *funcs, void *data, hb_color_t foreground) const;
-    HB_INTERNAL bool get_seac_components (hb_codepoint_t glyph, hb_codepoint_t *base, hb_codepoint_t *accent) const;
     HB_INTERNAL bool get_path (hb_font_t *font, hb_codepoint_t glyph, hb_draw_session_t &draw_session) const;
 
     private:
@@ -1453,9 +1490,24 @@ struct cff1
     typedef accelerator_templ_t<cff1_private_dict_opset_t, cff1_private_dict_values_t> SUPER;
   };
 
-  struct accelerator_subset_t : accelerator_templ_t<cff1_private_dict_opset_subset, cff1_private_dict_values_subset_t> {};
+  struct accelerator_subset_t : accelerator_templ_t<cff1_private_dict_opset_subset_t, cff1_private_dict_values_subset_t>
+  {
+    accelerator_subset_t (hb_face_t *face) : SUPER (face) {}
+    ~accelerator_subset_t ()
+    {
+      if (cff_accelerator)
+	cff_subset_accelerator_t::destroy (cff_accelerator);
+    }
 
-  bool subset (hb_subset_context_t *c) const { return hb_subset_cff1 (c); }
+    HB_INTERNAL bool subset (hb_subset_context_t *c) const;
+    HB_INTERNAL bool serialize (hb_serialize_context_t *c,
+				struct cff1_subset_plan &plan) const;
+    HB_INTERNAL bool get_seac_components (hb_codepoint_t glyph, hb_codepoint_t *base, hb_codepoint_t *accent) const;
+
+    mutable CFF::cff_subset_accelerator_t* cff_accelerator = nullptr;
+
+    typedef accelerator_templ_t<cff1_private_dict_opset_subset_t, cff1_private_dict_values_subset_t> SUPER;
+  };
 
   protected:
   HB_INTERNAL static hb_codepoint_t lookup_standard_encoding_for_code (hb_codepoint_t sid);
@@ -1479,6 +1531,10 @@ struct cff1_accelerator_t : cff1::accele
   cff1_accelerator_t (hb_face_t *face) : cff1::accelerator_t (face) {}
 };
 
+struct cff1_subset_accelerator_t : cff1::accelerator_subset_t {
+  cff1_subset_accelerator_t (hb_face_t *face) : cff1::accelerator_subset_t (face) {}
+};
+
 } /* namespace OT */
 
 #endif /* HB_OT_CFF1_TABLE_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -28,7 +28,7 @@
 #define HB_OT_CFF2_TABLE_HH
 
 #include "hb-ot-cff-common.hh"
-#include "hb-subset-cff2.hh"
+#include "hb-subset-cff-common.hh"
 #include "hb-draw.hh"
 #include "hb-paint.hh"
 
@@ -38,10 +38,9 @@ namespace CFF {
  * CFF2 -- Compact Font Format (CFF) Version 2
  * https://docs.microsoft.com/en-us/typography/opentype/spec/cff2
  */
-#define HB_OT_TAG_cff2 HB_TAG('C','F','F','2')
+#define HB_OT_TAG_CFF2 HB_TAG('C','F','F','2')
 
 typedef CFFIndex<HBUINT32>  CFF2Index;
-template <typename Type> struct CFF2IndexOf : CFFIndexOf<HBUINT32, Type> {};
 
 typedef CFF2Index         CFF2CharStrings;
 typedef Subrs<HBUINT32>   CFF2Subrs;
@@ -91,6 +90,7 @@ struct CFF2FDSelect
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this)))
       return_trace (false);
+    hb_barrier ();
 
     switch (format)
     {
@@ -111,19 +111,22 @@ struct CFF2FDSelect
   DEFINE_SIZE_MIN (2);
 };
 
-struct CFF2VariationStore
+struct CFF2ItemVariationStore
 {
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (likely (c->check_struct (this)) && c->check_range (&varStore, size) && varStore.sanitize (c));
+    return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
+		  c->check_range (&varStore, size) &&
+		  varStore.sanitize (c));
   }
 
-  bool serialize (hb_serialize_context_t *c, const CFF2VariationStore *varStore)
+  bool serialize (hb_serialize_context_t *c, const CFF2ItemVariationStore *varStore)
   {
     TRACE_SERIALIZE (this);
     unsigned int size_ = varStore->get_size ();
-    CFF2VariationStore *dest = c->allocate_size<CFF2VariationStore> (size_);
+    CFF2ItemVariationStore *dest = c->allocate_size<CFF2ItemVariationStore> (size_);
     if (unlikely (!dest)) return_trace (false);
     hb_memcpy (dest, varStore, size_);
     return_trace (true);
@@ -132,9 +135,9 @@ struct CFF2VariationStore
   unsigned int get_size () const { return HBUINT16::static_size + size; }
 
   HBUINT16	size;
-  VariationStore  varStore;
+  ItemVariationStore  varStore;
 
-  DEFINE_SIZE_MIN (2 + VariationStore::min_size);
+  DEFINE_SIZE_MIN (2 + ItemVariationStore::min_size);
 };
 
 struct cff2_top_dict_values_t : top_dict_values_t<>
@@ -147,8 +150,8 @@ struct cff2_top_dict_values_t : top_dict
   }
   void fini () { top_dict_values_t<>::fini (); }
 
-  unsigned int  vstoreOffset;
-  unsigned int  FDSelectOffset;
+  int  vstoreOffset;
+  int  FDSelectOffset;
 };
 
 struct cff2_top_dict_opset_t : top_dict_opset_t<>
@@ -166,11 +169,11 @@ struct cff2_top_dict_opset_t : top_dict_
 	break;
 
       case OpCode_vstore:
-	dictval.vstoreOffset = env.argStack.pop_uint ();
+	dictval.vstoreOffset = env.argStack.pop_int ();
 	env.clear_args ();
 	break;
       case OpCode_FDSelect:
-	dictval.FDSelectOffset = env.argStack.pop_uint ();
+	dictval.FDSelectOffset = env.argStack.pop_int ();
 	env.clear_args ();
 	break;
 
@@ -238,7 +241,7 @@ struct cff2_private_dict_values_base_t :
   }
   void fini () { dict_values_t<VAL>::fini (); }
 
-  unsigned int      subrsOffset;
+  int                subrsOffset;
   const CFF2Subrs   *localSubrs;
   unsigned int      ivs;
 };
@@ -292,7 +295,7 @@ struct cff2_private_dict_opset_t : dict_
 	env.clear_args ();
 	break;
       case OpCode_Subrs:
-	dictval.subrsOffset = env.argStack.pop_uint ();
+	dictval.subrsOffset = env.argStack.pop_int ();
 	env.clear_args ();
 	break;
       case OpCode_vsindexdict:
@@ -341,7 +344,7 @@ struct cff2_private_dict_opset_subset_t
 	return;
 
       case OpCode_Subrs:
-	dictval.subrsOffset = env.argStack.pop_uint ();
+	dictval.subrsOffset = env.argStack.pop_int ();
 	env.clear_args ();
 	break;
 
@@ -379,20 +382,25 @@ using namespace CFF;
 
 struct cff2
 {
-  static constexpr hb_tag_t tableTag = HB_OT_TAG_cff2;
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_CFF2;
 
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  likely (version.major == 2));
   }
 
   template <typename PRIVOPSET, typename PRIVDICTVAL>
   struct accelerator_templ_t
   {
+    static constexpr hb_tag_t tableTag = cff2::tableTag;
+
     accelerator_templ_t (hb_face_t *face)
     {
+      if (!face) return;
+
       topDict.init ();
       fontDicts.init ();
       privateDicts.init ();
@@ -411,23 +419,22 @@ struct cff2
       { /* parse top dict */
 	hb_ubytes_t topDictStr = (cff2 + cff2->topDict).as_ubytes (cff2->topDictSize);
 	if (unlikely (!topDictStr.sanitize (&sc))) goto fail;
+	hb_barrier ();
 	num_interp_env_t env (topDictStr);
 	cff2_top_dict_interpreter_t top_interp (env);
 	topDict.init ();
 	if (unlikely (!top_interp.interpret (topDict))) goto fail;
       }
 
-      globalSubrs = &StructAtOffset<CFF2Subrs> (cff2, cff2->topDict + cff2->topDictSize);
-      varStore = &StructAtOffsetOrNull<CFF2VariationStore> (cff2, topDict.vstoreOffset);
-      charStrings = &StructAtOffsetOrNull<CFF2CharStrings> (cff2, topDict.charStringsOffset);
-      fdArray = &StructAtOffsetOrNull<CFF2FDArray> (cff2, topDict.FDArrayOffset);
-      fdSelect = &StructAtOffsetOrNull<CFF2FDSelect> (cff2, topDict.FDSelectOffset);
-
-      if (((varStore != &Null (CFF2VariationStore)) && unlikely (!varStore->sanitize (&sc))) ||
-	  (charStrings == &Null (CFF2CharStrings)) || unlikely (!charStrings->sanitize (&sc)) ||
-	  (globalSubrs == &Null (CFF2Subrs)) || unlikely (!globalSubrs->sanitize (&sc)) ||
-	  (fdArray == &Null (CFF2FDArray)) || unlikely (!fdArray->sanitize (&sc)) ||
-	  (((fdSelect != &Null (CFF2FDSelect)) && unlikely (!fdSelect->sanitize (&sc, fdArray->count)))))
+      globalSubrs = &StructAtOffsetOrNull<CFF2Subrs> (cff2, cff2->topDict + cff2->topDictSize, sc);
+      varStore = &StructAtOffsetOrNull<CFF2ItemVariationStore> (cff2, topDict.vstoreOffset, sc);
+      charStrings = &StructAtOffsetOrNull<CFF2CharStrings> (cff2, topDict.charStringsOffset, sc);
+      fdArray = &StructAtOffsetOrNull<CFF2FDArray> (cff2, topDict.FDArrayOffset, sc);
+      fdSelect = &StructAtOffsetOrNull<CFF2FDSelect> (cff2, topDict.FDSelectOffset, sc, fdArray->count);
+
+      if (charStrings == &Null (CFF2CharStrings) ||
+	  globalSubrs == &Null (CFF2Subrs) ||
+	  fdArray == &Null (CFF2FDArray))
         goto fail;
 
       num_glyphs = charStrings->count;
@@ -443,6 +450,7 @@ struct cff2
       {
 	const hb_ubytes_t fontDictStr = (*fdArray)[i];
 	if (unlikely (!fontDictStr.sanitize (&sc))) goto fail;
+	hb_barrier ();
 	cff2_font_dict_values_t  *font;
 	num_interp_env_t env (fontDictStr);
 	cff2_font_dict_interpreter_t font_interp (env);
@@ -451,20 +459,15 @@ struct cff2
 	font->init ();
 	if (unlikely (!font_interp.interpret (*font))) goto fail;
 
-	const hb_ubytes_t privDictStr = StructAtOffsetOrNull<UnsizedByteStr> (cff2, font->privateDictInfo.offset).as_ubytes (font->privateDictInfo.size);
-	if (unlikely (!privDictStr.sanitize (&sc))) goto fail;
+	const hb_ubytes_t privDictStr = StructAtOffsetOrNull<UnsizedByteStr> (cff2, font->privateDictInfo.offset, sc, font->privateDictInfo.size).as_ubytes (font->privateDictInfo.size);
 	cff2_priv_dict_interp_env_t env2 (privDictStr);
 	dict_interpreter_t<PRIVOPSET, PRIVDICTVAL, cff2_priv_dict_interp_env_t> priv_interp (env2);
 	privateDicts[i].init ();
 	if (unlikely (!priv_interp.interpret (privateDicts[i]))) goto fail;
 
-	privateDicts[i].localSubrs = &StructAtOffsetOrNull<CFF2Subrs> (&privDictStr[0], privateDicts[i].subrsOffset);
-	if (privateDicts[i].localSubrs != &Null (CFF2Subrs) &&
-	  unlikely (!privateDicts[i].localSubrs->sanitize (&sc)))
-	  goto fail;
+	privateDicts[i].localSubrs = &StructAtOffsetOrNull<CFF2Subrs> (&privDictStr[0], privateDicts[i].subrsOffset, sc);
       }
 
-
       return;
 
       fail:
@@ -481,11 +484,13 @@ struct cff2
       blob = nullptr;
     }
 
-    hb_map_t *create_glyph_to_sid_map () const
+    hb_vector_t<uint16_t> *create_glyph_to_sid_map () const
     {
       return nullptr;
     }
 
+    hb_blob_t *get_blob () const { return blob; }
+
     bool is_valid () const { return blob; }
 
     protected:
@@ -495,7 +500,7 @@ struct cff2
     hb_blob_t			*blob = nullptr;
     cff2_top_dict_values_t	topDict;
     const CFF2Subrs		*globalSubrs = nullptr;
-    const CFF2VariationStore	*varStore = nullptr;
+    const CFF2ItemVariationStore	*varStore = nullptr;
     const CFF2CharStrings	*charStrings = nullptr;
     const CFF2FDArray		*fdArray = nullptr;
     const CFF2FDSelect		*fdSelect = nullptr;
@@ -518,9 +523,24 @@ struct cff2
     HB_INTERNAL bool get_path (hb_font_t *font, hb_codepoint_t glyph, hb_draw_session_t &draw_session) const;
   };
 
-  typedef accelerator_templ_t<cff2_private_dict_opset_subset_t, cff2_private_dict_values_subset_t> accelerator_subset_t;
+  struct accelerator_subset_t : accelerator_templ_t<cff2_private_dict_opset_subset_t, cff2_private_dict_values_subset_t>
+  {
+    accelerator_subset_t (hb_face_t *face) : SUPER (face) {}
+    ~accelerator_subset_t ()
+    {
+      if (cff_accelerator)
+	cff_subset_accelerator_t::destroy (cff_accelerator);
+    }
+
+    HB_INTERNAL bool subset (hb_subset_context_t *c) const;
+    HB_INTERNAL bool serialize (hb_serialize_context_t *c,
+				struct cff2_subset_plan &plan,
+				hb_array_t<int> normalized_coords) const;
+
+    mutable CFF::cff_subset_accelerator_t* cff_accelerator = nullptr;
 
-  bool subset (hb_subset_context_t *c) const { return hb_subset_cff2 (c); }
+    typedef accelerator_templ_t<cff2_private_dict_opset_subset_t, cff2_private_dict_values_subset_t> SUPER;
+  };
 
   public:
   FixedVersion<HBUINT8>		version;	/* Version of CFF2 table. set to 0x0200u */
@@ -535,6 +555,10 @@ struct cff2_accelerator_t : cff2::accele
   cff2_accelerator_t (hb_face_t *face) : cff2::accelerator_t (face) {}
 };
 
+struct cff2_subset_accelerator_t : cff2::accelerator_subset_t {
+  cff2_subset_accelerator_t (hb_face_t *face) : cff2::accelerator_subset_t (face) {}
+};
+
 } /* namespace OT */
 
 #endif /* HB_OT_CFF2_TABLE_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-cmap-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-cmap-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-cmap-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-cmap-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -41,6 +41,30 @@
 
 namespace OT {
 
+static inline uint8_t unicode_to_macroman (hb_codepoint_t u)
+{
+  uint16_t mapping[] = {
+    0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x00D1, 0x00D6, 0x00DC, 0x00E1,
+    0x00E0, 0x00E2, 0x00E4, 0x00E3, 0x00E5, 0x00E7, 0x00E9, 0x00E8,
+    0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF, 0x00F1, 0x00F3,
+    0x00F2, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x00F9, 0x00FB, 0x00FC,
+    0x2020, 0x00B0, 0x00A2, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x00DF,
+    0x00AE, 0x00A9, 0x2122, 0x00B4, 0x00A8, 0x2260, 0x00C6, 0x00D8,
+    0x221E, 0x00B1, 0x2264, 0x2265, 0x00A5, 0x00B5, 0x2202, 0x2211,
+    0x220F, 0x03C0, 0x222B, 0x00AA, 0x00BA, 0x03A9, 0x00E6, 0x00F8,
+    0x00BF, 0x00A1, 0x00AC, 0x221A, 0x0192, 0x2248, 0x2206, 0x00AB,
+    0x00BB, 0x2026, 0x00A0, 0x00C0, 0x00C3, 0x00D5, 0x0152, 0x0153,
+    0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x25CA,
+    0x00FF, 0x0178, 0x2044, 0x20AC, 0x2039, 0x203A, 0xFB01, 0xFB02,
+    0x2021, 0x00B7, 0x201A, 0x201E, 0x2030, 0x00C2, 0x00CA, 0x00C1,
+    0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, 0x00CC, 0x00D3, 0x00D4,
+    0xF8FF, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0x0131, 0x02C6, 0x02DC,
+    0x00AF, 0x02D8, 0x02D9, 0x02DA, 0x00B8, 0x02DD, 0x02DB, 0x02C7
+  };
+  uint16_t *c = hb_bsearch (u, mapping, ARRAY_LENGTH (mapping), sizeof (mapping[0]),
+			    _hb_cmp_operator<uint16_t, uint16_t>);
+  return c ? (c - mapping) + 0x7F : 0;
+}
 
 struct CmapSubtableFormat0
 {
@@ -277,10 +301,10 @@ struct CmapSubtableFormat4
       }
     } writer(c);
 
-    writer.end_code_ = c->allocate_size<HBUINT16> (HBUINT16::static_size * segcount);
-    c->allocate_size<HBUINT16> (2); // padding
-    writer.start_code_ = c->allocate_size<HBUINT16> (HBUINT16::static_size * segcount);
-    writer.id_delta_ = c->allocate_size<HBINT16> (HBINT16::static_size * segcount);
+    writer.end_code_ = c->allocate_size<HBUINT16> (HBUINT16::static_size * segcount, false);
+    (void) c->allocate_size<HBUINT16> (2); // padding
+    writer.start_code_ = c->allocate_size<HBUINT16> (HBUINT16::static_size * segcount, false);
+    writer.id_delta_ = c->allocate_size<HBINT16> (HBINT16::static_size * segcount, false);
 
     if (unlikely (!writer.end_code_ || !writer.start_code_ || !writer.id_delta_)) return false;
 
@@ -325,7 +349,7 @@ struct CmapSubtableFormat4
   {
     auto format4_iter =
     + it
-    | hb_filter ([&] (const hb_pair_t<hb_codepoint_t, hb_codepoint_t> _)
+    | hb_filter ([&] (const hb_codepoint_pair_t _)
 		 { return _.first <= 0xFFFF; })
     ;
 
@@ -335,7 +359,7 @@ struct CmapSubtableFormat4
     if (unlikely (!c->extend_min (this))) return;
     this->format = 4;
 
-    hb_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> cp_to_gid {
+    hb_vector_t<hb_codepoint_pair_t> cp_to_gid {
       format4_iter
     };
 
@@ -556,6 +580,7 @@ struct CmapSubtableFormat4
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this)))
       return_trace (false);
+    hb_barrier ();
 
     if (unlikely (!c->check_range (this, length)))
     {
@@ -742,10 +767,11 @@ struct CmapSubtableLongSegmented
 			unsigned num_glyphs) const
   {
     hb_codepoint_t last_end = 0;
-    for (unsigned i = 0; i < this->groups.len; i++)
+    unsigned count = this->groups.len;
+    for (unsigned i = 0; i < count; i++)
     {
-      hb_codepoint_t start = this->groups[i].startCharCode;
-      hb_codepoint_t end = hb_min ((hb_codepoint_t) this->groups[i].endCharCode,
+      hb_codepoint_t start = this->groups.arrayZ[i].startCharCode;
+      hb_codepoint_t end = hb_min ((hb_codepoint_t) this->groups.arrayZ[i].endCharCode,
 				   (hb_codepoint_t) HB_UNICODE_MAX);
       if (unlikely (start > end || start < last_end)) {
         // Range is not in order and is invalid, skip it.
@@ -754,11 +780,10 @@ struct CmapSubtableLongSegmented
       last_end = end;
 
 
-      hb_codepoint_t gid = this->groups[i].glyphID;
+      hb_codepoint_t gid = this->groups.arrayZ[i].glyphID;
       if (!gid)
       {
-	/* Intention is: if (hb_is_same (T, CmapSubtableFormat13)) continue; */
-	if (! T::group_get_glyph (this->groups[i], end)) continue;
+        if (T::formatNumber == 13) continue;
 	start++;
 	gid++;
       }
@@ -766,11 +791,13 @@ struct CmapSubtableLongSegmented
       if (unlikely ((unsigned int) (gid + end - start) >= num_glyphs))
 	end = start + (hb_codepoint_t) num_glyphs - gid;
 
+      mapping->alloc (mapping->get_population () + end - start + 1);
+
+      unicodes->add_range (start, end);
       for (unsigned cp = start; cp <= end; cp++)
       {
-	unicodes->add (cp);
 	mapping->set (cp, gid);
-	gid++;
+        gid += T::increment;
       }
     }
   }
@@ -794,6 +821,9 @@ struct CmapSubtableLongSegmented
 
 struct CmapSubtableFormat12 : CmapSubtableLongSegmented<CmapSubtableFormat12>
 {
+  static constexpr int increment = 1;
+  static constexpr int formatNumber = 12;
+
   static hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group,
 					 hb_codepoint_t u)
   { return likely (group.startCharCode <= group.endCharCode) ?
@@ -866,6 +896,9 @@ struct CmapSubtableFormat12 : CmapSubtab
 
 struct CmapSubtableFormat13 : CmapSubtableLongSegmented<CmapSubtableFormat13>
 {
+  static constexpr int increment = 0;
+  static constexpr int formatNumber = 13;
+
   static hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group,
 					 hb_codepoint_t u HB_UNUSED)
   { return group.glyphID; }
@@ -917,8 +950,7 @@ struct DefaultUVS : SortedArray32Of<Unic
   DefaultUVS* copy (hb_serialize_context_t *c,
 		    const hb_set_t *unicodes) const
   {
-    DefaultUVS *out = c->start_embed<DefaultUVS> ();
-    if (unlikely (!out)) return nullptr;
+    auto *out = c->start_embed<DefaultUVS> ();
     auto snap = c->snapshot ();
 
     HBUINT32 len;
@@ -931,8 +963,7 @@ struct DefaultUVS : SortedArray32Of<Unic
       hb_codepoint_t start = HB_SET_VALUE_INVALID;
       hb_codepoint_t end = HB_SET_VALUE_INVALID;
 
-      for (hb_codepoint_t u = HB_SET_VALUE_INVALID;
-	   unicodes->next (&u);)
+      for (auto u : *unicodes)
       {
         if (!as_array ().bsearch (u))
 	  continue;
@@ -1067,9 +1098,7 @@ struct NonDefaultUVS : SortedArray32Of<U
 		       const hb_set_t *glyphs_requested,
 		       const hb_map_t *glyph_map) const
   {
-    NonDefaultUVS *out = c->start_embed<NonDefaultUVS> ();
-    if (unlikely (!out)) return nullptr;
-
+    auto *out = c->start_embed<NonDefaultUVS> ();
     auto it =
     + as_array ()
     | hb_filter ([&] (const UVSMapping& _)
@@ -1424,6 +1453,7 @@ struct CmapSubtable
   {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return_trace (false);
+    hb_barrier ();
     switch (u.format) {
     case  0: return_trace (u.format0 .sanitize (c));
     case  4: return_trace (u.format4 .sanitize (c));
@@ -1459,8 +1489,11 @@ struct EncodingRecord
     int ret;
     ret = platformID.cmp (other.platformID);
     if (ret) return ret;
-    ret = encodingID.cmp (other.encodingID);
-    if (ret) return ret;
+    if (other.encodingID != 0xFFFF)
+    {
+      ret = encodingID.cmp (other.encodingID);
+      if (ret) return ret;
+    }
     return 0;
   }
 
@@ -1767,7 +1800,6 @@ struct cmap
     TRACE_SUBSET (this);
 
     cmap *cmap_prime = c->serializer->start_embed<cmap> ();
-    if (unlikely (!c->serializer->check_success (cmap_prime))) return_trace (false);
 
     auto encodingrec_iter =
     + hb_iter (encodingRecord)
@@ -1798,7 +1830,7 @@ struct cmap
 
     auto it =
     + c->plan->unicode_to_new_gid_list.iter ()
-    | hb_filter ([&] (const hb_pair_t<hb_codepoint_t, hb_codepoint_t> _)
+    | hb_filter ([&] (const hb_codepoint_pair_t _)
 		 { return (_.second != HB_MAP_VALUE_INVALID); })
     ;
 
@@ -1809,9 +1841,13 @@ struct cmap
                                          c->plan));
   }
 
-  const CmapSubtable *find_best_subtable (bool *symbol = nullptr) const
+  const CmapSubtable *find_best_subtable (bool *symbol = nullptr,
+					  bool *mac = nullptr,
+					  bool *macroman = nullptr) const
   {
     if (symbol) *symbol = false;
+    if (mac) *mac = false;
+    if (macroman) *macroman = false;
 
     const CmapSubtable *subtable;
 
@@ -1836,6 +1872,20 @@ struct cmap
     if ((subtable = this->find_subtable (0, 1))) return subtable;
     if ((subtable = this->find_subtable (0, 0))) return subtable;
 
+    /* MacRoman subtable. */
+    if ((subtable = this->find_subtable (1, 0)))
+    {
+      if (mac) *mac = true;
+      if (macroman) *macroman = true;
+      return subtable;
+    }
+    /* Any other Mac subtable; we just map ASCII for these. */
+    if ((subtable = this->find_subtable (1, 0xFFFF)))
+    {
+      if (mac) *mac = true;
+      return subtable;
+    }
+
     /* Meh. */
     return &Null (CmapSubtable);
   }
@@ -1847,8 +1897,8 @@ struct cmap
     accelerator_t (hb_face_t *face)
     {
       this->table = hb_sanitize_context_t ().reference_table<cmap> (face);
-      bool symbol;
-      this->subtable = table->find_best_subtable (&symbol);
+      bool symbol, mac, macroman;
+      this->subtable = table->find_best_subtable (&symbol, &mac, &macroman);
       this->subtable_uvs = &Null (CmapSubtableFormat14);
       {
 	const CmapSubtable *st = table->find_subtable (0, 5);
@@ -1857,6 +1907,7 @@ struct cmap
       }
 
       this->get_glyph_data = subtable;
+#ifndef HB_NO_CMAP_LEGACY_SUBTABLES
       if (unlikely (symbol))
       {
 	switch ((unsigned) face->table.OS2->get_font_page ()) {
@@ -1876,7 +1927,16 @@ struct cmap
 	  break;
 	}
       }
+      else if (unlikely (macroman))
+      {
+	this->get_glyph_funcZ = get_glyph_from_macroman<CmapSubtable>;
+      }
+      else if (unlikely (mac))
+      {
+	this->get_glyph_funcZ = get_glyph_from_ascii<CmapSubtable>;
+      }
       else
+#endif
       {
 	switch (subtable->u.format) {
 	/* Accelerate format 4 and format 12. */
@@ -1919,7 +1979,7 @@ struct cmap
 			    hb_codepoint_t *glyph,
 			    cache_t *cache = nullptr) const
     {
-      if (unlikely (!this->get_glyph_funcZ)) return 0;
+      if (unlikely (!this->get_glyph_funcZ)) return false;
       return _cached_get (unicode, glyph, cache);
     }
 
@@ -2001,6 +2061,28 @@ struct cmap
       return false;
     }
 
+    template <typename Type>
+    HB_INTERNAL static bool get_glyph_from_ascii (const void *obj,
+						  hb_codepoint_t codepoint,
+						  hb_codepoint_t *glyph)
+    {
+      const Type *typed_obj = (const Type *) obj;
+      return codepoint < 0x80 && typed_obj->get_glyph (codepoint, glyph);
+    }
+
+    template <typename Type>
+    HB_INTERNAL static bool get_glyph_from_macroman (const void *obj,
+						     hb_codepoint_t codepoint,
+						     hb_codepoint_t *glyph)
+    {
+      if (get_glyph_from_ascii<Type> (obj, codepoint, glyph))
+	return true;
+
+      const Type *typed_obj = (const Type *) obj;
+      unsigned c = unicode_to_macroman (codepoint);
+      return c && typed_obj->get_glyph (c, glyph);
+    }
+
     private:
     hb_nonnull_ptr_t<const CmapSubtable> subtable;
     hb_nonnull_ptr_t<const CmapSubtableFormat14> subtable_uvs;
@@ -2030,34 +2112,13 @@ struct cmap
     return &(this+result.subtable);
   }
 
-  const EncodingRecord *find_encodingrec (unsigned int platform_id,
-					  unsigned int encoding_id) const
-  {
-    EncodingRecord key;
-    key.platformID = platform_id;
-    key.encodingID = encoding_id;
-
-    return encodingRecord.as_array ().bsearch (key);
-  }
-
-  bool find_subtable (unsigned format) const
-  {
-    auto it =
-    + hb_iter (encodingRecord)
-    | hb_map (&EncodingRecord::subtable)
-    | hb_map (hb_add (this))
-    | hb_filter ([&] (const CmapSubtable& _) { return _.u.format == format; })
-    ;
-
-    return it.len ();
-  }
-
   public:
 
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  likely (version == 0) &&
 		  encodingRecord.sanitize (c, this));
   }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc	2024-11-20 13:56:33.000000000 +0000
@@ -38,8 +38,8 @@
 
 #include "hb-ot-cmap-table.hh"
 #include "hb-ot-glyf-table.hh"
-#include "hb-ot-cff1-table.hh"
 #include "hb-ot-cff2-table.hh"
+#include "hb-ot-cff1-table.hh"
 #include "hb-ot-hmtx-table.hh"
 #include "hb-ot-post-table.hh"
 #include "hb-ot-stat-table.hh" // Just so we compile it; unused otherwise.
@@ -64,13 +64,17 @@
 using hb_ot_font_cmap_cache_t    = hb_cache_t<21, 16, 8, true>;
 using hb_ot_font_advance_cache_t = hb_cache_t<24, 16, 8, true>;
 
+#ifndef HB_NO_OT_FONT_CMAP_CACHE
 static hb_user_data_key_t hb_ot_font_cmap_cache_user_data_key;
+#endif
 
 struct hb_ot_font_t
 {
   const hb_ot_face_t *ot_face;
 
+#ifndef HB_NO_OT_FONT_CMAP_CACHE
   hb_ot_font_cmap_cache_t *cmap_cache;
+#endif
 
   /* h_advance caching */
   mutable hb_atomic_int_t cached_coords_serial;
@@ -86,6 +90,7 @@ _hb_ot_font_create (hb_font_t *font)
 
   ot_font->ot_face = &font->face->table;
 
+#ifndef HB_NO_OT_FONT_CMAP_CACHE
   // retry:
   auto *cmap_cache  = (hb_ot_font_cmap_cache_t *) hb_face_get_user_data (font->face,
 									 &hb_ot_font_cmap_cache_user_data_key);
@@ -93,7 +98,7 @@ _hb_ot_font_create (hb_font_t *font)
   {
     cmap_cache = (hb_ot_font_cmap_cache_t *) hb_malloc (sizeof (hb_ot_font_cmap_cache_t));
     if (unlikely (!cmap_cache)) goto out;
-    cmap_cache->init ();
+    new (cmap_cache) hb_ot_font_cmap_cache_t ();
     if (unlikely (!hb_face_set_user_data (font->face,
 					  &hb_ot_font_cmap_cache_user_data_key,
 					  cmap_cache,
@@ -112,6 +117,7 @@ _hb_ot_font_create (hb_font_t *font)
   }
   out:
   ot_font->cmap_cache = cmap_cache;
+#endif
 
   return ot_font;
 }
@@ -136,7 +142,11 @@ hb_ot_get_nominal_glyph (hb_font_t *font
 {
   const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
   const hb_ot_face_t *ot_face = ot_font->ot_face;
-  return ot_face->cmap->get_nominal_glyph (unicode, glyph, ot_font->cmap_cache);
+  hb_ot_font_cmap_cache_t *cmap_cache = nullptr;
+#ifndef HB_NO_OT_FONT_CMAP_CACHE
+  cmap_cache = ot_font->cmap_cache;
+#endif
+  return ot_face->cmap->get_nominal_glyph (unicode, glyph, cmap_cache);
 }
 
 static unsigned int
@@ -151,10 +161,14 @@ hb_ot_get_nominal_glyphs (hb_font_t *fon
 {
   const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
   const hb_ot_face_t *ot_face = ot_font->ot_face;
+  hb_ot_font_cmap_cache_t *cmap_cache = nullptr;
+#ifndef HB_NO_OT_FONT_CMAP_CACHE
+  cmap_cache = ot_font->cmap_cache;
+#endif
   return ot_face->cmap->get_nominal_glyphs (count,
 					    first_unicode, unicode_stride,
 					    first_glyph, glyph_stride,
-					    ot_font->cmap_cache);
+					    cmap_cache);
 }
 
 static hb_bool_t
@@ -167,9 +181,13 @@ hb_ot_get_variation_glyph (hb_font_t *fo
 {
   const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
   const hb_ot_face_t *ot_face = ot_font->ot_face;
+  hb_ot_font_cmap_cache_t *cmap_cache = nullptr;
+#ifndef HB_NO_OT_FONT_CMAP_CACHE
+  cmap_cache = ot_font->cmap_cache;
+#endif
   return ot_face->cmap->get_variation_glyph (unicode,
                                              variation_selector, glyph,
-                                             ot_font->cmap_cache);
+                                             cmap_cache);
 }
 
 static void
@@ -188,14 +206,14 @@ hb_ot_get_glyph_h_advances (hb_font_t* f
 
   hb_position_t *orig_first_advance = first_advance;
 
-#ifndef HB_NO_VAR
+#if !defined(HB_NO_VAR) && !defined(HB_NO_OT_FONT_ADVANCE_CACHE)
   const OT::HVAR &HVAR = *hmtx.var_table;
-  const OT::VariationStore &varStore = &HVAR + HVAR.varStore;
-  OT::VariationStore::cache_t *varStore_cache = font->num_coords * count >= 128 ? varStore.create_cache () : nullptr;
+  const OT::ItemVariationStore &varStore = &HVAR + HVAR.varStore;
+  OT::ItemVariationStore::cache_t *varStore_cache = font->num_coords * count >= 128 ? varStore.create_cache () : nullptr;
 
   bool use_cache = font->num_coords;
 #else
-  OT::VariationStore::cache_t *varStore_cache = nullptr;
+  OT::ItemVariationStore::cache_t *varStore_cache = nullptr;
   bool use_cache = false;
 #endif
 
@@ -212,8 +230,8 @@ hb_ot_get_glyph_h_advances (hb_font_t* f
 	use_cache = false;
 	goto out;
       }
+      new (cache) hb_ot_font_advance_cache_t;
 
-      cache->init ();
       if (unlikely (!ot_font->advance_cache.cmpexch (nullptr, cache)))
       {
 	hb_free (cache);
@@ -237,7 +255,7 @@ hb_ot_get_glyph_h_advances (hb_font_t* f
   { /* Use cache. */
     if (ot_font->cached_coords_serial.get_acquire () != (int) font->serial_coords)
     {
-      ot_font->advance_cache->init ();
+      ot_font->advance_cache->clear ();
       ot_font->cached_coords_serial.set_release (font->serial_coords);
     }
 
@@ -258,8 +276,8 @@ hb_ot_get_glyph_h_advances (hb_font_t* f
     }
   }
 
-#ifndef HB_NO_VAR
-  OT::VariationStore::destroy_cache (varStore_cache);
+#if !defined(HB_NO_VAR) && !defined(HB_NO_OT_FONT_ADVANCE_CACHE)
+  OT::ItemVariationStore::destroy_cache (varStore_cache);
 #endif
 
   if (font->x_strength && !font->embolden_in_place)
@@ -293,12 +311,12 @@ hb_ot_get_glyph_v_advances (hb_font_t* f
 
   if (vmtx.has_data ())
   {
-#ifndef HB_NO_VAR
+#if !defined(HB_NO_VAR) && !defined(HB_NO_OT_FONT_ADVANCE_CACHE)
     const OT::VVAR &VVAR = *vmtx.var_table;
-    const OT::VariationStore &varStore = &VVAR + VVAR.varStore;
-    OT::VariationStore::cache_t *varStore_cache = font->num_coords ? varStore.create_cache () : nullptr;
+    const OT::ItemVariationStore &varStore = &VVAR + VVAR.varStore;
+    OT::ItemVariationStore::cache_t *varStore_cache = font->num_coords ? varStore.create_cache () : nullptr;
 #else
-    OT::VariationStore::cache_t *varStore_cache = nullptr;
+    OT::ItemVariationStore::cache_t *varStore_cache = nullptr;
 #endif
 
     for (unsigned int i = 0; i < count; i++)
@@ -308,8 +326,8 @@ hb_ot_get_glyph_v_advances (hb_font_t* f
       first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
     }
 
-#ifndef HB_NO_VAR
-    OT::VariationStore::destroy_cache (varStore_cache);
+#if !defined(HB_NO_VAR) && !defined(HB_NO_OT_FONT_ADVANCE_CACHE)
+    OT::ItemVariationStore::destroy_cache (varStore_cache);
 #endif
   }
   else
@@ -418,8 +436,8 @@ hb_ot_get_glyph_extents (hb_font_t *font
 #endif
   if (ot_face->glyf->get_extents (font, glyph, extents)) return true;
 #ifndef HB_NO_OT_FONT_CFF
-  if (ot_face->cff1->get_extents (font, glyph, extents)) return true;
   if (ot_face->cff2->get_extents (font, glyph, extents)) return true;
+  if (ot_face->cff1->get_extents (font, glyph, extents)) return true;
 #endif
 
   return false;
@@ -507,8 +525,8 @@ hb_ot_draw_glyph (hb_font_t *font,
 				    embolden ? &outline : draw_data, font->slant_xy);
     if (!font->face->table.glyf->get_path (font, glyph, draw_session))
 #ifndef HB_NO_CFF
-    if (!font->face->table.cff1->get_path (font, glyph, draw_session))
     if (!font->face->table.cff2->get_path (font, glyph, draw_session))
+    if (!font->face->table.cff1->get_path (font, glyph, draw_session))
 #endif
     {}
   }
@@ -547,8 +565,8 @@ hb_ot_paint_glyph (hb_font_t *font,
 #endif
   if (font->face->table.glyf->paint_glyph (font, glyph, paint_funcs, paint_data, foreground)) return;
 #ifndef HB_NO_CFF
-  if (font->face->table.cff1->paint_glyph (font, glyph, paint_funcs, paint_data, foreground)) return;
   if (font->face->table.cff2->paint_glyph (font, glyph, paint_funcs, paint_data, foreground)) return;
+  if (font->face->table.cff1->paint_glyph (font, glyph, paint_funcs, paint_data, foreground)) return;
 #endif
 }
 #endif
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-hdmx-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-hdmx-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-hdmx-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-hdmx-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -46,21 +46,23 @@ struct DeviceRecord
 
   template<typename Iterator,
 	   hb_requires (hb_is_iterator (Iterator))>
-  bool serialize (hb_serialize_context_t *c, unsigned pixelSize, Iterator it)
+  bool serialize (hb_serialize_context_t *c,
+		  unsigned pixelSize,
+		  Iterator it,
+		  const hb_vector_t<hb_codepoint_pair_t> new_to_old_gid_list,
+		  unsigned num_glyphs)
   {
     TRACE_SERIALIZE (this);
 
-    unsigned length = it.len ();
-
-    if (unlikely (!c->extend (this, length)))  return_trace (false);
+    if (unlikely (!c->extend (this, num_glyphs)))  return_trace (false);
 
     this->pixelSize = pixelSize;
     this->maxWidth =
     + it
     | hb_reduce (hb_max, 0u);
 
-    + it
-    | hb_sink (widthsZ.as_array (length));
+    for (auto &_ : new_to_old_gid_list)
+      widthsZ[_.first] = *it++;
 
     return_trace (true);
   }
@@ -69,6 +71,7 @@ struct DeviceRecord
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
 			  c->check_range (this, sizeDeviceRecord)));
   }
 
@@ -89,7 +92,11 @@ struct hdmx
 
   template<typename Iterator,
 	   hb_requires (hb_is_iterator (Iterator))>
-  bool serialize (hb_serialize_context_t *c, unsigned version, Iterator it)
+  bool serialize (hb_serialize_context_t *c,
+		  unsigned version,
+		  Iterator it,
+		  const hb_vector_t<hb_codepoint_pair_t> &new_to_old_gid_list,
+		  unsigned num_glyphs)
   {
     TRACE_SERIALIZE (this);
 
@@ -97,10 +104,10 @@ struct hdmx
 
     this->version = version;
     this->numRecords = it.len ();
-    this->sizeDeviceRecord = DeviceRecord::get_size (it ? (*it).second.len () : 0);
+    this->sizeDeviceRecord = DeviceRecord::get_size (num_glyphs);
 
     for (const hb_item_type<Iterator>& _ : +it)
-      c->start_embed<DeviceRecord> ()->serialize (c, _.first, _.second);
+      c->start_embed<DeviceRecord> ()->serialize (c, _.first, _.second, new_to_old_gid_list, num_glyphs);
 
     return_trace (c->successful ());
   }
@@ -110,31 +117,30 @@ struct hdmx
   {
     TRACE_SUBSET (this);
 
-    hdmx *hdmx_prime = c->serializer->start_embed <hdmx> ();
-    if (unlikely (!hdmx_prime)) return_trace (false);
+    auto *hdmx_prime = c->serializer->start_embed <hdmx> ();
 
+    unsigned num_input_glyphs = get_num_glyphs ();
     auto it =
     + hb_range ((unsigned) numRecords)
-    | hb_map ([c, this] (unsigned _)
+    | hb_map ([c, num_input_glyphs, this] (unsigned _)
 	{
 	  const DeviceRecord *device_record =
 	    &StructAtOffset<DeviceRecord> (&firstDeviceRecord,
 					   _ * sizeDeviceRecord);
 	  auto row =
-	    + hb_range (c->plan->num_output_glyphs ())
-	    | hb_map (c->plan->reverse_glyph_map)
-	    | hb_map ([this, c, device_record] (hb_codepoint_t _)
+	    + hb_iter (c->plan->new_to_old_gid_list)
+	    | hb_map ([num_input_glyphs, device_record] (hb_codepoint_pair_t _)
 		      {
-			if (c->plan->is_empty_glyph (_))
-			  return Null (HBUINT8);
-			return device_record->widthsZ.as_array (get_num_glyphs ()) [_];
+			return device_record->widthsZ.as_array (num_input_glyphs) [_.second];
 		      })
 	    ;
 	  return hb_pair ((unsigned) device_record->pixelSize, +row);
 	})
     ;
 
-    hdmx_prime->serialize (c->serializer, version, it);
+    hdmx_prime->serialize (c->serializer, version, it,
+			   c->plan->new_to_old_gid_list,
+			   c->plan->num_output_glyphs ());
     return_trace (true);
   }
 
@@ -147,6 +153,7 @@ struct hdmx
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  !hb_unsigned_mul_overflows (numRecords, sizeDeviceRecord) &&
                   min_size + numRecords * sizeDeviceRecord > numRecords * sizeDeviceRecord &&
 		  sizeDeviceRecord >= DeviceRecord::min_size &&
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-head-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-head-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-head-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-head-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -103,6 +103,7 @@ struct head
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  version.major == 1 &&
 		  magicNumber == 0x5F0F3CF5u);
   }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-hhea-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-hhea-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-hhea-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-hhea-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -50,7 +50,9 @@ struct _hea
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && likely (version.major == 1));
+    return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
+		  likely (version.major == 1));
   }
 
   public:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -83,7 +83,7 @@ struct hmtxvmtx
   bool subset_update_header (hb_subset_context_t *c,
 			     unsigned int num_hmetrics,
 			     const hb_hashmap_t<hb_codepoint_t, hb_pair_t<unsigned, int>> *mtx_map,
-			     const hb_map_t *bounds_map) const
+			     const hb_vector_t<unsigned> &bounds_vec) const
   {
     hb_blob_t *src_blob = hb_sanitize_context_t ().reference_table<H> (c->plan->source, H::tableTag);
     hb_blob_t *dest_blob = hb_blob_copy_writable_or_fail (src_blob);
@@ -114,6 +114,7 @@ struct hmtxvmtx
 	HB_ADD_MVAR_VAR (HB_OT_METRICS_TAG_VERTICAL_CARET_OFFSET,   caretOffset);
       }
 
+      bool empty = true;
       int min_lsb = 0x7FFF;
       int min_rsb = 0x7FFF;
       int max_extent = -0x7FFF;
@@ -125,9 +126,10 @@ struct hmtxvmtx
         int lsb = _.second.second;
         max_adv = hb_max (max_adv, adv);
 
-        if (bounds_map->has (gid))
+        if (bounds_vec[gid] != 0xFFFFFFFF)
         {
-          unsigned bound_width = bounds_map->get (gid);
+	  empty = false;
+          unsigned bound_width = bounds_vec[gid];
           int rsb = adv - lsb - bound_width;
           int extent = lsb + bound_width;
           min_lsb = hb_min (min_lsb, lsb);
@@ -137,12 +139,35 @@ struct hmtxvmtx
       }
 
       table->advanceMax = max_adv;
-      if (!bounds_map->is_empty ())
+      if (!empty)
       {
         table->minLeadingBearing = min_lsb;
         table->minTrailingBearing = min_rsb;
         table->maxExtent = max_extent;
       }
+
+      if (T::is_horizontal)
+      {
+        const auto &OS2 = *c->plan->source->table.OS2;
+        if (OS2.has_data () &&
+            table->ascender == OS2.sTypoAscender &&
+            table->descender == OS2.sTypoDescender &&
+            table->lineGap == OS2.sTypoLineGap)
+        {
+          table->ascender = static_cast<int> (roundf (OS2.sTypoAscender +
+                                                      MVAR.get_var (HB_OT_METRICS_TAG_HORIZONTAL_ASCENDER,
+                                                                    c->plan->normalized_coords.arrayZ,
+                                                                    c->plan->normalized_coords.length)));
+          table->descender = static_cast<int> (roundf (OS2.sTypoDescender +
+                                                       MVAR.get_var (HB_OT_METRICS_TAG_HORIZONTAL_DESCENDER,
+                                                                     c->plan->normalized_coords.arrayZ,
+                                                                     c->plan->normalized_coords.length)));
+          table->lineGap = static_cast<int> (roundf (OS2.sTypoLineGap +
+                                                     MVAR.get_var (HB_OT_METRICS_TAG_HORIZONTAL_LINE_GAP,
+                                                                   c->plan->normalized_coords.arrayZ,
+                                                                   c->plan->normalized_coords.length)));
+        }
+      }
     }
 #endif
 
@@ -156,32 +181,32 @@ struct hmtxvmtx
 	   hb_requires (hb_is_iterator (Iterator))>
   void serialize (hb_serialize_context_t *c,
 		  Iterator it,
-		  unsigned num_long_metrics)
+		  const hb_vector_t<hb_codepoint_pair_t> new_to_old_gid_list,
+		  unsigned num_long_metrics,
+                  unsigned total_num_metrics)
   {
-    unsigned idx = 0;
-    for (auto _ : it)
+    LongMetric* long_metrics = c->allocate_size<LongMetric> (num_long_metrics * LongMetric::static_size);
+    FWORD* short_metrics = c->allocate_size<FWORD> ((total_num_metrics - num_long_metrics) * FWORD::static_size);
+    if (!long_metrics || !short_metrics) return;
+
+    short_metrics -= num_long_metrics;
+
+    for (auto _ : new_to_old_gid_list)
     {
-      if (idx < num_long_metrics)
-      {
-	LongMetric lm;
-	lm.advance = _.first;
-	lm.sb = _.second;
-	if (unlikely (!c->embed<LongMetric> (&lm))) return;
-      }
-      else if (idx < 0x10000u)
+      hb_codepoint_t gid = _.first;
+      auto mtx = *it++;
+
+      if (gid < num_long_metrics)
       {
-	FWORD *sb = c->allocate_size<FWORD> (FWORD::static_size);
-	if (unlikely (!sb)) return;
-	*sb = _.second;
+	LongMetric& lm = long_metrics[gid];
+	lm.advance = mtx.first;
+	lm.sb = mtx.second;
       }
+      // TODO(beyond-64k): This assumes that maxp.numGlyphs is 0xFFFF.
+      else if (gid < 0x10000u)
+        short_metrics[gid] = mtx.second;
       else
-      {
-        // TODO: This does not do tail optimization.
-	UFWORD *adv = c->allocate_size<UFWORD> (UFWORD::static_size);
-	if (unlikely (!adv)) return;
-	*adv = _.first;
-      }
-      idx++;
+        ((UFWORD*) short_metrics)[gid] = mtx.first;
     }
   }
 
@@ -189,8 +214,7 @@ struct hmtxvmtx
   {
     TRACE_SUBSET (this);
 
-    T *table_prime = c->serializer->start_embed <T> ();
-    if (unlikely (!table_prime)) return_trace (false);
+    auto *table_prime = c->serializer->start_embed <T> ();
 
     accelerator_t _mtx (c->plan->source);
     unsigned num_long_metrics;
@@ -199,6 +223,8 @@ struct hmtxvmtx
       /* Determine num_long_metrics to encode. */
       auto& plan = c->plan;
 
+      // TODO Don't consider retaingid holes here.
+
       num_long_metrics = hb_min (plan->num_output_glyphs (), 0xFFFFu);
       unsigned int last_advance = get_new_gid_advance_unscaled (plan, mtx_map, num_long_metrics - 1, _mtx);
       while (num_long_metrics > 1 &&
@@ -209,31 +235,36 @@ struct hmtxvmtx
     }
 
     auto it =
-    + hb_range (c->plan->num_output_glyphs ())
-    | hb_map ([c, &_mtx, mtx_map] (unsigned _)
+    + hb_iter (c->plan->new_to_old_gid_list)
+    | hb_map ([c, &_mtx, mtx_map] (hb_codepoint_pair_t _)
 	      {
-		if (!mtx_map->has (_))
+		hb_codepoint_t new_gid = _.first;
+		hb_codepoint_t old_gid = _.second;
+
+		hb_pair_t<unsigned, int> *v = nullptr;
+		if (!mtx_map->has (new_gid, &v))
 		{
-		  hb_codepoint_t old_gid;
-		  if (!c->plan->old_gid_for_new_gid (_, &old_gid))
-		    return hb_pair (0u, 0);
 		  int lsb = 0;
 		  if (!_mtx.get_leading_bearing_without_var_unscaled (old_gid, &lsb))
 		    (void) _glyf_get_leading_bearing_without_var_unscaled (c->plan->source, old_gid, !T::is_horizontal, &lsb);
 		  return hb_pair (_mtx.get_advance_without_var_unscaled (old_gid), +lsb);
 		}
-		return mtx_map->get (_);
+		return *v;
 	      })
     ;
 
-    table_prime->serialize (c->serializer, it, num_long_metrics);
+    table_prime->serialize (c->serializer,
+			    it,
+			    c->plan->new_to_old_gid_list,
+			    num_long_metrics,
+			    c->plan->num_output_glyphs ());
 
     if (unlikely (c->serializer->in_error ()))
       return_trace (false);
 
     // Amend header num hmetrics
     if (unlikely (!subset_update_header (c, num_long_metrics, mtx_map,
-                                         T::is_horizontal ? &c->plan->bounds_width_map : &c->plan->bounds_height_map)))
+                                         T::is_horizontal ? c->plan->bounds_width_vec : c->plan->bounds_height_vec)))
       return_trace (false);
 
     return_trace (true);
@@ -366,7 +397,7 @@ struct hmtxvmtx
 
     unsigned get_advance_with_var_unscaled (hb_codepoint_t  glyph,
 					    hb_font_t      *font,
-					    VariationStore::cache_t *store_cache = nullptr) const
+					    ItemVariationStore::cache_t *store_cache = nullptr) const
     {
       unsigned int advance = get_advance_without_var_unscaled (glyph);
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-kern-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-kern-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-kern-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-kern-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -79,6 +79,7 @@ struct KernSubTableFormat3
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  c->check_range (kernValueZ,
 				  kernValueCount * sizeof (FWORD) +
 				  glyphCount * 2 +
@@ -147,9 +148,10 @@ struct KernSubTable
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (unlikely (!u.header.sanitize (c) ||
-		  u.header.length < u.header.min_size ||
-		  !c->check_range (this, u.header.length))) return_trace (false);
+    if (unlikely (!(u.header.sanitize (c) &&
+		    hb_barrier () &&
+		    u.header.length >= u.header.min_size &&
+		    c->check_range (this, u.header.length)))) return_trace (false);
 
     return_trace (dispatch (c));
   }
@@ -337,6 +339,7 @@ struct kern
   {
     TRACE_SANITIZE (this);
     if (!u.version32.sanitize (c)) return_trace (false);
+    hb_barrier ();
     return_trace (dispatch (c));
   }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-base-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-base-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-base-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-base-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -46,6 +46,12 @@ struct BaseCoordFormat1
     return HB_DIRECTION_IS_HORIZONTAL (direction) ? font->em_scale_y (coordinate) : font->em_scale_x (coordinate);
   }
 
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    return_trace ((bool) c->serializer->embed (*this));
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -67,6 +73,17 @@ struct BaseCoordFormat2
     return HB_DIRECTION_IS_HORIZONTAL (direction) ? font->em_scale_y (coordinate) : font->em_scale_x (coordinate);
   }
 
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (c->serializer->check_assign (out->referenceGlyph,
+                                               c->plan->glyph_map->get (referenceGlyph),
+                                               HB_SERIALIZE_ERROR_INT_OVERFLOW));
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -86,7 +103,7 @@ struct BaseCoordFormat2
 struct BaseCoordFormat3
 {
   hb_position_t get_coord (hb_font_t *font,
-			   const VariationStore &var_store,
+			   const ItemVariationStore &var_store,
 			   hb_direction_t direction) const
   {
     const Device &device = this+deviceTable;
@@ -96,6 +113,23 @@ struct BaseCoordFormat3
 	 : font->em_scale_x (coordinate) + device.get_x_delta (font, var_store);
   }
 
+  void collect_variation_indices (hb_set_t& varidx_set /* OUT */) const
+  {
+    unsigned varidx = (this+deviceTable).get_variation_index ();
+    varidx_set.add (varidx);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (out->deviceTable.serialize_copy (c->serializer, deviceTable,
+                                                   this, 0,
+                                                   hb_serialize_context_t::Head,
+                                                   &c->plan->base_variation_idx_map));
+  }
 
   bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -120,7 +154,7 @@ struct BaseCoord
   bool has_data () const { return u.format; }
 
   hb_position_t get_coord (hb_font_t            *font,
-			   const VariationStore &var_store,
+			   const ItemVariationStore &var_store,
 			   hb_direction_t        direction) const
   {
     switch (u.format) {
@@ -131,10 +165,32 @@ struct BaseCoord
     }
   }
 
+  void collect_variation_indices (hb_set_t& varidx_set /* OUT */) const
+  {
+    switch (u.format) {
+    case 3: u.format3.collect_variation_indices (varidx_set);
+    default:return;
+    }
+  }
+
+  template <typename context_t, typename ...Ts>
+  typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
+  {
+    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format);
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
+    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
+    case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     if (unlikely (!u.format.sanitize (c))) return_trace (false);
+    hb_barrier ();
     switch (u.format) {
     case 1: return_trace (u.format1.sanitize (c));
     case 2: return_trace (u.format2.sanitize (c));
@@ -160,18 +216,43 @@ struct FeatMinMaxRecord
 
   bool has_data () const { return tag; }
 
+  hb_tag_t get_feature_tag () const { return tag; }
+
   void get_min_max (const BaseCoord **min, const BaseCoord **max) const
   {
     if (likely (min)) *min = &(this+minCoord);
     if (likely (max)) *max = &(this+maxCoord);
   }
 
+  void collect_variation_indices (const hb_subset_plan_t* plan,
+                                  const void *base,
+                                  hb_set_t& varidx_set /* OUT */) const
+  {
+    if (!plan->layout_features.has (tag))
+      return;
+
+    (base+minCoord).collect_variation_indices (varidx_set);
+    (base+maxCoord).collect_variation_indices (varidx_set);
+  }
+
+  bool subset (hb_subset_context_t *c,
+               const void *base) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+    if (!(out->minCoord.serialize_subset (c, minCoord, base)))
+      return_trace (false);
+
+    return_trace (out->maxCoord.serialize_subset (c, maxCoord, base));
+  }
+
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
-			  minCoord.sanitize (c, this) &&
-			  maxCoord.sanitize (c, this)));
+			  minCoord.sanitize (c, base) &&
+			  maxCoord.sanitize (c, base)));
   }
 
   protected:
@@ -187,7 +268,6 @@ struct FeatMinMaxRecord
 				 * of MinMax table (may be NULL) */
   public:
   DEFINE_SIZE_STATIC (8);
-
 };
 
 struct MinMax
@@ -206,6 +286,39 @@ struct MinMax
     }
   }
 
+  void collect_variation_indices (const hb_subset_plan_t* plan,
+                                  hb_set_t& varidx_set /* OUT */) const
+  {
+    (this+minCoord).collect_variation_indices (varidx_set);
+    (this+maxCoord).collect_variation_indices (varidx_set);
+    for (const FeatMinMaxRecord& record : featMinMaxRecords)
+      record.collect_variation_indices (plan, this, varidx_set);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+
+    if (!(out->minCoord.serialize_subset (c, minCoord, this)) ||
+        !(out->maxCoord.serialize_subset (c, maxCoord, this)))
+      return_trace (false);
+
+    unsigned len = 0;
+    for (const FeatMinMaxRecord& _ : featMinMaxRecords)
+    {
+      hb_tag_t feature_tag = _.get_feature_tag ();
+      if (!c->plan->layout_features.has (feature_tag))
+        continue;
+
+      if (!_.subset (c, this)) return false;
+      len++;
+    }
+    return_trace (c->serializer->check_assign (out->featMinMaxRecords.len, len,
+                                               HB_SERIALIZE_ERROR_INT_OVERFLOW));
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -240,6 +353,26 @@ struct BaseValues
     return this+baseCoords[baseline_tag_index];
   }
 
+  void collect_variation_indices (hb_set_t& varidx_set /* OUT */) const
+  {
+    for (const auto& _ : baseCoords)
+      (this+_).collect_variation_indices (varidx_set);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+    out->defaultIndex = defaultIndex;
+
+    for (const auto& _ : baseCoords)
+      if (!subset_offset_array (c, out->baseCoords, this) (_))
+        return_trace (false);
+
+    return_trace (bool (out->baseCoords));
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -270,11 +403,25 @@ struct BaseLangSysRecord
 
   const MinMax &get_min_max () const { return this+minMax; }
 
+  void collect_variation_indices (const hb_subset_plan_t* plan,
+                                  hb_set_t& varidx_set /* OUT */) const
+  { (this+minMax).collect_variation_indices (plan, varidx_set); }
+
+  bool subset (hb_subset_context_t *c,
+               const void *base) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (out->minMax.serialize_subset (c, minMax, base));
+  }
+
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
-			  minMax.sanitize (c, this)));
+			  minMax.sanitize (c, base)));
   }
 
   protected:
@@ -297,7 +444,37 @@ struct BaseScript
   const BaseCoord &get_base_coord (int baseline_tag_index) const
   { return (this+baseValues).get_base_coord (baseline_tag_index); }
 
-  bool has_data () const { return baseValues; }
+  bool has_values () const { return baseValues; }
+  bool has_min_max () const { return defaultMinMax; /* TODO What if only per-language is present? */ }
+
+  void collect_variation_indices (const hb_subset_plan_t* plan,
+                                  hb_set_t& varidx_set /* OUT */) const
+  {
+    (this+baseValues).collect_variation_indices (varidx_set);
+    (this+defaultMinMax).collect_variation_indices (plan, varidx_set);
+    
+    for (const BaseLangSysRecord& _ : baseLangSysRecords)
+      _.collect_variation_indices (plan, varidx_set);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+
+    if (baseValues && !out->baseValues.serialize_subset (c, baseValues, this))
+      return_trace (false);
+
+    if (defaultMinMax && !out->defaultMinMax.serialize_subset (c, defaultMinMax, this))
+      return_trace (false);
+
+    for (const auto& _ : baseLangSysRecords)
+      if (!_.subset (c, this)) return_trace (false);
+
+    return_trace (c->serializer->check_assign (out->baseLangSysRecords.len, baseLangSysRecords.len,
+                                               HB_SERIALIZE_ERROR_INT_OVERFLOW));
+  }
 
   bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -331,9 +508,31 @@ struct BaseScriptRecord
 
   bool has_data () const { return baseScriptTag; }
 
+  hb_tag_t get_script_tag () const { return baseScriptTag; }
+
   const BaseScript &get_base_script (const BaseScriptList *list) const
   { return list+baseScript; }
 
+  void collect_variation_indices (const hb_subset_plan_t* plan,
+                                  const void* list,
+                                  hb_set_t& varidx_set /* OUT */) const
+  {
+    if (!plan->layout_scripts.has (baseScriptTag))
+      return;
+
+    (list+baseScript).collect_variation_indices (plan, varidx_set);
+  }
+
+  bool subset (hb_subset_context_t *c,
+               const void *base) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (out->baseScript.serialize_subset (c, baseScript, base));
+  }
+
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
@@ -360,6 +559,33 @@ struct BaseScriptList
     return record->has_data () ? record->get_base_script (this) : Null (BaseScript);
   }
 
+  void collect_variation_indices (const hb_subset_plan_t* plan,
+                                  hb_set_t& varidx_set /* OUT */) const
+  {
+    for (const BaseScriptRecord& _ : baseScriptRecords)
+      _.collect_variation_indices (plan, this, varidx_set);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+
+    unsigned len = 0;
+    for (const BaseScriptRecord& _ : baseScriptRecords)
+    {
+      hb_tag_t script_tag = _.get_script_tag ();
+      if (!c->plan->layout_scripts.has (script_tag))
+        continue;
+
+      if (!_.subset (c, this)) return false;
+      len++;
+    }
+    return_trace (c->serializer->check_assign (out->baseScriptRecords.len, len,
+                                               HB_SERIALIZE_ERROR_INT_OVERFLOW));
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -383,7 +609,7 @@ struct Axis
 		     const BaseCoord **coord) const
   {
     const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag);
-    if (!base_script.has_data ())
+    if (!base_script.has_values ())
     {
       *coord = nullptr;
       return false;
@@ -410,7 +636,7 @@ struct Axis
 		    const BaseCoord **max_coord) const
   {
     const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag);
-    if (!base_script.has_data ())
+    if (!base_script.has_min_max ())
     {
       *min_coord = *max_coord = nullptr;
       return false;
@@ -421,12 +647,26 @@ struct Axis
     return true;
   }
 
+  void collect_variation_indices (const hb_subset_plan_t* plan,
+                                  hb_set_t& varidx_set /* OUT */) const
+  { (this+baseScriptList).collect_variation_indices (plan, varidx_set); }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+
+    out->baseTagList.serialize_copy (c->serializer, baseTagList, this);
+    return_trace (out->baseScriptList.serialize_subset (c, baseScriptList, this));
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
-			  (this+baseTagList).sanitize (c) &&
-			  (this+baseScriptList).sanitize (c)));
+			  baseTagList.sanitize (c, this) &&
+			  baseScriptList.sanitize (c, this)));
   }
 
   protected:
@@ -452,8 +692,41 @@ struct BASE
   const Axis &get_axis (hb_direction_t direction) const
   { return HB_DIRECTION_IS_VERTICAL (direction) ? this+vAxis : this+hAxis; }
 
-  const VariationStore &get_var_store () const
-  { return version.to_int () < 0x00010001u ? Null (VariationStore) : this+varStore; }
+  bool has_var_store () const
+  { return version.to_int () >= 0x00010001u && varStore != 0; }
+
+  const ItemVariationStore &get_var_store () const
+  { return version.to_int () < 0x00010001u ? Null (ItemVariationStore) : this+varStore; }
+
+  void collect_variation_indices (const hb_subset_plan_t* plan,
+                                  hb_set_t& varidx_set /* OUT */) const
+  {
+    (this+hAxis).collect_variation_indices (plan, varidx_set);
+    (this+vAxis).collect_variation_indices (plan, varidx_set);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+
+    out->version = version;
+    if (hAxis && !out->hAxis.serialize_subset (c, hAxis, this))
+      return_trace (false);
+
+    if (vAxis && !out->vAxis.serialize_subset (c, vAxis, this))
+      return_trace (false);
+
+    if (has_var_store ())
+    {
+      if (!c->serializer->allocate_size<Offset32To<ItemVariationStore>> (Offset32To<ItemVariationStore>::static_size))
+        return_trace (false);
+      return_trace (out->varStore.serialize_subset (c, varStore, this, c->plan->base_varstore_inner_maps.as_array ()));
+    }
+
+    return_trace (true);
+  }
 
   bool get_baseline (hb_font_t      *font,
 		     hb_tag_t        baseline_tag,
@@ -473,21 +746,20 @@ struct BASE
     return true;
   }
 
-  /* TODO: Expose this separately sometime? */
   bool get_min_max (hb_font_t      *font,
 		    hb_direction_t  direction,
 		    hb_tag_t        script_tag,
 		    hb_tag_t        language_tag,
 		    hb_tag_t        feature_tag,
 		    hb_position_t  *min,
-		    hb_position_t  *max)
+		    hb_position_t  *max) const
   {
     const BaseCoord *min_coord, *max_coord;
     if (!get_axis (direction).get_min_max (script_tag, language_tag, feature_tag,
 					   &min_coord, &max_coord))
       return false;
 
-    const VariationStore &var_store = get_var_store ();
+    const ItemVariationStore &var_store = get_var_store ();
     if (likely (min && min_coord)) *min = min_coord->get_coord (font, var_store, direction);
     if (likely (max && max_coord)) *max = max_coord->get_coord (font, var_store, direction);
     return true;
@@ -497,6 +769,7 @@ struct BASE
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
 			  likely (version.major == 1) &&
 			  hAxis.sanitize (c, this) &&
 			  vAxis.sanitize (c, this) &&
@@ -509,7 +782,7 @@ struct BASE
 				 * of BASE table (may be NULL) */
   Offset16To<Axis>vAxis;		/* Offset to vertical Axis table, from beginning
 				 * of BASE table (may be NULL) */
-  Offset32To<VariationStore>
+  Offset32To<ItemVariationStore>
 		varStore;	/* Offset to the table of Item Variation
 				 * Store--from beginning of BASE
 				 * header (may be NULL).  Introduced
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common.hh	2024-11-20 13:56:33.000000000 +0000
@@ -55,19 +55,22 @@ static bool ClassDef_remap_and_serialize
     hb_serialize_context_t *c,
     const hb_set_t &klasses,
     bool use_class_zero,
-    hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> &glyph_and_klass, /* IN/OUT */
+    hb_sorted_vector_t<hb_codepoint_pair_t> &glyph_and_klass, /* IN/OUT */
     hb_map_t *klass_map /*IN/OUT*/);
 
 struct hb_collect_feature_substitutes_with_var_context_t
 {
   const hb_map_t *axes_index_tag_map;
-  const hb_hashmap_t<hb_tag_t, int> *axes_location;
+  const hb_hashmap_t<hb_tag_t, Triple> *axes_location;
   hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *record_cond_idx_map;
   hb_hashmap_t<unsigned, const Feature*> *feature_substitutes_map;
+  hb_set_t& catch_all_record_feature_idxes;
 
   // not stored in subset_plan
   hb_set_t *feature_indices;
   bool apply;
+  bool variation_applied;
+  bool universal;
   unsigned cur_record_idx;
   hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned> *conditionset_map;
 };
@@ -139,6 +142,8 @@ struct hb_subset_layout_context_t :
   const hb_map_t *feature_index_map;
   const hb_hashmap_t<unsigned, const Feature*> *feature_substitutes_map;
   hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *feature_record_cond_idx_map;
+  const hb_set_t *catch_all_record_feature_idxes;
+  const hb_hashmap_t<unsigned, hb_pair_t<const void*, const void*>> *feature_idx_tag_map;
 
   unsigned cur_script_index;
   unsigned cur_feature_var_record_idx;
@@ -161,6 +166,8 @@ struct hb_subset_layout_context_t :
       feature_index_map = &c_->plan->gsub_features;
       feature_substitutes_map = &c_->plan->gsub_feature_substitutes_map;
       feature_record_cond_idx_map = c_->plan->user_axes_location.is_empty () ? nullptr : &c_->plan->gsub_feature_record_cond_idx_map;
+      catch_all_record_feature_idxes = &c_->plan->gsub_old_features;
+      feature_idx_tag_map = &c_->plan->gsub_old_feature_idx_tag_map;
     }
     else
     {
@@ -169,6 +176,8 @@ struct hb_subset_layout_context_t :
       feature_index_map = &c_->plan->gpos_features;
       feature_substitutes_map = &c_->plan->gpos_feature_substitutes_map;
       feature_record_cond_idx_map = c_->plan->user_axes_location.is_empty () ? nullptr : &c_->plan->gpos_feature_record_cond_idx_map;
+      catch_all_record_feature_idxes = &c_->plan->gpos_old_features;
+      feature_idx_tag_map = &c_->plan->gpos_old_feature_idx_tag_map;
     }
   }
 
@@ -179,7 +188,7 @@ struct hb_subset_layout_context_t :
   unsigned lookup_index_count;
 };
 
-struct VariationStore;
+struct ItemVariationStore;
 struct hb_collect_variation_indices_context_t :
        hb_dispatch_context_t<hb_collect_variation_indices_context_t>
 {
@@ -188,27 +197,15 @@ struct hb_collect_variation_indices_cont
   static return_t default_return_value () { return hb_empty_t (); }
 
   hb_set_t *layout_variation_indices;
-  hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *varidx_delta_map;
-  hb_font_t *font;
-  const VariationStore *var_store;
   const hb_set_t *glyph_set;
   const hb_map_t *gpos_lookups;
-  float *store_cache;
 
   hb_collect_variation_indices_context_t (hb_set_t *layout_variation_indices_,
-					  hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *varidx_delta_map_,
-					  hb_font_t *font_,
-					  const VariationStore *var_store_,
 					  const hb_set_t *glyph_set_,
-					  const hb_map_t *gpos_lookups_,
-					  float *store_cache_) :
+					  const hb_map_t *gpos_lookups_) :
 					layout_variation_indices (layout_variation_indices_),
-					varidx_delta_map (varidx_delta_map_),
-					font (font_),
-					var_store (var_store_),
 					glyph_set (glyph_set_),
-					gpos_lookups (gpos_lookups_),
-					store_cache (store_cache_) {}
+					gpos_lookups (gpos_lookups_) {}
 };
 
 template<typename OutputArray>
@@ -463,6 +460,7 @@ struct FeatureParamsSize
   {
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this))) return_trace (false);
+    hb_barrier ();
 
     /* This subtable has some "history", if you will.  Some earlier versions of
      * Adobe tools calculated the offset of the FeatureParams subtable from the
@@ -807,7 +805,7 @@ struct Feature
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (*this);
-    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
     out->featureParams.serialize_subset (c, featureParams, this, tag);
 
@@ -829,6 +827,7 @@ struct Feature
     TRACE_SANITIZE (this);
     if (unlikely (!(c->check_struct (this) && lookupIndex.sanitize (c))))
       return_trace (false);
+    hb_barrier ();
 
     /* Some earlier versions of Adobe tools calculated the offset of the
      * FeatureParams subtable from the beginning of the FeatureList table!
@@ -847,6 +846,7 @@ struct Feature
     unsigned int orig_offset = featureParams;
     if (unlikely (!featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE)))
       return_trace (false);
+    hb_barrier ();
 
     if (featureParams == 0 && closure &&
 	closure->tag == HB_TAG ('s','i','z','e') &&
@@ -909,7 +909,8 @@ struct Record
   {
     TRACE_SANITIZE (this);
     const Record_sanitize_closure_t closure = {tag, base};
-    return_trace (c->check_struct (this) && offset.sanitize (c, base, &closure));
+    return_trace (c->check_struct (this) &&
+		  offset.sanitize (c, base, &closure));
   }
 
   Tag           tag;            /* 4-byte Tag identifier */
@@ -981,7 +982,7 @@ struct RecordListOfFeature : RecordListO
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (*this);
-    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
     + hb_enumerate (*this)
     | hb_filter (l->feature_index_map, hb_first)
@@ -1078,7 +1079,7 @@ struct LangSys
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (*this);
-    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
     const uint32_t *v;
     out->reqFeatureIndex = l->feature_index_map->has (reqFeatureIndex, &v) ? *v : 0xFFFFu;
@@ -1188,7 +1189,7 @@ struct Script
       return false;
 
     auto *out = c->serializer->start_embed (*this);
-    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
     bool defaultLang = false;
     if (has_default_lang_sys ())
@@ -1247,7 +1248,7 @@ struct RecordListOfScript : RecordListOf
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (*this);
-    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
     for (auto _ : + hb_enumerate (*this))
     {
@@ -1367,7 +1368,7 @@ struct Lookup
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (*this);
-    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
     out->lookupType = lookupType;
     out->lookupFlag = lookupFlag;
 
@@ -1380,10 +1381,20 @@ struct Lookup
 
     if (lookupFlag & LookupFlag::UseMarkFilteringSet)
     {
-      if (unlikely (!c->serializer->extend (out))) return_trace (false);
       const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
-      HBUINT16 &outMarkFilteringSet = StructAfter<HBUINT16> (out->subTable);
-      outMarkFilteringSet = markFilteringSet;
+      hb_codepoint_t *idx;
+      if (!c->plan->used_mark_sets_map.has (markFilteringSet, &idx))
+      {
+        unsigned new_flag = lookupFlag;
+        new_flag &= ~LookupFlag::UseMarkFilteringSet;
+        out->lookupFlag = new_flag;
+      }
+      else
+      {
+        if (unlikely (!c->serializer->extend (out))) return_trace (false);
+        HBUINT16 &outMarkFilteringSet = StructAfter<HBUINT16> (out->subTable);
+        outMarkFilteringSet = *idx;
+      }
     }
 
     // Always keep the lookup even if it's empty. The rest of layout subsetting depends on lookup
@@ -1400,6 +1411,7 @@ struct Lookup
   {
     TRACE_SANITIZE (this);
     if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
+    hb_barrier ();
 
     unsigned subtables = get_subtable_count ();
     if (unlikely (!c->visit_subtables (subtables))) return_trace (false);
@@ -1415,6 +1427,8 @@ struct Lookup
 
     if (unlikely (get_type () == TSubTable::Extension && !c->get_edit_count ()))
     {
+      hb_barrier ();
+
       /* The spec says all subtables of an Extension lookup should
        * have the same type, which shall not be the Extension type
        * itself (but we already checked for that).
@@ -1456,7 +1470,7 @@ struct LookupOffsetList : List16OfOffset
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (this);
-    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
     + hb_enumerate (*this)
     | hb_filter (l->lookup_index_map, hb_first)
@@ -1482,7 +1496,7 @@ struct LookupOffsetList : List16OfOffset
 static bool ClassDef_remap_and_serialize (hb_serialize_context_t *c,
 					  const hb_set_t &klasses,
                                           bool use_class_zero,
-                                          hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> &glyph_and_klass, /* IN/OUT */
+                                          hb_sorted_vector_t<hb_codepoint_pair_t> &glyph_and_klass, /* IN/OUT */
 					  hb_map_t *klass_map /*IN/OUT*/)
 {
   if (!klass_map)
@@ -1573,7 +1587,7 @@ struct ClassDefFormat1_3
     TRACE_SUBSET (this);
     const hb_map_t &glyph_map = c->plan->glyph_map_gsub;
 
-    hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> glyph_and_klass;
+    hb_sorted_vector_t<hb_codepoint_pair_t> glyph_and_klass;
     hb_set_t orig_klasses;
 
     hb_codepoint_t start = startGlyph;
@@ -1592,10 +1606,13 @@ struct ClassDefFormat1_3
       orig_klasses.add (klass);
     }
 
-    unsigned glyph_count = glyph_filter
-                           ? hb_len (hb_iter (glyph_map.keys()) | hb_filter (glyph_filter))
-                           : glyph_map.get_population ();
-    use_class_zero = use_class_zero && glyph_count <= glyph_and_klass.length;
+    if (use_class_zero)
+    {
+      unsigned glyph_count = glyph_filter
+			     ? hb_len (hb_iter (glyph_map.keys()) | hb_filter (glyph_filter))
+			     : glyph_map.get_population ();
+      use_class_zero = glyph_count <= glyph_and_klass.length;
+    }
     if (!ClassDef_remap_and_serialize (c->serializer,
                                        orig_klasses,
                                        use_class_zero,
@@ -1769,6 +1786,7 @@ struct ClassDefFormat2_4
       return_trace (true);
     }
 
+    unsigned unsorted = false;
     unsigned num_ranges = 1;
     hb_codepoint_t prev_gid = (*it).first;
     unsigned prev_klass = (*it).second;
@@ -1789,6 +1807,10 @@ struct ClassDefFormat2_4
       if (cur_gid != prev_gid + 1 ||
 	  cur_klass != prev_klass)
       {
+
+	if (unlikely (cur_gid < prev_gid))
+	  unsorted = true;
+
 	if (unlikely (!record)) break;
 	record->last = prev_gid;
 	num_ranges++;
@@ -1804,8 +1826,14 @@ struct ClassDefFormat2_4
       prev_gid = cur_gid;
     }
 
+    if (unlikely (c->in_error ())) return_trace (false);
+
     if (likely (record)) record->last = prev_gid;
     rangeRecord.len = num_ranges;
+
+    if (unlikely (unsorted))
+      rangeRecord.as_array ().qsort (RangeRecord<Types>::cmp_range);
+
     return_trace (true);
   }
 
@@ -1819,7 +1847,7 @@ struct ClassDefFormat2_4
     const hb_map_t &glyph_map = c->plan->glyph_map_gsub;
     const hb_set_t &glyph_set = *c->plan->glyphset_gsub ();
 
-    hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> glyph_and_klass;
+    hb_sorted_vector_t<hb_codepoint_pair_t> glyph_and_klass;
     hb_set_t orig_klasses;
 
     if (glyph_set.get_population () * hb_bit_storage ((unsigned) rangeRecord.len) / 2
@@ -1905,7 +1933,7 @@ struct ClassDefFormat2_4
   {
     if (rangeRecord.len > glyphs->get_population () * hb_bit_storage ((unsigned) rangeRecord.len) / 2)
     {
-      for (hb_codepoint_t g = HB_SET_VALUE_INVALID; glyphs->next (&g);)
+      for (auto g : *glyphs)
         if (get_class (g))
 	  return true;
       return false;
@@ -1920,13 +1948,22 @@ struct ClassDefFormat2_4
     {
       /* Match if there's any glyph that is not listed! */
       hb_codepoint_t g = HB_SET_VALUE_INVALID;
-      for (auto &range : rangeRecord)
+      hb_codepoint_t last = HB_SET_VALUE_INVALID;
+      auto it = hb_iter (rangeRecord);
+      for (auto &range : it)
       {
+        if (it->first == last + 1)
+	{
+	  it++;
+	  continue;
+	}
+
 	if (!glyphs->next (&g))
 	  break;
 	if (g < range.first)
 	  return true;
 	g = range.last;
+	last = g;
       }
       if (g != HB_SET_VALUE_INVALID && glyphs->next (&g))
 	return true;
@@ -1965,8 +2002,7 @@ struct ClassDefFormat2_4
     unsigned count = rangeRecord.len;
     if (count > glyphs->get_population () * hb_bit_storage (count) * 8)
     {
-      for (hb_codepoint_t g = HB_SET_VALUE_INVALID;
-	   glyphs->next (&g);)
+      for (auto g : *glyphs)
       {
         unsigned i;
         if (rangeRecord.as_array ().bfind (g, &i) &&
@@ -2097,8 +2133,15 @@ struct ClassDef
 
 #ifndef HB_NO_BEYOND_64K
     if (glyph_max > 0xFFFFu)
-      format += 2;
+      u.format += 2;
+    if (unlikely (glyph_max > 0xFFFFFFu))
+#else
+    if (unlikely (glyph_max > 0xFFFFu))
 #endif
+    {
+      c->check_success (false, HB_SERIALIZE_ERROR_INT_OVERFLOW);
+      return_trace (false);
+    }
 
     u.format = format;
 
@@ -2136,6 +2179,7 @@ struct ClassDef
   {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return_trace (false);
+    hb_barrier ();
     switch (u.format) {
     case 1: return_trace (u.format1.sanitize (c));
     case 2: return_trace (u.format2.sanitize (c));
@@ -2268,6 +2312,158 @@ static inline bool ClassDef_serialize (h
  * Item Variation Store
  */
 
+/* ported from fonttools (class _Encoding) */
+struct delta_row_encoding_t
+{
+  /* each byte represents a region, value is one of 0/1/2/4, which means bytes
+   * needed for this region */
+  hb_vector_t<uint8_t> chars;
+  unsigned width = 0;
+  hb_vector_t<uint8_t> columns;
+  unsigned overhead = 0;
+  hb_vector_t<const hb_vector_t<int>*> items;
+
+  delta_row_encoding_t () = default;
+  delta_row_encoding_t (hb_vector_t<uint8_t>&& chars_,
+                        const hb_vector_t<int>* row = nullptr) :
+                        delta_row_encoding_t ()
+
+  {
+    chars = std::move (chars_);
+    width = get_width ();
+    columns = get_columns ();
+    overhead = get_chars_overhead (columns);
+    if (row) items.push (row);
+  }
+
+  bool is_empty () const
+  { return !items; }
+
+  static hb_vector_t<uint8_t> get_row_chars (const hb_vector_t<int>& row)
+  {
+    hb_vector_t<uint8_t> ret;
+    if (!ret.alloc (row.length)) return ret;
+
+    bool long_words = false;
+
+    /* 0/1/2 byte encoding */
+    for (int i = row.length - 1; i >= 0; i--)
+    {
+      int v =  row.arrayZ[i];
+      if (v == 0)
+        ret.push (0);
+      else if (v > 32767 || v < -32768)
+      {
+        long_words = true;
+        break;
+      }
+      else if (v > 127 || v < -128)
+        ret.push (2);
+      else
+        ret.push (1);
+    }
+
+    if (!long_words)
+      return ret;
+
+    /* redo, 0/2/4 bytes encoding */
+    ret.reset ();
+    for (int i = row.length - 1; i >= 0; i--)
+    {
+      int v =  row.arrayZ[i];
+      if (v == 0)
+        ret.push (0);
+      else if (v > 32767 || v < -32768)
+        ret.push (4);
+      else
+        ret.push (2);
+    }
+    return ret;
+  }
+
+  inline unsigned get_width ()
+  {
+    unsigned ret = + hb_iter (chars)
+                   | hb_reduce (hb_add, 0u)
+                   ;
+    return ret;
+  }
+
+  hb_vector_t<uint8_t> get_columns ()
+  {
+    hb_vector_t<uint8_t> cols;
+    cols.alloc (chars.length);
+    for (auto v : chars)
+    {
+      uint8_t flag = v ? 1 : 0;
+      cols.push (flag);
+    }
+    return cols;
+  }
+
+  static inline unsigned get_chars_overhead (const hb_vector_t<uint8_t>& cols)
+  {
+    unsigned c = 4 + 6; // 4 bytes for LOffset, 6 bytes for VarData header
+    unsigned cols_bit_count = 0;
+    for (auto v : cols)
+      if (v) cols_bit_count++;
+    return c + cols_bit_count * 2;
+  }
+
+  unsigned get_gain () const
+  {
+    int count = items.length;
+    return hb_max (0, (int) overhead - count);
+  }
+
+  int gain_from_merging (const delta_row_encoding_t& other_encoding) const
+  {
+    int combined_width = 0;
+    for (unsigned i = 0; i < chars.length; i++)
+      combined_width += hb_max (chars.arrayZ[i], other_encoding.chars.arrayZ[i]);
+   
+    hb_vector_t<uint8_t> combined_columns;
+    combined_columns.alloc (columns.length);
+    for (unsigned i = 0; i < columns.length; i++)
+      combined_columns.push (columns.arrayZ[i] | other_encoding.columns.arrayZ[i]);
+    
+    int combined_overhead = get_chars_overhead (combined_columns);
+    int combined_gain = (int) overhead + (int) other_encoding.overhead - combined_overhead
+                        - (combined_width - (int) width) * items.length
+                        - (combined_width - (int) other_encoding.width) * other_encoding.items.length;
+
+    return combined_gain;
+  }
+
+  static int cmp (const void *pa, const void *pb)
+  {
+    const delta_row_encoding_t *a = (const delta_row_encoding_t *)pa;
+    const delta_row_encoding_t *b = (const delta_row_encoding_t *)pb;
+
+    int gain_a = a->get_gain ();
+    int gain_b = b->get_gain ();
+
+    if (gain_a != gain_b)
+      return gain_a - gain_b;
+
+    return (b->chars).as_array ().cmp ((a->chars).as_array ());
+  }
+
+  static int cmp_width (const void *pa, const void *pb)
+  {
+    const delta_row_encoding_t *a = (const delta_row_encoding_t *)pa;
+    const delta_row_encoding_t *b = (const delta_row_encoding_t *)pb;
+
+    if (a->width != b->width)
+      return (int) a->width - (int) b->width;
+
+    return (b->chars).as_array ().cmp ((a->chars).as_array ());
+  }
+
+  bool add_row (const hb_vector_t<int>* row)
+  { return items.push (row); }
+};
+
 struct VarRegionAxis
 {
   float evaluate (int coord) const
@@ -2302,6 +2498,12 @@ struct VarRegionAxis
      * have to do that at runtime. */
   }
 
+  bool serialize (hb_serialize_context_t *c) const
+  {
+    TRACE_SERIALIZE (this);
+    return_trace (c->embed (this));
+  }
+
   public:
   F2DOT14	startCoord;
   F2DOT14	peakCoord;
@@ -2356,10 +2558,53 @@ struct VarRegionList
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && axesZ.sanitize (c, axisCount * regionCount));
+    return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
+		  axesZ.sanitize (c, axisCount * regionCount));
   }
 
-  bool serialize (hb_serialize_context_t *c, const VarRegionList *src, const hb_bimap_t &region_map)
+  bool serialize (hb_serialize_context_t *c,
+                  const hb_vector_t<hb_tag_t>& axis_tags,
+                  const hb_vector_t<const hb_hashmap_t<hb_tag_t, Triple>*>& regions)
+  {
+    TRACE_SERIALIZE (this);
+    unsigned axis_count = axis_tags.length;
+    unsigned region_count = regions.length;
+    if (!axis_count || !region_count) return_trace (false);
+    if (unlikely (hb_unsigned_mul_overflows (axis_count * region_count,
+                                             VarRegionAxis::static_size))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
+    axisCount = axis_count;
+    regionCount = region_count;
+
+    for (unsigned r = 0; r < region_count; r++)
+    {
+      const auto& region = regions[r];
+      for (unsigned i = 0; i < axis_count; i++)
+      {
+        hb_tag_t tag = axis_tags.arrayZ[i];
+        VarRegionAxis var_region_rec;
+        Triple *coords;
+        if (region->has (tag, &coords))
+        {
+          var_region_rec.startCoord.set_float (coords->minimum);
+          var_region_rec.peakCoord.set_float (coords->middle);
+          var_region_rec.endCoord.set_float (coords->maximum);
+        }
+        else
+        {
+          var_region_rec.startCoord.set_int (0);
+          var_region_rec.peakCoord.set_int (0);
+          var_region_rec.endCoord.set_int (0);
+        }
+        if (!var_region_rec.serialize (c))
+          return_trace (false);
+      }
+    }
+    return_trace (true);
+  }
+
+  bool serialize (hb_serialize_context_t *c, const VarRegionList *src, const hb_inc_bimap_t &region_map)
   {
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (this))) return_trace (false);
@@ -2379,6 +2624,45 @@ struct VarRegionList
     return_trace (true);
   }
 
+  bool get_var_region (unsigned region_index,
+                       const hb_map_t& axes_old_index_tag_map,
+                       hb_hashmap_t<hb_tag_t, Triple>& axis_tuples /* OUT */) const
+  {
+    if (region_index >= regionCount) return false;
+    const VarRegionAxis* axis_region = axesZ.arrayZ + (region_index * axisCount);
+    for (unsigned i = 0; i < axisCount; i++)
+    {
+      hb_tag_t *axis_tag;
+      if (!axes_old_index_tag_map.has (i, &axis_tag))
+        return false;
+
+      float min_val = axis_region->startCoord.to_float ();
+      float def_val = axis_region->peakCoord.to_float ();
+      float max_val = axis_region->endCoord.to_float ();
+
+      if (def_val != 0.f)
+        axis_tuples.set (*axis_tag, Triple (min_val, def_val, max_val));
+      axis_region++;
+    }
+    return !axis_tuples.in_error ();
+  }
+
+  bool get_var_regions (const hb_map_t& axes_old_index_tag_map,
+                        hb_vector_t<hb_hashmap_t<hb_tag_t, Triple>>& regions /* OUT */) const
+  {
+    if (!regions.alloc (regionCount))
+      return false;
+
+    for (unsigned i = 0; i < regionCount; i++)
+    {
+      hb_hashmap_t<hb_tag_t, Triple> axis_tuples;
+      if (!get_var_region (i, axes_old_index_tag_map, axis_tuples))
+        return false;
+      regions.push (std::move (axis_tuples));
+    }
+    return !regions.in_error ();
+  }
+
   unsigned int get_size () const { return min_size + VarRegionAxis::static_size * axisCount * regionCount; }
 
   public:
@@ -2398,6 +2682,9 @@ struct VarData
 
   unsigned int get_region_index_count () const
   { return regionIndices.len; }
+  
+  unsigned get_region_index (unsigned i) const
+  { return i >= regionIndices.len ? -1 : regionIndices[i]; }
 
   unsigned int get_row_size () const
   { return (wordCount () + regionIndices.len) * (longWords () ? 2 : 1); }
@@ -2467,6 +2754,7 @@ struct VarData
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
 		  regionIndices.sanitize (c) &&
+		  hb_barrier () &&
 		  wordCount () <= regionIndices.len &&
 		  c->check_range (get_delta_bytes (),
 				  itemCount,
@@ -2474,9 +2762,84 @@ struct VarData
   }
 
   bool serialize (hb_serialize_context_t *c,
+                  bool has_long,
+                  const hb_vector_t<const hb_vector_t<int>*>& rows)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
+    unsigned row_count = rows.length;
+    itemCount = row_count;
+
+    int min_threshold = has_long ? -65536 : -128;
+    int max_threshold = has_long ? +65535 : +127;
+    enum delta_size_t { kZero=0, kNonWord, kWord };
+    hb_vector_t<delta_size_t> delta_sz;
+    unsigned num_regions = rows[0]->length;
+    if (!delta_sz.resize (num_regions))
+      return_trace (false);
+
+    unsigned word_count = 0;
+    for (unsigned r = 0; r < num_regions; r++)
+    {
+      for (unsigned i = 0; i < row_count; i++)
+      {
+        int delta = rows[i]->arrayZ[r];
+        if (delta < min_threshold || delta > max_threshold)
+        {
+          delta_sz[r] = kWord;
+          word_count++;
+          break;
+        }
+        else if (delta != 0)
+        {
+          delta_sz[r] = kNonWord;
+        }
+      }
+    }
+
+    /* reorder regions: words and then non-words*/
+    unsigned word_index = 0;
+    unsigned non_word_index = word_count;
+    hb_map_t ri_map;
+    for (unsigned r = 0; r < num_regions; r++)
+    {
+      if (!delta_sz[r]) continue;
+      unsigned new_r = (delta_sz[r] == kWord)? word_index++ : non_word_index++;
+      if (!ri_map.set (new_r, r))
+        return_trace (false);
+    }
+
+    wordSizeCount = word_count | (has_long ? 0x8000u /* LONG_WORDS */ : 0);
+
+    unsigned ri_count = ri_map.get_population ();
+    regionIndices.len = ri_count;
+    if (unlikely (!c->extend (this))) return_trace (false);
+
+    for (unsigned r = 0; r < ri_count; r++)
+    {
+      hb_codepoint_t *idx;
+      if (!ri_map.has (r, &idx))
+        return_trace (false);
+      regionIndices[r] = *idx;
+    }
+
+    HBUINT8 *delta_bytes = get_delta_bytes ();
+    unsigned row_size = get_row_size ();
+    for (unsigned int i = 0; i < row_count; i++)
+    {
+      for (unsigned int r = 0; r < ri_count; r++)
+      {
+        int delta = rows[i]->arrayZ[ri_map[r]];
+        set_item_delta_fast (i, r, delta, delta_bytes, row_size);
+      }
+    }
+    return_trace (true);
+  }
+
+  bool serialize (hb_serialize_context_t *c,
 		  const VarData *src,
 		  const hb_inc_bimap_t &inner_map,
-		  const hb_bimap_t &region_map)
+		  const hb_inc_bimap_t &region_map)
   {
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (this))) return_trace (false);
@@ -2593,13 +2956,15 @@ struct VarData
     }
   }
 
-  protected:
+  public:
   const HBUINT8 *get_delta_bytes () const
   { return &StructAfter<HBUINT8> (regionIndices); }
 
+  protected:
   HBUINT8 *get_delta_bytes ()
   { return &StructAfter<HBUINT8> (regionIndices); }
 
+  public:
   int32_t get_item_delta_fast (unsigned int item, unsigned int region,
 			       const HBUINT8 *delta_bytes, unsigned row_size) const
   {
@@ -2630,6 +2995,7 @@ struct VarData
 				 get_row_size ());
   }
 
+  protected:
   void set_item_delta_fast (unsigned int item, unsigned int region, int32_t delta,
 			    HBUINT8 *delta_bytes, unsigned row_size)
   {
@@ -2670,8 +3036,9 @@ struct VarData
   DEFINE_SIZE_ARRAY (6, regionIndices);
 };
 
-struct VariationStore
+struct ItemVariationStore
 {
+  friend struct item_variations_t;
   using cache_t = VarRegionList::cache_t;
 
   cache_t *create_cache () const
@@ -2737,13 +3104,44 @@ struct VariationStore
 
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  format == 1 &&
 		  regions.sanitize (c, this) &&
 		  dataSets.sanitize (c, this));
   }
 
   bool serialize (hb_serialize_context_t *c,
-		  const VariationStore *src,
+                  bool has_long,
+                  const hb_vector_t<hb_tag_t>& axis_tags,
+                  const hb_vector_t<const hb_hashmap_t<hb_tag_t, Triple>*>& region_list,
+                  const hb_vector_t<delta_row_encoding_t>& vardata_encodings)
+  {
+    TRACE_SERIALIZE (this);
+#ifdef HB_NO_VAR
+    return_trace (false);
+#endif
+    if (unlikely (!c->extend_min (this))) return_trace (false);
+    
+    format = 1;
+    if (!regions.serialize_serialize (c, axis_tags, region_list))
+      return_trace (false);
+
+    unsigned num_var_data = vardata_encodings.length;
+    if (!num_var_data) return_trace (false);
+    if (unlikely (!c->check_assign (dataSets.len, num_var_data,
+                                    HB_SERIALIZE_ERROR_INT_OVERFLOW)))
+      return_trace (false);
+
+    if (unlikely (!c->extend (dataSets))) return_trace (false);
+    for (unsigned i = 0; i < num_var_data; i++)
+      if (!dataSets[i].serialize_serialize (c, has_long, vardata_encodings[i].items))
+        return_trace (false);
+    
+    return_trace (true);
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+		  const ItemVariationStore *src,
 		  const hb_array_t <const hb_inc_bimap_t> &inner_maps)
   {
     TRACE_SERIALIZE (this);
@@ -2799,7 +3197,7 @@ struct VariationStore
     return_trace (true);
   }
 
-  VariationStore *copy (hb_serialize_context_t *c) const
+  ItemVariationStore *copy (hb_serialize_context_t *c) const
   {
     TRACE_SERIALIZE (this);
     auto *out = c->start_embed (this);
@@ -2829,7 +3227,7 @@ struct VariationStore
     return_trace (false);
 #endif
 
-    VariationStore *varstore_prime = c->serializer->start_embed<VariationStore> ();
+    ItemVariationStore *varstore_prime = c->serializer->start_embed<ItemVariationStore> ();
     if (unlikely (!varstore_prime)) return_trace (false);
 
     varstore_prime->serialize (c->serializer, this, inner_maps);
@@ -2871,6 +3269,22 @@ struct VariationStore
      return dataSets.len;
    }
 
+  const VarData& get_sub_table (unsigned i) const
+  {
+#ifdef HB_NO_VAR
+     return Null (VarData);
+#endif
+     return this+dataSets[i];
+  }
+
+  const VarRegionList& get_region_list () const
+  {
+#ifdef HB_NO_VAR
+     return Null (VarRegionList);
+#endif
+     return this+regions;
+  }
+
   protected:
   HBUINT16				format;
   Offset32To<VarRegionList>		regions;
@@ -2887,9 +3301,9 @@ struct VariationStore
 enum Cond_with_Var_flag_t
 {
   KEEP_COND_WITH_VAR = 0,
-  DROP_COND_WITH_VAR = 1,
-  DROP_RECORD_WITH_VAR = 2,
-  MEM_ERR_WITH_VAR = 3,
+  KEEP_RECORD_WITH_VAR = 1,
+  DROP_COND_WITH_VAR = 2,
+  DROP_RECORD_WITH_VAR = 3,
 };
 
 struct ConditionFormat1
@@ -2905,9 +3319,29 @@ struct ConditionFormat1
     const hb_map_t *index_map = &c->plan->axes_index_map;
     if (index_map->is_empty ()) return_trace (true);
 
-    if (!index_map->has (axisIndex))
+    const hb_map_t& axes_old_index_tag_map = c->plan->axes_old_index_tag_map;
+    hb_codepoint_t *axis_tag;
+    if (!axes_old_index_tag_map.has (axisIndex, &axis_tag) ||
+        !index_map->has (axisIndex))
       return_trace (false);
 
+    const hb_hashmap_t<hb_tag_t, Triple>& normalized_axes_location = c->plan->axes_location;
+    Triple axis_limit{-1.f, 0.f, 1.f};
+    Triple *normalized_limit;
+    if (normalized_axes_location.has (*axis_tag, &normalized_limit))
+      axis_limit = *normalized_limit;
+
+    const hb_hashmap_t<hb_tag_t, TripleDistances>& axes_triple_distances = c->plan->axes_triple_distances;
+    TripleDistances axis_triple_distances{1.f, 1.f};
+    TripleDistances *triple_dists;
+    if (axes_triple_distances.has (*axis_tag, &triple_dists))
+      axis_triple_distances = *triple_dists;
+
+    float normalized_min = renormalizeValue (filterRangeMinValue.to_float (), axis_limit, axis_triple_distances, false);
+    float normalized_max = renormalizeValue (filterRangeMaxValue.to_float (), axis_limit, axis_triple_distances, false);
+    out->filterRangeMinValue.set_float (normalized_min);
+    out->filterRangeMaxValue.set_float (normalized_max);
+
     return_trace (c->serializer->check_assign (out->axisIndex, index_map->get (axisIndex),
                                                HB_SERIALIZE_ERROR_INT_OVERFLOW));
   }
@@ -2922,29 +3356,47 @@ struct ConditionFormat1
 
     hb_tag_t axis_tag = c->axes_index_tag_map->get (axisIndex);
 
-    //axis not pinned, keep the condition
-    if (!c->axes_location->has (axis_tag))
+    Triple axis_range (-1.f, 0.f, 1.f);
+    Triple *axis_limit;
+    bool axis_set_by_user = false;
+    if (c->axes_location->has (axis_tag, &axis_limit))
     {
-      // add axisIndex->value into the hashmap so we can check if the record is
-      // unique with variations
-      int16_t min_val = filterRangeMinValue.to_int ();
-      int16_t max_val = filterRangeMaxValue.to_int ();
-      hb_codepoint_t val = (max_val << 16) + min_val;
-
-      condition_map->set (axisIndex, val);
-      return KEEP_COND_WITH_VAR;
+      axis_range = *axis_limit;
+      axis_set_by_user = true;
     }
 
-    //axis pinned, check if condition is met
-    //TODO: add check for axis Ranges
-    int v = c->axes_location->get (axis_tag);
+    float axis_min_val = axis_range.minimum;
+    float axis_default_val = axis_range.middle;
+    float axis_max_val = axis_range.maximum;
+
+    float filter_min_val = filterRangeMinValue.to_float ();
+    float filter_max_val = filterRangeMaxValue.to_float ();
+
+    if (axis_default_val < filter_min_val ||
+        axis_default_val > filter_max_val)
+      c->apply = false;
 
     //condition not met, drop the entire record
-    if (v < filterRangeMinValue.to_int () || v > filterRangeMaxValue.to_int ())
+    if (axis_min_val > filter_max_val || axis_max_val < filter_min_val ||
+        filter_min_val > filter_max_val)
       return DROP_RECORD_WITH_VAR;
 
-    //axis pinned and condition met, drop the condition
-    return DROP_COND_WITH_VAR;
+    //condition met and axis pinned, drop the condition
+    if (axis_set_by_user && axis_range.is_point ())
+      return DROP_COND_WITH_VAR;
+
+    if (filter_max_val != axis_max_val || filter_min_val != axis_min_val)
+    {
+      // add axisIndex->value into the hashmap so we can check if the record is
+      // unique with variations
+      int16_t int_filter_max_val = filterRangeMaxValue.to_int ();
+      int16_t int_filter_min_val = filterRangeMinValue.to_int ();
+      hb_codepoint_t val = (int_filter_max_val << 16) + int_filter_min_val;
+
+      condition_map->set (axisIndex, val);
+      return KEEP_COND_WITH_VAR;
+    }
+    return KEEP_RECORD_WITH_VAR;
   }
 
   bool evaluate (const int *coords, unsigned int coord_len) const
@@ -2983,7 +3435,7 @@ struct Condition
   {
     switch (u.format) {
     case 1: return u.format1.keep_with_variations (c, condition_map);
-    default:return KEEP_COND_WITH_VAR;
+    default: c->apply = false; return KEEP_COND_WITH_VAR;
     }
   }
 
@@ -3002,6 +3454,7 @@ struct Condition
   {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return_trace (false);
+    hb_barrier ();
     switch (u.format) {
     case 1: return_trace (u.format1.sanitize (c));
     default:return_trace (true);
@@ -3028,54 +3481,62 @@ struct ConditionSet
     return true;
   }
 
-  Cond_with_Var_flag_t keep_with_variations (hb_collect_feature_substitutes_with_var_context_t *c) const
+  void keep_with_variations (hb_collect_feature_substitutes_with_var_context_t *c) const
   {
     hb_map_t *condition_map = hb_map_create ();
-    if (unlikely (!condition_map)) return MEM_ERR_WITH_VAR;
+    if (unlikely (!condition_map)) return;
     hb::shared_ptr<hb_map_t> p {condition_map};
 
     hb_set_t *cond_set = hb_set_create ();
-    if (unlikely (!cond_set)) return MEM_ERR_WITH_VAR;
+    if (unlikely (!cond_set)) return;
     hb::shared_ptr<hb_set_t> s {cond_set};
 
+    c->apply = true;
+    bool should_keep = false;
     unsigned num_kept_cond = 0, cond_idx = 0;
     for (const auto& offset : conditions)
     {
       Cond_with_Var_flag_t ret = (this+offset).keep_with_variations (c, condition_map);
-      // one condition is not met, drop the entire record
+      // condition is not met or condition out of range, drop the entire record
       if (ret == DROP_RECORD_WITH_VAR)
-        return DROP_RECORD_WITH_VAR;
+        return;
 
-      // axis not pinned, keep this condition
       if (ret == KEEP_COND_WITH_VAR)
       {
+        should_keep = true;
         cond_set->add (cond_idx);
         num_kept_cond++;
       }
+
+      if (ret == KEEP_RECORD_WITH_VAR)
+        should_keep = true;
+
       cond_idx++;
     }
 
-    // all conditions met
-    if (num_kept_cond == 0) return DROP_COND_WITH_VAR;
+    if (!should_keep) return;
 
     //check if condition_set is unique with variations
     if (c->conditionset_map->has (p))
       //duplicate found, drop the entire record
-      return DROP_RECORD_WITH_VAR;
+      return;
 
     c->conditionset_map->set (p, 1);
     c->record_cond_idx_map->set (c->cur_record_idx, s);
-
-    return KEEP_COND_WITH_VAR;
+    if (should_keep && num_kept_cond == 0)
+      c->universal = true;
   }
 
   bool subset (hb_subset_context_t *c,
-               hb_subset_layout_context_t *l) const
+               hb_subset_layout_context_t *l,
+               bool insert_catch_all) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (this);
     if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
 
+    if (insert_catch_all) return_trace (true);
+
     hb_set_t *retained_cond_set = nullptr;
     if (l->feature_record_cond_idx_map != nullptr)
       retained_cond_set = l->feature_record_cond_idx_map->get (l->cur_feature_var_record_idx);
@@ -3121,29 +3582,52 @@ struct FeatureTableSubstitutionRecord
   }
 
   void collect_feature_substitutes_with_variations (hb_hashmap_t<unsigned, const Feature*> *feature_substitutes_map,
+                                                    hb_set_t& catch_all_record_feature_idxes,
                                                     const hb_set_t *feature_indices,
                                                     const void *base) const
   {
     if (feature_indices->has (featureIndex))
+    {
       feature_substitutes_map->set (featureIndex, &(base+feature));
+      catch_all_record_feature_idxes.add (featureIndex);
+    }
+  }
+
+  bool serialize (hb_subset_layout_context_t *c,
+                  unsigned feature_index,
+                  const Feature *f, const Tag *tag)
+  {
+    TRACE_SERIALIZE (this);
+    hb_serialize_context_t *s = c->subset_context->serializer;
+    if (unlikely (!s->extend_min (this))) return_trace (false);
+
+    uint32_t *new_feature_idx;
+    if (!c->feature_index_map->has (feature_index, &new_feature_idx))
+      return_trace (false);
+
+    if (!s->check_assign (featureIndex, *new_feature_idx, HB_SERIALIZE_ERROR_INT_OVERFLOW))
+      return_trace (false);
+
+    s->push ();
+    bool ret = f->subset (c->subset_context, c, tag);
+    if (ret) s->add_link (feature, s->pop_pack ());
+    else s->pop_discard ();
+
+    return_trace (ret);
   }
 
   bool subset (hb_subset_layout_context_t *c, const void *base) const
   {
     TRACE_SUBSET (this);
-    if (!c->feature_index_map->has (featureIndex) ||
-        c->feature_substitutes_map->has (featureIndex)) {
-      // Feature that is being substituted is not being retained, so we don't
-      // need this.
+    uint32_t *new_feature_index;
+    if (!c->feature_index_map->has (featureIndex, &new_feature_index))
       return_trace (false);
-    }
 
     auto *out = c->subset_context->serializer->embed (this);
     if (unlikely (!out)) return_trace (false);
 
-    out->featureIndex = c->feature_index_map->get (featureIndex);
-    bool ret = out->feature.serialize_subset (c->subset_context, feature, base, c);
-    return_trace (ret);
+    out->featureIndex = *new_feature_index;
+    return_trace (out->feature.serialize_subset (c->subset_context, feature, base, c));
   }
 
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
@@ -3174,16 +3658,10 @@ struct FeatureTableSubstitution
   }
 
   void collect_lookups (const hb_set_t *feature_indexes,
-			const hb_hashmap_t<unsigned, const Feature*> *feature_substitutes_map,
 			hb_set_t       *lookup_indexes /* OUT */) const
   {
     + hb_iter (substitutions)
     | hb_filter (feature_indexes, &FeatureTableSubstitutionRecord::featureIndex)
-    | hb_filter ([feature_substitutes_map] (const FeatureTableSubstitutionRecord& record)
-                 {
-                   if (feature_substitutes_map == nullptr) return true;
-                   return !feature_substitutes_map->has (record.featureIndex);
-                 })
     | hb_apply ([this, lookup_indexes] (const FeatureTableSubstitutionRecord& r)
 		{ r.collect_lookups (this, lookup_indexes); })
     ;
@@ -3208,11 +3686,14 @@ struct FeatureTableSubstitution
   void collect_feature_substitutes_with_variations (hb_collect_feature_substitutes_with_var_context_t *c) const
   {
     for (const FeatureTableSubstitutionRecord& record : substitutions)
-      record.collect_feature_substitutes_with_variations (c->feature_substitutes_map, c->feature_indices, this);
+      record.collect_feature_substitutes_with_variations (c->feature_substitutes_map,
+                                                          c->catch_all_record_feature_idxes,
+                                                          c->feature_indices, this);
   }
 
   bool subset (hb_subset_context_t        *c,
-	       hb_subset_layout_context_t *l) const
+	       hb_subset_layout_context_t *l,
+               bool insert_catch_all) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (*this);
@@ -3221,6 +3702,22 @@ struct FeatureTableSubstitution
     out->version.major = version.major;
     out->version.minor = version.minor;
 
+    if (insert_catch_all)
+    {
+      for (unsigned feature_index : *(l->catch_all_record_feature_idxes))
+      {
+        hb_pair_t<const void*, const void*> *p;
+        if (!l->feature_idx_tag_map->has (feature_index, &p))
+          return_trace (false);
+        auto *o = out->substitutions.serialize_append (c->serializer);
+        if (!o->serialize (l, feature_index,
+                           reinterpret_cast<const Feature*> (p->first),
+                           reinterpret_cast<const Tag*> (p->second)))
+          return_trace (false);
+      }
+      return_trace (true);
+    }
+
     + substitutions.iter ()
     | hb_apply (subset_record_array (l, &(out->substitutions), this))
     ;
@@ -3232,6 +3729,7 @@ struct FeatureTableSubstitution
   {
     TRACE_SANITIZE (this);
     return_trace (version.sanitize (c) &&
+		  hb_barrier () &&
 		  likely (version.major == 1) &&
 		  substitutions.sanitize (c, this));
   }
@@ -3250,10 +3748,9 @@ struct FeatureVariationRecord
 
   void collect_lookups (const void     *base,
 			const hb_set_t *feature_indexes,
-			const hb_hashmap_t<unsigned, const Feature*> *feature_substitutes_map,
 			hb_set_t       *lookup_indexes /* OUT */) const
   {
-    return (base+substitutions).collect_lookups (feature_indexes, feature_substitutes_map, lookup_indexes);
+    return (base+substitutions).collect_lookups (feature_indexes, lookup_indexes);
   }
 
   void closure_features (const void     *base,
@@ -3271,23 +3768,23 @@ struct FeatureVariationRecord
   void collect_feature_substitutes_with_variations (hb_collect_feature_substitutes_with_var_context_t *c,
                                                     const void *base) const
   {
-    // ret == 1, all conditions met
-    if ((base+conditions).keep_with_variations (c) == DROP_COND_WITH_VAR &&
-        c->apply)
+    (base+conditions).keep_with_variations (c);
+    if (c->apply && !c->variation_applied)
     {
       (base+substitutions).collect_feature_substitutes_with_variations (c);
-      c->apply = false; // set variations only once
+      c->variation_applied = true; // set variations only once
     }
   }
 
-  bool subset (hb_subset_layout_context_t *c, const void *base) const
+  bool subset (hb_subset_layout_context_t *c, const void *base,
+               bool insert_catch_all = false) const
   {
     TRACE_SUBSET (this);
     auto *out = c->subset_context->serializer->embed (this);
     if (unlikely (!out)) return_trace (false);
 
-    out->conditions.serialize_subset (c->subset_context, conditions, base, c);
-    out->substitutions.serialize_subset (c->subset_context, substitutions, base, c);
+    out->conditions.serialize_subset (c->subset_context, conditions, base, c, insert_catch_all);
+    out->substitutions.serialize_subset (c->subset_context, substitutions, base, c, insert_catch_all);
 
     return_trace (true);
   }
@@ -3343,7 +3840,11 @@ struct FeatureVariations
     {
       c->cur_record_idx = i;
       varRecords[i].collect_feature_substitutes_with_variations (c, this);
+      if (c->universal)
+        break;
     }
+    if (c->universal || c->record_cond_idx_map->is_empty ())
+      c->catch_all_record_feature_idxes.reset ();
   }
 
   FeatureVariations* copy (hb_serialize_context_t *c) const
@@ -3353,11 +3854,17 @@ struct FeatureVariations
   }
 
   void collect_lookups (const hb_set_t *feature_indexes,
-			const hb_hashmap_t<unsigned, const Feature*> *feature_substitutes_map,
+			const hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *feature_record_cond_idx_map,
 			hb_set_t       *lookup_indexes /* OUT */) const
   {
-    for (const FeatureVariationRecord& r : varRecords)
-      r.collect_lookups (this, feature_indexes, feature_substitutes_map, lookup_indexes);
+    unsigned count = varRecords.len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (feature_record_cond_idx_map &&
+          !feature_record_cond_idx_map->has (i))
+        continue;
+      varRecords[i].collect_lookups (this, feature_indexes, lookup_indexes);
+    }
   }
 
   void closure_features (const hb_map_t *lookup_indexes,
@@ -3402,6 +3909,13 @@ struct FeatureVariations
       l->cur_feature_var_record_idx = i;
       subset_record_array (l, &(out->varRecords), this) (varRecords[i]);
     }
+
+    if (out->varRecords.len && !l->catch_all_record_feature_idxes->is_empty ())
+    {
+      bool insert_catch_all_record = true;
+      subset_record_array (l, &(out->varRecords), this, insert_catch_all_record) (varRecords[0]);
+    }
+
     return_trace (bool (out->varRecords));
   }
 
@@ -3409,6 +3923,7 @@ struct FeatureVariations
   {
     TRACE_SANITIZE (this);
     return_trace (version.sanitize (c) &&
+		  hb_barrier () &&
 		  likely (version.major == 1) &&
 		  varRecords.sanitize (c, this));
   }
@@ -3515,13 +4030,13 @@ struct VariationDevice
   private:
 
   hb_position_t get_x_delta (hb_font_t *font,
-			     const VariationStore &store,
-			     VariationStore::cache_t *store_cache = nullptr) const
+			     const ItemVariationStore &store,
+			     ItemVariationStore::cache_t *store_cache = nullptr) const
   { return font->em_scalef_x (get_delta (font, store, store_cache)); }
 
   hb_position_t get_y_delta (hb_font_t *font,
-			     const VariationStore &store,
-			     VariationStore::cache_t *store_cache = nullptr) const
+			     const ItemVariationStore &store,
+			     ItemVariationStore::cache_t *store_cache = nullptr) const
   { return font->em_scalef_y (get_delta (font, store, store_cache)); }
 
   VariationDevice* copy (hb_serialize_context_t *c,
@@ -3538,22 +4053,13 @@ struct VariationDevice
     auto *out = c->embed (this);
     if (unlikely (!out)) return_trace (nullptr);
 
-    unsigned new_idx = hb_first (*v);
-    out->varIdx = new_idx;
+    if (!c->check_assign (out->varIdx, hb_first (*v), HB_SERIALIZE_ERROR_INT_OVERFLOW))
+      return_trace (nullptr);
     return_trace (out);
   }
 
   void collect_variation_index (hb_collect_variation_indices_context_t *c) const
-  {
-    c->layout_variation_indices->add (varIdx);
-    int delta = 0;
-    if (c->font && c->var_store)
-      delta = roundf (get_delta (c->font, *c->var_store, c->store_cache));
-
-    /* set new varidx to HB_OT_LAYOUT_NO_VARIATIONS_INDEX here, will remap
-     * varidx later*/
-    c->varidx_delta_map->set (varIdx, hb_pair_t<unsigned, int> (HB_OT_LAYOUT_NO_VARIATIONS_INDEX, delta));
-  }
+  { c->layout_variation_indices->add (varIdx); }
 
   bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -3564,10 +4070,10 @@ struct VariationDevice
   private:
 
   float get_delta (hb_font_t *font,
-		   const VariationStore &store,
-		   VariationStore::cache_t *store_cache = nullptr) const
+		   const ItemVariationStore &store,
+		   ItemVariationStore::cache_t *store_cache = nullptr) const
   {
-    return store.get_delta (varIdx, font->coords, font->num_coords, (VariationStore::cache_t *) store_cache);
+    return store.get_delta (varIdx, font->coords, font->num_coords, (ItemVariationStore::cache_t *) store_cache);
   }
 
   protected:
@@ -3591,8 +4097,8 @@ struct DeviceHeader
 struct Device
 {
   hb_position_t get_x_delta (hb_font_t *font,
-			     const VariationStore &store=Null (VariationStore),
-			     VariationStore::cache_t *store_cache = nullptr) const
+			     const ItemVariationStore &store=Null (ItemVariationStore),
+			     ItemVariationStore::cache_t *store_cache = nullptr) const
   {
     switch (u.b.format)
     {
@@ -3609,8 +4115,8 @@ struct Device
     }
   }
   hb_position_t get_y_delta (hb_font_t *font,
-			     const VariationStore &store=Null (VariationStore),
-			     VariationStore::cache_t *store_cache = nullptr) const
+			     const ItemVariationStore &store=Null (ItemVariationStore),
+			     ItemVariationStore::cache_t *store_cache = nullptr) const
   {
     switch (u.b.format)
     {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gsubgpos.hh	2024-11-20 13:56:33.000000000 +0000
@@ -143,9 +143,12 @@ struct hb_closure_context_t :
     return active_glyphs_stack.tail ();
   }
 
-  hb_set_t& push_cur_active_glyphs ()
+  hb_set_t* push_cur_active_glyphs ()
   {
-    return *active_glyphs_stack.push ();
+    hb_set_t *s = active_glyphs_stack.push ();
+    if (unlikely (active_glyphs_stack.in_error ()))
+      return nullptr;
+    return s;
   }
 
   bool pop_cur_done_glyphs ()
@@ -399,16 +402,6 @@ struct hb_ot_apply_context_t :
 {
   struct matcher_t
   {
-    matcher_t () :
-	     lookup_props (0),
-	     mask (-1),
-	     ignore_zwnj (false),
-	     ignore_zwj (false),
-	     per_syllable (false),
-	     syllable {0},
-	     match_func (nullptr),
-	     match_data (nullptr) {}
-
     typedef bool (*match_func_t) (hb_glyph_info_t &info, unsigned value, const void *data);
 
     void set_ignore_zwnj (bool ignore_zwnj_) { ignore_zwnj = ignore_zwnj_; }
@@ -427,6 +420,9 @@ struct hb_ot_apply_context_t :
       MATCH_MAYBE
     };
 
+#ifndef HB_OPTIMIZE_SIZE
+    HB_ALWAYS_INLINE
+#endif
     may_match_t may_match (hb_glyph_info_t &info,
 			   hb_codepoint_t glyph_data) const
     {
@@ -446,6 +442,9 @@ struct hb_ot_apply_context_t :
       SKIP_MAYBE
     };
 
+#ifndef HB_OPTIMIZE_SIZE
+    HB_ALWAYS_INLINE
+#endif
     may_skip_t may_skip (const hb_ot_apply_context_t *c,
 			 const hb_glyph_info_t       &info) const
     {
@@ -461,14 +460,14 @@ struct hb_ot_apply_context_t :
     }
 
     protected:
-    unsigned int lookup_props;
-    hb_mask_t mask;
-    bool ignore_zwnj;
-    bool ignore_zwj;
-    bool per_syllable;
-    uint8_t syllable;
-    match_func_t match_func;
-    const void *match_data;
+    unsigned int lookup_props = 0;
+    hb_mask_t mask = -1;
+    bool ignore_zwnj = false;
+    bool ignore_zwj = false;
+    bool per_syllable = false;
+    uint8_t syllable = 0;
+    match_func_t match_func = nullptr;
+    const void *match_data = nullptr;
   };
 
   struct skipping_iterator_t
@@ -476,6 +475,7 @@ struct hb_ot_apply_context_t :
     void init (hb_ot_apply_context_t *c_, bool context_match = false)
     {
       c = c_;
+      end = c->buffer->len;
       match_glyph_data16 = nullptr;
 #ifndef HB_NO_BEYOND_64K
       match_glyph_data24 = nullptr;
@@ -489,6 +489,7 @@ struct hb_ot_apply_context_t :
       matcher.set_mask (context_match ? -1 : c->lookup_mask);
       /* Per syllable matching is only for GSUB. */
       matcher.set_per_syllable (c->table_index == 0 && c->per_syllable);
+      matcher.set_syllable (0);
     }
     void set_lookup_props (unsigned int lookup_props)
     {
@@ -514,22 +515,34 @@ struct hb_ot_apply_context_t :
     }
 #endif
 
-    void reset (unsigned int start_index_,
-		unsigned int num_items_)
+#ifndef HB_OPTIMIZE_SIZE
+    HB_ALWAYS_INLINE
+#endif
+    void reset (unsigned int start_index_)
     {
       idx = start_index_;
-      num_items = num_items_;
       end = c->buffer->len;
       matcher.set_syllable (start_index_ == c->buffer->idx ? c->buffer->cur().syllable () : 0);
     }
 
+#ifndef HB_OPTIMIZE_SIZE
+    HB_ALWAYS_INLINE
+#endif
+    void reset_fast (unsigned int start_index_)
+    {
+      // Doesn't set end or syllable. Used by GPOS which doesn't care / change.
+      idx = start_index_;
+    }
+
     void reject ()
     {
-      num_items++;
       backup_glyph_data ();
     }
 
     matcher_t::may_skip_t
+#ifndef HB_OPTIMIZE_SIZE
+    HB_ALWAYS_INLINE
+#endif
     may_skip (const hb_glyph_info_t &info) const
     { return matcher.may_skip (c, info); }
 
@@ -539,6 +552,9 @@ struct hb_ot_apply_context_t :
       SKIP
     };
 
+#ifndef HB_OPTIMIZE_SIZE
+    HB_ALWAYS_INLINE
+#endif
     match_t match (hb_glyph_info_t &info)
     {
       matcher_t::may_skip_t skip = matcher.may_skip (c, info);
@@ -557,14 +573,12 @@ struct hb_ot_apply_context_t :
       return SKIP;
   }
 
+#ifndef HB_OPTIMIZE_SIZE
+    HB_ALWAYS_INLINE
+#endif
     bool next (unsigned *unsafe_to = nullptr)
     {
-      assert (num_items > 0);
-      /* The alternate condition below is faster at string boundaries,
-       * but produces subpar "unsafe-to-concat" values. */
-      signed stop = (signed) end - (signed) num_items;
-      if (c->buffer->flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT)
-        stop = (signed) end - 1;
+      const signed stop = (signed) end - 1;
       while ((signed) idx < stop)
       {
 	idx++;
@@ -572,7 +586,6 @@ struct hb_ot_apply_context_t :
 	{
 	  case MATCH:
 	  {
-	    num_items--;
 	    advance_glyph_data ();
 	    return true;
 	  }
@@ -590,14 +603,12 @@ struct hb_ot_apply_context_t :
         *unsafe_to = end;
       return false;
     }
+#ifndef HB_OPTIMIZE_SIZE
+    HB_ALWAYS_INLINE
+#endif
     bool prev (unsigned *unsafe_from = nullptr)
     {
-      assert (num_items > 0);
-      /* The alternate condition below is faster at string boundaries,
-       * but produces subpar "unsafe-to-concat" values. */
-      unsigned stop = num_items - 1;
-      if (c->buffer->flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT)
-        stop = 1 - 1;
+      const unsigned stop = 0;
       while (idx > stop)
       {
 	idx--;
@@ -605,7 +616,6 @@ struct hb_ot_apply_context_t :
 	{
 	  case MATCH:
 	  {
-	    num_items--;
 	    advance_glyph_data ();
 	    return true;
 	  }
@@ -624,6 +634,7 @@ struct hb_ot_apply_context_t :
       return false;
     }
 
+    HB_ALWAYS_INLINE
     hb_codepoint_t
     get_glyph_data ()
     {
@@ -634,6 +645,7 @@ struct hb_ot_apply_context_t :
 #endif
       return 0;
     }
+    HB_ALWAYS_INLINE
     void
     advance_glyph_data ()
     {
@@ -662,7 +674,6 @@ struct hb_ot_apply_context_t :
     const HBUINT24 *match_glyph_data24;
 #endif
 
-    unsigned int num_items;
     unsigned int end;
   };
 
@@ -693,10 +704,12 @@ struct hb_ot_apply_context_t :
   hb_font_t *font;
   hb_face_t *face;
   hb_buffer_t *buffer;
+  hb_sanitize_context_t sanitizer;
   recurse_func_t recurse_func = nullptr;
   const GDEF &gdef;
-  const VariationStore &var_store;
-  VariationStore::cache_t *var_store_cache;
+  const GDEF::accelerator_t &gdef_accel;
+  const ItemVariationStore &var_store;
+  ItemVariationStore::cache_t *var_store_cache;
   hb_set_digest_t digest;
 
   hb_direction_t direction;
@@ -710,7 +723,6 @@ struct hb_ot_apply_context_t :
   bool auto_zwj = true;
   bool per_syllable = false;
   bool random = false;
-  uint32_t random_state = 1;
   unsigned new_syllables = (unsigned) -1;
 
   signed last_base = -1; // GPOS uses
@@ -718,9 +730,11 @@ struct hb_ot_apply_context_t :
 
   hb_ot_apply_context_t (unsigned int table_index_,
 			 hb_font_t *font_,
-			 hb_buffer_t *buffer_) :
+			 hb_buffer_t *buffer_,
+			 hb_blob_t *table_blob_) :
 			table_index (table_index_),
 			font (font_), face (font->face), buffer (buffer_),
+			sanitizer (table_blob_),
 			gdef (
 #ifndef HB_NO_OT_LAYOUT
 			      *face->table.GDEF->table
@@ -728,6 +742,13 @@ struct hb_ot_apply_context_t :
 			      Null (GDEF)
 #endif
 			     ),
+			gdef_accel (
+#ifndef HB_NO_OT_LAYOUT
+			      *face->table.GDEF
+#else
+			      Null (GDEF::accelerator_t)
+#endif
+			     ),
 			var_store (gdef.get_var_store ()),
 			var_store_cache (
 #ifndef HB_NO_VAR
@@ -744,7 +765,7 @@ struct hb_ot_apply_context_t :
   ~hb_ot_apply_context_t ()
   {
 #ifndef HB_NO_VAR
-    VariationStore::destroy_cache (var_store_cache);
+    ItemVariationStore::destroy_cache (var_store_cache);
 #endif
   }
 
@@ -754,10 +775,10 @@ struct hb_ot_apply_context_t :
     iter_context.init (this, true);
   }
 
-  void set_lookup_mask (hb_mask_t mask) { lookup_mask = mask; last_base = -1; last_base_until = 0; init_iters (); }
-  void set_auto_zwj (bool auto_zwj_) { auto_zwj = auto_zwj_; init_iters (); }
-  void set_auto_zwnj (bool auto_zwnj_) { auto_zwnj = auto_zwnj_; init_iters (); }
-  void set_per_syllable (bool per_syllable_) { per_syllable = per_syllable_; init_iters (); }
+  void set_lookup_mask (hb_mask_t mask, bool init = true) { lookup_mask = mask; last_base = -1; last_base_until = 0; if (init) init_iters (); }
+  void set_auto_zwj (bool auto_zwj_, bool init = true) { auto_zwj = auto_zwj_; if (init) init_iters (); }
+  void set_auto_zwnj (bool auto_zwnj_, bool init = true) { auto_zwnj = auto_zwnj_; if (init) init_iters (); }
+  void set_per_syllable (bool per_syllable_, bool init = true) { per_syllable = per_syllable_; if (init) init_iters (); }
   void set_random (bool random_) { random = random_; }
   void set_recurse_func (recurse_func_t func) { recurse_func = func; }
   void set_lookup_index (unsigned int lookup_index_) { lookup_index = lookup_index_; }
@@ -766,8 +787,8 @@ struct hb_ot_apply_context_t :
   uint32_t random_number ()
   {
     /* http://www.cplusplus.com/reference/random/minstd_rand/ */
-    random_state = random_state * 48271 % 2147483647;
-    return random_state;
+    buffer->random_state = buffer->random_state * 48271 % 2147483647;
+    return buffer->random_state;
   }
 
   bool match_properties_mark (hb_codepoint_t  glyph,
@@ -778,7 +799,7 @@ struct hb_ot_apply_context_t :
      * match_props has the set index.
      */
     if (match_props & LookupFlag::UseMarkFilteringSet)
-      return gdef.mark_set_covers (match_props >> 16, glyph);
+      return gdef_accel.mark_set_covers (match_props >> 16, glyph);
 
     /* The second byte of match_props has the meaning
      * "ignore marks of attachment type different than
@@ -790,10 +811,12 @@ struct hb_ot_apply_context_t :
     return true;
   }
 
+#ifndef HB_OPTIMIZE_SIZE
+  HB_ALWAYS_INLINE
+#endif
   bool check_glyph_property (const hb_glyph_info_t *info,
 			     unsigned int  match_props) const
   {
-    hb_codepoint_t glyph = info->codepoint;
     unsigned int glyph_props = _hb_glyph_info_get_glyph_props (info);
 
     /* Not covered, if, for example, glyph class is ligature and
@@ -803,7 +826,7 @@ struct hb_ot_apply_context_t :
       return false;
 
     if (unlikely (glyph_props & HB_OT_LAYOUT_GLYPH_PROPS_MARK))
-      return match_properties_mark (glyph, glyph_props, match_props);
+      return match_properties_mark (info->codepoint, glyph_props, match_props);
 
     return true;
   }
@@ -836,7 +859,7 @@ struct hb_ot_apply_context_t :
     if (likely (has_glyph_classes))
     {
       props &= HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE;
-      _hb_glyph_info_set_glyph_props (&buffer->cur(), props | gdef.get_glyph_props (glyph_index));
+      _hb_glyph_info_set_glyph_props (&buffer->cur(), props | gdef_accel.get_glyph_props (glyph_index));
     }
     else if (class_guess)
     {
@@ -884,7 +907,7 @@ struct hb_accelerate_subtables_context_t
 
 #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
   template <typename T>
-  static inline auto apply_cached_ (const T *obj, hb_ot_apply_context_t *c, hb_priority<1>) HB_RETURN (bool, obj->apply (c, true) )
+  static inline auto apply_cached_ (const T *obj, hb_ot_apply_context_t *c, hb_priority<1>) HB_RETURN (bool, obj->apply_cached (c) )
   template <typename T>
   static inline auto apply_cached_ (const T *obj, hb_ot_apply_context_t *c, hb_priority<0>) HB_RETURN (bool, obj->apply (c) )
   template <typename Type>
@@ -1148,6 +1171,10 @@ static inline void collect_array (hb_col
 }
 
 
+static inline bool match_always (hb_glyph_info_t &info HB_UNUSED, unsigned value HB_UNUSED, const void *data HB_UNUSED)
+{
+  return true;
+}
 static inline bool match_glyph (hb_glyph_info_t &info, unsigned value, const void *data HB_UNUSED)
 {
   return info.codepoint == value;
@@ -1168,6 +1195,28 @@ static inline bool match_class_cached (h
     info.syllable() = klass;
   return klass == value;
 }
+static inline bool match_class_cached1 (hb_glyph_info_t &info, unsigned value, const void *data)
+{
+  unsigned klass = info.syllable() & 0x0F;
+  if (klass < 15)
+    return klass == value;
+  const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
+  klass = class_def.get_class (info.codepoint);
+  if (likely (klass < 15))
+    info.syllable() = (info.syllable() & 0xF0) | klass;
+  return klass == value;
+}
+static inline bool match_class_cached2 (hb_glyph_info_t &info, unsigned value, const void *data)
+{
+  unsigned klass = (info.syllable() & 0xF0) >> 4;
+  if (klass < 15)
+    return klass == value;
+  const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
+  klass = class_def.get_class (info.codepoint);
+  if (likely (klass < 15))
+    info.syllable() = (info.syllable() & 0x0F) | (klass << 4);
+  return klass == value;
+}
 static inline bool match_coverage (hb_glyph_info_t &info, unsigned value, const void *data)
 {
   Offset16To<Coverage> coverage;
@@ -1196,14 +1245,17 @@ static inline bool would_match_input (hb
   return true;
 }
 template <typename HBUINT>
-static inline bool match_input (hb_ot_apply_context_t *c,
-				unsigned int count, /* Including the first glyph (not matched) */
-				const HBUINT input[], /* Array of input values--start with second glyph */
-				match_func_t match_func,
-				const void *match_data,
-				unsigned int *end_position,
-				unsigned int match_positions[HB_MAX_CONTEXT_LENGTH],
-				unsigned int *p_total_component_count = nullptr)
+#ifndef HB_OPTIMIZE_SIZE
+HB_ALWAYS_INLINE
+#endif
+static bool match_input (hb_ot_apply_context_t *c,
+			 unsigned int count, /* Including the first glyph (not matched) */
+			 const HBUINT input[], /* Array of input values--start with second glyph */
+			 match_func_t match_func,
+			 const void *match_data,
+			 unsigned int *end_position,
+			 unsigned int match_positions[HB_MAX_CONTEXT_LENGTH],
+			 unsigned int *p_total_component_count = nullptr)
 {
   TRACE_APPLY (nullptr);
 
@@ -1212,7 +1264,7 @@ static inline bool match_input (hb_ot_ap
   hb_buffer_t *buffer = c->buffer;
 
   hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
-  skippy_iter.reset (buffer->idx, count - 1);
+  skippy_iter.reset (buffer->idx);
   skippy_iter.set_match_func (match_func, match_data);
   skippy_iter.set_glyph_data (input);
 
@@ -1241,7 +1293,6 @@ static inline bool match_input (hb_ot_ap
    */
 
   unsigned int total_component_count = 0;
-  total_component_count += _hb_glyph_info_get_lig_num_comps (&buffer->cur());
 
   unsigned int first_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur());
   unsigned int first_lig_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
@@ -1252,7 +1303,6 @@ static inline bool match_input (hb_ot_ap
     LIGBASE_MAY_SKIP
   } ligbase = LIGBASE_NOT_CHECKED;
 
-  match_positions[0] = buffer->idx;
   for (unsigned int i = 1; i < count; i++)
   {
     unsigned unsafe_to;
@@ -1317,7 +1367,12 @@ static inline bool match_input (hb_ot_ap
   *end_position = skippy_iter.idx + 1;
 
   if (p_total_component_count)
+  {
+    total_component_count += _hb_glyph_info_get_lig_num_comps (&buffer->cur());
     *p_total_component_count = total_component_count;
+  }
+
+  match_positions[0] = buffer->idx;
 
   return_trace (true);
 }
@@ -1436,17 +1491,20 @@ static inline bool ligate_input (hb_ot_a
 }
 
 template <typename HBUINT>
-static inline bool match_backtrack (hb_ot_apply_context_t *c,
-				    unsigned int count,
-				    const HBUINT backtrack[],
-				    match_func_t match_func,
-				    const void *match_data,
-				    unsigned int *match_start)
+#ifndef HB_OPTIMIZE_SIZE
+HB_ALWAYS_INLINE
+#endif
+static bool match_backtrack (hb_ot_apply_context_t *c,
+			     unsigned int count,
+			     const HBUINT backtrack[],
+			     match_func_t match_func,
+			     const void *match_data,
+			     unsigned int *match_start)
 {
   TRACE_APPLY (nullptr);
 
   hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
-  skippy_iter.reset (c->buffer->backtrack_len (), count);
+  skippy_iter.reset (c->buffer->backtrack_len ());
   skippy_iter.set_match_func (match_func, match_data);
   skippy_iter.set_glyph_data (backtrack);
 
@@ -1465,18 +1523,21 @@ static inline bool match_backtrack (hb_o
 }
 
 template <typename HBUINT>
-static inline bool match_lookahead (hb_ot_apply_context_t *c,
-				    unsigned int count,
-				    const HBUINT lookahead[],
-				    match_func_t match_func,
-				    const void *match_data,
-				    unsigned int start_index,
-				    unsigned int *end_index)
+#ifndef HB_OPTIMIZE_SIZE
+HB_ALWAYS_INLINE
+#endif
+static bool match_lookahead (hb_ot_apply_context_t *c,
+			     unsigned int count,
+			     const HBUINT lookahead[],
+			     match_func_t match_func,
+			     const void *match_data,
+			     unsigned int start_index,
+			     unsigned int *end_index)
 {
   TRACE_APPLY (nullptr);
 
   hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
-  skippy_iter.reset (start_index - 1, count);
+  skippy_iter.reset (start_index - 1);
   skippy_iter.set_match_func (match_func, match_data);
   skippy_iter.set_glyph_data (lookahead);
 
@@ -1595,10 +1656,13 @@ static void context_closure_recurse_look
     }
 
     covered_seq_indicies.add (seqIndex);
+    hb_set_t *cur_active_glyphs = c->push_cur_active_glyphs ();
+    if (unlikely (!cur_active_glyphs))
+      return;
     if (has_pos_glyphs) {
-      c->push_cur_active_glyphs () = std::move (pos_glyphs);
+      *cur_active_glyphs = std::move (pos_glyphs);
     } else {
-      c->push_cur_active_glyphs ().set (*c->glyphs);
+      *cur_active_glyphs = *c->glyphs;
     }
 
     unsigned endIndex = inputCount;
@@ -1848,12 +1912,13 @@ static inline bool context_would_apply_l
 }
 
 template <typename HBUINT>
-static inline bool context_apply_lookup (hb_ot_apply_context_t *c,
-					 unsigned int inputCount, /* Including the first glyph (not matched) */
-					 const HBUINT input[], /* Array of input values--start with second glyph */
-					 unsigned int lookupCount,
-					 const LookupRecord lookupRecord[],
-					 const ContextApplyLookupContext &lookup_context)
+HB_ALWAYS_INLINE
+static bool context_apply_lookup (hb_ot_apply_context_t *c,
+				  unsigned int inputCount, /* Including the first glyph (not matched) */
+				  const HBUINT input[], /* Array of input values--start with second glyph */
+				  unsigned int lookupCount,
+				  const LookupRecord lookupRecord[],
+				  const ContextApplyLookupContext &lookup_context)
 {
   unsigned match_end = 0;
   unsigned match_positions[HB_MAX_CONTEXT_LENGTH];
@@ -1879,6 +1944,9 @@ static inline bool context_apply_lookup
 template <typename Types>
 struct Rule
 {
+  template <typename T>
+  friend struct RuleSet;
+
   bool intersects (const hb_set_t *glyphs, ContextClosureLookupContext &lookup_context) const
   {
     return context_intersects (glyphs,
@@ -1981,8 +2049,8 @@ struct Rule
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (inputCount.sanitize (c) &&
-		  lookupCount.sanitize (c) &&
+    return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  c->check_range (inputZ.arrayZ,
 				  inputZ.item_size * (inputCount ? inputCount - 1 : 0) +
 				  LookupRecord::static_size * lookupCount));
@@ -2066,13 +2134,105 @@ struct RuleSet
 	      const ContextApplyLookupContext &lookup_context) const
   {
     TRACE_APPLY (this);
-    return_trace (
-    + hb_iter (rule)
-    | hb_map (hb_add (this))
-    | hb_map ([&] (const Rule &_) { return _.apply (c, lookup_context); })
-    | hb_any
-    )
-    ;
+
+    unsigned num_rules = rule.len;
+
+#ifndef HB_NO_OT_RULESETS_FAST_PATH
+    if (HB_OPTIMIZE_SIZE_VAL || num_rules <= 4)
+#endif
+    {
+    slow:
+      return_trace (
+      + hb_iter (rule)
+      | hb_map (hb_add (this))
+      | hb_map ([&] (const Rule &_) { return _.apply (c, lookup_context); })
+      | hb_any
+      )
+      ;
+    }
+
+    /* This version is optimized for speed by matching the first & second
+     * components of the rule here, instead of calling into the matching code.
+     *
+     * Replicated from LigatureSet::apply(). */
+
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    skippy_iter.reset (c->buffer->idx);
+    skippy_iter.set_match_func (match_always, nullptr);
+    skippy_iter.set_glyph_data ((HBUINT16 *) nullptr);
+    unsigned unsafe_to = (unsigned) -1, unsafe_to1 = 0, unsafe_to2 = 0;
+    hb_glyph_info_t *first = nullptr, *second = nullptr;
+    bool matched = skippy_iter.next ();
+    if (likely (matched))
+    {
+      first = &c->buffer->info[skippy_iter.idx];
+      unsafe_to = skippy_iter.idx + 1;
+
+      if (skippy_iter.may_skip (c->buffer->info[skippy_iter.idx]))
+      {
+	/* Can't use the fast path if eg. the next char is a default-ignorable
+	 * or other skippable. */
+        goto slow;
+      }
+    }
+    else
+    {
+      /* Failed to match a next glyph. Only try applying rules that have
+       * no further input. */
+      return_trace (
+      + hb_iter (rule)
+      | hb_map (hb_add (this))
+      | hb_filter ([&] (const Rule &_) { return _.inputCount <= 1; })
+      | hb_map ([&] (const Rule &_) { return _.apply (c, lookup_context); })
+      | hb_any
+      )
+      ;
+    }
+    matched = skippy_iter.next ();
+    if (likely (matched && !skippy_iter.may_skip (c->buffer->info[skippy_iter.idx])))
+    {
+      second = &c->buffer->info[skippy_iter.idx];
+      unsafe_to2 = skippy_iter.idx + 1;
+    }
+
+    auto match_input = lookup_context.funcs.match;
+    auto *input_data = lookup_context.match_data;
+    for (unsigned int i = 0; i < num_rules; i++)
+    {
+      const auto &r = this+rule.arrayZ[i];
+
+      const auto &input = r.inputZ;
+
+      if (r.inputCount <= 1 ||
+	  (!match_input ||
+	   match_input (*first, input.arrayZ[0], input_data)))
+      {
+        if (!second ||
+	    (r.inputCount <= 2 ||
+	     (!match_input ||
+	      match_input (*second, input.arrayZ[1], input_data)))
+	   )
+	{
+	  if (r.apply (c, lookup_context))
+	  {
+	    if (unsafe_to != (unsigned) -1)
+	      c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to);
+	    return_trace (true);
+	  }
+	}
+	else
+	  unsafe_to = unsafe_to2;
+      }
+      else
+      {
+	if (unsafe_to == (unsigned) -1)
+	  unsafe_to = unsafe_to1;
+      }
+    }
+    if (likely (unsafe_to != (unsigned) -1))
+      c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to);
+
+    return_trace (false);
   }
 
   bool subset (hb_subset_context_t *c,
@@ -2148,8 +2308,9 @@ struct ContextFormat1_4
 
   void closure (hb_closure_context_t *c) const
   {
-    hb_set_t& cur_active_glyphs = c->push_cur_active_glyphs ();
-    get_coverage ().intersect_set (c->previous_parent_active_glyphs (), cur_active_glyphs);
+    hb_set_t* cur_active_glyphs = c->push_cur_active_glyphs ();
+    if (unlikely (!cur_active_glyphs)) return;
+    get_coverage ().intersect_set (c->previous_parent_active_glyphs (), *cur_active_glyphs);
 
     struct ContextClosureLookupContext lookup_context = {
       {intersects_glyph, intersected_glyph},
@@ -2318,9 +2479,10 @@ struct ContextFormat2_5
     if (!(this+coverage).intersects (c->glyphs))
       return;
 
-    hb_set_t& cur_active_glyphs = c->push_cur_active_glyphs ();
+    hb_set_t* cur_active_glyphs = c->push_cur_active_glyphs ();
+    if (unlikely (!cur_active_glyphs)) return;
     get_coverage ().intersect_set (c->previous_parent_active_glyphs (),
-                                                 cur_active_glyphs);
+				   *cur_active_glyphs);
 
     const ClassDef &class_def = this+classDef;
 
@@ -2431,7 +2593,9 @@ struct ContextFormat2_5
     }
   }
 
-  bool apply (hb_ot_apply_context_t *c, bool cached = false) const
+  bool apply_cached (hb_ot_apply_context_t *c) const { return _apply (c, true); }
+  bool apply (hb_ot_apply_context_t *c) const { return _apply (c, false); }
+  bool _apply (hb_ot_apply_context_t *c, bool cached) const
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
@@ -2447,11 +2611,7 @@ struct ContextFormat2_5
     if (cached && c->buffer->cur().syllable() < 255)
       index = c->buffer->cur().syllable ();
     else
-    {
       index = class_def.get_class (c->buffer->cur().codepoint);
-      if (cached && index < 255)
-	c->buffer->cur().syllable() = index;
-    }
     const RuleSet &rule_set = this+ruleSet[index];
     return_trace (rule_set.apply (c, lookup_context));
   }
@@ -2561,10 +2721,10 @@ struct ContextFormat3
     if (!(this+coverageZ[0]).intersects (c->glyphs))
       return;
 
-    hb_set_t& cur_active_glyphs = c->push_cur_active_glyphs ();
+    hb_set_t* cur_active_glyphs = c->push_cur_active_glyphs ();
+    if (unlikely (!cur_active_glyphs)) return;
     get_coverage ().intersect_set (c->previous_parent_active_glyphs (),
-                                                 cur_active_glyphs);
-
+				   *cur_active_glyphs);
 
     const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
     struct ContextClosureLookupContext lookup_context = {
@@ -2665,14 +2825,15 @@ struct ContextFormat3
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!c->check_struct (this)) return_trace (false);
+    if (unlikely (!c->check_struct (this))) return_trace (false);
+    hb_barrier ();
     unsigned int count = glyphCount;
-    if (!count) return_trace (false); /* We want to access coverageZ[0] freely. */
-    if (!c->check_array (coverageZ.arrayZ, count)) return_trace (false);
+    if (unlikely (!count)) return_trace (false); /* We want to access coverageZ[0] freely. */
+    if (unlikely (!c->check_array (coverageZ.arrayZ, count))) return_trace (false);
     for (unsigned int i = 0; i < count; i++)
-      if (!coverageZ[i].sanitize (c, this)) return_trace (false);
+      if (unlikely (!coverageZ[i].sanitize (c, this))) return_trace (false);
     const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
-    return_trace (c->check_array (lookupRecord, lookupCount));
+    return_trace (likely (c->check_array (lookupRecord, lookupCount)));
   }
 
   protected:
@@ -2845,16 +3006,17 @@ static inline bool chain_context_would_a
 }
 
 template <typename HBUINT>
-static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c,
-					       unsigned int backtrackCount,
-					       const HBUINT backtrack[],
-					       unsigned int inputCount, /* Including the first glyph (not matched) */
-					       const HBUINT input[], /* Array of input values--start with second glyph */
-					       unsigned int lookaheadCount,
-					       const HBUINT lookahead[],
-					       unsigned int lookupCount,
-					       const LookupRecord lookupRecord[],
-					       const ChainContextApplyLookupContext &lookup_context)
+HB_ALWAYS_INLINE
+static bool chain_context_apply_lookup (hb_ot_apply_context_t *c,
+					unsigned int backtrackCount,
+					const HBUINT backtrack[],
+					unsigned int inputCount, /* Including the first glyph (not matched) */
+					const HBUINT input[], /* Array of input values--start with second glyph */
+					unsigned int lookaheadCount,
+					const HBUINT lookahead[],
+					unsigned int lookupCount,
+					const LookupRecord lookupRecord[],
+					const ChainContextApplyLookupContext &lookup_context)
 {
   unsigned end_index = c->buffer->idx;
   unsigned match_end = 0;
@@ -2893,6 +3055,9 @@ static inline bool chain_context_apply_l
 template <typename Types>
 struct ChainRule
 {
+  template <typename T>
+  friend struct ChainRuleSet;
+
   bool intersects (const hb_set_t *glyphs, ChainContextClosureLookupContext &lookup_context) const
   {
     const auto &input = StructAfter<decltype (inputX)> (backtrack);
@@ -2992,8 +3157,6 @@ struct ChainRule
 		  const hb_map_t *lookahead_map = nullptr) const
   {
     TRACE_SERIALIZE (this);
-    auto *out = c->start_embed (this);
-    if (unlikely (!out)) return_trace (false);
 
     const hb_map_t *mapping = backtrack_map;
     serialize_array (c, backtrack.len, + backtrack.iter ()
@@ -3055,13 +3218,17 @@ struct ChainRule
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!backtrack.sanitize (c)) return_trace (false);
+    /* Hyper-optimized sanitized because this is really hot. */
+    if (unlikely (!backtrack.len.sanitize (c))) return_trace (false);
+    hb_barrier ();
     const auto &input = StructAfter<decltype (inputX)> (backtrack);
-    if (!input.sanitize (c)) return_trace (false);
+    if (unlikely (!input.lenP1.sanitize (c))) return_trace (false);
+    hb_barrier ();
     const auto &lookahead = StructAfter<decltype (lookaheadX)> (input);
-    if (!lookahead.sanitize (c)) return_trace (false);
+    if (unlikely (!lookahead.len.sanitize (c))) return_trace (false);
+    hb_barrier ();
     const auto &lookup = StructAfter<decltype (lookupX)> (lookahead);
-    return_trace (lookup.sanitize (c));
+    return_trace (likely (lookup.sanitize (c)));
   }
 
   protected:
@@ -3069,7 +3236,7 @@ struct ChainRule
 		backtrack;		/* Array of backtracking values
 					 * (to be matched before the input
 					 * sequence) */
-  HeadlessArrayOf<typename Types::HBUINT>
+  HeadlessArray16Of<typename Types::HBUINT>
 		inputX;			/* Array of input values (start with
 					 * second glyph) */
   Array16Of<typename Types::HBUINT>
@@ -3142,13 +3309,119 @@ struct ChainRuleSet
 	      const ChainContextApplyLookupContext &lookup_context) const
   {
     TRACE_APPLY (this);
-    return_trace (
-    + hb_iter (rule)
-    | hb_map (hb_add (this))
-    | hb_map ([&] (const ChainRule &_) { return _.apply (c, lookup_context); })
-    | hb_any
-    )
-    ;
+
+    unsigned num_rules = rule.len;
+
+#ifndef HB_NO_OT_RULESETS_FAST_PATH
+    if (HB_OPTIMIZE_SIZE_VAL || num_rules <= 4)
+#endif
+    {
+    slow:
+      return_trace (
+      + hb_iter (rule)
+      | hb_map (hb_add (this))
+      | hb_map ([&] (const ChainRule &_) { return _.apply (c, lookup_context); })
+      | hb_any
+      )
+      ;
+    }
+
+    /* This version is optimized for speed by matching the first & second
+     * components of the rule here, instead of calling into the matching code.
+     *
+     * Replicated from LigatureSet::apply(). */
+
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    skippy_iter.reset (c->buffer->idx);
+    skippy_iter.set_match_func (match_always, nullptr);
+    skippy_iter.set_glyph_data ((HBUINT16 *) nullptr);
+    unsigned unsafe_to = (unsigned) -1, unsafe_to1 = 0, unsafe_to2 = 0;
+    hb_glyph_info_t *first = nullptr, *second = nullptr;
+    bool matched = skippy_iter.next ();
+    if (likely (matched))
+    {
+      first = &c->buffer->info[skippy_iter.idx];
+      unsafe_to1 = skippy_iter.idx + 1;
+
+      if (skippy_iter.may_skip (c->buffer->info[skippy_iter.idx]))
+      {
+	/* Can't use the fast path if eg. the next char is a default-ignorable
+	 * or other skippable. */
+        goto slow;
+      }
+    }
+    else
+    {
+      /* Failed to match a next glyph. Only try applying rules that have
+       * no further input and lookahead. */
+      return_trace (
+      + hb_iter (rule)
+      | hb_map (hb_add (this))
+      | hb_filter ([&] (const ChainRule &_)
+		   {
+		     const auto &input = StructAfter<decltype (_.inputX)> (_.backtrack);
+		     const auto &lookahead = StructAfter<decltype (_.lookaheadX)> (input);
+		     return input.lenP1 <= 1 && lookahead.len == 0;
+		   })
+      | hb_map ([&] (const ChainRule &_) { return _.apply (c, lookup_context); })
+      | hb_any
+      )
+      ;
+    }
+    matched = skippy_iter.next ();
+    if (likely (matched && !skippy_iter.may_skip (c->buffer->info[skippy_iter.idx])))
+     {
+      second = &c->buffer->info[skippy_iter.idx];
+      unsafe_to2 = skippy_iter.idx + 1;
+     }
+
+    auto match_input = lookup_context.funcs.match[1];
+    auto match_lookahead = lookup_context.funcs.match[2];
+    auto *input_data = lookup_context.match_data[1];
+    auto *lookahead_data = lookup_context.match_data[2];
+    for (unsigned int i = 0; i < num_rules; i++)
+    {
+      const auto &r = this+rule.arrayZ[i];
+
+      const auto &input = StructAfter<decltype (r.inputX)> (r.backtrack);
+      const auto &lookahead = StructAfter<decltype (r.lookaheadX)> (input);
+
+      unsigned lenP1 = hb_max ((unsigned) input.lenP1, 1u);
+      if (lenP1 > 1 ?
+	   (!match_input ||
+	    match_input (*first, input.arrayZ[0], input_data))
+	  :
+	   (!lookahead.len || !match_lookahead ||
+	    match_lookahead (*first, lookahead.arrayZ[0], lookahead_data)))
+      {
+        if (!second ||
+	    (lenP1 > 2 ?
+	     (!match_input ||
+	      match_input (*second, input.arrayZ[1], input_data))
+	     :
+	     (lookahead.len <= 2 - lenP1 || !match_lookahead ||
+	      match_lookahead (*second, lookahead.arrayZ[2 - lenP1], lookahead_data))))
+	{
+	  if (r.apply (c, lookup_context))
+	  {
+	    if (unsafe_to != (unsigned) -1)
+	      c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to);
+	    return_trace (true);
+	  }
+	}
+	else
+	  unsafe_to = unsafe_to2;
+      }
+      else
+      {
+	if (unsafe_to == (unsigned) -1)
+	  unsafe_to = unsafe_to1;
+      }
+    }
+    if (likely (unsafe_to != (unsigned) -1))
+      c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to);
+
+    return_trace (false);
   }
 
   bool subset (hb_subset_context_t *c,
@@ -3229,9 +3502,10 @@ struct ChainContextFormat1_4
 
   void closure (hb_closure_context_t *c) const
   {
-    hb_set_t& cur_active_glyphs = c->push_cur_active_glyphs ();
+    hb_set_t* cur_active_glyphs = c->push_cur_active_glyphs ();
+    if (unlikely (!cur_active_glyphs)) return;
     get_coverage ().intersect_set (c->previous_parent_active_glyphs (),
-                                                 cur_active_glyphs);
+				   *cur_active_glyphs);
 
     struct ChainContextClosureLookupContext lookup_context = {
       {intersects_glyph, intersected_glyph},
@@ -3401,10 +3675,10 @@ struct ChainContextFormat2_5
     if (!(this+coverage).intersects (c->glyphs))
       return;
 
-    hb_set_t& cur_active_glyphs = c->push_cur_active_glyphs ();
+    hb_set_t* cur_active_glyphs = c->push_cur_active_glyphs ();
+    if (unlikely (!cur_active_glyphs)) return;
     get_coverage ().intersect_set (c->previous_parent_active_glyphs (),
-                                                 cur_active_glyphs);
-
+				   *cur_active_glyphs);
 
     const ClassDef &backtrack_class_def = this+backtrackClassDef;
     const ClassDef &input_class_def = this+inputClassDef;
@@ -3534,7 +3808,9 @@ struct ChainContextFormat2_5
     }
   }
 
-  bool apply (hb_ot_apply_context_t *c, bool cached = false) const
+  bool apply_cached (hb_ot_apply_context_t *c) const { return _apply (c, true); }
+  bool apply (hb_ot_apply_context_t *c) const { return _apply (c, false); }
+  bool _apply (hb_ot_apply_context_t *c, bool cached) const
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
@@ -3544,26 +3820,22 @@ struct ChainContextFormat2_5
     const ClassDef &input_class_def = this+inputClassDef;
     const ClassDef &lookahead_class_def = this+lookaheadClassDef;
 
-    /* For ChainContextFormat2_5 we cache the LookaheadClassDef instead of InputClassDef.
-     * The reason is that most heavy fonts want to identify a glyph in context and apply
-     * a lookup to it. In this scenario, the length of the input sequence is one, whereas
-     * the lookahead / backtrack are typically longer.  The one glyph in input sequence is
-     * looked-up below and no input glyph is looked up in individual rules, whereas the
-     * lookahead and backtrack glyphs are tried.  Since we match lookahead before backtrack,
-     * we should cache lookahead.  This decisions showed a 20% improvement in shaping of
-     * the Gulzar font.
-     */
-
+    /* match_class_caches1 is slightly faster. Use it for lookahead,
+     * which is typically longer. */
     struct ChainContextApplyLookupContext lookup_context = {
-      {{cached && &backtrack_class_def == &lookahead_class_def ? match_class_cached : match_class,
-        cached && &input_class_def == &lookahead_class_def ? match_class_cached : match_class,
-        cached ? match_class_cached : match_class}},
+      {{cached && &backtrack_class_def == &lookahead_class_def ? match_class_cached1 : match_class,
+        cached ? match_class_cached2 : match_class,
+        cached ? match_class_cached1 : match_class}},
       {&backtrack_class_def,
        &input_class_def,
        &lookahead_class_def}
     };
 
-    index = input_class_def.get_class (c->buffer->cur().codepoint);
+    // Note: Corresponds to match_class_cached2
+    if (cached && ((c->buffer->cur().syllable() & 0xF0) >> 4) < 15)
+      index = (c->buffer->cur().syllable () & 0xF0) >> 4;
+    else
+      index = input_class_def.get_class (c->buffer->cur().codepoint);
     const ChainRuleSet &rule_set = this+ruleSet[index];
     return_trace (rule_set.apply (c, lookup_context));
   }
@@ -3703,10 +3975,11 @@ struct ChainContextFormat3
     if (!(this+input[0]).intersects (c->glyphs))
       return;
 
-    hb_set_t& cur_active_glyphs = c->push_cur_active_glyphs ();
+    hb_set_t* cur_active_glyphs = c->push_cur_active_glyphs ();
+    if (unlikely (!cur_active_glyphs))
+      return;
     get_coverage ().intersect_set (c->previous_parent_active_glyphs (),
-                                                 cur_active_glyphs);
-
+				   *cur_active_glyphs);
 
     const auto &lookahead = StructAfter<decltype (lookaheadX)> (input);
     const auto &lookup = StructAfter<decltype (lookupX)> (lookahead);
@@ -3825,8 +4098,6 @@ struct ChainContextFormat3
   {
     TRACE_SUBSET (this);
 
-    auto *out = c->serializer->start_embed (this);
-    if (unlikely (!out)) return_trace (false);
     if (unlikely (!c->serializer->embed (this->format))) return_trace (false);
 
     if (!serialize_coverage_offsets (c, backtrack.iter (), this))
@@ -3853,14 +4124,17 @@ struct ChainContextFormat3
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!backtrack.sanitize (c, this)) return_trace (false);
+    if (unlikely (!backtrack.sanitize (c, this))) return_trace (false);
+    hb_barrier ();
     const auto &input = StructAfter<decltype (inputX)> (backtrack);
-    if (!input.sanitize (c, this)) return_trace (false);
-    if (!input.len) return_trace (false); /* To be consistent with Context. */
+    if (unlikely (!input.sanitize (c, this))) return_trace (false);
+    hb_barrier ();
+    if (unlikely (!input.len)) return_trace (false); /* To be consistent with Context. */
     const auto &lookahead = StructAfter<decltype (lookaheadX)> (input);
-    if (!lookahead.sanitize (c, this)) return_trace (false);
+    if (unlikely (!lookahead.sanitize (c, this))) return_trace (false);
+    hb_barrier ();
     const auto &lookup = StructAfter<decltype (lookupX)> (lookahead);
-    return_trace (lookup.sanitize (c));
+    return_trace (likely (lookup.sanitize (c)));
   }
 
   protected:
@@ -3942,6 +4216,7 @@ struct ExtensionFormat1
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  extensionLookupType != T::SubTable::Extension);
   }
 
@@ -3950,7 +4225,7 @@ struct ExtensionFormat1
     TRACE_SUBSET (this);
 
     auto *out = c->serializer->start_embed (this);
-    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
     out->format = format;
     out->extensionLookupType = extensionLookupType;
@@ -4068,6 +4343,9 @@ struct hb_ot_layout_lookup_accelerator_t
   bool may_have (hb_codepoint_t g) const
   { return digest.may_have (g); }
 
+#ifndef HB_OPTIMIZE_SIZE
+  HB_ALWAYS_INLINE
+#endif
   bool apply (hb_ot_apply_context_t *c, unsigned subtables_count, bool use_cache) const
   {
 #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
@@ -4202,13 +4480,6 @@ struct GSUBGPOSVersion1_2
       if (!c->subset_context->serializer->extend_min (&out->featureVars))
         return_trace (false);
 
-      // TODO(qxliu76): the current implementation doesn't correctly handle feature variations
-      //                that are dropped by instancing when the associated conditions don't trigger.
-      //                Since partial instancing isn't yet supported this isn't an issue yet but will
-      //                need to be fixed for partial instancing.
-
-
-
       // if all axes are pinned all feature vars are dropped.
       bool ret = !c->subset_context->plan->all_axes_pinned
                  && out->featureVars.serialize_subset (c->subset_context, featureVars, this, c);
@@ -4243,6 +4514,7 @@ struct GSUBGPOS
   {
     TRACE_SANITIZE (this);
     if (unlikely (!u.version.sanitize (c))) return_trace (false);
+    hb_barrier ();
     switch (u.version.major) {
     case 1: return_trace (u.version1.sanitize<TLookup> (c));
 #ifndef HB_NO_BEYOND_64K
@@ -4368,11 +4640,11 @@ struct GSUBGPOS
   }
 
   void feature_variation_collect_lookups (const hb_set_t *feature_indexes,
-					  const hb_hashmap_t<unsigned, const Feature*> *feature_substitutes_map,
+					  const hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *feature_record_cond_idx_map,
 					  hb_set_t       *lookup_indexes /* OUT */) const
   {
 #ifndef HB_NO_VAR
-    get_feature_variations ().collect_lookups (feature_indexes, feature_substitutes_map, lookup_indexes);
+    get_feature_variations ().collect_lookups (feature_indexes, feature_record_cond_idx_map, lookup_indexes);
 #endif
   }
 
@@ -4479,7 +4751,10 @@ struct GSUBGPOS
   {
     accelerator_t (hb_face_t *face)
     {
-      this->table = hb_sanitize_context_t ().reference_table<T> (face);
+      hb_sanitize_context_t sc;
+      sc.lazy_some_gpos = true;
+      this->table = sc.reference_table<T> (face);
+
       if (unlikely (this->table->is_blocklisted (this->table.get_blob (), face)))
       {
 	hb_blob_destroy (this->table.get_blob ());
@@ -4504,6 +4779,8 @@ struct GSUBGPOS
       this->table.destroy ();
     }
 
+    hb_blob_t *get_blob () const { return table.get_blob (); }
+
     hb_ot_layout_lookup_accelerator_t *get_accel (unsigned lookup_index) const
     {
       if (unlikely (lookup_index >= lookup_count)) return nullptr;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-jstf-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-jstf-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-jstf-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-jstf-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -214,6 +214,7 @@ struct JSTF
   {
     TRACE_SANITIZE (this);
     return_trace (version.sanitize (c) &&
+		  hb_barrier () &&
 		  likely (version.major == 1) &&
 		  scriptList.sanitize (c, this));
   }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc	2024-11-20 13:56:33.000000000 +0000
@@ -64,8 +64,8 @@ using OT::Layout::GPOS;
  * @include: hb-ot.h
  *
  * Functions for querying OpenType Layout features in the font face.
- * See the <ulink url="http://www.microsoft.com/typography/otspec/">OpenType
- * specification</ulink> for details.
+ * See the [OpenType specification](http://www.microsoft.com/typography/otspec/)
+ * for details.
  **/
 
 
@@ -257,12 +257,13 @@ _hb_ot_layout_set_glyph_props (hb_font_t
 {
   _hb_buffer_assert_gsubgpos_vars (buffer);
 
-  const OT::GDEF &gdef = *font->face->table.GDEF->table;
+  const auto &gdef = *font->face->table.GDEF;
   unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = 0; i < count; i++)
   {
-    _hb_glyph_info_set_glyph_props (&buffer->info[i], gdef.get_glyph_props (buffer->info[i].codepoint));
-    _hb_glyph_info_clear_lig_props (&buffer->info[i]);
+    _hb_glyph_info_set_glyph_props (&info[i], gdef.get_glyph_props (info[i].codepoint));
+    _hb_glyph_info_clear_lig_props (&info[i]);
   }
 }
 
@@ -1240,7 +1241,7 @@ script_collect_features (hb_collect_feat
  *   terminated by %HB_TAG_NONE
  * @features: (nullable) (array zero-terminated=1): The array of features to collect,
  *   terminated by %HB_TAG_NONE
- * @feature_indexes: (out): The array of feature indexes found for the query
+ * @feature_indexes: (out): The set of feature indexes found for the query
  *
  * Fetches a list of all feature indexes in the specified face's GSUB table
  * or GPOS table, underneath the specified scripts, languages, and features.
@@ -1281,6 +1282,49 @@ hb_ot_layout_collect_features (hb_face_t
   }
 }
 
+/**
+ * hb_ot_layout_collect_features_map:
+ * @face: #hb_face_t to work upon
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
+ * @script_index: The index of the requested script tag
+ * @language_index: The index of the requested language tag
+ * @feature_map: (out): The map of feature tag to feature index.
+ *
+ * Fetches the mapping from feature tags to feature indexes for
+ * the specified script and language.
+ *
+ * Since: 8.1.0
+ **/
+void
+hb_ot_layout_collect_features_map (hb_face_t      *face,
+				   hb_tag_t        table_tag,
+				   unsigned        script_index,
+				   unsigned        language_index,
+				   hb_map_t       *feature_map /* OUT */)
+{
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+  const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
+
+  unsigned int count = l.get_feature_indexes (0, nullptr, nullptr);
+  feature_map->alloc (count);
+
+  /* Loop in reverse, such that earlier entries win. That emulates
+   * a linear search, which seems to be what other implementations do.
+   * We found that with arialuni_t.ttf, the "ur" language system has
+   * duplicate features, and the earlier ones work but not later ones.
+   */
+  for (unsigned int i = count; i; i--)
+  {
+    unsigned feature_index = 0;
+    unsigned feature_count = 1;
+    l.get_feature_indexes (i - 1, &feature_count, &feature_index);
+    if (!feature_count)
+      break;
+    hb_tag_t feature_tag = g.get_feature_tag (feature_index);
+    feature_map->set (feature_tag, feature_index);
+  }
+}
+
 
 /**
  * hb_ot_layout_collect_lookups:
@@ -1315,8 +1359,7 @@ hb_ot_layout_collect_lookups (hb_face_t
   hb_set_t feature_indexes;
   hb_ot_layout_collect_features (face, table_tag, scripts, languages, features, &feature_indexes);
 
-  for (hb_codepoint_t feature_index = HB_SET_VALUE_INVALID;
-       hb_set_next (&feature_indexes, &feature_index);)
+  for (auto feature_index : feature_indexes)
     g.get_feature (feature_index).add_lookup_indexes_to (lookup_indexes);
 
   g.feature_variation_collect_lookups (&feature_indexes, nullptr, lookup_indexes);
@@ -1569,7 +1612,7 @@ hb_ot_layout_lookups_substitute_closure
     glyphs_length = glyphs->get_population ();
     if (lookups)
     {
-      for (hb_codepoint_t lookup_index = HB_SET_VALUE_INVALID; hb_set_next (lookups, &lookup_index);)
+      for (auto lookup_index : *lookups)
 	gsub.get_lookup (lookup_index).closure (&c, lookup_index);
     }
     else
@@ -1895,7 +1938,7 @@ apply_backward (OT::hb_ot_apply_context_
     if (accel.digest.may_have (buffer->cur().codepoint) &&
 	(buffer->cur().mask & c->lookup_mask) &&
 	c->check_glyph_property (&buffer->cur(), c->lookup_props))
-     ret |= accel.apply (c, subtable_count, false);
+      ret |= accel.apply (c, subtable_count, false);
 
     /* The reverse lookup doesn't "advance" cursor (for good reason). */
     buffer->idx--;
@@ -1952,7 +1995,7 @@ inline void hb_ot_map_t::apply (const Pr
 {
   const unsigned int table_index = proxy.table_index;
   unsigned int i = 0;
-  OT::hb_ot_apply_context_t c (table_index, font, buffer);
+  OT::hb_ot_apply_context_t c (table_index, font, buffer, proxy.accel.get_blob ());
   c.set_recurse_func (Proxy::Lookup::template dispatch_recurse_func<OT::hb_ot_apply_context_t>);
 
   for (unsigned int stage_index = 0; stage_index < stages[table_index].length; stage_index++)
@@ -1977,11 +2020,12 @@ inline void hb_ot_map_t::apply (const Pr
       if (accel->digest.may_have (c.digest))
       {
 	c.set_lookup_index (lookup_index);
-	c.set_lookup_mask (lookup.mask);
-	c.set_auto_zwj (lookup.auto_zwj);
-	c.set_auto_zwnj (lookup.auto_zwnj);
+	c.set_lookup_mask (lookup.mask, false);
+	c.set_auto_zwj (lookup.auto_zwj, false);
+	c.set_auto_zwnj (lookup.auto_zwnj, false);
 	c.set_random (lookup.random);
-	c.set_per_syllable (lookup.per_syllable);
+	c.set_per_syllable (lookup.per_syllable, false);
+	/* apply_string's set_lookup_props initializes the iterators. */
 
 	apply_string<Proxy> (&c,
 			     proxy.accel.table->get_lookup (lookup_index),
@@ -2009,20 +2053,20 @@ void hb_ot_map_t::substitute (const hb_o
 {
   GSUBProxy proxy (font->face);
   if (buffer->messaging () &&
-      !buffer->message (font, "start table GSUB")) return;
+      !buffer->message (font, "start table GSUB script tag '%c%c%c%c'", HB_UNTAG (chosen_script[0]))) return;
   apply (proxy, plan, font, buffer);
   if (buffer->messaging ())
-    (void) buffer->message (font, "end table GSUB");
+    (void) buffer->message (font, "end table GSUB script tag '%c%c%c%c'", HB_UNTAG (chosen_script[0]));
 }
 
 void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
 {
   GPOSProxy proxy (font->face);
   if (buffer->messaging () &&
-      !buffer->message (font, "start table GPOS")) return;
+      !buffer->message (font, "start table GPOS script tag '%c%c%c%c'", HB_UNTAG (chosen_script[1]))) return;
   apply (proxy, plan, font, buffer);
   if (buffer->messaging ())
-    (void) buffer->message (font, "end table GPOS");
+    (void) buffer->message (font, "end table GPOS script tag '%c%c%c%c'", HB_UNTAG (chosen_script[1]));
 }
 
 void
@@ -2034,6 +2078,112 @@ hb_ot_layout_substitute_lookup (OT::hb_o
 }
 
 #ifndef HB_NO_BASE
+
+static void
+choose_base_tags (hb_script_t    script,
+		  hb_language_t  language,
+		  hb_tag_t      *script_tag,
+		  hb_tag_t      *language_tag)
+{
+  hb_tag_t script_tags[HB_OT_MAX_TAGS_PER_SCRIPT];
+  unsigned script_count = ARRAY_LENGTH (script_tags);
+
+  hb_tag_t language_tags[HB_OT_MAX_TAGS_PER_LANGUAGE];
+  unsigned language_count = ARRAY_LENGTH (language_tags);
+
+  hb_ot_tags_from_script_and_language (script, language,
+				       &script_count, script_tags,
+				       &language_count, language_tags);
+
+  *script_tag = script_count ? script_tags[script_count - 1] : HB_OT_TAG_DEFAULT_SCRIPT;
+  *language_tag = language_count ? language_tags[language_count - 1] : HB_OT_TAG_DEFAULT_LANGUAGE;
+}
+
+/**
+ * hb_ot_layout_get_font_extents:
+ * @font: a font
+ * @direction: text direction.
+ * @script_tag:  script tag.
+ * @language_tag: language tag.
+ * @extents: (out) (nullable): font extents if found.
+ *
+ * Fetches script/language-specific font extents.  These values are
+ * looked up in the `BASE` table's `MinMax` records.
+ *
+ * If no such extents are found, the default extents for the font are
+ * fetched. As such, the return value of this function can for the
+ * most part be ignored.  Note that the per-script/language extents
+ * do not have a line-gap value, and the line-gap is set to zero in
+ * that case.
+ *
+ * Return value: `true` if found script/language-specific font extents.
+ *
+ * Since: 8.0.0
+ **/
+hb_bool_t
+hb_ot_layout_get_font_extents (hb_font_t         *font,
+			       hb_direction_t     direction,
+			       hb_tag_t           script_tag,
+			       hb_tag_t           language_tag,
+			       hb_font_extents_t *extents)
+{
+  hb_position_t min = 0, max = 0;
+  if (font->face->table.BASE->get_min_max (font, direction, script_tag, language_tag, HB_TAG_NONE,
+					   &min, &max))
+  {
+    if (extents)
+    {
+      extents->ascender  = max;
+      extents->descender = min;
+      extents->line_gap  = 0;
+    }
+    return true;
+  }
+
+  hb_font_get_extents_for_direction (font, direction, extents);
+  return false;
+}
+
+/**
+ * hb_ot_layout_get_font_extents2:
+ * @font: a font
+ * @direction: text direction.
+ * @script:  script.
+ * @language: (nullable): language.
+ * @extents: (out) (nullable): font extents if found.
+ *
+ * Fetches script/language-specific font extents.  These values are
+ * looked up in the `BASE` table's `MinMax` records.
+ *
+ * If no such extents are found, the default extents for the font are
+ * fetched. As such, the return value of this function can for the
+ * most part be ignored.  Note that the per-script/language extents
+ * do not have a line-gap value, and the line-gap is set to zero in
+ * that case.
+ *
+ * This function is like hb_ot_layout_get_font_extents() but takes
+ * #hb_script_t and #hb_language_t instead of OpenType #hb_tag_t.
+ *
+ * Return value: `true` if found script/language-specific font extents.
+ *
+ * Since: 8.0.0
+ **/
+hb_bool_t
+hb_ot_layout_get_font_extents2 (hb_font_t         *font,
+				hb_direction_t     direction,
+				hb_script_t        script,
+				hb_language_t      language,
+				hb_font_extents_t *extents)
+{
+  hb_tag_t script_tag, language_tag;
+  choose_base_tags (script, language, &script_tag, &language_tag);
+  return hb_ot_layout_get_font_extents (font,
+					direction,
+					script_tag,
+					language_tag,
+					extents);
+}
+
 /**
  * hb_ot_layout_get_horizontal_baseline_tag_for_script:
  * @script: a script tag.
@@ -2132,6 +2282,42 @@ hb_ot_layout_get_baseline (hb_font_t
 }
 
 /**
+ * hb_ot_layout_get_baseline2:
+ * @font: a font
+ * @baseline_tag: a baseline tag
+ * @direction: text direction.
+ * @script:  script.
+ * @language: (nullable): language, currently unused.
+ * @coord: (out) (nullable): baseline value if found.
+ *
+ * Fetches a baseline value from the face.
+ *
+ * This function is like hb_ot_layout_get_baseline() but takes
+ * #hb_script_t and #hb_language_t instead of OpenType #hb_tag_t.
+ *
+ * Return value: `true` if found baseline value in the font.
+ *
+ * Since: 8.0.0
+ **/
+hb_bool_t
+hb_ot_layout_get_baseline2 (hb_font_t                   *font,
+			    hb_ot_layout_baseline_tag_t  baseline_tag,
+			    hb_direction_t               direction,
+			    hb_script_t                  script,
+			    hb_language_t                language,
+			    hb_position_t               *coord        /* OUT.  May be NULL. */)
+{
+  hb_tag_t script_tag, language_tag;
+  choose_base_tags (script, language, &script_tag, &language_tag);
+  return hb_ot_layout_get_baseline (font,
+				    baseline_tag,
+				    direction,
+				    script_tag,
+				    language_tag,
+				    coord);
+}
+
+/**
  * hb_ot_layout_get_baseline_with_fallback:
  * @font: a font
  * @baseline_tag: a baseline tag
@@ -2353,6 +2539,41 @@ hb_ot_layout_get_baseline_with_fallback
   }
 }
 
+/**
+ * hb_ot_layout_get_baseline_with_fallback2:
+ * @font: a font
+ * @baseline_tag: a baseline tag
+ * @direction: text direction.
+ * @script:  script.
+ * @language: (nullable): language, currently unused.
+ * @coord: (out): baseline value if found.
+ *
+ * Fetches a baseline value from the face, and synthesizes
+ * it if the font does not have it.
+ *
+ * This function is like hb_ot_layout_get_baseline_with_fallback() but takes
+ * #hb_script_t and #hb_language_t instead of OpenType #hb_tag_t.
+ *
+ * Since: 8.0.0
+ **/
+void
+hb_ot_layout_get_baseline_with_fallback2 (hb_font_t                   *font,
+					  hb_ot_layout_baseline_tag_t  baseline_tag,
+					  hb_direction_t               direction,
+					  hb_script_t                  script,
+					  hb_language_t                language,
+					  hb_position_t               *coord        /* OUT */)
+{
+  hb_tag_t script_tag, language_tag;
+  choose_base_tags (script, language, &script_tag, &language_tag);
+  hb_ot_layout_get_baseline_with_fallback (font,
+					   baseline_tag,
+					   direction,
+					   script_tag,
+					   language_tag,
+					   coord);
+}
+
 #endif
 
 
@@ -2449,9 +2670,10 @@ hb_ot_layout_lookup_get_optical_bound (h
 				       hb_codepoint_t  glyph)
 {
   const OT::PosLookup &lookup = font->face->table.GPOS->table->get_lookup (lookup_index);
+  hb_blob_t *blob = font->face->table.GPOS->get_blob ();
   hb_glyph_position_t pos = {0};
   hb_position_single_dispatch_t c;
-  lookup.dispatch (&c, font, direction, glyph, pos);
+  lookup.dispatch (&c, font, blob, direction, glyph, pos);
   hb_position_t ret = 0;
   switch (direction)
   {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.h 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.h
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.h	2024-11-20 13:56:33.000000000 +0000
@@ -325,6 +325,13 @@ hb_ot_layout_collect_features (hb_face_t
 			       hb_set_t       *feature_indexes /* OUT */);
 
 HB_EXTERN void
+hb_ot_layout_collect_features_map (hb_face_t      *face,
+				   hb_tag_t        table_tag,
+				   unsigned        script_index,
+				   unsigned        language_index,
+				   hb_map_t       *feature_map /* OUT */);
+
+HB_EXTERN void
 hb_ot_layout_collect_lookups (hb_face_t      *face,
 			      hb_tag_t        table_tag,
 			      const hb_tag_t *scripts,
@@ -447,6 +454,20 @@ hb_ot_layout_feature_get_characters (hb_
  * BASE
  */
 
+HB_EXTERN hb_bool_t
+hb_ot_layout_get_font_extents (hb_font_t         *font,
+			       hb_direction_t     direction,
+			       hb_tag_t           script_tag,
+			       hb_tag_t           language_tag,
+			       hb_font_extents_t *extents);
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_get_font_extents2 (hb_font_t         *font,
+				hb_direction_t     direction,
+				hb_script_t        script,
+				hb_language_t      language,
+				hb_font_extents_t *extents);
+
 /**
  * hb_ot_layout_baseline_tag_t:
  * @HB_OT_LAYOUT_BASELINE_TAG_ROMAN: The baseline used by alphabetic scripts such as Latin, Cyrillic and Greek.
@@ -499,6 +520,14 @@ hb_ot_layout_get_baseline (hb_font_t
 			   hb_tag_t                     language_tag,
 			   hb_position_t               *coord        /* OUT.  May be NULL. */);
 
+HB_EXTERN hb_bool_t
+hb_ot_layout_get_baseline2 (hb_font_t                   *font,
+			    hb_ot_layout_baseline_tag_t  baseline_tag,
+			    hb_direction_t               direction,
+			    hb_script_t                  script,
+			    hb_language_t                language,
+			    hb_position_t               *coord        /* OUT.  May be NULL. */);
+
 HB_EXTERN void
 hb_ot_layout_get_baseline_with_fallback (hb_font_t                   *font,
 					 hb_ot_layout_baseline_tag_t  baseline_tag,
@@ -507,6 +536,14 @@ hb_ot_layout_get_baseline_with_fallback
 					 hb_tag_t                     language_tag,
 					 hb_position_t               *coord        /* OUT */);
 
+HB_EXTERN void
+hb_ot_layout_get_baseline_with_fallback2 (hb_font_t                   *font,
+					  hb_ot_layout_baseline_tag_t  baseline_tag,
+					  hb_direction_t               direction,
+					  hb_script_t                  script,
+					  hb_language_t                language,
+					  hb_position_t               *coord        /* OUT */);
+
 HB_END_DECLS
 
 #endif /* HB_OT_LAYOUT_H */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.hh	2024-11-20 13:56:33.000000000 +0000
@@ -448,7 +448,7 @@ _hb_glyph_info_get_lig_id (const hb_glyp
 static inline bool
 _hb_glyph_info_ligated_internal (const hb_glyph_info_t *info)
 {
-  return !!(info->lig_props() & IS_LIG_BASE);
+  return info->lig_props() & IS_LIG_BASE;
 }
 
 static inline unsigned int
@@ -496,37 +496,37 @@ _hb_glyph_info_get_glyph_props (const hb
 static inline bool
 _hb_glyph_info_is_base_glyph (const hb_glyph_info_t *info)
 {
-  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH);
+  return info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH;
 }
 
 static inline bool
 _hb_glyph_info_is_ligature (const hb_glyph_info_t *info)
 {
-  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE);
+  return info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE;
 }
 
 static inline bool
 _hb_glyph_info_is_mark (const hb_glyph_info_t *info)
 {
-  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MARK);
+  return info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MARK;
 }
 
 static inline bool
 _hb_glyph_info_substituted (const hb_glyph_info_t *info)
 {
-  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED);
+  return info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED;
 }
 
 static inline bool
 _hb_glyph_info_ligated (const hb_glyph_info_t *info)
 {
-  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATED);
+  return info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATED;
 }
 
 static inline bool
 _hb_glyph_info_multiplied (const hb_glyph_info_t *info)
 {
-  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED);
+  return info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED;
 }
 
 static inline bool
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-map.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-map.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-map.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-map.cc	2024-11-20 13:56:33.000000000 +0000
@@ -213,7 +213,8 @@ hb_ot_map_builder_t::compile (hb_ot_map_
   /* Sort features and merge duplicates */
   if (feature_infos.length)
   {
-    feature_infos.qsort ();
+    if (!is_simple)
+      feature_infos.qsort ();
     auto *f = feature_infos.arrayZ;
     unsigned int j = 0;
     unsigned count = feature_infos.length;
@@ -238,6 +239,13 @@ hb_ot_map_builder_t::compile (hb_ot_map_
     feature_infos.shrink (j + 1);
   }
 
+  hb_map_t feature_indices[2];
+  for (unsigned int table_index = 0; table_index < 2; table_index++)
+    hb_ot_layout_collect_features_map (face,
+				       table_tags[table_index],
+				       script_index[table_index],
+				       language_index[table_index],
+				       &feature_indices[table_index]);
 
   /* Allocate bits now */
   static_assert ((!(HB_GLYPH_FLAG_DEFINED & (HB_GLYPH_FLAG_DEFINED + 1))), "");
@@ -260,7 +268,6 @@ hb_ot_map_builder_t::compile (hb_ot_map_
     if (!info->max_value || next_bit + bits_needed >= global_bit_shift)
       continue; /* Feature disabled, or not enough bits. */
 
-
     bool found = false;
     unsigned int feature_index[2];
     for (unsigned int table_index = 0; table_index < 2; table_index++)
@@ -268,12 +275,14 @@ hb_ot_map_builder_t::compile (hb_ot_map_
       if (required_feature_tag[table_index] == info->tag)
 	required_feature_stage[table_index] = info->stage[table_index];
 
-      found |= (bool) hb_ot_layout_language_find_feature (face,
-							  table_tags[table_index],
-							  script_index[table_index],
-							  language_index[table_index],
-							  info->tag,
-							  &feature_index[table_index]);
+      hb_codepoint_t *index;
+      if (feature_indices[table_index].has (info->tag, &index))
+      {
+        feature_index[table_index] = *index;
+        found = true;
+      }
+      else
+        feature_index[table_index] = HB_OT_LAYOUT_NO_FEATURE_INDEX;
     }
     if (!found && (info->flags & F_GLOBAL_SEARCH))
     {
@@ -314,7 +323,8 @@ hb_ot_map_builder_t::compile (hb_ot_map_
     map->needs_fallback = !found;
   }
   //feature_infos.shrink (0); /* Done with these */
-
+  if (is_simple)
+    m.features.qsort ();
 
   add_gsub_pause (nullptr);
   add_gpos_pause (nullptr);
@@ -350,7 +360,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_
       }
 
       /* Sort lookups and merge duplicates */
-      if (last_num_lookups < lookups.length)
+      if (last_num_lookups + 1 < lookups.length)
       {
 	lookups.as_array ().sub_array (last_num_lookups, lookups.length - last_num_lookups).qsort ();
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-map.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-map.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-map.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-map.hh	2024-11-20 13:56:33.000000000 +0000
@@ -60,6 +60,13 @@ struct hb_ot_map_t
 
     int cmp (const hb_tag_t tag_) const
     { return tag_ < tag ? -1 : tag_ > tag ? 1 : 0; }
+
+    HB_INTERNAL static int cmp (const void *pa, const void *pb)
+    {
+      const feature_map_t *a = (const feature_map_t *) pa;
+      const feature_map_t *b = (const feature_map_t *) pb;
+      return a->tag < b->tag ? -1 : a->tag > b->tag ? 1 : 0;
+    }
   };
 
   struct lookup_map_t {
@@ -273,6 +280,7 @@ struct hb_ot_map_builder_t
 
   hb_face_t *face;
   hb_segment_properties_t props;
+  bool is_simple;
 
   hb_tag_t chosen_script[2];
   bool found_script[2];
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-math-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-math-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-math-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-math-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -73,7 +73,6 @@ struct MathConstants
   {
     TRACE_SERIALIZE (this);
     auto *out = c->start_embed (this);
-    if (unlikely (!out)) return_trace (nullptr);
 
     HBINT16 *p = c->allocate_size<HBINT16> (HBINT16::static_size * 2);
     if (unlikely (!p)) return_trace (nullptr);
@@ -310,7 +309,6 @@ struct MathKern
   {
     TRACE_SERIALIZE (this);
     auto *out = c->start_embed (this);
-    if (unlikely (!out)) return_trace (nullptr);
 
     if (unlikely (!c->embed (heightCount))) return_trace (nullptr);
 
@@ -335,6 +333,7 @@ struct MathKern
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  c->check_array (mathValueRecordsZ.arrayZ, 2 * heightCount + 1) &&
 		  sanitize_math_value_records (c));
   }
@@ -345,27 +344,20 @@ struct MathKern
     const MathValueRecord* kernValue = mathValueRecordsZ.arrayZ + heightCount;
     int sign = font->y_scale < 0 ? -1 : +1;
 
-    /* The description of the MathKern table is a ambiguous, but interpreting
-     * "between the two heights found at those indexes" for 0 < i < len as
-     *
-     *   correctionHeight[i-1] < correction_height <= correctionHeight[i]
-     *
-     * makes the result consistent with the limit cases and we can just use the
-     * binary search algorithm of std::upper_bound:
+    /* According to OpenType spec (v1.9), except for the boundary cases, the index
+     * chosen for kern value should be i such that
+     *    correctionHeight[i-1] <= correction_height < correctionHeight[i]
+     * We can use the binary search algorithm of std::upper_bound(). Or, we can
+     * use the internal hb_bsearch_impl.
      */
-    unsigned int i = 0;
-    unsigned int count = heightCount;
-    while (count > 0)
-    {
-      unsigned int half = count / 2;
-      hb_position_t height = correctionHeight[i + half].get_y_value (font, this);
-      if (sign * height < sign * correction_height)
-      {
-	i += half + 1;
-	count -= half + 1;
-      } else
-	count = half;
-    }
+    unsigned int pos;
+    auto cmp = +[](const void* key, const void* p,
+                   int sign, hb_font_t* font, const MathKern* mathKern) -> int {
+      return sign * *(hb_position_t*)key - sign * ((MathValueRecord*)p)->get_y_value(font, mathKern);
+    };
+    unsigned int i = hb_bsearch_impl(&pos, correction_height, correctionHeight,
+                                     heightCount, MathValueRecord::static_size,
+                                     cmp, sign, font, this) ? pos + 1 : pos;
     return kernValue[i].get_x_value (font, this);
   }
 
@@ -572,6 +564,7 @@ struct MathGlyphInfo
 
     auto it =
     + hb_iter (this+extendedShapeCoverage)
+    | hb_take (c->plan->source->get_num_glyphs ())
     | hb_filter (glyphset)
     | hb_map_retains_sorting (glyph_map)
     ;
@@ -757,8 +750,6 @@ struct MathGlyphAssembly
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    auto *out = c->serializer->start_embed (*this);
-    if (unlikely (!out)) return_trace (false);
 
     if (!c->serializer->copy (italicsCorrection, this)) return_trace (false);
     if (!c->serializer->copy<HBUINT16> (partRecords.len)) return_trace (false);
@@ -945,13 +936,13 @@ struct MathVariants
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
     if (!c->serializer->check_assign (out->minConnectorOverlap, minConnectorOverlap, HB_SERIALIZE_ERROR_INT_OVERFLOW))
       return_trace (false);
-    
+
     hb_sorted_vector_t<hb_codepoint_t> new_vert_coverage;
     hb_sorted_vector_t<hb_codepoint_t> new_hori_coverage;
     hb_set_t indices;
     collect_coverage_and_indices (new_vert_coverage, vertGlyphCoverage, 0, vertGlyphCount, indices, glyphset, glyph_map);
     collect_coverage_and_indices (new_hori_coverage, horizGlyphCoverage, vertGlyphCount, vertGlyphCount + horizGlyphCount, indices, glyphset, glyph_map);
-    
+
     if (!c->serializer->check_assign (out->vertGlyphCount, new_vert_coverage.length, HB_SERIALIZE_ERROR_INT_OVERFLOW))
       return_trace (false);
     if (!c->serializer->check_assign (out->horizGlyphCount, new_hori_coverage.length, HB_SERIALIZE_ERROR_INT_OVERFLOW))
@@ -963,10 +954,10 @@ struct MathVariants
       if (!o) return_trace (false);
       o->serialize_subset (c, glyphConstruction[i], this);
     }
-    
+
     if (new_vert_coverage)
       out->vertGlyphCoverage.serialize_serialize (c->serializer, new_vert_coverage.iter ());
-    
+
     if (new_hori_coverage)
     out->horizGlyphCoverage.serialize_serialize (c->serializer, new_hori_coverage.iter ());
     return_trace (true);
@@ -987,6 +978,7 @@ struct MathVariants
     return_trace (c->check_struct (this) &&
 		  vertGlyphCoverage.sanitize (c, this) &&
 		  horizGlyphCoverage.sanitize (c, this) &&
+		  hb_barrier () &&
 		  c->check_array (glyphConstruction.arrayZ, vertGlyphCount + horizGlyphCount) &&
 		  sanitize_offsets (c));
   }
@@ -1106,6 +1098,7 @@ struct MATH
     TRACE_SANITIZE (this);
     return_trace (version.sanitize (c) &&
 		  likely (version.major == 1) &&
+		  hb_barrier () &&
 		  mathConstants.sanitize (c, this) &&
 		  mathGlyphInfo.sanitize (c, this) &&
 		  mathVariants.sanitize (c, this));
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-math.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-math.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-math.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-math.cc	2024-11-20 13:56:33.000000000 +0000
@@ -76,7 +76,7 @@ hb_ot_math_has_data (hb_face_t *face)
  *
  * However, if the requested constant is #HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN,
  * #HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN or
- * #HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN, then the return value is
+ * #HB_OT_MATH_CONSTANT_RADICAL_DEGREE_BOTTOM_RAISE_PERCENT, then the return value is
  * an integer between 0 and 100 representing that percentage.
  *
  * Return value: the requested constant or zero
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-maxp-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-maxp-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-maxp-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-maxp-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -85,7 +85,7 @@ struct maxp
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this)))
       return_trace (false);
-
+    hb_barrier ();
     if (version.major == 1)
     {
       const maxpV1Tail &v1 = StructAfter<maxpV1Tail> (*this);
@@ -103,6 +103,7 @@ struct maxp
     maxp_prime->numGlyphs = hb_min (c->plan->num_output_glyphs (), 0xFFFFu);
     if (maxp_prime->version.major == 1)
     {
+      hb_barrier ();
       const maxpV1Tail *src_v1 = &StructAfter<maxpV1Tail> (*this);
       maxpV1Tail *dest_v1 = c->serializer->embed<maxpV1Tail> (src_v1);
       if (unlikely (!dest_v1)) return_trace (false);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-meta-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-meta-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-meta-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-meta-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -51,6 +51,7 @@ struct DataMap
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
 			  dataZ.sanitize (c, base, dataLength)));
   }
 
@@ -101,6 +102,7 @@ struct meta
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
 			  version == 1 &&
 			  dataMaps.sanitize (c, this)));
   }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.cc	2024-11-20 13:56:33.000000000 +0000
@@ -196,7 +196,7 @@ hb_ot_metrics_get_position (hb_font_t
 	*position *= mult;
 
 	if (font->slant)
-	  *position += _hb_roundf (mult * font->slant_xy * rise);
+	  *position += roundf (mult * font->slant_xy * rise);
       }
 
       return ret;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-os2-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-os2-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-os2-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-os2-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -209,6 +209,23 @@ struct OS2
     return ret;
   }
 
+  static unsigned calc_avg_char_width (const hb_hashmap_t<hb_codepoint_t, hb_pair_t<unsigned, int>>& hmtx_map)
+  {
+    unsigned num = 0;
+    unsigned total_width = 0;
+    for (const auto& _ : hmtx_map.values_ref ())
+    {
+      unsigned width = _.first;
+      if (width)
+      {
+        total_width += width;
+        num++;
+      }
+    }
+
+    return num ? (unsigned) roundf ((double) total_width / (double) num) : 0;
+  }
+
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
@@ -239,39 +256,40 @@ struct OS2
 
       if (os2_prime->version >= 2)
       {
+        hb_barrier ();
         auto *table = & const_cast<OS2V2Tail &> (os2_prime->v2 ());
         HB_ADD_MVAR_VAR (HB_OT_METRICS_TAG_X_HEIGHT,                   sxHeight);
         HB_ADD_MVAR_VAR (HB_OT_METRICS_TAG_CAP_HEIGHT,                 sCapHeight);
       }
-    }
-#endif
 
-    if (c->plan->user_axes_location.has (HB_TAG ('w','g','h','t')) &&
-        !c->plan->pinned_at_default)
-    {
-      float weight_class = c->plan->user_axes_location.get (HB_TAG ('w','g','h','t'));
-      if (!c->serializer->check_assign (os2_prime->usWeightClass,
-                                        roundf (hb_clamp (weight_class, 1.0f, 1000.0f)),
+      unsigned avg_char_width = calc_avg_char_width (c->plan->hmtx_map);
+      if (!c->serializer->check_assign (os2_prime->xAvgCharWidth, avg_char_width,
                                         HB_SERIALIZE_ERROR_INT_OVERFLOW))
         return_trace (false);
     }
+#endif
 
-    if (c->plan->user_axes_location.has (HB_TAG ('w','d','t','h')) &&
-        !c->plan->pinned_at_default)
+    Triple *axis_range;
+    if (c->plan->user_axes_location.has (HB_TAG ('w','g','h','t'), &axis_range))
     {
-      float width = c->plan->user_axes_location.get (HB_TAG ('w','d','t','h'));
-      if (!c->serializer->check_assign (os2_prime->usWidthClass,
-                                        roundf (map_wdth_to_widthclass (width)),
-                                        HB_SERIALIZE_ERROR_INT_OVERFLOW))
-        return_trace (false);
+      unsigned weight_class = static_cast<unsigned> (roundf (hb_clamp (axis_range->middle, 1.0f, 1000.0f)));
+      if (os2_prime->usWeightClass != weight_class)
+        os2_prime->usWeightClass = weight_class;
     }
 
-    if (c->plan->flags & HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES)
-      return_trace (true);
+    if (c->plan->user_axes_location.has (HB_TAG ('w','d','t','h'), &axis_range))
+    {
+      unsigned width_class = static_cast<unsigned> (roundf (map_wdth_to_widthclass (axis_range->middle)));
+      if (os2_prime->usWidthClass != width_class)
+        os2_prime->usWidthClass = width_class;
+    }
 
     os2_prime->usFirstCharIndex = hb_min (0xFFFFu, c->plan->unicodes.get_min ());
     os2_prime->usLastCharIndex  = hb_min (0xFFFFu, c->plan->unicodes.get_max ());
 
+    if (c->plan->flags & HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES)
+      return_trace (true);
+
     _update_unicode_ranges (&c->plan->unicodes, os2_prime->ulUnicodeRange);
 
     return_trace (true);
@@ -287,8 +305,7 @@ struct OS2
     /* This block doesn't show up in profiles. If it ever did,
      * we can rewrite it to iterate over OS/2 ranges and use
      * set iteration to check if the range matches. */
-    for (hb_codepoint_t cp = HB_SET_VALUE_INVALID;
-	 codepoints->next (&cp);)
+    for (auto cp : *codepoints)
     {
       unsigned int bit = _hb_ot_os2_get_unicode_range_bit (cp);
       if (bit < 128)
@@ -340,6 +357,7 @@ struct OS2
   {
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this))) return_trace (false);
+    hb_barrier ();
     if (unlikely (version >= 1 && !v1X.sanitize (c))) return_trace (false);
     if (unlikely (version >= 2 && !v2X.sanitize (c))) return_trace (false);
     if (unlikely (version >= 5 && !v5X.sanitize (c))) return_trace (false);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-post-table-v2subset.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-post-table-v2subset.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-post-table-v2subset.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-post-table-v2subset.hh	2024-11-20 13:56:33.000000000 +0000
@@ -79,6 +79,11 @@ HB_INTERNAL bool postV2Tail::subset (hb_
   post::accelerator_t _post (c->plan->source);
 
   hb_hashmap_t<hb_bytes_t, uint32_t, true> glyph_name_to_new_index;
+
+  old_new_index_map.alloc (num_glyphs);
+  old_gid_new_index_map.alloc (num_glyphs);
+  glyph_name_to_new_index.alloc (num_glyphs);
+
   for (hb_codepoint_t new_gid = 0; new_gid < num_glyphs; new_gid++)
   {
     hb_codepoint_t old_gid = reverse_glyph_map.get (new_gid);
@@ -86,11 +91,12 @@ HB_INTERNAL bool postV2Tail::subset (hb_
 
     unsigned new_index;
     const uint32_t *new_index2;
-    if (old_index <= 257) new_index = old_index;
+    if (old_index <= 257)
+      new_index = old_index;
     else if (old_new_index_map.has (old_index, &new_index2))
-    {
       new_index = *new_index2;
-    } else {
+    else
+    {
       hb_bytes_t s = _post.find_glyph_name (old_gid);
       new_index = glyph_name_to_new_index.get (s);
       if (new_index == (unsigned)-1)
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-post-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-post-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-post-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-post-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -96,8 +96,7 @@ struct post
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    post *post_prime = c->serializer->start_embed<post> ();
-    if (unlikely (!post_prime)) return_trace (false);
+    auto *post_prime = c->serializer->start_embed<post> ();
 
     bool glyph_names = c->plan->flags & HB_SUBSET_FLAGS_GLYPH_NAMES;
     if (!serialize (c->serializer, glyph_names))
@@ -114,16 +113,19 @@ struct post
     }
 #endif
 
-    if (c->plan->user_axes_location.has (HB_TAG ('s','l','n','t')) &&
-        !c->plan->pinned_at_default)
+    Triple *axis_range;
+    if (c->plan->user_axes_location.has (HB_TAG ('s','l','n','t'), &axis_range))
     {
-      float italic_angle = c->plan->user_axes_location.get (HB_TAG ('s','l','n','t'));
-      italic_angle = hb_max (-90.f, hb_min (italic_angle, 90.f));
-      post_prime->italicAngle.set_float (italic_angle);
+      float italic_angle = hb_max (-90.f, hb_min (axis_range->middle, 90.f));
+      if (post_prime->italicAngle.to_float () != italic_angle)
+        post_prime->italicAngle.set_float (italic_angle);
     }
 
     if (glyph_names && version.major == 2)
+    {
+      hb_barrier ();
       return_trace (v2X.subset (c));
+    }
 
     return_trace (true);
   }
@@ -139,6 +141,7 @@ struct post
 
       version = table->version.to_int ();
       if (version != 0x00020000) return;
+      hb_barrier ();
 
       const postV2Tail &v2 = table->v2X;
 
@@ -218,10 +221,16 @@ struct post
     unsigned int get_glyph_count () const
     {
       if (version == 0x00010000)
+      {
+        hb_barrier ();
 	return format1_names_length;
+      }
 
       if (version == 0x00020000)
+      {
+        hb_barrier ();
 	return glyphNameIndex->len;
+      }
 
       return 0;
     }
@@ -246,13 +255,18 @@ struct post
     {
       if (version == 0x00010000)
       {
+        hb_barrier ();
 	if (glyph >= format1_names_length)
 	  return hb_bytes_t ();
 
 	return format1_names (glyph);
       }
 
-      if (version != 0x00020000 || glyph >= glyphNameIndex->len)
+      if (version != 0x00020000)
+	return hb_bytes_t ();
+      hb_barrier ();
+
+      if (glyph >= glyphNameIndex->len)
 	return hb_bytes_t ();
 
       unsigned int index = glyphNameIndex->arrayZ[glyph];
@@ -285,6 +299,7 @@ struct post
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  (version.to_int () == 0x00010000 ||
 		   (version.to_int () == 0x00020000 && v2X.sanitize (c)) ||
 		   version.to_int () == 0x00030000));
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc	2024-11-20 13:56:33.000000000 +0000
@@ -383,14 +383,15 @@ _hb_ot_shape_normalize (const hb_ot_shap
   if (!all_simple && buffer->message(font, "start reorder"))
   {
     count = buffer->len;
+    hb_glyph_info_t *info = buffer->info;
     for (unsigned int i = 0; i < count; i++)
     {
-      if (_hb_glyph_info_get_modified_combining_class (&buffer->info[i]) == 0)
+      if (_hb_glyph_info_get_modified_combining_class (&info[i]) == 0)
 	continue;
 
       unsigned int end;
       for (end = i + 1; end < count; end++)
-	if (_hb_glyph_info_get_modified_combining_class (&buffer->info[end]) == 0)
+	if (_hb_glyph_info_get_modified_combining_class (&info[end]) == 0)
 	  break;
 
       /* We are going to do a O(n^2).  Only do this if the sequence is short. */
@@ -414,11 +415,13 @@ _hb_ot_shape_normalize (const hb_ot_shap
      * If it did NOT, then make it skippable.
      * https://github.com/harfbuzz/harfbuzz/issues/554
      */
-    for (unsigned int i = 1; i + 1 < buffer->len; i++)
-      if (buffer->info[i].codepoint == 0x034Fu/*CGJ*/ &&
-	  (info_cc(buffer->info[i+1]) == 0 || info_cc(buffer->info[i-1]) <= info_cc(buffer->info[i+1])))
+    unsigned count = buffer->len;
+    hb_glyph_info_t *info = buffer->info;
+    for (unsigned int i = 1; i + 1 < count; i++)
+      if (info[i].codepoint == 0x034Fu/*CGJ*/ &&
+	  (info_cc(info[i+1]) == 0 || info_cc(info[i-1]) <= info_cc(info[i+1])))
       {
-	_hb_glyph_info_unhide (&buffer->info[i]);
+	_hb_glyph_info_unhide (&info[i]);
       }
   }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc	2024-11-20 13:56:33.000000000 +0000
@@ -155,7 +155,7 @@ hb_ot_shape_planner_t::compile (hb_ot_sh
 #endif
   bool has_gpos = !disable_gpos && hb_ot_layout_has_positioning (face);
   if (false)
-    ;
+    {}
 #ifndef HB_NO_AAT_SHAPE
   /* Prefer GPOS over kerx if GSUB is present;
    * https://github.com/harfbuzz/harfbuzz/issues/3008 */
@@ -167,15 +167,16 @@ hb_ot_shape_planner_t::compile (hb_ot_sh
 
   if (!plan.apply_kerx && (!has_gpos_kern || !plan.apply_gpos))
   {
+    if (false) {}
 #ifndef HB_NO_AAT_SHAPE
-    if (has_kerx)
+    else if (has_kerx)
       plan.apply_kerx = true;
-    else
 #endif
 #ifndef HB_NO_OT_KERN
-    if (hb_ot_layout_has_kerning (face))
+    else if (hb_ot_layout_has_kerning (face))
       plan.apply_kern = true;
 #endif
+    else {}
   }
 
   plan.apply_fallback_kern = !(plan.apply_gpos || plan.apply_kerx || plan.apply_kern);
@@ -313,6 +314,8 @@ hb_ot_shape_collect_features (hb_ot_shap
 {
   hb_ot_map_builder_t *map = &planner->map;
 
+  map->is_simple = true;
+
   map->enable_feature (HB_TAG('r','v','r','n'));
   map->add_gsub_pause (nullptr);
 
@@ -354,7 +357,10 @@ hb_ot_shape_collect_features (hb_ot_shap
   map->enable_feature (HB_TAG ('H','A','R','F')); /* Considered discretionary. */
 
   if (planner->shaper->collect_features)
+  {
+    map->is_simple = false;
     planner->shaper->collect_features (planner);
+  }
 
   map->enable_feature (HB_TAG ('B','u','z','z')); /* Considered required. */
   map->enable_feature (HB_TAG ('B','U','Z','Z')); /* Considered discretionary. */
@@ -378,6 +384,8 @@ hb_ot_shape_collect_features (hb_ot_shap
     map->enable_feature (HB_TAG ('v','e','r','t'), F_GLOBAL_SEARCH);
   }
 
+  if (num_user_features)
+    map->is_simple = false;
   for (unsigned int i = 0; i < num_user_features; i++)
   {
     const hb_feature_t *feature = &user_features[i];
@@ -469,9 +477,18 @@ hb_set_unicode_props (hb_buffer_t *buffe
   {
     _hb_glyph_info_set_unicode_props (&info[i], buffer);
 
+    unsigned gen_cat = _hb_glyph_info_get_general_category (&info[i]);
+    if (FLAG_UNSAFE (gen_cat) &
+	(FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) |
+	 FLAG (HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER) |
+	 FLAG (HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER) |
+	 FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER) |
+	 FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR)))
+      continue;
+
     /* Marks are already set as continuation by the above line.
      * Handle Emoji_Modifier and ZWJ-continuation. */
-    if (unlikely (_hb_glyph_info_get_general_category (&info[i]) == HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL &&
+    if (unlikely (gen_cat == HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL &&
 		  hb_in_range<hb_codepoint_t> (info[i].codepoint, 0x1F3FBu, 0x1F3FFu)))
     {
       _hb_glyph_info_set_continuation (&info[i]);
@@ -749,6 +766,14 @@ hb_ot_shape_setup_masks_fraction (const
 	     _hb_glyph_info_get_general_category (&info[end]) ==
 	     HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER)
 	end++;
+      if (start == i || end == i + 1)
+      {
+        if (start == i)
+	  buffer->unsafe_to_concat (start, start + 1);
+	if (end == i + 1)
+	  buffer->unsafe_to_concat (end - 1, end);
+	continue;
+      }
 
       buffer->unsafe_to_break (start, end);
 
@@ -1030,7 +1055,7 @@ hb_ot_position_plan (const hb_ot_shape_c
    * direction is backward we don't shift and it will end up
    * hanging over the next glyph after the final reordering.
    *
-   * Note: If fallback positinoing happens, we don't care about
+   * Note: If fallback positioning happens, we don't care about
    * this as it will be overridden.
    */
   bool adjust_offsets_when_zeroing = c->plan->adjust_mark_positioning_when_zeroing &&
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic-fallback.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic-fallback.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic-fallback.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic-fallback.hh	2024-11-20 13:56:33.000000000 +0000
@@ -368,7 +368,7 @@ arabic_fallback_plan_shape (arabic_fallb
 			    hb_font_t *font,
 			    hb_buffer_t *buffer)
 {
-  OT::hb_ot_apply_context_t c (0, font, buffer);
+  OT::hb_ot_apply_context_t c (0, font, buffer, hb_blob_get_empty ());
   for (unsigned int i = 0; i < fallback_plan->num_lookups; i++)
     if (fallback_plan->lookup_array[i]) {
       c.set_lookup_mask (fallback_plan->mask_array[i]);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic-joining-list.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic-joining-list.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic-joining-list.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic-joining-list.hh	2024-11-20 13:56:33.000000000 +0000
@@ -6,10 +6,10 @@
  *
  * on files with these headers:
  *
- * # ArabicShaping-15.0.0.txt
- * # Date: 2022-02-14, 18:50:00 GMT [KW, RP]
- * # Scripts-15.0.0.txt
- * # Date: 2022-04-26, 23:15:02 GMT
+ * # ArabicShaping-15.1.0.txt
+ * # Date: 2023-01-05
+ * # Scripts-15.1.0.txt
+ * # Date: 2023-07-28, 16:01:07 GMT
  */
 
 #ifndef HB_OT_SHAPER_ARABIC_JOINING_LIST_HH
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -6,10 +6,10 @@
  *
  * on files with these headers:
  *
- * # ArabicShaping-15.0.0.txt
- * # Date: 2022-02-14, 18:50:00 GMT [KW, RP]
- * # Blocks-15.0.0.txt
- * # Date: 2022-01-28, 20:58:00 GMT [KW]
+ * # ArabicShaping-15.1.0.txt
+ * # Date: 2023-01-05
+ * # Blocks-15.1.0.txt
+ * # Date: 2023-07-28, 15:47:20 GMT
  * UnicodeData.txt does not have a header.
  */
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-arabic.cc	2024-11-20 13:56:33.000000000 +0000
@@ -486,8 +486,10 @@ apply_stch (const hb_ot_shape_plan_t *pl
   if (likely (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH)))
     return;
 
-  /* The Arabic shaper currently always processes in RTL mode, so we should
-   * stretch / position the stretched pieces to the left / preceding glyphs. */
+  bool rtl = buffer->props.direction == HB_DIRECTION_RTL;
+
+  if (!rtl)
+    buffer->reverse ();
 
   /* We do a two pass implementation:
    * First pass calculates the exact number of extra glyphs we need,
@@ -558,9 +560,9 @@ apply_stch (const hb_ot_shape_plan_t *pl
 
       DEBUG_MSG (ARABIC, nullptr, "%s stretch at (%u,%u,%u)",
 		 step == MEASURE ? "measuring" : "cutting", context, start, end);
-      DEBUG_MSG (ARABIC, nullptr, "rest of word:    count=%u width %d", start - context, w_total);
-      DEBUG_MSG (ARABIC, nullptr, "fixed tiles:     count=%d width=%d", n_fixed, w_fixed);
-      DEBUG_MSG (ARABIC, nullptr, "repeating tiles: count=%d width=%d", n_repeating, w_repeating);
+      DEBUG_MSG (ARABIC, nullptr, "rest of word:    count=%u width %" PRId32, start - context, w_total);
+      DEBUG_MSG (ARABIC, nullptr, "fixed tiles:     count=%d width=%" PRId32, n_fixed, w_fixed);
+      DEBUG_MSG (ARABIC, nullptr, "repeating tiles: count=%d width=%" PRId32, n_repeating, w_repeating);
 
       /* Number of additional times to repeat each repeating tile. */
       int n_copies = 0;
@@ -577,7 +579,10 @@ apply_stch (const hb_ot_shape_plan_t *pl
 	++n_copies;
 	hb_position_t excess = (n_copies + 1) * sign * w_repeating - sign * w_remaining;
 	if (excess > 0)
+	{
 	  extra_repeat_overlap = excess / (n_copies * n_repeating);
+	  w_remaining = 0;
+	}
       }
 
       if (step == MEASURE)
@@ -588,7 +593,7 @@ apply_stch (const hb_ot_shape_plan_t *pl
       else
       {
 	buffer->unsafe_to_break (context, end);
-	hb_position_t x_offset = 0;
+	hb_position_t x_offset = w_remaining / 2;
 	for (unsigned int k = end; k > start; k--)
 	{
 	  hb_position_t width = font->get_glyph_h_advance (info[k - 1].codepoint);
@@ -597,18 +602,29 @@ apply_stch (const hb_ot_shape_plan_t *pl
 	  if (info[k - 1].arabic_shaping_action() == STCH_REPEATING)
 	    repeat += n_copies;
 
-	  DEBUG_MSG (ARABIC, nullptr, "appending %u copies of glyph %u; j=%u",
+	  DEBUG_MSG (ARABIC, nullptr, "appending %u copies of glyph %" PRIu32 "; j=%u",
 		     repeat, info[k - 1].codepoint, j);
+	  pos[k - 1].x_advance = 0;
 	  for (unsigned int n = 0; n < repeat; n++)
 	  {
-	    x_offset -= width;
-	    if (n > 0)
-	      x_offset += extra_repeat_overlap;
+	    if (rtl)
+	    {
+	      x_offset -= width;
+	      if (n > 0)
+		x_offset += extra_repeat_overlap;
+	    }
 	    pos[k - 1].x_offset = x_offset;
 	    /* Append copy. */
 	    --j;
 	    info[j] = info[k - 1];
 	    pos[j] = pos[k - 1];
+
+	    if (!rtl)
+	    {
+	      x_offset += width;
+	      if (n > 0)
+		x_offset -= extra_repeat_overlap;
+	    }
 	  }
 	}
       }
@@ -625,6 +641,9 @@ apply_stch (const hb_ot_shape_plan_t *pl
       buffer->len = new_len;
     }
   }
+
+  if (!rtl)
+    buffer->reverse ();
 }
 
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-indic-machine.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-indic-machine.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-indic-machine.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-indic-machine.hh	2024-11-20 13:56:33.000000000 +0000
@@ -53,7 +53,7 @@ enum indic_syllable_type_t {
 };
 
 
-#line 54 "hb-ot-shaper-indic-machine.hh"
+#line 57 "hb-ot-shaper-indic-machine.hh"
 #define indic_syllable_machine_ex_A 9u
 #define indic_syllable_machine_ex_C 1u
 #define indic_syllable_machine_ex_CM 16u
@@ -76,7 +76,7 @@ enum indic_syllable_type_t {
 #define indic_syllable_machine_ex_ZWNJ 5u
 
 
-#line 75 "hb-ot-shaper-indic-machine.hh"
+#line 80 "hb-ot-shaper-indic-machine.hh"
 static const unsigned char _indic_syllable_machine_trans_keys[] = {
 	8u, 8u, 4u, 13u, 5u, 13u, 5u, 13u, 13u, 13u, 4u, 13u, 4u, 13u, 4u, 13u, 
 	8u, 8u, 5u, 13u, 5u, 13u, 13u, 13u, 4u, 13u, 4u, 13u, 4u, 13u, 4u, 13u, 
@@ -460,7 +460,7 @@ find_syllables_indic (hb_buffer_t *buffe
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 453 "hb-ot-shaper-indic-machine.hh"
+#line 464 "hb-ot-shaper-indic-machine.hh"
 	{
 	cs = indic_syllable_machine_start;
 	ts = 0;
@@ -476,7 +476,7 @@ find_syllables_indic (hb_buffer_t *buffe
 
   unsigned int syllable_serial = 1;
   
-#line 465 "hb-ot-shaper-indic-machine.hh"
+#line 480 "hb-ot-shaper-indic-machine.hh"
 	{
 	int _slen;
 	int _trans;
@@ -490,7 +490,7 @@ _resume:
 #line 1 "NONE"
 	{ts = p;}
 	break;
-#line 477 "hb-ot-shaper-indic-machine.hh"
+#line 494 "hb-ot-shaper-indic-machine.hh"
 	}
 
 	_keys = _indic_syllable_machine_trans_keys + (cs<<1);
@@ -593,7 +593,7 @@ _eof_trans:
 #line 114 "hb-ot-shaper-indic-machine.rl"
 	{act = 6;}
 	break;
-#line 559 "hb-ot-shaper-indic-machine.hh"
+#line 597 "hb-ot-shaper-indic-machine.hh"
 	}
 
 _again:
@@ -602,7 +602,7 @@ _again:
 #line 1 "NONE"
 	{ts = 0;}
 	break;
-#line 566 "hb-ot-shaper-indic-machine.hh"
+#line 606 "hb-ot-shaper-indic-machine.hh"
 	}
 
 	if ( ++p != pe )
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-indic-table.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-indic-table.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-indic-table.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-indic-table.cc	2024-11-20 13:56:33.000000000 +0000
@@ -6,12 +6,12 @@
  *
  * on files with these headers:
  *
- * # IndicSyllabicCategory-15.0.0.txt
- * # Date: 2022-05-26, 02:18:00 GMT [KW, RP]
- * # IndicPositionalCategory-15.0.0.txt
- * # Date: 2022-05-26, 02:18:00 GMT [KW, RP]
- * # Blocks-15.0.0.txt
- * # Date: 2022-01-28, 20:58:00 GMT [KW]
+ * # IndicSyllabicCategory-15.1.0.txt
+ * # Date: 2023-01-05
+ * # IndicPositionalCategory-15.1.0.txt
+ * # Date: 2023-01-05
+ * # Blocks-15.1.0.txt
+ * # Date: 2023-07-28, 15:47:20 GMT
  */
 
 #include "hb.hh"
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-khmer-machine.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-khmer-machine.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-khmer-machine.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-khmer-machine.hh	2024-11-20 13:56:33.000000000 +0000
@@ -48,7 +48,7 @@ enum khmer_syllable_type_t {
 };
 
 
-#line 49 "hb-ot-shaper-khmer-machine.hh"
+#line 52 "hb-ot-shaper-khmer-machine.hh"
 #define khmer_syllable_machine_ex_C 1u
 #define khmer_syllable_machine_ex_DOTTEDCIRCLE 11u
 #define khmer_syllable_machine_ex_H 4u
@@ -66,7 +66,7 @@ enum khmer_syllable_type_t {
 #define khmer_syllable_machine_ex_ZWNJ 5u
 
 
-#line 65 "hb-ot-shaper-khmer-machine.hh"
+#line 70 "hb-ot-shaper-khmer-machine.hh"
 static const unsigned char _khmer_syllable_machine_trans_keys[] = {
 	5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 
 	5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u, 
@@ -294,7 +294,7 @@ find_syllables_khmer (hb_buffer_t *buffe
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 287 "hb-ot-shaper-khmer-machine.hh"
+#line 298 "hb-ot-shaper-khmer-machine.hh"
 	{
 	cs = khmer_syllable_machine_start;
 	ts = 0;
@@ -310,7 +310,7 @@ find_syllables_khmer (hb_buffer_t *buffe
 
   unsigned int syllable_serial = 1;
   
-#line 299 "hb-ot-shaper-khmer-machine.hh"
+#line 314 "hb-ot-shaper-khmer-machine.hh"
 	{
 	int _slen;
 	int _trans;
@@ -324,7 +324,7 @@ _resume:
 #line 1 "NONE"
 	{ts = p;}
 	break;
-#line 311 "hb-ot-shaper-khmer-machine.hh"
+#line 328 "hb-ot-shaper-khmer-machine.hh"
 	}
 
 	_keys = _khmer_syllable_machine_trans_keys + (cs<<1);
@@ -394,7 +394,7 @@ _eof_trans:
 #line 98 "hb-ot-shaper-khmer-machine.rl"
 	{act = 3;}
 	break;
-#line 368 "hb-ot-shaper-khmer-machine.hh"
+#line 398 "hb-ot-shaper-khmer-machine.hh"
 	}
 
 _again:
@@ -403,7 +403,7 @@ _again:
 #line 1 "NONE"
 	{ts = 0;}
 	break;
-#line 375 "hb-ot-shaper-khmer-machine.hh"
+#line 407 "hb-ot-shaper-khmer-machine.hh"
 	}
 
 	if ( ++p != pe )
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-myanmar-machine.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-myanmar-machine.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-myanmar-machine.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-myanmar-machine.hh	2024-11-20 13:56:33.000000000 +0000
@@ -50,7 +50,7 @@ enum myanmar_syllable_type_t {
 };
 
 
-#line 51 "hb-ot-shaper-myanmar-machine.hh"
+#line 54 "hb-ot-shaper-myanmar-machine.hh"
 #define myanmar_syllable_machine_ex_A 9u
 #define myanmar_syllable_machine_ex_As 32u
 #define myanmar_syllable_machine_ex_C 1u
@@ -77,7 +77,7 @@ enum myanmar_syllable_type_t {
 #define myanmar_syllable_machine_ex_ZWNJ 5u
 
 
-#line 76 "hb-ot-shaper-myanmar-machine.hh"
+#line 81 "hb-ot-shaper-myanmar-machine.hh"
 static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
 	1u, 41u, 3u, 41u, 5u, 39u, 5u, 8u, 3u, 41u, 3u, 39u, 3u, 39u, 5u, 39u, 
 	5u, 39u, 3u, 39u, 3u, 39u, 3u, 41u, 5u, 39u, 1u, 15u, 3u, 39u, 3u, 39u, 
@@ -443,7 +443,7 @@ find_syllables_myanmar (hb_buffer_t *buf
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 436 "hb-ot-shaper-myanmar-machine.hh"
+#line 447 "hb-ot-shaper-myanmar-machine.hh"
 	{
 	cs = myanmar_syllable_machine_start;
 	ts = 0;
@@ -459,7 +459,7 @@ find_syllables_myanmar (hb_buffer_t *buf
 
   unsigned int syllable_serial = 1;
   
-#line 448 "hb-ot-shaper-myanmar-machine.hh"
+#line 463 "hb-ot-shaper-myanmar-machine.hh"
 	{
 	int _slen;
 	int _trans;
@@ -473,7 +473,7 @@ _resume:
 #line 1 "NONE"
 	{ts = p;}
 	break;
-#line 460 "hb-ot-shaper-myanmar-machine.hh"
+#line 477 "hb-ot-shaper-myanmar-machine.hh"
 	}
 
 	_keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
@@ -519,7 +519,7 @@ _eof_trans:
 #line 113 "hb-ot-shaper-myanmar-machine.rl"
 	{te = p;p--;{ found_syllable (myanmar_non_myanmar_cluster); }}
 	break;
-#line 498 "hb-ot-shaper-myanmar-machine.hh"
+#line 523 "hb-ot-shaper-myanmar-machine.hh"
 	}
 
 _again:
@@ -528,7 +528,7 @@ _again:
 #line 1 "NONE"
 	{ts = 0;}
 	break;
-#line 505 "hb-ot-shaper-myanmar-machine.hh"
+#line 532 "hb-ot-shaper-myanmar-machine.hh"
 	}
 
 	if ( ++p != pe )
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-syllabic.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-syllabic.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-syllabic.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-syllabic.cc	2024-11-20 13:56:33.000000000 +0000
@@ -40,6 +40,14 @@ hb_syllabic_insert_dotted_circles (hb_fo
   if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
     return false;
   if (likely (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE)))
+  {
+    if (buffer->messaging ())
+      (void) buffer->message (font, "skipped inserting dotted-circles because there is no broken syllables");
+    return false;
+  }
+
+  if (buffer->messaging () &&
+      !buffer->message (font, "start inserting dotted-circles"))
     return false;
 
   hb_codepoint_t dottedcircle_glyph;
@@ -84,6 +92,10 @@ hb_syllabic_insert_dotted_circles (hb_fo
       (void) buffer->next_glyph ();
   }
   buffer->sync ();
+
+  if (buffer->messaging ())
+    (void) buffer->message (font, "end inserting dotted-circles");
+
   return true;
 }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-use-machine.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-use-machine.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-use-machine.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-use-machine.hh	2024-11-20 13:56:33.000000000 +0000
@@ -53,7 +53,7 @@ enum use_syllable_type_t {
 };
 
 
-#line 54 "hb-ot-shaper-use-machine.hh"
+#line 57 "hb-ot-shaper-use-machine.hh"
 #define use_syllable_machine_ex_B 1u
 #define use_syllable_machine_ex_CGJ 6u
 #define use_syllable_machine_ex_CMAbv 31u
@@ -68,7 +68,9 @@ enum use_syllable_type_t {
 #define use_syllable_machine_ex_G 49u
 #define use_syllable_machine_ex_GB 5u
 #define use_syllable_machine_ex_H 12u
+#define use_syllable_machine_ex_HM 54u
 #define use_syllable_machine_ex_HN 13u
+#define use_syllable_machine_ex_HR 55u
 #define use_syllable_machine_ex_HVM 53u
 #define use_syllable_machine_ex_IS 44u
 #define use_syllable_machine_ex_J 50u
@@ -97,673 +99,662 @@ enum use_syllable_type_t {
 #define use_syllable_machine_ex_ZWNJ 14u
 
 
-#line 96 "hb-ot-shaper-use-machine.hh"
+#line 103 "hb-ot-shaper-use-machine.hh"
 static const unsigned char _use_syllable_machine_trans_keys[] = {
-	0u, 53u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 
-	14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 
-	14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 
-	12u, 53u, 11u, 53u, 1u, 14u, 1u, 48u, 11u, 53u, 14u, 42u, 14u, 42u, 11u, 53u, 
+	49u, 51u, 0u, 53u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 
+	14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 
+	14u, 48u, 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 
+	12u, 53u, 12u, 53u, 11u, 53u, 1u, 14u, 1u, 48u, 14u, 42u, 14u, 42u, 11u, 53u, 
+	1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 
+	14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, 14u, 53u, 
+	14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 14u, 
+	1u, 14u, 1u, 48u, 13u, 14u, 4u, 14u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 
+	14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 
+	14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 
+	14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 14u, 1u, 14u, 1u, 48u, 
 	11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, 
 	14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, 
 	14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 
-	1u, 14u, 1u, 14u, 1u, 48u, 13u, 14u, 4u, 14u, 11u, 53u, 11u, 53u, 1u, 53u, 
-	14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 
-	14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 
-	12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 14u, 1u, 14u, 
-	1u, 48u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 
-	14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 
-	14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 
-	12u, 53u, 11u, 53u, 1u, 14u, 1u, 48u, 4u, 14u, 13u, 14u, 1u, 53u, 11u, 53u, 
-	14u, 42u, 14u, 42u, 1u, 5u, 14u, 52u, 14u, 52u, 14u, 51u, 0
+	1u, 14u, 1u, 48u, 4u, 14u, 13u, 14u, 1u, 53u, 14u, 42u, 14u, 42u, 1u, 5u, 
+	14u, 55u, 14u, 51u, 14u, 52u, 14u, 54u, 11u, 53u, 0
 };
 
 static const char _use_syllable_machine_key_spans[] = {
-	54, 43, 43, 53, 35, 34, 34, 34, 
-	33, 33, 1, 35, 35, 35, 14, 35, 
-	40, 40, 40, 40, 42, 40, 42, 42, 
-	42, 43, 14, 48, 43, 29, 29, 43, 
+	3, 54, 43, 43, 53, 35, 34, 34, 
+	34, 33, 33, 1, 35, 35, 35, 14, 
+	35, 40, 40, 40, 40, 42, 40, 42, 
+	42, 42, 43, 14, 48, 29, 29, 43, 
+	53, 35, 34, 34, 34, 33, 33, 1, 
+	35, 35, 35, 14, 35, 40, 40, 40, 
+	40, 42, 40, 42, 42, 42, 43, 14, 
+	14, 48, 2, 11, 43, 43, 53, 35, 
+	34, 34, 34, 33, 33, 1, 35, 35, 
+	35, 14, 35, 40, 40, 40, 40, 42, 
+	40, 42, 42, 42, 43, 14, 14, 48, 
 	43, 53, 35, 34, 34, 34, 33, 33, 
 	1, 35, 35, 35, 14, 35, 40, 40, 
 	40, 40, 42, 40, 42, 42, 42, 43, 
-	14, 14, 48, 2, 11, 43, 43, 53, 
-	35, 34, 34, 34, 33, 33, 1, 35, 
-	35, 35, 14, 35, 40, 40, 40, 40, 
-	42, 40, 42, 42, 42, 43, 14, 14, 
-	48, 43, 43, 53, 35, 34, 34, 34, 
-	33, 33, 1, 35, 35, 35, 14, 35, 
-	40, 40, 40, 40, 42, 40, 42, 42, 
-	42, 43, 14, 48, 11, 2, 53, 43, 
-	29, 29, 5, 39, 39, 38
+	14, 48, 11, 2, 53, 29, 29, 5, 
+	42, 38, 39, 41, 43
 };
 
 static const short _use_syllable_machine_index_offsets[] = {
-	0, 55, 99, 143, 197, 233, 268, 303, 
-	338, 372, 406, 408, 444, 480, 516, 531, 
-	567, 608, 649, 690, 731, 774, 815, 858, 
-	901, 944, 988, 1003, 1052, 1096, 1126, 1156, 
-	1200, 1244, 1298, 1334, 1369, 1404, 1439, 1473, 
-	1507, 1509, 1545, 1581, 1617, 1632, 1668, 1709, 
-	1750, 1791, 1832, 1875, 1916, 1959, 2002, 2045, 
-	2089, 2104, 2119, 2168, 2171, 2183, 2227, 2271, 
-	2325, 2361, 2396, 2431, 2466, 2500, 2534, 2536, 
-	2572, 2608, 2644, 2659, 2695, 2736, 2777, 2818, 
-	2859, 2902, 2943, 2986, 3029, 3072, 3116, 3131, 
-	3146, 3195, 3239, 3283, 3337, 3373, 3408, 3443, 
-	3478, 3512, 3546, 3548, 3584, 3620, 3656, 3671, 
-	3707, 3748, 3789, 3830, 3871, 3914, 3955, 3998, 
-	4041, 4084, 4128, 4143, 4192, 4204, 4207, 4261, 
-	4305, 4335, 4365, 4371, 4411, 4451
+	0, 4, 59, 103, 147, 201, 237, 272, 
+	307, 342, 376, 410, 412, 448, 484, 520, 
+	535, 571, 612, 653, 694, 735, 778, 819, 
+	862, 905, 948, 992, 1007, 1056, 1086, 1116, 
+	1160, 1214, 1250, 1285, 1320, 1355, 1389, 1423, 
+	1425, 1461, 1497, 1533, 1548, 1584, 1625, 1666, 
+	1707, 1748, 1791, 1832, 1875, 1918, 1961, 2005, 
+	2020, 2035, 2084, 2087, 2099, 2143, 2187, 2241, 
+	2277, 2312, 2347, 2382, 2416, 2450, 2452, 2488, 
+	2524, 2560, 2575, 2611, 2652, 2693, 2734, 2775, 
+	2818, 2859, 2902, 2945, 2988, 3032, 3047, 3062, 
+	3111, 3155, 3209, 3245, 3280, 3315, 3350, 3384, 
+	3418, 3420, 3456, 3492, 3528, 3543, 3579, 3620, 
+	3661, 3702, 3743, 3786, 3827, 3870, 3913, 3956, 
+	4000, 4015, 4064, 4076, 4079, 4133, 4163, 4193, 
+	4199, 4242, 4281, 4321, 4363
 };
 
 static const unsigned char _use_syllable_machine_indicies[] = {
-	0, 1, 2, 2, 3, 4, 2, 2, 
-	2, 2, 2, 5, 6, 7, 8, 2, 
-	2, 2, 9, 2, 2, 2, 10, 11, 
-	12, 13, 14, 15, 16, 17, 18, 19, 
-	20, 21, 22, 23, 2, 24, 25, 26, 
-	2, 27, 28, 29, 30, 31, 32, 33, 
-	30, 34, 2, 35, 2, 36, 2, 38, 
-	39, 37, 40, 37, 37, 37, 37, 37, 
-	37, 37, 41, 42, 43, 44, 45, 46, 
-	47, 48, 49, 50, 51, 52, 53, 54, 
-	37, 55, 56, 57, 37, 58, 59, 37, 
-	60, 61, 62, 63, 60, 37, 37, 37, 
-	37, 64, 37, 38, 39, 37, 40, 37, 
-	37, 37, 37, 37, 37, 37, 41, 42, 
-	43, 44, 45, 46, 47, 48, 49, 51, 
-	51, 52, 53, 54, 37, 55, 56, 57, 
-	37, 37, 37, 37, 60, 61, 62, 63, 
-	60, 37, 37, 37, 37, 64, 37, 38, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 40, 37, 37, 37, 
-	37, 37, 37, 37, 37, 42, 43, 44, 
-	45, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 55, 56, 57, 37, 37, 
-	37, 37, 37, 61, 62, 63, 65, 37, 
-	37, 37, 37, 42, 37, 40, 37, 37, 
-	37, 37, 37, 37, 37, 37, 42, 43, 
-	44, 45, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 55, 56, 57, 37, 
-	37, 37, 37, 37, 61, 62, 63, 65, 
-	37, 40, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 43, 44, 45, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	61, 62, 63, 37, 40, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 44, 
-	45, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 61, 62, 63, 37, 40, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 45, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 61, 62, 
-	63, 37, 40, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 61, 62, 37, 40, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 62, 37, 40, 37, 
-	40, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 43, 44, 45, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 55, 
-	56, 57, 37, 37, 37, 37, 37, 61, 
-	62, 63, 65, 37, 40, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 43, 44, 
-	45, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 56, 57, 37, 37, 
-	37, 37, 37, 61, 62, 63, 65, 37, 
-	40, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 43, 44, 45, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 57, 37, 37, 37, 37, 37, 61, 
-	62, 63, 65, 37, 66, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 40, 37, 40, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 43, 44, 45, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 61, 62, 63, 65, 37, 40, 
-	37, 37, 37, 37, 37, 37, 37, 41, 
-	42, 43, 44, 45, 37, 37, 37, 37, 
-	37, 37, 52, 53, 54, 37, 55, 56, 
-	57, 37, 37, 37, 37, 37, 61, 62, 
-	63, 65, 37, 37, 37, 37, 42, 37, 
-	40, 37, 37, 37, 37, 37, 37, 37, 
-	37, 42, 43, 44, 45, 37, 37, 37, 
-	37, 37, 37, 52, 53, 54, 37, 55, 
-	56, 57, 37, 37, 37, 37, 37, 61, 
-	62, 63, 65, 37, 37, 37, 37, 42, 
-	37, 40, 37, 37, 37, 37, 37, 37, 
-	37, 37, 42, 43, 44, 45, 37, 37, 
-	37, 37, 37, 37, 37, 53, 54, 37, 
-	55, 56, 57, 37, 37, 37, 37, 37, 
-	61, 62, 63, 65, 37, 37, 37, 37, 
-	42, 37, 40, 37, 37, 37, 37, 37, 
-	37, 37, 37, 42, 43, 44, 45, 37, 
-	37, 37, 37, 37, 37, 37, 37, 54, 
-	37, 55, 56, 57, 37, 37, 37, 37, 
-	37, 61, 62, 63, 65, 37, 37, 37, 
-	37, 42, 37, 67, 37, 40, 37, 37, 
-	37, 37, 37, 37, 37, 41, 42, 43, 
-	44, 45, 37, 47, 48, 37, 37, 37, 
-	52, 53, 54, 37, 55, 56, 57, 37, 
-	37, 37, 37, 37, 61, 62, 63, 65, 
-	37, 37, 37, 37, 42, 37, 40, 37, 
-	37, 37, 37, 37, 37, 37, 37, 42, 
-	43, 44, 45, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 55, 56, 57, 
-	37, 37, 37, 37, 37, 61, 62, 63, 
-	65, 37, 37, 37, 37, 42, 37, 67, 
-	37, 40, 37, 37, 37, 37, 37, 37, 
-	37, 41, 42, 43, 44, 45, 37, 37, 
-	48, 37, 37, 37, 52, 53, 54, 37, 
-	55, 56, 57, 37, 37, 37, 37, 37, 
-	61, 62, 63, 65, 37, 37, 37, 37, 
-	42, 37, 67, 37, 40, 37, 37, 37, 
-	37, 37, 37, 37, 41, 42, 43, 44, 
-	45, 37, 37, 37, 37, 37, 37, 52, 
-	53, 54, 37, 55, 56, 57, 37, 37, 
-	37, 37, 37, 61, 62, 63, 65, 37, 
-	37, 37, 37, 42, 37, 67, 37, 40, 
-	37, 37, 37, 37, 37, 37, 37, 41, 
-	42, 43, 44, 45, 46, 47, 48, 37, 
-	37, 37, 52, 53, 54, 37, 55, 56, 
-	57, 37, 37, 37, 37, 37, 61, 62, 
-	63, 65, 37, 37, 37, 37, 42, 37, 
-	38, 39, 37, 40, 37, 37, 37, 37, 
-	37, 37, 37, 41, 42, 43, 44, 45, 
-	46, 47, 48, 49, 37, 51, 52, 53, 
-	54, 37, 55, 56, 57, 37, 37, 37, 
-	37, 60, 61, 62, 63, 60, 37, 37, 
-	37, 37, 64, 37, 38, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 40, 37, 38, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	40, 37, 37, 37, 37, 37, 37, 37, 
-	37, 42, 43, 44, 45, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 55, 
-	56, 57, 37, 37, 37, 37, 37, 61, 
-	62, 63, 65, 37, 38, 39, 37, 40, 
-	37, 37, 37, 37, 37, 37, 37, 41, 
-	42, 43, 44, 45, 46, 47, 48, 49, 
-	50, 51, 52, 53, 54, 37, 55, 56, 
-	57, 37, 37, 37, 37, 60, 61, 62, 
-	63, 60, 37, 37, 37, 37, 64, 37, 
-	40, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 58, 59, 37, 40, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 59, 37, 69, 70, 68, 71, 
+	1, 0, 2, 0, 3, 4, 5, 5, 
+	6, 7, 5, 5, 5, 5, 5, 8, 
+	9, 10, 11, 5, 5, 5, 12, 5, 
+	5, 5, 13, 14, 15, 16, 17, 18, 
+	19, 20, 21, 8, 22, 23, 24, 25, 
+	5, 26, 27, 28, 5, 29, 30, 31, 
+	32, 33, 34, 35, 32, 1, 5, 36, 
+	5, 37, 5, 39, 40, 38, 41, 38, 
+	38, 38, 38, 38, 38, 38, 42, 43, 
+	44, 45, 46, 47, 48, 49, 50, 39, 
+	51, 52, 53, 54, 38, 55, 56, 57, 
+	38, 58, 59, 38, 60, 61, 62, 63, 
+	60, 38, 38, 38, 38, 64, 38, 39, 
+	40, 38, 41, 38, 38, 38, 38, 38, 
+	38, 38, 42, 43, 44, 45, 46, 47, 
+	48, 49, 50, 39, 51, 52, 53, 54, 
+	38, 55, 56, 57, 38, 38, 38, 38, 
+	60, 61, 62, 63, 60, 38, 38, 38, 
+	38, 64, 38, 39, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	41, 38, 38, 38, 38, 38, 38, 38, 
+	38, 43, 44, 45, 46, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 55, 
+	56, 57, 38, 38, 38, 38, 38, 61, 
+	62, 63, 65, 38, 38, 38, 38, 43, 
+	38, 41, 38, 38, 38, 38, 38, 38, 
+	38, 38, 43, 44, 45, 46, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	55, 56, 57, 38, 38, 38, 38, 38, 
+	61, 62, 63, 65, 38, 41, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 44, 
+	45, 46, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 61, 62, 63, 38, 
+	41, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 45, 46, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 61, 
+	62, 63, 38, 41, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 46, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 61, 62, 63, 38, 41, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 61, 62, 38, 
+	41, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	62, 38, 41, 38, 41, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 44, 45, 
+	46, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 55, 56, 57, 38, 38, 
+	38, 38, 38, 61, 62, 63, 65, 38, 
+	41, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 44, 45, 46, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	56, 57, 38, 38, 38, 38, 38, 61, 
+	62, 63, 65, 38, 41, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 44, 45, 
+	46, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 57, 38, 38, 
+	38, 38, 38, 61, 62, 63, 65, 38, 
+	66, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 41, 38, 41, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 44, 45, 46, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 61, 62, 
+	63, 65, 38, 41, 38, 38, 38, 38, 
+	38, 38, 38, 42, 43, 44, 45, 46, 
+	38, 38, 38, 38, 38, 38, 52, 53, 
+	54, 38, 55, 56, 57, 38, 38, 38, 
+	38, 38, 61, 62, 63, 65, 38, 38, 
+	38, 38, 43, 38, 41, 38, 38, 38, 
+	38, 38, 38, 38, 38, 43, 44, 45, 
+	46, 38, 38, 38, 38, 38, 38, 52, 
+	53, 54, 38, 55, 56, 57, 38, 38, 
+	38, 38, 38, 61, 62, 63, 65, 38, 
+	38, 38, 38, 43, 38, 41, 38, 38, 
+	38, 38, 38, 38, 38, 38, 43, 44, 
+	45, 46, 38, 38, 38, 38, 38, 38, 
+	38, 53, 54, 38, 55, 56, 57, 38, 
+	38, 38, 38, 38, 61, 62, 63, 65, 
+	38, 38, 38, 38, 43, 38, 41, 38, 
+	38, 38, 38, 38, 38, 38, 38, 43, 
+	44, 45, 46, 38, 38, 38, 38, 38, 
+	38, 38, 38, 54, 38, 55, 56, 57, 
+	38, 38, 38, 38, 38, 61, 62, 63, 
+	65, 38, 38, 38, 38, 43, 38, 67, 
+	38, 41, 38, 38, 38, 38, 38, 38, 
+	38, 42, 43, 44, 45, 46, 38, 48, 
+	49, 38, 38, 38, 52, 53, 54, 38, 
+	55, 56, 57, 38, 38, 38, 38, 38, 
+	61, 62, 63, 65, 38, 38, 38, 38, 
+	43, 38, 41, 38, 38, 38, 38, 38, 
+	38, 38, 38, 43, 44, 45, 46, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 55, 56, 57, 38, 38, 38, 38, 
+	38, 61, 62, 63, 65, 38, 38, 38, 
+	38, 43, 38, 67, 38, 41, 38, 38, 
+	38, 38, 38, 38, 38, 42, 43, 44, 
+	45, 46, 38, 38, 49, 38, 38, 38, 
+	52, 53, 54, 38, 55, 56, 57, 38, 
+	38, 38, 38, 38, 61, 62, 63, 65, 
+	38, 38, 38, 38, 43, 38, 67, 38, 
+	41, 38, 38, 38, 38, 38, 38, 38, 
+	42, 43, 44, 45, 46, 38, 38, 38, 
+	38, 38, 38, 52, 53, 54, 38, 55, 
+	56, 57, 38, 38, 38, 38, 38, 61, 
+	62, 63, 65, 38, 38, 38, 38, 43, 
+	38, 67, 38, 41, 38, 38, 38, 38, 
+	38, 38, 38, 42, 43, 44, 45, 46, 
+	47, 48, 49, 38, 38, 38, 52, 53, 
+	54, 38, 55, 56, 57, 38, 38, 38, 
+	38, 38, 61, 62, 63, 65, 38, 38, 
+	38, 38, 43, 38, 39, 40, 38, 41, 
+	38, 38, 38, 38, 38, 38, 38, 42, 
+	43, 44, 45, 46, 47, 48, 49, 50, 
+	38, 51, 52, 53, 54, 38, 55, 56, 
+	57, 38, 38, 38, 38, 60, 61, 62, 
+	63, 60, 38, 38, 38, 38, 64, 38, 
+	39, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 41, 38, 39, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 41, 38, 38, 38, 
+	38, 38, 38, 38, 38, 43, 44, 45, 
+	46, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 55, 56, 57, 38, 38, 
+	38, 38, 38, 61, 62, 63, 65, 38, 
+	41, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 58, 59, 38, 41, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 38, 38, 38, 38, 38, 38, 
+	38, 38, 59, 38, 4, 69, 68, 70, 
+	68, 68, 68, 68, 68, 68, 68, 71, 
+	72, 73, 74, 75, 76, 77, 78, 79, 
+	4, 80, 81, 82, 83, 68, 84, 85, 
+	86, 68, 68, 68, 68, 87, 88, 89, 
+	90, 91, 68, 68, 68, 68, 92, 68, 
+	4, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 70, 68, 68, 
+	68, 68, 68, 68, 68, 68, 72, 73, 
+	74, 75, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 84, 85, 86, 68, 
+	68, 68, 68, 68, 88, 89, 90, 93, 
+	68, 68, 68, 68, 72, 68, 70, 68, 
 	68, 68, 68, 68, 68, 68, 68, 72, 
-	73, 74, 75, 76, 77, 78, 79, 80, 
-	1, 81, 82, 83, 84, 68, 85, 86, 
-	87, 68, 68, 68, 68, 88, 89, 90, 
-	91, 92, 68, 68, 68, 68, 93, 68, 
-	69, 70, 68, 71, 68, 68, 68, 68, 
-	68, 68, 68, 72, 73, 74, 75, 76, 
-	77, 78, 79, 80, 81, 81, 82, 83, 
-	84, 68, 85, 86, 87, 68, 68, 68, 
-	68, 88, 89, 90, 91, 92, 68, 68, 
-	68, 68, 93, 68, 69, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 71, 68, 68, 68, 68, 68, 68, 
-	68, 68, 73, 74, 75, 76, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	85, 86, 87, 68, 68, 68, 68, 68, 
-	89, 90, 91, 94, 68, 68, 68, 68, 
-	73, 68, 71, 68, 68, 68, 68, 68, 
-	68, 68, 68, 73, 74, 75, 76, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 85, 86, 87, 68, 68, 68, 68, 
-	68, 89, 90, 91, 94, 68, 71, 68, 
+	73, 74, 75, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 84, 85, 86, 
+	68, 68, 68, 68, 68, 88, 89, 90, 
+	93, 68, 70, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 73, 74, 75, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	74, 75, 76, 68, 68, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 89, 90, 91, 
-	68, 71, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 75, 76, 68, 68, 
+	68, 88, 89, 90, 68, 70, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
+	74, 75, 68, 68, 68, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	89, 90, 91, 68, 71, 68, 68, 68, 
+	68, 68, 68, 68, 88, 89, 90, 68, 
+	70, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 75, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	76, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 88, 
+	89, 90, 68, 70, 68, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 89, 90, 91, 68, 71, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 88, 89, 68, 70, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 89, 90, 
-	68, 71, 68, 68, 68, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 89, 68, 70, 
+	68, 70, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 73, 74, 75, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 90, 68, 71, 68, 71, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 74, 
-	75, 76, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 85, 86, 87, 68, 
-	68, 68, 68, 68, 89, 90, 91, 94, 
-	68, 71, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 74, 75, 76, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 86, 87, 68, 68, 68, 68, 68, 
-	89, 90, 91, 94, 68, 71, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 74, 
-	75, 76, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 87, 68, 
-	68, 68, 68, 68, 89, 90, 91, 94, 
-	68, 96, 95, 95, 95, 95, 95, 95, 
-	95, 95, 95, 95, 95, 95, 97, 95, 
-	71, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 74, 75, 76, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 89, 
-	90, 91, 94, 68, 71, 68, 68, 68, 
-	68, 68, 68, 68, 72, 73, 74, 75, 
-	76, 68, 68, 68, 68, 68, 68, 82, 
-	83, 84, 68, 85, 86, 87, 68, 68, 
-	68, 68, 68, 89, 90, 91, 94, 68, 
-	68, 68, 68, 73, 68, 71, 68, 68, 
-	68, 68, 68, 68, 68, 68, 73, 74, 
-	75, 76, 68, 68, 68, 68, 68, 68, 
-	82, 83, 84, 68, 85, 86, 87, 68, 
-	68, 68, 68, 68, 89, 90, 91, 94, 
-	68, 68, 68, 68, 73, 68, 71, 68, 
+	84, 85, 86, 68, 68, 68, 68, 68, 
+	88, 89, 90, 93, 68, 70, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 73, 
-	74, 75, 76, 68, 68, 68, 68, 68, 
-	68, 68, 83, 84, 68, 85, 86, 87, 
-	68, 68, 68, 68, 68, 89, 90, 91, 
-	94, 68, 68, 68, 68, 73, 68, 71, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	73, 74, 75, 76, 68, 68, 68, 68, 
-	68, 68, 68, 68, 84, 68, 85, 86, 
-	87, 68, 68, 68, 68, 68, 89, 90, 
-	91, 94, 68, 68, 68, 68, 73, 68, 
-	98, 68, 71, 68, 68, 68, 68, 68, 
-	68, 68, 72, 73, 74, 75, 76, 68, 
-	78, 79, 68, 68, 68, 82, 83, 84, 
-	68, 85, 86, 87, 68, 68, 68, 68, 
-	68, 89, 90, 91, 94, 68, 68, 68, 
-	68, 73, 68, 71, 68, 68, 68, 68, 
-	68, 68, 68, 68, 73, 74, 75, 76, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 85, 86, 87, 68, 68, 68, 
-	68, 68, 89, 90, 91, 94, 68, 68, 
-	68, 68, 73, 68, 98, 68, 71, 68, 
-	68, 68, 68, 68, 68, 68, 72, 73, 
-	74, 75, 76, 68, 68, 79, 68, 68, 
-	68, 82, 83, 84, 68, 85, 86, 87, 
-	68, 68, 68, 68, 68, 89, 90, 91, 
-	94, 68, 68, 68, 68, 73, 68, 98, 
-	68, 71, 68, 68, 68, 68, 68, 68, 
-	68, 72, 73, 74, 75, 76, 68, 68, 
-	68, 68, 68, 68, 82, 83, 84, 68, 
-	85, 86, 87, 68, 68, 68, 68, 68, 
-	89, 90, 91, 94, 68, 68, 68, 68, 
-	73, 68, 98, 68, 71, 68, 68, 68, 
-	68, 68, 68, 68, 72, 73, 74, 75, 
-	76, 77, 78, 79, 68, 68, 68, 82, 
-	83, 84, 68, 85, 86, 87, 68, 68, 
-	68, 68, 68, 89, 90, 91, 94, 68, 
-	68, 68, 68, 73, 68, 69, 70, 68, 
-	71, 68, 68, 68, 68, 68, 68, 68, 
-	72, 73, 74, 75, 76, 77, 78, 79, 
-	80, 68, 81, 82, 83, 84, 68, 85, 
-	86, 87, 68, 68, 68, 68, 88, 89, 
-	90, 91, 92, 68, 68, 68, 68, 93, 
-	68, 69, 99, 99, 99, 99, 99, 99, 
-	99, 99, 99, 99, 99, 99, 100, 99, 
-	69, 95, 95, 95, 95, 95, 95, 95, 
-	95, 95, 95, 95, 95, 97, 95, 69, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 71, 68, 68, 68, 
-	68, 68, 68, 68, 68, 73, 74, 75, 
-	76, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 85, 86, 87, 68, 68, 
-	68, 68, 68, 89, 90, 91, 94, 68, 
-	102, 103, 101, 3, 104, 104, 104, 104, 
-	104, 104, 104, 104, 104, 105, 104, 106, 
-	107, 68, 71, 68, 68, 68, 68, 68, 
-	68, 68, 108, 109, 110, 111, 112, 113, 
-	114, 115, 116, 117, 118, 119, 120, 121, 
-	68, 122, 123, 124, 68, 58, 59, 68, 
-	125, 126, 127, 128, 129, 68, 68, 68, 
-	68, 130, 68, 106, 107, 68, 71, 68, 
-	68, 68, 68, 68, 68, 68, 108, 109, 
-	110, 111, 112, 113, 114, 115, 116, 118, 
-	118, 119, 120, 121, 68, 122, 123, 124, 
-	68, 68, 68, 68, 125, 126, 127, 128, 
-	129, 68, 68, 68, 68, 130, 68, 106, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 71, 68, 68, 68, 
-	68, 68, 68, 68, 68, 109, 110, 111, 
-	112, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 122, 123, 124, 68, 68, 
-	68, 68, 68, 126, 127, 128, 131, 68, 
-	68, 68, 68, 109, 68, 71, 68, 68, 
-	68, 68, 68, 68, 68, 68, 109, 110, 
-	111, 112, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 122, 123, 124, 68, 
-	68, 68, 68, 68, 126, 127, 128, 131, 
-	68, 71, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 110, 111, 112, 68, 68, 
+	74, 75, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 85, 86, 68, 
+	68, 68, 68, 68, 88, 89, 90, 93, 
+	68, 70, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 73, 74, 75, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 86, 68, 68, 68, 68, 68, 
+	88, 89, 90, 93, 68, 95, 94, 94, 
+	94, 94, 94, 94, 94, 94, 94, 94, 
+	94, 94, 96, 94, 70, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 73, 74, 
+	75, 68, 68, 68, 68, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 88, 89, 90, 93, 68, 
+	70, 68, 68, 68, 68, 68, 68, 68, 
+	71, 72, 73, 74, 75, 68, 68, 68, 
+	68, 68, 68, 81, 82, 83, 68, 84, 
+	85, 86, 68, 68, 68, 68, 68, 88, 
+	89, 90, 93, 68, 68, 68, 68, 72, 
+	68, 70, 68, 68, 68, 68, 68, 68, 
+	68, 68, 72, 73, 74, 75, 68, 68, 
+	68, 68, 68, 68, 81, 82, 83, 68, 
+	84, 85, 86, 68, 68, 68, 68, 68, 
+	88, 89, 90, 93, 68, 68, 68, 68, 
+	72, 68, 70, 68, 68, 68, 68, 68, 
+	68, 68, 68, 72, 73, 74, 75, 68, 
+	68, 68, 68, 68, 68, 68, 82, 83, 
+	68, 84, 85, 86, 68, 68, 68, 68, 
+	68, 88, 89, 90, 93, 68, 68, 68, 
+	68, 72, 68, 70, 68, 68, 68, 68, 
+	68, 68, 68, 68, 72, 73, 74, 75, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	126, 127, 128, 68, 71, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 111, 
-	112, 68, 68, 68, 68, 68, 68, 68, 
+	83, 68, 84, 85, 86, 68, 68, 68, 
+	68, 68, 88, 89, 90, 93, 68, 68, 
+	68, 68, 72, 68, 97, 68, 70, 68, 
+	68, 68, 68, 68, 68, 68, 71, 72, 
+	73, 74, 75, 68, 77, 78, 68, 68, 
+	68, 81, 82, 83, 68, 84, 85, 86, 
+	68, 68, 68, 68, 68, 88, 89, 90, 
+	93, 68, 68, 68, 68, 72, 68, 70, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	72, 73, 74, 75, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 84, 85, 
+	86, 68, 68, 68, 68, 68, 88, 89, 
+	90, 93, 68, 68, 68, 68, 72, 68, 
+	97, 68, 70, 68, 68, 68, 68, 68, 
+	68, 68, 71, 72, 73, 74, 75, 68, 
+	68, 78, 68, 68, 68, 81, 82, 83, 
+	68, 84, 85, 86, 68, 68, 68, 68, 
+	68, 88, 89, 90, 93, 68, 68, 68, 
+	68, 72, 68, 97, 68, 70, 68, 68, 
+	68, 68, 68, 68, 68, 71, 72, 73, 
+	74, 75, 68, 68, 68, 68, 68, 68, 
+	81, 82, 83, 68, 84, 85, 86, 68, 
+	68, 68, 68, 68, 88, 89, 90, 93, 
+	68, 68, 68, 68, 72, 68, 97, 68, 
+	70, 68, 68, 68, 68, 68, 68, 68, 
+	71, 72, 73, 74, 75, 76, 77, 78, 
+	68, 68, 68, 81, 82, 83, 68, 84, 
+	85, 86, 68, 68, 68, 68, 68, 88, 
+	89, 90, 93, 68, 68, 68, 68, 72, 
+	68, 4, 69, 68, 70, 68, 68, 68, 
+	68, 68, 68, 68, 71, 72, 73, 74, 
+	75, 76, 77, 78, 79, 68, 80, 81, 
+	82, 83, 68, 84, 85, 86, 68, 68, 
+	68, 68, 87, 88, 89, 90, 91, 68, 
+	68, 68, 68, 92, 68, 4, 98, 98, 
+	98, 98, 98, 98, 98, 98, 98, 98, 
+	98, 98, 99, 98, 4, 94, 94, 94, 
+	94, 94, 94, 94, 94, 94, 94, 94, 
+	94, 96, 94, 4, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	70, 68, 68, 68, 68, 68, 68, 68, 
+	68, 72, 73, 74, 75, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 84, 
+	85, 86, 68, 68, 68, 68, 68, 88, 
+	89, 90, 93, 68, 101, 102, 100, 6, 
+	103, 103, 103, 103, 103, 103, 103, 103, 
+	103, 104, 103, 105, 106, 68, 70, 68, 
+	68, 68, 68, 68, 68, 68, 107, 108, 
+	109, 110, 111, 112, 113, 114, 115, 105, 
+	116, 117, 118, 119, 68, 120, 121, 122, 
+	68, 58, 59, 68, 123, 124, 125, 126, 
+	127, 68, 68, 68, 68, 128, 68, 105, 
+	106, 68, 70, 68, 68, 68, 68, 68, 
+	68, 68, 107, 108, 109, 110, 111, 112, 
+	113, 114, 115, 105, 116, 117, 118, 119, 
+	68, 120, 121, 122, 68, 68, 68, 68, 
+	123, 124, 125, 126, 127, 68, 68, 68, 
+	68, 128, 68, 105, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	70, 68, 68, 68, 68, 68, 68, 68, 
+	68, 108, 109, 110, 111, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 120, 
+	121, 122, 68, 68, 68, 68, 68, 124, 
+	125, 126, 129, 68, 68, 68, 68, 108, 
+	68, 70, 68, 68, 68, 68, 68, 68, 
+	68, 68, 108, 109, 110, 111, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 126, 127, 128, 68, 71, 
+	120, 121, 122, 68, 68, 68, 68, 68, 
+	124, 125, 126, 129, 68, 70, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 109, 
+	110, 111, 68, 68, 68, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 112, 68, 68, 68, 68, 
+	68, 68, 68, 68, 124, 125, 126, 68, 
+	70, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 110, 111, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 126, 127, 
-	128, 68, 71, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 124, 
+	125, 126, 68, 70, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 111, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 124, 125, 126, 68, 70, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 126, 127, 68, 71, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 124, 125, 68, 
+	70, 68, 68, 68, 68, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 127, 68, 71, 68, 
-	71, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 110, 111, 112, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 122, 
-	123, 124, 68, 68, 68, 68, 68, 126, 
-	127, 128, 131, 68, 71, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 110, 111, 
-	112, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 123, 124, 68, 68, 
-	68, 68, 68, 126, 127, 128, 131, 68, 
-	71, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 110, 111, 112, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 124, 68, 68, 68, 68, 68, 126, 
-	127, 128, 131, 68, 132, 95, 95, 95, 
-	95, 95, 95, 95, 95, 95, 95, 95, 
-	95, 97, 95, 71, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 110, 111, 112, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
+	125, 68, 70, 68, 70, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 109, 110, 
+	111, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 120, 121, 122, 68, 68, 
+	68, 68, 68, 124, 125, 126, 129, 68, 
+	70, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 109, 110, 111, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 126, 127, 128, 131, 68, 71, 
-	68, 68, 68, 68, 68, 68, 68, 108, 
-	109, 110, 111, 112, 68, 68, 68, 68, 
-	68, 68, 119, 120, 121, 68, 122, 123, 
-	124, 68, 68, 68, 68, 68, 126, 127, 
-	128, 131, 68, 68, 68, 68, 109, 68, 
-	71, 68, 68, 68, 68, 68, 68, 68, 
-	68, 109, 110, 111, 112, 68, 68, 68, 
-	68, 68, 68, 119, 120, 121, 68, 122, 
-	123, 124, 68, 68, 68, 68, 68, 126, 
-	127, 128, 131, 68, 68, 68, 68, 109, 
-	68, 71, 68, 68, 68, 68, 68, 68, 
-	68, 68, 109, 110, 111, 112, 68, 68, 
-	68, 68, 68, 68, 68, 120, 121, 68, 
-	122, 123, 124, 68, 68, 68, 68, 68, 
-	126, 127, 128, 131, 68, 68, 68, 68, 
-	109, 68, 71, 68, 68, 68, 68, 68, 
-	68, 68, 68, 109, 110, 111, 112, 68, 
-	68, 68, 68, 68, 68, 68, 68, 121, 
-	68, 122, 123, 124, 68, 68, 68, 68, 
-	68, 126, 127, 128, 131, 68, 68, 68, 
-	68, 109, 68, 133, 68, 71, 68, 68, 
+	121, 122, 68, 68, 68, 68, 68, 124, 
+	125, 126, 129, 68, 70, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 109, 110, 
+	111, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 122, 68, 68, 
+	68, 68, 68, 124, 125, 126, 129, 68, 
+	130, 94, 94, 94, 94, 94, 94, 94, 
+	94, 94, 94, 94, 94, 96, 94, 70, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 109, 110, 111, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 68, 68, 68, 68, 124, 125, 
+	126, 129, 68, 70, 68, 68, 68, 68, 
+	68, 68, 68, 107, 108, 109, 110, 111, 
+	68, 68, 68, 68, 68, 68, 117, 118, 
+	119, 68, 120, 121, 122, 68, 68, 68, 
+	68, 68, 124, 125, 126, 129, 68, 68, 
+	68, 68, 108, 68, 70, 68, 68, 68, 
 	68, 68, 68, 68, 68, 108, 109, 110, 
-	111, 112, 68, 114, 115, 68, 68, 68, 
-	119, 120, 121, 68, 122, 123, 124, 68, 
-	68, 68, 68, 68, 126, 127, 128, 131, 
-	68, 68, 68, 68, 109, 68, 71, 68, 
-	68, 68, 68, 68, 68, 68, 68, 109, 
-	110, 111, 112, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 122, 123, 124, 
-	68, 68, 68, 68, 68, 126, 127, 128, 
-	131, 68, 68, 68, 68, 109, 68, 133, 
-	68, 71, 68, 68, 68, 68, 68, 68, 
-	68, 108, 109, 110, 111, 112, 68, 68, 
-	115, 68, 68, 68, 119, 120, 121, 68, 
-	122, 123, 124, 68, 68, 68, 68, 68, 
-	126, 127, 128, 131, 68, 68, 68, 68, 
-	109, 68, 133, 68, 71, 68, 68, 68, 
-	68, 68, 68, 68, 108, 109, 110, 111, 
-	112, 68, 68, 68, 68, 68, 68, 119, 
-	120, 121, 68, 122, 123, 124, 68, 68, 
-	68, 68, 68, 126, 127, 128, 131, 68, 
-	68, 68, 68, 109, 68, 133, 68, 71, 
+	111, 68, 68, 68, 68, 68, 68, 117, 
+	118, 119, 68, 120, 121, 122, 68, 68, 
+	68, 68, 68, 124, 125, 126, 129, 68, 
+	68, 68, 68, 108, 68, 70, 68, 68, 
+	68, 68, 68, 68, 68, 68, 108, 109, 
+	110, 111, 68, 68, 68, 68, 68, 68, 
+	68, 118, 119, 68, 120, 121, 122, 68, 
+	68, 68, 68, 68, 124, 125, 126, 129, 
+	68, 68, 68, 68, 108, 68, 70, 68, 
 	68, 68, 68, 68, 68, 68, 68, 108, 
-	109, 110, 111, 112, 113, 114, 115, 68, 
-	68, 68, 119, 120, 121, 68, 122, 123, 
-	124, 68, 68, 68, 68, 68, 126, 127, 
-	128, 131, 68, 68, 68, 68, 109, 68, 
-	106, 107, 68, 71, 68, 68, 68, 68, 
-	68, 68, 68, 108, 109, 110, 111, 112, 
-	113, 114, 115, 116, 68, 118, 119, 120, 
-	121, 68, 122, 123, 124, 68, 68, 68, 
-	68, 125, 126, 127, 128, 129, 68, 68, 
-	68, 68, 130, 68, 106, 99, 99, 99, 
-	99, 99, 99, 99, 99, 99, 99, 99, 
-	99, 100, 99, 106, 95, 95, 95, 95, 
-	95, 95, 95, 95, 95, 95, 95, 95, 
-	97, 95, 106, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 71, 
+	109, 110, 111, 68, 68, 68, 68, 68, 
+	68, 68, 68, 119, 68, 120, 121, 122, 
+	68, 68, 68, 68, 68, 124, 125, 126, 
+	129, 68, 68, 68, 68, 108, 68, 131, 
+	68, 70, 68, 68, 68, 68, 68, 68, 
+	68, 107, 108, 109, 110, 111, 68, 113, 
+	114, 68, 68, 68, 117, 118, 119, 68, 
+	120, 121, 122, 68, 68, 68, 68, 68, 
+	124, 125, 126, 129, 68, 68, 68, 68, 
+	108, 68, 70, 68, 68, 68, 68, 68, 
+	68, 68, 68, 108, 109, 110, 111, 68, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 120, 121, 122, 68, 68, 68, 68, 
+	68, 124, 125, 126, 129, 68, 68, 68, 
+	68, 108, 68, 131, 68, 70, 68, 68, 
+	68, 68, 68, 68, 68, 107, 108, 109, 
+	110, 111, 68, 68, 114, 68, 68, 68, 
+	117, 118, 119, 68, 120, 121, 122, 68, 
+	68, 68, 68, 68, 124, 125, 126, 129, 
+	68, 68, 68, 68, 108, 68, 131, 68, 
+	70, 68, 68, 68, 68, 68, 68, 68, 
+	107, 108, 109, 110, 111, 68, 68, 68, 
+	68, 68, 68, 117, 118, 119, 68, 120, 
+	121, 122, 68, 68, 68, 68, 68, 124, 
+	125, 126, 129, 68, 68, 68, 68, 108, 
+	68, 131, 68, 70, 68, 68, 68, 68, 
+	68, 68, 68, 107, 108, 109, 110, 111, 
+	112, 113, 114, 68, 68, 68, 117, 118, 
+	119, 68, 120, 121, 122, 68, 68, 68, 
+	68, 68, 124, 125, 126, 129, 68, 68, 
+	68, 68, 108, 68, 105, 106, 68, 70, 
+	68, 68, 68, 68, 68, 68, 68, 107, 
+	108, 109, 110, 111, 112, 113, 114, 115, 
+	68, 116, 117, 118, 119, 68, 120, 121, 
+	122, 68, 68, 68, 68, 123, 124, 125, 
+	126, 127, 68, 68, 68, 68, 128, 68, 
+	105, 98, 98, 98, 98, 98, 98, 98, 
+	98, 98, 98, 98, 98, 99, 98, 105, 
+	94, 94, 94, 94, 94, 94, 94, 94, 
+	94, 94, 94, 94, 96, 94, 105, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	109, 110, 111, 112, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 122, 123, 
-	124, 68, 68, 68, 68, 68, 126, 127, 
-	128, 131, 68, 106, 107, 68, 71, 68, 
-	68, 68, 68, 68, 68, 68, 108, 109, 
-	110, 111, 112, 113, 114, 115, 116, 117, 
-	118, 119, 120, 121, 68, 122, 123, 124, 
-	68, 68, 68, 68, 125, 126, 127, 128, 
-	129, 68, 68, 68, 68, 130, 68, 5, 
-	6, 134, 8, 134, 134, 134, 134, 134, 
-	134, 134, 10, 11, 12, 13, 14, 15, 
-	16, 17, 18, 20, 20, 21, 22, 23, 
-	134, 24, 25, 26, 134, 134, 134, 134, 
-	30, 31, 32, 33, 30, 134, 134, 134, 
-	134, 36, 134, 5, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	8, 134, 134, 134, 134, 134, 134, 134, 
-	134, 11, 12, 13, 14, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 24, 
-	25, 26, 134, 134, 134, 134, 134, 31, 
-	32, 33, 135, 134, 134, 134, 134, 11, 
-	134, 8, 134, 134, 134, 134, 134, 134, 
-	134, 134, 11, 12, 13, 14, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	24, 25, 26, 134, 134, 134, 134, 134, 
-	31, 32, 33, 135, 134, 8, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 12, 
-	13, 14, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 31, 32, 33, 134, 
-	8, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 13, 14, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 31, 
-	32, 33, 134, 8, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 14, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 31, 32, 33, 134, 8, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 31, 32, 134, 
-	8, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	32, 134, 8, 134, 8, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 12, 13, 
-	14, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 24, 25, 26, 134, 134, 
-	134, 134, 134, 31, 32, 33, 135, 134, 
-	8, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 12, 13, 14, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	25, 26, 134, 134, 134, 134, 134, 31, 
-	32, 33, 135, 134, 8, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 12, 13, 
-	14, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 26, 134, 134, 
-	134, 134, 134, 31, 32, 33, 135, 134, 
-	136, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 8, 134, 8, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 12, 13, 14, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 31, 32, 
-	33, 135, 134, 8, 134, 134, 134, 134, 
-	134, 134, 134, 10, 11, 12, 13, 14, 
-	134, 134, 134, 134, 134, 134, 21, 22, 
-	23, 134, 24, 25, 26, 134, 134, 134, 
-	134, 134, 31, 32, 33, 135, 134, 134, 
-	134, 134, 11, 134, 8, 134, 134, 134, 
-	134, 134, 134, 134, 134, 11, 12, 13, 
-	14, 134, 134, 134, 134, 134, 134, 21, 
-	22, 23, 134, 24, 25, 26, 134, 134, 
-	134, 134, 134, 31, 32, 33, 135, 134, 
-	134, 134, 134, 11, 134, 8, 134, 134, 
-	134, 134, 134, 134, 134, 134, 11, 12, 
-	13, 14, 134, 134, 134, 134, 134, 134, 
-	134, 22, 23, 134, 24, 25, 26, 134, 
-	134, 134, 134, 134, 31, 32, 33, 135, 
-	134, 134, 134, 134, 11, 134, 8, 134, 
-	134, 134, 134, 134, 134, 134, 134, 11, 
-	12, 13, 14, 134, 134, 134, 134, 134, 
-	134, 134, 134, 23, 134, 24, 25, 26, 
-	134, 134, 134, 134, 134, 31, 32, 33, 
-	135, 134, 134, 134, 134, 11, 134, 137, 
-	134, 8, 134, 134, 134, 134, 134, 134, 
-	134, 10, 11, 12, 13, 14, 134, 16, 
-	17, 134, 134, 134, 21, 22, 23, 134, 
-	24, 25, 26, 134, 134, 134, 134, 134, 
-	31, 32, 33, 135, 134, 134, 134, 134, 
-	11, 134, 8, 134, 134, 134, 134, 134, 
-	134, 134, 134, 11, 12, 13, 14, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 24, 25, 26, 134, 134, 134, 134, 
-	134, 31, 32, 33, 135, 134, 134, 134, 
-	134, 11, 134, 137, 134, 8, 134, 134, 
-	134, 134, 134, 134, 134, 10, 11, 12, 
-	13, 14, 134, 134, 17, 134, 134, 134, 
-	21, 22, 23, 134, 24, 25, 26, 134, 
-	134, 134, 134, 134, 31, 32, 33, 135, 
-	134, 134, 134, 134, 11, 134, 137, 134, 
-	8, 134, 134, 134, 134, 134, 134, 134, 
-	10, 11, 12, 13, 14, 134, 134, 134, 
-	134, 134, 134, 21, 22, 23, 134, 24, 
-	25, 26, 134, 134, 134, 134, 134, 31, 
-	32, 33, 135, 134, 134, 134, 134, 11, 
-	134, 137, 134, 8, 134, 134, 134, 134, 
-	134, 134, 134, 10, 11, 12, 13, 14, 
-	15, 16, 17, 134, 134, 134, 21, 22, 
-	23, 134, 24, 25, 26, 134, 134, 134, 
-	134, 134, 31, 32, 33, 135, 134, 134, 
-	134, 134, 11, 134, 5, 6, 134, 8, 
-	134, 134, 134, 134, 134, 134, 134, 10, 
-	11, 12, 13, 14, 15, 16, 17, 18, 
-	134, 20, 21, 22, 23, 134, 24, 25, 
-	26, 134, 134, 134, 134, 30, 31, 32, 
-	33, 30, 134, 134, 134, 134, 36, 134, 
-	5, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 8, 134, 5, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 8, 134, 134, 134, 
-	134, 134, 134, 134, 134, 11, 12, 13, 
-	14, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 24, 25, 26, 134, 134, 
-	134, 134, 134, 31, 32, 33, 135, 134, 
-	138, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 8, 134, 7, 8, 134, 1, 
-	134, 134, 134, 1, 134, 134, 134, 134, 
-	134, 5, 6, 7, 8, 134, 134, 134, 
-	134, 134, 134, 134, 10, 11, 12, 13, 
+	68, 68, 68, 70, 68, 68, 68, 68, 
+	68, 68, 68, 68, 108, 109, 110, 111, 
+	68, 68, 68, 68, 68, 68, 68, 68, 
+	68, 68, 120, 121, 122, 68, 68, 68, 
+	68, 68, 124, 125, 126, 129, 68, 8, 
+	9, 132, 11, 132, 132, 132, 132, 132, 
+	132, 132, 13, 14, 15, 16, 17, 18, 
+	19, 20, 21, 8, 22, 23, 24, 25, 
+	132, 26, 27, 28, 132, 132, 132, 132, 
+	32, 33, 34, 35, 32, 132, 132, 132, 
+	132, 37, 132, 8, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	11, 132, 132, 132, 132, 132, 132, 132, 
+	132, 14, 15, 16, 17, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 26, 
+	27, 28, 132, 132, 132, 132, 132, 33, 
+	34, 35, 133, 132, 132, 132, 132, 14, 
+	132, 11, 132, 132, 132, 132, 132, 132, 
+	132, 132, 14, 15, 16, 17, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	26, 27, 28, 132, 132, 132, 132, 132, 
+	33, 34, 35, 133, 132, 11, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 15, 
+	16, 17, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 33, 34, 35, 132, 
+	11, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 16, 17, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 33, 
+	34, 35, 132, 11, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 17, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 33, 34, 35, 132, 11, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 33, 34, 132, 
+	11, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	34, 132, 11, 132, 11, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 15, 16, 
+	17, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 26, 27, 28, 132, 132, 
+	132, 132, 132, 33, 34, 35, 133, 132, 
+	11, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 15, 16, 17, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	27, 28, 132, 132, 132, 132, 132, 33, 
+	34, 35, 133, 132, 11, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 15, 16, 
+	17, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 28, 132, 132, 
+	132, 132, 132, 33, 34, 35, 133, 132, 
+	134, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 11, 132, 11, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 15, 16, 17, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 33, 34, 
+	35, 133, 132, 11, 132, 132, 132, 132, 
+	132, 132, 132, 13, 14, 15, 16, 17, 
+	132, 132, 132, 132, 132, 132, 23, 24, 
+	25, 132, 26, 27, 28, 132, 132, 132, 
+	132, 132, 33, 34, 35, 133, 132, 132, 
+	132, 132, 14, 132, 11, 132, 132, 132, 
+	132, 132, 132, 132, 132, 14, 15, 16, 
+	17, 132, 132, 132, 132, 132, 132, 23, 
+	24, 25, 132, 26, 27, 28, 132, 132, 
+	132, 132, 132, 33, 34, 35, 133, 132, 
+	132, 132, 132, 14, 132, 11, 132, 132, 
+	132, 132, 132, 132, 132, 132, 14, 15, 
+	16, 17, 132, 132, 132, 132, 132, 132, 
+	132, 24, 25, 132, 26, 27, 28, 132, 
+	132, 132, 132, 132, 33, 34, 35, 133, 
+	132, 132, 132, 132, 14, 132, 11, 132, 
+	132, 132, 132, 132, 132, 132, 132, 14, 
+	15, 16, 17, 132, 132, 132, 132, 132, 
+	132, 132, 132, 25, 132, 26, 27, 28, 
+	132, 132, 132, 132, 132, 33, 34, 35, 
+	133, 132, 132, 132, 132, 14, 132, 135, 
+	132, 11, 132, 132, 132, 132, 132, 132, 
+	132, 13, 14, 15, 16, 17, 132, 19, 
+	20, 132, 132, 132, 23, 24, 25, 132, 
+	26, 27, 28, 132, 132, 132, 132, 132, 
+	33, 34, 35, 133, 132, 132, 132, 132, 
+	14, 132, 11, 132, 132, 132, 132, 132, 
+	132, 132, 132, 14, 15, 16, 17, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 26, 27, 28, 132, 132, 132, 132, 
+	132, 33, 34, 35, 133, 132, 132, 132, 
+	132, 14, 132, 135, 132, 11, 132, 132, 
+	132, 132, 132, 132, 132, 13, 14, 15, 
+	16, 17, 132, 132, 20, 132, 132, 132, 
+	23, 24, 25, 132, 26, 27, 28, 132, 
+	132, 132, 132, 132, 33, 34, 35, 133, 
+	132, 132, 132, 132, 14, 132, 135, 132, 
+	11, 132, 132, 132, 132, 132, 132, 132, 
+	13, 14, 15, 16, 17, 132, 132, 132, 
+	132, 132, 132, 23, 24, 25, 132, 26, 
+	27, 28, 132, 132, 132, 132, 132, 33, 
+	34, 35, 133, 132, 132, 132, 132, 14, 
+	132, 135, 132, 11, 132, 132, 132, 132, 
+	132, 132, 132, 13, 14, 15, 16, 17, 
+	18, 19, 20, 132, 132, 132, 23, 24, 
+	25, 132, 26, 27, 28, 132, 132, 132, 
+	132, 132, 33, 34, 35, 133, 132, 132, 
+	132, 132, 14, 132, 8, 9, 132, 11, 
+	132, 132, 132, 132, 132, 132, 132, 13, 
 	14, 15, 16, 17, 18, 19, 20, 21, 
-	22, 23, 134, 24, 25, 26, 134, 27, 
-	28, 134, 30, 31, 32, 33, 30, 134, 
-	134, 134, 134, 36, 134, 5, 6, 134, 
-	8, 134, 134, 134, 134, 134, 134, 134, 
-	10, 11, 12, 13, 14, 15, 16, 17, 
-	18, 19, 20, 21, 22, 23, 134, 24, 
-	25, 26, 134, 134, 134, 134, 30, 31, 
-	32, 33, 30, 134, 134, 134, 134, 36, 
-	134, 8, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 27, 28, 134, 8, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 134, 134, 134, 134, 134, 
-	134, 134, 134, 28, 134, 1, 139, 139, 
-	139, 1, 139, 141, 140, 140, 140, 140, 
-	140, 140, 140, 140, 140, 140, 140, 140, 
-	140, 140, 140, 140, 140, 140, 140, 140, 
-	140, 140, 140, 140, 140, 140, 140, 140, 
-	140, 140, 140, 140, 140, 140, 140, 142, 
-	140, 34, 140, 141, 140, 140, 140, 140, 
-	140, 140, 140, 140, 140, 140, 140, 140, 
-	140, 140, 140, 140, 140, 140, 140, 140, 
-	140, 140, 140, 140, 140, 140, 140, 140, 
-	140, 140, 140, 140, 140, 140, 34, 142, 
-	140, 142, 140, 141, 140, 140, 140, 140, 
-	140, 140, 140, 140, 140, 140, 140, 140, 
-	140, 140, 140, 140, 140, 140, 140, 140, 
-	140, 140, 140, 140, 140, 140, 140, 140, 
-	140, 140, 140, 140, 140, 140, 34, 140, 
-	35, 140, 0
+	132, 22, 23, 24, 25, 132, 26, 27, 
+	28, 132, 132, 132, 132, 32, 33, 34, 
+	35, 32, 132, 132, 132, 132, 37, 132, 
+	8, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 11, 132, 8, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 11, 132, 132, 132, 
+	132, 132, 132, 132, 132, 14, 15, 16, 
+	17, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 26, 27, 28, 132, 132, 
+	132, 132, 132, 33, 34, 35, 133, 132, 
+	136, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 11, 132, 10, 11, 132, 4, 
+	132, 132, 132, 4, 132, 132, 132, 132, 
+	132, 8, 9, 10, 11, 132, 132, 132, 
+	132, 132, 132, 132, 13, 14, 15, 16, 
+	17, 18, 19, 20, 21, 8, 22, 23, 
+	24, 25, 132, 26, 27, 28, 132, 29, 
+	30, 132, 32, 33, 34, 35, 32, 132, 
+	132, 132, 132, 37, 132, 11, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	29, 30, 132, 11, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 132, 
+	132, 132, 132, 132, 132, 132, 132, 30, 
+	132, 4, 137, 137, 137, 4, 137, 139, 
+	138, 138, 138, 138, 138, 138, 138, 138, 
+	138, 138, 138, 138, 138, 138, 138, 138, 
+	138, 138, 138, 138, 138, 138, 138, 138, 
+	138, 138, 138, 138, 138, 138, 138, 138, 
+	138, 138, 138, 140, 138, 141, 138, 141, 
+	142, 138, 139, 138, 138, 138, 138, 138, 
+	138, 138, 138, 138, 138, 138, 138, 138, 
+	138, 138, 138, 138, 138, 138, 138, 138, 
+	138, 138, 138, 138, 138, 138, 138, 138, 
+	138, 138, 138, 138, 138, 1, 140, 140, 
+	138, 139, 138, 138, 138, 138, 138, 138, 
+	138, 138, 138, 138, 138, 138, 138, 138, 
+	138, 138, 138, 138, 138, 138, 138, 138, 
+	138, 138, 138, 138, 138, 138, 138, 138, 
+	138, 138, 138, 138, 138, 140, 138, 141, 
+	138, 139, 138, 138, 138, 138, 138, 138, 
+	138, 138, 138, 138, 138, 138, 138, 138, 
+	138, 138, 138, 138, 138, 138, 138, 138, 
+	138, 138, 138, 138, 138, 138, 138, 138, 
+	138, 138, 138, 138, 138, 140, 138, 141, 
+	138, 141, 138, 39, 40, 38, 41, 38, 
+	38, 38, 38, 38, 38, 38, 42, 43, 
+	44, 45, 46, 47, 48, 49, 50, 39, 
+	51, 52, 53, 54, 38, 55, 56, 57, 
+	38, 58, 59, 38, 60, 61, 62, 63, 
+	60, 1, 38, 2, 38, 64, 38, 0
 };
 
 static const char _use_syllable_machine_trans_targs[] = {
-	1, 31, 0, 59, 61, 90, 91, 116, 
-	0, 118, 104, 92, 93, 94, 95, 108, 
-	110, 111, 112, 119, 113, 105, 106, 107, 
-	99, 100, 101, 120, 121, 122, 114, 96, 
-	97, 98, 123, 125, 115, 0, 2, 3, 
-	0, 16, 4, 5, 6, 7, 20, 22, 
-	23, 24, 28, 25, 17, 18, 19, 11, 
-	12, 13, 29, 30, 26, 8, 9, 10, 
-	27, 14, 15, 21, 0, 32, 33, 0, 
-	46, 34, 35, 36, 37, 50, 52, 53, 
-	54, 55, 47, 48, 49, 41, 42, 43, 
-	56, 38, 39, 40, 57, 58, 44, 0, 
-	45, 0, 51, 0, 0, 0, 60, 0, 
-	0, 0, 62, 63, 76, 64, 65, 66, 
-	67, 80, 82, 83, 84, 89, 85, 77, 
-	78, 79, 71, 72, 73, 86, 68, 69, 
-	70, 87, 88, 74, 75, 81, 0, 102, 
-	103, 109, 117, 0, 0, 0, 124
+	1, 120, 0, 2, 31, 1, 58, 60, 
+	88, 89, 114, 1, 116, 102, 90, 91, 
+	92, 93, 106, 108, 109, 110, 111, 103, 
+	104, 105, 97, 98, 99, 117, 118, 119, 
+	112, 94, 95, 96, 124, 113, 1, 3, 
+	4, 1, 17, 5, 6, 7, 8, 21, 
+	23, 24, 25, 26, 18, 19, 20, 12, 
+	13, 14, 29, 30, 27, 9, 10, 11, 
+	28, 15, 16, 22, 1, 32, 1, 45, 
+	33, 34, 35, 36, 49, 51, 52, 53, 
+	54, 46, 47, 48, 40, 41, 42, 55, 
+	37, 38, 39, 56, 57, 43, 1, 44, 
+	1, 50, 1, 1, 1, 59, 1, 1, 
+	1, 61, 62, 75, 63, 64, 65, 66, 
+	79, 81, 82, 83, 84, 76, 77, 78, 
+	70, 71, 72, 85, 67, 68, 69, 86, 
+	87, 73, 74, 80, 1, 100, 101, 107, 
+	115, 1, 1, 1, 121, 122, 123
 };
 
 static const char _use_syllable_machine_trans_actions[] = {
-	0, 0, 3, 0, 0, 0, 0, 0, 
-	4, 0, 0, 0, 0, 0, 0, 0, 
+	1, 0, 0, 0, 0, 4, 0, 0, 
+	0, 0, 0, 5, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 5, 0, 0, 
-	6, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 6, 0, 7, 0, 
+	0, 8, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 7, 0, 0, 8, 
+	0, 0, 0, 0, 9, 0, 10, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 9, 
-	0, 10, 0, 11, 12, 13, 0, 14, 
-	15, 16, 0, 0, 0, 0, 0, 0, 
+	0, 0, 0, 0, 0, 0, 11, 0, 
+	12, 0, 13, 14, 15, 0, 16, 17, 
+	18, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 17, 0, 
-	0, 0, 0, 18, 19, 20, 0
+	0, 0, 0, 0, 19, 0, 0, 0, 
+	0, 20, 21, 22, 0, 0, 0
 };
 
 static const char _use_syllable_machine_to_state_actions[] = {
-	1, 0, 0, 0, 0, 0, 0, 0, 
+	0, 2, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
@@ -778,11 +769,11 @@ static const char _use_syllable_machine_
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0
+	0, 0, 0, 0, 0
 };
 
 static const char _use_syllable_machine_from_state_actions[] = {
-	2, 0, 0, 0, 0, 0, 0, 0, 
+	0, 3, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
@@ -797,40 +788,40 @@ static const char _use_syllable_machine_
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0
+	0, 0, 0, 0, 0
 };
 
 static const short _use_syllable_machine_eof_trans[] = {
-	0, 38, 38, 38, 38, 38, 38, 38, 
-	38, 38, 38, 38, 38, 38, 38, 38, 
-	38, 38, 38, 38, 38, 38, 38, 38, 
-	38, 38, 38, 38, 38, 38, 38, 69, 
+	1, 0, 39, 39, 39, 39, 39, 39, 
+	39, 39, 39, 39, 39, 39, 39, 39, 
+	39, 39, 39, 39, 39, 39, 39, 39, 
+	39, 39, 39, 39, 39, 39, 39, 69, 
 	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 69, 69, 96, 69, 69, 69, 
+	69, 69, 69, 95, 69, 69, 69, 69, 
+	69, 69, 69, 69, 69, 69, 69, 99, 
+	95, 69, 101, 104, 69, 69, 69, 69, 
 	69, 69, 69, 69, 69, 69, 69, 69, 
-	100, 96, 69, 102, 105, 69, 69, 69, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 96, 69, 69, 69, 69, 69, 
-	69, 69, 69, 69, 69, 69, 100, 96, 
-	69, 69, 135, 135, 135, 135, 135, 135, 
-	135, 135, 135, 135, 135, 135, 135, 135, 
-	135, 135, 135, 135, 135, 135, 135, 135, 
-	135, 135, 135, 135, 135, 135, 135, 135, 
-	135, 135, 140, 141, 141, 141
+	69, 95, 69, 69, 69, 69, 69, 69, 
+	69, 69, 69, 69, 69, 99, 95, 69, 
+	133, 133, 133, 133, 133, 133, 133, 133, 
+	133, 133, 133, 133, 133, 133, 133, 133, 
+	133, 133, 133, 133, 133, 133, 133, 133, 
+	133, 133, 133, 133, 133, 133, 133, 138, 
+	139, 139, 139, 139, 39
 };
 
-static const int use_syllable_machine_start = 0;
-static const int use_syllable_machine_first_final = 0;
+static const int use_syllable_machine_start = 1;
+static const int use_syllable_machine_first_final = 1;
 static const int use_syllable_machine_error = -1;
 
-static const int use_syllable_machine_en_main = 0;
+static const int use_syllable_machine_en_main = 1;
 
 
 #line 58 "hb-ot-shaper-use-machine.rl"
 
 
 
-#line 182 "hb-ot-shaper-use-machine.rl"
+#line 184 "hb-ot-shaper-use-machine.rl"
 
 
 #define found_syllable(syllable_type) \
@@ -929,7 +920,7 @@ find_syllables_use (hb_buffer_t *buffer)
   unsigned int act HB_UNUSED;
   int cs;
   
-#line 922 "hb-ot-shaper-use-machine.hh"
+#line 924 "hb-ot-shaper-use-machine.hh"
 	{
 	cs = use_syllable_machine_start;
 	ts = 0;
@@ -937,12 +928,12 @@ find_syllables_use (hb_buffer_t *buffer)
 	act = 0;
 	}
 
-#line 282 "hb-ot-shaper-use-machine.rl"
+#line 284 "hb-ot-shaper-use-machine.rl"
 
 
   unsigned int syllable_serial = 1;
   
-#line 931 "hb-ot-shaper-use-machine.hh"
+#line 937 "hb-ot-shaper-use-machine.hh"
 	{
 	int _slen;
 	int _trans;
@@ -952,11 +943,11 @@ find_syllables_use (hb_buffer_t *buffer)
 		goto _test_eof;
 _resume:
 	switch ( _use_syllable_machine_from_state_actions[cs] ) {
-	case 2:
+	case 3:
 #line 1 "NONE"
 	{ts = p;}
 	break;
-#line 943 "hb-ot-shaper-use-machine.hh"
+#line 951 "hb-ot-shaper-use-machine.hh"
 	}
 
 	_keys = _use_syllable_machine_trans_keys + (cs<<1);
@@ -974,88 +965,96 @@ _eof_trans:
 		goto _again;
 
 	switch ( _use_syllable_machine_trans_actions[_trans] ) {
-	case 12:
-#line 170 "hb-ot-shaper-use-machine.rl"
+	case 6:
+#line 1 "NONE"
+	{te = p+1;}
+	break;
+	case 14:
+#line 172 "hb-ot-shaper-use-machine.rl"
 	{te = p+1;{ found_syllable (use_virama_terminated_cluster); }}
 	break;
-	case 10:
-#line 171 "hb-ot-shaper-use-machine.rl"
+	case 12:
+#line 173 "hb-ot-shaper-use-machine.rl"
 	{te = p+1;{ found_syllable (use_sakot_terminated_cluster); }}
 	break;
-	case 8:
-#line 172 "hb-ot-shaper-use-machine.rl"
+	case 10:
+#line 174 "hb-ot-shaper-use-machine.rl"
 	{te = p+1;{ found_syllable (use_standard_cluster); }}
 	break;
-	case 16:
-#line 173 "hb-ot-shaper-use-machine.rl"
+	case 18:
+#line 175 "hb-ot-shaper-use-machine.rl"
 	{te = p+1;{ found_syllable (use_number_joiner_terminated_cluster); }}
 	break;
-	case 14:
-#line 174 "hb-ot-shaper-use-machine.rl"
+	case 16:
+#line 176 "hb-ot-shaper-use-machine.rl"
 	{te = p+1;{ found_syllable (use_numeral_cluster); }}
 	break;
-	case 6:
-#line 175 "hb-ot-shaper-use-machine.rl"
+	case 8:
+#line 177 "hb-ot-shaper-use-machine.rl"
 	{te = p+1;{ found_syllable (use_symbol_cluster); }}
 	break;
-	case 20:
-#line 176 "hb-ot-shaper-use-machine.rl"
+	case 22:
+#line 178 "hb-ot-shaper-use-machine.rl"
 	{te = p+1;{ found_syllable (use_hieroglyph_cluster); }}
 	break;
-	case 4:
-#line 177 "hb-ot-shaper-use-machine.rl"
+	case 5:
+#line 179 "hb-ot-shaper-use-machine.rl"
 	{te = p+1;{ found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }}
 	break;
-	case 3:
-#line 178 "hb-ot-shaper-use-machine.rl"
+	case 4:
+#line 180 "hb-ot-shaper-use-machine.rl"
 	{te = p+1;{ found_syllable (use_non_cluster); }}
 	break;
-	case 11:
-#line 170 "hb-ot-shaper-use-machine.rl"
+	case 13:
+#line 172 "hb-ot-shaper-use-machine.rl"
 	{te = p;p--;{ found_syllable (use_virama_terminated_cluster); }}
 	break;
-	case 9:
-#line 171 "hb-ot-shaper-use-machine.rl"
+	case 11:
+#line 173 "hb-ot-shaper-use-machine.rl"
 	{te = p;p--;{ found_syllable (use_sakot_terminated_cluster); }}
 	break;
-	case 7:
-#line 172 "hb-ot-shaper-use-machine.rl"
+	case 9:
+#line 174 "hb-ot-shaper-use-machine.rl"
 	{te = p;p--;{ found_syllable (use_standard_cluster); }}
 	break;
-	case 15:
-#line 173 "hb-ot-shaper-use-machine.rl"
+	case 17:
+#line 175 "hb-ot-shaper-use-machine.rl"
 	{te = p;p--;{ found_syllable (use_number_joiner_terminated_cluster); }}
 	break;
-	case 13:
-#line 174 "hb-ot-shaper-use-machine.rl"
+	case 15:
+#line 176 "hb-ot-shaper-use-machine.rl"
 	{te = p;p--;{ found_syllable (use_numeral_cluster); }}
 	break;
-	case 5:
-#line 175 "hb-ot-shaper-use-machine.rl"
+	case 7:
+#line 177 "hb-ot-shaper-use-machine.rl"
 	{te = p;p--;{ found_syllable (use_symbol_cluster); }}
 	break;
-	case 19:
-#line 176 "hb-ot-shaper-use-machine.rl"
+	case 21:
+#line 178 "hb-ot-shaper-use-machine.rl"
 	{te = p;p--;{ found_syllable (use_hieroglyph_cluster); }}
 	break;
-	case 17:
-#line 177 "hb-ot-shaper-use-machine.rl"
+	case 19:
+#line 179 "hb-ot-shaper-use-machine.rl"
 	{te = p;p--;{ found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }}
 	break;
-	case 18:
-#line 178 "hb-ot-shaper-use-machine.rl"
+	case 20:
+#line 180 "hb-ot-shaper-use-machine.rl"
 	{te = p;p--;{ found_syllable (use_non_cluster); }}
 	break;
-#line 1014 "hb-ot-shaper-use-machine.hh"
+	case 1:
+#line 177 "hb-ot-shaper-use-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (use_symbol_cluster); }}
+	break;
+#line 1049 "hb-ot-shaper-use-machine.hh"
 	}
 
 _again:
 	switch ( _use_syllable_machine_to_state_actions[cs] ) {
-	case 1:
+	case 2:
 #line 1 "NONE"
 	{ts = 0;}
 	break;
-#line 1021 "hb-ot-shaper-use-machine.hh"
+#line 1058 "hb-ot-shaper-use-machine.hh"
 	}
 
 	if ( ++p != pe )
@@ -1071,7 +1070,7 @@ _again:
 
 	}
 
-#line 287 "hb-ot-shaper-use-machine.rl"
+#line 289 "hb-ot-shaper-use-machine.rl"
 
 }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-use-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-use-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-use-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-use-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -6,18 +6,18 @@
  *
  * on files with these headers:
  *
- * # IndicSyllabicCategory-15.0.0.txt
- * # Date: 2022-05-26, 02:18:00 GMT [KW, RP]
- * # IndicPositionalCategory-15.0.0.txt
- * # Date: 2022-05-26, 02:18:00 GMT [KW, RP]
- * # ArabicShaping-15.0.0.txt
- * # Date: 2022-02-14, 18:50:00 GMT [KW, RP]
- * # DerivedCoreProperties-15.0.0.txt
- * # Date: 2022-08-05, 22:17:05 GMT
- * # Blocks-15.0.0.txt
- * # Date: 2022-01-28, 20:58:00 GMT [KW]
- * # Scripts-15.0.0.txt
- * # Date: 2022-04-26, 23:15:02 GMT
+ * # IndicSyllabicCategory-15.1.0.txt
+ * # Date: 2023-01-05
+ * # IndicPositionalCategory-15.1.0.txt
+ * # Date: 2023-01-05
+ * # ArabicShaping-15.1.0.txt
+ * # Date: 2023-01-05
+ * # DerivedCoreProperties-15.1.0.txt
+ * # Date: 2023-08-07, 15:21:24 GMT
+ * # Blocks-15.1.0.txt
+ * # Date: 2023-07-28, 15:47:20 GMT
+ * # Scripts-15.1.0.txt
+ * # Date: 2023-07-28, 16:01:07 GMT
  * # Override values For Indic_Syllabic_Category
  * # Not derivable
  * # Initial version based on Unicode 7.0 by Andrew Glass 2014-03-17
@@ -26,6 +26,7 @@
  * # Updated for Unicode 13.0 by Andrew Glass 2020-07-28
  * # Updated for Unicode 14.0 by Andrew Glass 2021-09-25
  * # Updated for Unicode 15.0 by Andrew Glass 2022-09-16
+ * # Updated for Unicode 15.1 by Andrew Glass 2023-09-14
  * # Override values For Indic_Positional_Category
  * # Not derivable
  * # Initial version based on Unicode 7.0 by Andrew Glass 2014-03-17
@@ -36,6 +37,7 @@
  * # Updated for Unicode 13.0 by Andrew Glass 2020-07-28
  * # Updated for Unicode 14.0 by Andrew Glass 2021-09-28
  * # Updated for Unicode 15.0 by Andrew Glass 2022-09-16
+ * # Updated for Unicode 15.1 by Andrew Glass 2023-09-14
  * UnicodeData.txt does not have a header.
  */
 
@@ -54,7 +56,9 @@
 #define G	USE(G)	/* HIEROGLYPH */
 #define GB	USE(GB)	/* BASE_OTHER */
 #define H	USE(H)	/* HALANT */
+#define HM	USE(HM)	/* HIEROGLYPH_MOD */
 #define HN	USE(HN)	/* HALANT_NUM */
+#define HR	USE(HR)	/* HIEROGLYPH_MIRROR */
 #define HVM	USE(HVM)	/* HALANT_OR_VOWEL_MODIFIER */
 #define IS	USE(IS)	/* INVISIBLE_STACKER */
 #define J	USE(J)	/* HIEROGLYPH_JOINER */
@@ -95,7 +99,7 @@
 #ifndef HB_OPTIMIZE_SIZE
 
 static const uint8_t
-hb_use_u8[3141] =
+hb_use_u8[3187] =
 {
      16,   50,   51,   51,   51,   52,   51,   83,  118,  131,   51,   57,   58,  179,  195,   61,
      51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,
@@ -109,244 +113,249 @@ hb_use_u8[3141] =
      18,   19,   20,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   21,
      22,   23,   24,   25,   26,   27,   28,   29,   30,   31,   32,    2,   33,    2,    2,    2,
       2,   34,   35,    2,    2,    2,    2,    2,    2,    2,    2,    2,   36,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   37,    2,    2,    2,    2,
+     37,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   38,    2,   39,    2,    2,
       2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
       2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
       2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      2,   38,   39,   40,   41,   42,   43,    2,   44,    2,    2,    2,    2,    2,    2,    2,
+      2,   40,   41,   42,   43,   44,   45,    2,   46,    2,    2,    2,    2,    2,    2,    2,
       2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   45,   46,    2,
-     47,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   48,   49,    2,    2,    2,
-      2,    2,    2,    2,    2,   50,   51,    2,   52,    2,    2,   53,    2,    2,   54,   55,
-     56,   57,   58,   59,   60,   61,   62,   63,    2,   64,   65,    2,   66,   67,   68,   69,
-      2,   70,    2,   71,   72,   73,   74,    2,    2,   75,   76,   77,   78,    2,   79,   80,
-      2,   81,   81,   81,   81,   81,   81,   81,   81,   82,    2,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   47,   48,    2,
+     49,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   50,   51,    2,    2,    2,
+      2,    2,    2,    2,    2,   52,   53,    2,   54,    2,    2,   55,    2,    2,   56,   57,
+     58,   59,   60,   61,   62,   63,   64,   65,    2,   66,   67,    2,   68,   69,   70,   71,
+      2,   72,    2,   73,   74,   75,   76,    2,    2,   77,   78,   79,   80,    2,   81,   82,
+      2,   83,   83,   83,   83,   83,   83,   83,   83,   84,    2,    2,    2,    2,    2,    2,
       2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
       2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,   83,   84,    2,    2,    2,    2,    2,    2,    2,   85,
-     86,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,    2,   81,   81,   81,   87,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    2,   85,   86,    2,    2,    2,    2,    2,    2,    2,   87,
+     88,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    2,    2,   89,   89,   89,   90,    2,    2,    2,    2,    2,
       2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,    2,    2,    2,   88,   89,    2,    2,    2,    2,    2,
-      2,    2,    2,   90,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    2,    2,    2,    2,   91,   92,    2,    2,    2,    2,    2,
+      2,    2,    2,   93,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
       2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,   91,    2,    2,   92,    2,    2,    2,   93,    2,    2,    2,    2,    2,
-      2,    2,    2,   94,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      2,   95,   95,   96,   97,   95,   95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-     95,   95,   95,   95,   95,   95,   95,   95,   95,   95,   95,   95,   95,   95,   95,   95,
-     95,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,
-      0,    2,    2,    2,    2,    2,    0,    0,    0,    3,    0,    0,    0,    0,    0,    4,
-      0,    0,    5,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,    0,    0,    6,    7,    0,    0,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,    8,    9,    9,    9,    9,    0,    0,    0,    7,   10,
-      0,    2,    2,    2,    2,   11,   12,    0,    0,    9,   13,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,   14,   15,   16,   17,   18,   19,   20,   14,   21,   22,
-     23,   10,   24,   25,   18,    2,    2,    2,    2,    2,   18,    0,    2,    2,    2,    2,
-      2,    0,    2,    2,    2,    2,    2,    2,    2,   26,   27,   28,    2,    2,    2,    7,
-     28,    7,   28,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    7,    2,    2,
-      2,    7,    7,    0,    2,    2,    0,   15,   16,   17,   18,   29,   30,   31,   30,   32,
-      0,    0,    0,    0,   33,    0,    0,    2,   28,    2,    0,    0,    0,    0,    0,    7,
-     34,   10,   13,   28,    2,    2,    7,    0,   28,    7,    2,   28,    7,    2,    0,   35,
-     16,   17,   29,    0,   25,   36,   25,   37,    0,   38,    0,    0,    0,   28,    2,    7,
-      7,    0,    0,    0,    2,    2,    2,    2,    2,   39,   40,   41,    0,    0,    0,    0,
-      0,   10,   13,   28,    2,    2,    2,    2,   28,    2,   28,    2,    2,    2,    2,    2,
-      2,    7,    2,   28,    2,    2,    0,   15,   16,   17,   18,   19,   25,   20,   33,   22,
-      0,    0,    0,    0,    0,   28,   39,   39,   42,   10,   27,   28,    2,    2,    2,    7,
-     28,    7,    2,   28,    2,    2,    0,   15,   43,    0,    0,   25,   20,    0,    0,    2,
-     28,   28,    0,    0,    0,    0,    0,    0,    0,    0,   44,   28,    2,    2,    7,    0,
-      2,    7,    2,    2,    0,   28,    7,    7,    2,    0,   28,    7,    0,    2,    7,    0,
-      2,    2,    2,    2,    2,    2,    0,    0,   21,   14,   45,    0,   46,   31,   46,   32,
-      0,    0,    0,    0,   33,    0,    0,    0,    0,   13,   27,   47,    2,    2,    2,    7,
-      2,    7,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    0,   15,
-     20,   14,   21,   45,   20,   36,   20,   37,    0,    0,    0,   25,   29,    2,    7,    0,
-      0,    8,   27,   28,    2,    2,    2,    7,    2,    2,    2,   28,    2,    2,    0,   15,
-     43,    0,    0,   33,   45,    0,    0,    0,    7,   48,   49,    0,    0,    0,    0,    0,
-      0,    9,   27,    2,    2,    2,    2,    7,    2,    2,    2,    2,    2,    2,   50,   51,
-     21,   21,   17,   29,   46,   31,   46,   32,   52,    0,    0,    0,   33,    0,    0,    0,
-     28,   10,   27,   28,    2,    2,    2,    2,    2,    2,    2,    2,    7,    0,    2,    2,
-      2,    2,   28,    2,    2,    2,    2,   28,    0,    2,    2,    2,    7,    0,   53,    0,
-     33,   21,   20,   29,   29,   16,   46,   46,   23,    0,   21,    0,    0,    0,    0,    0,
-      0,    2,    0,    2,    7,    0,    0,    0,    0,    0,    0,    0,    0,   18,    0,    0,
-      0,    2,    2,   54,   54,   55,    0,    0,   16,    2,    2,    2,    2,   28,    2,    2,
-      2,    2,    2,    2,    2,    2,    2,    7,    0,   56,   19,   57,   20,   20,   18,   18,
-     44,   19,    9,   29,    9,    2,    2,   58,   59,   59,   59,   59,   59,   60,   59,   59,
-     59,   59,   59,   59,   59,   59,   59,   59,   59,   59,   59,   59,   59,   59,   59,   61,
-      0,    0,    0,    0,   62,    0,    0,    0,    0,    2,    2,    2,    2,    2,   63,   43,
-     57,   64,   20,   20,   65,   66,   67,   68,   69,    2,    2,    2,    2,    2,    1,    0,
-      3,    2,    2,    2,   21,   18,    2,    2,   70,   69,   71,   72,   63,   71,   27,   27,
-      2,   50,   20,   51,    2,    2,    2,    2,    2,    2,   73,   74,   75,   27,   27,   76,
-     77,    2,    2,    2,    2,    2,   27,   43,    0,    2,   57,   78,    0,    0,    0,    0,
-     28,    2,   57,   45,    0,    0,    0,    0,    0,    2,   57,    0,    0,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,    2,    7,    2,    7,   57,    0,    0,    0,    0,    0,
-      0,    2,    2,   79,   43,   20,   57,   18,   46,   46,   46,   46,   13,   80,   81,   82,
-     83,   84,   85,    0,    0,    0,    0,   86,    0,    7,    0,    0,   28,    0,   87,   79,
-     88,    2,    2,    2,    2,    7,    0,    0,    0,   40,   40,   89,   90,    2,    2,    2,
-      2,    2,    2,    2,    2,   11,    7,    0,    0,   91,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,    2,    2,    7,   20,   78,   43,   20,   92,   59,    0,
-      0,   93,   94,   93,   93,   95,   96,    0,    0,    2,    2,    2,    2,    2,    2,    2,
-      0,    2,    2,    7,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,    0,
-      0,    2,    2,    2,    2,   27,    0,    0,    0,    2,    2,    2,    2,    2,    7,    0,
-      0,    2,    2,    2,   50,   97,   43,    0,    0,    2,    2,   98,   99,  100,  101,   59,
-     61,  102,   14,   43,   20,   57,   19,   78,   46,   46,   74,    9,    9,    9,  103,   44,
-     38,    9,  104,   72,    2,    2,    2,    2,    2,    2,    2,  105,   20,   18,   18,   20,
-     46,   46,   20,  106,    2,    2,    2,    7,    0,    0,    0,    0,    0,    0,  107,  108,
-    109,  109,  109,    0,    0,    0,    0,    0,    0,  104,   72,    2,    2,    2,    2,    2,
-      2,   58,   59,   57,   23,   20,  110,   59,    2,    2,    2,    2,  105,   20,   21,   43,
-     43,  100,   12,    0,    0,    0,    0,    0,    0,    2,    2,   59,   16,   46,   21,  111,
-    100,  100,  100,  112,  113,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,   28,
-      2,    9,   44,  114,  114,  114,    9,  114,  114,   13,  114,  114,  114,   24,    0,   38,
-      0,    0,    0,  115,   49,    9,    3,    0,    0,    0,    0,    0,    0,    0,  116,    0,
-      0,    0,    0,    0,    0,    0,    4,  117,  118,   40,   40,    3,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,  118,  118,  119,  118,  118,  118,  118,  118,  118,  118,
-    118,    0,    0,  120,    0,    0,    0,    0,    0,    0,    5,  120,    0,    0,    0,    0,
-      0,   44,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    7,
-      0,    2,    2,    2,    2,    0,    0,    0,   28,    0,    0,    0,    0,    0,    0,    0,
-    121,    2,   51,    2,  106,    2,    8,    2,    2,    2,   63,   17,   14,    0,    0,   29,
-      0,    2,    2,    0,    0,    0,    0,    0,    0,   27,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,  122,   21,   21,   21,   21,   21,   21,   21,  123,    0,    0,    0,    0,
-      0,    9,    9,    9,    9,    9,    9,    9,    9,    9,    2,    0,    0,    0,    0,    0,
-     50,    2,    2,    2,   20,   20,  124,  114,    0,    2,    2,    2,  125,   18,   57,   18,
-    111,  100,  126,    0,    0,    0,    0,    0,    0,    9,  127,    2,    2,    2,    2,    2,
-      2,    2,  128,   21,   20,   18,   46,  129,  130,  131,    0,    0,    0,    0,    0,    0,
-      0,    2,    2,   50,   28,    2,    2,    2,    2,    2,    2,    2,    2,    8,   20,   57,
-     97,   74,  132,  133,  134,    0,    0,    0,    0,    2,  135,    2,    2,    2,    2,  136,
-      0,   28,    2,   40,    3,    0,   77,   13,    2,   51,   20,  137,   50,   51,    2,    2,
-    103,    8,    7,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,  138,   19,
-     23,    0,    0,  139,  140,    0,    0,    0,    0,    2,   63,   43,   21,   78,   45,  141,
-      0,   79,   79,   79,   79,   79,   79,   79,   79,    0,    0,    0,    0,    0,    0,    0,
-      4,  118,  118,  118,  118,  119,    0,    0,    0,    2,    2,    2,    2,    2,    7,    2,
-      2,    2,    7,    2,   28,    2,    2,    2,    2,    2,   28,    2,    2,    2,   28,    7,
-      0,  125,   18,   25,   29,    0,    0,  142,  143,    2,    2,   28,    2,   28,    2,    2,
-      2,    2,    2,    2,    0,   12,   35,    0,  144,    2,    2,   11,   35,    0,   28,    2,
-      2,    2,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,   28,    2,    2,
-      7,    2,    2,    9,   39,    0,    0,    0,    0,    2,    2,    2,    2,    2,   25,   36,
-      0,    2,    2,    2,  114,  114,  114,  114,  114,  145,    2,    7,    0,    0,    0,    0,
-      0,    2,   12,   12,    0,    0,    0,    0,    0,    7,    2,    2,    7,    2,    2,    2,
-      2,   28,    2,    7,    0,   28,    2,    0,    0,  146,  147,  148,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,   20,   20,   18,   18,   18,   20,   20,  131,    0,    0,    0,
-      0,    0,  149,  149,  149,  149,  149,  149,  149,  149,  149,  149,    2,    2,    2,    2,
-      2,   51,   50,   51,    0,    0,    0,    0,  150,    9,   72,    2,    2,    2,    2,    2,
-      2,   16,   17,   19,   14,   22,   35,    0,    0,    0,   29,    0,    0,    0,    0,    0,
-      0,    9,   47,    2,    2,    2,    2,    2,    2,    2,    2,    2,  125,   18,   20,  151,
-     20,   19,  152,  153,    2,    2,    2,    2,    2,    0,    0,   63,  154,    0,    0,    0,
-      0,    2,   11,    0,    0,    0,    0,    0,    0,    2,   63,   23,   18,   18,   18,   20,
-     20,  106,  155,    0,    0,   54,  156,   29,  157,   28,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,    2,   21,   17,   20,   20,  158,   42,    0,    0,    0,
-     47,  125,    0,    0,    0,    0,    0,    0,    0,    2,    2,    2,    7,    7,    2,    2,
-     28,    2,    2,    2,    2,    2,    2,    2,   28,    2,    2,    2,    2,    2,    2,    2,
-      8,   16,   17,   19,   20,  159,   29,    0,    0,    9,    9,   28,    2,    2,    2,    7,
-     28,    7,    2,   28,    2,    2,   56,   15,   21,   14,   21,   45,   30,   31,   30,   32,
-      0,    0,    0,    0,   33,    0,    0,    0,    2,    2,   21,    0,    9,    9,    9,   44,
-      0,    9,    9,   44,    0,    0,    0,    0,    0,    2,    2,   63,   23,   18,   18,   18,
-     20,   21,  123,   13,   15,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,    0,
-    160,  161,    0,    0,    0,    0,    0,    0,    0,   16,   17,   18,   18,   64,   97,   23,
-    157,    9,  162,    7,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,    2,
-     63,   23,   18,   18,    0,   46,   46,    9,  163,   35,    0,    0,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    2,    2,   18,    0,   21,   17,   18,   18,   19,   14,   80,
-    163,   36,    0,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    8,  164,
-     23,   18,   20,   20,  162,    7,    0,    0,    0,    2,    2,    2,    2,    2,    7,   41,
-    133,   21,   20,   18,   74,   19,   20,    0,    0,    2,    2,    2,    7,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,    2,   16,   17,   18,   19,   20,  103,  163,   35,    0,
-      0,    2,    2,    2,    7,   28,    0,    2,    2,    2,    2,   28,    7,    2,    2,    2,
-      2,   21,   21,   16,   30,   31,   10,  165,  166,  167,  168,    0,    0,    0,    0,    0,
-      0,    2,    2,    2,    2,    0,    2,    2,    2,   63,   23,   18,   18,    0,   20,   21,
-     27,  106,    0,   31,    0,    0,    0,    0,    0,   50,   18,   20,   20,   20,  137,    2,
-      2,    2,  169,  170,    9,   13,  171,   70,  172,    0,    0,    1,  144,    0,    0,    0,
-      0,   50,   18,   20,   14,   17,   18,    2,    2,    2,    2,  155,  155,  155,  173,  173,
-    173,  173,  173,  173,   13,  174,    0,   28,    0,   20,   18,   18,   29,   20,   20,    9,
-    163,    0,   59,   59,   59,   59,   59,   59,   59,   64,   19,   80,   44,    0,    0,    0,
-      0,    2,    2,    2,    7,    2,   28,    2,    2,   50,   20,   20,   29,    0,   36,   20,
-     25,    9,  156,  175,  171,    0,    0,    0,    0,    2,    2,    2,   28,    7,    2,    2,
-      2,    2,    2,    2,    2,    2,   21,   21,   45,   20,   33,   80,   66,    0,    0,    0,
-      0,    2,  176,   64,   45,    0,    0,    0,    0,    9,  177,    2,    2,    2,    2,    2,
-      2,    2,    2,   21,   20,   18,   29,    0,   46,   14,  140,    0,    0,    0,    0,    0,
-      0,  178,  178,  178,  106,  179,  178,    0,    0,  145,    2,    2,  180,  114,  114,  114,
-    114,  114,  114,  114,    0,    0,    0,    0,    0,    9,    9,    9,   44,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,    7,    0,   56,  181,   18,   18,   18,   18,   18,   18,
-     18,   18,   18,   18,   18,   18,   18,   18,   18,   18,   18,   18,   18,    0,    0,    0,
-     38,  114,   24,    0,    0,    0,    0,    0,    0,    0,    0,    7,    0,    0,    0,    0,
-      0,    2,    2,    2,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,   56,
-     35,    0,    4,  118,  118,  118,  119,    0,    0,    9,    9,    9,   47,    2,    2,    2,
+      2,    2,    2,   94,    2,    2,   95,    2,    2,    2,   96,    2,    2,    2,    2,    2,
+      2,    2,    2,   97,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+      2,   98,   98,   99,  100,   98,   98,   98,   98,   98,   98,   98,   98,   98,   98,   98,
+     98,   98,   98,   98,   98,   98,   98,   98,   98,   98,   98,   98,   98,   98,   98,   98,
+     98,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,
+      0,    2,    2,    2,    2,    2,    0,    0,    0,    0,    0,    0,    0,    0,    3,    4,
+      0,    5,    0,    0,    0,    0,    0,    6,    0,    0,    7,    0,    0,    0,    0,    0,
+      0,    0,    0,    0,    1,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      8,    9,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    2,    2,
+      2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   10,   11,
+     11,   11,   11,    0,    0,    0,    9,   12,    0,    2,    2,    2,    2,   13,   14,    0,
+      0,   11,   15,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   16,   17,
+     18,   19,   20,   21,   22,   16,   23,   24,   25,   12,   26,   27,   20,    2,    2,    2,
+      2,    2,   20,    0,    2,    2,    2,    2,    2,    0,    2,    2,    2,    2,    2,    2,
+      2,   28,   29,   30,    2,    2,    2,    9,   30,    9,   30,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    9,    2,    2,    2,    9,    9,    0,    2,    2,    0,   17,
+     18,   19,   20,   31,   32,   33,   32,   34,    0,    0,    0,    0,   35,    0,    0,    2,
+     30,    2,    0,    0,    0,    0,    0,    9,   36,   12,   15,   30,    2,    2,    9,    0,
+     30,    9,    2,   30,    9,    2,    0,   37,   18,   19,   31,    0,   27,   38,   27,   39,
+      0,   40,    0,    0,    0,   30,    2,    9,    9,    0,    0,    0,    2,    2,    2,    2,
+      2,   41,   42,   43,    0,    0,    0,    0,    0,   12,   15,   30,    2,    2,    2,    2,
+     30,    2,   30,    2,    2,    2,    2,    2,    2,    9,    2,   30,    2,    2,    0,   17,
+     18,   19,   20,   21,   27,   22,   35,   24,    0,    0,    0,    0,    0,   30,   41,   41,
+     44,   12,   29,   30,    2,    2,    2,    9,   30,    9,    2,   30,    2,    2,    0,   17,
+     45,    0,    0,   27,   22,    0,    0,    2,   30,   30,    0,    0,    0,    0,    0,    0,
+      0,    0,   46,   30,    2,    2,    9,    0,    2,    9,    2,    2,    0,   30,    9,    9,
+      2,    0,   30,    9,    0,    2,    9,    0,    2,    2,    2,    2,    2,    2,    0,    0,
+     23,   16,   47,    0,   48,   33,   48,   34,    0,    0,    0,    0,   35,    0,    0,    0,
+      0,   15,   29,   49,    2,    2,    2,    9,    2,    9,    2,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    2,    0,   17,   22,   16,   23,   47,   22,   38,   22,   39,
+      0,    0,    0,   27,   31,    2,    9,    0,    0,   10,   29,   30,    2,    2,    2,    9,
+      2,    2,    2,   30,    2,    2,    0,   17,   45,    0,    0,   35,   47,    0,    0,    0,
+      9,   50,   51,    0,    0,    0,    0,    0,    0,   11,   29,    2,    2,    2,    2,    9,
+      2,    2,    2,    2,    2,    2,   52,   53,   23,   23,   19,   31,   48,   33,   48,   34,
+     54,    0,    0,    0,   35,    0,    0,    0,   30,   12,   29,   30,    2,    2,    2,    2,
+      2,    2,    2,    2,    9,    0,    2,    2,    2,    2,   30,    2,    2,    2,    2,   30,
+      0,    2,    2,    2,    9,    0,   55,    0,   35,   23,   22,   31,   31,   18,   48,   48,
+     25,    0,   23,    0,    0,    0,    0,    0,    0,    2,    0,    2,    9,    0,    0,    0,
+      0,    0,    0,    0,    0,   20,    0,    0,    0,    2,    2,   56,   56,   57,    0,    0,
+     18,    2,    2,    2,    2,   30,    2,    2,    2,    2,    2,    2,    2,    2,    2,    9,
+      0,   58,   21,   59,   22,   22,   20,   20,   46,   21,   11,   31,   11,    2,    2,   60,
+     61,   61,   61,   61,   61,   62,   61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
+     61,   61,   61,   61,   61,   61,   61,   63,    0,    0,    0,    0,   64,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,   65,   45,   59,   66,   22,   22,   67,   68,   69,   70,
+     71,    2,    2,    2,    2,    2,    1,    0,    5,    2,    2,    2,   23,   20,    2,    2,
+     72,   71,   73,   74,   65,   73,   29,   29,    2,   52,   22,   53,    2,    2,    2,    2,
+      2,    2,   75,   76,   77,   29,   29,   78,   79,    2,    2,    2,    2,    2,   29,   45,
+      0,    2,   59,   80,    0,    0,    0,    0,   30,    2,   59,   47,    0,    0,    0,    0,
+      0,    2,   59,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,    9,
+      2,    9,   59,    0,    0,    0,    0,    0,    0,    2,    2,   81,   45,   22,   59,   20,
+     48,   48,   48,   48,   15,   82,   83,   84,   85,   86,   87,    0,    0,    0,    0,   88,
+      0,    9,    0,    0,   30,    0,   89,   81,   90,    2,    2,    2,    2,    9,    0,    0,
+      0,   42,   42,   91,   92,    2,    2,    2,    2,    2,    2,    2,    2,   13,    9,    0,
+      0,   93,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+      9,   22,   80,   45,   22,   94,   61,    0,    0,   95,   96,   95,   95,   97,   98,    0,
+      0,    2,    2,    2,    2,    2,    2,    2,    0,    2,    2,    9,    0,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,    2,    0,    0,    2,    2,    2,    2,   29,    0,    0,
+      0,    2,    2,    2,    2,    2,    9,    0,    0,    2,    2,    2,   52,   99,   45,    0,
+      0,    2,    2,  100,  101,  102,  103,   61,   63,  104,   16,   45,   22,   59,   21,   80,
+     48,   48,   76,   11,   11,   11,  105,   46,   40,   11,  106,   74,    2,    2,    2,    2,
+      2,    2,    2,  107,   22,   20,   20,   22,   48,   48,   22,  108,    2,    2,    2,    9,
+      0,    0,    0,    0,    0,    0,  109,  110,  111,  111,  111,    0,    0,    0,    0,    0,
+      0,  106,   74,    2,    2,    2,    2,    2,    2,   60,   61,   59,   25,   22,  112,   61,
+      2,    2,    2,    2,  107,   22,   23,   45,   45,  102,   14,    0,    0,    0,    0,    0,
+      0,    2,    2,   61,   18,   48,   23,  113,  102,  102,  102,  114,  115,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,    0,   30,    2,   11,   46,  116,  116,  116,   11,  116,
+    116,   15,  116,  116,  116,   26,    0,   40,    0,    0,    0,  117,   51,   11,    5,    0,
+      0,    0,    0,    0,    0,    0,  118,    0,    0,    0,    0,    0,    0,    0,    6,  119,
+    120,   42,   42,    5,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  120,  120,
+    121,  120,  120,  120,  120,  120,  120,  120,  120,    0,    0,  122,    0,    0,    0,    0,
+      0,    0,    7,  122,    0,    0,    0,    0,    0,   46,    0,    0,    0,    0,    0,    0,
+      0,    0,    0,    0,    0,    0,    0,    9,    0,    0,    0,    0,  123,  123,    0,    0,
+      0,    2,    2,    2,    2,    0,    0,    0,   30,    0,    0,    0,    0,    0,    0,    0,
+    124,    0,  123,  123,    0,    0,    0,    0,    0,    2,   53,    2,  108,    2,   10,    2,
+      2,    2,   65,   19,   16,    0,    0,   31,    0,    2,    2,    0,    0,    0,    0,    0,
+      0,   29,    2,    2,    2,    2,    2,    2,    2,    2,    2,  125,   23,   23,   23,   23,
+     23,   23,   23,  126,    0,    0,    0,    0,    0,   11,   11,   11,   11,   11,   11,   11,
+     11,   11,    2,    0,    0,    0,    0,    0,   52,    2,    2,    2,   22,   22,  127,  116,
+      0,    2,    2,    2,  128,   20,   59,   20,  113,  102,  129,    0,    0,    0,    0,    0,
+      0,   11,  130,    2,    2,    2,    2,    2,    2,    2,  131,   23,   22,   20,   48,  132,
+    133,  134,    0,    0,    0,    0,    0,    0,    0,    2,    2,   52,   30,    2,    2,    2,
+      2,    2,    2,    2,    2,   10,   22,   59,   99,   76,  135,  136,  137,    0,    0,    0,
+      0,    2,  138,    2,    2,    2,    2,  139,    0,   30,    2,   42,    5,    0,   79,   15,
+      2,   53,   22,  140,   52,   53,    2,    2,  105,   10,    9,    0,    0,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,  141,   21,   25,    0,    0,  142,  143,    0,    0,    0,
+      0,    2,   65,   45,   23,   80,   47,  144,    0,   81,   81,   81,   81,   81,   81,   81,
+     81,    0,    0,    0,    0,    0,    0,    0,    6,  120,  120,  120,  120,  121,    0,    0,
+      0,    2,    2,    2,    2,    2,    9,    2,    2,    2,    9,    2,   30,    2,    2,    2,
+      2,    2,   30,    2,    2,    2,   30,    9,    0,  128,   20,   27,   31,    0,    0,  145,
+    146,    2,    2,   30,    2,   30,    2,    2,    2,    2,    2,    2,    0,   14,   37,    0,
+    147,    2,    2,   13,   37,    0,   30,    2,    2,    2,    0,    0,    0,    0,    0,    0,
+      0,    0,    0,    0,    0,   30,    2,    2,    9,    2,    2,   11,   41,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,   27,   38,    0,    2,    2,    2,  116,  116,  116,  116,
+    116,  148,    2,    9,    0,    0,    0,    0,    0,    2,   14,   14,    0,    0,    0,    0,
+      0,    9,    2,    2,    9,    2,    2,    2,    2,   30,    2,    9,    0,   30,    2,    0,
+      0,  149,  150,  151,    2,    2,    2,    2,    2,    2,    2,    2,    2,   22,   22,   20,
+     20,   20,   22,   22,  134,    0,    0,    0,    0,    0,  152,  152,  152,  152,  152,  152,
+    152,  152,  152,  152,    2,    2,    2,    2,    2,   53,   52,   53,    0,    0,    0,    0,
+    153,   11,   74,    2,    2,    2,    2,    2,    2,   18,   19,   21,   16,   24,   37,    0,
+      0,    0,   31,    0,    0,    0,    0,    0,    0,   11,   49,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,  128,   20,   22,  154,   22,   21,  155,  156,    2,    2,    2,    2,
+      2,    0,    0,   65,  157,    0,    0,    0,    0,    2,   13,    0,    0,    0,    0,    0,
+      0,    2,   65,   25,   20,   20,   20,   22,   22,  108,  158,    0,    0,   56,  159,   31,
+    160,   30,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   23,
+     19,   22,   22,  161,   44,    0,    0,    0,   49,  128,    0,    0,    0,    0,    0,    0,
+      0,    2,    2,    2,    9,    9,    2,    2,   30,    2,    2,    2,    2,    2,    2,    2,
+     30,    2,    2,    2,    2,    2,    2,    2,   10,   18,   19,   21,   22,  162,   31,    0,
+      0,   11,   11,   30,    2,    2,    2,    9,   30,    9,    2,   30,    2,    2,   58,   17,
+     23,   16,   23,   47,   32,   33,   32,   34,    0,    0,    0,    0,   35,    0,    0,    0,
+      2,    2,   23,    0,   11,   11,   11,   46,    0,   11,   11,   46,    0,    0,    0,    0,
+      0,    2,    2,   65,   25,   20,   20,   20,   22,   23,  126,   15,   17,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,    0,    0,  163,  164,    0,    0,    0,    0,    0,    0,
+      0,   18,   19,   20,   20,   66,   99,   25,  160,   11,  165,    9,    0,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,    2,    2,   65,   25,   20,   20,    0,   48,   48,   11,
+    166,   37,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    2,    2,   20,
+      0,   23,   19,   20,   20,   21,   16,   82,  166,   38,    0,    0,    0,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,   10,  167,   25,   20,   22,   22,  165,    9,    0,    0,
+      0,    2,    2,    2,    2,    2,    9,   43,  136,   23,   22,   20,   76,   21,   22,    0,
+      0,    2,    2,    2,    9,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,   18,
+     19,   20,   21,   22,  105,  166,   37,    0,    0,    2,    2,    2,    9,   30,    0,    2,
+      2,    2,    2,   30,    9,    2,    2,    2,    2,   23,   23,   18,   32,   33,   12,  168,
+    169,  170,  171,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    0,    2,    2,
+      2,   65,   25,   20,   20,    0,   22,   23,   29,  108,    0,   33,    0,    0,    0,    0,
+      0,   52,   20,   22,   22,   22,  140,    2,    2,    2,  172,  173,   11,   15,  174,   72,
+    175,    0,    0,    1,  147,    0,    0,    0,    0,   52,   20,   22,   16,   19,   20,    2,
+      2,    2,    2,  158,  158,  158,  176,  176,  176,  176,  176,  176,   15,  177,    0,   30,
+      0,   22,   20,   20,   31,   22,   22,   11,  166,    0,   61,   61,   61,   61,   61,   61,
+     61,   66,   21,   82,   46,    0,    0,    0,    0,    2,    2,    2,    9,    2,   30,    2,
+      2,   52,   22,   22,   31,    0,   38,   22,   27,   11,  159,  178,  174,    0,    0,    0,
+      0,    2,    2,    2,   30,    9,    2,    2,    2,    2,    2,    2,    2,    2,   23,   23,
+     47,   22,   35,   82,   68,    0,    0,    0,    0,    2,  179,   66,   47,    0,    0,    0,
+      0,   11,  180,    2,    2,    2,    2,    2,    2,    2,    2,   23,   22,   20,   31,    0,
+     48,   16,  143,    0,    0,    0,    0,    0,    0,  181,  181,  181,  181,  181,  181,  181,
+    181,  182,  182,  182,  183,  184,  182,  181,  181,  185,  181,  181,  186,  187,  187,  187,
+    187,  187,  187,  187,    0,    0,    0,    0,    0,   11,   11,   11,   46,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,    9,    0,   58,  188,   20,   20,   20,   20,   20,   20,
+     20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,    0,    0,    0,
+     40,  116,   26,    0,    0,    0,    0,    0,    0,    0,    0,    9,    0,    0,    0,    0,
+      0,    2,    2,    2,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,   58,
+     37,    0,    6,  120,  120,  120,  121,    0,    0,   11,   11,   11,   49,    2,    2,    2,
       0,    2,    2,    2,    2,    2,    0,    0,    2,    2,    2,    2,    2,    2,    2,    2,
-     44,    2,    2,    2,    2,    2,    2,    9,    9,    2,    2,    2,    2,    2,    2,   20,
-     20,    2,    2,   42,   42,   42,   90,    0,    0,    O,    O,    O,   GB,    B,    B,   GB,
-      O,    O,   WJ,FMPst,FMPst,    O,  CGJ,    B,    O,    B,VMAbv,VMAbv,VMAbv,    O,VMAbv,    B,
-  CMBlw,CMBlw,CMBlw,VMAbv,VMPst, VAbv, VPst,CMBlw,    B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw,
-   VAbv, VAbv, VAbv, VPst, VPst, VPst,    H, VPre, VPst,VMBlw,    O,    O, VAbv,   GB,VMAbv,VMPst,
-  VMPst,    O,    B, VBlw,    O,    O, VPre, VPre,    O, VPre,    H,    O, VPst,FMAbv,    O,CMBlw,
-      O, VAbv,    O, VAbv,    H,    O,VMBlw,VMAbv,CMAbv,   GB,   GB,    O, MBlw,CMAbv,CMAbv, VPst,
-   VAbv,VMAbv,    O, VPst,    O, VPre, VPre,VMAbv,    B,    O,   CS,   CS,VMPst,    B, VAbv, VAbv,
-      B,    R,    O,  HVM,    O,    O,FMBlw,    O,CMAbv,    O,CMBlw, VAbv, VBlw,    B,  SUB,  SUB,
-    SUB,    O,  SUB,  SUB,    O,FMBlw,    O,    B, VPst, VBlw, VPre,VMAbv,VMBlw,VMPst,   IS, VAbv,
-   MPst, MPre, MBlw, MBlw,    B, MBlw, MBlw, VPst,VMPst,VMPst,    B, MBlw, VPst, VPre, VAbv, VAbv,
-  VMPst,VMPst,VMBlw,    B,VMPst, VBlw, VPst,  CGJ,  CGJ, VPst,VMAbv,VMAbv,FMAbv, FAbv,CMAbv,FMAbv,
-  VMAbv,FMAbv, VAbv,   IS,FMAbv,    B,FMAbv,    B,  CGJ,   WJ,  CGJ,   GB,CMAbv,CMAbv,    B,   GB,
-      B, VAbv,  SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre,    B, MPre, MBlw,
-    SUB, FAbv, FAbv, MAbv,  SUB,   Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst,    H,    B,    O,
-  SMAbv,SMBlw,SMAbv,SMAbv,SMAbv, VPst,   IS, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv,
-     CS,    O,FMAbv, ZWNJ,  CGJ,   WJ,   WJ,   WJ,    O,FMPst,    O,    O,    H, MPst, VPst,    H,
-  VMAbv, VAbv,VMBlw,    B, VBlw, FPst, VPst, FAbv,VMPst,    B,CMAbv, VAbv, MBlw, MPst, MBlw,    H,
-      O, VBlw, MPst, MPre, MAbv, MBlw,    O,    B, FAbv, FAbv, FPst, VBlw,    B,    B, VPre,    O,
-  VMPst,   IS,    O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv,    O,   IS,VMBlw,    B,VMPst,VMAbv,VMPst,
-     CS,   CS,    B,    N,    N,    O,   HN, VPre, VBlw, VAbv,   IS,CMAbv,    O, VPst,    B,    R,
-      R,CMBlw, VAbv, VPre,VMAbv,VMAbv,    H, VAbv,CMBlw,FMAbv,    B,   CS,   CS,    H,CMBlw,VMPst,
-      H,VMPst, VAbv,VMAbv, VPst,   IS,    R, MPst,    R, MPst,CMBlw,    B,FMBlw, VBlw,VMAbv,    R,
-   MBlw, MBlw,   GB, FBlw, FBlw,CMAbv,   IS, VBlw,   IS,   GB, VAbv,    R,VMPst,    H,    H,    B,
-      H,    B,VMBlw,    O, VBlw,
+     46,    2,    2,    2,    2,    2,    2,   11,   11,    2,    2,    2,    2,    2,    2,   22,
+     22,    2,    2,   44,   44,   44,   92,    0,    0,    O,    O,    O,   GB,    B,    B,    O,
+     SB,    O,   SE,   GB,    O,    O,   WJ,FMPst,FMPst,    O,  CGJ,    B,    O,    B,VMAbv,VMAbv,
+  VMAbv,    O,VMAbv,    B,CMBlw,CMBlw,CMBlw,VMAbv,VMPst, VAbv, VPst,CMBlw,    B, VPst, VPre, VPst,
+   VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VPst, VPst, VPst,    H, VPre, VPst,VMBlw,    O,    O,
+   VAbv,   GB,VMAbv,VMPst,VMPst,    O,    B, VBlw,    O,    O, VPre, VPre,    O, VPre,    H,    O,
+   VPst,FMAbv,    O,CMBlw,    O, VAbv,    O, VAbv,    H,    O,VMBlw,VMAbv,CMAbv,   GB,   GB,    O,
+   MBlw,CMAbv,CMAbv, VPst, VAbv,VMAbv,    O, VPst,    O, VPre, VPre,VMAbv,    B,    O,   CS,   CS,
+  VMPst,    B, VAbv, VAbv,    B,    R,    O,  HVM,    O,    O,FMBlw,    O,CMAbv,    O,CMBlw, VAbv,
+   VBlw,    B,  SUB,  SUB,  SUB,    O,  SUB,  SUB,    O,FMBlw,    O,    B, VPst, VBlw, VPre,VMAbv,
+  VMBlw,VMPst,   IS, VAbv, MPst, MPre, MBlw, MBlw,    B, MBlw, MBlw, VPst,VMPst,VMPst,    B, MBlw,
+   VPst, VPre, VAbv, VAbv,VMPst,VMPst,VMBlw,    B,VMPst, VBlw, VPst,  CGJ,  CGJ, VPst,VMAbv,VMAbv,
+  FMAbv, FAbv,CMAbv,FMAbv,VMAbv,FMAbv, VAbv,   IS,FMAbv,    B,FMAbv,    B,  CGJ,   WJ,  CGJ,   GB,
+  CMAbv,CMAbv,    B,   GB,    B, VAbv,  SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv,
+   VPre,    B, MPre, MBlw,  SUB, FAbv, FAbv, MAbv,  SUB,   Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv,
+   VPst,    H,    B,    O,SMAbv,SMBlw,SMAbv,SMAbv,SMAbv, VPst,   IS, VBlw, FAbv,VMPre,VMPre,FMAbv,
+  CMBlw,VMBlw,VMBlw,VMAbv,   CS,    O,FMAbv, ZWNJ,  CGJ,   WJ,   WJ,   WJ,    O,FMPst,    O,   SB,
+     SE,    O,    H, MPst, VPst,    H,VMAbv, VAbv,VMBlw,    B, VBlw, FPst, VPst, FAbv,VMPst,    B,
+  CMAbv, VAbv, MBlw, MPst, MBlw,    H,    O, VBlw, MPst, MPre, MAbv, MBlw,    O,    B, FAbv, FAbv,
+   FPst, VBlw,    B,    B, VPre,    O,VMPst,   IS,    O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv,    O,
+     IS,VMBlw,    B,VMPst,VMAbv,VMPst,   CS,   CS,    B,    N,    N,    O,   HN, VPre, VBlw, VAbv,
+     IS,CMAbv,    O, VPst,    B,    R,    R,CMBlw, VAbv, VPre,VMAbv,VMAbv,    H, VAbv,CMBlw,FMAbv,
+      B,   CS,   CS,    H,CMBlw,VMPst,    H,VMPst, VAbv,VMAbv, VPst,   IS,    R, MPst,    R, MPst,
+  CMBlw,    B,FMBlw, VBlw,VMAbv,    R, MBlw, MBlw,   GB, FBlw, FBlw,CMAbv,   IS, VBlw,   IS,   GB,
+   VAbv,    R,VMPst,    G,    G,    J,    J,    J,   SB,   SE,    J,   HR,    G,    G,   HM,   HM,
+     HM,    O, VBlw,
 };
 static const uint16_t
-hb_use_u16[784] =
+hb_use_u16[808] =
 {
-    0,  0,  1,  2,  0,  0,  0,  0,  0,  0,  3,  4,  0,  5,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,  0,
-    0,  0,  0,  0,  7,  0,  0,  0,  0,  0,  0,  0,  8,  9, 10, 11,
-    0,  0,  0,  0,  9, 12,  0,  0, 13,  9,  9, 14, 15, 16, 17, 18,
-   19, 20, 21, 22, 23, 24, 17, 25, 26, 20, 21, 27, 28, 29, 30, 31,
-   32, 33, 21, 34, 35,  0, 17, 36, 37, 20, 21, 38, 23, 39, 17, 40,
-   41, 42, 43, 44, 45, 46, 30,  0, 47, 48, 21, 49, 50, 51, 17,  0,
-   52, 48, 21, 53, 50, 54, 17, 55, 56, 48,  9, 57, 58, 59, 17,  0,
-   60, 61,  9, 62, 63, 64, 30, 65, 66, 67,  9, 68, 69,  9, 70, 71,
-   72, 73, 74, 75, 76,  0,  0,  0,  9,  9, 77, 78, 79, 80, 81, 82,
-   83, 84,  0,  0,  0,  0,  0,  0,  9, 85,  9, 86,  9, 87, 88, 89,
-    9,  9,  9, 90, 91, 92,  2,  0, 93,  0,  9,  9,  9,  9,  9, 94,
-   95,  9, 96,  0,  0,  0,  0,  0, 97, 98, 99,100, 30,  9,101,102,
-    9,  9,103,  9,104,105,  0,  0,  9,106,  9,  9,  9,107,108,109,
-    2,  2,  0,  0,  0,  0,  0,  0,110,  9,  9,111,112,  2,113,114,
-  115,  9,116,  9,  9,  9,117,118,  9,  9,119,120,121,  0,  0,  0,
-    0,  0,  0,  0,  0,122,123,124,  0,  0,  0,  0,  0,  0,  0,125,
-  126,127,128,  0,  0,  0,129,130,131,  0,  0,  0,  0,  0,  0,132,
-    0,  0,  0,  0,133,  0,  0,  0,  0,  0,  0,  9,  9,  9,134,135,
-  136,  9,137,  0,  9,  9,  9,138,139,  9,  9,140,141,  2,142,143,
-    9,  9,144,  9,145,146,  0,  0,147,  9,  9,148,149,  2,150, 98,
-    9,  9,151,152,153,  2,  9,154,  9,  9,  9,155,156,  0,157,158,
-    0,  0,  0,  0,  9,  9,159,  2,160,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,161,  0,  0,  0,  0,  0,  0,  0,162,
-    0,  0,  0,  0,  0,  0,  0,163,163,164, 33,165,  0,  0,  0,  0,
-  166,167,  9,168, 94,  0,  0,  0,  0,  0,  0,  0, 69,  9,169,  0,
-    9,170,171,  0,  0,  0,  0,  0,  9,  9,172,  2,  0,  0,  0,  0,
-    9,  9,173,170,  0,  0,  0,  0,  0,  0,  0,  9,174,175,  0,  9,
-  176,  0,  0,177,178,  0,  0,  0,179,  9,  9,180,181,182,183,184,
-  185,  9,  9,186,187,  0,  0,  0,188,  9,189,190,191,  9,  9,192,
-  185,  9,  9,193,194,105,195,102,  9, 33,196,197,198,  0,  0,  0,
-  199,200, 94,  9,  9,201,202,  2,203, 20, 21,204,205,206,207,208,
-    9,  9,  9,209,210,211,212,  0,195,  9,  9,213,214,  2,  0,  0,
-    9,  9,215,216,217,218,  0,  0,  9,  9,  9,219,220,  2,  0,  0,
-    9,  9,221,222,  2,  0,  0,  0,  9,223,224,103,225,  0,  0,  0,
-    9,  9,226,227,  0,  0,  0,  0,228,229,  9,230,231,  2,  0,  0,
-    0,  0,232,  9,  9,233,234,  0,235,  9,  9,236,237,238,  9,  9,
-  239,240,  0,  0,  0,  0,  0,  0, 21,  9,215,241,  7,  9, 70, 18,
-    9,242, 73,243,  0,  0,  0,  0,244,  9,  9,245,246,  2,247,  9,
-  248,249,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,250,
-  251, 48,  9,252,253,  2,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,254,255,256,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,
-    9,  9,  9,257,  0,  0,  0,  0,  9,  9,  9,  9,258,259,260,260,
-  261,262,  0,  0,  0,  0,263,  0,  9,  9,  9,  9,  9,264,  0,  0,
-    9,  9,  9,  9,  9,  9,105, 70, 94,265,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,266,  9,  9, 70,267,268,  0,  0,  0,
-    0,  9,269,  0,  9,  9,270,  2,  0,  0,  0,  0,  0,  9,271,  2,
-    9,  9,  9,  9,272,  2,  0,  0,129,129,129,129,129,129,129,129,
-  160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,129,
+    0,  0,  1,  2,  0,  3,  0,  3,  0,  0,  4,  5,  0,  6,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  0,  0,  0,
+    0,  0,  0,  0,  8,  0,  0,  0,  0,  0,  0,  0,  9, 10, 11, 12,
+    0,  0,  0,  0, 10, 13,  0,  0, 14, 10, 10, 15, 16, 17, 18, 19,
+   20, 21, 22, 23, 24, 25, 18, 26, 27, 21, 22, 28, 29, 30, 31, 32,
+   33, 34, 22, 35, 36,  0, 18, 37, 38, 21, 22, 39, 24, 40, 18, 41,
+   42, 43, 44, 45, 46, 47, 31,  0, 48, 49, 22, 50, 51, 52, 18,  0,
+   53, 49, 22, 54, 51, 55, 18, 56, 57, 49, 10, 58, 59, 60, 18,  0,
+   61, 62, 10, 63, 64, 65, 31, 66, 67, 68, 10, 69, 70, 10, 71, 72,
+   73, 74, 75, 76, 77,  0,  0,  0, 10, 10, 78, 79, 80, 81, 82, 83,
+   84, 85,  0,  0,  0,  0,  0,  0, 10, 86, 10, 87, 10, 88, 89, 90,
+   10, 10, 10, 91, 92, 93,  2,  0, 94,  0, 10, 10, 10, 10, 10, 95,
+   96, 10, 97,  0,  0,  0,  0,  0, 98, 99,100,101, 31, 10,102,103,
+   10, 10,104, 10,105,106,  0,  0, 10,107, 10, 10, 10,108,109,110,
+    2,  2,  0,  0,  0,  0,  0,  0,111, 10, 10,112,113,  2,114,115,
+  116, 10,117, 10, 10, 10,118,119, 10, 10,120,121,122,  0,  0,  0,
+    0,  0,  0,  0,  0,123,124,125,  0,  0,  0,  0,  0,  0,  0,126,
+  127,128,129,  0,  0,  0,130,131,132,  0,  0,  0,  0,  0,  0,133,
+    0,  0,  0,  0,134,  0,  0,  0,  0,  0,  0,  0,  0,  0,135,  0,
+    0,  0,  0, 10, 10, 10,136,137,  0,  0,138,  0,  0,  0,  0,  0,
+  139, 10,140,  0, 10, 10, 10,141,142, 10, 10,143,144,  2,145,146,
+   10, 10,147, 10,148,149,  0,  0,150, 10, 10,151,152,  2,153, 99,
+   10, 10,154,155,156,  2, 10,157, 10, 10, 10,158,159,  0,160,161,
+    0,  0,  0,  0, 10, 10,162,  2,163,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,164,  0,  0,  0,  0,  0,  0,  0,165,
+    0,  0,  0,  0,  0,  0,  0,166,166,167, 34,168,  0,  0,  0,  0,
+  169,170, 10,171, 95,  0,  0,  0,  0,  0,  0,  0, 70, 10,172,  0,
+   10,173,174,  0,  0,  0,  0,  0, 10, 10,175,  2,  0,  0,  0,  0,
+   10, 10,176,173,  0,  0,  0,  0,  0,  0,  0, 10,177,178,  0, 10,
+  179,  0,  0,180,181,  0,  0,  0,182, 10, 10,183,184,185,186,187,
+  188, 10, 10,189,190,  0,  0,  0,191, 10,192,193,194, 10, 10,195,
+  188, 10, 10,196,197,106,198,103, 10, 34,199,200,201,  0,  0,  0,
+  202,203, 95, 10, 10,204,205,  2,206, 21, 22,207,208,209,210,211,
+   10, 10, 10,212,213,214,215,  0,198, 10, 10,216,217,  2,  0,  0,
+   10, 10,218,219,220,221,  0,  0, 10, 10, 10,222,223,  2,  0,  0,
+   10, 10,224,225,  2,  0,  0,  0, 10,226,227,104,228,  0,  0,  0,
+   10, 10,229,230,  0,  0,  0,  0,231,232, 10,233,234,  2,  0,  0,
+    0,  0,235, 10, 10,236,237,  0,238, 10, 10,239,240,241, 10, 10,
+  242,243,  0,  0,  0,  0,  0,  0, 22, 10,218,244,  8, 10, 71, 19,
+   10,245, 74,246,  0,  0,  0,  0,247, 10, 10,248,249,  2,250, 10,
+  251,252,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,253,
+  254, 49, 10,255,256,  2,  0,  0,257,257,257,257,257,257,257,257,
+  257,257,257,258,259,260,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,
+   10, 10, 10,261,  0,  0,  0,  0, 10, 10, 10, 10,262,263,264,264,
+  265,266,  0,  0,  0,  0,267,  0, 10, 10, 10, 10, 10, 10, 10, 10,
+   10, 10, 10, 10, 10,268,  0,  0, 10, 10, 10, 10, 10, 10,106, 71,
+   95,269,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,270,
+   10, 10, 71,271,272,  0,  0,  0,  0, 10,273,  0, 10, 10,274,  2,
+    0,  0,  0,  0,  0, 10,275,  2, 10, 10, 10, 10,276,  2,  0,  0,
+  130,130,130,130,130,130,130,130,163,163,163,163,163,163,163,163,
+  163,163,163,163,163,163,163,130,
 };
 
 static inline unsigned
@@ -357,14 +366,14 @@ hb_use_b4 (const uint8_t* a, unsigned i)
 static inline uint_fast8_t
 hb_use_get_category (unsigned u)
 {
-  return u<921600u?hb_use_u8[2777+(((hb_use_u8[593+(((hb_use_u16[((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>3>>5))<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O;
+  return u<921600u?hb_use_u8[2809+(((hb_use_u8[593+(((hb_use_u16[((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>3>>5))<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O;
 }
 
 
 #else
 
 static const uint8_t
-hb_use_u8[3413] =
+hb_use_u8[3483] =
 {
      16,   50,   51,   51,   51,   52,   51,   83,  118,  131,   51,   57,   58,  179,  195,   61,
      51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,
@@ -375,243 +384,248 @@ hb_use_u8[3413] =
      51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,
      14,    0,    1,    1,    2,    1,    1,    3,    4,    5,    6,    7,    8,    9,   10,    1,
      11,   12,    1,    1,    1,    1,    1,    1,   13,   14,   15,   16,   17,   18,   19,    1,
-      1,   20,    1,    1,    1,    1,   21,    1,    1,    1,    1,    1,    1,    1,   22,    1,
+      1,   20,    1,    1,    1,    1,   21,    1,   22,    1,    1,    1,    1,    1,   23,   24,
       1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-      1,    1,    1,    1,    1,    1,    1,    1,    1,   23,   24,   25,   26,    1,    1,    1,
-      1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,   27,
-     28,    1,    1,    1,    1,    1,   29,    1,    1,    1,    1,   30,   31,    1,   32,   33,
-     34,   35,   36,   37,   38,   39,   40,   41,   42,   43,   44,   45,    1,   46,   47,   48,
-     49,   50,   50,   50,   50,   51,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-      1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,   52,   53,    1,    1,    1,
-     54,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,   50,   55,    1,    1,
-      1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,   56,    1,    1,
-      1,    1,   57,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-      1,    1,   58,   59,    1,   60,    1,    1,    1,    1,   61,    1,    1,    1,    1,    1,
-      1,   62,   63,   62,   62,   62,   62,   62,   62,   62,   62,   62,   62,   62,   62,   62,
-     62,    0,    1,    0,    0,    0,    2,    3,    0,    0,    0,    0,    0,    0,    0,    0,
-      0,    0,    0,    4,    0,    0,    0,    0,    0,    0,    0,    5,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,    0,    6,    7,    0,    0,    8,    0,    0,    0,    0,
-      0,    9,   10,   11,   12,   13,   14,   15,   16,   17,   18,   19,   20,   21,   22,   23,
-     24,   25,   26,   27,   28,   29,   30,   31,   32,   33,   34,   35,   36,   37,   38,   39,
-     40,   41,   42,   43,   36,   44,   45,   46,   47,   48,   49,   50,   51,   52,   53,   54,
-      0,   55,   56,   57,   58,   59,    0,    0,    0,   60,   61,   62,   63,   55,   64,   65,
-     66,   67,   55,   55,   68,   69,   70,    0,    0,   71,   72,   73,   74,   55,   75,   76,
-      0,   77,   55,   78,   79,   80,    0,    0,    0,   81,   82,   83,   84,   85,   86,   55,
-     87,   55,   88,   89,    0,    0,    0,   90,   91,    0,    0,    0,    0,    0,    0,    0,
-     92,   93,   94,    0,   95,   96,    0,    0,   97,    0,    0,    0,    0,    0,    0,   98,
-      0,    0,   99,   55,  100,    0,    0,    0,    0,  101,  102,   55,  103,  104,  105,  106,
-    107,   55,  108,  109,    0,  110,  111,  112,  113,   55,  114,  115,  116,   55,  117,  118,
-    119,    0,    0,    0,    0,    0,    0,   55,  120,  121,    0,    0,    0,    0,    0,    0,
-    122,    0,    0,    0,    0,    0,    0,    0,  123,    0,    0,    0,  124,  125,  126,    0,
-      0,  127,  128,  129,    0,    0,    0,   50,  130,    0,    0,    0,    0,  131,  132,    0,
-      0,   55,  133,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,   55,  134,    0,
-      0,    0,   99,  135,   99,  136,  137,  138,    0,  139,  140,  141,  142,  143,  144,  145,
-      0,  146,  147,  148,  149,  143,  150,  151,  152,  153,  154,  155,    0,  156,  157,  158,
-    159,  160,  161,  162,  163,    0,    0,    0,    0,   55,  164,  165,  166,  167,  168,  169,
-      0,    0,    0,    0,    0,   55,  170,  171,    0,   55,  172,  173,    0,   55,  174,   66,
-      0,  175,  176,  177,    0,    0,    0,    0,    0,   55,  178,    0,    0,    0,    0,    0,
-      0,  179,  180,  181,    0,    0,  182,  183,  184,  185,  186,  187,   55,  188,    0,    0,
-      0,  189,  190,  191,  192,  193,  194,    0,    0,  195,  196,  197,  198,  199,   66,    0,
-      0,    0,    0,    0,    0,    0,    0,    0,  200,  201,  202,  203,    0,    0,    0,    0,
-      0,   55,   55,   55,   55,   55,   55,   55,   55,   55,  204,  205,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,    0,   66,    0,   55,  206,    0,    0,    0,    0,    0,
-      0,   55,   55,  207,  208,  209,    0,    0,  210,   55,   55,   55,   55,   55,   55,  211,
-      0,   55,   55,   55,  212,  213,    0,    0,    0,    0,    0,    0,  214,    0,    0,    0,
-      0,   55,  215,  216,    0,    0,    0,    0,    0,    0,    0,    0,    0,   99,  217,   55,
-    218,    0,    0,    0,    0,    0,    0,   99,  219,   55,   55,  220,    0,    0,    0,    0,
-      0,  221,  221,  221,  221,  221,  221,  221,  221,  222,  222,  222,  222,  222,  222,  222,
-    223,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,
-      0,    2,    2,    2,    2,    2,    0,    0,    0,    3,    0,    0,    0,    0,    0,    4,
-      0,    0,    5,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,    0,    0,    6,    7,    0,    0,    0,    0,    0,    0,
+      1,    1,    1,    1,    1,    1,    1,    1,    1,   25,   26,   27,   28,    1,    1,    1,
+      1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,   29,
+     30,    1,    1,    1,    1,    1,   31,    1,    1,    1,    1,   32,   33,    1,   34,   35,
+     36,   37,   38,   39,   40,   41,   42,   43,   44,   45,   46,   47,    1,   48,   49,   50,
+     51,   52,   52,   52,   52,   53,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+      1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,   54,   55,    1,    1,    1,
+     56,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,   57,   58,    1,    1,
+      1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,   59,    1,    1,
+      1,    1,   60,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+      1,    1,   61,   62,    1,   63,    1,    1,    1,    1,   64,    1,    1,    1,    1,    1,
+      1,   65,   66,   65,   65,   65,   65,   65,   65,   65,   65,   65,   65,   65,   65,   65,
+     65,    0,    1,    2,    2,    0,    3,    4,    0,    0,    0,    0,    0,    0,    0,    0,
+      0,    0,    0,    5,    0,    0,    0,    0,    0,    0,    0,    6,    0,    0,    0,    0,
+      0,    0,    0,    0,    0,    0,    0,    7,    8,    0,    0,    9,    0,    0,    0,    0,
+      0,   10,   11,   12,   13,   14,   15,   16,   17,   18,   19,   20,   21,   22,   23,   24,
+     25,   26,   27,   28,   29,   30,   31,   32,   33,   34,   35,   36,   37,   38,   39,   40,
+     41,   42,   43,   44,   37,   45,   46,   47,   48,   49,   50,   51,   52,   53,   54,   55,
+      0,   56,   57,   58,   59,   60,    0,    0,    0,   61,   62,   63,   64,   56,   65,   66,
+     67,   68,   56,   56,   69,   70,   71,    0,    0,   72,   73,   74,   75,   56,   76,   77,
+      0,   78,   56,   79,   80,   81,    0,    0,    0,   82,   83,   84,   85,   86,   87,   56,
+     88,   56,   89,   90,    0,    0,    0,   91,   92,    0,    0,    0,    0,    0,    0,    0,
+     93,   94,   95,    0,   96,   97,    0,    0,   98,    0,    0,    0,    0,    0,    0,   99,
+      0,    0,    0,    0,    0,    0,    0,    0,  100,    0,  101,   56,  102,    0,    0,    0,
+      0,    0,  103,    0,    0,    0,    0,    0,    0,  104,  105,   56,  106,  107,  108,  109,
+    110,   56,  111,  112,    0,  113,  114,  115,  116,   56,  117,  118,  119,   56,  120,  121,
+    122,    0,    0,    0,    0,    0,    0,   56,  123,  124,    0,    0,    0,    0,    0,    0,
+    125,    0,    0,    0,    0,    0,    0,    0,  126,    0,    0,    0,  127,  128,  129,    0,
+      0,  130,  131,  132,    0,    0,    0,   51,  133,    0,    0,    0,    0,  134,  135,    0,
+      0,   56,  136,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,   56,  137,    0,
+      0,    0,  101,  138,  101,  139,  140,  141,    0,  142,  143,  144,  145,  146,  147,  148,
+      0,  149,  150,  151,  152,  146,  153,  154,  155,  156,  157,  158,    0,  159,  160,  161,
+    162,  163,  164,  165,  166,    0,    0,    0,    0,   56,  167,  168,  169,  170,  171,  172,
+      0,    0,    0,    0,    0,   56,  173,  174,    0,   56,  175,  176,    0,   56,  177,   67,
+      0,  178,  179,  180,    0,    0,    0,    0,    0,   56,  181,    0,    0,    0,    0,    0,
+      0,  182,  183,  184,    0,    0,  185,  186,  187,  188,  189,  190,   56,  191,    0,    0,
+      0,  192,  193,  194,  195,  196,  197,    0,    0,  198,  199,  200,  201,  202,   67,    0,
+      0,    0,    0,    0,    0,    0,    0,    0,  203,  204,  205,  206,    0,    0,    0,    0,
+      0,  207,  207,  207,  207,  207,  207,  207,  207,  207,  208,  209,    0,    0,    0,    0,
+      0,    0,    0,    0,    0,    0,    0,   67,    0,   56,  210,    0,    0,    0,    0,    0,
+      0,   56,   56,  211,  212,  213,    0,    0,  214,   56,   56,   56,   56,   56,   56,   56,
+     56,   56,   56,   56,   56,   56,   56,  215,    0,   56,   56,   56,  216,  217,    0,    0,
+      0,    0,    0,    0,  218,    0,    0,    0,    0,   56,  219,  220,    0,    0,    0,    0,
+      0,    0,    0,    0,    0,  101,  221,   56,  222,    0,    0,    0,    0,    0,    0,  101,
+    223,   56,   56,  224,    0,    0,    0,    0,    0,  225,  225,  225,  225,  225,  225,  225,
+    225,  226,  226,  226,  226,  226,  226,  226,  227,    0,    0,    0,    0,    0,    0,    0,
+      0,    0,    0,    0,    0,    0,    0,    1,    0,    2,    2,    2,    2,    2,    0,    0,
+      0,    0,    0,    0,    0,    0,    3,    4,    0,    5,    0,    0,    0,    0,    0,    6,
+      0,    0,    7,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,    0,    0,    0,
+      0,    0,    0,    0,    0,    0,    0,    0,    8,    9,    0,    0,    0,    0,    0,    0,
       0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,    8,    9,    9,    9,    9,    0,    0,    0,    7,   10,
-      0,    2,    2,    2,    2,   11,   12,    0,    0,    9,   13,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,   14,   15,   16,   17,   18,   19,   20,   14,   21,   22,
-     23,   10,   24,   25,   18,    2,    2,    2,    2,    2,   18,    0,    2,    2,    2,    2,
-      2,    0,    2,    2,    2,    2,    2,    2,    2,   26,   27,   28,    2,    2,    2,    7,
-     28,    7,   28,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    7,    2,    2,
-      2,    7,    7,    0,    2,    2,    0,   15,   16,   17,   18,   29,   30,   31,   30,   32,
-      0,    0,    0,    0,   33,    0,    0,    2,   28,    2,    0,    0,    0,    0,    0,    7,
-     34,   10,   13,   28,    2,    2,    7,    0,   28,    7,    2,   28,    7,    2,    0,   35,
-     16,   17,   29,    0,   25,   36,   25,   37,    0,   38,    0,    0,    0,   28,    2,    7,
-      7,    0,    0,    0,    2,    2,    2,    2,    2,   39,   40,   41,    0,    0,    0,    0,
-      0,   10,   13,   28,    2,    2,    2,    2,   28,    2,   28,    2,    2,    2,    2,    2,
-      2,    7,    2,   28,    2,    2,    0,   15,   16,   17,   18,   19,   25,   20,   33,   22,
-      0,    0,    0,    0,    0,   28,   39,   39,   42,   10,   27,   28,    2,    2,    2,    7,
-     28,    7,    2,   28,    2,    2,    0,   15,   43,    0,    0,   25,   20,    0,    0,    2,
-     28,   28,    0,    0,    0,    0,    0,    0,    0,    0,   44,   28,    2,    2,    7,    0,
-      2,    7,    2,    2,    0,   28,    7,    7,    2,    0,   28,    7,    0,    2,    7,    0,
-      2,    2,    2,    2,    2,    2,    0,    0,   21,   14,   45,    0,   46,   31,   46,   32,
-      0,    0,    0,    0,   33,    0,    0,    0,    0,   13,   27,   47,    2,    2,    2,    7,
-      2,    7,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    0,   15,
-     20,   14,   21,   45,   20,   36,   20,   37,    0,    0,    0,   25,   29,    2,    7,    0,
-      0,    8,   27,   28,    2,    2,    2,    7,    2,    2,    2,   28,    2,    2,    0,   15,
-     43,    0,    0,   33,   45,    0,    0,    0,    7,   48,   49,    0,    0,    0,    0,    0,
-      0,    9,   27,    2,    2,    2,    2,    7,    2,    2,    2,    2,    2,    2,   50,   51,
-     21,   21,   17,   29,   46,   31,   46,   32,   52,    0,    0,    0,   33,    0,    0,    0,
-     28,   10,   27,   28,    2,    2,    2,    2,    2,    2,    2,    2,    7,    0,    2,    2,
-      2,    2,   28,    2,    2,    2,    2,   28,    0,    2,    2,    2,    7,    0,   53,    0,
-     33,   21,   20,   29,   29,   16,   46,   46,   23,    0,   21,    0,    0,    0,    0,    0,
-      0,    2,    0,    2,    7,    0,    0,    0,    0,    0,    0,    0,    0,   18,    0,    0,
-      0,    2,    2,   54,   54,   55,    0,    0,   16,    2,    2,    2,    2,   28,    2,    2,
-      2,    2,    2,    2,    2,    2,    2,    7,    0,   56,   19,   57,   20,   20,   18,   18,
-     44,   19,    9,   29,    9,    2,    2,   58,   59,   59,   59,   59,   59,   60,   59,   59,
-     59,   59,   59,   59,   59,   59,   59,   59,   59,   59,   59,   59,   59,   59,   59,   61,
-      0,    0,    0,    0,   62,    0,    0,    0,    0,    2,    2,    2,    2,    2,   63,   43,
-     57,   64,   20,   20,   65,   66,   67,   68,   69,    2,    2,    2,    2,    2,    1,    0,
-      3,    2,    2,    2,   21,   18,    2,    2,   70,   69,   71,   72,   63,   71,   27,   27,
-      2,   50,   20,   51,    2,    2,    2,    2,    2,    2,   73,   74,   75,   27,   27,   76,
-     77,    2,    2,    2,    2,    2,   27,   43,    0,    2,   57,   78,    0,    0,    0,    0,
-     28,    2,   57,   45,    0,    0,    0,    0,    0,    2,   57,    0,    0,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,    2,    7,    2,    7,   57,    0,    0,    0,    0,    0,
-      0,    2,    2,   79,   43,   20,   57,   18,   46,   46,   46,   46,   13,   80,   81,   82,
-     83,   84,   85,    0,    0,    0,    0,   86,    0,    7,    0,    0,   28,    0,   87,   79,
-     88,    2,    2,    2,    2,    7,    0,    0,    0,   40,   40,   89,   90,    2,    2,    2,
-      2,    2,    2,    2,    2,   11,    7,    0,    0,   91,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,    2,    2,    7,   20,   78,   43,   20,   92,   59,    0,
-      0,   93,   94,   93,   93,   95,   96,    0,    0,    2,    2,    2,    2,    2,    2,    2,
-      0,    2,    2,    7,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,    0,
-      0,    2,    2,    2,    2,   27,    0,    0,    0,    2,    2,    2,    2,    2,    7,    0,
-      0,    2,    2,    2,   50,   97,   43,    0,    0,    2,    2,   98,   99,  100,  101,   59,
-     61,  102,   14,   43,   20,   57,   19,   78,   46,   46,   74,    9,    9,    9,  103,   44,
-     38,    9,  104,   72,    2,    2,    2,    2,    2,    2,    2,  105,   20,   18,   18,   20,
-     46,   46,   20,  106,    2,    2,    2,    7,    0,    0,    0,    0,    0,    0,  107,  108,
-    109,  109,  109,    0,    0,    0,    0,    0,    0,  104,   72,    2,    2,    2,    2,    2,
-      2,   58,   59,   57,   23,   20,  110,   59,    2,    2,    2,    2,  105,   20,   21,   43,
-     43,  100,   12,    0,    0,    0,    0,    0,    0,    2,    2,   59,   16,   46,   21,  111,
-    100,  100,  100,  112,  113,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,   28,
-      2,    9,   44,  114,  114,  114,    9,  114,  114,   13,  114,  114,  114,   24,    0,   38,
-      0,    0,    0,  115,   49,    9,    3,    0,    0,    0,    0,    0,    0,    0,  116,    0,
-      0,    0,    0,    0,    0,    0,    4,  117,  118,   40,   40,    3,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,  118,  118,  119,  118,  118,  118,  118,  118,  118,  118,
-    118,    0,    0,  120,    0,    0,    0,    0,    0,    0,    5,  120,    0,    0,    0,    0,
-      0,   44,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    7,
-      0,    2,    2,    2,    2,    0,    0,    0,   28,    0,    0,    0,    0,    0,    0,    0,
-    121,    2,   51,    2,  106,    2,    8,    2,    2,    2,   63,   17,   14,    0,    0,   29,
-      0,    2,    2,    0,    0,    0,    0,    0,    0,   27,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,  122,   21,   21,   21,   21,   21,   21,   21,  123,    0,    0,    0,    0,
-      0,    9,    9,    9,    9,    9,    9,    9,    9,    9,    2,    0,    0,    0,    0,    0,
-     50,    2,    2,    2,   20,   20,  124,  114,    0,    2,    2,    2,  125,   18,   57,   18,
-    111,  100,  126,    0,    0,    0,    0,    0,    0,    9,  127,    2,    2,    2,    2,    2,
-      2,    2,  128,   21,   20,   18,   46,  129,  130,  131,    0,    0,    0,    0,    0,    0,
-      0,    2,    2,   50,   28,    2,    2,    2,    2,    2,    2,    2,    2,    8,   20,   57,
-     97,   74,  132,  133,  134,    0,    0,    0,    0,    2,  135,    2,    2,    2,    2,  136,
-      0,   28,    2,   40,    3,    0,   77,   13,    2,   51,   20,  137,   50,   51,    2,    2,
-    103,    8,    7,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,  138,   19,
-     23,    0,    0,  139,  140,    0,    0,    0,    0,    2,   63,   43,   21,   78,   45,  141,
-      0,   79,   79,   79,   79,   79,   79,   79,   79,    0,    0,    0,    0,    0,    0,    0,
-      4,  118,  118,  118,  118,  119,    0,    0,    0,    2,    2,    2,    2,    2,    7,    2,
-      2,    2,    7,    2,   28,    2,    2,    2,    2,    2,   28,    2,    2,    2,   28,    7,
-      0,  125,   18,   25,   29,    0,    0,  142,  143,    2,    2,   28,    2,   28,    2,    2,
-      2,    2,    2,    2,    0,   12,   35,    0,  144,    2,    2,   11,   35,    0,   28,    2,
-      2,    2,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,   28,    2,    2,
-      7,    2,    2,    9,   39,    0,    0,    0,    0,    2,    2,    2,    2,    2,   25,   36,
-      0,    2,    2,    2,  114,  114,  114,  114,  114,  145,    2,    7,    0,    0,    0,    0,
-      0,    2,   12,   12,    0,    0,    0,    0,    0,    7,    2,    2,    7,    2,    2,    2,
-      2,   28,    2,    7,    0,   28,    2,    0,    0,  146,  147,  148,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,   20,   20,   18,   18,   18,   20,   20,  131,    0,    0,    0,
-      0,    0,  149,  149,  149,  149,  149,  149,  149,  149,  149,  149,    2,    2,    2,    2,
-      2,   51,   50,   51,    0,    0,    0,    0,  150,    9,   72,    2,    2,    2,    2,    2,
-      2,   16,   17,   19,   14,   22,   35,    0,    0,    0,   29,    0,    0,    0,    0,    0,
-      0,    9,   47,    2,    2,    2,    2,    2,    2,    2,    2,    2,  125,   18,   20,  151,
-     20,   19,  152,  153,    2,    2,    2,    2,    2,    0,    0,   63,  154,    0,    0,    0,
-      0,    2,   11,    0,    0,    0,    0,    0,    0,    2,   63,   23,   18,   18,   18,   20,
-     20,  106,  155,    0,    0,   54,  156,   29,  157,   28,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,    2,   21,   17,   20,   20,  158,   42,    0,    0,    0,
-     47,  125,    0,    0,    0,    0,    0,    0,    0,    2,    2,    2,    7,    7,    2,    2,
-     28,    2,    2,    2,    2,    2,    2,    2,   28,    2,    2,    2,    2,    2,    2,    2,
-      8,   16,   17,   19,   20,  159,   29,    0,    0,    9,    9,   28,    2,    2,    2,    7,
-     28,    7,    2,   28,    2,    2,   56,   15,   21,   14,   21,   45,   30,   31,   30,   32,
-      0,    0,    0,    0,   33,    0,    0,    0,    2,    2,   21,    0,    9,    9,    9,   44,
-      0,    9,    9,   44,    0,    0,    0,    0,    0,    2,    2,   63,   23,   18,   18,   18,
-     20,   21,  123,   13,   15,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,    0,
-    160,  161,    0,    0,    0,    0,    0,    0,    0,   16,   17,   18,   18,   64,   97,   23,
-    157,    9,  162,    7,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,    2,
-     63,   23,   18,   18,    0,   46,   46,    9,  163,   35,    0,    0,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    2,    2,   18,    0,   21,   17,   18,   18,   19,   14,   80,
-    163,   36,    0,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    8,  164,
-     23,   18,   20,   20,  162,    7,    0,    0,    0,    2,    2,    2,    2,    2,    7,   41,
-    133,   21,   20,   18,   74,   19,   20,    0,    0,    2,    2,    2,    7,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,    2,   16,   17,   18,   19,   20,  103,  163,   35,    0,
-      0,    2,    2,    2,    7,   28,    0,    2,    2,    2,    2,   28,    7,    2,    2,    2,
-      2,   21,   21,   16,   30,   31,   10,  165,  166,  167,  168,    0,    0,    0,    0,    0,
-      0,    2,    2,    2,    2,    0,    2,    2,    2,   63,   23,   18,   18,    0,   20,   21,
-     27,  106,    0,   31,    0,    0,    0,    0,    0,   50,   18,   20,   20,   20,  137,    2,
-      2,    2,  169,  170,    9,   13,  171,   70,  172,    0,    0,    1,  144,    0,    0,    0,
-      0,   50,   18,   20,   14,   17,   18,    2,    2,    2,    2,  155,  155,  155,  173,  173,
-    173,  173,  173,  173,   13,  174,    0,   28,    0,   20,   18,   18,   29,   20,   20,    9,
-    163,    0,   59,   59,   59,   59,   59,   59,   59,   64,   19,   80,   44,    0,    0,    0,
-      0,    2,    2,    2,    7,    2,   28,    2,    2,   50,   20,   20,   29,    0,   36,   20,
-     25,    9,  156,  175,  171,    0,    0,    0,    0,    2,    2,    2,   28,    7,    2,    2,
-      2,    2,    2,    2,    2,    2,   21,   21,   45,   20,   33,   80,   66,    0,    0,    0,
-      0,    2,  176,   64,   45,    0,    0,    0,    0,    9,  177,    2,    2,    2,    2,    2,
-      2,    2,    2,   21,   20,   18,   29,    0,   46,   14,  140,    0,    0,    0,    0,    0,
-      0,  178,  178,  178,  106,  179,  178,    0,    0,  145,    2,    2,  180,  114,  114,  114,
-    114,  114,  114,  114,    0,    0,    0,    0,    0,    9,    9,    9,   44,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,    7,    0,   56,  181,   18,   18,   18,   18,   18,   18,
-     18,   18,   18,   18,   18,   18,   18,   18,   18,   18,   18,   18,   18,    0,    0,    0,
-     38,  114,   24,    0,    0,    0,    0,    0,    0,    0,    0,    7,    0,    0,    0,    0,
-      0,    2,    2,    2,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,   56,
-     35,    0,    4,  118,  118,  118,  119,    0,    0,    9,    9,    9,   47,    2,    2,    2,
-      0,    2,    2,    2,    2,    2,    0,    0,    2,    2,    2,    2,    2,    2,    2,    2,
-     44,    2,    2,    2,    2,    2,    2,    9,    9,    2,    2,    2,    2,    2,    2,   20,
-     20,    2,    2,   42,   42,   42,   90,    0,    0,    O,    O,    O,   GB,    B,    B,   GB,
-      O,    O,   WJ,FMPst,FMPst,    O,  CGJ,    B,    O,    B,VMAbv,VMAbv,VMAbv,    O,VMAbv,    B,
-  CMBlw,CMBlw,CMBlw,VMAbv,VMPst, VAbv, VPst,CMBlw,    B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw,
-   VAbv, VAbv, VAbv, VPst, VPst, VPst,    H, VPre, VPst,VMBlw,    O,    O, VAbv,   GB,VMAbv,VMPst,
-  VMPst,    O,    B, VBlw,    O,    O, VPre, VPre,    O, VPre,    H,    O, VPst,FMAbv,    O,CMBlw,
-      O, VAbv,    O, VAbv,    H,    O,VMBlw,VMAbv,CMAbv,   GB,   GB,    O, MBlw,CMAbv,CMAbv, VPst,
-   VAbv,VMAbv,    O, VPst,    O, VPre, VPre,VMAbv,    B,    O,   CS,   CS,VMPst,    B, VAbv, VAbv,
-      B,    R,    O,  HVM,    O,    O,FMBlw,    O,CMAbv,    O,CMBlw, VAbv, VBlw,    B,  SUB,  SUB,
-    SUB,    O,  SUB,  SUB,    O,FMBlw,    O,    B, VPst, VBlw, VPre,VMAbv,VMBlw,VMPst,   IS, VAbv,
-   MPst, MPre, MBlw, MBlw,    B, MBlw, MBlw, VPst,VMPst,VMPst,    B, MBlw, VPst, VPre, VAbv, VAbv,
-  VMPst,VMPst,VMBlw,    B,VMPst, VBlw, VPst,  CGJ,  CGJ, VPst,VMAbv,VMAbv,FMAbv, FAbv,CMAbv,FMAbv,
-  VMAbv,FMAbv, VAbv,   IS,FMAbv,    B,FMAbv,    B,  CGJ,   WJ,  CGJ,   GB,CMAbv,CMAbv,    B,   GB,
-      B, VAbv,  SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre,    B, MPre, MBlw,
-    SUB, FAbv, FAbv, MAbv,  SUB,   Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst,    H,    B,    O,
-  SMAbv,SMBlw,SMAbv,SMAbv,SMAbv, VPst,   IS, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv,
-     CS,    O,FMAbv, ZWNJ,  CGJ,   WJ,   WJ,   WJ,    O,FMPst,    O,    O,    H, MPst, VPst,    H,
-  VMAbv, VAbv,VMBlw,    B, VBlw, FPst, VPst, FAbv,VMPst,    B,CMAbv, VAbv, MBlw, MPst, MBlw,    H,
-      O, VBlw, MPst, MPre, MAbv, MBlw,    O,    B, FAbv, FAbv, FPst, VBlw,    B,    B, VPre,    O,
-  VMPst,   IS,    O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv,    O,   IS,VMBlw,    B,VMPst,VMAbv,VMPst,
-     CS,   CS,    B,    N,    N,    O,   HN, VPre, VBlw, VAbv,   IS,CMAbv,    O, VPst,    B,    R,
-      R,CMBlw, VAbv, VPre,VMAbv,VMAbv,    H, VAbv,CMBlw,FMAbv,    B,   CS,   CS,    H,CMBlw,VMPst,
-      H,VMPst, VAbv,VMAbv, VPst,   IS,    R, MPst,    R, MPst,CMBlw,    B,FMBlw, VBlw,VMAbv,    R,
-   MBlw, MBlw,   GB, FBlw, FBlw,CMAbv,   IS, VBlw,   IS,   GB, VAbv,    R,VMPst,    H,    H,    B,
-      H,    B,VMBlw,    O, VBlw,
+      2,    2,    2,    2,    2,    2,   10,   11,   11,   11,   11,    0,    0,    0,    9,   12,
+      0,    2,    2,    2,    2,   13,   14,    0,    0,   11,   15,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    2,   16,   17,   18,   19,   20,   21,   22,   16,   23,   24,
+     25,   12,   26,   27,   20,    2,    2,    2,    2,    2,   20,    0,    2,    2,    2,    2,
+      2,    0,    2,    2,    2,    2,    2,    2,    2,   28,   29,   30,    2,    2,    2,    9,
+     30,    9,   30,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    9,    2,    2,
+      2,    9,    9,    0,    2,    2,    0,   17,   18,   19,   20,   31,   32,   33,   32,   34,
+      0,    0,    0,    0,   35,    0,    0,    2,   30,    2,    0,    0,    0,    0,    0,    9,
+     36,   12,   15,   30,    2,    2,    9,    0,   30,    9,    2,   30,    9,    2,    0,   37,
+     18,   19,   31,    0,   27,   38,   27,   39,    0,   40,    0,    0,    0,   30,    2,    9,
+      9,    0,    0,    0,    2,    2,    2,    2,    2,   41,   42,   43,    0,    0,    0,    0,
+      0,   12,   15,   30,    2,    2,    2,    2,   30,    2,   30,    2,    2,    2,    2,    2,
+      2,    9,    2,   30,    2,    2,    0,   17,   18,   19,   20,   21,   27,   22,   35,   24,
+      0,    0,    0,    0,    0,   30,   41,   41,   44,   12,   29,   30,    2,    2,    2,    9,
+     30,    9,    2,   30,    2,    2,    0,   17,   45,    0,    0,   27,   22,    0,    0,    2,
+     30,   30,    0,    0,    0,    0,    0,    0,    0,    0,   46,   30,    2,    2,    9,    0,
+      2,    9,    2,    2,    0,   30,    9,    9,    2,    0,   30,    9,    0,    2,    9,    0,
+      2,    2,    2,    2,    2,    2,    0,    0,   23,   16,   47,    0,   48,   33,   48,   34,
+      0,    0,    0,    0,   35,    0,    0,    0,    0,   15,   29,   49,    2,    2,    2,    9,
+      2,    9,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    0,   17,
+     22,   16,   23,   47,   22,   38,   22,   39,    0,    0,    0,   27,   31,    2,    9,    0,
+      0,   10,   29,   30,    2,    2,    2,    9,    2,    2,    2,   30,    2,    2,    0,   17,
+     45,    0,    0,   35,   47,    0,    0,    0,    9,   50,   51,    0,    0,    0,    0,    0,
+      0,   11,   29,    2,    2,    2,    2,    9,    2,    2,    2,    2,    2,    2,   52,   53,
+     23,   23,   19,   31,   48,   33,   48,   34,   54,    0,    0,    0,   35,    0,    0,    0,
+     30,   12,   29,   30,    2,    2,    2,    2,    2,    2,    2,    2,    9,    0,    2,    2,
+      2,    2,   30,    2,    2,    2,    2,   30,    0,    2,    2,    2,    9,    0,   55,    0,
+     35,   23,   22,   31,   31,   18,   48,   48,   25,    0,   23,    0,    0,    0,    0,    0,
+      0,    2,    0,    2,    9,    0,    0,    0,    0,    0,    0,    0,    0,   20,    0,    0,
+      0,    2,    2,   56,   56,   57,    0,    0,   18,    2,    2,    2,    2,   30,    2,    2,
+      2,    2,    2,    2,    2,    2,    2,    9,    0,   58,   21,   59,   22,   22,   20,   20,
+     46,   21,   11,   31,   11,    2,    2,   60,   61,   61,   61,   61,   61,   62,   61,   61,
+     61,   61,   61,   61,   61,   61,   61,   61,   61,   61,   61,   61,   61,   61,   61,   63,
+      0,    0,    0,    0,   64,    0,    0,    0,    0,    2,    2,    2,    2,    2,   65,   45,
+     59,   66,   22,   22,   67,   68,   69,   70,   71,    2,    2,    2,    2,    2,    1,    0,
+      5,    2,    2,    2,   23,   20,    2,    2,   72,   71,   73,   74,   65,   73,   29,   29,
+      2,   52,   22,   53,    2,    2,    2,    2,    2,    2,   75,   76,   77,   29,   29,   78,
+     79,    2,    2,    2,    2,    2,   29,   45,    0,    2,   59,   80,    0,    0,    0,    0,
+     30,    2,   59,   47,    0,    0,    0,    0,    0,    2,   59,    0,    0,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,    2,    9,    2,    9,   59,    0,    0,    0,    0,    0,
+      0,    2,    2,   81,   45,   22,   59,   20,   48,   48,   48,   48,   15,   82,   83,   84,
+     85,   86,   87,    0,    0,    0,    0,   88,    0,    9,    0,    0,   30,    0,   89,   81,
+     90,    2,    2,    2,    2,    9,    0,    0,    0,   42,   42,   91,   92,    2,    2,    2,
+      2,    2,    2,    2,    2,   13,    9,    0,    0,   93,    2,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    2,    2,    2,    9,   22,   80,   45,   22,   94,   61,    0,
+      0,   95,   96,   95,   95,   97,   98,    0,    0,    2,    2,    2,    2,    2,    2,    2,
+      0,    2,    2,    9,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,    0,
+      0,    2,    2,    2,    2,   29,    0,    0,    0,    2,    2,    2,    2,    2,    9,    0,
+      0,    2,    2,    2,   52,   99,   45,    0,    0,    2,    2,  100,  101,  102,  103,   61,
+     63,  104,   16,   45,   22,   59,   21,   80,   48,   48,   76,   11,   11,   11,  105,   46,
+     40,   11,  106,   74,    2,    2,    2,    2,    2,    2,    2,  107,   22,   20,   20,   22,
+     48,   48,   22,  108,    2,    2,    2,    9,    0,    0,    0,    0,    0,    0,  109,  110,
+    111,  111,  111,    0,    0,    0,    0,    0,    0,  106,   74,    2,    2,    2,    2,    2,
+      2,   60,   61,   59,   25,   22,  112,   61,    2,    2,    2,    2,  107,   22,   23,   45,
+     45,  102,   14,    0,    0,    0,    0,    0,    0,    2,    2,   61,   18,   48,   23,  113,
+    102,  102,  102,  114,  115,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,   30,
+      2,   11,   46,  116,  116,  116,   11,  116,  116,   15,  116,  116,  116,   26,    0,   40,
+      0,    0,    0,  117,   51,   11,    5,    0,    0,    0,    0,    0,    0,    0,  118,    0,
+      0,    0,    0,    0,    0,    0,    6,  119,  120,   42,   42,    5,    0,    0,    0,    0,
+      0,    0,    0,    0,    0,    0,  120,  120,  121,  120,  120,  120,  120,  120,  120,  120,
+    120,    0,    0,  122,    0,    0,    0,    0,    0,    0,    7,  122,    0,    0,    0,    0,
+      0,   46,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    9,
+      0,    0,    0,    0,  123,  123,    0,    0,    0,    2,    2,    2,    2,    0,    0,    0,
+     30,    0,    0,    0,    0,    0,    0,    0,  124,    0,  123,  123,    0,    0,    0,    0,
+      0,    2,   53,    2,  108,    2,   10,    2,    2,    2,   65,   19,   16,    0,    0,   31,
+      0,    2,    2,    0,    0,    0,    0,    0,    0,   29,    2,    2,    2,    2,    2,    2,
+      2,    2,    2,  125,   23,   23,   23,   23,   23,   23,   23,  126,    0,    0,    0,    0,
+      0,   11,   11,   11,   11,   11,   11,   11,   11,   11,    2,    0,    0,    0,    0,    0,
+     52,    2,    2,    2,   22,   22,  127,  116,    0,    2,    2,    2,  128,   20,   59,   20,
+    113,  102,  129,    0,    0,    0,    0,    0,    0,   11,  130,    2,    2,    2,    2,    2,
+      2,    2,  131,   23,   22,   20,   48,  132,  133,  134,    0,    0,    0,    0,    0,    0,
+      0,    2,    2,   52,   30,    2,    2,    2,    2,    2,    2,    2,    2,   10,   22,   59,
+     99,   76,  135,  136,  137,    0,    0,    0,    0,    2,  138,    2,    2,    2,    2,  139,
+      0,   30,    2,   42,    5,    0,   79,   15,    2,   53,   22,  140,   52,   53,    2,    2,
+    105,   10,    9,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,  141,   21,
+     25,    0,    0,  142,  143,    0,    0,    0,    0,    2,   65,   45,   23,   80,   47,  144,
+      0,   81,   81,   81,   81,   81,   81,   81,   81,    0,    0,    0,    0,    0,    0,    0,
+      6,  120,  120,  120,  120,  121,    0,    0,    0,    2,    2,    2,    2,    2,    9,    2,
+      2,    2,    9,    2,   30,    2,    2,    2,    2,    2,   30,    2,    2,    2,   30,    9,
+      0,  128,   20,   27,   31,    0,    0,  145,  146,    2,    2,   30,    2,   30,    2,    2,
+      2,    2,    2,    2,    0,   14,   37,    0,  147,    2,    2,   13,   37,    0,   30,    2,
+      2,    2,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,   30,    2,    2,
+      9,    2,    2,   11,   41,    0,    0,    0,    0,    2,    2,    2,    2,    2,   27,   38,
+      0,    2,    2,    2,  116,  116,  116,  116,  116,  148,    2,    9,    0,    0,    0,    0,
+      0,    2,   14,   14,    0,    0,    0,    0,    0,    9,    2,    2,    9,    2,    2,    2,
+      2,   30,    2,    9,    0,   30,    2,    0,    0,  149,  150,  151,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,   22,   22,   20,   20,   20,   22,   22,  134,    0,    0,    0,
+      0,    0,  152,  152,  152,  152,  152,  152,  152,  152,  152,  152,    2,    2,    2,    2,
+      2,   53,   52,   53,    0,    0,    0,    0,  153,   11,   74,    2,    2,    2,    2,    2,
+      2,   18,   19,   21,   16,   24,   37,    0,    0,    0,   31,    0,    0,    0,    0,    0,
+      0,   11,   49,    2,    2,    2,    2,    2,    2,    2,    2,    2,  128,   20,   22,  154,
+     22,   21,  155,  156,    2,    2,    2,    2,    2,    0,    0,   65,  157,    0,    0,    0,
+      0,    2,   13,    0,    0,    0,    0,    0,    0,    2,   65,   25,   20,   20,   20,   22,
+     22,  108,  158,    0,    0,   56,  159,   31,  160,   30,    2,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    2,    2,   23,   19,   22,   22,  161,   44,    0,    0,    0,
+     49,  128,    0,    0,    0,    0,    0,    0,    0,    2,    2,    2,    9,    9,    2,    2,
+     30,    2,    2,    2,    2,    2,    2,    2,   30,    2,    2,    2,    2,    2,    2,    2,
+     10,   18,   19,   21,   22,  162,   31,    0,    0,   11,   11,   30,    2,    2,    2,    9,
+     30,    9,    2,   30,    2,    2,   58,   17,   23,   16,   23,   47,   32,   33,   32,   34,
+      0,    0,    0,    0,   35,    0,    0,    0,    2,    2,   23,    0,   11,   11,   11,   46,
+      0,   11,   11,   46,    0,    0,    0,    0,    0,    2,    2,   65,   25,   20,   20,   20,
+     22,   23,  126,   15,   17,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,    0,
+    163,  164,    0,    0,    0,    0,    0,    0,    0,   18,   19,   20,   20,   66,   99,   25,
+    160,   11,  165,    9,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,    2,
+     65,   25,   20,   20,    0,   48,   48,   11,  166,   37,    0,    0,    0,    0,    0,    0,
+      0,    0,    0,    0,    0,    2,    2,   20,    0,   23,   19,   20,   20,   21,   16,   82,
+    166,   38,    0,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,   10,  167,
+     25,   20,   22,   22,  165,    9,    0,    0,    0,    2,    2,    2,    2,    2,    9,   43,
+    136,   23,   22,   20,   76,   21,   22,    0,    0,    2,    2,    2,    9,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,    2,   18,   19,   20,   21,   22,  105,  166,   37,    0,
+      0,    2,    2,    2,    9,   30,    0,    2,    2,    2,    2,   30,    9,    2,    2,    2,
+      2,   23,   23,   18,   32,   33,   12,  168,  169,  170,  171,    0,    0,    0,    0,    0,
+      0,    2,    2,    2,    2,    0,    2,    2,    2,   65,   25,   20,   20,    0,   22,   23,
+     29,  108,    0,   33,    0,    0,    0,    0,    0,   52,   20,   22,   22,   22,  140,    2,
+      2,    2,  172,  173,   11,   15,  174,   72,  175,    0,    0,    1,  147,    0,    0,    0,
+      0,   52,   20,   22,   16,   19,   20,    2,    2,    2,    2,  158,  158,  158,  176,  176,
+    176,  176,  176,  176,   15,  177,    0,   30,    0,   22,   20,   20,   31,   22,   22,   11,
+    166,    0,   61,   61,   61,   61,   61,   61,   61,   66,   21,   82,   46,    0,    0,    0,
+      0,    2,    2,    2,    9,    2,   30,    2,    2,   52,   22,   22,   31,    0,   38,   22,
+     27,   11,  159,  178,  174,    0,    0,    0,    0,    2,    2,    2,   30,    9,    2,    2,
+      2,    2,    2,    2,    2,    2,   23,   23,   47,   22,   35,   82,   68,    0,    0,    0,
+      0,    2,  179,   66,   47,    0,    0,    0,    0,   11,  180,    2,    2,    2,    2,    2,
+      2,    2,    2,   23,   22,   20,   31,    0,   48,   16,  143,    0,    0,    0,    0,    0,
+      0,  181,  181,  181,  181,  181,  181,  181,  181,  182,  182,  182,  183,  184,  182,  181,
+    181,  185,  181,  181,  186,  187,  187,  187,  187,  187,  187,  187,    0,    0,    0,    0,
+      0,   11,   11,   11,   46,    0,    0,    0,    0,    2,    2,    2,    2,    2,    9,    0,
+     58,  188,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
+     20,   20,   20,   20,   20,    0,    0,    0,   40,  116,   26,    0,    0,    0,    0,    0,
+      0,    0,    0,    9,    0,    0,    0,    0,    0,    2,    2,    2,    0,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,    0,   58,   37,    0,    6,  120,  120,  120,  121,    0,
+      0,   11,   11,   11,   49,    2,    2,    2,    0,    2,    2,    2,    2,    2,    0,    0,
+      2,    2,    2,    2,    2,    2,    2,    2,   46,    2,    2,    2,    2,    2,    2,   11,
+     11,    2,    2,    2,    2,    2,    2,   22,   22,    2,    2,   44,   44,   44,   92,    0,
+      0,    O,    O,    O,   GB,    B,    B,    O,   SB,    O,   SE,   GB,    O,    O,   WJ,FMPst,
+  FMPst,    O,  CGJ,    B,    O,    B,VMAbv,VMAbv,VMAbv,    O,VMAbv,    B,CMBlw,CMBlw,CMBlw,VMAbv,
+  VMPst, VAbv, VPst,CMBlw,    B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VPst,
+   VPst, VPst,    H, VPre, VPst,VMBlw,    O,    O, VAbv,   GB,VMAbv,VMPst,VMPst,    O,    B, VBlw,
+      O,    O, VPre, VPre,    O, VPre,    H,    O, VPst,FMAbv,    O,CMBlw,    O, VAbv,    O, VAbv,
+      H,    O,VMBlw,VMAbv,CMAbv,   GB,   GB,    O, MBlw,CMAbv,CMAbv, VPst, VAbv,VMAbv,    O, VPst,
+      O, VPre, VPre,VMAbv,    B,    O,   CS,   CS,VMPst,    B, VAbv, VAbv,    B,    R,    O,  HVM,
+      O,    O,FMBlw,    O,CMAbv,    O,CMBlw, VAbv, VBlw,    B,  SUB,  SUB,  SUB,    O,  SUB,  SUB,
+      O,FMBlw,    O,    B, VPst, VBlw, VPre,VMAbv,VMBlw,VMPst,   IS, VAbv, MPst, MPre, MBlw, MBlw,
+      B, MBlw, MBlw, VPst,VMPst,VMPst,    B, MBlw, VPst, VPre, VAbv, VAbv,VMPst,VMPst,VMBlw,    B,
+  VMPst, VBlw, VPst,  CGJ,  CGJ, VPst,VMAbv,VMAbv,FMAbv, FAbv,CMAbv,FMAbv,VMAbv,FMAbv, VAbv,   IS,
+  FMAbv,    B,FMAbv,    B,  CGJ,   WJ,  CGJ,   GB,CMAbv,CMAbv,    B,   GB,    B, VAbv,  SUB, FPst,
+   FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre,    B, MPre, MBlw,  SUB, FAbv, FAbv, MAbv,
+    SUB,   Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst,    H,    B,    O,SMAbv,SMBlw,SMAbv,SMAbv,
+  SMAbv, VPst,   IS, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv,   CS,    O,FMAbv, ZWNJ,
+    CGJ,   WJ,   WJ,   WJ,    O,FMPst,    O,   SB,   SE,    O,    H, MPst, VPst,    H,VMAbv, VAbv,
+  VMBlw,    B, VBlw, FPst, VPst, FAbv,VMPst,    B,CMAbv, VAbv, MBlw, MPst, MBlw,    H,    O, VBlw,
+   MPst, MPre, MAbv, MBlw,    O,    B, FAbv, FAbv, FPst, VBlw,    B,    B, VPre,    O,VMPst,   IS,
+      O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv,    O,   IS,VMBlw,    B,VMPst,VMAbv,VMPst,   CS,   CS,
+      B,    N,    N,    O,   HN, VPre, VBlw, VAbv,   IS,CMAbv,    O, VPst,    B,    R,    R,CMBlw,
+   VAbv, VPre,VMAbv,VMAbv,    H, VAbv,CMBlw,FMAbv,    B,   CS,   CS,    H,CMBlw,VMPst,    H,VMPst,
+   VAbv,VMAbv, VPst,   IS,    R, MPst,    R, MPst,CMBlw,    B,FMBlw, VBlw,VMAbv,    R, MBlw, MBlw,
+     GB, FBlw, FBlw,CMAbv,   IS, VBlw,   IS,   GB, VAbv,    R,VMPst,    G,    G,    J,    J,    J,
+     SB,   SE,    J,   HR,    G,    G,   HM,   HM,   HM,    O, VBlw,
 };
 static const uint16_t
-hb_use_u16[448] =
+hb_use_u16[456] =
 {
-    0,  0,  1,  2,  3,  4,  0,  5,  6,  0,  7,  0,  8,  9, 10, 11,
-    9, 12, 13,  9,  9, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
-   17, 25, 26, 20, 21, 27, 28, 29, 30, 31, 32, 33, 21, 34, 35,  0,
-   17, 36, 37, 20, 21, 38, 23, 39, 17, 40, 41, 42, 43, 44, 45, 46,
-   30,  0, 47, 48, 21, 49, 50, 51, 17,  0, 52, 48, 21, 53, 50, 54,
-   17, 55, 56, 48,  9, 57, 58, 59, 60, 61,  9, 62, 63, 64, 30, 65,
-   66, 67,  9, 68, 69,  9, 70, 71, 72, 73, 74, 75, 76,  0,  9,  9,
-   77, 78, 79, 80, 81, 82, 83, 84,  9, 85,  9, 86,  9, 87, 88, 89,
-    9, 90, 91, 92,  2,  0, 93,  0,  9, 94, 95,  9, 96,  0, 97, 98,
-   99,100, 30,  9,101,102,103,  9,104,105,  9,106,  9,107,108,109,
-    2,  2,110,  9,  9,111,112,  2,113,114,115,  9,116,  9,117,118,
-  119,120,121,  0,  0,122,123,124,  0,125,126,127,128,  0,129,130,
-  131,  0,  0,132,133,  0,  0,  9,134,135,136,  9,137,  0,  9,138,
-  139,  9,  9,140,141,  2,142,143,144,  9,145,146,147,  9,  9,148,
-  149,  2,150, 98,151,152,153,  2,  9,154,  9,155,156,  0,157,158,
-  159,  2,160,  0,  0,161,  0,162,  0,163,163,164, 33,165,166,167,
-    9,168, 94,  0,169,  0,  9,170,171,  0,172,  2,173,170,174,175,
-  176,  0,  0,177,178,  0,179,  9,  9,180,181,182,183,184,185,  9,
-    9,186,187,  0,188,  9,189,190,191,  9,  9,192,  9,193,194,105,
-  195,102,  9, 33,196,197,198,  0,199,200, 94,  9,  9,201,202,  2,
-  203, 20, 21,204,205,206,207,208,  9,209,210,211,212,  0,195,  9,
-    9,213,214,  2,215,216,217,218,  9,219,220,  2,221,222,  9,223,
-  224,103,225,  0,226,227,228,229,  9,230,231,  2,232,  9,  9,233,
-  234,  0,235,  9,  9,236,237,238,239,240, 21,  9,215,241,  7,  9,
-   70, 18,  9,242, 73,243,244,  9,  9,245,246,  2,247,  9,248,249,
-    9,250,251, 48,  9,252,253,  2,  9,254,255,256,  9,257,258,259,
-  260,260,261,262,263,  0,  9,264,105, 70, 94,265,  0,266, 70,267,
-  268,  0,269,  0,270,  2,271,  2,272,  2,129,129,160,160,160,129,
+    0,  0,  1,  2,  0,  3,  4,  5,  0,  6,  7,  0,  8,  0,  9, 10,
+   11, 12, 10, 13, 14, 10, 10, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+   24, 25, 18, 26, 27, 21, 22, 28, 29, 30, 31, 32, 33, 34, 22, 35,
+   36,  0, 18, 37, 38, 21, 22, 39, 24, 40, 18, 41, 42, 43, 44, 45,
+   46, 47, 31,  0, 48, 49, 22, 50, 51, 52, 18,  0, 53, 49, 22, 54,
+   51, 55, 18, 56, 57, 49, 10, 58, 59, 60, 61, 62, 10, 63, 64, 65,
+   31, 66, 67, 68, 10, 69, 70, 10, 71, 72, 73, 74, 75, 76, 77,  0,
+   10, 10, 78, 79, 80, 81, 82, 83, 84, 85, 10, 86, 10, 87, 10, 88,
+   89, 90, 10, 91, 92, 93,  2,  0, 94,  0, 10, 95, 96, 10, 97,  0,
+   98, 99,100,101, 31, 10,102,103,104, 10,105,106, 10,107, 10,108,
+  109,110,  2,  2,111, 10, 10,112,113,  2,114,115,116, 10,117, 10,
+  118,119,120,121,122,  0,  0,123,124,125,  0,126,127,128,129,  0,
+  130,131,132,  0,  0,133,134,  0,135,  0,  0, 10,136,137,138,  0,
+  139, 10,140,  0, 10,141,142, 10, 10,143,144,  2,145,146,147, 10,
+  148,149,150, 10, 10,151,152,  2,153, 99,154,155,156,  2, 10,157,
+   10,158,159,  0,160,161,162,  2,163,  0,  0,164,  0,165,  0,166,
+  166,167, 34,168,169,170, 10,171, 95,  0,172,  0, 10,173,174,  0,
+  175,  2,176,173,177,178,179,  0,  0,180,181,  0,182, 10, 10,183,
+  184,185,186,187,188, 10, 10,189,190,  0,191, 10,192,193,194, 10,
+   10,195, 10,196,197,106,198,103, 10, 34,199,200,201,  0,202,203,
+   95, 10, 10,204,205,  2,206, 21, 22,207,208,209,210,211, 10,212,
+  213,214,215,  0,198, 10, 10,216,217,  2,218,219,220,221, 10,222,
+  223,  2,224,225, 10,226,227,104,228,  0,229,230,231,232, 10,233,
+  234,  2,235, 10, 10,236,237,  0,238, 10, 10,239,240,241,242,243,
+   22, 10,218,244,  8, 10, 71, 19, 10,245, 74,246,247, 10, 10,248,
+  249,  2,250, 10,251,252, 10,253,254, 49, 10,255,256,  2,257,257,
+  257,258,259,260, 10,261,262,263,264,264,265,266,267,  0, 10,268,
+  106, 71, 95,269,  0,270, 71,271,272,  0,273,  0,274,  2,275,  2,
+  276,  2,130,130,163,163,163,130,
 };
 
 static inline unsigned
@@ -622,7 +636,7 @@ hb_use_b4 (const uint8_t* a, unsigned i)
 static inline uint_fast8_t
 hb_use_get_category (unsigned u)
 {
-  return u<921600u?hb_use_u8[3049+(((hb_use_u8[865+(((hb_use_u16[((hb_use_u8[353+(((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>1>>3>>4))<<4)+((u>>1>>3>>1>>3)&15u))])<<3)+((u>>1>>3>>1)&7u))])<<1)+((u>>1>>3)&1u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O;
+  return u<921600u?hb_use_u8[3105+(((hb_use_u8[889+(((hb_use_u16[((hb_use_u8[353+(((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>1>>3>>4))<<4)+((u>>1>>3>>1>>3)&15u))])<<3)+((u>>1>>3>>1)&7u))])<<1)+((u>>1>>3)&1u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O;
 }
 
 #endif
@@ -633,7 +647,9 @@ hb_use_get_category (unsigned u)
 #undef G
 #undef GB
 #undef H
+#undef HM
 #undef HN
+#undef HR
 #undef HVM
 #undef IS
 #undef J
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-use.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-use.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-use.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-use.cc	2024-11-20 13:56:33.000000000 +0000
@@ -377,6 +377,9 @@ reorder_syllable_use (hb_buffer_t *buffe
 #define POST_BASE_FLAGS64 (FLAG64 (USE(FAbv)) | \
 			   FLAG64 (USE(FBlw)) | \
 			   FLAG64 (USE(FPst)) | \
+			   FLAG64 (USE(FMAbv)) | \
+			   FLAG64 (USE(FMBlw)) | \
+			   FLAG64 (USE(FMPst)) | \
 			   FLAG64 (USE(MAbv)) | \
 			   FLAG64 (USE(MBlw)) | \
 			   FLAG64 (USE(MPst)) | \
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-vowel-constraints.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-vowel-constraints.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-vowel-constraints.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-shaper-vowel-constraints.cc	2024-11-20 13:56:33.000000000 +0000
@@ -10,8 +10,8 @@
  * # Date: 2015-03-12, 21:17:00 GMT [AG]
  * # Date: 2019-11-08, 23:22:00 GMT [AG]
  *
- * # Scripts-15.0.0.txt
- * # Date: 2022-04-26, 23:15:02 GMT
+ * # Scripts-15.1.0.txt
+ * # Date: 2023-07-28, 16:01:07 GMT
  */
 
 #include "hb.hh"
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-stat-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-stat-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-stat-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-stat-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -57,6 +57,16 @@ enum
   // Reserved = 0xFFFC				/* Reserved for future use — set to zero. */
 };
 
+static bool axis_value_is_outside_axis_range (hb_tag_t axis_tag, float axis_value,
+                                              const hb_hashmap_t<hb_tag_t, Triple> *user_axes_location)
+{
+  if (!user_axes_location->has (axis_tag))
+    return false;
+
+  Triple axis_range = user_axes_location->get (axis_tag);
+  return (axis_value < axis_range.minimum || axis_value > axis_range.maximum);
+}
+
 struct StatAxisRecord
 {
   int cmp (hb_tag_t key) const { return tag.cmp (key); }
@@ -96,23 +106,19 @@ struct AxisValueFormat1
   }
 
   bool keep_axis_value (const hb_array_t<const StatAxisRecord> axis_records,
-                        const hb_hashmap_t<hb_tag_t, float> *user_axes_location) const
+                        const hb_hashmap_t<hb_tag_t, Triple> *user_axes_location) const
   {
     hb_tag_t axis_tag = get_axis_tag (axis_records);
     float axis_value = get_value ();
 
-    if (!user_axes_location->has (axis_tag) ||
-        fabsf(axis_value - user_axes_location->get (axis_tag)) < 0.001f)
-      return true;
-
-    return false;
+    return !axis_value_is_outside_axis_range (axis_tag, axis_value, user_axes_location);
   }
 
   bool subset (hb_subset_context_t *c,
                const hb_array_t<const StatAxisRecord> axis_records) const
   {
     TRACE_SUBSET (this);
-    const hb_hashmap_t<hb_tag_t, float>* user_axes_location = &c->plan->user_axes_location;
+    const hb_hashmap_t<hb_tag_t, Triple>* user_axes_location = &c->plan->user_axes_location;
 
     if (keep_axis_value (axis_records, user_axes_location))
       return_trace (c->serializer->embed (this));
@@ -155,23 +161,19 @@ struct AxisValueFormat2
   }
 
   bool keep_axis_value (const hb_array_t<const StatAxisRecord> axis_records,
-                        const hb_hashmap_t<hb_tag_t, float> *user_axes_location) const
+                        const hb_hashmap_t<hb_tag_t, Triple> *user_axes_location) const
   {
     hb_tag_t axis_tag = get_axis_tag (axis_records);
     float axis_value = get_value ();
 
-    if (!user_axes_location->has (axis_tag) ||
-        fabsf(axis_value - user_axes_location->get (axis_tag)) < 0.001f)
-      return true;
-
-    return false;
+    return !axis_value_is_outside_axis_range (axis_tag, axis_value, user_axes_location);
   }
 
   bool subset (hb_subset_context_t *c,
                const hb_array_t<const StatAxisRecord> axis_records) const
   {
     TRACE_SUBSET (this);
-    const hb_hashmap_t<hb_tag_t, float>* user_axes_location = &c->plan->user_axes_location;
+    const hb_hashmap_t<hb_tag_t, Triple>* user_axes_location = &c->plan->user_axes_location;
 
     if (keep_axis_value (axis_records, user_axes_location))
       return_trace (c->serializer->embed (this));
@@ -218,23 +220,19 @@ struct AxisValueFormat3
   }
 
   bool keep_axis_value (const hb_array_t<const StatAxisRecord> axis_records,
-                        const hb_hashmap_t<hb_tag_t, float> *user_axes_location) const
+                        const hb_hashmap_t<hb_tag_t, Triple> *user_axes_location) const
   {
     hb_tag_t axis_tag = get_axis_tag (axis_records);
     float axis_value = get_value ();
 
-    if (!user_axes_location->has (axis_tag) ||
-        fabsf(axis_value - user_axes_location->get (axis_tag)) < 0.001f)
-      return true;
-
-    return false;
+    return !axis_value_is_outside_axis_range (axis_tag, axis_value, user_axes_location);
   }
 
   bool subset (hb_subset_context_t *c,
                const hb_array_t<const StatAxisRecord> axis_records) const
   {
     TRACE_SUBSET (this);
-    const hb_hashmap_t<hb_tag_t, float>* user_axes_location = &c->plan->user_axes_location;
+    const hb_hashmap_t<hb_tag_t, Triple>* user_axes_location = &c->plan->user_axes_location;
 
     if (keep_axis_value (axis_records, user_axes_location))
       return_trace (c->serializer->embed (this));
@@ -291,7 +289,7 @@ struct AxisValueFormat4
   { return axisValues.as_array (axisCount)[axis_index]; }
 
   bool keep_axis_value (const hb_array_t<const StatAxisRecord> axis_records,
-                        const hb_hashmap_t<hb_tag_t, float> *user_axes_location) const
+                        const hb_hashmap_t<hb_tag_t, Triple> *user_axes_location) const
   {
     hb_array_t<const AxisValueRecord> axis_value_records = axisValues.as_array (axisCount);
 
@@ -301,8 +299,7 @@ struct AxisValueFormat4
       float axis_value = rec.get_value ();
       hb_tag_t axis_tag = axis_records[axis_idx].get_axis_tag ();
 
-      if (user_axes_location->has (axis_tag) &&
-          fabsf(axis_value - user_axes_location->get (axis_tag)) > 0.001f)
+      if (axis_value_is_outside_axis_range (axis_tag, axis_value, user_axes_location))
         return false;
     }
 
@@ -313,7 +310,7 @@ struct AxisValueFormat4
                const hb_array_t<const StatAxisRecord> axis_records) const
   {
     TRACE_SUBSET (this);
-    const hb_hashmap_t<hb_tag_t, float> *user_axes_location = &c->plan->user_axes_location;
+    const hb_hashmap_t<hb_tag_t, Triple> *user_axes_location = &c->plan->user_axes_location;
     if (!keep_axis_value (axis_records, user_axes_location))
       return_trace (false);
 
@@ -330,6 +327,7 @@ struct AxisValueFormat4
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
                           axisValues.sanitize (c, axisCount)));
   }
 
@@ -351,7 +349,7 @@ struct AxisValueFormat4
 
 struct AxisValue
 {
-  bool get_value (unsigned int axis_index) const
+  float get_value (unsigned int axis_index) const
   {
     switch (u.format)
     {
@@ -359,7 +357,7 @@ struct AxisValue
     case 2: return u.format2.get_value ();
     case 3: return u.format3.get_value ();
     case 4: return u.format4.get_axis_record (axis_index).get_value ();
-    default:return 0;
+    default:return 0.f;
     }
   }
 
@@ -402,7 +400,7 @@ struct AxisValue
   }
 
   bool keep_axis_value (const hb_array_t<const StatAxisRecord> axis_records,
-                        hb_hashmap_t<hb_tag_t, float> *user_axes_location) const
+                        hb_hashmap_t<hb_tag_t, Triple> *user_axes_location) const
   {
     switch (u.format)
     {
@@ -419,6 +417,7 @@ struct AxisValue
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this)))
       return_trace (false);
+    hb_barrier ();
 
     switch (u.format)
     {
@@ -451,8 +450,6 @@ struct AxisValueOffsetArray: UnsizedArra
                const hb_array_t<const StatAxisRecord> axis_records) const
   {
     TRACE_SUBSET (this);
-    auto *out = c->serializer->start_embed (this);
-    if (unlikely (!out)) return_trace (false);
 
     auto axisValueOffsets = as_array (axisValueCount);
     count = 0;
@@ -488,7 +485,7 @@ struct STAT
     hb_array_t<const Offset16To<AxisValue>> axis_values = get_axis_value_offsets ();
     for (unsigned int i = 0; i < axis_values.length; i++)
     {
-      const AxisValue& axis_value = this+axis_values[i];
+      const AxisValue& axis_value = this+offsetToAxisValueOffsets+axis_values[i];
       if (axis_value.get_axis_index () == axis_index)
       {
 	if (value)
@@ -517,7 +514,7 @@ struct STAT
     return axis_value.get_value_name_id ();
   }
 
-  void collect_name_ids (hb_hashmap_t<hb_tag_t, float> *user_axes_location,
+  void collect_name_ids (hb_hashmap_t<hb_tag_t, Triple> *user_axes_location,
                          hb_set_t *nameids_to_retain /* OUT */) const
   {
     if (!has_data ()) return;
@@ -565,6 +562,7 @@ struct STAT
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
+			  hb_barrier () &&
 			  version.major == 1 &&
 			  version.minor > 0 &&
 			  designAxesOffset.sanitize (c, this, designAxisCount) &&
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-tag-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-tag-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-tag-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-tag-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -6,8 +6,8 @@
  *
  * on files with these headers:
  *
- * <meta name="updated_at" content="2022-01-28 10:00 PM" />
- * File-Date: 2022-03-02
+ * <meta name="updated_at" content="2023-09-30 01:21 AM" />
+ * File-Date: 2024-03-07
  */
 
 #ifndef HB_OT_TAG_TABLE_HH
@@ -31,7 +31,7 @@ static const LangTag ot_languages2[] = {
   {HB_TAG('b','i',' ',' '),	HB_TAG('B','I','S',' ')},	/* Bislama */
   {HB_TAG('b','i',' ',' '),	HB_TAG('C','P','P',' ')},	/* Bislama -> Creoles */
   {HB_TAG('b','m',' ',' '),	HB_TAG('B','M','B',' ')},	/* Bambara (Bamanankan) */
-  {HB_TAG('b','n',' ',' '),	HB_TAG('B','E','N',' ')},	/* Bengali */
+  {HB_TAG('b','n',' ',' '),	HB_TAG('B','E','N',' ')},	/* Bangla */
   {HB_TAG('b','o',' ',' '),	HB_TAG('T','I','B',' ')},	/* Tibetan */
   {HB_TAG('b','r',' ',' '),	HB_TAG('B','R','E',' ')},	/* Breton */
   {HB_TAG('b','s',' ',' '),	HB_TAG('B','O','S',' ')},	/* Bosnian */
@@ -64,7 +64,7 @@ static const LangTag ot_languages2[] = {
   {HB_TAG('f','r',' ',' '),	HB_TAG('F','R','A',' ')},	/* French */
   {HB_TAG('f','y',' ',' '),	HB_TAG('F','R','I',' ')},	/* Western Frisian -> Frisian */
   {HB_TAG('g','a',' ',' '),	HB_TAG('I','R','I',' ')},	/* Irish */
-  {HB_TAG('g','d',' ',' '),	HB_TAG('G','A','E',' ')},	/* Scottish Gaelic (Gaelic) */
+  {HB_TAG('g','d',' ',' '),	HB_TAG('G','A','E',' ')},	/* Scottish Gaelic */
   {HB_TAG('g','l',' ',' '),	HB_TAG('G','A','L',' ')},	/* Galician */
   {HB_TAG('g','n',' ',' '),	HB_TAG('G','U','A',' ')},	/* Guarani [macrolanguage] */
   {HB_TAG('g','u',' ',' '),	HB_TAG('G','U','J',' ')},	/* Gujarati */
@@ -132,7 +132,7 @@ static const LangTag ot_languages2[] = {
   {HB_TAG('m','l',' ',' '),	HB_TAG('M','A','L',' ')},	/* Malayalam -> Malayalam Traditional */
   {HB_TAG('m','l',' ',' '),	HB_TAG('M','L','R',' ')},	/* Malayalam -> Malayalam Reformed */
   {HB_TAG('m','n',' ',' '),	HB_TAG('M','N','G',' ')},	/* Mongolian [macrolanguage] */
-  {HB_TAG('m','o',' ',' '),	HB_TAG('M','O','L',' ')},	/* Moldavian (retired code) */
+  {HB_TAG('m','o',' ',' '),	HB_TAG('M','O','L',' ')},	/* Moldavian (retired code) -> Romanian (Moldova) */
   {HB_TAG('m','o',' ',' '),	HB_TAG('R','O','M',' ')},	/* Moldavian (retired code) -> Romanian */
   {HB_TAG('m','r',' ',' '),	HB_TAG('M','A','R',' ')},	/* Marathi */
   {HB_TAG('m','s',' ',' '),	HB_TAG('M','L','Y',' ')},	/* Malay [macrolanguage] */
@@ -153,7 +153,7 @@ static const LangTag ot_languages2[] = {
   {HB_TAG('o','c',' ',' '),	HB_TAG('O','C','I',' ')},	/* Occitan (post 1500) */
   {HB_TAG('o','j',' ',' '),	HB_TAG('O','J','B',' ')},	/* Ojibwa [macrolanguage] -> Ojibway */
   {HB_TAG('o','m',' ',' '),	HB_TAG('O','R','O',' ')},	/* Oromo [macrolanguage] */
-  {HB_TAG('o','r',' ',' '),	HB_TAG('O','R','I',' ')},	/* Odia (formerly Oriya) [macrolanguage] */
+  {HB_TAG('o','r',' ',' '),	HB_TAG('O','R','I',' ')},	/* Odia [macrolanguage] */
   {HB_TAG('o','s',' ',' '),	HB_TAG('O','S','S',' ')},	/* Ossetian */
   {HB_TAG('p','a',' ',' '),	HB_TAG('P','A','N',' ')},	/* Punjabi */
   {HB_TAG('p','i',' ',' '),	HB_TAG('P','A','L',' ')},	/* Pali */
@@ -166,7 +166,7 @@ static const LangTag ot_languages2[] = {
   {HB_TAG('r','o',' ',' '),	HB_TAG('R','O','M',' ')},	/* Romanian */
   {HB_TAG('r','u',' ',' '),	HB_TAG('R','U','S',' ')},	/* Russian */
   {HB_TAG('r','w',' ',' '),	HB_TAG('R','U','A',' ')},	/* Kinyarwanda */
-  {HB_TAG('s','a',' ',' '),	HB_TAG('S','A','N',' ')},	/* Sanskrit */
+  {HB_TAG('s','a',' ',' '),	HB_TAG('S','A','N',' ')},	/* Sanskrit [macrolanguage] */
   {HB_TAG('s','c',' ',' '),	HB_TAG('S','R','D',' ')},	/* Sardinian [macrolanguage] */
   {HB_TAG('s','d',' ',' '),	HB_TAG('S','N','D',' ')},	/* Sindhi */
   {HB_TAG('s','e',' ',' '),	HB_TAG('N','S','M',' ')},	/* Northern Sami */
@@ -257,7 +257,7 @@ static const LangTag ot_languages3[] = {
   {HB_TAG('a','i','i',' '),	HB_TAG('S','Y','R',' ')},	/* Assyrian Neo-Aramaic -> Syriac */
 /*{HB_TAG('a','i','o',' '),	HB_TAG('A','I','O',' ')},*/	/* Aiton */
   {HB_TAG('a','i','w',' '),	HB_TAG('A','R','I',' ')},	/* Aari */
-  {HB_TAG('a','j','p',' '),	HB_TAG('A','R','A',' ')},	/* South Levantine Arabic -> Arabic */
+  {HB_TAG('a','j','p',' '),	HB_TAG('A','R','A',' ')},	/* South Levantine Arabic (retired code) -> Arabic */
   {HB_TAG('a','j','t',' '),	HB_TAG('A','R','A',' ')},	/* Judeo-Tunisian Arabic (retired code) -> Arabic */
   {HB_TAG('a','k','b',' '),	HB_TAG('A','K','B',' ')},	/* Batak Angkola */
   {HB_TAG('a','k','b',' '),	HB_TAG('B','T','K',' ')},	/* Batak Angkola -> Batak */
@@ -269,7 +269,7 @@ static const LangTag ot_languages3[] = {
 /*{HB_TAG('a','n','g',' '),	HB_TAG('A','N','G',' ')},*/	/* Old English (ca. 450-1100) -> Anglo-Saxon */
   {HB_TAG('a','o','a',' '),	HB_TAG('C','P','P',' ')},	/* Angolar -> Creoles */
   {HB_TAG('a','p','a',' '),	HB_TAG('A','T','H',' ')},	/* Apache [collection] -> Athapaskan */
-  {HB_TAG('a','p','c',' '),	HB_TAG('A','R','A',' ')},	/* North Levantine Arabic -> Arabic */
+  {HB_TAG('a','p','c',' '),	HB_TAG('A','R','A',' ')},	/* Levantine Arabic -> Arabic */
   {HB_TAG('a','p','d',' '),	HB_TAG('A','R','A',' ')},	/* Sudanese Arabic -> Arabic */
   {HB_TAG('a','p','j',' '),	HB_TAG('A','T','H',' ')},	/* Jicarilla Apache -> Athapaskan */
   {HB_TAG('a','p','k',' '),	HB_TAG('A','T','H',' ')},	/* Kiowa Apache -> Athapaskan */
@@ -465,6 +465,7 @@ static const LangTag ot_languages3[] = {
   {HB_TAG('c','l','d',' '),	HB_TAG('S','Y','R',' ')},	/* Chaldean Neo-Aramaic -> Syriac */
   {HB_TAG('c','l','e',' '),	HB_TAG('C','C','H','N')},	/* Lealao Chinantec -> Chinantec */
   {HB_TAG('c','l','j',' '),	HB_TAG('Q','I','N',' ')},	/* Laitu Chin -> Chin */
+  {HB_TAG('c','l','s',' '),	HB_TAG('S','A','N',' ')},	/* Classical Sanskrit -> Sanskrit */
   {HB_TAG('c','l','t',' '),	HB_TAG('Q','I','N',' ')},	/* Lautu Chin -> Chin */
   {HB_TAG('c','m','n',' '),	HB_TAG('Z','H','S',' ')},	/* Mandarin Chinese -> Chinese, Simplified */
   {HB_TAG('c','m','r',' '),	HB_TAG('Q','I','N',' ')},	/* Mro-Khimi Chin -> Chin */
@@ -637,7 +638,7 @@ static const LangTag ot_languages3[] = {
   {HB_TAG('g','a','a',' '),	HB_TAG('G','A','D',' ')},	/* Ga */
   {HB_TAG('g','a','c',' '),	HB_TAG('C','P','P',' ')},	/* Mixed Great Andamanese -> Creoles */
   {HB_TAG('g','a','d',' '),	HB_TAG_NONE	       },	/* Gaddang != Ga */
-  {HB_TAG('g','a','e',' '),	HB_TAG_NONE	       },	/* Guarequena != Scottish Gaelic (Gaelic) */
+  {HB_TAG('g','a','e',' '),	HB_TAG_NONE	       },	/* Guarequena != Scottish Gaelic */
 /*{HB_TAG('g','a','g',' '),	HB_TAG('G','A','G',' ')},*/	/* Gagauz */
   {HB_TAG('g','a','l',' '),	HB_TAG_NONE	       },	/* Galolen != Galician */
   {HB_TAG('g','a','n',' '),	HB_TAG('Z','H','S',' ')},	/* Gan Chinese -> Chinese, Simplified */
@@ -1160,7 +1161,7 @@ static const LangTag ot_languages3[] = {
   {HB_TAG('o','r','o',' '),	HB_TAG_NONE	       },	/* Orokolo != Oromo */
   {HB_TAG('o','r','r',' '),	HB_TAG('I','J','O',' ')},	/* Oruma -> Ijo */
   {HB_TAG('o','r','s',' '),	HB_TAG('M','L','Y',' ')},	/* Orang Seletar -> Malay */
-  {HB_TAG('o','r','y',' '),	HB_TAG('O','R','I',' ')},	/* Odia (formerly Oriya) */
+  {HB_TAG('o','r','y',' '),	HB_TAG('O','R','I',' ')},	/* Odia */
   {HB_TAG('o','t','w',' '),	HB_TAG('O','J','B',' ')},	/* Ottawa -> Ojibway */
   {HB_TAG('o','u','a',' '),	HB_TAG('B','B','R',' ')},	/* Tagargrent -> Berber */
   {HB_TAG('p','a','a',' '),	HB_TAG_NONE	       },	/* Papuan [collection] != Palestinian Aramaic */
@@ -1211,6 +1212,7 @@ static const LangTag ot_languages3[] = {
   {HB_TAG('p','p','a',' '),	HB_TAG('B','A','G',' ')},	/* Pao (retired code) -> Baghelkhandi */
   {HB_TAG('p','r','e',' '),	HB_TAG('C','P','P',' ')},	/* Principense -> Creoles */
 /*{HB_TAG('p','r','o',' '),	HB_TAG('P','R','O',' ')},*/	/* Old Provençal (to 1500) -> Provençal / Old Provençal */
+  {HB_TAG('p','r','p',' '),	HB_TAG('G','U','J',' ')},	/* Parsi (retired code) -> Gujarati */
   {HB_TAG('p','r','s',' '),	HB_TAG('D','R','I',' ')},	/* Dari */
   {HB_TAG('p','r','s',' '),	HB_TAG('F','A','R',' ')},	/* Dari -> Persian */
   {HB_TAG('p','s','e',' '),	HB_TAG('M','L','Y',' ')},	/* Central Malay -> Malay */
@@ -1394,7 +1396,7 @@ static const LangTag ot_languages3[] = {
 /*{HB_TAG('s','n','k',' '),	HB_TAG('S','N','K',' ')},*/	/* Soninke */
   {HB_TAG('s','o','g',' '),	HB_TAG_NONE	       },	/* Sogdian != Sodo Gurage */
 /*{HB_TAG('s','o','p',' '),	HB_TAG('S','O','P',' ')},*/	/* Songe */
-  {HB_TAG('s','p','v',' '),	HB_TAG('O','R','I',' ')},	/* Sambalpuri -> Odia (formerly Oriya) */
+  {HB_TAG('s','p','v',' '),	HB_TAG('O','R','I',' ')},	/* Sambalpuri -> Odia */
   {HB_TAG('s','p','y',' '),	HB_TAG('K','A','L',' ')},	/* Sabaot -> Kalenjin */
   {HB_TAG('s','r','b',' '),	HB_TAG_NONE	       },	/* Sora != Serbian */
   {HB_TAG('s','r','c',' '),	HB_TAG('S','R','D',' ')},	/* Logudorese Sardinian -> Sardinian */
@@ -1439,7 +1441,7 @@ static const LangTag ot_languages3[] = {
   {HB_TAG('t','c','h',' '),	HB_TAG('C','P','P',' ')},	/* Turks And Caicos Creole English -> Creoles */
   {HB_TAG('t','c','p',' '),	HB_TAG('Q','I','N',' ')},	/* Tawr Chin -> Chin */
   {HB_TAG('t','c','s',' '),	HB_TAG('C','P','P',' ')},	/* Torres Strait Creole -> Creoles */
-  {HB_TAG('t','c','y',' '),	HB_TAG('T','U','L',' ')},	/* Tulu -> Tumbuka */
+  {HB_TAG('t','c','y',' '),	HB_TAG('T','U','L',' ')},	/* Tulu */
   {HB_TAG('t','c','z',' '),	HB_TAG('Q','I','N',' ')},	/* Thado Chin -> Chin */
 /*{HB_TAG('t','d','d',' '),	HB_TAG('T','D','D',' ')},*/	/* Tai Nüa -> Dehong Dai */
   {HB_TAG('t','d','x',' '),	HB_TAG('M','L','G',' ')},	/* Tandroy-Mahafaly Malagasy -> Malagasy */
@@ -1495,8 +1497,8 @@ static const LangTag ot_languages3[] = {
   {HB_TAG('t','t','q',' '),	HB_TAG('T','M','H',' ')},	/* Tawallammat Tamajaq -> Tamashek */
   {HB_TAG('t','t','q',' '),	HB_TAG('B','B','R',' ')},	/* Tawallammat Tamajaq -> Berber */
   {HB_TAG('t','u','a',' '),	HB_TAG_NONE	       },	/* Wiarumus != Turoyo Aramaic */
-  {HB_TAG('t','u','l',' '),	HB_TAG_NONE	       },	/* Tula != Tumbuka */
-/*{HB_TAG('t','u','m',' '),	HB_TAG('T','U','M',' ')},*/	/* Tumbuka -> Tulu */
+  {HB_TAG('t','u','l',' '),	HB_TAG_NONE	       },	/* Tula != Tulu */
+/*{HB_TAG('t','u','m',' '),	HB_TAG('T','U','M',' ')},*/	/* Tumbuka */
   {HB_TAG('t','u','u',' '),	HB_TAG('A','T','H',' ')},	/* Tututni -> Athapaskan */
   {HB_TAG('t','u','v',' '),	HB_TAG_NONE	       },	/* Turkana != Tuvin */
   {HB_TAG('t','u','y',' '),	HB_TAG('K','A','L',' ')},	/* Tugen -> Kalenjin */
@@ -1532,6 +1534,7 @@ static const LangTag ot_languages3[] = {
   {HB_TAG('v','l','s',' '),	HB_TAG('F','L','E',' ')},	/* Vlaams -> Dutch (Flemish) */
   {HB_TAG('v','m','w',' '),	HB_TAG('M','A','K',' ')},	/* Makhuwa */
 /*{HB_TAG('v','r','o',' '),	HB_TAG('V','R','O',' ')},*/	/* Võro */
+  {HB_TAG('v','s','n',' '),	HB_TAG('S','A','N',' ')},	/* Vedic Sanskrit -> Sanskrit */
   {HB_TAG('w','a','g',' '),	HB_TAG_NONE	       },	/* Wa'ema != Wagdi */
 /*{HB_TAG('w','a','r',' '),	HB_TAG('W','A','R',' ')},*/	/* Waray (Philippines) -> Waray-Waray */
   {HB_TAG('w','b','m',' '),	HB_TAG('W','A',' ',' ')},	/* Wa */
@@ -1581,6 +1584,7 @@ static const LangTag ot_languages3[] = {
   {HB_TAG('y','b','a',' '),	HB_TAG_NONE	       },	/* Yala != Yoruba */
   {HB_TAG('y','b','b',' '),	HB_TAG('B','M','L',' ')},	/* Yemba -> Bamileke */
   {HB_TAG('y','b','d',' '),	HB_TAG('A','R','K',' ')},	/* Yangbye (retired code) -> Rakhine */
+  {HB_TAG('y','c','r',' '),	HB_TAG_NONE	       },	/* Yilan Creole != Y-Cree */
   {HB_TAG('y','d','d',' '),	HB_TAG('J','I','I',' ')},	/* Eastern Yiddish -> Yiddish */
 /*{HB_TAG('y','g','p',' '),	HB_TAG('Y','G','P',' ')},*/	/* Gepo */
   {HB_TAG('y','i','h',' '),	HB_TAG('J','I','I',' ')},	/* Western Yiddish -> Yiddish */
@@ -1602,6 +1606,7 @@ static const LangTag ot_languages3[] = {
   {HB_TAG('z','g','n',' '),	HB_TAG('Z','H','A',' ')},	/* Guibian Zhuang -> Zhuang */
   {HB_TAG('z','h','d',' '),	HB_TAG('Z','H','A',' ')},	/* Dai Zhuang -> Zhuang */
   {HB_TAG('z','h','n',' '),	HB_TAG('Z','H','A',' ')},	/* Nong Zhuang -> Zhuang */
+  {HB_TAG('z','k','b',' '),	HB_TAG('K','H','A',' ')},	/* Koibal (retired code) -> Khakass */
   {HB_TAG('z','l','j',' '),	HB_TAG('Z','H','A',' ')},	/* Liujiang Zhuang -> Zhuang */
   {HB_TAG('z','l','m',' '),	HB_TAG('M','L','Y',' ')},	/* Malay */
   {HB_TAG('z','l','n',' '),	HB_TAG('Z','H','A',' ')},	/* Lianshan Zhuang -> Zhuang */
@@ -2640,7 +2645,7 @@ out:
       /* Romanian; Moldova */
       unsigned int i;
       hb_tag_t possible_tags[] = {
-	HB_TAG('M','O','L',' '),  /* Moldavian */
+	HB_TAG('M','O','L',' '),  /* Romanian (Moldova) */
 	HB_TAG('R','O','M',' '),  /* Romanian */
       };
       for (i = 0; i < 2 && i < *count; i++)
@@ -2917,7 +2922,7 @@ hb_ot_ambiguous_tag_to_language (hb_tag_
     return hb_language_from_string ("mn", -1);  /* Mongolian [macrolanguage] */
   case HB_TAG('M','N','K',' '):  /* Maninka */
     return hb_language_from_string ("man", -1);  /* Mandingo [macrolanguage] */
-  case HB_TAG('M','O','L',' '):  /* Moldavian */
+  case HB_TAG('M','O','L',' '):  /* Romanian (Moldova) */
     return hb_language_from_string ("ro-MD", -1);  /* Romanian; Moldova */
   case HB_TAG('M','O','N','T'):  /* Thailand Mon */
     return hb_language_from_string ("mnw-TH", -1);  /* Mon; Thailand */
@@ -2955,6 +2960,8 @@ hb_ot_ambiguous_tag_to_language (hb_tag_
     return hb_language_from_string ("ro", -1);  /* Romanian */
   case HB_TAG('R','O','Y',' '):  /* Romany */
     return hb_language_from_string ("rom", -1);  /* Romany [macrolanguage] */
+  case HB_TAG('S','A','N',' '):  /* Sanskrit */
+    return hb_language_from_string ("sa", -1);  /* Sanskrit [macrolanguage] */
   case HB_TAG('S','Q','I',' '):  /* Albanian */
     return hb_language_from_string ("sq", -1);  /* Albanian [macrolanguage] */
   case HB_TAG('S','R','B',' '):  /* Serbian */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-tag.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-tag.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-tag.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-tag.cc	2024-11-20 13:56:33.000000000 +0000
@@ -412,7 +412,7 @@ parse_private_use_subtag (const char
 /**
  * hb_ot_tags_from_script_and_language:
  * @script: an #hb_script_t to convert.
- * @language: an #hb_language_t to convert.
+ * @language: (nullable): an #hb_language_t to convert.
  * @script_count: (inout) (optional): maximum number of script tags to retrieve (IN)
  * and actual number of script tags retrieved (OUT)
  * @script_tags: (out) (optional): array of size at least @script_count to store the
@@ -547,7 +547,7 @@ hb_ot_tag_to_language (hb_tag_t tag)
       buf[3] = '-';
       str += 4;
     }
-    snprintf (str, 16, "x-hbot-%08x", tag);
+    snprintf (str, 16, "x-hbot-%08" PRIx32, tag);
     return hb_language_from_string (&*buf, -1);
   }
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-var-avar-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-var-avar-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-var-avar-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-var-avar-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -57,7 +57,7 @@ struct avarV2Tail
 
   protected:
   Offset32To<DeltaSetIndexMap>	varIdxMap;	/* Offset from the beginning of 'avar' table. */
-  Offset32To<VariationStore>	varStore;	/* Offset from the beginning of 'avar' table. */
+  Offset32To<ItemVariationStore>	varStore;	/* Offset from the beginning of 'avar' table. */
 
   public:
   DEFINE_SIZE_STATIC (8);
@@ -72,6 +72,65 @@ struct AxisValueMap
     return_trace (c->check_struct (this));
   }
 
+  void set_mapping (float from_coord, float to_coord)
+  {
+    coords[0].set_float (from_coord);
+    coords[1].set_float (to_coord);
+  }
+
+  bool is_outside_axis_range (const Triple& axis_range) const
+  {
+    float from_coord = coords[0].to_float ();
+    return !axis_range.contains (from_coord);
+  }
+
+  bool must_include () const
+  {
+    float from_coord = coords[0].to_float ();
+    float to_coord = coords[1].to_float ();
+    return (from_coord == -1.f && to_coord == -1.f) ||
+           (from_coord == 0.f && to_coord == 0.f) ||
+           (from_coord == 1.f && to_coord == 1.f);
+  }
+
+  void instantiate (const Triple& axis_range,
+                    const Triple& unmapped_range,
+                    const TripleDistances& triple_distances)
+  {
+    float from_coord = coords[0].to_float ();
+    float to_coord = coords[1].to_float ();
+
+    from_coord = renormalizeValue (from_coord, unmapped_range, triple_distances);
+    to_coord = renormalizeValue (to_coord, axis_range, triple_distances);
+
+    coords[0].set_float (from_coord);
+    coords[1].set_float (to_coord);
+  }
+
+  HB_INTERNAL static int cmp (const void *pa, const void *pb)
+  {
+    const AxisValueMap *a = (const AxisValueMap *) pa;
+    const AxisValueMap *b = (const AxisValueMap *) pb;
+
+    int a_from = a->coords[0].to_int ();
+    int b_from = b->coords[0].to_int ();
+    if (a_from != b_from)
+      return a_from - b_from;
+
+    /* this should never be reached. according to the spec, all of the axis
+     * value map records for a given axis must have different fromCoord values
+     * */
+    int a_to = a->coords[1].to_int ();
+    int b_to = b->coords[1].to_int ();
+    return a_to - b_to;
+  }
+
+  bool serialize (hb_serialize_context_t *c) const
+  {
+    TRACE_SERIALIZE (this);
+    return_trace (c->embed (this));
+  }
+
   public:
   F2DOT14	coords[2];
 //   F2DOT14	fromCoord;	/* A normalized coordinate value obtained using
@@ -122,6 +181,78 @@ struct SegmentMaps : Array16Of<AxisValue
 
   int unmap (int value) const { return map (value, 1, 0); }
 
+  Triple unmap_axis_range (const Triple& axis_range) const
+  {
+    F2DOT14 val, unmapped_val;
+
+    val.set_float (axis_range.minimum);
+    unmapped_val.set_int (unmap (val.to_int ()));
+    float unmapped_min = unmapped_val.to_float ();
+
+    val.set_float (axis_range.middle);
+    unmapped_val.set_int (unmap (val.to_int ()));
+    float unmapped_middle = unmapped_val.to_float ();
+
+    val.set_float (axis_range.maximum);
+    unmapped_val.set_int (unmap (val.to_int ()));
+    float unmapped_max = unmapped_val.to_float ();
+
+    return Triple{unmapped_min, unmapped_middle, unmapped_max};
+  }
+
+  bool subset (hb_subset_context_t *c, hb_tag_t axis_tag) const
+  {
+    TRACE_SUBSET (this);
+    /* avar mapped normalized axis range*/
+    Triple *axis_range;
+    if (!c->plan->axes_location.has (axis_tag, &axis_range))
+      return c->serializer->embed (*this);
+
+    TripleDistances *axis_triple_distances;
+    if (!c->plan->axes_triple_distances.has (axis_tag, &axis_triple_distances))
+      return_trace (false);
+
+    auto *out = c->serializer->start_embed (this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+
+    Triple unmapped_range = unmap_axis_range (*axis_range);
+
+    /* create a vector of retained mappings and sort */
+    hb_vector_t<AxisValueMap> value_mappings;
+    for (const auto& _ : as_array ())
+    {
+      if (_.is_outside_axis_range (unmapped_range))
+        continue;
+      AxisValueMap mapping;
+      mapping = _;
+      mapping.instantiate (*axis_range, unmapped_range, *axis_triple_distances);
+      /* (-1, -1), (0, 0), (1, 1) mappings will be added later, so avoid
+       * duplicates here */
+      if (mapping.must_include ())
+        continue;
+      value_mappings.push (mapping);
+    }
+
+    AxisValueMap m;
+    m.set_mapping (-1.f, -1.f);
+    value_mappings.push (m);
+
+    m.set_mapping (0.f, 0.f);
+    value_mappings.push (m);
+
+    m.set_mapping (1.f, 1.f);
+    value_mappings.push (m);
+
+    value_mappings.qsort ();
+
+    for (const auto& _ : value_mappings)
+    {
+      if (!_.serialize (c->serializer))
+        return_trace (false);
+    }
+    return_trace (c->serializer->check_assign (out->len, value_mappings.length, HB_SERIALIZE_ERROR_INT_OVERFLOW));
+  }
+
   public:
   DEFINE_SIZE_ARRAY (2, *this);
 };
@@ -142,6 +273,7 @@ struct avar
   {
     TRACE_SANITIZE (this);
     if (!(version.sanitize (c) &&
+	  hb_barrier () &&
 	  (version.major == 1
 #ifndef HB_NO_AVAR2
 	   || version.major == 2
@@ -162,6 +294,7 @@ struct avar
 #ifndef HB_NO_AVAR2
     if (version.major < 2)
       return_trace (true);
+    hb_barrier ();
 
     const auto &v2 = * (const avarV2Tail *) map;
     if (unlikely (!v2.sanitize (c, this)))
@@ -185,6 +318,7 @@ struct avar
 #ifndef HB_NO_AVAR2
     if (version.major < 2)
       return;
+    hb_barrier ();
 
     for (; count < axisCount; count++)
       map = &StructAfter<SegmentMaps> (*map);
@@ -209,7 +343,7 @@ struct avar
     for (unsigned i = 0; i < coords_length; i++)
       coords[i] = out[i];
 
-    OT::VariationStore::destroy_cache (var_store_cache);
+    OT::ItemVariationStore::destroy_cache (var_store_cache);
 #endif
   }
 
@@ -225,6 +359,39 @@ struct avar
     }
   }
 
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    unsigned retained_axis_count = c->plan->axes_index_map.get_population ();
+    if (!retained_axis_count) //all axes are pinned/dropped
+      return_trace (false);
+
+    avar *out = c->serializer->allocate_min<avar> ();
+    if (unlikely (!out)) return_trace (false);
+
+    out->version.major = 1;
+    out->version.minor = 0;
+    if (!c->serializer->check_assign (out->axisCount, retained_axis_count, HB_SERIALIZE_ERROR_INT_OVERFLOW))
+      return_trace (false);
+
+    const hb_map_t& axes_index_map = c->plan->axes_index_map;
+    const SegmentMaps *map = &firstAxisSegmentMaps;
+    unsigned count = axisCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (axes_index_map.has (i))
+      {
+        hb_tag_t *axis_tag;
+        if (!c->plan->axes_old_index_tag_map.has (i, &axis_tag))
+          return_trace (false);
+        if (!map->subset (c, *axis_tag))
+          return_trace (false);
+      }
+      map = &StructAfter<SegmentMaps> (*map);
+    }
+    return_trace (true);
+  }
+
   protected:
   FixedVersion<>version;	/* Version of the avar table
 				 * initially set to 0x00010000u */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-var-common.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-var-common.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-var-common.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-var-common.hh	2024-11-20 13:56:33.000000000 +0000
@@ -27,6 +27,8 @@
 #define HB_OT_VAR_COMMON_HH
 
 #include "hb-ot-layout-common.hh"
+#include "hb-priority-queue.hh"
+#include "hb-subset-instancer-iup.hh"
 
 
 namespace OT {
@@ -36,19 +38,14 @@ struct DeltaSetIndexMapFormat01
 {
   friend struct DeltaSetIndexMap;
 
+  unsigned get_size () const
+  { return min_size + mapCount * get_width (); }
+
   private:
   DeltaSetIndexMapFormat01* copy (hb_serialize_context_t *c) const
   {
     TRACE_SERIALIZE (this);
-    auto *out = c->start_embed (this);
-    if (unlikely (!out)) return_trace (nullptr);
-
-    unsigned total_size = min_size + mapCount * get_width ();
-    HBUINT8 *p = c->allocate_size<HBUINT8> (total_size);
-    if (unlikely (!p)) return_trace (nullptr);
-
-    hb_memcpy (p, this, HBUINT8::static_size * total_size);
-    return_trace (out);
+    return_trace (c->embed (this));
   }
 
   template <typename T>
@@ -69,14 +66,17 @@ struct DeltaSetIndexMapFormat01
     if (unlikely (!p)) return_trace (false);
     for (unsigned int i = 0; i < output_map.length; i++)
     {
-      unsigned int v = output_map[i];
-      unsigned int outer = v >> 16;
-      unsigned int inner = v & 0xFFFF;
-      unsigned int u = (outer << inner_bit_count) | inner;
-      for (unsigned int w = width; w > 0;)
+      unsigned int v = output_map.arrayZ[i];
+      if (v)
       {
-        p[--w] = u;
-        u >>= 8;
+	unsigned int outer = v >> 16;
+	unsigned int inner = v & 0xFFFF;
+	unsigned int u = (outer << inner_bit_count) | inner;
+	for (unsigned int w = width; w > 0;)
+	{
+	  p[--w] = u;
+	  u >>= 8;
+	}
       }
       p += width;
     }
@@ -120,6 +120,7 @@ struct DeltaSetIndexMapFormat01
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
                   c->check_range (mapDataZ.arrayZ,
                                   mapCount,
                                   get_width ()));
@@ -192,6 +193,7 @@ struct DeltaSetIndexMap
   {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return_trace (false);
+    hb_barrier ();
     switch (u.format) {
     case 0: return_trace (u.format0.sanitize (c));
     case 1: return_trace (u.format1.sanitize (c));
@@ -220,9 +222,9 @@ struct DeltaSetIndexMap
 };
 
 
-struct VarStoreInstancer
+struct ItemVarStoreInstancer
 {
-  VarStoreInstancer (const VariationStore *varStore,
+  ItemVarStoreInstancer (const ItemVariationStore *varStore,
 		     const DeltaSetIndexMap *varIdxMap,
 		     hb_array_t<int> coords) :
     varStore (varStore), varIdxMap (varIdxMap), coords (coords) {}
@@ -232,9 +234,9 @@ struct VarStoreInstancer
   /* according to the spec, if colr table has varStore but does not have
    * varIdxMap, then an implicit identity mapping is used */
   float operator() (uint32_t varIdx, unsigned short offset = 0) const
-  { return varStore->get_delta (varIdxMap ? varIdxMap->map (VarIdx::add (varIdx, offset)) : varIdx + offset, coords); }
+  { return coords ? varStore->get_delta (varIdxMap ? varIdxMap->map (VarIdx::add (varIdx, offset)) : varIdx + offset, coords) : 0; }
 
-  const VariationStore *varStore;
+  const ItemVariationStore *varStore;
   const DeltaSetIndexMap *varIdxMap;
   hb_array_t<int> coords;
 };
@@ -242,6 +244,7 @@ struct VarStoreInstancer
 /* https://docs.microsoft.com/en-us/typography/opentype/spec/otvarcommonformats#tuplevariationheader */
 struct TupleVariationHeader
 {
+  friend struct tuple_delta_t;
   unsigned get_size (unsigned axis_count) const
   { return min_size + get_all_tuples (axis_count).get_size (); }
 
@@ -250,14 +253,67 @@ struct TupleVariationHeader
   const TupleVariationHeader &get_next (unsigned axis_count) const
   { return StructAtOffset<TupleVariationHeader> (this, get_size (axis_count)); }
 
+  bool unpack_axis_tuples (unsigned axis_count,
+                           const hb_array_t<const F2DOT14> shared_tuples,
+                           const hb_map_t *axes_old_index_tag_map,
+                           hb_hashmap_t<hb_tag_t, Triple>& axis_tuples /* OUT */) const
+  {
+    const F2DOT14 *peak_tuple = nullptr;
+    if (has_peak ())
+      peak_tuple = get_peak_tuple (axis_count).arrayZ;
+    else
+    {
+      unsigned int index = get_index ();
+      if (unlikely ((index + 1) * axis_count > shared_tuples.length))
+        return false;
+      peak_tuple = shared_tuples.sub_array (axis_count * index, axis_count).arrayZ;
+    }
+
+    const F2DOT14 *start_tuple = nullptr;
+    const F2DOT14 *end_tuple = nullptr;
+    bool has_interm = has_intermediate ();
+
+    if (has_interm)
+    {
+      start_tuple = get_start_tuple (axis_count).arrayZ;
+      end_tuple = get_end_tuple (axis_count).arrayZ;
+    }
+
+    for (unsigned i = 0; i < axis_count; i++)
+    {
+      float peak = peak_tuple[i].to_float ();
+      if (peak == 0.f) continue;
+
+      hb_tag_t *axis_tag;
+      if (!axes_old_index_tag_map->has (i, &axis_tag))
+        return false;
+
+      float start, end;
+      if (has_interm)
+      {
+        start = start_tuple[i].to_float ();
+        end = end_tuple[i].to_float ();
+      }
+      else
+      {
+        start = hb_min (peak, 0.f);
+        end = hb_max (peak, 0.f);
+      }
+      axis_tuples.set (*axis_tag, Triple (start, peak, end));
+    }
+
+    return true;
+  }
+
   float calculate_scalar (hb_array_t<int> coords, unsigned int coord_count,
                           const hb_array_t<const F2DOT14> shared_tuples,
-			  const hb_vector_t<int> *shared_tuple_active_idx = nullptr) const
+			  const hb_vector_t<hb_pair_t<int,int>> *shared_tuple_active_idx = nullptr) const
   {
     const F2DOT14 *peak_tuple;
 
     unsigned start_idx = 0;
     unsigned end_idx = coord_count;
+    unsigned step = 1;
 
     if (has_peak ())
       peak_tuple = get_peak_tuple (coord_count).arrayZ;
@@ -270,11 +326,18 @@ struct TupleVariationHeader
 
       if (shared_tuple_active_idx)
       {
-        assert (index < shared_tuple_active_idx->length);
-	int v = (*shared_tuple_active_idx).arrayZ[index];
-	if (v != -1)
+	if (unlikely (index >= shared_tuple_active_idx->length))
+	  return 0.f;
+	auto _ = (*shared_tuple_active_idx).arrayZ[index];
+	if (_.second != -1)
+	{
+	  start_idx = _.first;
+	  end_idx = _.second + 1;
+	  step = _.second - _.first;
+	}
+	else if (_.first != -1)
 	{
-	  start_idx = v;
+	  start_idx = _.first;
 	  end_idx = start_idx + 1;
 	}
       }
@@ -290,7 +353,7 @@ struct TupleVariationHeader
     }
 
     float scalar = 1.f;
-    for (unsigned int i = start_idx; i < end_idx; i++)
+    for (unsigned int i = start_idx; i < end_idx; i += step)
     {
       int peak = peak_tuple[i].to_int ();
       if (!peak) continue;
@@ -332,6 +395,7 @@ struct TupleVariationHeader
       TupleIndexMask      = 0x0FFFu
     };
 
+    TuppleIndex& operator = (uint16_t i) { HBUINT16::operator= (i); return *this; }
     DEFINE_SIZE_STATIC (2);
   };
 
@@ -364,6 +428,789 @@ struct TupleVariationHeader
   DEFINE_SIZE_MIN (4);
 };
 
+enum packed_delta_flag_t
+{
+  DELTAS_ARE_ZERO      = 0x80,
+  DELTAS_ARE_WORDS     = 0x40,
+  DELTA_RUN_COUNT_MASK = 0x3F
+};
+
+struct tuple_delta_t
+{
+  static constexpr bool realloc_move = true;  // Watch out when adding new members!
+
+  public:
+  hb_hashmap_t<hb_tag_t, Triple> axis_tuples;
+
+  /* indices_length = point_count, indice[i] = 1 means point i is referenced */
+  hb_vector_t<bool> indices;
+  
+  hb_vector_t<float> deltas_x;
+  /* empty for cvar tuples */
+  hb_vector_t<float> deltas_y;
+
+  /* compiled data: header and deltas
+   * compiled point data is saved in a hashmap within tuple_variations_t cause
+   * some point sets might be reused by different tuple variations */
+  hb_vector_t<char> compiled_tuple_header;
+  hb_vector_t<char> compiled_deltas;
+
+  /* compiled peak coords, empty for non-gvar tuples */
+  hb_vector_t<char> compiled_peak_coords;
+
+  tuple_delta_t () = default;
+  tuple_delta_t (const tuple_delta_t& o) = default;
+
+  friend void swap (tuple_delta_t& a, tuple_delta_t& b) noexcept
+  {
+    hb_swap (a.axis_tuples, b.axis_tuples);
+    hb_swap (a.indices, b.indices);
+    hb_swap (a.deltas_x, b.deltas_x);
+    hb_swap (a.deltas_y, b.deltas_y);
+    hb_swap (a.compiled_tuple_header, b.compiled_tuple_header);
+    hb_swap (a.compiled_deltas, b.compiled_deltas);
+    hb_swap (a.compiled_peak_coords, b.compiled_peak_coords);
+  }
+
+  tuple_delta_t (tuple_delta_t&& o)  noexcept : tuple_delta_t ()
+  { hb_swap (*this, o); }
+
+  tuple_delta_t& operator = (tuple_delta_t&& o) noexcept
+  {
+    hb_swap (*this, o);
+    return *this;
+  }
+
+  void remove_axis (hb_tag_t axis_tag)
+  { axis_tuples.del (axis_tag); }
+
+  bool set_tent (hb_tag_t axis_tag, Triple tent)
+  { return axis_tuples.set (axis_tag, tent); }
+
+  tuple_delta_t& operator += (const tuple_delta_t& o)
+  {
+    unsigned num = indices.length;
+    for (unsigned i = 0; i < num; i++)
+    {
+      if (indices.arrayZ[i])
+      {
+        if (o.indices.arrayZ[i])
+        {
+          deltas_x[i] += o.deltas_x[i];
+          if (deltas_y && o.deltas_y)
+            deltas_y[i] += o.deltas_y[i];
+        }
+      }
+      else
+      {
+        if (!o.indices.arrayZ[i]) continue;
+        indices.arrayZ[i] = true;
+        deltas_x[i] = o.deltas_x[i];
+        if (deltas_y && o.deltas_y)
+          deltas_y[i] = o.deltas_y[i];
+      }
+    }
+    return *this;
+  }
+
+  tuple_delta_t& operator *= (float scalar)
+  {
+    if (scalar == 1.0f)
+      return *this;
+
+    unsigned num = indices.length;
+    if (deltas_y)
+      for (unsigned i = 0; i < num; i++)
+      {
+	if (!indices.arrayZ[i]) continue;
+	deltas_x[i] *= scalar;
+	deltas_y[i] *= scalar;
+      }
+    else
+      for (unsigned i = 0; i < num; i++)
+      {
+	if (!indices.arrayZ[i]) continue;
+	deltas_x[i] *= scalar;
+      }
+    return *this;
+  }
+
+  hb_vector_t<tuple_delta_t> change_tuple_var_axis_limit (hb_tag_t axis_tag, Triple axis_limit,
+                                                          TripleDistances axis_triple_distances) const
+  {
+    hb_vector_t<tuple_delta_t> out;
+    Triple *tent;
+    if (!axis_tuples.has (axis_tag, &tent))
+    {
+      out.push (*this);
+      return out;
+    }
+
+    if ((tent->minimum < 0.f && tent->maximum > 0.f) ||
+        !(tent->minimum <= tent->middle && tent->middle <= tent->maximum))
+      return out;
+
+    if (tent->middle == 0.f)
+    {
+      out.push (*this);
+      return out;
+    }
+
+    result_t solutions = rebase_tent (*tent, axis_limit, axis_triple_distances);
+    for (auto t : solutions)
+    {
+      tuple_delta_t new_var = *this;
+      if (t.second == Triple ())
+        new_var.remove_axis (axis_tag);
+      else
+        new_var.set_tent (axis_tag, t.second);
+
+      new_var *= t.first;
+      out.push (std::move (new_var));
+    }
+
+    return out;
+  }
+
+  bool compile_peak_coords (const hb_map_t& axes_index_map,
+                            const hb_map_t& axes_old_index_tag_map)
+  {
+    unsigned axis_count = axes_index_map.get_population ();
+    if (unlikely (!compiled_peak_coords.alloc (axis_count * F2DOT14::static_size)))
+      return false;
+
+    unsigned orig_axis_count = axes_old_index_tag_map.get_population ();
+    for (unsigned i = 0; i < orig_axis_count; i++)
+    {
+      if (!axes_index_map.has (i))
+        continue;
+
+      hb_tag_t axis_tag = axes_old_index_tag_map.get (i);
+      Triple *coords;
+      F2DOT14 peak_coord;
+      if (axis_tuples.has (axis_tag, &coords))
+        peak_coord.set_float (coords->middle);
+      else
+        peak_coord.set_int (0);
+
+      /* push F2DOT14 value into char vector */
+      int16_t val = peak_coord.to_int ();
+      compiled_peak_coords.push (static_cast<char> (val >> 8));
+      compiled_peak_coords.push (static_cast<char> (val & 0xFF));
+    }
+
+    return !compiled_peak_coords.in_error ();
+  }
+
+  /* deltas should be compiled already before we compile tuple
+   * variation header cause we need to fill in the size of the
+   * serialized data for this tuple variation */
+  bool compile_tuple_var_header (const hb_map_t& axes_index_map,
+                                 unsigned points_data_length,
+                                 const hb_map_t& axes_old_index_tag_map,
+                                 const hb_hashmap_t<const hb_vector_t<char>*, unsigned>* shared_tuples_idx_map)
+  {
+    /* compiled_deltas could be empty after iup delta optimization, we can skip
+     * compiling this tuple and return true */
+    if (!compiled_deltas) return true;
+
+    unsigned cur_axis_count = axes_index_map.get_population ();
+    /* allocate enough memory: 1 peak + 2 intermediate coords + fixed header size */
+    unsigned alloc_len = 3 * cur_axis_count * (F2DOT14::static_size) + 4;
+    if (unlikely (!compiled_tuple_header.resize (alloc_len))) return false;
+
+    unsigned flag = 0;
+    /* skip the first 4 header bytes: variationDataSize+tupleIndex */
+    F2DOT14* p = reinterpret_cast<F2DOT14 *> (compiled_tuple_header.begin () + 4);
+    F2DOT14* end = reinterpret_cast<F2DOT14 *> (compiled_tuple_header.end ());
+    hb_array_t<F2DOT14> coords (p, end - p);
+
+    /* encode peak coords */
+    unsigned peak_count = 0;
+    unsigned *shared_tuple_idx;
+    if (shared_tuples_idx_map &&
+        shared_tuples_idx_map->has (&compiled_peak_coords, &shared_tuple_idx))
+    {
+      flag = *shared_tuple_idx;
+    }
+    else
+    {
+      peak_count = encode_peak_coords(coords, flag, axes_index_map, axes_old_index_tag_map);
+      if (!peak_count) return false;
+    }
+
+    /* encode interim coords, it's optional so returned num could be 0 */
+    unsigned interim_count = encode_interm_coords (coords.sub_array (peak_count), flag, axes_index_map, axes_old_index_tag_map);
+
+    /* pointdata length = 0 implies "use shared points" */
+    if (points_data_length)
+      flag |= TupleVariationHeader::TuppleIndex::PrivatePointNumbers;
+
+    unsigned serialized_data_size = points_data_length + compiled_deltas.length;
+    TupleVariationHeader *o = reinterpret_cast<TupleVariationHeader *> (compiled_tuple_header.begin ());
+    o->varDataSize = serialized_data_size;
+    o->tupleIndex = flag;
+
+    unsigned total_header_len = 4 + (peak_count + interim_count) * (F2DOT14::static_size);
+    return compiled_tuple_header.resize (total_header_len);
+  }
+
+  unsigned encode_peak_coords (hb_array_t<F2DOT14> peak_coords,
+                               unsigned& flag,
+                               const hb_map_t& axes_index_map,
+                               const hb_map_t& axes_old_index_tag_map) const
+  {
+    unsigned orig_axis_count = axes_old_index_tag_map.get_population ();
+    auto it = peak_coords.iter ();
+    unsigned count = 0;
+    for (unsigned i = 0; i < orig_axis_count; i++)
+    {
+      if (!axes_index_map.has (i)) /* axis pinned */
+        continue;
+      hb_tag_t axis_tag = axes_old_index_tag_map.get (i);
+      Triple *coords;
+      if (!axis_tuples.has (axis_tag, &coords))
+        (*it).set_int (0);
+      else
+        (*it).set_float (coords->middle);
+      it++;
+      count++;
+    }
+    flag |= TupleVariationHeader::TuppleIndex::EmbeddedPeakTuple;
+    return count;
+  }
+
+  /* if no need to encode intermediate coords, then just return p */
+  unsigned encode_interm_coords (hb_array_t<F2DOT14> coords,
+                                 unsigned& flag,
+                                 const hb_map_t& axes_index_map,
+                                 const hb_map_t& axes_old_index_tag_map) const
+  {
+    unsigned orig_axis_count = axes_old_index_tag_map.get_population ();
+    unsigned cur_axis_count = axes_index_map.get_population ();
+
+    auto start_coords_iter = coords.sub_array (0, cur_axis_count).iter ();
+    auto end_coords_iter = coords.sub_array (cur_axis_count).iter ();
+    bool encode_needed = false;
+    unsigned count = 0;
+    for (unsigned i = 0; i < orig_axis_count; i++)
+    {
+      if (!axes_index_map.has (i)) /* axis pinned */
+        continue;
+      hb_tag_t axis_tag = axes_old_index_tag_map.get (i);
+      Triple *coords;
+      float min_val = 0.f, val = 0.f, max_val = 0.f;
+      if (axis_tuples.has (axis_tag, &coords))
+      {
+        min_val = coords->minimum;
+        val = coords->middle;
+        max_val = coords->maximum;
+      }
+
+      (*start_coords_iter).set_float (min_val);
+      (*end_coords_iter).set_float (max_val);
+
+      start_coords_iter++;
+      end_coords_iter++;
+      count += 2;
+      if (min_val != hb_min (val, 0.f) || max_val != hb_max (val, 0.f))
+        encode_needed = true;
+    }
+
+    if (encode_needed)
+    {
+      flag |= TupleVariationHeader::TuppleIndex::IntermediateRegion;
+      return count;
+    }
+    return 0;
+  }
+
+  bool compile_deltas ()
+  { return compile_deltas (indices, deltas_x, deltas_y, compiled_deltas); }
+
+  bool compile_deltas (const hb_vector_t<bool> &point_indices,
+                       const hb_vector_t<float> &x_deltas,
+                       const hb_vector_t<float> &y_deltas,
+                       hb_vector_t<char> &compiled_deltas /* OUT */)
+  {
+    hb_vector_t<int> rounded_deltas;
+    if (unlikely (!rounded_deltas.alloc (point_indices.length)))
+      return false;
+
+    for (unsigned i = 0; i < point_indices.length; i++)
+    {
+      if (!point_indices[i]) continue;
+      int rounded_delta = (int) roundf (x_deltas.arrayZ[i]);
+      rounded_deltas.push (rounded_delta);
+    }
+
+    if (!rounded_deltas) return true;
+    /* allocate enough memories 3 * num_deltas */
+    unsigned alloc_len = 3 * rounded_deltas.length;
+    if (y_deltas)
+      alloc_len *= 2;
+
+    if (unlikely (!compiled_deltas.resize (alloc_len))) return false;
+
+    unsigned i = 0;
+    unsigned encoded_len = encode_delta_run (i, compiled_deltas.as_array (), rounded_deltas);
+
+    if (y_deltas)
+    {
+      /* reuse the rounded_deltas vector, check that y_deltas have the same num of deltas as x_deltas */
+      unsigned j = 0;
+      for (unsigned idx = 0; idx < point_indices.length; idx++)
+      {
+        if (!point_indices[idx]) continue;
+        int rounded_delta = (int) roundf (y_deltas.arrayZ[idx]);
+
+        if (j >= rounded_deltas.length) return false;
+
+        rounded_deltas[j++] = rounded_delta;
+      }
+
+      if (j != rounded_deltas.length) return false;
+      /* reset i because we reuse rounded_deltas for y_deltas */
+      i = 0;
+      encoded_len += encode_delta_run (i, compiled_deltas.as_array ().sub_array (encoded_len), rounded_deltas);
+    }
+    return compiled_deltas.resize (encoded_len);
+  }
+
+  unsigned encode_delta_run (unsigned& i,
+                             hb_array_t<char> encoded_bytes,
+                             const hb_vector_t<int>& deltas) const
+  {
+    unsigned num_deltas = deltas.length;
+    unsigned encoded_len = 0;
+    while (i < num_deltas)
+    {
+      int val = deltas.arrayZ[i];
+      if (val == 0)
+        encoded_len += encode_delta_run_as_zeroes (i, encoded_bytes.sub_array (encoded_len), deltas);
+      else if (val >= -128 && val <= 127)
+        encoded_len += encode_delta_run_as_bytes (i, encoded_bytes.sub_array (encoded_len), deltas);
+      else
+        encoded_len += encode_delta_run_as_words (i, encoded_bytes.sub_array (encoded_len), deltas);
+    }
+    return encoded_len;
+  }
+
+  unsigned encode_delta_run_as_zeroes (unsigned& i,
+                                       hb_array_t<char> encoded_bytes,
+                                       const hb_vector_t<int>& deltas) const
+  {
+    unsigned num_deltas = deltas.length;
+    unsigned run_length = 0;
+    auto it = encoded_bytes.iter ();
+    unsigned encoded_len = 0;
+    while (i < num_deltas && deltas.arrayZ[i] == 0)
+    {
+      i++;
+      run_length++;
+    }
+
+    while (run_length >= 64)
+    {
+      *it++ = char (DELTAS_ARE_ZERO | 63);
+      run_length -= 64;
+      encoded_len++;
+    }
+
+    if (run_length)
+    {
+      *it++ = char (DELTAS_ARE_ZERO | (run_length - 1));
+      encoded_len++;
+    }
+    return encoded_len;
+  }
+
+  unsigned encode_delta_run_as_bytes (unsigned &i,
+                                      hb_array_t<char> encoded_bytes,
+                                      const hb_vector_t<int>& deltas) const
+  {
+    unsigned start = i;
+    unsigned num_deltas = deltas.length;
+    while (i < num_deltas)
+    {
+      int val = deltas.arrayZ[i];
+      if (val > 127 || val < -128)
+        break;
+
+      /* from fonttools: if there're 2 or more zeros in a sequence,
+       * it is better to start a new run to save bytes. */
+      if (val == 0 && i + 1 < num_deltas && deltas.arrayZ[i+1] == 0)
+        break;
+
+      i++;
+    }
+    unsigned run_length = i - start;
+
+    unsigned encoded_len = 0;
+    auto it = encoded_bytes.iter ();
+
+    while (run_length >= 64)
+    {
+      *it++ = 63;
+      encoded_len++;
+
+      for (unsigned j = 0; j < 64; j++)
+      {
+        *it++ = static_cast<char> (deltas.arrayZ[start + j]);
+        encoded_len++;
+      }
+
+      start += 64;
+      run_length -= 64;
+    }
+
+    if (run_length)
+    {
+      *it++ = run_length - 1;
+      encoded_len++;
+
+      while (start < i)
+      {
+        *it++ = static_cast<char> (deltas.arrayZ[start++]);
+        encoded_len++;
+      }
+    }
+
+    return encoded_len;
+  }
+
+  unsigned encode_delta_run_as_words (unsigned &i,
+                                      hb_array_t<char> encoded_bytes,
+                                      const hb_vector_t<int>& deltas) const
+  {
+    unsigned start = i;
+    unsigned num_deltas = deltas.length;
+    while (i < num_deltas)
+    {
+      int val = deltas.arrayZ[i];
+
+      /* start a new run for a single zero value*/
+      if (val == 0) break;
+
+      /* from fonttools: continue word-encoded run if there's only one
+       * single value in the range [-128, 127] because it is more compact.
+       * Only start a new run when there're 2 continuous such values. */
+      if (val >= -128 && val <= 127 &&
+          i + 1 < num_deltas &&
+          deltas.arrayZ[i+1] >= -128 && deltas.arrayZ[i+1] <= 127)
+        break;
+
+      i++;
+    }
+
+    unsigned run_length = i - start;
+    auto it = encoded_bytes.iter ();
+    unsigned encoded_len = 0;
+    while (run_length >= 64)
+    {
+      *it++ = (DELTAS_ARE_WORDS | 63);
+      encoded_len++;
+
+      for (unsigned j = 0; j < 64; j++)
+      {
+        int16_t delta_val = deltas.arrayZ[start + j];
+        *it++ = static_cast<char> (delta_val >> 8);
+        *it++ = static_cast<char> (delta_val & 0xFF);
+
+        encoded_len += 2;
+      }
+
+      start += 64;
+      run_length -= 64;
+    }
+
+    if (run_length)
+    {
+      *it++ = (DELTAS_ARE_WORDS | (run_length - 1));
+      encoded_len++;
+      while (start < i)
+      {
+        int16_t delta_val = deltas.arrayZ[start++];
+        *it++ = static_cast<char> (delta_val >> 8);
+        *it++ = static_cast<char> (delta_val & 0xFF);
+
+        encoded_len += 2;
+      }
+    }
+    return encoded_len;
+  }
+
+  bool calc_inferred_deltas (const contour_point_vector_t& orig_points)
+  {
+    unsigned point_count = orig_points.length;
+    if (point_count != indices.length)
+      return false;
+
+    unsigned ref_count = 0;
+    hb_vector_t<unsigned> end_points;
+
+    for (unsigned i = 0; i < point_count; i++)
+    {
+      if (indices.arrayZ[i])
+        ref_count++;
+      if (orig_points.arrayZ[i].is_end_point)
+        end_points.push (i);
+    }
+    /* all points are referenced, nothing to do */
+    if (ref_count == point_count)
+      return true;
+    if (unlikely (end_points.in_error ())) return false;
+
+    hb_set_t inferred_idxes;
+    unsigned start_point = 0;
+    for (unsigned end_point : end_points)
+    {
+      /* Check the number of unreferenced points in a contour. If no unref points or no ref points, nothing to do. */
+      unsigned unref_count = 0;
+      for (unsigned i = start_point; i < end_point + 1; i++)
+        unref_count += indices.arrayZ[i];
+      unref_count = (end_point - start_point + 1) - unref_count;
+
+      unsigned j = start_point;
+      if (unref_count == 0 || unref_count > end_point - start_point)
+        goto no_more_gaps;
+      for (;;)
+      {
+        /* Locate the next gap of unreferenced points between two referenced points prev and next.
+         * Note that a gap may wrap around at left (start_point) and/or at right (end_point).
+         */
+        unsigned int prev, next, i;
+        for (;;)
+        {
+          i = j;
+          j = next_index (i, start_point, end_point);
+          if (indices.arrayZ[i] && !indices.arrayZ[j]) break;
+        }
+        prev = j = i;
+        for (;;)
+        {
+          i = j;
+          j = next_index (i, start_point, end_point);
+          if (!indices.arrayZ[i] && indices.arrayZ[j]) break;
+        }
+        next = j;
+       /* Infer deltas for all unref points in the gap between prev and next */
+        i = prev;
+        for (;;)
+        {
+          i = next_index (i, start_point, end_point);
+          if (i == next) break;
+          deltas_x.arrayZ[i] = infer_delta (orig_points.arrayZ[i].x, orig_points.arrayZ[prev].x, orig_points.arrayZ[next].x,
+                                            deltas_x.arrayZ[prev], deltas_x.arrayZ[next]);
+          deltas_y.arrayZ[i] = infer_delta (orig_points.arrayZ[i].y, orig_points.arrayZ[prev].y, orig_points.arrayZ[next].y,
+                                            deltas_y.arrayZ[prev], deltas_y.arrayZ[next]);
+          inferred_idxes.add (i);
+          if (--unref_count == 0) goto no_more_gaps;
+        }
+      }
+    no_more_gaps:
+      start_point = end_point + 1;
+    }
+
+    for (unsigned i = 0; i < point_count; i++)
+    {
+      /* if points are not referenced and deltas are not inferred, set to 0.
+       * reference all points for gvar */
+      if ( !indices[i])
+      {
+        if (!inferred_idxes.has (i))
+        {
+          deltas_x.arrayZ[i] = 0.f;
+          deltas_y.arrayZ[i] = 0.f;
+        }
+        indices[i] = true;
+      }
+    }
+    return true;
+  }
+
+  bool optimize (const contour_point_vector_t& contour_points,
+                 bool is_composite,
+                 float tolerance = 0.5f)
+  {
+    unsigned count = contour_points.length;
+    if (deltas_x.length != count ||
+        deltas_y.length != count)
+      return false;
+
+    hb_vector_t<bool> opt_indices;
+    hb_vector_t<int> rounded_x_deltas, rounded_y_deltas;
+
+    if (unlikely (!rounded_x_deltas.alloc (count) ||
+                  !rounded_y_deltas.alloc (count)))
+      return false;
+
+    for (unsigned i = 0; i < count; i++)
+    {
+      int rounded_x_delta = (int) roundf (deltas_x.arrayZ[i]);
+      int rounded_y_delta = (int) roundf (deltas_y.arrayZ[i]);
+      rounded_x_deltas.push (rounded_x_delta);
+      rounded_y_deltas.push (rounded_y_delta);
+    }
+
+    if (!iup_delta_optimize (contour_points, rounded_x_deltas, rounded_y_deltas, opt_indices, tolerance))
+      return false;
+
+    unsigned ref_count = 0;
+    for (bool ref_flag : opt_indices)
+       ref_count += ref_flag;
+
+    if (ref_count == count) return true;
+
+    hb_vector_t<float> opt_deltas_x, opt_deltas_y;
+    bool is_comp_glyph_wo_deltas = (is_composite && ref_count == 0);
+    if (is_comp_glyph_wo_deltas)
+    {
+      if (unlikely (!opt_deltas_x.resize (count) ||
+                    !opt_deltas_y.resize (count)))
+        return false;
+
+      opt_indices.arrayZ[0] = true;
+      for (unsigned i = 1; i < count; i++)
+        opt_indices.arrayZ[i] = false;
+    }
+
+    hb_vector_t<char> opt_point_data;
+    if (!compile_point_set (opt_indices, opt_point_data))
+      return false;
+    hb_vector_t<char> opt_deltas_data;
+    if (!compile_deltas (opt_indices,
+                         is_comp_glyph_wo_deltas ? opt_deltas_x : deltas_x,
+                         is_comp_glyph_wo_deltas ? opt_deltas_y : deltas_y,
+                         opt_deltas_data))
+      return false;
+
+    hb_vector_t<char> point_data;
+    if (!compile_point_set (indices, point_data))
+      return false;
+    hb_vector_t<char> deltas_data;
+    if (!compile_deltas (indices, deltas_x, deltas_y, deltas_data))
+      return false;
+
+    if (opt_point_data.length + opt_deltas_data.length < point_data.length + deltas_data.length)
+    {
+      indices.fini ();
+      indices = std::move (opt_indices);
+
+      if (is_comp_glyph_wo_deltas)
+      {
+        deltas_x.fini ();
+        deltas_x = std::move (opt_deltas_x);
+
+        deltas_y.fini ();
+        deltas_y = std::move (opt_deltas_y);
+      }
+    }
+    return !indices.in_error () && !deltas_x.in_error () && !deltas_y.in_error ();
+  }
+
+  static bool compile_point_set (const hb_vector_t<bool> &point_indices,
+                                 hb_vector_t<char>& compiled_points /* OUT */)
+  {
+    unsigned num_points = 0;
+    for (bool i : point_indices)
+      if (i) num_points++;
+
+    /* when iup optimization is enabled, num of referenced points could be 0 */
+    if (!num_points) return true;
+
+    unsigned indices_length = point_indices.length;
+    /* If the points set consists of all points in the glyph, it's encoded with a
+     * single zero byte */
+    if (num_points == indices_length)
+      return compiled_points.resize (1);
+
+    /* allocate enough memories: 2 bytes for count + 3 bytes for each point */
+    unsigned num_bytes = 2 + 3 *num_points;
+    if (unlikely (!compiled_points.resize (num_bytes, false)))
+      return false;
+
+    unsigned pos = 0;
+    /* binary data starts with the total number of reference points */
+    if (num_points < 0x80)
+      compiled_points.arrayZ[pos++] = num_points;
+    else
+    {
+      compiled_points.arrayZ[pos++] = ((num_points >> 8) | 0x80);
+      compiled_points.arrayZ[pos++] = num_points & 0xFF;
+    }
+
+    const unsigned max_run_length = 0x7F;
+    unsigned i = 0;
+    unsigned last_value = 0;
+    unsigned num_encoded = 0;
+    while (i < indices_length && num_encoded < num_points)
+    {
+      unsigned run_length = 0;
+      unsigned header_pos = pos;
+      compiled_points.arrayZ[pos++] = 0;
+
+      bool use_byte_encoding = false;
+      bool new_run = true;
+      while (i < indices_length && num_encoded < num_points &&
+             run_length <= max_run_length)
+      {
+        // find out next referenced point index
+        while (i < indices_length && !point_indices[i])
+          i++;
+
+        if (i >= indices_length) break;
+
+        unsigned cur_value = i;
+        unsigned delta = cur_value - last_value;
+
+        if (new_run)
+        {
+          use_byte_encoding = (delta <= 0xFF);
+          new_run = false;
+        }
+
+        if (use_byte_encoding && delta > 0xFF)
+          break;
+
+        if (use_byte_encoding)
+          compiled_points.arrayZ[pos++] = delta;
+        else
+        {
+          compiled_points.arrayZ[pos++] = delta >> 8;
+          compiled_points.arrayZ[pos++] = delta & 0xFF;
+        }
+        i++;
+        last_value = cur_value;
+        run_length++;
+        num_encoded++;
+      }
+
+      if (use_byte_encoding)
+        compiled_points.arrayZ[header_pos] = run_length - 1;
+      else
+        compiled_points.arrayZ[header_pos] = (run_length - 1) | 0x80;
+    }
+    return compiled_points.resize (pos, false);
+  }
+
+  static float infer_delta (float target_val, float prev_val, float next_val, float prev_delta, float next_delta)
+  {
+    if (prev_val == next_val)
+      return (prev_delta == next_delta) ? prev_delta : 0.f;
+    else if (target_val <= hb_min (prev_val, next_val))
+      return (prev_val < next_val) ? prev_delta : next_delta;
+    else if (target_val >= hb_max (prev_val, next_val))
+      return (prev_val > next_val) ? prev_delta : next_delta;
+
+    float r = (target_val - prev_val) / (next_val - prev_val);
+    return prev_delta + r * (next_delta - prev_delta);
+  }
+
+  static unsigned int next_index (unsigned int i, unsigned int start, unsigned int end)
+  { return (i >= end) ? start : (i + 1); }
+};
+
 struct TupleVariationData
 {
   bool sanitize (hb_sanitize_context_t *c) const
@@ -377,7 +1224,7 @@ struct TupleVariationData
   unsigned get_size (unsigned axis_count) const
   {
     unsigned total_size = min_size;
-    unsigned count = tupleVarCount;
+    unsigned count = tupleVarCount.get_count ();
     const TupleVariationHeader *tuple_var_header = &(get_tuple_var_header());
     for (unsigned i = 0; i < count; i++)
     {
@@ -391,8 +1238,447 @@ struct TupleVariationData
   const TupleVariationHeader &get_tuple_var_header (void) const
   { return StructAfter<TupleVariationHeader> (data); }
 
+  struct tuple_iterator_t;
+  struct tuple_variations_t
+  {
+    hb_vector_t<tuple_delta_t> tuple_vars;
+
+    private:
+    /* referenced point set->compiled point data map */
+    hb_hashmap_t<const hb_vector_t<bool>*, hb_vector_t<char>> point_data_map;
+    /* referenced point set-> count map, used in finding shared points */
+    hb_hashmap_t<const hb_vector_t<bool>*, unsigned> point_set_count_map;
+
+    /* empty for non-gvar tuples.
+     * shared_points_bytes is a pointer to some value in the point_data_map,
+     * which will be freed during map destruction. Save it for serialization, so
+     * no need to do find_shared_points () again */
+    hb_vector_t<char> *shared_points_bytes = nullptr;
+
+    /* total compiled byte size as TupleVariationData format, initialized to its
+     * min_size: 4 */
+    unsigned compiled_byte_size = 4;
+
+    /* for gvar iup delta optimization: whether this is a composite glyph */
+    bool is_composite = false;
+
+    public:
+    tuple_variations_t () = default;
+    tuple_variations_t (const tuple_variations_t&) = delete;
+    tuple_variations_t& operator=(const tuple_variations_t&) = delete;
+    tuple_variations_t (tuple_variations_t&&) = default;
+    tuple_variations_t& operator=(tuple_variations_t&&) = default;
+    ~tuple_variations_t () = default;
+
+    explicit operator bool () const { return bool (tuple_vars); }
+    unsigned get_var_count () const
+    {
+      unsigned count = 0;
+      /* when iup delta opt is enabled, compiled_deltas could be empty and we
+       * should skip this tuple */
+      for (auto& tuple: tuple_vars)
+        if (tuple.compiled_deltas) count++;
+
+      if (shared_points_bytes && shared_points_bytes->length)
+        count |= TupleVarCount::SharedPointNumbers;
+      return count;
+    }
+
+    unsigned get_compiled_byte_size () const
+    { return compiled_byte_size; }
+
+    bool create_from_tuple_var_data (tuple_iterator_t iterator,
+                                     unsigned tuple_var_count,
+                                     unsigned point_count,
+                                     bool is_gvar,
+                                     const hb_map_t *axes_old_index_tag_map,
+                                     const hb_vector_t<unsigned> &shared_indices,
+                                     const hb_array_t<const F2DOT14> shared_tuples,
+                                     bool is_composite_glyph)
+    {
+      do
+      {
+        const HBUINT8 *p = iterator.get_serialized_data ();
+        unsigned int length = iterator.current_tuple->get_data_size ();
+        if (unlikely (!iterator.var_data_bytes.check_range (p, length)))
+          return false;
+
+        hb_hashmap_t<hb_tag_t, Triple> axis_tuples;
+        if (!iterator.current_tuple->unpack_axis_tuples (iterator.get_axis_count (), shared_tuples, axes_old_index_tag_map, axis_tuples)
+            || axis_tuples.is_empty ())
+          return false;
+
+        hb_vector_t<unsigned> private_indices;
+        bool has_private_points = iterator.current_tuple->has_private_points ();
+        const HBUINT8 *end = p + length;
+        if (has_private_points &&
+            !TupleVariationData::unpack_points (p, private_indices, end))
+          return false;
+
+        const hb_vector_t<unsigned> &indices = has_private_points ? private_indices : shared_indices;
+        bool apply_to_all = (indices.length == 0);
+        unsigned num_deltas = apply_to_all ? point_count : indices.length;
+
+        hb_vector_t<int> deltas_x;
+
+        if (unlikely (!deltas_x.resize (num_deltas, false) ||
+                      !TupleVariationData::unpack_deltas (p, deltas_x, end)))
+          return false;
+
+        hb_vector_t<int> deltas_y;
+        if (is_gvar)
+        {
+          if (unlikely (!deltas_y.resize (num_deltas, false) ||
+                        !TupleVariationData::unpack_deltas (p, deltas_y, end)))
+            return false;
+        }
+
+        tuple_delta_t var;
+        var.axis_tuples = std::move (axis_tuples);
+        if (unlikely (!var.indices.resize (point_count) ||
+                      !var.deltas_x.resize (point_count, false)))
+          return false;
+
+        if (is_gvar && unlikely (!var.deltas_y.resize (point_count, false)))
+          return false;
+
+        for (unsigned i = 0; i < num_deltas; i++)
+        {
+          unsigned idx = apply_to_all ? i : indices[i];
+          if (idx >= point_count) continue;
+          var.indices[idx] = true;
+          var.deltas_x[idx] = static_cast<float> (deltas_x[i]);
+          if (is_gvar)
+            var.deltas_y[idx] = static_cast<float> (deltas_y[i]);
+        }
+        tuple_vars.push (std::move (var));
+      } while (iterator.move_to_next ());
+
+      is_composite = is_composite_glyph;
+      return true;
+    }
+
+    bool create_from_item_var_data (const VarData &var_data,
+                                    const hb_vector_t<hb_hashmap_t<hb_tag_t, Triple>>& regions,
+                                    const hb_map_t& axes_old_index_tag_map,
+                                    unsigned& item_count,
+                                    const hb_inc_bimap_t* inner_map = nullptr)
+    {
+      /* NULL offset, to keep original varidx valid, just return */
+      if (&var_data == &Null (VarData))
+        return true;
+  
+      unsigned num_regions = var_data.get_region_index_count ();
+      if (!tuple_vars.alloc (num_regions)) return false;
+  
+      item_count = inner_map ? inner_map->get_population () : var_data.get_item_count ();
+      if (!item_count) return true;
+      unsigned row_size = var_data.get_row_size ();
+      const HBUINT8 *delta_bytes = var_data.get_delta_bytes ();
+  
+      for (unsigned r = 0; r < num_regions; r++)
+      {
+        /* In VarData, deltas are organized in rows, convert them into
+         * column(region) based tuples, resize deltas_x first */
+        tuple_delta_t tuple;
+        if (!tuple.deltas_x.resize (item_count, false) ||
+            !tuple.indices.resize (item_count, false))
+          return false;
+  
+        for (unsigned i = 0; i < item_count; i++)
+        {
+          tuple.indices.arrayZ[i] = true;
+          tuple.deltas_x.arrayZ[i] = var_data.get_item_delta_fast (inner_map ? inner_map->backward (i) : i,
+                                                                   r, delta_bytes, row_size);
+        }
+  
+        unsigned region_index = var_data.get_region_index (r);
+        if (region_index >= regions.length) return false;
+        tuple.axis_tuples = regions.arrayZ[region_index];
+
+        tuple_vars.push (std::move (tuple));
+      }
+      return !tuple_vars.in_error ();
+    }
+
+    private:
+    static int _cmp_axis_tag (const void *pa, const void *pb)
+    {
+      const hb_tag_t *a = (const hb_tag_t*) pa;
+      const hb_tag_t *b = (const hb_tag_t*) pb;
+      return (int)(*a) - (int)(*b);
+    }
+
+    bool change_tuple_variations_axis_limits (const hb_hashmap_t<hb_tag_t, Triple>& normalized_axes_location,
+                                              const hb_hashmap_t<hb_tag_t, TripleDistances>& axes_triple_distances)
+    {
+      /* sort axis_tag/axis_limits, make result deterministic */
+      hb_vector_t<hb_tag_t> axis_tags;
+      if (!axis_tags.alloc (normalized_axes_location.get_population ()))
+        return false;
+      for (auto t : normalized_axes_location.keys ())
+        axis_tags.push (t);
+
+      axis_tags.qsort (_cmp_axis_tag);
+      for (auto axis_tag : axis_tags)
+      {
+        Triple *axis_limit;
+        if (!normalized_axes_location.has (axis_tag, &axis_limit))
+          return false;
+        TripleDistances axis_triple_distances{1.f, 1.f};
+        if (axes_triple_distances.has (axis_tag))
+          axis_triple_distances = axes_triple_distances.get (axis_tag);
+
+        hb_vector_t<tuple_delta_t> new_vars;
+        for (const tuple_delta_t& var : tuple_vars)
+        {
+          hb_vector_t<tuple_delta_t> out = var.change_tuple_var_axis_limit (axis_tag, *axis_limit, axis_triple_distances);
+          if (!out) continue;
+
+          unsigned new_len = new_vars.length + out.length;
+
+          if (unlikely (!new_vars.alloc (new_len, false)))
+            return false;
+
+          for (unsigned i = 0; i < out.length; i++)
+            new_vars.push (std::move (out[i]));
+        }
+        tuple_vars.fini ();
+        tuple_vars = std::move (new_vars);
+      }
+      return true;
+    }
+
+    /* merge tuple variations with overlapping tents, if iup delta optimization
+     * is enabled, add default deltas to contour_points */
+    bool merge_tuple_variations (contour_point_vector_t* contour_points = nullptr)
+    {
+      hb_vector_t<tuple_delta_t> new_vars;
+      hb_hashmap_t<const hb_hashmap_t<hb_tag_t, Triple>*, unsigned> m;
+      unsigned i = 0;
+      for (const tuple_delta_t& var : tuple_vars)
+      {
+        /* if all axes are pinned, drop the tuple variation */
+        if (var.axis_tuples.is_empty ())
+        {
+          /* if iup_delta_optimize is enabled, add deltas to contour coords */
+          if (contour_points && !contour_points->add_deltas (var.deltas_x,
+                                                             var.deltas_y,
+                                                             var.indices))
+            return false;
+          continue;
+        }
+
+        unsigned *idx;
+        if (m.has (&(var.axis_tuples), &idx))
+        {
+          new_vars[*idx] += var;
+        }
+        else
+        {
+          new_vars.push (var);
+          if (!m.set (&(var.axis_tuples), i))
+            return false;
+          i++;
+        }
+      }
+      tuple_vars.fini ();
+      tuple_vars = std::move (new_vars);
+      return true;
+    }
+
+    /* compile all point set and store byte data in a point_set->hb_bytes_t hashmap,
+     * also update point_set->count map, which will be used in finding shared
+     * point set*/
+    bool compile_all_point_sets ()
+    {
+      for (const auto& tuple: tuple_vars)
+      {
+        const hb_vector_t<bool>* points_set = &(tuple.indices);
+        if (point_data_map.has (points_set))
+        {
+          unsigned *count;
+          if (unlikely (!point_set_count_map.has (points_set, &count) ||
+                        !point_set_count_map.set (points_set, (*count) + 1)))
+            return false;
+          continue;
+        }
+        
+        hb_vector_t<char> compiled_point_data;
+        if (!tuple_delta_t::compile_point_set (*points_set, compiled_point_data))
+          return false;
+        
+        if (!point_data_map.set (points_set, std::move (compiled_point_data)) ||
+            !point_set_count_map.set (points_set, 1))
+          return false;
+      }
+      return true;
+    }
+
+    /* find shared points set which saves most bytes */
+    void find_shared_points ()
+    {
+      unsigned max_saved_bytes = 0;
+
+      for (const auto& _ : point_data_map.iter_ref ())
+      {
+        const hb_vector_t<bool>* points_set = _.first;
+        unsigned data_length = _.second.length;
+        if (!data_length) continue;
+        unsigned *count;
+        if (unlikely (!point_set_count_map.has (points_set, &count) ||
+                      *count <= 1))
+        {
+          shared_points_bytes = nullptr;
+          return;
+        }
+
+        unsigned saved_bytes = data_length * ((*count) -1);
+        if (saved_bytes > max_saved_bytes)
+        {
+          max_saved_bytes = saved_bytes;
+          shared_points_bytes = &(_.second);
+        }
+      }
+    }
+
+    bool calc_inferred_deltas (const contour_point_vector_t& contour_points)
+    {
+      for (tuple_delta_t& var : tuple_vars)
+        if (!var.calc_inferred_deltas (contour_points))
+          return false;
+      
+      return true;
+    }
+
+    bool iup_optimize (const contour_point_vector_t& contour_points)
+    {
+      for (tuple_delta_t& var : tuple_vars)
+      {
+        if (!var.optimize (contour_points, is_composite))
+          return false;
+      }
+      return true;
+    }
+
+    public:
+    bool instantiate (const hb_hashmap_t<hb_tag_t, Triple>& normalized_axes_location,
+                      const hb_hashmap_t<hb_tag_t, TripleDistances>& axes_triple_distances,
+                      contour_point_vector_t* contour_points = nullptr,
+                      bool optimize = false)
+    {
+      if (!tuple_vars) return true;
+      if (!change_tuple_variations_axis_limits (normalized_axes_location, axes_triple_distances))
+        return false;
+      /* compute inferred deltas only for gvar */
+      if (contour_points)
+        if (!calc_inferred_deltas (*contour_points))
+          return false;
+
+      /* if iup delta opt is on, contour_points can't be null */
+      if (optimize && !contour_points)
+        return false;
+
+      if (!merge_tuple_variations (optimize ? contour_points : nullptr))
+        return false;
+
+      if (optimize && !iup_optimize (*contour_points)) return false;
+      return !tuple_vars.in_error ();
+    }
+
+    bool compile_bytes (const hb_map_t& axes_index_map,
+                        const hb_map_t& axes_old_index_tag_map,
+                        bool use_shared_points,
+                        const hb_hashmap_t<const hb_vector_t<char>*, unsigned>* shared_tuples_idx_map = nullptr)
+    {
+      // compile points set and store data in hashmap
+      if (!compile_all_point_sets ())
+        return false;
+
+      if (use_shared_points)
+      {
+        find_shared_points ();
+        if (shared_points_bytes)
+          compiled_byte_size += shared_points_bytes->length;
+      }
+      // compile delta and tuple var header for each tuple variation
+      for (auto& tuple: tuple_vars)
+      {
+        const hb_vector_t<bool>* points_set = &(tuple.indices);
+        hb_vector_t<char> *points_data;
+        if (unlikely (!point_data_map.has (points_set, &points_data)))
+          return false;
+
+        /* when iup optimization is enabled, num of referenced points could be 0
+         * and thus the compiled points bytes is empty, we should skip compiling
+         * this tuple */
+        if (!points_data->length)
+          continue;
+        if (!tuple.compile_deltas ())
+          return false;
+
+        unsigned points_data_length = (points_data != shared_points_bytes) ? points_data->length : 0;
+        if (!tuple.compile_tuple_var_header (axes_index_map, points_data_length, axes_old_index_tag_map,
+                                             shared_tuples_idx_map))
+          return false;
+        compiled_byte_size += tuple.compiled_tuple_header.length + points_data_length + tuple.compiled_deltas.length;
+      }
+      return true;
+    }
+
+    bool serialize_var_headers (hb_serialize_context_t *c, unsigned& total_header_len) const
+    {
+      TRACE_SERIALIZE (this);
+      for (const auto& tuple: tuple_vars)
+      {
+        tuple.compiled_tuple_header.as_array ().copy (c);
+        if (c->in_error ()) return_trace (false);
+        total_header_len += tuple.compiled_tuple_header.length;
+      }
+      return_trace (true);
+    }
+
+    bool serialize_var_data (hb_serialize_context_t *c, bool is_gvar) const
+    {
+      TRACE_SERIALIZE (this);
+      if (is_gvar && shared_points_bytes)
+      {
+        hb_bytes_t s (shared_points_bytes->arrayZ, shared_points_bytes->length);
+        s.copy (c);
+      }
+
+      for (const auto& tuple: tuple_vars)
+      {
+        const hb_vector_t<bool>* points_set = &(tuple.indices);
+        hb_vector_t<char> *point_data;
+        if (!point_data_map.has (points_set, &point_data))
+          return_trace (false);
+
+        if (!is_gvar || point_data != shared_points_bytes)
+        {
+          hb_bytes_t s (point_data->arrayZ, point_data->length);
+          s.copy (c);
+        }
+
+        tuple.compiled_deltas.as_array ().copy (c);
+        if (c->in_error ()) return_trace (false);
+      }
+
+      /* padding for gvar */
+      if (is_gvar && (compiled_byte_size % 2))
+      {
+        HBUINT8 pad;
+        pad = 0;
+        if (!c->embed (pad)) return_trace (false);
+      }
+      return_trace (true);
+    }
+  };
+
   struct tuple_iterator_t
   {
+    unsigned get_axis_count () const { return axis_count; }
+
     void init (hb_bytes_t var_data_bytes_, unsigned int axis_count_, const void *table_base_)
     {
       var_data_bytes = var_data_bytes_;
@@ -516,13 +1802,6 @@ struct TupleVariationData
                              hb_vector_t<int> &deltas /* IN/OUT */,
                              const HBUINT8 *end)
   {
-    enum packed_delta_flag_t
-    {
-      DELTAS_ARE_ZERO      = 0x80,
-      DELTAS_ARE_WORDS     = 0x40,
-      DELTA_RUN_COUNT_MASK = 0x3F
-    };
-
     unsigned i = 0;
     unsigned count = deltas.length;
     while (i < count)
@@ -560,11 +1839,57 @@ struct TupleVariationData
 
   bool has_data () const { return tupleVarCount; }
 
+  bool decompile_tuple_variations (unsigned point_count,
+                                   bool is_gvar,
+                                   tuple_iterator_t iterator,
+                                   const hb_map_t *axes_old_index_tag_map,
+                                   const hb_vector_t<unsigned> &shared_indices,
+                                   const hb_array_t<const F2DOT14> shared_tuples,
+                                   tuple_variations_t& tuple_variations, /* OUT */
+                                   bool is_composite_glyph = false) const
+  {
+    return tuple_variations.create_from_tuple_var_data (iterator, tupleVarCount,
+                                                        point_count, is_gvar,
+                                                        axes_old_index_tag_map,
+                                                        shared_indices,
+                                                        shared_tuples,
+                                                        is_composite_glyph);
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+                  bool is_gvar,
+                  const tuple_variations_t& tuple_variations) const
+  {
+    TRACE_SERIALIZE (this);
+    /* empty tuple variations, just return and skip serialization. */
+    if (!tuple_variations) return_trace (true);
+
+    auto *out = c->start_embed (this);
+    if (unlikely (!c->extend_min (out))) return_trace (false);
+
+    if (!c->check_assign (out->tupleVarCount, tuple_variations.get_var_count (),
+                          HB_SERIALIZE_ERROR_INT_OVERFLOW)) return_trace (false);
+
+    unsigned total_header_len = 0;
+
+    if (!tuple_variations.serialize_var_headers (c, total_header_len))
+      return_trace (false);
+    
+    unsigned data_offset = min_size + total_header_len;
+    if (!is_gvar) data_offset += 4;
+    if (!c->check_assign (out->data, data_offset, HB_SERIALIZE_ERROR_INT_OVERFLOW)) return_trace (false);
+
+    return tuple_variations.serialize_var_data (c, is_gvar);
+  }
+
   protected:
   struct TupleVarCount : HBUINT16
   {
+    friend struct tuple_variations_t;
     bool has_shared_point_numbers () const { return ((*this) & SharedPointNumbers); }
     unsigned int get_count () const { return (*this) & CountMask; }
+    TupleVarCount& operator = (uint16_t i) { HBUINT16::operator= (i); return *this; }
+    explicit operator bool () const { return get_count (); }
 
     protected:
     enum Flags
@@ -588,6 +1913,471 @@ struct TupleVariationData
   DEFINE_SIZE_MIN (4);
 };
 
+using tuple_variations_t = TupleVariationData::tuple_variations_t;
+struct item_variations_t
+{
+  using region_t = const hb_hashmap_t<hb_tag_t, Triple>*;
+  private:
+  /* each subtable is decompiled into a tuple_variations_t, in which all tuples
+   * have the same num of deltas (rows) */
+  hb_vector_t<tuple_variations_t> vars;
+
+  /* num of retained rows for each subtable, there're 2 cases when var_data is empty:
+   * 1. retained item_count is zero
+   * 2. regions is empty and item_count is non-zero.
+   * when converting to tuples, both will be dropped because the tuple is empty,
+   * however, we need to retain 2. as all-zero rows to keep original varidx
+   * valid, so we need a way to remember the num of rows for each subtable */
+  hb_vector_t<unsigned> var_data_num_rows;
+
+  /* original region list, decompiled from item varstore, used when rebuilding
+   * region list after instantiation */
+  hb_vector_t<hb_hashmap_t<hb_tag_t, Triple>> orig_region_list;
+
+  /* region list: vector of Regions, maintain the original order for the regions
+   * that existed before instantiate (), append the new regions at the end.
+   * Regions are stored in each tuple already, save pointers only.
+   * When converting back to item varstore, unused regions will be pruned */
+  hb_vector_t<region_t> region_list;
+
+  /* region -> idx map after instantiation and pruning unused regions */
+  hb_hashmap_t<region_t, unsigned> region_map;
+
+  /* all delta rows after instantiation */
+  hb_vector_t<hb_vector_t<int>> delta_rows;
+  /* final optimized vector of encoding objects used to assemble the varstore */
+  hb_vector_t<delta_row_encoding_t> encodings;
+
+  /* old varidxes -> new var_idxes map */
+  hb_map_t varidx_map;
+
+  /* has long words */
+  bool has_long = false;
+
+  public:
+  bool has_long_word () const
+  { return has_long; }
+
+  const hb_vector_t<region_t>& get_region_list () const
+  { return region_list; }
+
+  const hb_vector_t<delta_row_encoding_t>& get_vardata_encodings () const
+  { return encodings; }
+
+  const hb_map_t& get_varidx_map () const
+  { return varidx_map; }
+
+  bool instantiate (const ItemVariationStore& varStore,
+                    const hb_subset_plan_t *plan,
+                    bool optimize=true,
+                    bool use_no_variation_idx=true,
+                    const hb_array_t <const hb_inc_bimap_t> inner_maps = hb_array_t<const hb_inc_bimap_t> ())
+  {
+    if (!create_from_item_varstore (varStore, plan->axes_old_index_tag_map, inner_maps))
+      return false;
+    if (!instantiate_tuple_vars (plan->axes_location, plan->axes_triple_distances))
+      return false;
+    return as_item_varstore (optimize, use_no_variation_idx);
+  }
+
+  /* keep below APIs public only for unit test: test-item-varstore */
+  bool create_from_item_varstore (const ItemVariationStore& varStore,
+                                  const hb_map_t& axes_old_index_tag_map,
+                                  const hb_array_t <const hb_inc_bimap_t> inner_maps = hb_array_t<const hb_inc_bimap_t> ())
+  {
+    const VarRegionList& regionList = varStore.get_region_list ();
+    if (!regionList.get_var_regions (axes_old_index_tag_map, orig_region_list))
+      return false;
+
+    unsigned num_var_data = varStore.get_sub_table_count ();
+    if (inner_maps && inner_maps.length != num_var_data) return false;
+    if (!vars.alloc (num_var_data) ||
+        !var_data_num_rows.alloc (num_var_data)) return false;
+
+    for (unsigned i = 0; i < num_var_data; i++)
+    {
+      if (inner_maps && !inner_maps.arrayZ[i].get_population ())
+          continue;
+      tuple_variations_t var_data_tuples;
+      unsigned item_count = 0;
+      if (!var_data_tuples.create_from_item_var_data (varStore.get_sub_table (i),
+                                                      orig_region_list,
+                                                      axes_old_index_tag_map,
+                                                      item_count,
+                                                      inner_maps ? &(inner_maps.arrayZ[i]) : nullptr))
+        return false;
+
+      var_data_num_rows.push (item_count);
+      vars.push (std::move (var_data_tuples));
+    }
+    return !vars.in_error () && !var_data_num_rows.in_error () && vars.length == var_data_num_rows.length;
+  }
+
+  bool instantiate_tuple_vars (const hb_hashmap_t<hb_tag_t, Triple>& normalized_axes_location,
+                               const hb_hashmap_t<hb_tag_t, TripleDistances>& axes_triple_distances)
+  {
+    for (tuple_variations_t& tuple_vars : vars)
+      if (!tuple_vars.instantiate (normalized_axes_location, axes_triple_distances))
+        return false;
+
+    if (!build_region_list ()) return false;
+    return true;
+  }
+
+  bool build_region_list ()
+  {
+    /* scan all tuples and collect all unique regions, prune unused regions */
+    hb_hashmap_t<region_t, unsigned> all_regions;
+    hb_hashmap_t<region_t, unsigned> used_regions;
+
+    /* use a vector when inserting new regions, make result deterministic */
+    hb_vector_t<region_t> all_unique_regions;
+    for (const tuple_variations_t& sub_table : vars)
+    {
+      for (const tuple_delta_t& tuple : sub_table.tuple_vars)
+      {
+        region_t r = &(tuple.axis_tuples);
+        if (!used_regions.has (r))
+        {
+          bool all_zeros = true;
+          for (float d : tuple.deltas_x)
+          {
+            int delta = (int) roundf (d);
+            if (delta != 0)
+            {
+              all_zeros = false;
+              break;
+            }
+          }
+          if (!all_zeros)
+          {
+            if (!used_regions.set (r, 1))
+              return false;
+          }
+        }
+        if (all_regions.has (r))
+          continue;
+        if (!all_regions.set (r, 1))
+          return false;
+        all_unique_regions.push (r);
+      }
+    }
+
+    if (!all_regions || !all_unique_regions) return false;
+    if (!region_list.alloc (all_regions.get_population ()))
+      return false;
+
+    unsigned idx = 0;
+    /* append the original regions that pre-existed */
+    for (const auto& r : orig_region_list)
+    {
+      if (!all_regions.has (&r) || !used_regions.has (&r))
+        continue;
+
+      region_list.push (&r);
+      if (!region_map.set (&r, idx))
+        return false;
+      all_regions.del (&r);
+      idx++;
+    }
+
+    /* append the new regions at the end */
+    for (const auto& r: all_unique_regions)
+    {
+      if (!all_regions.has (r) || !used_regions.has (r))
+        continue;
+      region_list.push (r);
+      if (!region_map.set (r, idx))
+        return false;
+      all_regions.del (r);
+      idx++;
+    }
+    return (!region_list.in_error ()) && (!region_map.in_error ());
+  }
+
+  /* main algorithm ported from fonttools VarStore_optimize() method, optimize
+   * varstore by default */
+
+  struct combined_gain_idx_tuple_t
+  {
+    int gain;
+    unsigned idx_1;
+    unsigned idx_2;
+
+    combined_gain_idx_tuple_t () = default;
+    combined_gain_idx_tuple_t (int gain_, unsigned i, unsigned j)
+        :gain (gain_), idx_1 (i), idx_2 (j) {}
+
+    bool operator < (const combined_gain_idx_tuple_t& o)
+    {
+      if (gain != o.gain)
+        return gain < o.gain;
+
+      if (idx_1 != o.idx_1)
+        return idx_1 < o.idx_1;
+
+      return idx_2 < o.idx_2;
+    }
+
+    bool operator <= (const combined_gain_idx_tuple_t& o)
+    {
+      if (*this < o) return true;
+      return gain == o.gain && idx_1 == o.idx_1 && idx_2 == o.idx_2;
+    }
+  };
+
+  bool as_item_varstore (bool optimize=true, bool use_no_variation_idx=true)
+  {
+    if (!region_list) return false;
+    unsigned num_cols = region_list.length;
+    /* pre-alloc a 2D vector for all sub_table's VarData rows */
+    unsigned total_rows = 0;
+    for (unsigned major = 0; major < var_data_num_rows.length; major++)
+      total_rows += var_data_num_rows[major];
+
+    if (!delta_rows.resize (total_rows)) return false;
+    /* init all rows to [0]*num_cols */
+    for (unsigned i = 0; i < total_rows; i++)
+      if (!(delta_rows[i].resize (num_cols))) return false;
+
+    /* old VarIdxes -> full encoding_row mapping */
+    hb_hashmap_t<unsigned, const hb_vector_t<int>*> front_mapping;
+    unsigned start_row = 0;
+    hb_vector_t<delta_row_encoding_t> encoding_objs;
+    hb_hashmap_t<hb_vector_t<uint8_t>, unsigned> chars_idx_map;
+
+    /* delta_rows map, used for filtering out duplicate rows */
+    hb_hashmap_t<const hb_vector_t<int>*, unsigned> delta_rows_map;
+    for (unsigned major = 0; major < vars.length; major++)
+    {
+      /* deltas are stored in tuples(column based), convert them back into items
+       * (row based) delta */
+      const tuple_variations_t& tuples = vars[major];
+      unsigned num_rows = var_data_num_rows[major];
+      for (const tuple_delta_t& tuple: tuples.tuple_vars)
+      {
+        if (tuple.deltas_x.length != num_rows)
+          return false;
+
+        /* skip unused regions */
+        unsigned *col_idx;
+        if (!region_map.has (&(tuple.axis_tuples), &col_idx))
+          continue;
+
+        for (unsigned i = 0; i < num_rows; i++)
+        {
+          int rounded_delta = roundf (tuple.deltas_x[i]);
+          delta_rows[start_row + i][*col_idx] += rounded_delta;
+          if ((!has_long) && (rounded_delta < -65536 || rounded_delta > 65535))
+            has_long = true;
+        }
+      }
+
+      if (!optimize)
+      {
+        /* assemble a delta_row_encoding_t for this subtable, skip optimization so
+         * chars is not initialized, we only need delta rows for serialization */
+        delta_row_encoding_t obj;
+        for (unsigned r = start_row; r < start_row + num_rows; r++)
+          obj.add_row (&(delta_rows.arrayZ[r]));
+
+        encodings.push (std::move (obj));
+        start_row += num_rows;
+        continue;
+      }
+
+      for (unsigned minor = 0; minor < num_rows; minor++)
+      {
+        const hb_vector_t<int>& row = delta_rows[start_row + minor];
+        if (use_no_variation_idx)
+        {
+          bool all_zeros = true;
+          for (int delta : row)
+          {
+            if (delta != 0)
+            {
+              all_zeros = false;
+              break;
+            }
+          }
+          if (all_zeros)
+            continue;
+        }
+
+        if (!front_mapping.set ((major<<16) + minor, &row))
+          return false;
+
+        hb_vector_t<uint8_t> chars = delta_row_encoding_t::get_row_chars (row);
+        if (!chars) return false;
+
+        if (delta_rows_map.has (&row))
+          continue;
+
+        delta_rows_map.set (&row, 1);
+        unsigned *obj_idx;
+        if (chars_idx_map.has (chars, &obj_idx))
+        {
+          delta_row_encoding_t& obj = encoding_objs[*obj_idx];
+          if (!obj.add_row (&row))
+            return false;
+        }
+        else
+        {
+          if (!chars_idx_map.set (chars, encoding_objs.length))
+            return false;
+          delta_row_encoding_t obj (std::move (chars), &row);
+          encoding_objs.push (std::move (obj));
+        }
+      }
+
+      start_row += num_rows;
+    }
+
+    /* return directly if no optimization, maintain original VariationIndex so
+     * varidx_map would be empty */
+    if (!optimize) return !encodings.in_error ();
+
+    /* sort encoding_objs */
+    encoding_objs.qsort ();
+
+    /* main algorithm: repeatedly pick 2 best encodings to combine, and combine
+     * them */
+    hb_priority_queue_t<combined_gain_idx_tuple_t> queue;
+    unsigned num_todos = encoding_objs.length;
+    for (unsigned i = 0; i < num_todos; i++)
+    {
+      for (unsigned j = i + 1; j < num_todos; j++)
+      {
+        int combining_gain = encoding_objs.arrayZ[i].gain_from_merging (encoding_objs.arrayZ[j]);
+        if (combining_gain > 0)
+          queue.insert (combined_gain_idx_tuple_t (-combining_gain, i, j), 0);
+      }
+    }
+
+    hb_set_t removed_todo_idxes;
+    while (queue)
+    {
+      auto t = queue.pop_minimum ().first;
+      unsigned i = t.idx_1;
+      unsigned j = t.idx_2;
+
+      if (removed_todo_idxes.has (i) || removed_todo_idxes.has (j))
+        continue;
+
+      delta_row_encoding_t& encoding = encoding_objs.arrayZ[i];
+      delta_row_encoding_t& other_encoding = encoding_objs.arrayZ[j];
+
+      removed_todo_idxes.add (i);
+      removed_todo_idxes.add (j);
+
+      hb_vector_t<uint8_t> combined_chars;
+      if (!combined_chars.alloc (encoding.chars.length))
+        return false;
+
+      for (unsigned idx = 0; idx < encoding.chars.length; idx++)
+      {
+        uint8_t v = hb_max (encoding.chars.arrayZ[idx], other_encoding.chars.arrayZ[idx]);
+        combined_chars.push (v);
+      }
+
+      delta_row_encoding_t combined_encoding_obj (std::move (combined_chars));
+      for (const auto& row : hb_concat (encoding.items, other_encoding.items))
+        combined_encoding_obj.add_row (row);
+
+      for (unsigned idx = 0; idx < encoding_objs.length; idx++)
+      {
+        if (removed_todo_idxes.has (idx)) continue;
+
+        const delta_row_encoding_t& obj = encoding_objs.arrayZ[idx];
+        if (obj.chars == combined_chars)
+        {
+          for (const auto& row : obj.items)
+            combined_encoding_obj.add_row (row);
+
+          removed_todo_idxes.add (idx);
+          continue;
+        }
+
+        int combined_gain = combined_encoding_obj.gain_from_merging (obj);
+        if (combined_gain > 0)
+          queue.insert (combined_gain_idx_tuple_t (-combined_gain, idx, encoding_objs.length), 0);
+      }
+
+      encoding_objs.push (std::move (combined_encoding_obj));
+    }
+
+    int num_final_encodings = (int) encoding_objs.length - (int) removed_todo_idxes.get_population ();
+    if (num_final_encodings <= 0) return false;
+
+    if (!encodings.alloc (num_final_encodings)) return false;
+    for (unsigned i = 0; i < encoding_objs.length; i++)
+    {
+      if (removed_todo_idxes.has (i)) continue;
+      encodings.push (std::move (encoding_objs.arrayZ[i]));
+    }
+
+    /* sort again based on width, make result deterministic */
+    encodings.qsort (delta_row_encoding_t::cmp_width);
+
+    return compile_varidx_map (front_mapping);
+  }
+
+  private:
+  /* compile varidx_map for one VarData subtable (index specified by major) */
+  bool compile_varidx_map (const hb_hashmap_t<unsigned, const hb_vector_t<int>*>& front_mapping)
+  {
+    /* full encoding_row -> new VarIdxes mapping */
+    hb_hashmap_t<const hb_vector_t<int>*, unsigned> back_mapping;
+
+    for (unsigned major = 0; major < encodings.length; major++)
+    {
+      delta_row_encoding_t& encoding = encodings[major];
+      /* just sanity check, this shouldn't happen */
+      if (encoding.is_empty ())
+        return false;
+  
+      unsigned num_rows = encoding.items.length;
+  
+      /* sort rows, make result deterministic */
+      encoding.items.qsort (_cmp_row);
+  
+      /* compile old to new var_idxes mapping */
+      for (unsigned minor = 0; minor < num_rows; minor++)
+      {
+        unsigned new_varidx = (major << 16) + minor;
+        back_mapping.set (encoding.items.arrayZ[minor], new_varidx);
+      }
+    }
+
+    for (auto _ : front_mapping.iter ())
+    {
+      unsigned old_varidx = _.first;
+      unsigned *new_varidx;
+      if (back_mapping.has (_.second, &new_varidx))
+        varidx_map.set (old_varidx, *new_varidx);
+      else
+        varidx_map.set (old_varidx, HB_OT_LAYOUT_NO_VARIATIONS_INDEX);
+    }
+    return !varidx_map.in_error ();
+  }
+
+  static int _cmp_row (const void *pa, const void *pb)
+  {
+    /* compare pointers of vectors(const hb_vector_t<int>*) that represent a row */
+    const hb_vector_t<int>** a = (const hb_vector_t<int>**) pa;
+    const hb_vector_t<int>** b = (const hb_vector_t<int>**) pb;
+
+    for (unsigned i = 0; i < (*b)->length; i++)
+    {
+      int va = (*a)->arrayZ[i];
+      int vb = (*b)->arrayZ[i];
+      if (va != vb)
+        return va < vb ? -1 : 1;
+    }
+    return 0;
+  }
+};
+
 } /* namespace OT */
 
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-var-cvar-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-var-cvar-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-var-cvar-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-var-cvar-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -27,6 +27,7 @@
 #define HB_OT_VAR_CVAR_TABLE_HH
 
 #include "hb-ot-var-common.hh"
+#include "hb-ot-var-fvar-table.hh"
 
 
 namespace OT {
@@ -44,13 +45,35 @@ struct cvar
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
-		  version.sanitize (c) && likely (version.major == 1) &&
+		  hb_barrier () &&
+		  likely (version.major == 1) &&
 		  tupleVariationData.sanitize (c));
   }
 
   const TupleVariationData* get_tuple_var_data (void) const
   { return &tupleVariationData; }
 
+  bool decompile_tuple_variations (unsigned axis_count,
+                                   unsigned point_count,
+                                   hb_blob_t *blob,
+                                   bool is_gvar,
+                                   const hb_map_t *axes_old_index_tag_map,
+                                   TupleVariationData::tuple_variations_t& tuple_variations /* OUT */) const
+  {
+    hb_vector_t<unsigned> shared_indices;
+    TupleVariationData::tuple_iterator_t iterator;
+    hb_bytes_t var_data_bytes = blob->as_bytes ().sub_array (4);
+    if (!TupleVariationData::get_tuple_iterator (var_data_bytes, axis_count, this,
+                                                 shared_indices, &iterator))
+      return false;
+    
+    return tupleVariationData.decompile_tuple_variations (point_count, is_gvar, iterator,
+                                                          axes_old_index_tag_map,
+                                                          shared_indices,
+                                                          hb_array<const F2DOT14> (),
+                                                          tuple_variations);
+  }
+
   static bool calculate_cvt_deltas (unsigned axis_count,
                                     hb_array_t<int> coords,
                                     unsigned num_cvt_item,
@@ -104,6 +127,46 @@ struct cvar
 
     return true;
   }
+  
+  bool serialize (hb_serialize_context_t *c,
+                  TupleVariationData::tuple_variations_t& tuple_variations) const
+  {
+    TRACE_SERIALIZE (this);
+    if (!tuple_variations) return_trace (false);
+    if (unlikely (!c->embed (version))) return_trace (false);
+
+    return_trace (tupleVariationData.serialize (c, false, tuple_variations));
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    if (c->plan->all_axes_pinned)
+      return_trace (false);
+
+    OT::TupleVariationData::tuple_variations_t tuple_variations;
+    unsigned axis_count = c->plan->axes_old_index_tag_map.get_population ();
+
+    const hb_tag_t cvt = HB_TAG('c','v','t',' ');
+    hb_blob_t *cvt_blob = hb_face_reference_table (c->plan->source, cvt);
+    unsigned point_count = hb_blob_get_length (cvt_blob) / FWORD::static_size;
+    hb_blob_destroy (cvt_blob);
+
+    if (!decompile_tuple_variations (axis_count, point_count,
+                                     c->source_blob, false,
+                                     &(c->plan->axes_old_index_tag_map),
+                                     tuple_variations))
+      return_trace (false);
+
+    if (!tuple_variations.instantiate (c->plan->axes_location, c->plan->axes_triple_distances))
+      return_trace (false);
+
+    if (!tuple_variations.compile_bytes (c->plan->axes_index_map, c->plan->axes_old_index_tag_map,
+                                         false /* do not use shared points */))
+      return_trace (false);
+
+    return_trace (serialize (c->serializer, tuple_variations));
+  }
 
   static bool add_cvt_and_apply_deltas (hb_subset_plan_t *plan,
                                         const TupleVariationData *tuple_var_data,
@@ -126,7 +189,6 @@ struct cvar
       hb_blob_destroy (cvt_prime_blob);
       return false;
     }
-    hb_memset (cvt_deltas.arrayZ, 0, cvt_deltas.get_size ());
 
     if (!calculate_cvt_deltas (plan->normalized_coords.length, plan->normalized_coords.as_array (),
                                num_cvt_item, tuple_var_data, base, cvt_deltas))
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-var-fvar-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-var-fvar-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-var-fvar-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-var-fvar-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -39,6 +39,24 @@
 
 namespace OT {
 
+static bool axis_coord_pinned_or_within_axis_range (const hb_array_t<const F16DOT16> coords,
+                                                    unsigned axis_index,
+                                                    Triple axis_limit)
+{
+  float axis_coord = coords[axis_index].to_float ();
+  if (axis_limit.is_point ())
+  {
+    if (axis_limit.minimum != axis_coord)
+      return false;
+  }
+  else
+  {
+    if (axis_coord < axis_limit.minimum ||
+        axis_coord > axis_limit.maximum)
+      return false;
+  }
+  return true;
+}
 
 struct InstanceRecord
 {
@@ -47,6 +65,27 @@ struct InstanceRecord
   hb_array_t<const F16DOT16> get_coordinates (unsigned int axis_count) const
   { return coordinatesZ.as_array (axis_count); }
 
+  bool keep_instance (unsigned axis_count,
+                      const hb_map_t *axes_index_tag_map,
+                      const hb_hashmap_t<hb_tag_t, Triple> *axes_location) const
+  {
+    if (axes_location->is_empty ()) return true;
+    const hb_array_t<const F16DOT16> coords = get_coordinates (axis_count);
+    for (unsigned i = 0 ; i < axis_count; i++)
+    {
+      uint32_t *axis_tag;
+      if (!axes_index_tag_map->has (i, &axis_tag))
+        return false;
+      if (!axes_location->has (*axis_tag))
+        continue;
+      
+      Triple axis_limit = axes_location->get (*axis_tag);
+      if (!axis_coord_pinned_or_within_axis_range (coords, i, axis_limit))
+        return false;
+    }
+    return true;
+  }
+
   bool subset (hb_subset_context_t *c,
                unsigned axis_count,
                bool has_postscript_nameid) const
@@ -56,19 +95,22 @@ struct InstanceRecord
     if (unlikely (!c->serializer->embed (flags))) return_trace (false);
 
     const hb_array_t<const F16DOT16> coords = get_coordinates (axis_count);
-    const hb_hashmap_t<hb_tag_t, float> *axes_location = &c->plan->user_axes_location;
+    const hb_hashmap_t<hb_tag_t, Triple> *axes_location = &c->plan->user_axes_location;
     for (unsigned i = 0 ; i < axis_count; i++)
     {
       uint32_t *axis_tag;
+      Triple *axis_limit;
       // only keep instances whose coordinates == pinned axis location
-      if (!c->plan->axes_old_index_tag_map.has (i, &axis_tag)) continue;
-
-      if (axes_location->has (*axis_tag) &&
-          fabsf (axes_location->get (*axis_tag) - coords[i].to_float ()) > 0.001f)
-        return_trace (false);
-
-      if (!c->plan->axes_index_map.has (i))
-        continue;
+      if (!c->plan->axes_old_index_tag_map.has (i, &axis_tag)) return_trace (false);
+      if (axes_location->has (*axis_tag, &axis_limit))
+      {
+        if (!axis_coord_pinned_or_within_axis_range (coords, i, *axis_limit))
+          return_trace (false);
+        
+        //skip pinned axis
+        if (axis_limit->is_point ())
+          continue;
+      }
 
       if (!c->serializer->embed (coords[i]))
         return_trace (false);
@@ -89,6 +131,7 @@ struct InstanceRecord
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  c->check_array (coordinatesZ.arrayZ, axis_count));
   }
 
@@ -186,6 +229,30 @@ struct AxisRecord
     return defaultValue.to_float ();
   }
 
+  TripleDistances get_triple_distances () const
+  {
+    float min, default_, max;
+    get_coordinates (min, default_, max);
+    return TripleDistances (min, default_, max);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    const hb_hashmap_t<hb_tag_t, Triple>& user_axes_location = c->plan->user_axes_location;
+    Triple *axis_limit;
+    if (user_axes_location.has (axisTag, &axis_limit))
+    {
+      out->minValue.set_float (axis_limit->minimum);
+      out->defaultValue.set_float (axis_limit->middle);
+      out->maxValue.set_float (axis_limit->maximum);
+    }
+    return_trace (true);
+  }
+
   public:
   Tag		axisTag;	/* Tag identifying the design variation for the axis. */
   protected:
@@ -211,12 +278,15 @@ struct fvar
   {
     TRACE_SANITIZE (this);
     return_trace (version.sanitize (c) &&
+		  hb_barrier () &&
 		  likely (version.major == 1) &&
 		  c->check_struct (this) &&
+		  hb_barrier () &&
 		  axisSize == 20 && /* Assumed in our code. */
 		  instanceSize >= axisCount * 4 + 4 &&
 		  get_axes ().sanitize (c) &&
-		  c->check_range (get_instance (0), instanceCount, instanceSize));
+		  c->check_range (&StructAfter<InstanceRecord> (get_axes ()),
+				  instanceCount, instanceSize));
   }
 
   unsigned int get_axis_count () const { return axisCount; }
@@ -314,21 +384,19 @@ struct fvar
     return axisCount;
   }
 
-  void collect_name_ids (hb_hashmap_t<hb_tag_t, float> *user_axes_location,
+  void collect_name_ids (hb_hashmap_t<hb_tag_t, Triple> *user_axes_location,
+			 hb_map_t *axes_old_index_tag_map,
 			 hb_set_t *nameids  /* IN/OUT */) const
   {
     if (!has_data ()) return;
-    hb_map_t pinned_axes;
 
     auto axis_records = get_axes ();
     for (unsigned i = 0 ; i < (unsigned)axisCount; i++)
     {
       hb_tag_t axis_tag = axis_records[i].get_axis_tag ();
-      if (user_axes_location->has (axis_tag))
-      {
-        pinned_axes.set (i, axis_tag);
+      if (user_axes_location->has (axis_tag) &&
+          user_axes_location->get (axis_tag).is_point ())
         continue;
-      }
 
       nameids->add (axis_records[i].get_name_id ());
     }
@@ -337,16 +405,7 @@ struct fvar
     {
       const InstanceRecord *instance = get_instance (i);
 
-      if (hb_any (+ hb_enumerate (instance->get_coordinates (axisCount))
-                  | hb_filter (pinned_axes, hb_first)
-                  | hb_map ([&] (const hb_pair_t<unsigned, const F16DOT16&>& _)
-                            {
-                              hb_tag_t axis_tag = pinned_axes.get (_.first);
-                              float location = user_axes_location->get (axis_tag);
-                              if (fabs ((double)location - (double)_.second.to_float ()) > 0.001) return true;
-                              return false;
-                            })
-                  ))
+      if (!instance->keep_instance (axisCount, axes_old_index_tag_map, user_axes_location))
         continue;
 
       nameids->add (instance->subfamilyNameID);
@@ -384,21 +443,25 @@ struct fvar
     for (unsigned i = 0 ; i < (unsigned)axisCount; i++)
     {
       if (!c->plan->axes_index_map.has (i)) continue;
-      if (unlikely (!c->serializer->embed (axes_records[i])))
+      if (unlikely (!axes_records[i].subset (c)))
         return_trace (false);
     }
 
     if (!c->serializer->check_assign (out->firstAxis, get_size (), HB_SERIALIZE_ERROR_INT_OVERFLOW))
       return_trace (false);
 
+    unsigned num_retained_instances = 0;
     for (unsigned i = 0 ; i < (unsigned)instanceCount; i++)
     {
       const InstanceRecord *instance = get_instance (i);
       auto snap = c->serializer->snapshot ();
       if (!instance->subset (c, axisCount, has_postscript_nameid))
         c->serializer->revert (snap);
+      else
+        num_retained_instances++;
     }
-    return_trace (true);
+
+    return_trace (c->serializer->check_assign (out->instanceCount, num_retained_instances, HB_SERIALIZE_ERROR_INT_OVERFLOW));
   }
 
   public:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-var-gvar-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-var-gvar-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-var-gvar-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-var-gvar-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -39,60 +39,264 @@
 
 namespace OT {
 
-struct contour_point_t
+struct GlyphVariationData : TupleVariationData
+{};
+
+struct glyph_variations_t
 {
-  void init (float x_ = 0.f, float y_ = 0.f, bool is_end_point_ = false)
-  { flag = 0; x = x_; y = y_; is_end_point = is_end_point_; }
+  using tuple_variations_t = TupleVariationData::tuple_variations_t;
+  hb_vector_t<tuple_variations_t> glyph_variations;
 
-  void translate (const contour_point_t &p) { x += p.x; y += p.y; }
+  hb_vector_t<char> compiled_shared_tuples;
+  private:
+  unsigned shared_tuples_count = 0;
 
-  float x = 0.f;
-  float y = 0.f;
-  uint8_t flag = 0;
-  bool is_end_point = false;
-};
+  /* shared coords-> index map after instantiation */
+  hb_hashmap_t<const hb_vector_t<char>*, unsigned> shared_tuples_idx_map;
 
-struct contour_point_vector_t : hb_vector_t<contour_point_t>
-{
-  void extend (const hb_array_t<contour_point_t> &a)
+  public:
+  unsigned compiled_shared_tuples_count () const
+  { return shared_tuples_count; }
+
+  unsigned compiled_byte_size () const
   {
-    unsigned int old_len = length;
-    if (unlikely (!resize (old_len + a.length, false)))
-      return;
-    auto arrayZ = this->arrayZ + old_len;
-    unsigned count = a.length;
-    hb_memcpy (arrayZ, a.arrayZ, count * sizeof (arrayZ[0]));
-  }
-
-  void transform (const float (&matrix)[4])
-  {
-    if (matrix[0] == 1.f && matrix[1] == 0.f &&
-	matrix[2] == 0.f && matrix[3] == 1.f)
-      return;
-    auto arrayZ = this->arrayZ;
-    unsigned count = length;
-    for (unsigned i = 0; i < count; i++)
+    unsigned byte_size = 0;
+    for (const auto& _ : glyph_variations)
+      byte_size += _.get_compiled_byte_size ();
+
+    return byte_size;
+  }
+
+  bool create_from_glyphs_var_data (unsigned axis_count,
+                                    const hb_array_t<const F2DOT14> shared_tuples,
+                                    const hb_subset_plan_t *plan,
+                                    const hb_hashmap_t<hb_codepoint_t, hb_bytes_t>& new_gid_var_data_map)
+  {
+    if (unlikely (!glyph_variations.alloc (plan->new_to_old_gid_list.length, true)))
+      return false;
+
+    auto it = hb_iter (plan->new_to_old_gid_list);
+    for (auto &_ : it)
     {
-      contour_point_t &p = arrayZ[i];
-      float x_ = p.x * matrix[0] + p.y * matrix[2];
-	   p.y = p.x * matrix[1] + p.y * matrix[3];
-      p.x = x_;
+      hb_codepoint_t new_gid = _.first;
+      contour_point_vector_t *all_contour_points;
+      if (!new_gid_var_data_map.has (new_gid) ||
+          !plan->new_gid_contour_points_map.has (new_gid, &all_contour_points))
+        return false;
+      hb_bytes_t var_data = new_gid_var_data_map.get (new_gid);
+
+      const GlyphVariationData* p = reinterpret_cast<const GlyphVariationData*> (var_data.arrayZ);
+      hb_vector_t<unsigned> shared_indices;
+      GlyphVariationData::tuple_iterator_t iterator;
+      tuple_variations_t tuple_vars;
+
+      /* in case variation data is empty, push an empty struct into the vector,
+       * keep the vector in sync with the new_to_old_gid_list */
+      if (!var_data || ! p->has_data () || !all_contour_points->length ||
+          !GlyphVariationData::get_tuple_iterator (var_data, axis_count,
+                                                   var_data.arrayZ,
+                                                   shared_indices, &iterator))
+      {
+        glyph_variations.push (std::move (tuple_vars));
+        continue;
+      }
+
+      bool is_composite_glyph = false;
+#ifdef HB_EXPERIMENTAL_API
+      is_composite_glyph = plan->composite_new_gids.has (new_gid);
+#endif
+      if (!p->decompile_tuple_variations (all_contour_points->length, true /* is_gvar */,
+                                          iterator, &(plan->axes_old_index_tag_map),
+                                          shared_indices, shared_tuples,
+                                          tuple_vars, /* OUT */
+                                          is_composite_glyph))
+        return false;
+      glyph_variations.push (std::move (tuple_vars));
     }
+    return !glyph_variations.in_error () && glyph_variations.length == plan->new_to_old_gid_list.length;
   }
 
-  void translate (const contour_point_t& delta)
+  bool instantiate (const hb_subset_plan_t *plan)
   {
-    if (delta.x == 0.f && delta.y == 0.f)
-      return;
-    auto arrayZ = this->arrayZ;
-    unsigned count = length;
+    unsigned count = plan->new_to_old_gid_list.length;
+    bool iup_optimize = false;
+#ifdef HB_EXPERIMENTAL_API
+    iup_optimize = plan->flags & HB_SUBSET_FLAGS_OPTIMIZE_IUP_DELTAS;
+#endif
     for (unsigned i = 0; i < count; i++)
-      arrayZ[i].translate (delta);
+    {
+      hb_codepoint_t new_gid = plan->new_to_old_gid_list[i].first;
+      contour_point_vector_t *all_points;
+      if (!plan->new_gid_contour_points_map.has (new_gid, &all_points))
+        return false;
+      if (!glyph_variations[i].instantiate (plan->axes_location, plan->axes_triple_distances, all_points, iup_optimize))
+        return false;
+    }
+    return true;
   }
-};
 
-struct GlyphVariationData : TupleVariationData
-{};
+  bool compile_bytes (const hb_map_t& axes_index_map,
+                      const hb_map_t& axes_old_index_tag_map)
+  {
+    if (!compile_shared_tuples (axes_index_map, axes_old_index_tag_map))
+      return false;
+    for (tuple_variations_t& vars: glyph_variations)
+      if (!vars.compile_bytes (axes_index_map, axes_old_index_tag_map,
+                               true, /* use shared points*/
+                               &shared_tuples_idx_map))
+        return false;
+
+    return true;
+  }
+
+  bool compile_shared_tuples (const hb_map_t& axes_index_map,
+                              const hb_map_t& axes_old_index_tag_map)
+  {
+    /* key is pointer to compiled_peak_coords inside each tuple, hashing
+     * function will always deref pointers first */
+    hb_hashmap_t<const hb_vector_t<char>*, unsigned> coords_count_map;
+
+    /* count the num of shared coords */
+    for (tuple_variations_t& vars: glyph_variations)
+    {
+      for (tuple_delta_t& var : vars.tuple_vars)
+      {
+        if (!var.compile_peak_coords (axes_index_map, axes_old_index_tag_map))
+          return false;
+        unsigned* count;
+        if (coords_count_map.has (&(var.compiled_peak_coords), &count))
+          coords_count_map.set (&(var.compiled_peak_coords), *count + 1);
+        else
+          coords_count_map.set (&(var.compiled_peak_coords), 1);
+      }
+    }
+
+    if (!coords_count_map || coords_count_map.in_error ())
+      return false;
+
+    /* add only those coords that are used more than once into the vector and sort */
+    hb_vector_t<const hb_vector_t<char>*> shared_coords;
+    if (unlikely (!shared_coords.alloc (coords_count_map.get_population ())))
+      return false;
+
+    for (const auto _ : coords_count_map.iter ())
+    {
+      if (_.second == 1) continue;
+      shared_coords.push (_.first);
+    }
+
+    /* no shared tuples: no coords are used more than once */
+    if (!shared_coords) return true;
+    /* sorting based on the coords frequency first (high to low), then compare
+     * the coords bytes */
+    hb_qsort (shared_coords.arrayZ, shared_coords.length, sizeof (hb_vector_t<char>*), _cmp_coords, (void *) (&coords_count_map));
+
+    /* build shared_coords->idx map and shared tuples byte array */
+
+    shared_tuples_count = hb_min (0xFFFu + 1, shared_coords.length);
+    unsigned len = shared_tuples_count * (shared_coords[0]->length);
+    if (unlikely (!compiled_shared_tuples.alloc (len)))
+      return false;
+
+    for (unsigned i = 0; i < shared_tuples_count; i++)
+    {
+      shared_tuples_idx_map.set (shared_coords[i], i);
+      /* add a concat() in hb_vector_t? */
+      for (char c : shared_coords[i]->iter ())
+        compiled_shared_tuples.push (c);
+    }
+
+    return true;
+  }
+
+  static int _cmp_coords (const void *pa, const void *pb, void *arg)
+  {
+    const hb_hashmap_t<const hb_vector_t<char>*, unsigned>* coords_count_map =
+        reinterpret_cast<const hb_hashmap_t<const hb_vector_t<char>*, unsigned>*> (arg);
+
+    /* shared_coords is hb_vector_t<const hb_vector_t<char>*> so casting pa/pb
+     * to be a pointer to a pointer */
+    const hb_vector_t<char>** a = reinterpret_cast<const hb_vector_t<char>**> (const_cast<void*>(pa));
+    const hb_vector_t<char>** b = reinterpret_cast<const hb_vector_t<char>**> (const_cast<void*>(pb));
+
+    bool has_a = coords_count_map->has (*a);
+    bool has_b = coords_count_map->has (*b);
+
+    if (has_a && has_b)
+    {
+      unsigned a_num = coords_count_map->get (*a);
+      unsigned b_num = coords_count_map->get (*b);
+
+      if (a_num != b_num)
+        return b_num - a_num;
+
+      return (*b)->as_array().cmp ((*a)->as_array ());
+    }
+    else if (has_a) return -1;
+    else if (has_b) return 1;
+    else return 0;
+  }
+
+  template<typename Iterator,
+           hb_requires (hb_is_iterator (Iterator))>
+  bool serialize_glyph_var_data (hb_serialize_context_t *c,
+                                 Iterator it,
+                                 bool long_offset,
+                                 unsigned num_glyphs,
+                                 char* glyph_var_data_offsets /* OUT: glyph var data offsets array */) const
+  {
+    TRACE_SERIALIZE (this);
+
+    if (long_offset)
+    {
+      ((HBUINT32 *) glyph_var_data_offsets)[0] = 0;
+      glyph_var_data_offsets += 4;
+    }
+    else
+    {
+      ((HBUINT16 *) glyph_var_data_offsets)[0] = 0;
+      glyph_var_data_offsets += 2;
+    }
+    unsigned glyph_offset = 0;
+    hb_codepoint_t last_gid = 0;
+    unsigned idx = 0;
+
+    TupleVariationData* cur_glyph = c->start_embed<TupleVariationData> ();
+    if (!cur_glyph) return_trace (false);
+    for (auto &_ : it)
+    {
+      hb_codepoint_t gid = _.first;
+      if (long_offset)
+        for (; last_gid < gid; last_gid++)
+          ((HBUINT32 *) glyph_var_data_offsets)[last_gid] = glyph_offset;
+      else
+        for (; last_gid < gid; last_gid++)
+          ((HBUINT16 *) glyph_var_data_offsets)[last_gid] = glyph_offset / 2;
+
+      if (idx >= glyph_variations.length) return_trace (false);
+      if (!cur_glyph->serialize (c, true, glyph_variations[idx])) return_trace (false);
+      TupleVariationData* next_glyph = c->start_embed<TupleVariationData> ();
+      glyph_offset += (char *) next_glyph - (char *) cur_glyph;
+
+      if (long_offset)
+        ((HBUINT32 *) glyph_var_data_offsets)[gid] = glyph_offset;
+      else
+        ((HBUINT16 *) glyph_var_data_offsets)[gid] = glyph_offset / 2;
+
+      last_gid++;
+      idx++;
+      cur_glyph = next_glyph;
+    }
+
+    if (long_offset)
+      for (; last_gid < num_glyphs; last_gid++)
+        ((HBUINT32 *) glyph_var_data_offsets)[last_gid] = glyph_offset;
+    else
+      for (; last_gid < num_glyphs; last_gid++)
+        ((HBUINT16 *) glyph_var_data_offsets)[last_gid] = glyph_offset / 2;
+    return_trace (true);
+  }
+};
 
 struct gvar
 {
@@ -101,7 +305,9 @@ struct gvar
   bool sanitize_shallow (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && (version.major == 1) &&
+    return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
+		  (version.major == 1) &&
 		  sharedTuples.sanitize (c, this, axisCount * sharedTupleCount) &&
 		  (is_long_offset () ?
 		     c->check_array (get_long_offset_array (), c->get_num_glyphs () + 1) :
@@ -112,9 +318,107 @@ struct gvar
   bool sanitize (hb_sanitize_context_t *c) const
   { return sanitize_shallow (c); }
 
+  bool decompile_glyph_variations (hb_subset_context_t *c,
+                                   glyph_variations_t& glyph_vars /* OUT */) const
+  {
+    hb_hashmap_t<hb_codepoint_t, hb_bytes_t> new_gid_var_data_map;
+    auto it = hb_iter (c->plan->new_to_old_gid_list);
+    if (it->first == 0 && !(c->plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE))
+    {
+      new_gid_var_data_map.set (0, hb_bytes_t ());
+      it++;
+    }
+
+    for (auto &_ : it)
+    {
+      hb_codepoint_t new_gid = _.first;
+      hb_codepoint_t old_gid = _.second;
+      hb_bytes_t var_data_bytes = get_glyph_var_data_bytes (c->source_blob, glyphCountX, old_gid);
+      new_gid_var_data_map.set (new_gid, var_data_bytes);
+    }
+
+    if (new_gid_var_data_map.in_error ()) return false;
+
+    hb_array_t<const F2DOT14> shared_tuples = (this+sharedTuples).as_array ((unsigned) sharedTupleCount * (unsigned) axisCount);
+    return glyph_vars.create_from_glyphs_var_data (axisCount, shared_tuples, c->plan, new_gid_var_data_map);
+  }
+
+  template<typename Iterator,
+           hb_requires (hb_is_iterator (Iterator))>
+  bool serialize (hb_serialize_context_t *c,
+                  const glyph_variations_t& glyph_vars,
+                  Iterator it,
+                  unsigned axis_count,
+                  unsigned num_glyphs,
+                  bool force_long_offsets) const
+  {
+    TRACE_SERIALIZE (this);
+    gvar *out = c->allocate_min<gvar> ();
+    if (unlikely (!out)) return_trace (false);
+
+    out->version.major = 1;
+    out->version.minor = 0;
+    out->axisCount = axis_count;
+    out->glyphCountX = hb_min (0xFFFFu, num_glyphs);
+
+    unsigned glyph_var_data_size = glyph_vars.compiled_byte_size ();
+    bool long_offset = glyph_var_data_size & ~0xFFFFu || force_long_offsets;
+    out->flags = long_offset ? 1 : 0;
+
+    HBUINT8 *glyph_var_data_offsets = c->allocate_size<HBUINT8> ((long_offset ? 4 : 2) * (num_glyphs + 1), false);
+    if (!glyph_var_data_offsets) return_trace (false);
+
+    /* shared tuples */
+    unsigned shared_tuple_count = glyph_vars.compiled_shared_tuples_count ();
+    out->sharedTupleCount = shared_tuple_count;
+
+    if (!shared_tuple_count)
+      out->sharedTuples = 0;
+    else
+    {
+      hb_array_t<const char> shared_tuples = glyph_vars.compiled_shared_tuples.as_array ().copy (c);
+      if (!shared_tuples.arrayZ) return_trace (false);
+      out->sharedTuples = shared_tuples.arrayZ - (char *) out;
+    }
+
+    char *glyph_var_data = c->start_embed<char> ();
+    if (!glyph_var_data) return_trace (false);
+    out->dataZ = glyph_var_data - (char *) out;
+
+    return_trace (glyph_vars.serialize_glyph_var_data (c, it, long_offset, num_glyphs,
+                                                       (char *) glyph_var_data_offsets));
+  }
+
+  bool instantiate (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    glyph_variations_t glyph_vars;
+    if (!decompile_glyph_variations (c, glyph_vars))
+      return_trace (false);
+
+    if (!glyph_vars.instantiate (c->plan)) return_trace (false);
+    if (!glyph_vars.compile_bytes (c->plan->axes_index_map, c->plan->axes_old_index_tag_map))
+      return_trace (false);
+
+    unsigned axis_count = c->plan->axes_index_map.get_population ();
+    unsigned num_glyphs = c->plan->num_output_glyphs ();
+    auto it = hb_iter (c->plan->new_to_old_gid_list);
+
+    bool force_long_offsets = false;
+#ifdef HB_EXPERIMENTAL_API
+    force_long_offsets = c->plan->flags & HB_SUBSET_FLAGS_IFTB_REQUIREMENTS;
+#endif
+    return_trace (serialize (c->serializer, glyph_vars, it, axis_count, num_glyphs, force_long_offsets));
+  }
+
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
+    if (c->plan->all_axes_pinned)
+      return_trace (false);
+
+    if (c->plan->normalized_coords)
+      return_trace (instantiate (c));
 
     unsigned glyph_count = version.to_int () ? c->plan->source->get_num_glyphs () : 0;
 
@@ -129,20 +433,23 @@ struct gvar
     unsigned int num_glyphs = c->plan->num_output_glyphs ();
     out->glyphCountX = hb_min (0xFFFFu, num_glyphs);
 
+    auto it = hb_iter (c->plan->new_to_old_gid_list);
+    if (it->first == 0 && !(c->plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE))
+      it++;
     unsigned int subset_data_size = 0;
-    for (hb_codepoint_t gid = (c->plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE) ? 0 : 1;
-         gid < num_glyphs;
-         gid++)
+    for (auto &_ : it)
     {
-      hb_codepoint_t old_gid;
-      if (!c->plan->old_gid_for_new_gid (gid, &old_gid)) continue;
+      hb_codepoint_t old_gid = _.second;
       subset_data_size += get_glyph_var_data_bytes (c->source_blob, glyph_count, old_gid).length;
     }
 
-    bool long_offset = subset_data_size & ~0xFFFFu;
+    bool long_offset = (subset_data_size & ~0xFFFFu);
+#ifdef HB_EXPERIMENTAL_API
+    long_offset = long_offset || (c->plan->flags & HB_SUBSET_FLAGS_IFTB_REQUIREMENTS);
+#endif
     out->flags = long_offset ? 1 : 0;
 
-    HBUINT8 *subset_offsets = c->serializer->allocate_size<HBUINT8> ((long_offset ? 4 : 2) * (num_glyphs + 1));
+    HBUINT8 *subset_offsets = c->serializer->allocate_size<HBUINT8> ((long_offset ? 4 : 2) * (num_glyphs + 1), false);
     if (!subset_offsets) return_trace (false);
 
     /* shared tuples */
@@ -157,36 +464,63 @@ struct gvar
       hb_memcpy (tuples, this+sharedTuples, shared_tuple_size);
     }
 
-    char *subset_data = c->serializer->allocate_size<char> (subset_data_size);
+    /* This ordering relative to the shared tuples array, which puts the glyphVariationData
+       last in the table, is required when HB_SUBSET_FLAGS_IFTB_REQUIREMENTS is set */
+    char *subset_data = c->serializer->allocate_size<char> (subset_data_size, false);
     if (!subset_data) return_trace (false);
     out->dataZ = subset_data - (char *) out;
 
+
+    if (long_offset)
+    {
+      ((HBUINT32 *) subset_offsets)[0] = 0;
+      subset_offsets += 4;
+    }
+    else
+    {
+      ((HBUINT16 *) subset_offsets)[0] = 0;
+      subset_offsets += 2;
+    }
     unsigned int glyph_offset = 0;
-    for (hb_codepoint_t gid = (c->plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE) ? 0 : 1;
-         gid < num_glyphs;
-         gid++)
-    {
-      hb_codepoint_t old_gid;
-      hb_bytes_t var_data_bytes = c->plan->old_gid_for_new_gid (gid, &old_gid)
-				? get_glyph_var_data_bytes (c->source_blob,
+
+    hb_codepoint_t last = 0;
+    it = hb_iter (c->plan->new_to_old_gid_list);
+    if (it->first == 0 && !(c->plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE))
+      it++;
+    for (auto &_ : it)
+    {
+      hb_codepoint_t gid = _.first;
+      hb_codepoint_t old_gid = _.second;
+
+      if (long_offset)
+	for (; last < gid; last++)
+	  ((HBUINT32 *) subset_offsets)[last] = glyph_offset;
+      else
+	for (; last < gid; last++)
+	  ((HBUINT16 *) subset_offsets)[last] = glyph_offset / 2;
+
+      hb_bytes_t var_data_bytes = get_glyph_var_data_bytes (c->source_blob,
 							    glyph_count,
-							    old_gid)
-				: hb_bytes_t ();
+							    old_gid);
+
+      hb_memcpy (subset_data, var_data_bytes.arrayZ, var_data_bytes.length);
+      subset_data += var_data_bytes.length;
+      glyph_offset += var_data_bytes.length;
 
       if (long_offset)
 	((HBUINT32 *) subset_offsets)[gid] = glyph_offset;
       else
 	((HBUINT16 *) subset_offsets)[gid] = glyph_offset / 2;
 
-      if (var_data_bytes.length > 0)
-	hb_memcpy (subset_data, var_data_bytes.arrayZ, var_data_bytes.length);
-      subset_data += var_data_bytes.length;
-      glyph_offset += var_data_bytes.length;
+      last++; // Skip over gid
     }
+
     if (long_offset)
-      ((HBUINT32 *) subset_offsets)[num_glyphs] = glyph_offset;
+      for (; last < num_glyphs; last++)
+	((HBUINT32 *) subset_offsets)[last] = glyph_offset;
     else
-      ((HBUINT16 *) subset_offsets)[num_glyphs] = glyph_offset / 2;
+      for (; last < num_glyphs; last++)
+	((HBUINT16 *) subset_offsets)[last] = glyph_offset / 2;
 
     return_trace (true);
   }
@@ -235,21 +569,24 @@ struct gvar
       for (unsigned i = 0; i < count; i++)
       {
 	hb_array_t<const F2DOT14> tuple = shared_tuples.sub_array (axis_count * i, axis_count);
-	int idx = -1;
+	int idx1 = -1, idx2 = -1;
 	for (unsigned j = 0; j < axis_count; j++)
 	{
-	  F2DOT14 peak = tuple.arrayZ[j];
+	  const F2DOT14 &peak = tuple.arrayZ[j];
 	  if (peak.to_int () != 0)
 	  {
-	    if (idx != -1)
+	    if (idx1 == -1)
+	      idx1 = j;
+	    else if (idx2 == -1)
+	      idx2 = j;
+	    else
 	    {
-	      idx = -1;
+	      idx1 = idx2 = -1;
 	      break;
 	    }
-	    idx = j;
 	  }
 	}
-	shared_tuple_active_idx[i] = idx;
+	shared_tuple_active_idx.arrayZ[i] = {idx1, idx2};
       }
     }
     ~accelerator_t () { table.destroy (); }
@@ -285,10 +622,9 @@ struct gvar
     public:
     bool apply_deltas_to_points (hb_codepoint_t glyph,
 				 hb_array_t<int> coords,
-				 const hb_array_t<contour_point_t> points) const
+				 const hb_array_t<contour_point_t> points,
+				 bool phantom_only = false) const
     {
-      if (!coords) return true;
-
       if (unlikely (glyph >= glyphCount)) return true;
 
       hb_bytes_t var_data_bytes = table->get_glyph_var_data_bytes (table.get_blob (), glyphCount, glyph);
@@ -311,16 +647,17 @@ struct gvar
       hb_vector_t<unsigned> end_points; // Populated lazily
 
       unsigned num_coords = table->axisCount;
-      hb_array_t<const F2DOT14> shared_tuples = (table+table->sharedTuples).as_array (table->sharedTupleCount * table->axisCount);
+      hb_array_t<const F2DOT14> shared_tuples = (table+table->sharedTuples).as_array (table->sharedTupleCount * num_coords);
 
       hb_vector_t<unsigned int> private_indices;
       hb_vector_t<int> x_deltas;
       hb_vector_t<int> y_deltas;
+      unsigned count = points.length;
       bool flush = false;
       do
       {
 	float scalar = iterator.current_tuple->calculate_scalar (coords, num_coords, shared_tuples,
-								 shared_tuple_active_idx.in_error () ? nullptr : &shared_tuple_active_idx);
+								 &shared_tuple_active_idx);
 	if (scalar == 0.f) continue;
 	const HBUINT8 *p = iterator.get_serialized_data ();
 	unsigned int length = iterator.current_tuple->get_data_size ();
@@ -329,8 +666,10 @@ struct gvar
 
 	if (!deltas)
 	{
-	  if (unlikely (!deltas_vec.resize (points.length))) return false;
+	  if (unlikely (!deltas_vec.resize (count, false))) return false;
 	  deltas = deltas_vec.as_array ();
+	  hb_memset (deltas.arrayZ + (phantom_only ? count - 4 : 0), 0,
+		     (phantom_only ? 4 : count) * sizeof (deltas[0]));
 	}
 
 	const HBUINT8 *end = p + length;
@@ -350,7 +689,7 @@ struct gvar
 
 	if (!apply_to_all)
 	{
-	  if (!orig_points)
+	  if (!orig_points && !phantom_only)
 	  {
 	    orig_points_vec.extend (points);
 	    if (unlikely (orig_points_vec.in_error ())) return false;
@@ -359,15 +698,17 @@ struct gvar
 
 	  if (flush)
 	  {
-	    for (unsigned int i = 0; i < points.length; i++)
+	    for (unsigned int i = phantom_only ? count - 4 : 0; i < count; i++)
 	      points.arrayZ[i].translate (deltas.arrayZ[i]);
 	    flush = false;
 
 	  }
-	  hb_memset (deltas.arrayZ, 0, deltas.get_size ());
+	  hb_memset (deltas.arrayZ + (phantom_only ? count - 4 : 0), 0,
+		     (phantom_only ? 4 : count) * sizeof (deltas[0]));
 	}
 
-	if (scalar != 1.0f)
+	if (HB_OPTIMIZE_SIZE_VAL)
+	{
 	  for (unsigned int i = 0; i < num_deltas; i++)
 	  {
 	    unsigned int pt_index;
@@ -378,34 +719,68 @@ struct gvar
 	      pt_index = indices[i];
 	      if (unlikely (pt_index >= deltas.length)) continue;
 	    }
+	    if (phantom_only && pt_index < count - 4) continue;
 	    auto &delta = deltas.arrayZ[pt_index];
 	    delta.flag = 1;	/* this point is referenced, i.e., explicit deltas specified */
 	    delta.x += x_deltas.arrayZ[i] * scalar;
 	    delta.y += y_deltas.arrayZ[i] * scalar;
 	  }
+	}
 	else
-	  for (unsigned int i = 0; i < num_deltas; i++)
+	{
+	  /* Ouch. Four cases... for optimization. */
+	  if (scalar != 1.0f)
 	  {
-	    unsigned int pt_index;
 	    if (apply_to_all)
-	      pt_index = i;
+	      for (unsigned int i = phantom_only ? count - 4 : 0; i < count; i++)
+	      {
+		unsigned int pt_index = i;
+		auto &delta = deltas.arrayZ[pt_index];
+		delta.x += x_deltas.arrayZ[i] * scalar;
+		delta.y += y_deltas.arrayZ[i] * scalar;
+	      }
 	    else
-	    {
-	      pt_index = indices[i];
-	      if (unlikely (pt_index >= deltas.length)) continue;
-	    }
-	    auto &delta = deltas.arrayZ[pt_index];
-	    delta.flag = 1;	/* this point is referenced, i.e., explicit deltas specified */
-	    delta.x += x_deltas.arrayZ[i];
-	    delta.y += y_deltas.arrayZ[i];
+	      for (unsigned int i = 0; i < num_deltas; i++)
+	      {
+		unsigned int pt_index = indices[i];
+		if (unlikely (pt_index >= deltas.length)) continue;
+		if (phantom_only && pt_index < count - 4) continue;
+		auto &delta = deltas.arrayZ[pt_index];
+		delta.flag = 1;	/* this point is referenced, i.e., explicit deltas specified */
+		delta.x += x_deltas.arrayZ[i] * scalar;
+		delta.y += y_deltas.arrayZ[i] * scalar;
+	      }
+	  }
+	  else
+	  {
+	    if (apply_to_all)
+	      for (unsigned int i = phantom_only ? count - 4 : 0; i < count; i++)
+	      {
+		unsigned int pt_index = i;
+		auto &delta = deltas.arrayZ[pt_index];
+		delta.x += x_deltas.arrayZ[i];
+		delta.y += y_deltas.arrayZ[i];
+	      }
+	    else
+	      for (unsigned int i = 0; i < num_deltas; i++)
+	      {
+		unsigned int pt_index = indices[i];
+		if (unlikely (pt_index >= deltas.length)) continue;
+		if (phantom_only && pt_index < count - 4) continue;
+		auto &delta = deltas.arrayZ[pt_index];
+		delta.flag = 1;	/* this point is referenced, i.e., explicit deltas specified */
+		delta.x += x_deltas.arrayZ[i];
+		delta.y += y_deltas.arrayZ[i];
+	      }
 	  }
+	}
 
 	/* infer deltas for unreferenced points */
-	if (!apply_to_all)
+	if (!apply_to_all && !phantom_only)
 	{
 	  if (!end_points)
 	  {
-	    for (unsigned i = 0; i < points.length; ++i)
+	    for (unsigned i = 0; i < count; ++i)
 	      if (points.arrayZ[i].is_end_point)
 		end_points.push (i);
 	    if (unlikely (end_points.in_error ())) return false;
@@ -465,8 +840,10 @@ struct gvar
       } while (iterator.move_to_next ());
 
       if (flush)
-	for (unsigned int i = 0; i < points.length; i++)
+      {
+	for (unsigned int i = phantom_only ? count - 4 : 0; i < count; i++)
 	  points.arrayZ[i].translate (deltas.arrayZ[i]);
+      }
 
       return true;
     }
@@ -476,7 +853,7 @@ struct gvar
     private:
     hb_blob_ptr_t<gvar> table;
     unsigned glyphCount;
-    hb_vector_t<signed> shared_tuple_active_idx;
+    hb_vector_t<hb_pair_t<int, int>> shared_tuple_active_idx;
   };
 
   protected:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-var-hvar-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-var-hvar-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-var-hvar-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-var-hvar-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -45,7 +45,8 @@ struct index_map_subset_plan_t
   void init (const DeltaSetIndexMap  &index_map,
 	     hb_inc_bimap_t	     &outer_map,
 	     hb_vector_t<hb_set_t *> &inner_sets,
-	     const hb_subset_plan_t  *plan)
+	     const hb_subset_plan_t  *plan,
+	     bool bypass_empty = true)
   {
     map_count = 0;
     outer_bit_count = 0;
@@ -53,55 +54,51 @@ struct index_map_subset_plan_t
     max_inners.init ();
     output_map.init ();
 
-    if (&index_map == &Null (DeltaSetIndexMap)) return;
+    if (bypass_empty && !index_map.get_map_count ()) return;
 
     unsigned int	last_val = (unsigned int)-1;
-    hb_codepoint_t	last_gid = (hb_codepoint_t)-1;
-    hb_codepoint_t	gid = (hb_codepoint_t) hb_min (index_map.get_map_count (), plan->num_output_glyphs ());
+    hb_codepoint_t	last_gid = HB_CODEPOINT_INVALID;
 
     outer_bit_count = (index_map.get_width () * 8) - index_map.get_inner_bit_count ();
     max_inners.resize (inner_sets.length);
     for (unsigned i = 0; i < inner_sets.length; i++) max_inners[i] = 0;
 
     /* Search backwards for a map value different from the last map value */
-    for (; gid > 0; gid--)
+    auto &new_to_old_gid_list = plan->new_to_old_gid_list;
+    unsigned count = new_to_old_gid_list.length;
+    for (unsigned j = count; j; j--)
     {
-      hb_codepoint_t	old_gid;
-      if (!plan->old_gid_for_new_gid (gid - 1, &old_gid))
-      {
-	if (last_gid == (hb_codepoint_t) -1)
-	  continue;
-	else
-	  break;
-      }
+      hb_codepoint_t gid = new_to_old_gid_list.arrayZ[j - 1].first;
+      hb_codepoint_t old_gid = new_to_old_gid_list.arrayZ[j - 1].second;
 
       unsigned int v = index_map.map (old_gid);
-      if (last_gid == (hb_codepoint_t) -1)
+      if (last_gid == HB_CODEPOINT_INVALID)
       {
 	last_val = v;
 	last_gid = gid;
 	continue;
       }
-      if (v != last_val) break;
+      if (v != last_val)
+	break;
 
       last_gid = gid;
     }
 
     if (unlikely (last_gid == (hb_codepoint_t)-1)) return;
-    map_count = last_gid;
-    for (gid = 0; gid < map_count; gid++)
+    map_count = last_gid + 1;
+    for (auto _ : plan->new_to_old_gid_list)
     {
-      hb_codepoint_t	old_gid;
-      if (plan->old_gid_for_new_gid (gid, &old_gid))
-      {
-	unsigned int v = index_map.map (old_gid);
-	unsigned int outer = v >> 16;
-	unsigned int inner = v & 0xFFFF;
-	outer_map.add (outer);
-	if (inner > max_inners[outer]) max_inners[outer] = inner;
-	if (outer >= inner_sets.length) return;
-	inner_sets[outer]->add (inner);
-      }
+      hb_codepoint_t gid = _.first;
+      if (gid >= map_count) break;
+
+      hb_codepoint_t old_gid = _.second;
+      unsigned int v = index_map.map (old_gid);
+      unsigned int outer = v >> 16;
+      unsigned int inner = v & 0xFFFF;
+      outer_map.add (outer);
+      if (inner > max_inners[outer]) max_inners[outer] = inner;
+      if (outer >= inner_sets.length) return;
+      inner_sets[outer]->add (inner);
     }
   }
 
@@ -116,8 +113,6 @@ struct index_map_subset_plan_t
 	      const hb_vector_t<hb_inc_bimap_t> &inner_maps,
 	      const hb_subset_plan_t *plan)
   {
-    if (input_map == &Null (DeltaSetIndexMap)) return;
-
     for (unsigned int i = 0; i < max_inners.length; i++)
     {
       if (inner_maps[i].get_population () == 0) continue;
@@ -125,21 +120,50 @@ struct index_map_subset_plan_t
       if (bit_count > inner_bit_count) inner_bit_count = bit_count;
     }
 
-    output_map.resize (map_count);
-    for (hb_codepoint_t gid = 0; gid < output_map.length; gid++)
+    if (unlikely (!output_map.resize (map_count))) return;
+    for (const auto &_ : plan->new_to_old_gid_list)
     {
-      hb_codepoint_t	old_gid;
-      if (plan->old_gid_for_new_gid (gid, &old_gid))
-      {
-	uint32_t v = input_map->map (old_gid);
-	unsigned int outer = v >> 16;
-	output_map[gid] = (outer_map[outer] << 16) | (inner_maps[outer][v & 0xFFFF]);
-      }
-      else
-	output_map[gid] = 0;	/* Map unused glyph to outer/inner=0/0 */
+      hb_codepoint_t new_gid = _.first;
+      hb_codepoint_t old_gid = _.second;
+
+      if (unlikely (new_gid >= map_count)) break;
+
+      uint32_t v = input_map->map (old_gid);
+      unsigned int outer = v >> 16;
+      output_map.arrayZ[new_gid] = (outer_map[outer] << 16) | (inner_maps[outer][v & 0xFFFF]);
     }
   }
 
+  bool remap_after_instantiation (const hb_subset_plan_t *plan,
+                                  const hb_map_t& varidx_map)
+  {
+    /* recalculate bit_count after remapping */
+    outer_bit_count = 1;
+    inner_bit_count = 1;
+
+    for (const auto &_ : plan->new_to_old_gid_list)
+    {
+      hb_codepoint_t new_gid = _.first;
+      if (unlikely (new_gid >= map_count)) break;
+
+      uint32_t v = output_map.arrayZ[new_gid];
+      uint32_t *new_varidx;
+      if (!varidx_map.has (v, &new_varidx))
+        return false;
+
+      output_map.arrayZ[new_gid] = *new_varidx;
+
+      unsigned outer = (*new_varidx) >> 16;
+      unsigned bit_count = (outer == 0) ? 1 : hb_bit_storage (outer);
+      outer_bit_count = hb_max (bit_count, outer_bit_count);
+      
+      unsigned inner = (*new_varidx) & 0xFFFF;
+      bit_count = (inner == 0) ? 1 : hb_bit_storage (inner);
+      inner_bit_count = hb_max (bit_count, inner_bit_count);
+    }
+    return true;
+  }
+
   unsigned int get_inner_bit_count () const { return inner_bit_count; }
   unsigned int get_width ()           const { return ((outer_bit_count + inner_bit_count + 7) / 8); }
   unsigned int get_map_count ()       const { return map_count; }
@@ -164,7 +188,7 @@ struct hvarvvar_subset_plan_t
   ~hvarvvar_subset_plan_t() { fini (); }
 
   void init (const hb_array_t<const DeltaSetIndexMap *> &index_maps,
-	     const VariationStore &_var_store,
+	     const ItemVariationStore &_var_store,
 	     const hb_subset_plan_t *plan)
   {
     index_map_plans.resize (index_maps.length);
@@ -180,7 +204,7 @@ struct hvarvvar_subset_plan_t
     if (unlikely (!index_map_plans.length || !inner_sets.length || !inner_maps.length)) return;
 
     bool retain_adv_map = false;
-    index_map_plans[0].init (*index_maps[0], outer_map, inner_sets, plan);
+    index_map_plans[0].init (*index_maps[0], outer_map, inner_sets, plan, false);
     if (index_maps[0] == &Null (DeltaSetIndexMap))
     {
       retain_adv_map = plan->flags & HB_SUBSET_FLAGS_RETAIN_GIDS;
@@ -197,12 +221,10 @@ struct hvarvvar_subset_plan_t
 
     if (retain_adv_map)
     {
-      for (hb_codepoint_t gid = 0; gid < plan->num_output_glyphs (); gid++)
+      for (const auto &_ : plan->new_to_old_gid_list)
       {
-	if (inner_sets[0]->has (gid))
-	  inner_maps[0].add (gid);
-	else
-	  inner_maps[0].skip ();
+        hb_codepoint_t old_gid = _.second;
+	inner_maps[0].add (old_gid);
       }
     }
     else
@@ -219,6 +241,16 @@ struct hvarvvar_subset_plan_t
       index_map_plans[i].remap (index_maps[i], outer_map, inner_maps, plan);
   }
 
+  /* remap */
+  bool remap_index_map_plans (const hb_subset_plan_t *plan,
+                              const hb_map_t& varidx_map)
+  {
+    for (unsigned i = 0; i < index_map_plans.length; i++)
+      if (!index_map_plans[i].remap_after_instantiation (plan, varidx_map))
+        return false;
+    return true;
+  }
+
   void fini ()
   {
     for (unsigned int i = 0; i < inner_sets.length; i++)
@@ -231,7 +263,7 @@ struct hvarvvar_subset_plan_t
   hb_inc_bimap_t outer_map;
   hb_vector_t<hb_inc_bimap_t> inner_maps;
   hb_vector_t<index_map_subset_plan_t> index_map_plans;
-  const VariationStore *var_store;
+  const ItemVariationStore *var_store;
 
   protected:
   hb_vector_t<hb_set_t *> inner_sets;
@@ -256,6 +288,7 @@ struct HVARVVAR
   {
     TRACE_SANITIZE (this);
     return_trace (version.sanitize (c) &&
+		  hb_barrier () &&
 		  likely (version.major == 1) &&
 		  varStore.sanitize (c, this) &&
 		  advMap.sanitize (c, this) &&
@@ -263,7 +296,7 @@ struct HVARVVAR
 		  rsbMap.sanitize (c, this));
   }
 
-  const VariationStore& get_var_store () const
+  const ItemVariationStore& get_var_store () const
   { return this+varStore; }
 
   void listup_index_maps (hb_vector_t<const DeltaSetIndexMap *> &index_maps) const
@@ -297,6 +330,9 @@ struct HVARVVAR
   bool _subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
+    if (c->plan->all_axes_pinned)
+      return_trace (false);
+
     hvarvvar_subset_plan_t	hvar_plan;
     hb_vector_t<const DeltaSetIndexMap *>
 				index_maps;
@@ -310,11 +346,37 @@ struct HVARVVAR
     out->version.major = 1;
     out->version.minor = 0;
 
-    if (unlikely (!out->varStore
-		      .serialize_serialize (c->serializer,
-					    hvar_plan.var_store,
-					    hvar_plan.inner_maps.as_array ())))
+    if (c->plan->normalized_coords)
+    {
+      item_variations_t item_vars;
+      if (!item_vars.instantiate (this+varStore, c->plan,
+                                  advMap == 0 ? false : true,
+                                  false, /* use_no_variation_idx = false */
+                                  hvar_plan.inner_maps.as_array ()))
+        return_trace (false);
+
+      if (!out->varStore.serialize_serialize (c->serializer,
+                                              item_vars.has_long_word (),
+                                              c->plan->axis_tags,
+                                              item_vars.get_region_list (),
+                                              item_vars.get_vardata_encodings ()))
+        return_trace (false);
+
+      /* if varstore is optimized, remap output_map */
+      if (advMap)
+      {
+        if (!hvar_plan.remap_index_map_plans (c->plan, item_vars.get_varidx_map ()))
+          return_trace (false);
+      }
+    }
+    else
+    {
+      if (unlikely (!out->varStore
+		    .serialize_serialize (c->serializer,
+					  hvar_plan.var_store,
+					  hvar_plan.inner_maps.as_array ())))
       return_trace (false);
+    }
 
     return_trace (out->T::serialize_index_maps (c->serializer,
 						hvar_plan.index_map_plans.as_array ()));
@@ -322,7 +384,7 @@ struct HVARVVAR
 
   float get_advance_delta_unscaled (hb_codepoint_t  glyph,
 				    const int *coords, unsigned int coord_count,
-				    VariationStore::cache_t *store_cache = nullptr) const
+				    ItemVariationStore::cache_t *store_cache = nullptr) const
   {
     uint32_t varidx = (this+advMap).map (glyph);
     return (this+varStore).get_delta (varidx,
@@ -343,7 +405,7 @@ struct HVARVVAR
   public:
   FixedVersion<>version;	/* Version of the metrics variation table
 				 * initially set to 0x00010000u */
-  Offset32To<VariationStore>
+  Offset32To<ItemVariationStore>
 		varStore;	/* Offset to item variation store table. */
   Offset32To<DeltaSetIndexMap>
 		advMap;		/* Offset to advance var-idx mapping. */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-var-mvar-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-var-mvar-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-var-mvar-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-var-mvar-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -27,7 +27,7 @@
 #ifndef HB_OT_VAR_MVAR_TABLE_HH
 #define HB_OT_VAR_MVAR_TABLE_HH
 
-#include "hb-ot-layout-common.hh"
+#include "hb-ot-var-common.hh"
 
 
 namespace OT {
@@ -41,9 +41,22 @@ struct VariationValueRecord
     return_trace (c->check_struct (this));
   }
 
+  bool subset (hb_subset_context_t *c,
+               const hb_map_t& varidx_map) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+
+    hb_codepoint_t *new_idx;
+    return_trace (c->serializer->check_assign (out->varIdx,
+                                               (varidx_map.has (varIdx, &new_idx)) ? *new_idx : HB_OT_LAYOUT_NO_VARIATIONS_INDEX,
+                                               HB_SERIALIZE_ERROR_INT_OVERFLOW));
+  }
+
   public:
   Tag		valueTag;	/* Four-byte tag identifying a font-wide measure. */
-  VarIdx	varIdx;		/* Outer/inner index into VariationStore item. */
+  VarIdx	varIdx;		/* Outer/inner index into ItemVariationStore item. */
 
   public:
   DEFINE_SIZE_STATIC (8);
@@ -64,8 +77,10 @@ struct MVAR
   {
     TRACE_SANITIZE (this);
     return_trace (version.sanitize (c) &&
+		  hb_barrier () &&
 		  likely (version.major == 1) &&
 		  c->check_struct (this) &&
+		  hb_barrier () &&
 		  valueRecordSize >= VariationValueRecord::static_size &&
 		  varStore.sanitize (c, this) &&
 		  c->check_range (valuesZ.arrayZ,
@@ -73,6 +88,47 @@ struct MVAR
 				  valueRecordSize));
   }
 
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+#ifdef HB_NO_VAR
+    return_trace (false);
+#endif
+
+    if (c->plan->all_axes_pinned)
+      return_trace (false);
+
+    MVAR *out = c->serializer->start_embed (*this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+    out->version = version;
+    out->reserved = reserved;
+    out->valueRecordSize = valueRecordSize;
+    out->valueRecordCount = valueRecordCount;
+
+    item_variations_t item_vars;
+    const ItemVariationStore& src_var_store = this+varStore;
+
+    if (!item_vars.instantiate (src_var_store, c->plan))
+      return_trace (false);
+
+    /* serialize varstore */
+    if (!out->varStore.serialize_serialize (c->serializer, item_vars.has_long_word (),
+                                            c->plan->axis_tags,
+                                            item_vars.get_region_list (),
+                                            item_vars.get_vardata_encodings ()))
+      return_trace (false);
+
+    /* serialize value records array */
+    unsigned value_rec_count = valueRecordCount;
+    const VariationValueRecord *record = reinterpret_cast<const VariationValueRecord*> (valuesZ.arrayZ);
+    for (unsigned i = 0; i < value_rec_count; i++)
+    {
+      if (!record->subset (c, item_vars.get_varidx_map ())) return_trace (false);
+      record++;
+    }
+    return_trace (true);
+  }
+
   float get_var (hb_tag_t tag,
 		 const int *coords, unsigned int coord_count) const
   {
@@ -103,7 +159,7 @@ protected:
   HBUINT16	valueRecordSize;/* The size in bytes of each value record —
 				 * must be greater than zero. */
   HBUINT16	valueRecordCount;/* The number of value records — may be zero. */
-  Offset16To<VariationStore>
+  Offset16To<ItemVariationStore>
 		varStore;	/* Offset to item variation store table. */
   UnsizedArrayOf<HBUINT8>
 		valuesZ;	/* Array of value records. The records must be
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-vorg-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-vorg-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ot-vorg-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ot-vorg-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -90,7 +90,7 @@ struct VORG
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    VORG *vorg_prime = c->serializer->start_embed<VORG> ();
+    auto *vorg_prime = c->serializer->start_embed<VORG> ();
     if (unlikely (!c->serializer->check_success (vorg_prime))) return_trace (false);
 
     auto it =
@@ -117,6 +117,7 @@ struct VORG
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
+		  hb_barrier () &&
 		  version.major == 1 &&
 		  vertYOrigins.sanitize (c));
   }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-paint.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-paint.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-paint.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-paint.cc	2024-11-20 13:56:33.000000000 +0000
@@ -54,6 +54,12 @@ static void
 hb_paint_pop_transform_nil (hb_paint_funcs_t *funcs, void *paint_data,
                             void *user_data) {}
 
+static hb_bool_t
+hb_paint_color_glyph_nil (hb_paint_funcs_t *funcs, void *paint_data,
+                          hb_codepoint_t glyph,
+                          hb_font_t *font,
+                          void *user_data) { return false; }
+
 static void
 hb_paint_push_clip_glyph_nil (hb_paint_funcs_t *funcs, void *paint_data,
                               hb_codepoint_t glyph,
@@ -474,6 +480,25 @@ hb_paint_pop_transform (hb_paint_funcs_t
 }
 
 /**
+ * hb_paint_color_glyph:
+ * @funcs: paint functions
+ * @paint_data: associated data passed by the caller
+ * @glyph: the glyph ID
+ * @font: the font
+ *
+ * Perform a "color-glyph" paint operation.
+ *
+ * Since: 8.2.0
+ */
+hb_bool_t
+hb_paint_color_glyph (hb_paint_funcs_t *funcs, void *paint_data,
+                      hb_codepoint_t glyph,
+                      hb_font_t *font)
+{
+  return funcs->color_glyph (paint_data, glyph, font);
+}
+
+/**
  * hb_paint_push_clip_glyph:
  * @funcs: paint functions
  * @paint_data: associated data passed by the caller
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-paint.h 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-paint.h
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-paint.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-paint.h	2024-11-20 13:56:33.000000000 +0000
@@ -137,6 +137,26 @@ typedef void (*hb_paint_pop_transform_fu
                                                void *user_data);
 
 /**
+ * hb_paint_color_glyph_func_t:
+ * @funcs: paint functions object
+ * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
+ * @glyph: the glyph ID
+ * @font: the font
+ * @user_data: User data pointer passed to hb_paint_funcs_set_color_glyph_func()
+ *
+ * A virtual method for the #hb_paint_funcs_t to render a color glyph by glyph index.
+ *
+ * Return value: %true if the glyph was painted, %false otherwise.
+ *
+ * Since: 8.2.0
+ */
+typedef hb_bool_t (*hb_paint_color_glyph_func_t) (hb_paint_funcs_t *funcs,
+                                                  void *paint_data,
+                                                  hb_codepoint_t glyph,
+                                                  hb_font_t *font,
+                                                  void *user_data);
+
+/**
  * hb_paint_push_clip_glyph_func_t:
  * @funcs: paint functions object
  * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
@@ -724,6 +744,23 @@ hb_paint_funcs_set_pop_transform_func (h
                                        hb_destroy_func_t              destroy);
 
 /**
+ * hb_paint_funcs_set_color_glyph_func:
+ * @funcs: A paint functions struct
+ * @func: (closure user_data) (destroy destroy) (scope notified): The color-glyph callback
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): Function to call when @user_data is no longer needed
+ *
+ * Sets the color-glyph callback on the paint functions struct.
+ *
+ * Since: 8.2.0
+ */
+HB_EXTERN void
+hb_paint_funcs_set_color_glyph_func (hb_paint_funcs_t                *funcs,
+				     hb_paint_color_glyph_func_t     func,
+				     void                            *user_data,
+				     hb_destroy_func_t                destroy);
+
+/**
  * hb_paint_funcs_set_push_clip_glyph_func:
  * @funcs: A paint functions struct
  * @func: (closure user_data) (destroy destroy) (scope notified): The push-clip-glyph callback
@@ -922,6 +959,11 @@ hb_paint_push_transform (hb_paint_funcs_
 HB_EXTERN void
 hb_paint_pop_transform (hb_paint_funcs_t *funcs, void *paint_data);
 
+HB_EXTERN hb_bool_t
+hb_paint_color_glyph (hb_paint_funcs_t *funcs, void *paint_data,
+                      hb_codepoint_t glyph,
+                      hb_font_t *font);
+
 HB_EXTERN void
 hb_paint_push_clip_glyph (hb_paint_funcs_t *funcs, void *paint_data,
                           hb_codepoint_t glyph,
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-paint.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-paint.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-paint.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-paint.hh	2024-11-20 13:56:33.000000000 +0000
@@ -32,6 +32,7 @@
 #define HB_PAINT_FUNCS_IMPLEMENT_CALLBACKS \
   HB_PAINT_FUNC_IMPLEMENT (push_transform) \
   HB_PAINT_FUNC_IMPLEMENT (pop_transform) \
+  HB_PAINT_FUNC_IMPLEMENT (color_glyph) \
   HB_PAINT_FUNC_IMPLEMENT (push_clip_glyph) \
   HB_PAINT_FUNC_IMPLEMENT (push_clip_rectangle) \
   HB_PAINT_FUNC_IMPLEMENT (pop_clip) \
@@ -77,6 +78,13 @@ struct hb_paint_funcs_t
   void pop_transform (void *paint_data)
   { func.pop_transform (this, paint_data,
                         !user_data ? nullptr : user_data->pop_transform); }
+  bool color_glyph (void *paint_data,
+                    hb_codepoint_t glyph,
+                    hb_font_t *font)
+  { return func.color_glyph (this, paint_data,
+                             glyph,
+                             font,
+                             !user_data ? nullptr : user_data->push_clip_glyph); }
   void push_clip_glyph (void *paint_data,
                         hb_codepoint_t glyph,
                         hb_font_t *font)
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-pool.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-pool.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-pool.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-pool.hh	2024-11-20 13:56:33.000000000 +0000
@@ -58,7 +58,7 @@ struct hb_pool_t
     if (unlikely (!next))
     {
       if (unlikely (!chunks.alloc (chunks.length + 1))) return nullptr;
-      chunk_t *chunk = (chunk_t *) hb_calloc (1, sizeof (chunk_t));
+      chunk_t *chunk = (chunk_t *) hb_malloc (sizeof (chunk_t));
       if (unlikely (!chunk)) return nullptr;
       chunks.push (chunk);
       next = chunk->thread ();
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-priority-queue.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-priority-queue.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-priority-queue.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-priority-queue.hh	2024-11-20 13:56:33.000000000 +0000
@@ -42,10 +42,11 @@
  * priority of its children. The heap is stored in an array, with the
  * children of node i stored at indices 2i + 1 and 2i + 2.
  */
+template <typename K>
 struct hb_priority_queue_t
 {
  private:
-  typedef hb_pair_t<int64_t, unsigned> item_t;
+  typedef hb_pair_t<K, unsigned> item_t;
   hb_vector_t<item_t> heap;
 
  public:
@@ -54,13 +55,22 @@ struct hb_priority_queue_t
 
   bool in_error () const { return heap.in_error (); }
 
-  void insert (int64_t priority, unsigned value)
+  bool alloc (unsigned size)
+  { return heap.alloc (size); }
+
+#ifndef HB_OPTIMIZE_SIZE
+  HB_ALWAYS_INLINE
+#endif
+  void insert (K priority, unsigned value)
   {
     heap.push (item_t (priority, value));
     if (unlikely (heap.in_error ())) return;
     bubble_up (heap.length - 1);
   }
 
+#ifndef HB_OPTIMIZE_SIZE
+  HB_ALWAYS_INLINE
+#endif
   item_t pop_minimum ()
   {
     assert (!is_empty ());
@@ -106,8 +116,10 @@ struct hb_priority_queue_t
     return 2 * index + 2;
   }
 
+  HB_ALWAYS_INLINE
   void bubble_down (unsigned index)
   {
+    repeat:
     assert (index < heap.length);
 
     unsigned left = left_child (index);
@@ -123,19 +135,21 @@ struct hb_priority_queue_t
         && (!has_right || heap.arrayZ[index].first <= heap.arrayZ[right].first))
       return;
 
+    unsigned child;
     if (!has_right || heap.arrayZ[left].first < heap.arrayZ[right].first)
-    {
-      swap (index, left);
-      bubble_down (left);
-      return;
-    }
+      child = left;
+    else
+      child = right;
 
-    swap (index, right);
-    bubble_down (right);
+    swap (index, child);
+    index = child;
+    goto repeat;
   }
 
+  HB_ALWAYS_INLINE
   void bubble_up (unsigned index)
   {
+    repeat:
     assert (index < heap.length);
 
     if (index == 0) return;
@@ -145,10 +159,11 @@ struct hb_priority_queue_t
       return;
 
     swap (index, parent_index);
-    bubble_up (parent_index);
+    index = parent_index;
+    goto repeat;
   }
 
-  void swap (unsigned a, unsigned b)
+  void swap (unsigned a, unsigned b) noexcept
   {
     assert (a < heap.length);
     assert (b < heap.length);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-repacker.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-repacker.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-repacker.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-repacker.hh	2024-11-20 13:56:33.000000000 +0000
@@ -79,7 +79,12 @@ bool _presplit_subtables_if_needed (grap
   //                pass after this processing is done. Not super necessary as splits are
   //                only done where overflow is likely, so de-dup probably will get undone
   //                later anyways.
-  for (unsigned lookup_index : ext_context.lookups.keys ())
+
+  // The loop below can modify the contents of ext_context.lookups if new subtables are added
+  // to a lookup during a split. So save the initial set of lookup indices so the iteration doesn't
+  // risk access free'd memory if ext_context.lookups gets resized.
+  hb_set_t lookup_indices(ext_context.lookups.keys ());
+  for (unsigned lookup_index : lookup_indices)
   {
     graph::Lookup* lookup = ext_context.lookups.get(lookup_index);
     if (!lookup->split_subtables_if_needed (ext_context, lookup_index))
@@ -114,11 +119,15 @@ bool _promote_extensions_if_needed (grap
   // TODO(grieger): skip this for the 24 bit case.
   if (!ext_context.lookups) return true;
 
+  unsigned total_lookup_table_sizes = 0;
   hb_vector_t<lookup_size_t> lookup_sizes;
   lookup_sizes.alloc (ext_context.lookups.get_population (), true);
 
   for (unsigned lookup_index : ext_context.lookups.keys ())
   {
+    const auto& lookup_v = ext_context.graph.vertices_[lookup_index];
+    total_lookup_table_sizes += lookup_v.table_size ();
+
     const graph::Lookup* lookup = ext_context.lookups.get(lookup_index);
     hb_set_t visited;
     lookup_sizes.push (lookup_size_t {
@@ -131,14 +140,16 @@ bool _promote_extensions_if_needed (grap
   lookup_sizes.qsort ();
 
   size_t lookup_list_size = ext_context.graph.vertices_[ext_context.lookup_list_index].table_size ();
-  size_t l2_l3_size = lookup_list_size; // Lookup List + Lookups
-  size_t l3_l4_size = 0; // Lookups + SubTables
+  size_t l2_l3_size = lookup_list_size + total_lookup_table_sizes; // Lookup List + Lookups
+  size_t l3_l4_size = total_lookup_table_sizes; // Lookups + SubTables
   size_t l4_plus_size = 0; // SubTables + their descendants
 
   // Start by assuming all lookups are using extension subtables, this size will be removed later
   // if it's decided to not make a lookup extension.
   for (auto p : lookup_sizes)
   {
+    // TODO(garretrieger): this overestimates the extension subtables size because some extension subtables may be
+    //                     reused. However, we can't correct this until we have connected component analysis in place.
     unsigned subtables_size = p.num_subtables * 8;
     l3_l4_size += subtables_size;
     l4_plus_size += subtables_size;
@@ -159,8 +170,7 @@ bool _promote_extensions_if_needed (grap
       size_t subtables_size = ext_context.graph.find_subgraph_size (p.lookup_index, visited, 1) - lookup_size;
       size_t remaining_size = p.size - subtables_size - lookup_size;
 
-      l2_l3_size   += lookup_size;
-      l3_l4_size   += lookup_size + subtables_size;
+      l3_l4_size   += subtables_size;
       l3_l4_size   -= p.num_subtables * 8;
       l4_plus_size += subtables_size + remaining_size;
 
@@ -229,6 +239,54 @@ bool _try_isolating_subgraphs (const hb_
 }
 
 static inline
+bool _resolve_shared_overflow(const hb_vector_t<graph::overflow_record_t>& overflows,
+                              int overflow_index,
+                              graph_t& sorted_graph)
+{
+  const graph::overflow_record_t& r = overflows[overflow_index];
+
+  // Find all of the parents in overflowing links that link to this
+  // same child node. We will then try duplicating the child node and
+  // re-assigning all of these parents to the duplicate.
+  hb_set_t parents;
+  parents.add(r.parent);
+  for (int i = overflow_index - 1; i >= 0; i--) {
+    const graph::overflow_record_t& r2 = overflows[i];
+    if (r2.child == r.child) {
+      parents.add(r2.parent);
+    }
+  }
+
+  unsigned result = sorted_graph.duplicate(&parents, r.child);
+  if (result == (unsigned) -1 && parents.get_population() > 2) {
+    // All links to the child are overflowing, so we can't include all
+    // in the duplication. Remove one parent from the duplication.
+    // Remove the lowest index parent, which will be the closest to the child.
+    parents.del(parents.get_min());
+    result = sorted_graph.duplicate(&parents, r.child);
+  }
+
+  if (result == (unsigned) -1) return result;
+
+  if (parents.get_population() > 1) {
+    // If the duplicated node has more than one parent pre-emptively raise it's priority to the maximum.
+    // This will place it close to the parents. Node's with only one parent, don't need this as normal overflow
+    // resolution will raise priority if needed.
+    //
+    // Reasoning: most of the parents to this child are likely at the same layer in the graph. Duplicating
+    // the child will theoretically allow it to be placed closer to it's parents. However, due to the shortest
+    // distance sort by default it's placement will remain in the same layer, thus it will remain in roughly the
+    // same position (and distance from parents) as the original child node. The overflow resolution will attempt
+    // to move nodes closer, but only for non-shared nodes. Since this node is shared, it will simply be given
+    // further duplication which defeats the attempt to duplicate with multiple parents. To fix this we
+    // pre-emptively raise priority now which allows the duplicated node to pack into the same layer as it's parents.
+    sorted_graph.vertices_[result].give_max_priority();
+  }
+
+  return result;
+}
+
+static inline
 bool _process_overflows (const hb_vector_t<graph::overflow_record_t>& overflows,
                          hb_set_t& priority_bumped_parents,
                          graph_t& sorted_graph)
@@ -244,7 +302,7 @@ bool _process_overflows (const hb_vector
     {
       // The child object is shared, we may be able to eliminate the overflow
       // by duplicating it.
-      if (sorted_graph.duplicate (r.parent, r.child) == (unsigned) -1) continue;
+      if (!_resolve_shared_overflow(overflows, i, sorted_graph)) continue;
       return true;
     }
 
@@ -378,7 +436,7 @@ template<typename T>
 inline hb_blob_t*
 hb_resolve_overflows (const T& packed,
                       hb_tag_t table_tag,
-                      unsigned max_rounds = 20,
+                      unsigned max_rounds = 32,
                       bool recalculate_extensions = false) {
   graph_t sorted_graph (packed);
   if (sorted_graph.in_error ())
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-sanitize.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-sanitize.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-sanitize.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-sanitize.hh	2024-11-20 13:56:33.000000000 +0000
@@ -122,17 +122,22 @@ struct hb_sanitize_context_t :
 {
   hb_sanitize_context_t () :
 	start (nullptr), end (nullptr),
+	length (0),
 	max_ops (0), max_subtables (0),
         recursion_depth (0),
 	writable (false), edit_count (0),
 	blob (nullptr),
 	num_glyphs (65536),
-	num_glyphs_set (false) {}
+	num_glyphs_set (false),
+	lazy_some_gpos (false) {}
 
   const char *get_name () { return "SANITIZE"; }
   template <typename T, typename F>
   bool may_dispatch (const T *obj HB_UNUSED, const F *format)
-  { return format->sanitize (this); }
+  {
+    return format->sanitize (this) &&
+	   hb_barrier ();
+  }
   static return_t default_return_value () { return true; }
   static return_t no_dispatch_return_value () { return false; }
   bool stop_sublookup_iteration (const return_t r) const { return !r; }
@@ -155,6 +160,19 @@ struct hb_sanitize_context_t :
   dispatch (const T &obj, Ts&&... ds) HB_AUTO_RETURN
   ( _dispatch (obj, hb_prioritize, std::forward<Ts> (ds)...) )
 
+  hb_sanitize_context_t (hb_blob_t *b) : hb_sanitize_context_t ()
+  {
+    init (b);
+
+    if (blob)
+      start_processing ();
+  }
+
+  ~hb_sanitize_context_t ()
+  {
+    if (blob)
+      end_processing ();
+  }
 
   void init (hb_blob_t *b)
   {
@@ -180,11 +198,15 @@ struct hb_sanitize_context_t :
 
     const char *obj_start = (const char *) obj;
     if (unlikely (obj_start < this->start || this->end <= obj_start))
+    {
       this->start = this->end = nullptr;
+      this->length = 0;
+    }
     else
     {
       this->start = obj_start;
       this->end   = obj_start + hb_min (size_t (this->end - obj_start), obj->get_size ());
+      this->length = this->end - this->start;
     }
   }
 
@@ -192,6 +214,7 @@ struct hb_sanitize_context_t :
   {
     this->start = this->blob->data;
     this->end = this->start + this->blob->length;
+    this->length = this->end - this->start;
     assert (this->start <= this->end); /* Must not overflow. */
   }
 
@@ -224,6 +247,7 @@ struct hb_sanitize_context_t :
     hb_blob_destroy (this->blob);
     this->blob = nullptr;
     this->start = this->end = nullptr;
+    this->length = 0;
   }
 
   unsigned get_edit_count () { return edit_count; }
@@ -237,18 +261,20 @@ struct hb_sanitize_context_t :
       this->max_ops = -1;
       return false;
     }
-    return (this->max_ops -= (int) count) > 0;
+    this->max_ops -= (int) count;
+    return true;
   }
 
+#ifndef HB_OPTIMIZE_SIZE
+  HB_ALWAYS_INLINE
+#endif
   bool check_range (const void *base,
 		    unsigned int len) const
   {
     const char *p = (const char *) base;
-    bool ok = !len ||
-	      (this->start <= p &&
-	       p <= this->end &&
-	       (unsigned int) (this->end - p) >= len &&
-	       (this->max_ops -= len) > 0);
+    bool ok = (uintptr_t) (p - this->start) <= this->length &&
+	      (unsigned int) (this->end - p) >= len &&
+	      ((this->max_ops -= len) > 0);
 
     DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
 		     "check_range [%p..%p]"
@@ -259,6 +285,43 @@ struct hb_sanitize_context_t :
 
     return likely (ok);
   }
+#ifndef HB_OPTIMIZE_SIZE
+  HB_ALWAYS_INLINE
+#endif
+  bool check_range_fast (const void *base,
+			 unsigned int len) const
+  {
+    const char *p = (const char *) base;
+    bool ok = ((uintptr_t) (p - this->start) <= this->length &&
+	       (unsigned int) (this->end - p) >= len);
+
+    DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
+		     "check_range_fast [%p..%p]"
+		     " (%u bytes) in [%p..%p] -> %s",
+		     p, p + len, len,
+		     this->start, this->end,
+		     ok ? "OK" : "OUT-OF-RANGE");
+
+    return likely (ok);
+  }
+
+#ifndef HB_OPTIMIZE_SIZE
+  HB_ALWAYS_INLINE
+#endif
+  bool check_point (const void *base) const
+  {
+    const char *p = (const char *) base;
+    bool ok = (uintptr_t) (p - this->start) <= this->length;
+
+    DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
+		     "check_point [%p]"
+		     " in [%p..%p] -> %s",
+		     p,
+		     this->start, this->end,
+		     ok ? "OK" : "OUT-OF-RANGE");
+
+    return likely (ok);
+  }
 
   template <typename T>
   bool check_range (const T *base,
@@ -282,6 +345,20 @@ struct hb_sanitize_context_t :
   }
 
   template <typename T>
+  HB_ALWAYS_INLINE
+  bool check_array_sized (const T *base, unsigned int len, unsigned len_size) const
+  {
+    if (len_size >= 4)
+    {
+      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
+	return false;
+    }
+    else
+      len = len * hb_static_size (T);
+    return this->check_range (base, len);
+  }
+
+  template <typename T>
   bool check_array (const T *base, unsigned int len) const
   {
     return this->check_range (base, len, hb_static_size (T));
@@ -292,7 +369,7 @@ struct hb_sanitize_context_t :
 		    unsigned int a,
 		    unsigned int b) const
   {
-    return this->check_range (base, a, b, hb_static_size (T));
+    return this->check_range (base, hb_static_size (T), a, b);
   }
 
   bool check_start_recursion (int max_depth)
@@ -308,8 +385,16 @@ struct hb_sanitize_context_t :
   }
 
   template <typename Type>
+#ifndef HB_OPTIMIZE_SIZE
+  HB_ALWAYS_INLINE
+#endif
   bool check_struct (const Type *obj) const
-  { return likely (this->check_range (obj, obj->min_size)); }
+  {
+    if (sizeof (uintptr_t) == sizeof (uint32_t))
+      return likely (this->check_range_fast (obj, obj->min_size));
+    else
+      return likely (this->check_point ((const char *) obj + obj->min_size));
+  }
 
   bool may_edit (const void *base, unsigned int len)
   {
@@ -371,7 +456,7 @@ struct hb_sanitize_context_t :
 	edit_count = 0;
 	sane = t->sanitize (this);
 	if (edit_count) {
-	  DEBUG_MSG_FUNC (SANITIZE, start, "requested %u edits in second round; FAILLING", edit_count);
+	  DEBUG_MSG_FUNC (SANITIZE, start, "requested %u edits in second round; FAILING", edit_count);
 	  sane = false;
 	}
       }
@@ -416,6 +501,7 @@ struct hb_sanitize_context_t :
   }
 
   const char *start, *end;
+  unsigned length;
   mutable int max_ops, max_subtables;
   private:
   int recursion_depth;
@@ -424,6 +510,8 @@ struct hb_sanitize_context_t :
   hb_blob_t *blob;
   unsigned int num_glyphs;
   bool  num_glyphs_set;
+  public:
+  bool lazy_some_gpos;
 };
 
 struct hb_sanitize_with_object_t
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-serialize.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-serialize.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-serialize.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-serialize.hh	2024-11-20 13:56:33.000000000 +0000
@@ -91,7 +91,27 @@ struct hb_serialize_context_t
     }
 #endif
 
-    friend void swap (object_t& a, object_t& b)
+    bool add_virtual_link (objidx_t objidx)
+    {
+      if (!objidx)
+        return false;
+
+      auto& link = *virtual_links.push ();
+      if (virtual_links.in_error ())
+        return false;
+
+      link.objidx = objidx;
+      // Remaining fields were previously zero'd by push():
+      // link.width = 0;
+      // link.is_signed = 0;
+      // link.whence = 0;
+      // link.position = 0;
+      // link.bias = 0;
+
+      return true;
+    }
+
+    friend void swap (object_t& a, object_t& b) noexcept
     {
       hb_swap (a.head, b.head);
       hb_swap (a.tail, b.tail);
@@ -113,7 +133,7 @@ struct hb_serialize_context_t
     {
       // Virtual links aren't considered for equality since they don't affect the functionality
       // of the object.
-      return hb_bytes_t (head, tail - head).hash () ^
+      return hb_bytes_t (head, hb_min (128, tail - head)).hash () ^
           real_links.as_bytes ().hash ();
     }
 
@@ -156,9 +176,9 @@ struct hb_serialize_context_t
     object_t *next;
 
     auto all_links () const HB_AUTO_RETURN
-        (( hb_concat (this->real_links, this->virtual_links) ));
+        (( hb_concat (real_links, virtual_links) ));
     auto all_links_writer () HB_AUTO_RETURN
-        (( hb_concat (this->real_links.writer (), this->virtual_links.writer ()) ));
+        (( hb_concat (real_links.writer (), virtual_links.writer ()) ));           
   };
 
   struct snapshot_t
@@ -172,8 +192,14 @@ struct hb_serialize_context_t
   };
 
   snapshot_t snapshot ()
-  { return snapshot_t {
-      head, tail, current, current->real_links.length, current->virtual_links.length, errors }; }
+  {
+    return snapshot_t {
+      head, tail, current,
+      current ? current->real_links.length : 0,
+      current ? current->virtual_links.length : 0,
+      errors
+     };
+  }
 
   hb_serialize_context_t (void *start_, unsigned int size) :
     start ((char *) start_),
@@ -260,7 +286,8 @@ struct hb_serialize_context_t
 	   propagate_error (std::forward<Ts> (os)...); }
 
   /* To be called around main operation. */
-  template <typename Type>
+  template <typename Type=char>
+  __attribute__((returns_nonnull))
   Type *start_serialize ()
   {
     DEBUG_MSG_LEVEL (SERIALIZE, this->start, 0, +1,
@@ -303,6 +330,7 @@ struct hb_serialize_context_t
   }
 
   template <typename Type = void>
+  __attribute__((returns_nonnull))
   Type *push ()
   {
     if (unlikely (in_error ())) return start_embed<Type> ();
@@ -323,6 +351,8 @@ struct hb_serialize_context_t
   {
     object_t *obj = current;
     if (unlikely (!obj)) return;
+    // Allow cleanup when we've error'd out on int overflows which don't compromise
+    // the serializer state.
     if (unlikely (in_error() && !only_overflow ())) return;
 
     current = current->next;
@@ -340,7 +370,9 @@ struct hb_serialize_context_t
   {
     object_t *obj = current;
     if (unlikely (!obj)) return 0;
-    if (unlikely (in_error())) return 0;
+    // Allow cleanup when we've error'd out on int overflows which don't compromise
+    // the serializer state.
+    if (unlikely (in_error()  && !only_overflow ())) return 0;
 
     current = current->next;
     obj->tail = head;
@@ -405,8 +437,11 @@ struct hb_serialize_context_t
     // Overflows that happened after the snapshot will be erased by the revert.
     if (unlikely (in_error () && !only_overflow ())) return;
     assert (snap.current == current);
-    current->real_links.shrink (snap.num_real_links);
-    current->virtual_links.shrink (snap.num_virtual_links);
+    if (current)
+    {
+      current->real_links.shrink (snap.num_real_links);
+      current->virtual_links.shrink (snap.num_virtual_links);
+    }
     errors = snap.errors;
     revert (snap.head, snap.tail);
   }
@@ -454,16 +489,40 @@ struct hb_serialize_context_t
 
     assert (current);
 
-    auto& link = *current->virtual_links.push ();
-    if (current->virtual_links.in_error ())
+    if (!current->add_virtual_link(objidx))
       err (HB_SERIALIZE_ERROR_OTHER);
+  }
 
-    link.width = 0;
-    link.objidx = objidx;
-    link.is_signed = 0;
-    link.whence = 0;
-    link.position = 0;
-    link.bias = 0;
+  objidx_t last_added_child_index() const {
+    if (unlikely (in_error ())) return (objidx_t) -1;
+
+    assert (current);
+    if (!bool(current->real_links)) {
+      return (objidx_t) -1;
+    }
+
+    return current->real_links[current->real_links.length - 1].objidx;
+  }
+
+  // For the current object ensure that the sub-table bytes for child objidx are always placed
+  // after the subtable bytes for any other existing children. This only ensures that the
+  // repacker will not move the target subtable before the other children
+  // (by adding virtual links). It is up to the caller to ensure the initial serialization
+  // order is correct.
+  void repack_last(objidx_t objidx) {
+    if (unlikely (in_error ())) return;
+
+    if (!objidx)
+      return;
+
+    assert (current);
+    for (auto& l : current->real_links) {
+      if (l.objidx == objidx) {
+        continue;
+      }
+
+      packed[l.objidx]->add_virtual_link(objidx);
+    }
   }
 
   template <typename T>
@@ -563,13 +622,15 @@ struct hb_serialize_context_t
   {
     unsigned int l = length () % alignment;
     if (l)
-      allocate_size<void> (alignment - l);
+      (void) allocate_size<void> (alignment - l);
   }
 
   template <typename Type = void>
+  __attribute__((returns_nonnull))
   Type *start_embed (const Type *obj HB_UNUSED = nullptr) const
   { return reinterpret_cast<Type *> (this->head); }
   template <typename Type>
+  __attribute__((returns_nonnull))
   Type *start_embed (const Type &obj) const
   { return start_embed (std::addressof (obj)); }
 
@@ -597,6 +658,7 @@ struct hb_serialize_context_t
   }
 
   template <typename Type>
+  HB_NODISCARD
   Type *allocate_size (size_t size, bool clear = true)
   {
     if (unlikely (in_error ())) return nullptr;
@@ -618,6 +680,7 @@ struct hb_serialize_context_t
   { return this->allocate_size<Type> (Type::min_size); }
 
   template <typename Type>
+  HB_NODISCARD
   Type *embed (const Type *obj)
   {
     unsigned int size = obj->get_size ();
@@ -627,6 +690,7 @@ struct hb_serialize_context_t
     return ret;
   }
   template <typename Type>
+  HB_NODISCARD
   Type *embed (const Type &obj)
   { return embed (std::addressof (obj)); }
   char *embed (const char *obj, unsigned size)
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-set-digest.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-set-digest.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-set-digest.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-set-digest.hh	2024-11-20 13:56:33.000000000 +0000
@@ -45,10 +45,16 @@
  * a lookup's or subtable's Coverage table(s), and then when we
  * want to apply the lookup or subtable to a glyph, before trying
  * to apply, we ask the filter if the glyph may be covered. If it's
- * not, we return early.
+ * not, we return early.  We can also match a digest against another
+ * digest.
  *
- * We use these filters both at the lookup-level, and then again,
- * at the subtable-level. Both have performance win.
+ * We use these filters at three levels:
+ *   - If the digest for all the glyphs in the buffer as a whole
+ *     does not match the digest for the lookup, skip the lookup.
+ *   - For each glyph, if it doesn't match the lookup digest,
+ *     skip it.
+ *   - For each glyph, if it doesn't match the subtable digest,
+ *     skip it.
  *
  * The main filter we use is a combination of three bits-pattern
  * filters. A bits-pattern filter checks a number of bits (5 or 6)
@@ -82,14 +88,19 @@ struct hb_set_digest_bits_pattern_t
 
   bool add_range (hb_codepoint_t a, hb_codepoint_t b)
   {
+    if (mask == (mask_t) -1) return false;
     if ((b >> shift) - (a >> shift) >= mask_bits - 1)
+    {
       mask = (mask_t) -1;
-    else {
+      return false;
+    }
+    else
+    {
       mask_t ma = mask_for (a);
       mask_t mb = mask_for (b);
       mask |= mb + (mb - ma) - (mb < ma);
+      return true;
     }
-    return true;
   }
 
   template <typename T>
@@ -148,8 +159,7 @@ struct hb_set_digest_combiner_t
 
   bool add_range (hb_codepoint_t a, hb_codepoint_t b)
   {
-    return head.add_range (a, b) &&
-	   tail.add_range (a, b);
+    return (int) head.add_range (a, b) | (int) tail.add_range (a, b);
   }
   template <typename T>
   void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-set.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-set.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-set.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-set.cc	2024-11-20 13:56:33.000000000 +0000
@@ -200,7 +200,7 @@ hb_set_copy (const hb_set_t *set)
 void
 hb_set_clear (hb_set_t *set)
 {
-  /* Immutible-safe. */
+  /* Immutable-safe. */
   set->clear ();
 }
 
@@ -251,7 +251,7 @@ void
 hb_set_add (hb_set_t       *set,
 	    hb_codepoint_t  codepoint)
 {
-  /* Immutible-safe. */
+  /* Immutable-safe. */
   set->add (codepoint);
 }
 
@@ -272,7 +272,7 @@ hb_set_add_sorted_array (hb_set_t
 		         const hb_codepoint_t *sorted_codepoints,
 		         unsigned int          num_codepoints)
 {
-  /* Immutible-safe. */
+  /* Immutable-safe. */
   set->add_sorted_array (sorted_codepoints,
 		         num_codepoints,
 		         sizeof(hb_codepoint_t));
@@ -294,7 +294,7 @@ hb_set_add_range (hb_set_t       *set,
 		  hb_codepoint_t  first,
 		  hb_codepoint_t  last)
 {
-  /* Immutible-safe. */
+  /* Immutable-safe. */
   set->add_range (first, last);
 }
 
@@ -311,7 +311,7 @@ void
 hb_set_del (hb_set_t       *set,
 	    hb_codepoint_t  codepoint)
 {
-  /* Immutible-safe. */
+  /* Immutable-safe. */
   set->del (codepoint);
 }
 
@@ -334,7 +334,7 @@ hb_set_del_range (hb_set_t       *set,
 		  hb_codepoint_t  first,
 		  hb_codepoint_t  last)
 {
-  /* Immutible-safe. */
+  /* Immutable-safe. */
   set->del_range (first, last);
 }
 
@@ -405,7 +405,7 @@ void
 hb_set_set (hb_set_t       *set,
 	    const hb_set_t *other)
 {
-  /* Immutible-safe. */
+  /* Immutable-safe. */
   set->set (*other);
 }
 
@@ -422,7 +422,7 @@ void
 hb_set_union (hb_set_t       *set,
 	      const hb_set_t *other)
 {
-  /* Immutible-safe. */
+  /* Immutable-safe. */
   set->union_ (*other);
 }
 
@@ -439,7 +439,7 @@ void
 hb_set_intersect (hb_set_t       *set,
 		  const hb_set_t *other)
 {
-  /* Immutible-safe. */
+  /* Immutable-safe. */
   set->intersect (*other);
 }
 
@@ -456,7 +456,7 @@ void
 hb_set_subtract (hb_set_t       *set,
 		 const hb_set_t *other)
 {
-  /* Immutible-safe. */
+  /* Immutable-safe. */
   set->subtract (*other);
 }
 
@@ -474,7 +474,7 @@ void
 hb_set_symmetric_difference (hb_set_t       *set,
 			     const hb_set_t *other)
 {
-  /* Immutible-safe. */
+  /* Immutable-safe. */
   set->symmetric_difference (*other);
 }
 
@@ -489,7 +489,7 @@ hb_set_symmetric_difference (hb_set_t
 void
 hb_set_invert (hb_set_t *set)
 {
-  /* Immutible-safe. */
+  /* Immutable-safe. */
   set->invert ();
 }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-set.h 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-set.h
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-set.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-set.h	2024-11-20 13:56:33.000000000 +0000
@@ -43,7 +43,7 @@ HB_BEGIN_DECLS
  *
  * Since: 0.9.21
  */
-#define HB_SET_VALUE_INVALID ((hb_codepoint_t) -1)
+#define HB_SET_VALUE_INVALID HB_CODEPOINT_INVALID
 
 /**
  * hb_set_t:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-set.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-set.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-set.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-set.hh	2024-11-20 13:56:33.000000000 +0000
@@ -35,6 +35,8 @@
 template <typename impl_t>
 struct hb_sparseset_t
 {
+  static constexpr bool realloc_move = true;
+
   hb_object_header_t header;
   impl_t s;
 
@@ -42,10 +44,10 @@ struct hb_sparseset_t
   ~hb_sparseset_t () { fini (); }
 
   hb_sparseset_t (const hb_sparseset_t& other) : hb_sparseset_t () { set (other); }
-  hb_sparseset_t (hb_sparseset_t&& other) : hb_sparseset_t () { s = std::move (other.s); }
+  hb_sparseset_t (hb_sparseset_t&& other)  noexcept : hb_sparseset_t () { s = std::move (other.s); }
   hb_sparseset_t& operator = (const hb_sparseset_t& other) { set (other); return *this; }
-  hb_sparseset_t& operator = (hb_sparseset_t&& other) { s = std::move (other.s); return *this; }
-  friend void swap (hb_sparseset_t& a, hb_sparseset_t& b) { hb_swap (a.s, b.s); }
+  hb_sparseset_t& operator = (hb_sparseset_t&& other)  noexcept { s = std::move (other.s); return *this; }
+  friend void swap (hb_sparseset_t& a, hb_sparseset_t& b)  noexcept { hb_swap (a.s, b.s); }
 
   hb_sparseset_t (std::initializer_list<hb_codepoint_t> lst) : hb_sparseset_t ()
   {
@@ -115,7 +117,7 @@ struct hb_sparseset_t
   /* Sink interface. */
   hb_sparseset_t& operator << (hb_codepoint_t v)
   { add (v); return *this; }
-  hb_sparseset_t& operator << (const hb_pair_t<hb_codepoint_t, hb_codepoint_t>& range)
+  hb_sparseset_t& operator << (const hb_codepoint_pair_t& range)
   { add_range (range.first, range.second); return *this; }
 
   bool intersects (hb_codepoint_t first, hb_codepoint_t last) const
@@ -164,7 +166,7 @@ struct hb_set_t : hb_sparseset_t<hb_bit_
   ~hb_set_t () = default;
   hb_set_t () : sparseset () {};
   hb_set_t (const hb_set_t &o) : sparseset ((sparseset &) o) {};
-  hb_set_t (hb_set_t&& o) : sparseset (std::move ((sparseset &) o)) {}
+  hb_set_t (hb_set_t&& o)  noexcept : sparseset (std::move ((sparseset &) o)) {}
   hb_set_t& operator = (const hb_set_t&) = default;
   hb_set_t& operator = (hb_set_t&&) = default;
   hb_set_t (std::initializer_list<hb_codepoint_t> lst) : sparseset (lst) {}
@@ -174,7 +176,7 @@ struct hb_set_t : hb_sparseset_t<hb_bit_
 
   hb_set_t& operator << (hb_codepoint_t v)
   { sparseset::operator<< (v); return *this; }
-  hb_set_t& operator << (const hb_pair_t<hb_codepoint_t, hb_codepoint_t>& range)
+  hb_set_t& operator << (const hb_codepoint_pair_t& range)
   { sparseset::operator<< (range); return *this; }
 };
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-shape.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-shape.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-shape.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-shape.cc	2024-11-20 13:56:33.000000000 +0000
@@ -220,7 +220,7 @@ reset_buffer (hb_buffer_t *buffer,
   assert (buffer->ensure (text.length));
   buffer->have_positions = false;
   buffer->len = text.length;
-  memcpy (buffer->info, text.arrayZ, text.length * sizeof (buffer->info[0]));
+  hb_memcpy (buffer->info, text.arrayZ, text.length * sizeof (buffer->info[0]));
   hb_buffer_set_content_type (buffer, HB_BUFFER_CONTENT_TYPE_UNICODE);
 }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-shaper-list.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-shaper-list.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-shaper-list.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-shaper-list.hh	2024-11-20 13:56:33.000000000 +0000
@@ -33,6 +33,11 @@
 
 /* v--- Add new shapers in the right place here. */
 
+#ifdef HAVE_WASM
+/* Only picks up fonts that have a "Wasm" table. */
+HB_SHAPER_IMPLEMENT (wasm)
+#endif
+
 #ifdef HAVE_GRAPHITE2
 /* Only picks up fonts that have a "Silf" table. */
 HB_SHAPER_IMPLEMENT (graphite2)
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-static.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-static.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-static.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-static.cc	2024-11-20 13:56:33.000000000 +0000
@@ -31,6 +31,7 @@
 
 #include "hb-aat-layout-common.hh"
 #include "hb-aat-layout-feat-table.hh"
+#include "hb-cff-interp-common.hh"
 #include "hb-ot-layout-common.hh"
 #include "hb-ot-cmap-table.hh"
 #include "OT/Color/COLR/COLR.hh"
@@ -58,6 +59,8 @@ DEFINE_NULL_NAMESPACE_BYTES (AAT, Lookup
 /* hb_map_t */
 
 const hb_codepoint_t minus_1 = -1;
+static const unsigned char static_endchar_str[] = {OpCode_endchar};
+const unsigned char *endchar_str = static_endchar_str;
 
 /* hb_face_t */
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-accelerator.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-accelerator.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-accelerator.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-accelerator.hh	2024-11-20 13:56:33.000000000 +0000
@@ -42,7 +42,9 @@ struct cff_subset_accelerator_t;
 
 namespace OT {
 struct SubtableUnicodesCache;
-};
+struct cff1_subset_accelerator_t;
+struct cff2_subset_accelerator_t;
+}
 
 struct hb_subset_accelerator_t
 {
@@ -51,15 +53,17 @@ struct hb_subset_accelerator_t
     return &_hb_subset_accelerator_user_data_key;
   }
 
-  static hb_subset_accelerator_t* create(const hb_map_t& unicode_to_gid_,
-					 const hb_multimap_t gid_to_unicodes_,
+  static hb_subset_accelerator_t* create(hb_face_t *source,
+					 const hb_map_t& unicode_to_gid_,
 					 const hb_set_t& unicodes_,
 					 bool has_seac_) {
     hb_subset_accelerator_t* accel =
         (hb_subset_accelerator_t*) hb_calloc (1, sizeof(hb_subset_accelerator_t));
 
-    new (accel) hb_subset_accelerator_t (unicode_to_gid_,
-					 gid_to_unicodes_,
+    if (unlikely (!accel)) return accel;
+
+    new (accel) hb_subset_accelerator_t (source,
+					 unicode_to_gid_,
 					 unicodes_,
 					 has_seac_);
 
@@ -77,36 +81,36 @@ struct hb_subset_accelerator_t
     hb_free (accel);
   }
 
-  hb_subset_accelerator_t (const hb_map_t& unicode_to_gid_,
-			   const hb_multimap_t& gid_to_unicodes_,
+  hb_subset_accelerator_t (hb_face_t *source,
+			   const hb_map_t& unicode_to_gid_,
 			   const hb_set_t& unicodes_,
 			   bool has_seac_) :
     unicode_to_gid(unicode_to_gid_),
-    gid_to_unicodes (gid_to_unicodes_),
     unicodes(unicodes_),
     cmap_cache(nullptr),
     destroy_cmap_cache(nullptr),
     has_seac(has_seac_),
-    cff_accelerator(nullptr),
-    destroy_cff_accelerator(nullptr) {}
-
-  ~hb_subset_accelerator_t ()
+    source(hb_face_reference (source))
   {
-    if (cff_accelerator && destroy_cff_accelerator)
-      destroy_cff_accelerator ((void*) cff_accelerator);
-
-    if (cmap_cache && destroy_cmap_cache)
-      destroy_cmap_cache ((void*) cmap_cache);
+    gid_to_unicodes.alloc (unicode_to_gid.get_population ());
+    for (const auto &_ : unicode_to_gid)
+    {
+      auto unicode = _.first;
+      auto gid = _.second;
+      gid_to_unicodes.add (gid, unicode);
+    }
   }
 
+  HB_INTERNAL ~hb_subset_accelerator_t ();
+
   // Generic
 
   mutable hb_mutex_t sanitized_table_cache_lock;
   mutable hb_hashmap_t<hb_tag_t, hb::unique_ptr<hb_blob_t>> sanitized_table_cache;
 
-  const hb_map_t unicode_to_gid;
-  const hb_multimap_t gid_to_unicodes;
-  const hb_set_t unicodes;
+  hb_map_t unicode_to_gid;
+  hb_multimap_t gid_to_unicodes;
+  hb_set_t unicodes;
 
   // cmap
   const OT::SubtableUnicodesCache* cmap_cache;
@@ -114,8 +118,6 @@ struct hb_subset_accelerator_t
 
   // CFF
   bool has_seac;
-  const CFF::cff_subset_accelerator_t* cff_accelerator;
-  hb_destroy_func_t destroy_cff_accelerator;
 
   // TODO(garretrieger): cumulative glyf checksum map
 
@@ -126,6 +128,13 @@ struct hb_subset_accelerator_t
 	   unicodes.in_error () ||
 	   sanitized_table_cache.in_error ();
   }
+
+  hb_face_t *source;
+#ifndef HB_NO_SUBSET_CFF
+  // These have to be immediately after source:
+  mutable hb_face_lazy_loader_t<OT::cff1_subset_accelerator_t, 1> cff1_accel;
+  mutable hb_face_lazy_loader_t<OT::cff2_subset_accelerator_t, 2> cff2_accel;
+#endif
 };
 
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.cc	2024-11-20 13:56:33.000000000 +0000
@@ -68,24 +68,35 @@ hb_plan_subset_cff_fdselect (const hb_su
     /* use hb_set to determine the subset of font dicts */
     hb_set_t set;
     hb_codepoint_t prev_fd = CFF_UNDEF_CODE;
-    for (hb_codepoint_t i = 0; i < subset_num_glyphs; i++)
+    hb_pair_t<unsigned, hb_codepoint_t> last_range {0, 0};
+    auto it = hb_iter (plan->new_to_old_gid_list);
+    auto _ = *it;
+    for (hb_codepoint_t gid = 0; gid < subset_num_glyphs; gid++)
     {
-      hb_codepoint_t glyph;
-      hb_codepoint_t fd;
-      if (!plan->old_gid_for_new_gid (i, &glyph))
+      hb_codepoint_t old_glyph;
+      if (gid == _.first)
+      {
+	old_glyph = _.second;
+	_ = *++it;
+      }
+      else
       {
 	/* fonttools retains FDSelect & font dicts for missing glyphs. do the same */
-	glyph = i;
+	old_glyph = gid;
       }
-      fd = src.get_fd (glyph);
-      set.add (fd);
+      if (old_glyph >= last_range.second)
+	last_range = src.get_fd_range (old_glyph);
+      unsigned fd = last_range.first;
 
       if (fd != prev_fd)
       {
+	set.add (fd);
 	num_ranges++;
 	prev_fd = fd;
-	code_pair_t pair = { fd, i };
-	fdselect_ranges.push (pair);
+	fdselect_ranges.push (code_pair_t { fd, gid });
+
+	if (gid == old_glyph)
+	  gid = hb_min (_.first - 1, last_range.second - 1);
       }
     }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-cff-common.hh	2024-11-20 13:56:33.000000000 +0000
@@ -480,6 +480,7 @@ struct cff_subset_accelerator_t
       const hb_vector_t<parsed_cs_str_vec_t>& parsed_local_subrs) {
     cff_subset_accelerator_t* accel =
         (cff_subset_accelerator_t*) hb_malloc (sizeof(cff_subset_accelerator_t));
+    if (unlikely (!accel)) return nullptr;
     new (accel) cff_subset_accelerator_t (original_blob,
                                           parsed_charstrings,
                                           parsed_global_subrs,
@@ -510,15 +511,21 @@ struct cff_subset_accelerator_t
     original_blob = hb_blob_reference (original_blob_);
   }
 
-  ~cff_subset_accelerator_t() {
+  ~cff_subset_accelerator_t()
+  {
     hb_blob_destroy (original_blob);
-    hb_map_destroy (glyph_to_sid_map.get_relaxed ());
+    auto *mapping = glyph_to_sid_map.get_relaxed ();
+    if (mapping)
+    {
+      mapping->~glyph_to_sid_map_t ();
+      hb_free (mapping);
+    }
   }
 
   parsed_cs_str_vec_t parsed_charstrings;
   parsed_cs_str_vec_t parsed_global_subrs;
   hb_vector_t<parsed_cs_str_vec_t> parsed_local_subrs;
-  mutable hb_atomic_ptr_t<hb_map_t> glyph_to_sid_map = nullptr;
+  mutable hb_atomic_ptr_t<glyph_to_sid_map_t> glyph_to_sid_map;
 
  private:
   hb_blob_t* original_blob;
@@ -600,9 +607,8 @@ struct subr_remap_t : hb_inc_bimap_t
      * no optimization based on usage counts. fonttools doesn't appear doing that either.
      */
 
-    resize (closure->get_population ());
-    hb_codepoint_t old_num = HB_SET_VALUE_INVALID;
-    while (hb_set_next (closure, &old_num))
+    alloc (closure->get_population ());
+    for (auto old_num : *closure)
       add (old_num);
 
     if (get_population () < 1240)
@@ -672,8 +678,8 @@ struct subr_subsetter_t
   {
     unsigned fd_count = acc.fdCount;
     const cff_subset_accelerator_t* cff_accelerator = nullptr;
-    if (plan->accelerator && plan->accelerator->cff_accelerator) {
-      cff_accelerator = plan->accelerator->cff_accelerator;
+    if (acc.cff_accelerator) {
+      cff_accelerator = acc.cff_accelerator;
       fd_count = cff_accelerator->parsed_local_subrs.length;
     }
 
@@ -709,14 +715,13 @@ struct subr_subsetter_t
     }
 
     /* phase 1 & 2 */
-    for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
+    for (auto _ : plan->new_to_old_gid_list)
     {
-      hb_codepoint_t  glyph;
-      if (!plan->old_gid_for_new_gid (i, &glyph))
-        continue;
+      hb_codepoint_t new_glyph = _.first;
+      hb_codepoint_t old_glyph = _.second;
 
-      const hb_ubytes_t str = (*acc.charStrings)[glyph];
-      unsigned int fd = acc.fdSelect->get_fd (glyph);
+      const hb_ubytes_t str = (*acc.charStrings)[old_glyph];
+      unsigned int fd = acc.fdSelect->get_fd (old_glyph);
       if (unlikely (fd >= acc.fdCount))
         return false;
 
@@ -725,9 +730,9 @@ struct subr_subsetter_t
         // parsed string already exists in accelerator, copy it and move
         // on.
         if (cached_charstrings)
-          cached_charstrings[i] = &cff_accelerator->parsed_charstrings[glyph];
+          cached_charstrings[new_glyph] = &cff_accelerator->parsed_charstrings[old_glyph];
         else
-          parsed_charstrings[i] = cff_accelerator->parsed_charstrings[glyph];
+          parsed_charstrings[new_glyph] = cff_accelerator->parsed_charstrings[old_glyph];
 
         continue;
       }
@@ -735,8 +740,8 @@ struct subr_subsetter_t
       ENV env (str, acc, fd);
       cs_interpreter_t<ENV, OPSET, subr_subset_param_t> interp (env);
 
-      parsed_charstrings[i].alloc (str.length);
-      subr_subset_param_t  param (&parsed_charstrings[i],
+      parsed_charstrings[new_glyph].alloc (str.length);
+      subr_subset_param_t  param (&parsed_charstrings[new_glyph],
                                   &parsed_global_subrs_storage,
                                   &parsed_local_subrs_storage[fd],
                                   &closures.global_closure,
@@ -747,12 +752,12 @@ struct subr_subsetter_t
         return false;
 
       /* complete parsed string esp. copy CFF1 width or CFF2 vsindex to the parsed charstring for encoding */
-      SUBSETTER::complete_parsed_str (interp.env, param, parsed_charstrings[i]);
+      SUBSETTER::complete_parsed_str (interp.env, param, parsed_charstrings[new_glyph]);
 
       /* mark hint ops and arguments for drop */
       if ((plan->flags & HB_SUBSET_FLAGS_NO_HINTING) || plan->inprogress_accelerator)
       {
-	subr_subset_param_t  param (&parsed_charstrings[i],
+	subr_subset_param_t  param (&parsed_charstrings[new_glyph],
 				    &parsed_global_subrs_storage,
 				    &parsed_local_subrs_storage[fd],
 				    &closures.global_closure,
@@ -760,21 +765,21 @@ struct subr_subsetter_t
 				    plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
 
 	drop_hints_param_t  drop;
-	if (drop_hints_in_str (parsed_charstrings[i], param, drop))
+	if (drop_hints_in_str (parsed_charstrings[new_glyph], param, drop))
 	{
-	  parsed_charstrings[i].set_hint_dropped ();
+	  parsed_charstrings[new_glyph].set_hint_dropped ();
 	  if (drop.vsindex_dropped)
-	    parsed_charstrings[i].set_vsindex_dropped ();
+	    parsed_charstrings[new_glyph].set_vsindex_dropped ();
 	}
       }
 
-      /* Doing this here one by one instead of compacting all at the en
+      /* Doing this here one by one instead of compacting all at the end
        * has massive peak-memory saving.
        *
        * The compacting both saves memory and makes further operations
        * faster.
        */
-      parsed_charstrings[i].compact ();
+      parsed_charstrings[new_glyph].compact ();
     }
 
     /* Since parsed strings were loaded from accelerator, we still need
@@ -797,23 +802,40 @@ struct subr_subsetter_t
 
   bool encode_charstrings (str_buff_vec_t &buffArray, bool encode_prefix = true) const
   {
-    if (unlikely (!buffArray.resize_exact (plan->num_output_glyphs ())))
+    unsigned num_glyphs = plan->num_output_glyphs ();
+    if (unlikely (!buffArray.resize_exact (num_glyphs)))
       return false;
-    for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
+    hb_codepoint_t last = 0;
+    for (auto _ : plan->new_to_old_gid_list)
     {
-      hb_codepoint_t  glyph;
-      if (!plan->old_gid_for_new_gid (i, &glyph))
-      {
-	/* add an endchar only charstring for a missing glyph if CFF1 */
-	if (endchar_op != OpCode_Invalid) buffArray.arrayZ[i].push (endchar_op);
-	continue;
-      }
-      unsigned int  fd = acc.fdSelect->get_fd (glyph);
+      hb_codepoint_t gid = _.first;
+      hb_codepoint_t old_glyph = _.second;
+
+      if (endchar_op != OpCode_Invalid)
+        for (; last < gid; last++)
+	{
+	  // Hack to point vector to static string.
+	  auto &b = buffArray.arrayZ[last];
+	  b.length = 1;
+	  b.arrayZ = const_cast<unsigned char *>(endchar_str);
+	}
+
+      last++; // Skip over gid
+      unsigned int  fd = acc.fdSelect->get_fd (old_glyph);
       if (unlikely (fd >= acc.fdCount))
 	return false;
-      if (unlikely (!encode_str (get_parsed_charstring (i), fd, buffArray.arrayZ[i], encode_prefix)))
+      if (unlikely (!encode_str (get_parsed_charstring (gid), fd, buffArray.arrayZ[gid], encode_prefix)))
 	return false;
     }
+    if (endchar_op != OpCode_Invalid)
+      for (; last < num_glyphs; last++)
+      {
+	// Hack to point vector to static string.
+	auto &b = buffArray.arrayZ[last];
+	b.length = 1;
+	b.arrayZ = const_cast<unsigned char *>(endchar_str);
+      }
+
     return true;
   }
 
@@ -980,24 +1002,23 @@ struct subr_subsetter_t
                             const hb_vector_t<parsed_cs_str_vec_t>& local_subrs)
   {
     closures.reset ();
-    for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
+    for (auto _ : plan->new_to_old_gid_list)
     {
-      hb_codepoint_t  glyph;
-      if (!plan->old_gid_for_new_gid (i, &glyph))
-        continue;
-      unsigned int fd = acc.fdSelect->get_fd (glyph);
+      hb_codepoint_t new_glyph = _.first;
+      hb_codepoint_t old_glyph = _.second;
+      unsigned int fd = acc.fdSelect->get_fd (old_glyph);
       if (unlikely (fd >= acc.fdCount))
         return false;
 
       // Note: const cast is safe here because the collect_subr_refs_in_str only performs a
       //       closure and does not modify any of the charstrings.
-      subr_subset_param_t  param (const_cast<parsed_cs_str_t*> (&get_parsed_charstring (i)),
+      subr_subset_param_t  param (const_cast<parsed_cs_str_t*> (&get_parsed_charstring (new_glyph)),
                                   const_cast<parsed_cs_str_vec_t*> (&global_subrs),
                                   const_cast<parsed_cs_str_vec_t*> (&local_subrs[fd]),
                                   &closures.global_closure,
                                   &closures.local_closures[fd],
                                   plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
-      collect_subr_refs_in_str (get_parsed_charstring (i), param);
+      collect_subr_refs_in_str (get_parsed_charstring (new_glyph), param);
     }
 
     return true;
@@ -1105,14 +1126,11 @@ struct subr_subsetter_t
 
     compact_parsed_subrs ();
 
-    plan->inprogress_accelerator->cff_accelerator =
+    acc.cff_accelerator =
         cff_subset_accelerator_t::create(acc.blob,
                                          parsed_charstrings,
                                          parsed_global_subrs_storage,
                                          parsed_local_subrs_storage);
-    plan->inprogress_accelerator->destroy_cff_accelerator =
-        cff_subset_accelerator_t::destroy;
-
   }
 
   const parsed_cs_str_t& get_parsed_charstring (unsigned i) const
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.cc	2024-11-20 13:56:33.000000000 +0000
@@ -32,36 +32,59 @@
 #include "hb-ot-cff1-table.hh"
 #include "hb-set.h"
 #include "hb-bimap.hh"
-#include "hb-subset-cff1.hh"
 #include "hb-subset-plan.hh"
 #include "hb-subset-cff-common.hh"
 #include "hb-cff1-interp-cs.hh"
 
 using namespace CFF;
 
-struct remap_sid_t : hb_inc_bimap_t
+struct remap_sid_t
 {
+  unsigned get_population () const { return vector.length; }
+
+  void alloc (unsigned size)
+  {
+    map.alloc (size);
+    vector.alloc (size, true);
+  }
+
+  bool in_error () const
+  { return map.in_error () || vector.in_error (); }
+
   unsigned int add (unsigned int sid)
   {
-    if ((sid != CFF_UNDEF_SID) && !is_std_std (sid))
-      return offset_sid (hb_inc_bimap_t::add (unoffset_sid (sid)));
-    else
+    if (is_std_str (sid) || (sid == CFF_UNDEF_SID))
       return sid;
+
+    sid = unoffset_sid (sid);
+    unsigned v = next;
+    if (map.set (sid, v, false))
+    {
+      vector.push (sid);
+      next++;
+    }
+    else
+      v = map.get (sid); // already exists
+    return offset_sid (v);
   }
 
   unsigned int operator[] (unsigned int sid) const
   {
-    if (is_std_std (sid) || (sid == CFF_UNDEF_SID))
+    if (is_std_str (sid) || (sid == CFF_UNDEF_SID))
       return sid;
-    else
-      return offset_sid (get (unoffset_sid (sid)));
+
+    return offset_sid (map.get (unoffset_sid (sid)));
   }
 
   static const unsigned int num_std_strings = 391;
 
-  static bool is_std_std (unsigned int sid) { return sid < num_std_strings; }
+  static bool is_std_str (unsigned int sid) { return sid < num_std_strings; }
   static unsigned int offset_sid (unsigned int sid) { return sid + num_std_strings; }
   static unsigned int unoffset_sid (unsigned int sid) { return sid - num_std_strings; }
+  unsigned next = 0;
+
+  hb_map_t map;
+  hb_vector_t<unsigned> vector;
 };
 
 struct cff1_sub_table_info_t : cff_sub_table_info_t
@@ -271,16 +294,17 @@ struct range_list_t : hb_vector_t<code_p
   /* replace the first glyph ID in the "glyph" field each range with a nLeft value */
   bool complete (unsigned int last_glyph)
   {
-    bool two_byte = false;
+    hb_codepoint_t all_glyphs = 0;
     unsigned count = this->length;
     for (unsigned int i = count; i; i--)
     {
       code_pair_t &pair = arrayZ[i - 1];
       unsigned int nLeft = last_glyph - pair.glyph - 1;
-      two_byte |= nLeft >= 0x100;
+      all_glyphs |= nLeft;
       last_glyph = pair.glyph;
       pair.glyph = nLeft;
     }
+    bool two_byte = all_glyphs >= 0x100;
     return two_byte;
   }
 };
@@ -391,8 +415,10 @@ struct cff1_subr_subsetter_t : subr_subs
   }
 };
 
-struct cff_subset_plan {
-  cff_subset_plan ()
+namespace OT {
+struct cff1_subset_plan
+{
+  cff1_subset_plan ()
   {
     for (unsigned int i = 0; i < name_dict_values_t::ValCount; i++)
       topDictModSIDs[i] = CFF_UNDEF_SID;
@@ -402,7 +428,7 @@ struct cff_subset_plan {
   {
     const Encoding *encoding = acc.encoding;
     unsigned int  size0, size1;
-    hb_codepoint_t  code, last_code = CFF_UNDEF_CODE;
+    unsigned code, last_code = CFF_UNDEF_CODE - 1;
     hb_vector_t<hb_codepoint_t> supp_codes;
 
     if (unlikely (!subset_enc_code_ranges.resize (0)))
@@ -413,39 +439,42 @@ struct cff_subset_plan {
 
     supp_codes.init ();
 
+    code_pair_t glyph_to_sid_cache {0, HB_CODEPOINT_INVALID};
     subset_enc_num_codes = plan->num_output_glyphs () - 1;
     unsigned int glyph;
-    for (glyph = 1; glyph < plan->num_output_glyphs (); glyph++)
+    auto it = hb_iter (plan->new_to_old_gid_list);
+    if (it->first == 0) it++;
+    auto _ = *it;
+    for (glyph = 1; glyph < num_glyphs; glyph++)
     {
-      hb_codepoint_t  old_glyph;
-      if (!plan->old_gid_for_new_gid (glyph, &old_glyph))
+      hb_codepoint_t old_glyph;
+      if (glyph == _.first)
+      {
+	old_glyph = _.second;
+	_ = *++it;
+      }
+      else
       {
-	/* Retain the code for the old missing glyph ID */
+	/* Retain the SID for the old missing glyph ID */
 	old_glyph = glyph;
       }
-      code = acc.glyph_to_code (old_glyph);
+      code = acc.glyph_to_code (old_glyph, &glyph_to_sid_cache);
       if (code == CFF_UNDEF_CODE)
       {
 	subset_enc_num_codes = glyph - 1;
 	break;
       }
 
-      if ((last_code == CFF_UNDEF_CODE) || (code != last_code + 1))
-      {
-	code_pair_t pair = { code, glyph };
-	subset_enc_code_ranges.push (pair);
-      }
+      if (code != last_code + 1)
+	subset_enc_code_ranges.push (code_pair_t {code, glyph});
       last_code = code;
 
       if (encoding != &Null (Encoding))
       {
-	hb_codepoint_t  sid = acc.glyph_to_sid (old_glyph);
+	hb_codepoint_t  sid = acc.glyph_to_sid (old_glyph, &glyph_to_sid_cache);
 	encoding->get_supplement_codes (sid, supp_codes);
 	for (unsigned int i = 0; i < supp_codes.length; i++)
-	{
-	  code_pair_t pair = { supp_codes[i], sid };
-	  subset_enc_supp_codes.push (pair);
-	}
+	  subset_enc_supp_codes.push (code_pair_t {supp_codes[i], sid});
       }
     }
     supp_codes.fini ();
@@ -462,65 +491,93 @@ struct cff_subset_plan {
       subset_enc_format = 1;
   }
 
-  void plan_subset_charset (const OT::cff1::accelerator_subset_t &acc, hb_subset_plan_t *plan)
+  bool plan_subset_charset (const OT::cff1::accelerator_subset_t &acc, hb_subset_plan_t *plan)
   {
     unsigned int  size0, size_ranges;
-    hb_codepoint_t  sid, last_sid = CFF_UNDEF_CODE;
+    unsigned last_sid = CFF_UNDEF_CODE - 1;
 
     if (unlikely (!subset_charset_ranges.resize (0)))
     {
       plan->check_success (false);
-      return;
+      return false;
+    }
+
+    code_pair_t glyph_to_sid_cache {0, HB_CODEPOINT_INVALID};
+
+    unsigned num_glyphs = plan->num_output_glyphs ();
+
+    if (unlikely (!subset_charset_ranges.alloc (hb_min (num_glyphs,
+							acc.num_charset_entries))))
+    {
+      plan->check_success (false);
+      return false;
     }
 
-    hb_map_t *glyph_to_sid_map = (plan->accelerator && plan->accelerator->cff_accelerator) ?
-				  plan->accelerator->cff_accelerator->glyph_to_sid_map :
-				  nullptr;
+    glyph_to_sid_map_t *glyph_to_sid_map = acc.cff_accelerator ?
+					   acc.cff_accelerator->glyph_to_sid_map.get_acquire () :
+					   nullptr;
     bool created_map = false;
-    if (!glyph_to_sid_map &&
-	((plan->accelerator && plan->accelerator->cff_accelerator) ||
-	 plan->num_output_glyphs () > plan->source->get_num_glyphs () / 8.))
+    if (!glyph_to_sid_map && acc.cff_accelerator)
     {
       created_map = true;
       glyph_to_sid_map = acc.create_glyph_to_sid_map ();
     }
 
-    unsigned int glyph;
-    for (glyph = 1; glyph < plan->num_output_glyphs (); glyph++)
+    auto it = hb_iter (plan->new_to_old_gid_list);
+    if (it->first == 0) it++;
+    auto _ = *it;
+    bool not_is_cid = !acc.is_CID ();
+    bool skip = !not_is_cid && glyph_to_sid_map;
+    if (not_is_cid)
+      sidmap.alloc (num_glyphs);
+    for (hb_codepoint_t glyph = 1; glyph < num_glyphs; glyph++)
     {
-      hb_codepoint_t  old_glyph;
-      if (!plan->old_gid_for_new_gid (glyph, &old_glyph))
+      hb_codepoint_t old_glyph;
+      if (glyph == _.first)
+      {
+	old_glyph = _.second;
+	_ = *++it;
+      }
+      else
       {
 	/* Retain the SID for the old missing glyph ID */
 	old_glyph = glyph;
       }
-      sid = glyph_to_sid_map ? glyph_to_sid_map->get (old_glyph) : acc.glyph_to_sid (old_glyph);
+      unsigned sid = glyph_to_sid_map ?
+		     glyph_to_sid_map->arrayZ[old_glyph].code :
+		     acc.glyph_to_sid (old_glyph, &glyph_to_sid_cache);
 
-      if (!acc.is_CID ())
+      if (not_is_cid)
 	sid = sidmap.add (sid);
 
-      if ((last_sid == CFF_UNDEF_CODE) || (sid != last_sid + 1))
+      if (sid != last_sid + 1)
+	subset_charset_ranges.push (code_pair_t {sid, glyph});
+
+      if (glyph == old_glyph && skip)
       {
-	code_pair_t pair = { sid, glyph };
-	subset_charset_ranges.push (pair);
+	glyph = hb_min (_.first - 1, glyph_to_sid_map->arrayZ[old_glyph].glyph);
+	sid += glyph - old_glyph;
       }
       last_sid = sid;
     }
 
     if (created_map)
     {
-      if (!(plan->accelerator && plan->accelerator->cff_accelerator) ||
-	  !plan->accelerator->cff_accelerator->glyph_to_sid_map.cmpexch (nullptr, glyph_to_sid_map))
-	hb_map_destroy (glyph_to_sid_map);
+      if ((!plan->accelerator && acc.cff_accelerator) ||
+	  !acc.cff_accelerator->glyph_to_sid_map.cmpexch (nullptr, glyph_to_sid_map))
+      {
+	glyph_to_sid_map->~glyph_to_sid_map_t ();
+	hb_free (glyph_to_sid_map);
+      }
     }
 
-    bool two_byte = subset_charset_ranges.complete (glyph);
+    bool two_byte = subset_charset_ranges.complete (num_glyphs);
 
-    size0 = Charset0::min_size + HBUINT16::static_size * (plan->num_output_glyphs () - 1);
+    size0 = Charset0::get_size (plan->num_output_glyphs ());
     if (!two_byte)
-      size_ranges = Charset1::min_size + Charset1_Range::static_size * subset_charset_ranges.length;
+      size_ranges = Charset1::get_size_for_ranges (subset_charset_ranges.length);
     else
-      size_ranges = Charset2::min_size + Charset2_Range::static_size * subset_charset_ranges.length;
+      size_ranges = Charset2::get_size_for_ranges (subset_charset_ranges.length);
 
     if (size0 < size_ranges)
       subset_charset_format = 0;
@@ -528,19 +585,18 @@ struct cff_subset_plan {
       subset_charset_format = 1;
     else
       subset_charset_format = 2;
+
+    return true;
   }
 
   bool collect_sids_in_dicts (const OT::cff1::accelerator_subset_t &acc)
   {
-    sidmap.reset ();
-
     for (unsigned int i = 0; i < name_dict_values_t::ValCount; i++)
     {
       unsigned int sid = acc.topDict.nameSIDs[i];
       if (sid != CFF_UNDEF_SID)
       {
-	(void)sidmap.add (sid);
-	topDictModSIDs[i] = sidmap[sid];
+	topDictModSIDs[i] = sidmap.add (sid);
       }
     }
 
@@ -564,19 +620,24 @@ struct cff_subset_plan {
     drop_hints = plan->flags & HB_SUBSET_FLAGS_NO_HINTING;
     desubroutinize = plan->flags & HB_SUBSET_FLAGS_DESUBROUTINIZE;
 
-    /* check whether the subset renumbers any glyph IDs */
-    gid_renum = false;
-    for (hb_codepoint_t new_glyph = 0; new_glyph < plan->num_output_glyphs (); new_glyph++)
-    {
-      if (!plan->old_gid_for_new_gid(new_glyph, &old_glyph))
-	continue;
-      if (new_glyph != old_glyph) {
-	gid_renum = true;
-	break;
+ #ifdef HB_EXPERIMENTAL_API
+    min_charstrings_off_size = (plan->flags & HB_SUBSET_FLAGS_IFTB_REQUIREMENTS) ? 4 : 0;
+ #else
+    min_charstrings_off_size = 0;
+ #endif
+
+    subset_charset = !acc.is_predef_charset ();
+    if (!subset_charset)
+      /* check whether the subset renumbers any glyph IDs */
+      for (const auto &_ : plan->new_to_old_gid_list)
+      {
+	if (_.first != _.second)
+	{
+	  subset_charset = true;
+	  break;
+	}
       }
-    }
 
-    subset_charset = gid_renum || !acc.is_predef_charset ();
     subset_encoding = !acc.is_CID() && !acc.is_predef_encoding ();
 
     /* top dict INDEX */
@@ -618,7 +679,8 @@ struct cff_subset_plan {
       if (unlikely (sidmap.get_population () > 0x8000))	/* assumption: a dict won't reference that many strings */
 	return false;
 
-      if (subset_charset) plan_subset_charset (acc, plan);
+      if (subset_charset && !plan_subset_charset (acc, plan))
+        return false;
 
       topdict_mod.reassignSIDs (sidmap);
     }
@@ -682,8 +744,9 @@ struct cff_subset_plan {
       ;
     }
 
-    return ((subset_charstrings.length == plan->num_output_glyphs ())
-	   && (fontdicts_mod.length == subset_fdcount));
+    return !plan->in_error () &&
+	   (subset_charstrings.length == plan->num_output_glyphs ()) &&
+	   (fontdicts_mod.length == subset_fdcount);
   }
 
   cff1_top_dict_values_mod_t	topdict_mod;
@@ -721,25 +784,53 @@ struct cff_subset_plan {
   unsigned int	topDictModSIDs[name_dict_values_t::ValCount];
 
   bool		desubroutinize = false;
+
+  unsigned	min_charstrings_off_size = 0;
 };
+} // namespace OT
 
-static bool _serialize_cff1 (hb_serialize_context_t *c,
-			     cff_subset_plan &plan,
-			     const OT::cff1::accelerator_subset_t  &acc,
-			     unsigned int num_glyphs)
+static bool _serialize_cff1_charstrings (hb_serialize_context_t *c,
+                                         struct OT::cff1_subset_plan &plan,
+                                         const OT::cff1::accelerator_subset_t  &acc)
 {
+  c->push<CFF1CharStrings> ();
+
+  unsigned data_size = 0;
+  unsigned total_size = CFF1CharStrings::total_size (plan.subset_charstrings, &data_size, plan.min_charstrings_off_size);
+  if (unlikely (!c->start_zerocopy (total_size)))
+    return false;
+
+  auto *cs = c->start_embed<CFF1CharStrings> ();
+  if (unlikely (!cs->serialize (c, plan.subset_charstrings, &data_size, plan.min_charstrings_off_size))) {
+    c->pop_discard ();
+    return false;
+  }
+
+  plan.info.char_strings_link = c->pop_pack (false);
+  return true;
+}
+
+bool
+OT::cff1::accelerator_subset_t::serialize (hb_serialize_context_t *c,
+					   struct OT::cff1_subset_plan &plan) const
+{
+  /* push charstrings onto the object stack first which will ensure it packs as the last
+     object in the table. Keeping the chastrings last satisfies the requirements for patching
+     via IFTB. If this ordering needs to be changed in the future, charstrings should be left
+     at the end whenever HB_SUBSET_FLAGS_ITFB_REQUIREMENTS is enabled. */
+  if (!_serialize_cff1_charstrings(c, plan, *this))
+    return false;
+
   /* private dicts & local subrs */
-  for (int i = (int)acc.privateDicts.length; --i >= 0 ;)
+  for (int i = (int) privateDicts.length; --i >= 0 ;)
   {
     if (plan.fdmap.has (i))
     {
       objidx_t	subrs_link = 0;
       if (plan.subset_localsubrs[i].length > 0)
       {
-	CFF1Subrs *dest = c->start_embed <CFF1Subrs> ();
-	if (unlikely (!dest)) return false;
-	c->push ();
-	if (likely (dest && dest->serialize (c, plan.subset_localsubrs[i])))
+	auto *dest = c->push <CFF1Subrs> ();
+	if (likely (dest->serialize (c, plan.subset_localsubrs[i])))
 	  subrs_link = c->pop_pack ();
 	else
 	{
@@ -748,12 +839,10 @@ static bool _serialize_cff1 (hb_serializ
 	}
       }
 
-      PrivateDict *pd = c->start_embed<PrivateDict> ();
-      if (unlikely (!pd)) return false;
-      c->push ();
+      auto *pd = c->push<PrivateDict> ();
       cff1_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints);
       /* N.B. local subrs immediately follows its corresponding private dict. i.e., subr offset == private dict size */
-      if (likely (pd->serialize (c, acc.privateDicts[i], privSzr, subrs_link)))
+      if (likely (pd->serialize (c, privateDicts[i], privSzr, subrs_link)))
       {
 	unsigned fd = plan.fdmap[i];
 	plan.fontdicts_mod[fd].privateDictInfo.size = c->length ();
@@ -767,35 +856,13 @@ static bool _serialize_cff1 (hb_serializ
     }
   }
 
-  if (!acc.is_CID ())
+  if (!is_CID ())
     plan.info.privateDictInfo = plan.fontdicts_mod[0].privateDictInfo;
 
-  /* CharStrings */
-  {
-    c->push<CFF1CharStrings> ();
-
-    unsigned total_size = CFF1CharStrings::total_size (plan.subset_charstrings);
-    if (unlikely (!c->start_zerocopy (total_size)))
-       return false;
-
-    CFF1CharStrings  *cs = c->start_embed<CFF1CharStrings> ();
-    if (unlikely (!cs)) return false;
-
-    if (likely (cs->serialize (c, plan.subset_charstrings)))
-      plan.info.char_strings_link = c->pop_pack (false);
-    else
-    {
-      c->pop_discard ();
-      return false;
-    }
-  }
-
   /* FDArray (FD Index) */
-  if (acc.fdArray != &Null (CFF1FDArray))
+  if (fdArray != &Null (CFF1FDArray))
   {
-    CFF1FDArray *fda = c->start_embed<CFF1FDArray> ();
-    if (unlikely (!fda)) return false;
-    c->push ();
+    auto *fda = c->push<CFF1FDArray> ();
     cff1_font_dict_op_serializer_t  fontSzr;
     auto it = + hb_zip (+ hb_iter (plan.fontdicts_mod), + hb_iter (plan.fontdicts_mod));
     if (likely (fda->serialize (c, it, fontSzr)))
@@ -808,10 +875,10 @@ static bool _serialize_cff1 (hb_serializ
   }
 
   /* FDSelect */
-  if (acc.fdSelect != &Null (CFF1FDSelect))
+  if (fdSelect != &Null (CFF1FDSelect))
   {
     c->push ();
-    if (likely (hb_serialize_cff_fdselect (c, num_glyphs, *acc.fdSelect, acc.fdCount,
+    if (likely (hb_serialize_cff_fdselect (c, plan.num_glyphs, *fdSelect, fdCount,
 					   plan.subset_fdselect_format, plan.info.fd_select.size,
 					   plan.subset_fdselect_ranges)))
       plan.info.fd_select.link = c->pop_pack ();
@@ -825,9 +892,7 @@ static bool _serialize_cff1 (hb_serializ
   /* Charset */
   if (plan.subset_charset)
   {
-    Charset *dest = c->start_embed<Charset> ();
-    if (unlikely (!dest)) return false;
-    c->push ();
+    auto *dest = c->push<Charset> ();
     if (likely (dest->serialize (c,
 				 plan.subset_charset_format,
 				 plan.num_glyphs,
@@ -843,9 +908,7 @@ static bool _serialize_cff1 (hb_serializ
   /* Encoding */
   if (plan.subset_encoding)
   {
-    Encoding *dest = c->start_embed<Encoding> ();
-    if (unlikely (!dest)) return false;
-    c->push ();
+    auto *dest = c->push<Encoding> ();
     if (likely (dest->serialize (c,
 				 plan.subset_enc_format,
 				 plan.subset_enc_num_codes,
@@ -861,9 +924,7 @@ static bool _serialize_cff1 (hb_serializ
 
   /* global subrs */
   {
-    c->push ();
-    CFF1Subrs *dest = c->start_embed <CFF1Subrs> ();
-    if (unlikely (!dest)) return false;
+    auto *dest = c->push <CFF1Subrs> ();
     if (likely (dest->serialize (c, plan.subset_globalsubrs)))
       c->pop_pack (false);
     else
@@ -875,10 +936,9 @@ static bool _serialize_cff1 (hb_serializ
 
   /* String INDEX */
   {
-    CFF1StringIndex *dest = c->start_embed<CFF1StringIndex> ();
-    if (unlikely (!dest)) return false;
-    c->push ();
-    if (likely (dest->serialize (c, *acc.stringIndex, plan.sidmap)))
+    auto *dest = c->push<CFF1StringIndex> ();
+    if (likely (!plan.sidmap.in_error () &&
+		dest->serialize (c, *stringIndex, plan.sidmap.vector)))
       c->pop_pack ();
     else
     {
@@ -898,14 +958,12 @@ static bool _serialize_cff1 (hb_serializ
   cff->offSize = 4; /* unused? */
 
   /* name INDEX */
-  if (unlikely (!(*acc.nameIndex).copy (c))) return false;
+  if (unlikely (!c->embed (*nameIndex))) return false;
 
   /* top dict INDEX */
   {
     /* serialize singleton TopDict */
-    TopDict *top = c->start_embed<TopDict> ();
-    if (!top) return false;
-    c->push ();
+    auto *top = c->push<TopDict> ();
     cff1_top_dict_op_serializer_t topSzr;
     unsigned top_size = 0;
     top_dict_modifiers_t  modifier (plan.info, plan.topDictModSIDs);
@@ -920,36 +978,23 @@ static bool _serialize_cff1 (hb_serializ
       return false;
     }
     /* serialize INDEX header for above */
-    CFF1Index *dest = c->start_embed<CFF1Index> ();
-    if (!dest) return false;
-    return dest->serialize_header (c, hb_iter (hb_array_t<unsigned> (&top_size, 1)));
+    auto *dest = c->start_embed<CFF1Index> ();
+    return dest->serialize_header (c, hb_iter (&top_size, 1), top_size);
   }
 }
 
-static bool
-_hb_subset_cff1 (const OT::cff1::accelerator_subset_t  &acc,
-		hb_subset_context_t	*c)
+bool
+OT::cff1::accelerator_subset_t::subset (hb_subset_context_t *c) const
 {
-  cff_subset_plan cff_plan;
+  cff1_subset_plan cff_plan;
 
-  if (unlikely (!cff_plan.create (acc, c->plan)))
+  if (unlikely (!cff_plan.create (*this, c->plan)))
   {
     DEBUG_MSG(SUBSET, nullptr, "Failed to generate a cff subsetting plan.");
     return false;
   }
 
-  return _serialize_cff1 (c->serializer, cff_plan, acc, c->plan->num_output_glyphs ());
-}
-
-bool
-hb_subset_cff1 (hb_subset_context_t *c)
-{
-  OT::cff1::accelerator_subset_t acc;
-  acc.init (c->plan->source);
-  bool result = likely (acc.is_valid ()) && _hb_subset_cff1 (acc, c);
-  acc.fini ();
-
-  return result;
+  return serialize (c->serializer, cff_plan);
 }
 
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-cff1.hh	1970-01-01 00:00:00.000000000 +0000
@@ -1,37 +0,0 @@
-/*
- * Copyright © 2018 Adobe Inc.
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Adobe Author(s): Michiharu Ariza
- */
-
-#ifndef HB_SUBSET_CFF1_HH
-#define HB_SUBSET_CFF1_HH
-
-#include "hb.hh"
-
-#include "hb-subset-plan.hh"
-
-HB_INTERNAL bool
-hb_subset_cff1 (hb_subset_context_t *c);
-
-#endif /* HB_SUBSET_CFF1_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.cc	2024-11-20 13:56:33.000000000 +0000
@@ -31,7 +31,6 @@
 #include "hb-open-type.hh"
 #include "hb-ot-cff2-table.hh"
 #include "hb-set.h"
-#include "hb-subset-cff2.hh"
 #include "hb-subset-plan.hh"
 #include "hb-subset-cff-common.hh"
 #include "hb-cff2-interp-cs.hh"
@@ -249,7 +248,7 @@ struct cff2_subr_subsetter_t : subr_subs
 struct cff2_private_blend_encoder_param_t
 {
   cff2_private_blend_encoder_param_t (hb_serialize_context_t *c,
-				      const CFF2VariationStore *varStore,
+				      const CFF2ItemVariationStore *varStore,
 				      hb_array_t<int> normalized_coords) :
     c (c), varStore (varStore), normalized_coords (normalized_coords) {}
 
@@ -285,7 +284,7 @@ struct cff2_private_blend_encoder_param_
   unsigned ivs = 0;
   unsigned region_count = 0;
   hb_vector_t<float> scalars;
-  const	 CFF2VariationStore *varStore = nullptr;
+  const	 CFF2ItemVariationStore *varStore = nullptr;
   hb_array_t<int> normalized_coords;
 };
 
@@ -379,7 +378,7 @@ struct cff2_private_dict_blend_opset_t :
 struct cff2_private_dict_op_serializer_t : op_serializer_t
 {
   cff2_private_dict_op_serializer_t (bool desubroutinize_, bool drop_hints_, bool pinned_,
-				     const CFF::CFF2VariationStore* varStore_,
+				     const CFF::CFF2ItemVariationStore* varStore_,
 				     hb_array_t<int> normalized_coords_)
     : desubroutinize (desubroutinize_), drop_hints (drop_hints_), pinned (pinned_),
       varStore (varStore_), normalized_coords (normalized_coords_) {}
@@ -417,16 +416,22 @@ struct cff2_private_dict_op_serializer_t
   const bool desubroutinize;
   const bool drop_hints;
   const bool pinned;
-  const CFF::CFF2VariationStore* varStore;
+  const CFF::CFF2ItemVariationStore* varStore;
   hb_array_t<int> normalized_coords;
 };
 
 
+namespace OT {
 struct cff2_subset_plan
 {
   bool create (const OT::cff2::accelerator_subset_t &acc,
 	      hb_subset_plan_t *plan)
   {
+    /* make sure notdef is first */
+    hb_codepoint_t old_glyph;
+    if (!plan->old_gid_for_new_gid (0, &old_glyph) || (old_glyph != 0)) return false;
+
+    num_glyphs = plan->num_output_glyphs ();
     orig_fdcount = acc.fdArray->count;
 
     drop_hints = plan->flags & HB_SUBSET_FLAGS_NO_HINTING;
@@ -434,6 +439,12 @@ struct cff2_subset_plan
     desubroutinize = plan->flags & HB_SUBSET_FLAGS_DESUBROUTINIZE ||
 		     pinned; // For instancing we need this path
 
+ #ifdef HB_EXPERIMENTAL_API
+    min_charstrings_off_size = (plan->flags & HB_SUBSET_FLAGS_IFTB_REQUIREMENTS) ? 4 : 0;
+ #else
+    min_charstrings_off_size = 0;
+ #endif
+
     if (desubroutinize)
     {
       /* Flatten global & local subrs */
@@ -489,6 +500,7 @@ struct cff2_subset_plan
 
   cff2_sub_table_info_t info;
 
+  unsigned int    num_glyphs;
   unsigned int    orig_fdcount = 0;
   unsigned int    subset_fdcount = 1;
   unsigned int    subset_fdselect_size = 0;
@@ -504,19 +516,50 @@ struct cff2_subset_plan
 
   bool	    drop_hints = false;
   bool	    desubroutinize = false;
+
+  unsigned  min_charstrings_off_size = 0;
 };
+} // namespace OT
 
-static bool _serialize_cff2 (hb_serialize_context_t *c,
+static bool _serialize_cff2_charstrings (hb_serialize_context_t *c,
 			     cff2_subset_plan &plan,
-			     const OT::cff2::accelerator_subset_t  &acc,
-			     unsigned int num_glyphs,
-			     hb_array_t<int> normalized_coords)
+			     const OT::cff2::accelerator_subset_t  &acc)
 {
+  c->push ();
+
+  unsigned data_size = 0;
+  unsigned total_size = CFF2CharStrings::total_size (plan.subset_charstrings, &data_size, plan.min_charstrings_off_size);
+  if (unlikely (!c->start_zerocopy (total_size)))
+    return false;
+
+  auto *cs = c->start_embed<CFF2CharStrings> ();
+  if (unlikely (!cs->serialize (c, plan.subset_charstrings, &data_size, plan.min_charstrings_off_size)))
+  {
+    c->pop_discard ();
+    return false;
+  }
+
+  plan.info.char_strings_link = c->pop_pack (false);
+  return true;
+}
+
+bool
+OT::cff2::accelerator_subset_t::serialize (hb_serialize_context_t *c,
+					   struct cff2_subset_plan &plan,
+					   hb_array_t<int> normalized_coords) const
+{
+  /* push charstrings onto the object stack first which will ensure it packs as the last
+     object in the table. Keeping the chastrings last satisfies the requirements for patching
+     via IFTB. If this ordering needs to be changed in the future, charstrings should be left
+     at the end whenever HB_SUBSET_FLAGS_ITFB_REQUIREMENTS is enabled. */
+  if (!_serialize_cff2_charstrings(c, plan, *this))
+    return false;
+
   /* private dicts & local subrs */
   hb_vector_t<table_info_t>  private_dict_infos;
   if (unlikely (!private_dict_infos.resize (plan.subset_fdcount))) return false;
 
-  for (int i = (int)acc.privateDicts.length; --i >= 0 ;)
+  for (int i = (int)privateDicts.length; --i >= 0 ;)
   {
     if (plan.fdmap.has (i))
     {
@@ -524,9 +567,7 @@ static bool _serialize_cff2 (hb_serializ
 
       if (plan.subset_localsubrs[i].length > 0)
       {
-	CFF2Subrs *dest = c->start_embed <CFF2Subrs> ();
-	if (unlikely (!dest)) return false;
-	c->push ();
+	auto *dest = c->push <CFF2Subrs> ();
 	if (likely (dest->serialize (c, plan.subset_localsubrs[i])))
 	  subrs_link = c->pop_pack (false);
 	else
@@ -535,12 +576,10 @@ static bool _serialize_cff2 (hb_serializ
 	  return false;
 	}
       }
-      PrivateDict *pd = c->start_embed<PrivateDict> ();
-      if (unlikely (!pd)) return false;
-      c->push ();
+      auto *pd = c->push<PrivateDict> ();
       cff2_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints, plan.pinned,
-						 acc.varStore, normalized_coords);
-      if (likely (pd->serialize (c, acc.privateDicts[i], privSzr, subrs_link)))
+						 varStore, normalized_coords);
+      if (likely (pd->serialize (c, privateDicts[i], privSzr, subrs_link)))
       {
 	unsigned fd = plan.fdmap[i];
 	private_dict_infos[fd].size = c->length ();
@@ -554,31 +593,11 @@ static bool _serialize_cff2 (hb_serializ
     }
   }
 
-  /* CharStrings */
-  {
-    c->push ();
-
-    unsigned total_size = CFF2CharStrings::total_size (plan.subset_charstrings);
-    if (unlikely (!c->start_zerocopy (total_size)))
-       return false;
-
-    CFF2CharStrings  *cs = c->start_embed<CFF2CharStrings> ();
-    if (unlikely (!cs)) return false;
-
-    if (likely (cs->serialize (c, plan.subset_charstrings)))
-      plan.info.char_strings_link = c->pop_pack (false);
-    else
-    {
-      c->pop_discard ();
-      return false;
-    }
-  }
-
   /* FDSelect */
-  if (acc.fdSelect != &Null (CFF2FDSelect))
+  if (fdSelect != &Null (CFF2FDSelect))
   {
     c->push ();
-    if (likely (hb_serialize_cff_fdselect (c, num_glyphs, *(const FDSelect *)acc.fdSelect,
+    if (likely (hb_serialize_cff_fdselect (c, plan.num_glyphs, *(const FDSelect *)fdSelect,
 					   plan.orig_fdcount,
 					   plan.subset_fdselect_format, plan.subset_fdselect_size,
 					   plan.subset_fdselect_ranges)))
@@ -592,27 +611,32 @@ static bool _serialize_cff2 (hb_serializ
 
   /* FDArray (FD Index) */
   {
-    c->push ();
-    CFF2FDArray *fda = c->start_embed<CFF2FDArray> ();
-    if (unlikely (!fda)) return false;
+    auto *fda = c->push<CFF2FDArray> ();
     cff_font_dict_op_serializer_t fontSzr;
     auto it =
-    + hb_zip (+ hb_iter (acc.fontDicts)
+    + hb_zip (+ hb_iter (fontDicts)
 	      | hb_filter ([&] (const cff2_font_dict_values_t &_)
-		{ return plan.fdmap.has (&_ - &acc.fontDicts[0]); }),
+		{ return plan.fdmap.has (&_ - &fontDicts[0]); }),
 	      hb_iter (private_dict_infos))
     ;
-    if (unlikely (!fda->serialize (c, it, fontSzr))) return false;
+    if (unlikely (!fda->serialize (c, it, fontSzr)))
+    {
+      c->pop_discard ();
+      return false;
+    }
     plan.info.fd_array_link = c->pop_pack (false);
   }
 
   /* variation store */
-  if (acc.varStore != &Null (CFF2VariationStore) &&
+  if (varStore != &Null (CFF2ItemVariationStore) &&
       !plan.pinned)
   {
-    c->push ();
-    CFF2VariationStore *dest = c->start_embed<CFF2VariationStore> ();
-    if (unlikely (!dest || !dest->serialize (c, acc.varStore))) return false;
+    auto *dest = c->push<CFF2ItemVariationStore> ();
+    if (unlikely (!dest->serialize (c, varStore)))
+    {
+      c->pop_discard ();
+      return false;
+    }
     plan.info.var_store_link = c->pop_pack (false);
   }
 
@@ -628,34 +652,25 @@ static bool _serialize_cff2 (hb_serializ
   {
     TopDict &dict = cff2 + cff2->topDict;
     cff2_top_dict_op_serializer_t topSzr;
-    if (unlikely (!dict.serialize (c, acc.topDict, topSzr, plan.info))) return false;
+    if (unlikely (!dict.serialize (c, topDict, topSzr, plan.info))) return false;
     cff2->topDictSize = c->head - (const char *)&dict;
   }
 
   /* global subrs */
   {
-    CFF2Subrs *dest = c->start_embed <CFF2Subrs> ();
-    if (unlikely (!dest)) return false;
+    auto *dest = c->start_embed <CFF2Subrs> ();
     return dest->serialize (c, plan.subset_globalsubrs);
   }
 }
 
-static bool
-_hb_subset_cff2 (const OT::cff2::accelerator_subset_t  &acc,
-		 hb_subset_context_t	*c)
+bool
+OT::cff2::accelerator_subset_t::subset (hb_subset_context_t *c) const
 {
   cff2_subset_plan cff2_plan;
 
-  if (unlikely (!cff2_plan.create (acc, c->plan))) return false;
-  return _serialize_cff2 (c->serializer, cff2_plan, acc, c->plan->num_output_glyphs (),
-			  c->plan->normalized_coords.as_array ());
-}
-
-bool
-hb_subset_cff2 (hb_subset_context_t *c)
-{
-  OT::cff2::accelerator_subset_t acc (c->plan->source);
-  return acc.is_valid () && _hb_subset_cff2 (acc, c);
+  if (unlikely (!cff2_plan.create (*this, c->plan))) return false;
+  return serialize (c->serializer, cff2_plan,
+		    c->plan->normalized_coords.as_array ());
 }
 
 #endif
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-cff2.hh	1970-01-01 00:00:00.000000000 +0000
@@ -1,37 +0,0 @@
-/*
- * Copyright © 2018 Adobe Inc.
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Adobe Author(s): Michiharu Ariza
- */
-
-#ifndef HB_SUBSET_CFF2_HH
-#define HB_SUBSET_CFF2_HH
-
-#include "hb.hh"
-
-#include "hb-subset-plan.hh"
-
-HB_INTERNAL bool
-hb_subset_cff2 (hb_subset_context_t *c);
-
-#endif /* HB_SUBSET_CFF2_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-input.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-input.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-input.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-input.cc	2024-11-20 13:56:33.000000000 +0000
@@ -24,6 +24,7 @@
  * Google Author(s): Garret Rieger, Rod Sheeter, Behdad Esfahbod
  */
 
+#include "hb-subset-instancer-solver.hh"
 #include "hb-subset.hh"
 #include "hb-set.hh"
 #include "hb-utf.hh"
@@ -50,7 +51,6 @@ hb_subset_input_t::hb_subset_input_t ()
     HB_TAG ('k', 'e', 'r', 'n'),
 
     // Copied from fontTools:
-    HB_TAG ('B', 'A', 'S', 'E'),
     HB_TAG ('J', 'S', 'T', 'F'),
     HB_TAG ('D', 'S', 'I', 'G'),
     HB_TAG ('E', 'B', 'D', 'T'),
@@ -69,14 +69,11 @@ hb_subset_input_t::hb_subset_input_t ()
   sets.drop_tables->add_array (default_drop_tables, ARRAY_LENGTH (default_drop_tables));
 
   hb_tag_t default_no_subset_tables[] = {
-    HB_TAG ('a', 'v', 'a', 'r'),
     HB_TAG ('g', 'a', 's', 'p'),
     HB_TAG ('f', 'p', 'g', 'm'),
     HB_TAG ('p', 'r', 'e', 'p'),
     HB_TAG ('V', 'D', 'M', 'X'),
     HB_TAG ('D', 'S', 'I', 'G'),
-    HB_TAG ('M', 'V', 'A', 'R'),
-    HB_TAG ('c', 'v', 'a', 'r'),
   };
   sets.no_subset_tables->add_array (default_no_subset_tables,
 					 ARRAY_LENGTH (default_no_subset_tables));
@@ -126,6 +123,12 @@ hb_subset_input_t::hb_subset_input_t ()
     //justify
     HB_TAG ('j', 'a', 'l', 't'), // HarfBuzz doesn't use; others might
 
+    //East Asian spacing
+    HB_TAG ('c', 'h', 'w', 's'),
+    HB_TAG ('v', 'c', 'h', 'w'),
+    HB_TAG ('h', 'a', 'l', 't'),
+    HB_TAG ('v', 'h', 'a', 'l'),
+
     //private
     HB_TAG ('H', 'a', 'r', 'f'),
     HB_TAG ('H', 'A', 'R', 'F'),
@@ -415,6 +418,46 @@ hb_subset_input_keep_everything (hb_subs
 
 #ifndef HB_NO_VAR
 /**
+ * hb_subset_input_pin_all_axes_to_default: (skip)
+ * @input: a #hb_subset_input_t object.
+ * @face: a #hb_face_t object.
+ *
+ * Pin all axes to default locations in the given subset input object.
+ *
+ * All axes in a font must be pinned. Additionally, `CFF2` table, if present,
+ * will be de-subroutinized.
+ *
+ * Return value: `true` if success, `false` otherwise
+ *
+ * Since: 8.3.1
+ **/
+HB_EXTERN hb_bool_t
+hb_subset_input_pin_all_axes_to_default (hb_subset_input_t  *input,
+                                         hb_face_t          *face)
+{
+  unsigned axis_count = hb_ot_var_get_axis_count (face);
+  if (!axis_count) return false;
+
+  hb_ot_var_axis_info_t *axis_infos = (hb_ot_var_axis_info_t *) hb_calloc (axis_count, sizeof (hb_ot_var_axis_info_t));
+  if (unlikely (!axis_infos)) return false;
+
+  (void) hb_ot_var_get_axis_infos (face, 0, &axis_count, axis_infos);
+
+  for (unsigned i = 0; i < axis_count; i++)
+  {
+    hb_tag_t axis_tag = axis_infos[i].tag;
+    float default_val = axis_infos[i].default_value;
+    if (!input->axes_location.set (axis_tag, Triple (default_val, default_val, default_val)))
+    {
+      hb_free (axis_infos);
+      return false;
+    }
+  }
+  hb_free (axis_infos);
+  return true;
+}
+
+/**
  * hb_subset_input_pin_axis_to_default: (skip)
  * @input: a #hb_subset_input_t object.
  * @face: a #hb_face_t object.
@@ -438,7 +481,8 @@ hb_subset_input_pin_axis_to_default (hb_
   if (!hb_ot_var_find_axis_info (face, axis_tag, &axis_info))
     return false;
 
-  return input->axes_location.set (axis_tag, axis_info.default_value);
+  float default_val = axis_info.default_value;
+  return input->axes_location.set (axis_tag, Triple (default_val, default_val, default_val));
 }
 
 /**
@@ -468,9 +512,93 @@ hb_subset_input_pin_axis_location (hb_su
     return false;
 
   float val = hb_clamp(axis_value, axis_info.min_value, axis_info.max_value);
-  return input->axes_location.set (axis_tag, val);
+  return input->axes_location.set (axis_tag, Triple (val, val, val));
+}
+
+#ifdef HB_EXPERIMENTAL_API
+/**
+ * hb_subset_input_set_axis_range: (skip)
+ * @input: a #hb_subset_input_t object.
+ * @face: a #hb_face_t object.
+ * @axis_tag: Tag of the axis
+ * @axis_min_value: Minimum value of the axis variation range to set, if NaN the existing min will be used.
+ * @axis_max_value: Maximum value of the axis variation range to set  if NaN the existing max will be used.
+ * @axis_def_value: Default value of the axis variation range to set, if NaN the existing default will be used.
+ *
+ * Restricting the range of variation on an axis in the given subset input object.
+ * New min/default/max values will be clamped if they're not within the fvar axis range.
+ *
+ * If the fvar axis default value is not within the new range, the new default
+ * value will be changed to the new min or max value, whichever is closer to the fvar
+ * axis default.
+ *
+ * Note: input min value can not be bigger than input max value. If the input
+ * default value is not within the new min/max range, it'll be clamped.
+ * Note: currently it supports gvar and cvar tables only.
+ *
+ * Return value: `true` if success, `false` otherwise
+ *
+ * XSince: EXPERIMENTAL
+ **/
+HB_EXTERN hb_bool_t
+hb_subset_input_set_axis_range (hb_subset_input_t  *input,
+                                hb_face_t          *face,
+                                hb_tag_t            axis_tag,
+                                float               axis_min_value,
+                                float               axis_max_value,
+                                float               axis_def_value)
+{
+  hb_ot_var_axis_info_t axis_info;
+  if (!hb_ot_var_find_axis_info (face, axis_tag, &axis_info))
+    return false;
+
+  float min = !std::isnan(axis_min_value) ? axis_min_value : axis_info.min_value;
+  float max = !std::isnan(axis_max_value) ? axis_max_value : axis_info.max_value;
+  float def = !std::isnan(axis_def_value) ? axis_def_value : axis_info.default_value;
+
+  if (min > max)
+    return false;
+
+  float new_min_val = hb_clamp(min, axis_info.min_value, axis_info.max_value);
+  float new_max_val = hb_clamp(max, axis_info.min_value, axis_info.max_value);
+  float new_default_val = hb_clamp(def, new_min_val, new_max_val);
+  return input->axes_location.set (axis_tag, Triple (new_min_val, new_default_val, new_max_val));
+}
+
+/**
+ * hb_subset_input_get_axis_range: (skip)
+ * @input: a #hb_subset_input_t object.
+ * @axis_tag: Tag of the axis
+ * @axis_min_value: Set to the previously configured minimum value of the axis variation range.
+ * @axis_max_value: Set to the previously configured maximum value of the axis variation range.
+ * @axis_def_value: Set to the previously configured default value of the axis variation range.
+ *
+ * Gets the axis range assigned by previous calls to hb_subset_input_set_axis_range.
+ *
+ * Return value: `true` if a range has been set for this axis tag, `false` otherwise.
+ *
+ * XSince: EXPERIMENTAL
+ **/
+HB_EXTERN hb_bool_t
+hb_subset_input_get_axis_range (hb_subset_input_t  *input,
+				hb_tag_t            axis_tag,
+				float              *axis_min_value,
+				float              *axis_max_value,
+				float              *axis_def_value)
+
+{
+  Triple* triple;
+  if (!input->axes_location.has(axis_tag, &triple)) {
+    return false;
+  }
+
+  *axis_min_value = triple->minimum;
+  *axis_def_value = triple->middle;
+  *axis_max_value = triple->maximum;
+  return true;
 }
 #endif
+#endif
 
 /**
  * hb_subset_preprocess:
@@ -520,6 +648,37 @@ hb_subset_preprocess (hb_face_t *source)
   return new_source;
 }
 
+/**
+ * hb_subset_input_old_to_new_glyph_mapping:
+ * @input: a #hb_subset_input_t object.
+ *
+ * Returns a map which can be used to provide an explicit mapping from old to new glyph
+ * id's in the produced subset. The caller should populate the map as desired.
+ * If this map is left empty then glyph ids will be automatically mapped to new
+ * values by the subsetter. If populated, the mapping must be unique. That
+ * is no two original glyph ids can be mapped to the same new id.
+ * Additionally, if a mapping is provided then the retain gids option cannot
+ * be enabled.
+ *
+ * Any glyphs that are retained in the subset which are not specified
+ * in this mapping will be assigned glyph ids after the highest glyph
+ * id in the mapping.
+ *
+ * Note: this will accept and apply non-monotonic mappings, however this
+ * may result in unsorted Coverage tables. Such fonts may not work for all
+ * use cases (for example ots will reject unsorted coverage tables). So it's
+ * recommended, if possible, to supply a monotonic mapping.
+ *
+ * Return value: (transfer none): pointer to the #hb_map_t of the custom glyphs ID map.
+ *
+ * Since: 7.3.0
+ **/
+HB_EXTERN hb_map_t*
+hb_subset_input_old_to_new_glyph_mapping (hb_subset_input_t *input)
+{
+  return &input->glyph_map;
+}
+
 #ifdef HB_EXPERIMENTAL_API
 /**
  * hb_subset_input_override_name_table:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-input.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-input.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-input.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-input.hh	2024-11-20 13:56:33.000000000 +0000
@@ -35,6 +35,7 @@
 #include "hb-set.hh"
 #include "hb-cplusplus.hh"
 #include "hb-font.hh"
+#include "hb-subset-instancer-solver.hh"
 
 struct hb_ot_name_record_ids_t
 {
@@ -118,7 +119,8 @@ struct hb_subset_input_t
   // If set loca format will always be the long version.
   bool force_long_loca = false;
 
-  hb_hashmap_t<hb_tag_t, float> axes_location;
+  hb_hashmap_t<hb_tag_t, Triple> axes_location;
+  hb_map_t glyph_map;
 #ifdef HB_EXPERIMENTAL_API
   hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> name_table_overrides;
 #endif
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-iup.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-iup.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-iup.cc	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-iup.cc	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,532 @@
+/*
+ * Copyright © 2024  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#include "hb-subset-instancer-iup.hh"
+
+/* This file is a straight port of the following:
+ *
+ * https://github.com/fonttools/fonttools/blob/main/Lib/fontTools/varLib/iup.py
+ *
+ * Where that file returns optimzied deltas vector, we return optimized
+ * referenced point indices.
+ */
+
+constexpr static unsigned MAX_LOOKBACK = 8;
+
+static void _iup_contour_bound_forced_set (const hb_array_t<const contour_point_t> contour_points,
+                                           const hb_array_t<const int> x_deltas,
+                                           const hb_array_t<const int> y_deltas,
+                                           hb_set_t& forced_set, /* OUT */
+                                           float tolerance = 0.f)
+{
+  unsigned len = contour_points.length;
+  unsigned next_i = 0;
+  for (int i = len - 1; i >= 0; i--)
+  {
+    unsigned last_i = (len + i -1) % len;
+    for (unsigned j = 0; j < 2; j++)
+    {
+      float cj, lcj, ncj;
+      int dj, ldj, ndj;
+      if (j == 0)
+      {
+        cj = contour_points.arrayZ[i].x;
+        dj = x_deltas.arrayZ[i];
+        lcj = contour_points.arrayZ[last_i].x;
+        ldj = x_deltas.arrayZ[last_i];
+        ncj = contour_points.arrayZ[next_i].x;
+        ndj = x_deltas.arrayZ[next_i];
+      }
+      else
+      {
+        cj = contour_points.arrayZ[i].y;
+        dj = y_deltas.arrayZ[i];
+        lcj = contour_points.arrayZ[last_i].y;
+        ldj = y_deltas.arrayZ[last_i];
+        ncj = contour_points.arrayZ[next_i].y;
+        ndj = y_deltas.arrayZ[next_i];
+      }
+
+      float c1, c2;
+      int d1, d2;
+      if (lcj <= ncj)
+      {
+        c1 = lcj;
+        c2 = ncj;
+        d1 = ldj;
+        d2 = ndj;
+      }
+      else
+      {
+        c1 = ncj;
+        c2 = lcj;
+        d1 = ndj;
+        d2 = ldj;
+      }
+
+      bool force = false;
+      if (c1 == c2)
+      {
+        if (abs (d1 - d2) > tolerance && abs (dj) > tolerance)
+          force = true;
+      }
+      else if (c1 <= cj && cj <= c2)
+      {
+        if (!(hb_min (d1, d2) - tolerance <= dj &&
+              dj <= hb_max (d1, d2) + tolerance))
+          force = true;
+      }
+      else
+      {
+        if (d1 != d2)
+        {
+          if (cj < c1)
+          {
+            if (abs (dj) > tolerance &&
+                abs (dj - d1) > tolerance &&
+                ((dj - tolerance < d1) != (d1 < d2)))
+                force = true;
+          }
+          else
+          {
+            if (abs (dj) > tolerance &&
+                abs (dj - d2) > tolerance &&
+                ((d2 < dj + tolerance) != (d1 < d2)))
+              force = true;
+          }
+        }
+      }
+
+      if (force)
+      {
+        forced_set.add (i);
+        break;
+      }
+    }
+    next_i = i;
+  }
+}
+
+template <typename T,
+          hb_enable_if (hb_is_trivially_copyable (T))>
+static bool rotate_array (const hb_array_t<const T>& org_array,
+                          int k,
+                          hb_vector_t<T>& out)
+{
+  unsigned n = org_array.length;
+  if (!n) return true;
+  if (unlikely (!out.resize (n, false)))
+    return false;
+
+  unsigned item_size = hb_static_size (T);
+  if (k < 0)
+    k = n - (-k) % n;
+  else
+    k %= n;
+
+  hb_memcpy ((void *) out.arrayZ, (const void *) (org_array.arrayZ + n - k), k * item_size);
+  hb_memcpy ((void *) (out.arrayZ + k), (const void *) org_array.arrayZ, (n - k) * item_size);
+  return true;
+}
+
+static bool rotate_set (const hb_set_t& org_set,
+                        int k,
+                        unsigned n,
+                        hb_set_t& out)
+{
+  if (!n) return false;
+  k %= n;
+  if (k < 0)
+    k = n + k;
+
+  if (k == 0)
+  {
+    out.set (org_set);
+  }
+  else
+  {
+    for (auto v : org_set)
+      out.add ((v + k) % n);
+  }
+  return !out.in_error ();
+}
+
+/* Given two reference coordinates (start and end of contour_points array),
+ * output interpolated deltas for points in between */
+static bool _iup_segment (const hb_array_t<const contour_point_t> contour_points,
+                          const hb_array_t<const int> x_deltas,
+                          const hb_array_t<const int> y_deltas,
+                          const contour_point_t& p1, const contour_point_t& p2,
+                          int p1_dx, int p2_dx,
+                          int p1_dy, int p2_dy,
+                          hb_vector_t<float>& interp_x_deltas, /* OUT */
+                          hb_vector_t<float>& interp_y_deltas /* OUT */)
+{
+  unsigned n = contour_points.length;
+  if (unlikely (!interp_x_deltas.resize (n, false) ||
+                !interp_y_deltas.resize (n, false)))
+    return false;
+
+  for (unsigned j = 0; j < 2; j++)
+  {
+    float x1, x2, d1, d2;
+    float *out;
+    if (j == 0)
+    {
+      x1 = p1.x;
+      x2 = p2.x;
+      d1 = p1_dx;
+      d2 = p2_dx;
+      out = interp_x_deltas.arrayZ;
+    }
+    else
+    {
+      x1 = p1.y;
+      x2 = p2.y;
+      d1 = p1_dy;
+      d2 = p2_dy;
+      out = interp_y_deltas.arrayZ;
+    }
+
+    if (x1 == x2)
+    {
+      if (d1 == d2)
+      {
+        for (unsigned i = 0; i < n; i++)
+          out[i] = d1;
+      }
+      else
+      {
+        for (unsigned i = 0; i < n; i++)
+          out[i] = 0.f;
+      }
+      continue;
+    }
+
+    if (x1 > x2)
+    {
+      hb_swap (x1, x2);
+      hb_swap (d1, d2);
+    }
+
+    float scale = (d2 - d1) / (x2 - x1);
+    for (unsigned i = 0; i < n; i++)
+    {
+      float x = j == 0 ? contour_points.arrayZ[i].x : contour_points.arrayZ[i].y;
+      float d;
+      if (x <= x1)
+        d = d1;
+      else if (x >= x2)
+        d = d2;
+      else
+        d = d1 + (x - x1) * scale;
+
+      out[i] = d;
+    }
+  }
+  return true;
+}
+
+static bool _can_iup_in_between (const hb_array_t<const contour_point_t> contour_points,
+                                 const hb_array_t<const int> x_deltas,
+                                 const hb_array_t<const int> y_deltas,
+                                 const contour_point_t& p1, const contour_point_t& p2,
+                                 int p1_dx, int p2_dx,
+                                 int p1_dy, int p2_dy,
+                                 float tolerance)
+{
+  hb_vector_t<float> interp_x_deltas, interp_y_deltas;
+  if (!_iup_segment (contour_points, x_deltas, y_deltas,
+                     p1, p2, p1_dx, p2_dx, p1_dy, p2_dy,
+                     interp_x_deltas, interp_y_deltas))
+    return false;
+
+  unsigned num = contour_points.length;
+
+  for (unsigned i = 0; i < num; i++)
+  {
+    float dx = x_deltas.arrayZ[i] - interp_x_deltas.arrayZ[i];
+    float dy = y_deltas.arrayZ[i] - interp_y_deltas.arrayZ[i];
+  
+    if (sqrtf ((float)dx * dx + (float)dy * dy) > tolerance)
+      return false;
+  }
+  return true;
+}
+
+static bool _iup_contour_optimize_dp (const contour_point_vector_t& contour_points,
+                                      const hb_vector_t<int>& x_deltas,
+                                      const hb_vector_t<int>& y_deltas,
+                                      const hb_set_t& forced_set,
+                                      float tolerance,
+                                      unsigned lookback,
+                                      hb_vector_t<unsigned>& costs, /* OUT */
+                                      hb_vector_t<int>& chain /* OUT */)
+{
+  unsigned n = contour_points.length;
+  if (unlikely (!costs.resize (n, false) ||
+                !chain.resize (n, false)))
+    return false;
+
+  lookback = hb_min (lookback, MAX_LOOKBACK);
+
+  for (unsigned i = 0; i < n; i++)
+  {
+    unsigned best_cost = (i == 0 ? 1 : costs.arrayZ[i-1] + 1);
+    
+    costs.arrayZ[i] = best_cost;
+    chain.arrayZ[i] = (i == 0 ? -1 : i - 1);
+
+    if (i > 0 && forced_set.has (i - 1))
+      continue;
+
+    int lookback_index = hb_max ((int) i - (int) lookback + 1, -1);
+    for (int j = i - 2; j >= lookback_index; j--)
+    {
+      unsigned cost = j == -1 ? 1 : costs.arrayZ[j] + 1;
+      /* num points between i and j */
+      unsigned num_points = i - j - 1;
+      unsigned p1 = (j == -1 ? n - 1 : j);
+      if (cost < best_cost &&
+          _can_iup_in_between (contour_points.as_array ().sub_array (j + 1, num_points),
+                               x_deltas.as_array ().sub_array (j + 1, num_points),
+                               y_deltas.as_array ().sub_array (j + 1, num_points),
+                               contour_points.arrayZ[p1], contour_points.arrayZ[i],
+                               x_deltas.arrayZ[p1], x_deltas.arrayZ[i],
+                               y_deltas.arrayZ[p1], y_deltas.arrayZ[i],
+                               tolerance))
+      {
+        best_cost = cost;
+        costs.arrayZ[i] = best_cost;
+        chain.arrayZ[i] = j;
+      }
+
+      if (j > 0 && forced_set.has (j))
+        break;
+    }
+  }
+  return true;
+}
+
+static bool _iup_contour_optimize (const hb_array_t<const contour_point_t> contour_points,
+                                   const hb_array_t<const int> x_deltas,
+                                   const hb_array_t<const int> y_deltas,
+                                   hb_array_t<bool> opt_indices, /* OUT */
+                                   float tolerance = 0.f)
+{
+  unsigned n = contour_points.length;
+  if (opt_indices.length != n ||
+      x_deltas.length != n ||
+      y_deltas.length != n)
+    return false;
+
+  bool all_within_tolerance = true;
+  for (unsigned i = 0; i < n; i++)
+  {
+    int dx = x_deltas.arrayZ[i];
+    int dy = y_deltas.arrayZ[i];
+    if (sqrtf ((float)dx * dx + (float)dy * dy) > tolerance)
+    {
+      all_within_tolerance = false;
+      break;
+    }
+  }
+
+  /* If all are within tolerance distance, do nothing, opt_indices is
+   * initilized to false */
+  if (all_within_tolerance)
+    return true;
+
+  /* If there's exactly one point, return it */
+  if (n == 1)
+  {
+    opt_indices.arrayZ[0] = true;
+    return true;
+  }
+
+  /* If all deltas are exactly the same, return just one (the first one) */
+  bool all_deltas_are_equal = true;
+  for (unsigned i = 1; i < n; i++)
+    if (x_deltas.arrayZ[i] != x_deltas.arrayZ[0] ||
+        y_deltas.arrayZ[i] != y_deltas.arrayZ[0])
+    {
+      all_deltas_are_equal = false;
+      break;
+    }
+
+  if (all_deltas_are_equal)
+  {
+    opt_indices.arrayZ[0] = true;
+    return true;
+  }
+
+  /* else, solve the general problem using Dynamic Programming */
+  hb_set_t forced_set;
+  _iup_contour_bound_forced_set (contour_points, x_deltas, y_deltas, forced_set, tolerance);
+
+  if (!forced_set.is_empty ())
+  {
+    int k = n - 1 - forced_set.get_max ();
+    if (k < 0)
+      return false;
+
+    hb_vector_t<int> rot_x_deltas, rot_y_deltas;
+    contour_point_vector_t rot_points;
+    hb_set_t rot_forced_set;
+    if (!rotate_array (contour_points, k, rot_points) ||
+        !rotate_array (x_deltas, k, rot_x_deltas) ||
+        !rotate_array (y_deltas, k, rot_y_deltas) ||
+        !rotate_set (forced_set, k, n, rot_forced_set))
+      return false;
+
+    hb_vector_t<unsigned> costs;
+    hb_vector_t<int> chain;
+
+    if (!_iup_contour_optimize_dp (rot_points, rot_x_deltas, rot_y_deltas,
+                                   rot_forced_set, tolerance, n,
+                                   costs, chain))
+      return false;
+
+    hb_set_t solution;
+    int index = n - 1;
+    while (index != -1)
+    {
+      solution.add (index);
+      index = chain.arrayZ[index];
+    }
+
+    if (solution.is_empty () ||
+        forced_set.get_population () > solution.get_population ())
+      return false;
+
+    for (unsigned i : solution)
+      opt_indices.arrayZ[i] = true;
+
+    hb_vector_t<bool> rot_indices;
+    const hb_array_t<const bool> opt_indices_array (opt_indices.arrayZ, opt_indices.length);
+    rotate_array (opt_indices_array, -k, rot_indices);
+
+    for (unsigned i = 0; i < n; i++)
+      opt_indices.arrayZ[i] = rot_indices.arrayZ[i];
+  }
+  else
+  {
+    hb_vector_t<int> repeat_x_deltas, repeat_y_deltas;
+    contour_point_vector_t repeat_points;
+
+    if (unlikely (!repeat_x_deltas.resize (n * 2, false) ||
+                  !repeat_y_deltas.resize (n * 2, false) ||
+                  !repeat_points.resize (n * 2, false)))
+      return false;
+
+    unsigned contour_point_size = hb_static_size (contour_point_t);
+    for (unsigned i = 0; i < n; i++)
+    {
+      hb_memcpy ((void *) repeat_x_deltas.arrayZ, (const void *) x_deltas.arrayZ, n * sizeof (float));
+      hb_memcpy ((void *) (repeat_x_deltas.arrayZ + n), (const void *) x_deltas.arrayZ, n * sizeof (float));
+
+      hb_memcpy ((void *) repeat_y_deltas.arrayZ, (const void *) y_deltas.arrayZ, n * sizeof (float));
+      hb_memcpy ((void *) (repeat_y_deltas.arrayZ + n), (const void *) y_deltas.arrayZ, n * sizeof (float));
+
+      hb_memcpy ((void *) repeat_points.arrayZ, (const void *) contour_points.arrayZ, n * contour_point_size);
+      hb_memcpy ((void *) (repeat_points.arrayZ + n), (const void *) contour_points.arrayZ, n * contour_point_size);
+    }
+
+    hb_vector_t<unsigned> costs;
+    hb_vector_t<int> chain;
+    if (!_iup_contour_optimize_dp (repeat_points, repeat_x_deltas, repeat_y_deltas,
+                                   forced_set, tolerance, n,
+                                   costs, chain))
+      return false;
+
+    unsigned best_cost = n + 1;
+    int len = costs.length;
+    hb_set_t best_sol;
+    for (int start = n - 1; start < len; start++)
+    {
+      hb_set_t solution;
+      int i = start;
+      int lookback = start - (int) n;
+      while (i > lookback)
+      {
+        solution.add (i % n);
+        i = chain.arrayZ[i];
+      }
+      if (i == lookback)
+      {
+        unsigned cost_i = i < 0 ? 0 : costs.arrayZ[i];
+        unsigned cost = costs.arrayZ[start] - cost_i;
+        if (cost <= best_cost)
+        {
+          best_sol.set (solution);
+          best_cost = cost;
+        }
+      }
+    }
+
+    for (unsigned i = 0; i < n; i++)
+      if (best_sol.has (i))
+        opt_indices.arrayZ[i] = true;
+  }
+  return true;
+}
+
+bool iup_delta_optimize (const contour_point_vector_t& contour_points,
+                         const hb_vector_t<int>& x_deltas,
+                         const hb_vector_t<int>& y_deltas,
+                         hb_vector_t<bool>& opt_indices, /* OUT */
+                         float tolerance)
+{
+  if (!opt_indices.resize (contour_points.length))
+      return false;
+
+  hb_vector_t<unsigned> end_points;
+  unsigned count = contour_points.length;
+  if (unlikely (!end_points.alloc (count)))
+    return false;
+
+  for (unsigned i = 0; i < count - 4; i++)
+    if (contour_points.arrayZ[i].is_end_point)
+      end_points.push (i);
+
+  /* phantom points */
+  for (unsigned i = count - 4; i < count; i++)
+    end_points.push (i);
+
+  if (end_points.in_error ()) return false;
+
+  unsigned start = 0;
+  for (unsigned end : end_points)
+  {
+    unsigned len = end - start + 1;
+    if (!_iup_contour_optimize (contour_points.as_array ().sub_array (start, len),
+                                x_deltas.as_array ().sub_array (start, len),
+                                y_deltas.as_array ().sub_array (start, len),
+                                opt_indices.as_array ().sub_array (start, len),
+                                tolerance))
+      return false;
+    start = end + 1;
+  }
+  return true;
+}
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-iup.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-iup.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-iup.hh	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-iup.hh	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,37 @@
+/*
+ * Copyright © 2024  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_SUBSET_INSTANCER_IUP_HH
+#define HB_SUBSET_INSTANCER_IUP_HH
+
+#include "hb-subset-plan.hh"
+/* given contour points and deltas, optimize a set of referenced points within error
+ * tolerance. Returns optimized referenced point indices */
+HB_INTERNAL bool iup_delta_optimize (const contour_point_vector_t& contour_points,
+                                     const hb_vector_t<int>& x_deltas,
+                                     const hb_vector_t<int>& y_deltas,
+                                     hb_vector_t<bool>& opt_indices, /* OUT */
+                                     float tolerance = 0.f);
+
+#endif /* HB_SUBSET_INSTANCER_IUP_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-solver.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-solver.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-solver.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-solver.cc	2024-11-20 13:56:33.000000000 +0000
@@ -22,7 +22,7 @@
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
-#include "hb.hh"
+#include "hb-subset-instancer-solver.hh"
 
 /* This file is a straight port of the following:
  *
@@ -35,26 +35,6 @@
 constexpr static float EPSILON = 1.f / (1 << 14);
 constexpr static float MAX_F2DOT14 = float (0x7FFF) / (1 << 14);
 
-struct Triple {
-
-  Triple () :
-    minimum (0.f), middle (0.f), maximum (0.f) {}
-
-  Triple (float minimum_, float middle_, float maximum_) :
-    minimum (minimum_), middle (middle_), maximum (maximum_) {}
-
-  bool operator == (const Triple &o) const
-  {
-    return minimum == o.minimum &&
-	   middle  == o.middle  &&
-	   maximum == o.maximum;
-  }
-
-  float minimum;
-  float middle;
-  float maximum;
-};
-
 static inline Triple _reverse_negate(const Triple &v)
 { return {-v.maximum, -v.middle, -v.minimum}; }
 
@@ -82,10 +62,6 @@ static inline float supportScalar (float
     return  (end - coord) / (end - peak);
 }
 
-
-using result_item_t = hb_pair_t<float, Triple>;
-using result_t = hb_vector_t<result_item_t>;
-
 static inline result_t
 _solve (Triple tent, Triple axisLimit, bool negative = false)
 {
@@ -192,12 +168,14 @@ _solve (Triple tent, Triple axisLimit, b
    *                           |
    *                      crossing
    */
-  if (gain > outGain)
+  if (gain >= outGain)
   {
+    // Note that this is the branch taken if both gain and outGain are 0.
+
     // Crossing point on the axis.
-    float crossing = peak + ((1 - gain) * (upper - peak) / (1 - outGain));
+    float crossing = peak + (1 - gain) * (upper - peak);
 
-    Triple loc{peak, peak, crossing};
+    Triple loc{hb_max (lower, axisDef), peak, crossing};
     float scalar = 1.f;
 
     // The part before the crossing point.
@@ -213,7 +191,7 @@ _solve (Triple tent, Triple axisLimit, b
     if (upper >= axisMax)
     {
       Triple loc {crossing, axisMax, axisMax};
-      float scalar = supportScalar (axisMax, tent);
+      float scalar = outGain;
 
       out.push (hb_pair (scalar - gain, loc));
     }
@@ -247,89 +225,85 @@ _solve (Triple tent, Triple axisLimit, b
 
       // Eternity justify.
       Triple loc2 {upper, axisMax, axisMax};
-      float scalar2 = 1.f; // supportScalar({"tag": axisMax}, {"tag": tent})
+      float scalar2 = 0.f;
 
       out.push (hb_pair (scalar1 - gain, loc1));
       out.push (hb_pair (scalar2 - gain, loc2));
     }
   }
 
-  /* Case 3: Outermost limit still fits within F2Dot14 bounds;
-   * we keep deltas as is and only scale the axes bounds. Deltas beyond -1.0
-   * or +1.0 will never be applied as implementations must clamp to that range.
-   *
-   * A second tent is needed for cases when gain is positive, though we add it
-   * unconditionally and it will be dropped because scalar ends up 0.
-   *
-   * TODO: See if we can just move upper closer to adjust the slope, instead of
-   * second tent.
-   *
-   *            |           peak |
-   *  1.........|............o...|..................
-   *            |           /x\  |
-   *            |          /xxx\ |
-   *            |         /xxxxx\|
-   *            |        /xxxxxxx+
-   *            |       /xxxxxxxx|\
-   *  0---|-----|------oxxxxxxxxx|xo---------------1
-   *    axisMin |  lower         | upper
-   *            |                |
-   *          axisDef          axisMax
-   */
-  else if (axisDef + (axisMax - axisDef) * 2 >= upper)
+  else
   {
-    if (!negative && axisDef + (axisMax - axisDef) * MAX_F2DOT14 < upper)
-    {
-      // we clamp +2.0 to the max F2Dot14 (~1.99994) for convenience
-      upper = axisDef + (axisMax - axisDef) * MAX_F2DOT14;
-      assert (peak < upper);
-    }
-
     // Special-case if peak is at axisMax.
     if (axisMax == peak)
 	upper = peak;
 
-    Triple loc1 {hb_max (axisDef, lower), peak, upper};
-    float scalar1 = 1.f;
+    /* Case 3:
+     * we keep deltas as is and only scale the axis upper to achieve
+     * the desired new tent if feasible.
+     *
+     *                        peak
+     *  1.....................o....................
+     *                       / \_|
+     *  ..................../....+_.........outGain
+     *                     /     | \
+     *  gain..............+......|..+_.............
+     *                   /|      |  | \
+     *  0---|-----------o |      |  |  o----------1
+     *    axisMin    lower|      |  |   upper
+     *                    |      |  newUpper
+     *              axisDef      axisMax
+     */
+    float newUpper = peak + (1 - gain) * (upper - peak);
+    assert (axisMax <= newUpper);  // Because outGain > gain
+    /* Disabled because ots doesn't like us:
+     * https://github.com/fonttools/fonttools/issues/3350 */
+    
+    if (false && (newUpper <= axisDef + (axisMax - axisDef) * 2))
+    {
+      upper = newUpper;
+      if (!negative && axisDef + (axisMax - axisDef) * MAX_F2DOT14 < upper)
+      {
+	// we clamp +2.0 to the max F2Dot14 (~1.99994) for convenience
+	upper = axisDef + (axisMax - axisDef) * MAX_F2DOT14;
+	assert (peak < upper);
+      }
 
-    Triple loc2 {peak, upper, upper};
-    float scalar2 = 0.f;
+      Triple loc {hb_max (axisDef, lower), peak, upper};
+      float scalar = 1.f;
 
-    // Don't add a dirac delta!
-    if (axisDef < upper)
-	out.push (hb_pair (scalar1 - gain, loc1));
-    if (peak < upper)
-	out.push (hb_pair (scalar2 - gain, loc2));
-  }
+      out.push (hb_pair (scalar - gain, loc));
+    }
 
-  /* Case 4: New limit doesn't fit; we need to chop into two tents,
-   * because the shape of a triangle with part of one side cut off
-   * cannot be represented as a triangle itself.
-   *
-   *            |   peak |
-   *  1.........|......o.|...................
-   *            |     /x\|
-   *            |    |xxy|\_
-   *            |   /xxxy|  \_
-   *            |  |xxxxy|    \_
-   *            |  /xxxxy|      \_
-   *  0---|-----|-oxxxxxx|        o----------1
-   *    axisMin | lower  |        upper
-   *            |        |
-   *          axisDef  axisMax
-   */
-  else
-  {
-    Triple loc1 {hb_max (axisDef, lower), peak, axisMax};
-    float scalar1 = 1.f;
+    /* Case 4: New limit doesn't fit; we need to chop into two tents,
+     * because the shape of a triangle with part of one side cut off
+     * cannot be represented as a triangle itself.
+     *
+     *            |   peak |
+     *  1.........|......o.|....................
+     *  ..........|...../x\|.............outGain
+     *            |    |xxy|\_
+     *            |   /xxxy|  \_
+     *            |  |xxxxy|    \_
+     *            |  /xxxxy|      \_
+     *  0---|-----|-oxxxxxx|        o----------1
+     *    axisMin | lower  |        upper
+     *            |        |
+     *          axisDef  axisMax
+     */
+    else
+    {
+      Triple loc1 {hb_max (axisDef, lower), peak, axisMax};
+      float scalar1 = 1.f;
 
-    Triple loc2 {peak, axisMax, axisMax};
-    float scalar2 = supportScalar (axisMax, tent);
+      Triple loc2 {peak, axisMax, axisMax};
+      float scalar2 = outGain;
 
-    out.push (hb_pair (scalar1 - gain, loc1));
-    // Don't add a dirac delta!
-    if (peak < axisMax)
-      out.push (hb_pair (scalar2 - gain, loc2));
+      out.push (hb_pair (scalar1 - gain, loc1));
+      // Don't add a dirac delta!
+      if (peak < axisMax)
+	out.push (hb_pair (scalar2 - gain, loc2));
+    }
   }
 
   /* Now, the negative side
@@ -392,51 +366,47 @@ _solve (Triple tent, Triple axisLimit, b
   return out;
 }
 
-/* Normalizes value based on a min/default/max triple. */
-static inline float normalizeValue (float v, const Triple &triple, bool extrapolate = false)
+static inline TripleDistances _reverse_triple_distances (const TripleDistances &v)
+{ return TripleDistances (v.positive, v.negative); }
+
+float renormalizeValue (float v, const Triple &triple,
+                        const TripleDistances &triple_distances, bool extrapolate)
 {
-  /*
-  >>> normalizeValue(400, (100, 400, 900))
-  0.0
-  >>> normalizeValue(100, (100, 400, 900))
-  -1.0
-  >>> normalizeValue(650, (100, 400, 900))
-  0.5
-  */
   float lower = triple.minimum, def = triple.middle, upper = triple.maximum;
   assert (lower <= def && def <= upper);
 
   if (!extrapolate)
       v = hb_max (hb_min (v, upper), lower);
 
-  if ((v == def) || (lower == upper))
+  if (v == def)
     return 0.f;
 
-  if ((v < def && lower != def) || (v > def && upper == def))
+  if (def < 0.f)
+    return -renormalizeValue (-v, _reverse_negate (triple),
+                              _reverse_triple_distances (triple_distances), extrapolate);
+
+  /* default >= 0 and v != default */
+  if (v > def)
+    return (v - def) / (upper - def);
+
+  /* v < def */
+  if (lower >= 0.f)
     return (v - def) / (def - lower);
+
+  /* lower < 0 and v < default */
+  float total_distance = triple_distances.negative * (-lower) + triple_distances.positive * def;
+
+  float v_distance;
+  if (v >= 0.f)
+    v_distance = (def - v) * triple_distances.positive;
   else
-  {
-    assert ((v > def && upper != def) ||
-	    (v < def && lower == def));
-    return (v - def) / (upper - def);
-  }
-}
+    v_distance = (-v) * triple_distances.negative + triple_distances.positive * def;
 
-/* Given a tuple (lower,peak,upper) "tent" and new axis limits
- * (axisMin,axisDefault,axisMax), solves how to represent the tent
- * under the new axis configuration.  All values are in normalized
- * -1,0,+1 coordinate system. Tent values can be outside this range.
- *
- * Return value: a list of tuples. Each tuple is of the form
- * (scalar,tent), where scalar is a multipler to multiply any
- * delta-sets by, and tent is a new tent for that output delta-set.
- * If tent value is Triple{}, that is a special deltaset that should
- * be always-enabled (called "gain").
- */
-HB_INTERNAL result_t rebase_tent (Triple tent, Triple axisLimit);
+  return (-v_distance) /total_distance;
+}
 
 result_t
-rebase_tent (Triple tent, Triple axisLimit)
+rebase_tent (Triple tent, Triple axisLimit, TripleDistances axis_triple_distances)
 {
   assert (-1.f <= axisLimit.minimum && axisLimit.minimum <= axisLimit.middle && axisLimit.middle <= axisLimit.maximum && axisLimit.maximum <= +1.f);
   assert (-2.f <= tent.minimum && tent.minimum <= tent.middle && tent.middle <= tent.maximum && tent.maximum <= +2.f);
@@ -444,7 +414,7 @@ rebase_tent (Triple tent, Triple axisLim
 
   result_t sols = _solve (tent, axisLimit);
 
-  auto n = [&axisLimit] (float v) { return normalizeValue (v, axisLimit, true); };
+  auto n = [&axisLimit, &axis_triple_distances] (float v) { return renormalizeValue (v, axisLimit, axis_triple_distances); };
 
   result_t out;
   for (auto &p : sols)
@@ -460,5 +430,5 @@ rebase_tent (Triple tent, Triple axisLim
 		       Triple{n (t.minimum), n (t.middle), n (t.maximum)}));
   }
 
-  return sols;
+  return out;
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-solver.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-solver.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-solver.hh	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-solver.hh	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,112 @@
+/*
+ * Copyright © 2023  Behdad Esfahbod
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_SUBSET_INSTANCER_SOLVER_HH
+#define HB_SUBSET_INSTANCER_SOLVER_HH
+
+#include "hb.hh"
+
+/* pre-normalized distances */
+struct TripleDistances
+{
+  TripleDistances (): negative (1.f), positive (1.f) {}
+  TripleDistances (float neg_, float pos_): negative (neg_), positive (pos_) {}
+  TripleDistances (float min, float default_, float max)
+  {
+    negative = default_ - min;
+    positive = max - default_;
+  }
+
+  float negative;
+  float positive;
+};
+
+struct Triple {
+
+  Triple () :
+    minimum (0.f), middle (0.f), maximum (0.f) {}
+
+  Triple (float minimum_, float middle_, float maximum_) :
+    minimum (minimum_), middle (middle_), maximum (maximum_) {}
+
+  bool operator == (const Triple &o) const
+  {
+    return minimum == o.minimum &&
+	   middle  == o.middle  &&
+	   maximum == o.maximum;
+  }
+
+  bool operator != (const Triple o) const
+  { return !(*this == o); }
+
+  bool is_point () const
+  { return minimum == middle && middle == maximum; }
+
+  bool contains (float point) const
+  { return minimum <= point && point <= maximum; }
+
+  /* from hb_array_t hash ()*/
+  uint32_t hash () const
+  {
+    uint32_t current = /*cbf29ce4*/0x84222325;
+    current = current ^ hb_hash (minimum);
+    current = current * 16777619;
+
+    current = current ^ hb_hash (middle);
+    current = current * 16777619;
+
+    current = current ^ hb_hash (maximum);
+    current = current * 16777619;
+    return current;
+  }
+
+
+  float minimum;
+  float middle;
+  float maximum;
+};
+
+using result_item_t = hb_pair_t<float, Triple>;
+using result_t = hb_vector_t<result_item_t>;
+
+/* renormalize a normalized value v to the range of an axis,
+ * considering the prenormalized distances as well as the new axis limits.
+ * Ported from fonttools */
+HB_INTERNAL float renormalizeValue (float v, const Triple &triple,
+                                    const TripleDistances &triple_distances,
+                                    bool extrapolate = true);
+/* Given a tuple (lower,peak,upper) "tent" and new axis limits
+ * (axisMin,axisDefault,axisMax), solves how to represent the tent
+ * under the new axis configuration.  All values are in normalized
+ * -1,0,+1 coordinate system. Tent values can be outside this range.
+ *
+ * Return value: a list of tuples. Each tuple is of the form
+ * (scalar,tent), where scalar is a multipler to multiply any
+ * delta-sets by, and tent is a new tent for that output delta-set.
+ * If tent value is Triple{}, that is a special deltaset that should
+ * be always-enabled (called "gain").
+ */
+HB_INTERNAL result_t rebase_tent (Triple tent, Triple axisLimit, TripleDistances axis_triple_distances);
+
+#endif /* HB_SUBSET_INSTANCER_SOLVER_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-plan-member-list.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-plan-member-list.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-plan-member-list.hh	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-plan-member-list.hh	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,158 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ * Copyright © 2023  Behdad Esfahbod
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Roderick Sheeter
+ */
+
+#ifndef HB_SUBSET_PLAN_MEMBER_LIST_HH
+#define HB_SUBSET_PLAN_MEMBER_LIST_HH
+#endif /* HB_SUBSET_PLAN_MEMBER_LIST_HH */ /* Dummy header guards */
+
+#define E(x, y) x, y
+
+// For each cp that we'd like to retain maps to the corresponding gid.
+HB_SUBSET_PLAN_MEMBER (hb_set_t, unicodes)
+HB_SUBSET_PLAN_MEMBER (hb_sorted_vector_t<hb_codepoint_pair_t>, unicode_to_new_gid_list)
+
+HB_SUBSET_PLAN_MEMBER (hb_sorted_vector_t<hb_codepoint_pair_t>, new_to_old_gid_list)
+
+// name_ids we would like to retain
+HB_SUBSET_PLAN_MEMBER (hb_set_t, name_ids)
+
+// name_languages we would like to retain
+HB_SUBSET_PLAN_MEMBER (hb_set_t, name_languages)
+
+//layout features which will be preserved
+HB_SUBSET_PLAN_MEMBER (hb_set_t, layout_features)
+
+// layout scripts which will be preserved.
+HB_SUBSET_PLAN_MEMBER (hb_set_t, layout_scripts)
+
+//glyph ids requested to retain
+HB_SUBSET_PLAN_MEMBER (hb_set_t, glyphs_requested)
+
+// Tables which should not be processed, just pass them through.
+HB_SUBSET_PLAN_MEMBER (hb_set_t, no_subset_tables)
+
+// Tables which should be dropped.
+HB_SUBSET_PLAN_MEMBER (hb_set_t, drop_tables)
+
+// Old -> New glyph id mapping
+HB_SUBSET_PLAN_MEMBER (hb_map_t, glyph_map_gsub)
+
+HB_SUBSET_PLAN_MEMBER (hb_set_t, _glyphset)
+HB_SUBSET_PLAN_MEMBER (hb_set_t, _glyphset_gsub)
+HB_SUBSET_PLAN_MEMBER (hb_set_t, _glyphset_mathed)
+HB_SUBSET_PLAN_MEMBER (hb_set_t, _glyphset_colred)
+
+//active lookups we'd like to retain
+HB_SUBSET_PLAN_MEMBER (hb_map_t, gsub_lookups)
+HB_SUBSET_PLAN_MEMBER (hb_map_t, gpos_lookups)
+
+//use_mark_sets mapping: old->new
+HB_SUBSET_PLAN_MEMBER (hb_map_t, used_mark_sets_map)
+
+//active langsys we'd like to retain
+HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<unsigned, hb::unique_ptr<hb_set_t>>), gsub_langsys)
+HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<unsigned, hb::unique_ptr<hb_set_t>>), gpos_langsys)
+
+//active features after removing redundant langsys and prune_features
+HB_SUBSET_PLAN_MEMBER (hb_map_t, gsub_features)
+HB_SUBSET_PLAN_MEMBER (hb_map_t, gpos_features)
+
+//active feature variation records/condition index with variations
+HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<unsigned, hb::shared_ptr<hb_set_t>>), gsub_feature_record_cond_idx_map)
+HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<unsigned, hb::shared_ptr<hb_set_t>>), gpos_feature_record_cond_idx_map)
+
+//feature index-> address of substituation feature table mapping with
+//variations
+HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<unsigned, const OT::Feature*>), gsub_feature_substitutes_map)
+HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<unsigned, const OT::Feature*>), gpos_feature_substitutes_map)
+
+// old feature_indexes set, used to reinstate the old features
+HB_SUBSET_PLAN_MEMBER (hb_set_t, gsub_old_features)
+HB_SUBSET_PLAN_MEMBER (hb_set_t, gpos_old_features)
+
+//feature_index->pair of (address of old feature, feature tag), used for inserting a catch all record
+//if necessary
+HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<unsigned, hb_pair_t E(<const void*, const void*>)>), gsub_old_feature_idx_tag_map)
+HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<unsigned, hb_pair_t E(<const void*, const void*>)>), gpos_old_feature_idx_tag_map)
+
+//active layers/palettes we'd like to retain
+HB_SUBSET_PLAN_MEMBER (hb_map_t, colrv1_layers)
+HB_SUBSET_PLAN_MEMBER (hb_map_t, colr_palettes)
+
+//Old layout item variation index -> (New varidx, delta) mapping
+HB_SUBSET_PLAN_MEMBER (mutable hb_hashmap_t E(<unsigned, hb_pair_t E(<unsigned, int>)>), layout_variation_idx_delta_map)
+
+//gdef varstore retained varidx mapping
+HB_SUBSET_PLAN_MEMBER (hb_vector_t<hb_inc_bimap_t>, gdef_varstore_inner_maps)
+
+HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<hb_tag_t, hb::unique_ptr<hb_blob_t>>), sanitized_table_cache)
+
+//normalized axes range map
+HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<hb_tag_t, Triple>), axes_location)
+HB_SUBSET_PLAN_MEMBER (hb_vector_t<int>, normalized_coords)
+
+//user specified axes range map
+HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<hb_tag_t, Triple>), user_axes_location)
+//axis->TripleDistances map (distances in the pre-normalized space)
+HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<hb_tag_t, TripleDistances>), axes_triple_distances)
+
+//retained old axis index -> new axis index mapping in fvar axis array
+HB_SUBSET_PLAN_MEMBER (hb_map_t, axes_index_map)
+
+//axis_index->axis_tag mapping in fvar axis array
+HB_SUBSET_PLAN_MEMBER (hb_map_t, axes_old_index_tag_map)
+//vector of retained axis tags in the order of axes given in the 'fvar' table
+HB_SUBSET_PLAN_MEMBER (hb_vector_t<hb_tag_t>, axis_tags)
+
+//hmtx metrics map: new gid->(advance, lsb)
+HB_SUBSET_PLAN_MEMBER (mutable hb_hashmap_t E(<hb_codepoint_t, hb_pair_t E(<unsigned, int>)>), hmtx_map)
+//vmtx metrics map: new gid->(advance, lsb)
+HB_SUBSET_PLAN_MEMBER (mutable hb_hashmap_t E(<hb_codepoint_t, hb_pair_t E(<unsigned, int>)>), vmtx_map)
+//boundsWidth map: new gid->boundsWidth, boundWidth=xMax - xMin
+HB_SUBSET_PLAN_MEMBER (mutable hb_vector_t<unsigned>, bounds_width_vec)
+//boundsHeight map: new gid->boundsHeight, boundsHeight=yMax - yMin
+HB_SUBSET_PLAN_MEMBER (mutable hb_vector_t<unsigned>, bounds_height_vec)
+
+//map: new_gid -> contour points vector
+HB_SUBSET_PLAN_MEMBER (mutable hb_hashmap_t E(<hb_codepoint_t, contour_point_vector_t>), new_gid_contour_points_map)
+
+//new gids set for composite glyphs
+HB_SUBSET_PLAN_MEMBER (hb_set_t, composite_new_gids)
+
+//Old BASE item variation index -> (New varidx, 0) mapping
+HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<unsigned, hb_pair_t E(<unsigned, int>)>), base_variation_idx_map)
+
+//BASE table varstore retained varidx mapping
+HB_SUBSET_PLAN_MEMBER (hb_vector_t<hb_inc_bimap_t>, base_varstore_inner_maps)
+
+#ifdef HB_EXPERIMENTAL_API
+// name table overrides map: hb_ot_name_record_ids_t-> name string new value or
+// None to indicate should remove
+HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(<hb_ot_name_record_ids_t, hb_bytes_t>), name_table_overrides)
+#endif
+
+#undef E
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-plan.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-plan.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-plan.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-plan.cc	2024-11-20 13:56:33.000000000 +0000
@@ -32,6 +32,7 @@
 
 #include "hb-ot-cmap-table.hh"
 #include "hb-ot-glyf-table.hh"
+#include "hb-ot-layout-base-table.hh"
 #include "hb-ot-layout-gdef-table.hh"
 #include "hb-ot-layout-gpos-table.hh"
 #include "hb-ot-layout-gsub-table.hh"
@@ -48,10 +49,24 @@
 using OT::Layout::GSUB;
 using OT::Layout::GPOS;
 
+
+hb_subset_accelerator_t::~hb_subset_accelerator_t ()
+{
+  if (cmap_cache && destroy_cmap_cache)
+    destroy_cmap_cache ((void*) cmap_cache);
+
+#ifndef HB_NO_SUBSET_CFF
+  cff1_accel.fini ();
+  cff2_accel.fini ();
+#endif
+  hb_face_destroy (source);
+}
+
+
 typedef hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> script_langsys_map;
 #ifndef HB_NO_SUBSET_CFF
 static inline bool
-_add_cff_seac_components (const OT::cff1::accelerator_t &cff,
+_add_cff_seac_components (const OT::cff1::accelerator_subset_t &cff,
 			  hb_codepoint_t gid,
 			  hb_set_t *gids_to_retain)
 {
@@ -135,7 +150,9 @@ static void _collect_layout_indices (hb_
                                      hb_set_t		  *lookup_indices, /* OUT */
                                      hb_set_t		  *feature_indices, /* OUT */
                                      hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *feature_record_cond_idx_map, /* OUT */
-                                     hb_hashmap_t<unsigned, const OT::Feature*> *feature_substitutes_map /* OUT */)
+                                     hb_hashmap_t<unsigned, const OT::Feature*> *feature_substitutes_map, /* OUT */
+                                     hb_set_t& catch_all_record_feature_idxes, /* OUT */
+                                     hb_hashmap_t<unsigned, hb_pair_t<const void*, const void*>>& catch_all_record_idx_feature_map /* OUT */)
 {
   unsigned num_features = table.get_feature_count ();
   hb_vector_t<hb_tag_t> features;
@@ -171,8 +188,11 @@ static void _collect_layout_indices (hb_
       &plan->axes_location,
       feature_record_cond_idx_map,
       feature_substitutes_map,
+      catch_all_record_feature_idxes,
       feature_indices,
-      true,
+      false,
+      false,
+      false,
       0,
       &conditionset_map
     };
@@ -190,17 +210,25 @@ static void _collect_layout_indices (hb_
     f->add_lookup_indexes_to (lookup_indices);
   }
 
+#ifndef HB_NO_VAR
+  if (catch_all_record_feature_idxes)
+  {
+    for (unsigned feature_index : catch_all_record_feature_idxes)
+    {
+      const OT::Feature& f = table.get_feature (feature_index);
+      f.add_lookup_indexes_to (lookup_indices);
+      const void *tag = reinterpret_cast<const void*> (&(table.get_feature_list ().get_tag (feature_index)));
+      catch_all_record_idx_feature_map.set (feature_index, hb_pair (&f, tag));
+    }
+  }
+
   // If all axes are pinned then all feature variations will be dropped so there's no need
   // to collect lookups from them.
   if (!plan->all_axes_pinned)
-  {
-    // TODO(qxliu76): this collection doesn't work correctly for feature variations that are dropped
-    //                but not applied. The collection will collect and retain the lookup indices
-    //                associated with those dropped but not activated rules. Since partial instancing
-    //                isn't yet supported this isn't an issue yet but will need to be fixed for
-    //                partial instancing.
-    table.feature_variation_collect_lookups (feature_indices, feature_substitutes_map, lookup_indices);
-  }
+    table.feature_variation_collect_lookups (feature_indices,
+                                             plan->user_axes_location.is_empty () ? nullptr: feature_record_cond_idx_map,
+                                             lookup_indices);
+#endif
 }
 
 
@@ -283,7 +311,9 @@ _closure_glyphs_lookups_features (hb_sub
 				  hb_map_t	     *features,
 				  script_langsys_map *langsys_map,
 				  hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *feature_record_cond_idx_map,
-				  hb_hashmap_t<unsigned, const OT::Feature*> *feature_substitutes_map)
+				  hb_hashmap_t<unsigned, const OT::Feature*> *feature_substitutes_map,
+                                  hb_set_t &catch_all_record_feature_idxes,
+                                  hb_hashmap_t<unsigned, hb_pair_t<const void*, const void*>>& catch_all_record_idx_feature_map)
 {
   hb_blob_ptr_t<T> table = plan->source_table<T> ();
   hb_tag_t table_tag = table->tableTag;
@@ -293,7 +323,9 @@ _closure_glyphs_lookups_features (hb_sub
                               &lookup_indices,
                               &feature_indices,
                               feature_record_cond_idx_map,
-                              feature_substitutes_map);
+                              feature_substitutes_map,
+                              catch_all_record_feature_idxes,
+                              catch_all_record_idx_feature_map);
 
   if (table_tag == HB_OT_TAG_GSUB && !(plan->flags & HB_SUBSET_FLAGS_NO_LAYOUT_CLOSURE))
     hb_ot_layout_lookups_substitute_closure (plan->source,
@@ -329,7 +361,7 @@ _generate_varstore_inner_maps (const hb_
 {
   if (varidx_set.is_empty () || subtable_count == 0) return;
 
-  inner_maps.resize (subtable_count);
+  if (unlikely (!inner_maps.resize (subtable_count))) return;
   for (unsigned idx : varidx_set)
   {
     uint16_t major = idx >> 16;
@@ -356,7 +388,7 @@ _get_hb_font_with_variations (const hb_s
   {
     hb_variation_t var;
     var.tag = _.first;
-    var.value = _.second;
+    var.value = _.second.middle;
     vars.push (var);
   }
 
@@ -379,42 +411,20 @@ _collect_layout_variation_indices (hb_su
     return;
   }
 
-  const OT::VariationStore *var_store = nullptr;
   hb_set_t varidx_set;
-  hb_font_t *font = nullptr;
-  float *store_cache = nullptr;
-  bool collect_delta = plan->pinned_at_default ? false : true;
-  if (collect_delta)
-  {
-    if (unlikely (!plan->check_success (font = _get_hb_font_with_variations (plan)))) {
-      hb_font_destroy (font);
-      gdef.destroy ();
-      gpos.destroy ();
-      return;
-    }
-
-    if (gdef->has_var_store ())
-    {
-      var_store = &(gdef->get_var_store ());
-      store_cache = var_store->create_cache ();
-    }
-  }
-
   OT::hb_collect_variation_indices_context_t c (&varidx_set,
-                                                &plan->layout_variation_idx_delta_map,
-                                                font, var_store,
                                                 &plan->_glyphset_gsub,
-                                                &plan->gpos_lookups,
-                                                store_cache);
+                                                &plan->gpos_lookups);
   gdef->collect_variation_indices (&c);
 
   if (hb_ot_layout_has_positioning (plan->source))
     gpos->collect_variation_indices (&c);
 
-  hb_font_destroy (font);
-  var_store->destroy_cache (store_cache);
-
-  gdef->remap_layout_variation_indices (&varidx_set, &plan->layout_variation_idx_delta_map);
+  gdef->remap_layout_variation_indices (&varidx_set,
+                                        plan->normalized_coords,
+                                        !plan->pinned_at_default,
+                                        plan->all_axes_pinned,
+                                        &plan->layout_variation_idx_delta_map);
 
   unsigned subtable_count = gdef->has_var_store () ? gdef->get_var_store ().get_sub_table_count () : 0;
   _generate_varstore_inner_maps (varidx_set, subtable_count, plan->gdef_varstore_inner_maps);
@@ -422,6 +432,52 @@ _collect_layout_variation_indices (hb_su
   gdef.destroy ();
   gpos.destroy ();
 }
+
+#ifndef HB_NO_BASE
+/* used by BASE table only, delta is always set to 0 in the output map */
+static inline void
+_remap_variation_indices (const hb_set_t& indices,
+                          unsigned subtable_count,
+                          hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>>& variation_idx_delta_map /* OUT */)
+{
+  unsigned new_major = 0, new_minor = 0;
+  unsigned last_major = (indices.get_min ()) >> 16;
+  for (unsigned idx : indices)
+  {
+    uint16_t major = idx >> 16;
+    if (major >= subtable_count) break;
+    if (major != last_major)
+    {
+      new_minor = 0;
+      ++new_major;
+    }
+
+    unsigned new_idx = (new_major << 16) + new_minor;
+    variation_idx_delta_map.set (idx, hb_pair_t<unsigned, int> (new_idx, 0));
+    ++new_minor;
+    last_major = major;
+  }
+}
+
+static inline void
+_collect_base_variation_indices (hb_subset_plan_t* plan)
+{
+  hb_blob_ptr_t<OT::BASE> base = plan->source_table<OT::BASE> ();
+  if (!base->has_var_store ())
+  {
+    base.destroy ();
+    return;
+  }
+
+  hb_set_t varidx_set;
+  base->collect_variation_indices (plan, varidx_set);
+  unsigned subtable_count = base->get_var_store ().get_sub_table_count ();
+  base.destroy ();
+
+  _remap_variation_indices (varidx_set, subtable_count, plan->base_variation_idx_map);
+  _generate_varstore_inner_maps (varidx_set, subtable_count, plan->base_varstore_inner_maps);
+}
+#endif
 #endif
 
 static inline void
@@ -467,6 +523,24 @@ _math_closure (hb_subset_plan_t *plan,
   math.destroy ();
 }
 
+static inline void
+_remap_used_mark_sets (hb_subset_plan_t *plan,
+                       hb_map_t& used_mark_sets_map)
+{
+  hb_blob_ptr_t<OT::GDEF> gdef = plan->source_table<OT::GDEF> ();
+
+  if (!gdef->has_data () || !gdef->has_mark_glyph_sets ())
+  {
+    gdef.destroy ();
+    return;
+  }
+
+  hb_set_t used_mark_sets;
+  gdef->get_mark_glyph_sets ().collect_used_mark_sets (plan->_glyphset_gsub, used_mark_sets);
+  gdef.destroy ();
+
+  _remap_indexes (&used_mark_sets, &used_mark_sets_map);
+}
 
 static inline void
 _remove_invalid_gids (hb_set_t *glyphs,
@@ -549,6 +623,8 @@ _populate_unicodes_to_retain (const hb_s
 	unicodes->get_population () < cmap_unicodes->get_population () &&
 	glyphs->get_population () < cmap_unicodes->get_population ())
     {
+      plan->codepoint_to_glyph->alloc (unicodes->get_population () + glyphs->get_population ());
+
       auto &gid_to_unicodes = plan->accelerator->gid_to_unicodes;
       for (hb_codepoint_t gid : *glyphs)
       {
@@ -577,23 +653,32 @@ _populate_unicodes_to_retain (const hb_s
     }
     else
     {
-      for (hb_codepoint_t cp : *cmap_unicodes)
+      plan->codepoint_to_glyph->alloc (cmap_unicodes->get_population ());
+      hb_codepoint_t first = HB_SET_VALUE_INVALID, last = HB_SET_VALUE_INVALID;
+      for (; cmap_unicodes->next_range (&first, &last); )
       {
-	hb_codepoint_t gid = (*unicode_glyphid_map)[cp];
-	if (!unicodes->has (cp) && !glyphs->has (gid))
-	  continue;
+        for (unsigned cp = first; cp <= last; cp++)
+	{
+	  hb_codepoint_t gid = (*unicode_glyphid_map)[cp];
+	  if (!unicodes->has (cp) && !glyphs->has (gid))
+	    continue;
 
-	plan->codepoint_to_glyph->set (cp, gid);
-	plan->unicode_to_new_gid_list.push (hb_pair (cp, gid));
+	  plan->codepoint_to_glyph->set (cp, gid);
+	  plan->unicode_to_new_gid_list.push (hb_pair (cp, gid));
+	}
       }
     }
 
     /* Add gids which where requested, but not mapped in cmap */
-    for (hb_codepoint_t gid : *glyphs)
+    unsigned num_glyphs = plan->source->get_num_glyphs ();
+    hb_codepoint_t first = HB_SET_VALUE_INVALID, last = HB_SET_VALUE_INVALID;
+    for (; glyphs->next_range (&first, &last); )
     {
-      if (gid >= plan->source->get_num_glyphs ())
+      if (first >= num_glyphs)
 	break;
-      plan->_glyphset_gsub.add (gid);
+      if (last >= num_glyphs)
+        last = num_glyphs - 1;
+      plan->_glyphset_gsub.add_range (first, last);
     }
   }
 
@@ -616,14 +701,17 @@ _glyf_add_gid_and_children (const OT::gl
 			    int operation_count,
 			    unsigned depth = 0)
 {
-  if (unlikely (depth++ > HB_MAX_NESTING_LEVEL)) return operation_count;
-  if (unlikely (--operation_count < 0)) return operation_count;
   /* Check if is already visited */
   if (gids_to_retain->has (gid)) return operation_count;
 
   gids_to_retain->add (gid);
 
-  for (auto &item : glyf.glyph_for_gid (gid).get_composite_iterator ())
+  if (unlikely (depth++ > HB_MAX_NESTING_LEVEL)) return operation_count;
+  if (unlikely (--operation_count < 0)) return operation_count;
+
+  auto glyph = glyf.glyph_for_gid (gid);
+
+  for (auto &item : glyph.get_composite_iterator ())
     operation_count =
       _glyf_add_gid_and_children (glyf,
 				  item.get_gid (),
@@ -632,7 +720,7 @@ _glyf_add_gid_and_children (const OT::gl
 				  depth);
 
 #ifndef HB_NO_VAR_COMPOSITES
-  for (auto &item : glyf.glyph_for_gid (gid).get_var_composite_iterator ())
+  for (auto &item : glyph.get_var_composite_iterator ())
    {
     operation_count =
       _glyf_add_gid_and_children (glyf,
@@ -655,7 +743,7 @@ _nameid_closure (hb_subset_plan_t* plan,
 #endif
 #ifndef HB_NO_VAR
   if (!plan->all_axes_pinned)
-    plan->source->table.fvar->collect_name_ids (&plan->user_axes_location, &plan->name_ids);
+    plan->source->table.fvar->collect_name_ids (&plan->user_axes_location, &plan->axes_old_index_tag_map, &plan->name_ids);
 #endif
 #ifndef HB_NO_COLOR
   if (!drop_tables->has (HB_OT_TAG_CPAL))
@@ -684,7 +772,11 @@ _populate_gids_to_retain (hb_subset_plan
 {
   OT::glyf_accelerator_t glyf (plan->source);
 #ifndef HB_NO_SUBSET_CFF
-  OT::cff1::accelerator_t cff (plan->source);
+  // Note: we cannot use inprogress_accelerator here, since it has not been
+  // created yet. So in case of preprocessed-face (and otherwise), we do an
+  // extra sanitize pass here, which is not ideal.
+  OT::cff1::accelerator_subset_t stack_cff (plan->accelerator ? nullptr : plan->source);
+  const OT::cff1::accelerator_subset_t *cff (plan->accelerator ? plan->accelerator->cff1_accel.get () : &stack_cff);
 #endif
 
   plan->_glyphset_gsub.add (0); // Not-def
@@ -701,7 +793,9 @@ _populate_gids_to_retain (hb_subset_plan
         &plan->gsub_features,
         &plan->gsub_langsys,
         &plan->gsub_feature_record_cond_idx_map,
-        &plan->gsub_feature_substitutes_map);
+        &plan->gsub_feature_substitutes_map,
+        plan->gsub_old_features,
+        plan->gsub_old_feature_idx_tag_map);
 
   if (!drop_tables->has (HB_OT_TAG_GPOS))
     _closure_glyphs_lookups_features<GPOS> (
@@ -711,7 +805,9 @@ _populate_gids_to_retain (hb_subset_plan
         &plan->gpos_features,
         &plan->gpos_langsys,
         &plan->gpos_feature_record_cond_idx_map,
-        &plan->gpos_feature_substitutes_map);
+        &plan->gpos_feature_substitutes_map,
+        plan->gpos_old_features,
+        plan->gpos_old_feature_idx_tag_map);
 #endif
   _remove_invalid_gids (&plan->_glyphset_gsub, plan->source->get_num_glyphs ());
 
@@ -744,9 +840,9 @@ _populate_gids_to_retain (hb_subset_plan
   if (!plan->accelerator || plan->accelerator->has_seac)
   {
     bool has_seac = false;
-    if (cff.is_valid ())
+    if (cff->is_valid ())
       for (hb_codepoint_t gid : cur_glyphset)
-	if (_add_cff_seac_components (cff, gid, &plan->_glyphset))
+	if (_add_cff_seac_components (*cff, gid, &plan->_glyphset))
 	  has_seac = true;
     plan->has_seac = has_seac;
   }
@@ -754,7 +850,6 @@ _populate_gids_to_retain (hb_subset_plan
 
   _remove_invalid_gids (&plan->_glyphset, plan->source->get_num_glyphs ());
 
-
 #ifndef HB_NO_VAR
   if (!drop_tables->has (HB_OT_TAG_GDEF))
     _collect_layout_variation_indices (plan);
@@ -766,41 +861,90 @@ _create_glyph_map_gsub (const hb_set_t*
                         const hb_map_t* glyph_map,
                         hb_map_t* out)
 {
+  out->alloc (glyph_set_gsub->get_population ());
   + hb_iter (glyph_set_gsub)
   | hb_map ([&] (hb_codepoint_t gid) {
-    return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (gid,
-                                                      glyph_map->get (gid));
+    return hb_codepoint_pair_t (gid, glyph_map->get (gid));
   })
   | hb_sink (out)
   ;
 }
 
-static void
+static bool
 _create_old_gid_to_new_gid_map (const hb_face_t *face,
 				bool		 retain_gids,
 				const hb_set_t	*all_gids_to_retain,
+                                const hb_map_t  *requested_glyph_map,
 				hb_map_t	*glyph_map, /* OUT */
 				hb_map_t	*reverse_glyph_map, /* OUT */
+				hb_sorted_vector_t<hb_codepoint_pair_t> *new_to_old_gid_list /* OUT */,
 				unsigned int	*num_glyphs /* OUT */)
 {
   unsigned pop = all_gids_to_retain->get_population ();
-  reverse_glyph_map->resize (pop);
-  glyph_map->resize (pop);
+  reverse_glyph_map->alloc (pop);
+  glyph_map->alloc (pop);
+  new_to_old_gid_list->alloc (pop);
 
-  if (!retain_gids)
+  if (*requested_glyph_map)
+  {
+    hb_set_t new_gids(requested_glyph_map->values());
+    if (new_gids.get_population() != requested_glyph_map->get_population())
+    {
+      DEBUG_MSG (SUBSET, nullptr, "The provided custom glyph mapping is not unique.");
+      return false;
+    }
+
+    if (retain_gids)
+    {
+      DEBUG_MSG (SUBSET, nullptr,
+        "HB_SUBSET_FLAGS_RETAIN_GIDS cannot be set if "
+        "a custom glyph mapping has been provided.");
+      return false;
+    }
+
+    hb_codepoint_t max_glyph = 0;
+    hb_set_t remaining;
+    for (auto old_gid : all_gids_to_retain->iter ())
+    {
+      if (old_gid == 0) {
+	new_to_old_gid_list->push (hb_pair<hb_codepoint_t, hb_codepoint_t> (0u, 0u));
+        continue;
+      }
+
+      hb_codepoint_t* new_gid;
+      if (!requested_glyph_map->has (old_gid, &new_gid))
+      {
+        remaining.add(old_gid);
+        continue;
+      }
+
+      if (*new_gid > max_glyph)
+        max_glyph = *new_gid;
+      new_to_old_gid_list->push (hb_pair (*new_gid, old_gid));
+    }
+    new_to_old_gid_list->qsort ();
+
+    // Anything that wasn't mapped by the requested mapping should
+    // be placed after the requested mapping.
+    for (auto old_gid : remaining)
+      new_to_old_gid_list->push (hb_pair (++max_glyph, old_gid));
+
+    *num_glyphs = max_glyph + 1;
+  }
+  else if (!retain_gids)
   {
     + hb_enumerate (hb_iter (all_gids_to_retain), (hb_codepoint_t) 0)
-    | hb_sink (reverse_glyph_map)
+    | hb_sink (new_to_old_gid_list)
     ;
-    *num_glyphs = reverse_glyph_map->get_population ();
+    *num_glyphs = new_to_old_gid_list->length;
   }
   else
   {
     + hb_iter (all_gids_to_retain)
     | hb_map ([] (hb_codepoint_t _) {
-		return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (_, _);
+		return hb_codepoint_pair_t (_, _);
 	      })
-    | hb_sink (reverse_glyph_map)
+    | hb_sink (new_to_old_gid_list)
     ;
 
     hb_codepoint_t max_glyph = HB_SET_VALUE_INVALID;
@@ -809,10 +953,17 @@ _create_old_gid_to_new_gid_map (const hb
     *num_glyphs = max_glyph + 1;
   }
 
-  + reverse_glyph_map->iter ()
-  | hb_map (&hb_pair_t<hb_codepoint_t, hb_codepoint_t>::reverse)
+  reverse_glyph_map->alloc (reverse_glyph_map->get_population () + new_to_old_gid_list->length);
+  + hb_iter (new_to_old_gid_list)
+  | hb_sink (reverse_glyph_map)
+  ;
+  glyph_map->alloc (glyph_map->get_population () + new_to_old_gid_list->length);
+  + hb_iter (new_to_old_gid_list)
+  | hb_map (&hb_codepoint_pair_t::reverse)
   | hb_sink (glyph_map)
   ;
+
+  return true;
 }
 
 #ifndef HB_NO_VAR
@@ -841,24 +992,38 @@ _normalize_axes_location (hb_face_t *fac
     hb_tag_t axis_tag = axis.get_axis_tag ();
     plan->axes_old_index_tag_map.set (old_axis_idx, axis_tag);
 
-    if (!plan->user_axes_location.has (axis_tag))
+    if (!plan->user_axes_location.has (axis_tag) ||
+        !plan->user_axes_location.get (axis_tag).is_point ())
     {
       axis_not_pinned = true;
       plan->axes_index_map.set (old_axis_idx, new_axis_idx);
+      plan->axis_tags.push (axis_tag);
       new_axis_idx++;
     }
-    else
+
+    Triple *axis_range;
+    if (plan->user_axes_location.has (axis_tag, &axis_range))
     {
-      int normalized_v = axis.normalize_axis_value (plan->user_axes_location.get (axis_tag));
+      plan->axes_triple_distances.set (axis_tag, axis.get_triple_distances ());
+
+      int normalized_min = axis.normalize_axis_value (axis_range->minimum);
+      int normalized_default = axis.normalize_axis_value (axis_range->middle);
+      int normalized_max = axis.normalize_axis_value (axis_range->maximum);
+
       if (has_avar && old_axis_idx < avar_axis_count)
       {
-        normalized_v = seg_maps->map (normalized_v);
+        normalized_min = seg_maps->map (normalized_min);
+        normalized_default = seg_maps->map (normalized_default);
+        normalized_max = seg_maps->map (normalized_max);
       }
-      plan->axes_location.set (axis_tag, normalized_v);
-      if (normalized_v != 0)
+      plan->axes_location.set (axis_tag, Triple (static_cast<float> (normalized_min / 16384.f),
+                                                 static_cast<float> (normalized_default / 16384.f),
+                                                 static_cast<float> (normalized_max / 16384.f)));
+
+      if (normalized_default != 0)
         plan->pinned_at_default = false;
 
-      plan->normalized_coords[old_axis_idx] = normalized_v;
+      plan->normalized_coords[old_axis_idx] = normalized_default;
     }
 
     old_axis_idx++;
@@ -876,8 +1041,8 @@ _update_instance_metrics_map_from_cff2 (
   OT::cff2::accelerator_t cff2 (plan->source);
   if (!cff2.is_valid ()) return;
 
-  hb_font_t *font = nullptr;
-  if (unlikely (!plan->check_success (font = _get_hb_font_with_variations (plan))))
+  hb_font_t *font = _get_hb_font_with_variations (plan);
+  if (unlikely (!plan->check_success (font != nullptr)))
   {
     hb_font_destroy (font);
     return;
@@ -888,7 +1053,7 @@ _update_instance_metrics_map_from_cff2 (
   float *hvar_store_cache = nullptr;
   if (_hmtx.has_data () && _hmtx.var_table.get_length ())
     hvar_store_cache = _hmtx.var_table->get_var_store ().create_cache ();
-  
+
   OT::vmtx_accelerator_t _vmtx (plan->source);
   float *vvar_store_cache = nullptr;
   if (_vmtx.has_data () && _vmtx.var_table.get_length ())
@@ -925,7 +1090,7 @@ _update_instance_metrics_map_from_cff2 (
           continue;
       }
       plan->hmtx_map.set (new_gid, hb_pair ((unsigned) hori_aw, lsb));
-      plan->bounds_width_map.set (new_gid, extents.width);
+      plan->bounds_width_vec[new_gid] = extents.width;
     }
 
     if (_vmtx.has_data ())
@@ -942,7 +1107,7 @@ _update_instance_metrics_map_from_cff2 (
           continue;
       }
       plan->vmtx_map.set (new_gid, hb_pair ((unsigned) vert_aw, tsb));
-      plan->bounds_height_map.set (new_gid, extents.height);
+      plan->bounds_height_vec[new_gid] = extents.height;
     }
   }
   hb_font_destroy (font);
@@ -951,6 +1116,43 @@ _update_instance_metrics_map_from_cff2 (
   if (vvar_store_cache)
     _vmtx.var_table->get_var_store ().destroy_cache (vvar_store_cache);
 }
+
+static bool
+_get_instance_glyphs_contour_points (hb_subset_plan_t *plan)
+{
+  /* contour_points vector only needed for updating gvar table (infer delta and
+   * iup delta optimization) during partial instancing */
+  if (plan->user_axes_location.is_empty () || plan->all_axes_pinned)
+    return true;
+
+  OT::glyf_accelerator_t glyf (plan->source);
+
+  for (auto &_ : plan->new_to_old_gid_list)
+  {
+    hb_codepoint_t new_gid = _.first;
+    contour_point_vector_t all_points;
+    if (new_gid == 0 && !(plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE))
+    {
+      if (unlikely (!plan->new_gid_contour_points_map.set (new_gid, all_points)))
+        return false;
+      continue;
+    }
+
+    hb_codepoint_t old_gid = _.second;
+    auto glyph = glyf.glyph_for_gid (old_gid);
+    if (unlikely (!glyph.get_all_points_without_var (plan->source, all_points)))
+      return false;
+    if (unlikely (!plan->new_gid_contour_points_map.set (new_gid, all_points)))
+      return false;
+
+#ifdef HB_EXPERIMENTAL_API
+    /* composite new gids are only needed by iup delta optimization */
+    if ((plan->flags & HB_SUBSET_FLAGS_OPTIMIZE_IUP_DELTAS) && glyph.is_composite ())
+      plan->composite_new_gids.add (new_gid);
+#endif
+  }
+  return true;
+}
 #endif
 
 hb_subset_plan_t::hb_subset_plan_t (hb_face_t *face,
@@ -975,11 +1177,14 @@ hb_subset_plan_t::hb_subset_plan_t (hb_f
   glyph_map = hb_map_create ();
   reverse_glyph_map = hb_map_create ();
 
+  gsub_insert_catch_all_feature_variation_rec = false;
+  gpos_insert_catch_all_feature_variation_rec = false;
   gdef_varstore_inner_maps.init ();
 
   user_axes_location = input->axes_location;
   all_axes_pinned = false;
   pinned_at_default = true;
+  has_gdef_varstore = false;
 
 #ifdef HB_EXPERIMENTAL_API
   for (auto _ : input->name_table_overrides)
@@ -999,10 +1204,13 @@ hb_subset_plan_t::hb_subset_plan_t (hb_f
 
   attach_accelerator_data = input->attach_accelerator_data;
   force_long_loca = input->force_long_loca;
+#ifdef HB_EXPERIMENTAL_API
+  force_long_loca = force_long_loca || (flags & HB_SUBSET_FLAGS_IFTB_REQUIREMENTS);
+#endif
+
   if (accel)
     accelerator = (hb_subset_accelerator_t*) accel;
 
-
   if (unlikely (in_error ()))
     return;
 
@@ -1016,12 +1224,17 @@ hb_subset_plan_t::hb_subset_plan_t (hb_f
   if (unlikely (in_error ()))
     return;
 
-  _create_old_gid_to_new_gid_map (face,
-                                  input->flags & HB_SUBSET_FLAGS_RETAIN_GIDS,
-				  &_glyphset,
-				  glyph_map,
-				  reverse_glyph_map,
-				  &_num_output_glyphs);
+  if (!check_success(_create_old_gid_to_new_gid_map(
+          face,
+          input->flags & HB_SUBSET_FLAGS_RETAIN_GIDS,
+          &_glyphset,
+          &input->glyph_map,
+          glyph_map,
+          reverse_glyph_map,
+	  &new_to_old_gid_list,
+          &_num_output_glyphs))) {
+    return;
+  }
 
   _create_glyph_map_gsub (
       &_glyphset_gsub,
@@ -1036,33 +1249,71 @@ hb_subset_plan_t::hb_subset_plan_t (hb_f
         glyph_map->get(unicode_to_new_gid_list.arrayZ[i].second);
   }
 
+  bounds_width_vec.resize (_num_output_glyphs, false);
+  for (auto &v : bounds_width_vec)
+    v = 0xFFFFFFFF;
+  bounds_height_vec.resize (_num_output_glyphs, false);
+  for (auto &v : bounds_height_vec)
+    v = 0xFFFFFFFF;
+
+  if (!drop_tables.has (HB_OT_TAG_GDEF))
+    _remap_used_mark_sets (this, used_mark_sets_map);
+
+#ifndef HB_NO_VAR
+#ifndef HB_NO_BASE
+  if (!drop_tables.has (HB_OT_TAG_BASE))
+    _collect_base_variation_indices (this);
+#endif
+#endif
+
   if (unlikely (in_error ()))
     return;
 
 #ifndef HB_NO_VAR
   _update_instance_metrics_map_from_cff2 (this);
+  if (!check_success (_get_instance_glyphs_contour_points (this)))
+      return;
 #endif
 
   if (attach_accelerator_data)
   {
-    hb_multimap_t gid_to_unicodes;
-
-    hb_map_t &unicode_to_gid = *codepoint_to_glyph;
-
-    for (auto unicode : unicodes)
-    {
-      auto gid = unicode_to_gid[unicode];
-      gid_to_unicodes.add (gid, unicode);
-    }
-
     inprogress_accelerator =
-      hb_subset_accelerator_t::create (*codepoint_to_glyph,
-				       gid_to_unicodes,
+      hb_subset_accelerator_t::create (source,
+				       *codepoint_to_glyph,
                                        unicodes,
 				       has_seac);
+
+    check_success (inprogress_accelerator);
   }
+
+#define HB_SUBSET_PLAN_MEMBER(Type, Name) check_success (!Name.in_error ());
+#include "hb-subset-plan-member-list.hh"
+#undef HB_SUBSET_PLAN_MEMBER
+}
+
+hb_subset_plan_t::~hb_subset_plan_t()
+{
+  hb_face_destroy (dest);
+
+  hb_map_destroy (codepoint_to_glyph);
+  hb_map_destroy (glyph_map);
+  hb_map_destroy (reverse_glyph_map);
+#ifndef HB_NO_SUBSET_CFF
+  cff1_accel.fini ();
+  cff2_accel.fini ();
+#endif
+  hb_face_destroy (source);
+
+#ifdef HB_EXPERIMENTAL_API
+  for (auto _ : name_table_overrides.iter_ref ())
+    _.second.fini ();
+#endif
+
+  if (inprogress_accelerator)
+    hb_subset_accelerator_t::destroy ((void*) inprogress_accelerator);
 }
 
+
 /**
  * hb_subset_plan_create_or_fail:
  * @face: font face to create the plan for.
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-plan.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-plan.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset-plan.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset-plan.hh	2024-11-20 13:56:33.000000000 +0000
@@ -67,60 +67,81 @@ struct head_maxp_info_t
 
 typedef struct head_maxp_info_t head_maxp_info_t;
 
-struct hb_subset_plan_t
+struct contour_point_t
 {
-  HB_INTERNAL hb_subset_plan_t (hb_face_t *,
-				const hb_subset_input_t *input);
+  void init (float x_ = 0.f, float y_ = 0.f, bool is_end_point_ = false)
+  { flag = 0; x = x_; y = y_; is_end_point = is_end_point_; }
 
-  ~hb_subset_plan_t()
+  void transform (const float (&matrix)[4])
   {
-    hb_face_destroy (source);
-    hb_face_destroy (dest);
-
-    hb_map_destroy (codepoint_to_glyph);
-    hb_map_destroy (glyph_map);
-    hb_map_destroy (reverse_glyph_map);
-
-#ifdef HB_EXPERIMENTAL_API
-    for (auto _ : name_table_overrides)
-      _.second.fini ();
-#endif
+    float x_ = x * matrix[0] + y * matrix[2];
+	  y  = x * matrix[1] + y * matrix[3];
+    x  = x_;
+  }
 
-    if (inprogress_accelerator)
-      hb_subset_accelerator_t::destroy ((void*) inprogress_accelerator);
+  void add_delta (float delta_x, float delta_y)
+  {
+    x += delta_x;
+    y += delta_y;
   }
 
-  hb_object_header_t header;
+  HB_ALWAYS_INLINE
+  void translate (const contour_point_t &p) { x += p.x; y += p.y; }
 
-  bool successful;
-  unsigned flags;
-  bool attach_accelerator_data = false;
-  bool force_long_loca = false;
 
-  // For each cp that we'd like to retain maps to the corresponding gid.
-  hb_set_t unicodes;
-  hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> unicode_to_new_gid_list;
+  float x;
+  float y;
+  uint8_t flag;
+  bool is_end_point;
+};
 
-  // name_ids we would like to retain
-  hb_set_t name_ids;
+struct contour_point_vector_t : hb_vector_t<contour_point_t>
+{
+  void extend (const hb_array_t<contour_point_t> &a)
+  {
+    unsigned int old_len = length;
+    if (unlikely (!resize (old_len + a.length, false)))
+      return;
+    auto arrayZ = this->arrayZ + old_len;
+    unsigned count = a.length;
+    hb_memcpy (arrayZ, a.arrayZ, count * sizeof (arrayZ[0]));
+  }
+
+  bool add_deltas (const hb_vector_t<float> deltas_x,
+                   const hb_vector_t<float> deltas_y,
+                   const hb_vector_t<bool> indices)
+  {
+    if (indices.length != deltas_x.length ||
+        indices.length != deltas_y.length)
+      return false;
 
-  // name_languages we would like to retain
-  hb_set_t name_languages;
+    for (unsigned i = 0; i < indices.length; i++)
+    {
+      if (!indices.arrayZ[i]) continue;
+      arrayZ[i].add_delta (deltas_x.arrayZ[i], deltas_y.arrayZ[i]);
+    }
+    return true;
+  }
+};
 
-  //layout features which will be preserved
-  hb_set_t layout_features;
+namespace OT {
+  struct cff1_subset_accelerator_t;
+  struct cff2_subset_accelerator_t;
+}
 
-  // layout scripts which will be preserved.
-  hb_set_t layout_scripts;
+struct hb_subset_plan_t
+{
+  HB_INTERNAL hb_subset_plan_t (hb_face_t *,
+				const hb_subset_input_t *input);
 
-  //glyph ids requested to retain
-  hb_set_t glyphs_requested;
+  HB_INTERNAL ~hb_subset_plan_t();
 
-  // Tables which should not be processed, just pass them through.
-  hb_set_t no_subset_tables;
+  hb_object_header_t header;
 
-  // Tables which should be dropped.
-  hb_set_t drop_tables;
+  bool successful;
+  unsigned flags;
+  bool attach_accelerator_data = false;
+  bool force_long_loca = false;
 
   // The glyph subset
   hb_map_t *codepoint_to_glyph; // Needs to be heap-allocated
@@ -128,106 +149,68 @@ struct hb_subset_plan_t
   // Old -> New glyph id mapping
   hb_map_t *glyph_map; // Needs to be heap-allocated
   hb_map_t *reverse_glyph_map; // Needs to be heap-allocated
-  hb_map_t glyph_map_gsub;
 
   // Plan is only good for a specific source/dest so keep them with it
   hb_face_t *source;
+#ifndef HB_NO_SUBSET_CFF
+  // These have to be immediately after source:
+  hb_face_lazy_loader_t<OT::cff1_subset_accelerator_t, 1> cff1_accel;
+  hb_face_lazy_loader_t<OT::cff2_subset_accelerator_t, 2> cff2_accel;
+#endif
+
   hb_face_t *dest;
 
   unsigned int _num_output_glyphs;
-  hb_set_t _glyphset;
-  hb_set_t _glyphset_gsub;
-  hb_set_t _glyphset_mathed;
-  hb_set_t _glyphset_colred;
-
-  //active lookups we'd like to retain
-  hb_map_t gsub_lookups;
-  hb_map_t gpos_lookups;
-
-  //active langsys we'd like to retain
-  hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> gsub_langsys;
-  hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> gpos_langsys;
-
-  //active features after removing redundant langsys and prune_features
-  hb_map_t gsub_features;
-  hb_map_t gpos_features;
-
-  //active feature variation records/condition index with variations
-  hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> gsub_feature_record_cond_idx_map;
-  hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> gpos_feature_record_cond_idx_map;
-
-  //feature index-> address of substituation feature table mapping with
-  //variations
-  hb_hashmap_t<unsigned, const OT::Feature*> gsub_feature_substitutes_map;
-  hb_hashmap_t<unsigned, const OT::Feature*> gpos_feature_substitutes_map;
-
-  //active layers/palettes we'd like to retain
-  hb_map_t colrv1_layers;
-  hb_map_t colr_palettes;
-
-  //Old layout item variation index -> (New varidx, delta) mapping
-  hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> layout_variation_idx_delta_map;
-
-  //gdef varstore retained varidx mapping
-  hb_vector_t<hb_inc_bimap_t> gdef_varstore_inner_maps;
-
-  hb_hashmap_t<hb_tag_t, hb::unique_ptr<hb_blob_t>> sanitized_table_cache;
-  //normalized axes location map
-  hb_hashmap_t<hb_tag_t, int> axes_location;
-  hb_vector_t<int> normalized_coords;
-  //user specified axes location map
-  hb_hashmap_t<hb_tag_t, float> user_axes_location;
-  //retained old axis index -> new axis index mapping in fvar axis array
-  hb_map_t axes_index_map;
-  //axis_index->axis_tag mapping in fvar axis array
-  hb_map_t axes_old_index_tag_map;
+
   bool all_axes_pinned;
   bool pinned_at_default;
   bool has_seac;
 
-  //hmtx metrics map: new gid->(advance, lsb)
-  mutable hb_hashmap_t<hb_codepoint_t, hb_pair_t<unsigned, int>> hmtx_map;
-  //vmtx metrics map: new gid->(advance, lsb)
-  mutable hb_hashmap_t<hb_codepoint_t, hb_pair_t<unsigned, int>> vmtx_map;
-  //boundsWidth map: new gid->boundsWidth, boundWidth=xMax - xMin
-  mutable hb_map_t bounds_width_map;
-  //boundsHeight map: new gid->boundsHeight, boundsHeight=yMax - yMin
-  mutable hb_map_t bounds_height_map;
+  // whether to insert a catch-all FeatureVariationRecord
+  bool gsub_insert_catch_all_feature_variation_rec;
+  bool gpos_insert_catch_all_feature_variation_rec;
+
+  // whether GDEF ItemVariationStore is retained
+  mutable bool has_gdef_varstore;
+
+#define HB_SUBSET_PLAN_MEMBER(Type, Name) Type Name;
+#include "hb-subset-plan-member-list.hh"
+#undef HB_SUBSET_PLAN_MEMBER
 
   //recalculated head/maxp table info after instancing
   mutable head_maxp_info_t head_maxp_info;
 
-#ifdef HB_EXPERIMENTAL_API
-  // name table overrides map: hb_ot_name_record_ids_t-> name string new value or
-  // None to indicate should remove
-  hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> name_table_overrides;
-#endif
-
   const hb_subset_accelerator_t* accelerator;
   hb_subset_accelerator_t* inprogress_accelerator;
 
  public:
 
   template<typename T>
-  hb_blob_ptr_t<T> source_table()
+  struct source_table_loader
   {
-    hb_lock_t lock (accelerator ? &accelerator->sanitized_table_cache_lock : nullptr);
+    hb_blob_ptr_t<T> operator () (hb_subset_plan_t *plan)
+    {
+      hb_lock_t lock (plan->accelerator ? &plan->accelerator->sanitized_table_cache_lock : nullptr);
 
-    auto *cache = accelerator ? &accelerator->sanitized_table_cache : &sanitized_table_cache;
-    if (cache
-        && !cache->in_error ()
-        && cache->has (+T::tableTag)) {
-      return hb_blob_reference (cache->get (+T::tableTag).get ());
-    }
+      auto *cache = plan->accelerator ? &plan->accelerator->sanitized_table_cache : &plan->sanitized_table_cache;
+      if (cache
+	  && !cache->in_error ()
+	  && cache->has (+T::tableTag)) {
+	return hb_blob_reference (cache->get (+T::tableTag).get ());
+      }
 
-    hb::unique_ptr<hb_blob_t> table_blob {hb_sanitize_context_t ().reference_table<T> (source)};
-    hb_blob_t* ret = hb_blob_reference (table_blob.get ());
+      hb::unique_ptr<hb_blob_t> table_blob {hb_sanitize_context_t ().reference_table<T> (plan->source)};
+      hb_blob_t* ret = hb_blob_reference (table_blob.get ());
 
-    if (likely (cache))
-      cache->set (+T::tableTag, std::move (table_blob));
+      if (likely (cache))
+	cache->set (+T::tableTag, std::move (table_blob));
 
-    return ret;
-  }
+      return ret;
+    }
+  };
+
+  template<typename T>
+  auto source_table() HB_AUTO_RETURN (source_table_loader<T> {} (this))
 
   bool in_error () const { return !successful; }
 
@@ -266,15 +249,6 @@ struct hb_subset_plan_t
     return _num_output_glyphs;
   }
 
-  /*
-   * Given an output gid , returns true if that glyph id is an empty
-   * glyph (ie. it's a gid that we are dropping all data for).
-   */
-  inline bool is_empty_glyph (hb_codepoint_t gid) const
-  {
-    return !_glyphset.has (gid);
-  }
-
   inline bool new_gid_for_codepoint (hb_codepoint_t codepoint,
 				     hb_codepoint_t *new_gid) const
   {
@@ -324,4 +298,5 @@ struct hb_subset_plan_t
   }
 };
 
+
 #endif /* HB_SUBSET_PLAN_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset.cc	2024-11-20 13:56:33.000000000 +0000
@@ -48,12 +48,15 @@
 #include "hb-ot-cff2-table.hh"
 #include "hb-ot-vorg-table.hh"
 #include "hb-ot-name-table.hh"
+#include "hb-ot-layout-base-table.hh"
 #include "hb-ot-layout-gsub-table.hh"
 #include "hb-ot-layout-gpos-table.hh"
+#include "hb-ot-var-avar-table.hh"
 #include "hb-ot-var-cvar-table.hh"
 #include "hb-ot-var-fvar-table.hh"
 #include "hb-ot-var-gvar-table.hh"
 #include "hb-ot-var-hvar-table.hh"
+#include "hb-ot-var-mvar-table.hh"
 #include "hb-ot-math-table.hh"
 #include "hb-ot-stat-table.hh"
 #include "hb-repacker.hh"
@@ -62,6 +65,27 @@
 using OT::Layout::GSUB;
 using OT::Layout::GPOS;
 
+
+#ifndef HB_NO_SUBSET_CFF
+template<>
+struct hb_subset_plan_t::source_table_loader<const OT::cff1>
+{
+  auto operator () (hb_subset_plan_t *plan)
+  HB_AUTO_RETURN (plan->accelerator ? plan->accelerator->cff1_accel :
+		  plan->inprogress_accelerator ? plan->inprogress_accelerator->cff1_accel :
+		  plan->cff1_accel)
+};
+template<>
+struct hb_subset_plan_t::source_table_loader<const OT::cff2>
+{
+  auto operator () (hb_subset_plan_t *plan)
+  HB_AUTO_RETURN (plan->accelerator ? plan->accelerator->cff2_accel :
+		  plan->inprogress_accelerator ? plan->inprogress_accelerator->cff2_accel :
+		  plan->cff2_accel)
+};
+#endif
+
+
 /**
  * SECTION:hb-subset
  * @title: hb-subset
@@ -96,8 +120,8 @@ static hb_tag_t known_tables[] {
   HB_OT_TAG_BASE,
   HB_OT_TAG_CBDT,
   HB_OT_TAG_CBLC,
-  HB_OT_TAG_cff1,
-  HB_OT_TAG_cff2,
+  HB_OT_TAG_CFF1,
+  HB_OT_TAG_CFF2,
   HB_OT_TAG_cmap,
   HB_OT_TAG_COLR,
   HB_OT_TAG_CPAL,
@@ -192,15 +216,36 @@ _get_table_tags (const hb_subset_plan_t*
 static unsigned
 _plan_estimate_subset_table_size (hb_subset_plan_t *plan,
 				  unsigned table_len,
-				  bool same_size)
+				  hb_tag_t table_tag)
 {
   unsigned src_glyphs = plan->source->get_num_glyphs ();
   unsigned dst_glyphs = plan->glyphset ()->get_population ();
 
+  unsigned bulk = 8192;
+  /* Tables that we want to allocate same space as the source table. For GSUB/GPOS it's
+   * because those are expensive to subset, so giving them more room is fine. */
+  bool same_size = table_tag == HB_OT_TAG_GSUB ||
+		   table_tag == HB_OT_TAG_GPOS ||
+		   table_tag == HB_OT_TAG_name;
+
+  if (plan->flags & HB_SUBSET_FLAGS_RETAIN_GIDS)
+  {
+    if (table_tag == HB_OT_TAG_CFF1)
+    {
+      /* Add some extra room for the CFF charset. */
+      bulk += src_glyphs * 16;
+    }
+    else if (table_tag == HB_OT_TAG_CFF2)
+    {
+      /* Just extra CharString offsets. */
+      bulk += src_glyphs * 4;
+    }
+  }
+
   if (unlikely (!src_glyphs) || same_size)
-    return 512 + table_len;
+    return bulk + table_len;
 
-  return 512 + (unsigned) (table_len * sqrt ((double) dst_glyphs / src_glyphs));
+  return bulk + (unsigned) (table_len * sqrt ((double) dst_glyphs / src_glyphs));
 }
 
 /*
@@ -231,7 +276,7 @@ _try_subset (const TableType *table,
              hb_vector_t<char>* buf,
              hb_subset_context_t* c /* OUT */)
 {
-  c->serializer->start_serialize<TableType> ();
+  c->serializer->start_serialize ();
   if (c->serializer->in_error ()) return false;
 
   bool needed = table->subset (c);
@@ -262,45 +307,46 @@ _try_subset (const TableType *table,
   return _try_subset (table, buf, c);
 }
 
+template <typename T>
+static auto _do_destroy (T &t, hb_priority<1>) HB_RETURN (void, t.destroy ())
+
+template <typename T>
+static void _do_destroy (T &t, hb_priority<0>) {}
+
 template<typename TableType>
 static bool
 _subset (hb_subset_plan_t *plan, hb_vector_t<char> &buf)
 {
-  hb_blob_ptr_t<TableType> source_blob = plan->source_table<TableType> ();
-  const TableType *table = source_blob.get ();
+  auto &&source_blob = plan->source_table<TableType> ();
+  auto *table = source_blob.get ();
 
   hb_tag_t tag = TableType::tableTag;
-  if (!source_blob.get_blob()->data)
+  hb_blob_t *blob = source_blob.get_blob();
+  if (unlikely (!blob || !blob->data))
   {
     DEBUG_MSG (SUBSET, nullptr,
                "OT::%c%c%c%c::subset sanitize failed on source table.", HB_UNTAG (tag));
-    source_blob.destroy ();
+    _do_destroy (source_blob, hb_prioritize);
     return false;
   }
 
-  /* Tables that we want to allocate same space as the source table. For GSUB/GPOS it's
-   * because those are expensive to subset, so giving them more room is fine. */
-  bool same_size_table = TableType::tableTag == HB_OT_TAG_GSUB ||
-			 TableType::tableTag == HB_OT_TAG_GPOS ||
-			 TableType::tableTag == HB_OT_TAG_name;
-
-  unsigned buf_size = _plan_estimate_subset_table_size (plan, source_blob.get_length (), same_size_table);
+  unsigned buf_size = _plan_estimate_subset_table_size (plan, blob->length, TableType::tableTag);
   DEBUG_MSG (SUBSET, nullptr,
              "OT::%c%c%c%c initial estimated table size: %u bytes.", HB_UNTAG (tag), buf_size);
   if (unlikely (!buf.alloc (buf_size)))
   {
     DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c failed to allocate %u bytes.", HB_UNTAG (tag), buf_size);
-    source_blob.destroy ();
+    _do_destroy (source_blob, hb_prioritize);
     return false;
   }
 
   bool needed = false;
   hb_serialize_context_t serializer (buf.arrayZ, buf.allocated);
   {
-    hb_subset_context_t c (source_blob.get_blob (), plan, &serializer, tag);
+    hb_subset_context_t c (blob, plan, &serializer, tag);
     needed = _try_subset (table, &buf, &c);
   }
-  source_blob.destroy ();
+  _do_destroy (source_blob, hb_prioritize);
 
   if (serializer.in_error () && !serializer.only_offset_overflow ())
   {
@@ -415,7 +461,10 @@ _dependencies_satisfied (hb_subset_plan_
   case HB_OT_TAG_hmtx:
   case HB_OT_TAG_vmtx:
   case HB_OT_TAG_maxp:
+  case HB_OT_TAG_OS2:
     return !plan->normalized_coords || !pending_subset_tags.has (HB_OT_TAG_glyf);
+  case HB_OT_TAG_GPOS:
+    return plan->all_axes_pinned || !pending_subset_tags.has (HB_OT_TAG_GDEF);
   default:
     return true;
   }
@@ -455,10 +504,11 @@ _subset_table (hb_subset_plan_t *plan,
   case HB_OT_TAG_CBLC: return _subset<const OT::CBLC> (plan, buf);
   case HB_OT_TAG_CBDT: return true; /* skip CBDT, handled by CBLC */
   case HB_OT_TAG_MATH: return _subset<const OT::MATH> (plan, buf);
+  case HB_OT_TAG_BASE: return _subset<const OT::BASE> (plan, buf);
 
 #ifndef HB_NO_SUBSET_CFF
-  case HB_OT_TAG_cff1: return _subset<const OT::cff1> (plan, buf);
-  case HB_OT_TAG_cff2: return _subset<const OT::cff2> (plan, buf);
+  case HB_OT_TAG_CFF1: return _subset<const OT::cff1> (plan, buf);
+  case HB_OT_TAG_CFF2: return _subset<const OT::cff2> (plan, buf);
   case HB_OT_TAG_VORG: return _subset<const OT::VORG> (plan, buf);
 #endif
 
@@ -470,13 +520,24 @@ _subset_table (hb_subset_plan_t *plan,
   case HB_OT_TAG_HVAR: return _subset<const OT::HVAR> (plan, buf);
   case HB_OT_TAG_VVAR: return _subset<const OT::VVAR> (plan, buf);
 #endif
+
+#ifndef HB_NO_VAR
   case HB_OT_TAG_fvar:
     if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag);
     return _subset<const OT::fvar> (plan, buf);
+  case HB_OT_TAG_avar:
+    if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag);
+    return _subset<const OT::avar> (plan, buf);
+  case HB_OT_TAG_cvar:
+    if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag);
+    return _subset<const OT::cvar> (plan, buf);
+  case HB_OT_TAG_MVAR:
+    if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag);
+    return _subset<const OT::MVAR> (plan, buf);
+#endif
+
   case HB_OT_TAG_STAT:
-    /*TODO(qxliu): change the condition as we support more complex
-     * instancing operation*/
-    if (plan->all_axes_pinned) return _subset<const OT::STAT> (plan, buf);
+    if (!plan->user_axes_location.is_empty ()) return _subset<const OT::STAT> (plan, buf);
     else return _passthrough (plan, tag);
 
   case HB_TAG ('c', 'v', 't', ' '):
@@ -489,6 +550,7 @@ _subset_table (hb_subset_plan_t *plan,
     }
 #endif
     return _passthrough (plan, tag);
+
   default:
     if (plan->flags & HB_SUBSET_FLAGS_PASSTHROUGH_UNRECOGNIZED)
       return _passthrough (plan, tag);
@@ -587,46 +649,49 @@ hb_subset_plan_execute_or_fail (hb_subse
     offset += num_tables;
   }
 
-  hb_vector_t<char> buf;
-  buf.alloc (4096 - 16);
-
-
   bool success = true;
 
-  while (!pending_subset_tags.is_empty ())
   {
-    if (subsetted_tags.in_error ()
-        || pending_subset_tags.in_error ()) {
-      success = false;
-      goto end;
-    }
+    // Grouping to deallocate buf before calling hb_face_reference (plan->dest).
 
-    bool made_changes = false;
-    for (hb_tag_t tag : pending_subset_tags)
+    hb_vector_t<char> buf;
+    buf.alloc (8192 - 16);
+
+    while (!pending_subset_tags.is_empty ())
     {
-      if (!_dependencies_satisfied (plan, tag,
-                                    subsetted_tags,
-                                    pending_subset_tags))
-      {
-        // delayed subsetting for some tables since they might have dependency on other tables
-        // in some cases: e.g: during instantiating glyf tables, hmetrics/vmetrics are updated
-        // and saved in subset plan, hmtx/vmtx subsetting need to use these updated metrics values
-        continue;
+      if (subsetted_tags.in_error ()
+	  || pending_subset_tags.in_error ()) {
+	success = false;
+	goto end;
       }
 
-      pending_subset_tags.del (tag);
-      subsetted_tags.add (tag);
-      made_changes = true;
+      bool made_changes = false;
+      for (hb_tag_t tag : pending_subset_tags)
+      {
+	if (!_dependencies_satisfied (plan, tag,
+				      subsetted_tags,
+				      pending_subset_tags))
+	{
+	  // delayed subsetting for some tables since they might have dependency on other tables
+	  // in some cases: e.g: during instantiating glyf tables, hmetrics/vmetrics are updated
+	  // and saved in subset plan, hmtx/vmtx subsetting need to use these updated metrics values
+	  continue;
+	}
+
+	pending_subset_tags.del (tag);
+	subsetted_tags.add (tag);
+	made_changes = true;
 
-      success = _subset_table (plan, buf, tag);
-      if (unlikely (!success)) goto end;
-    }
+	success = _subset_table (plan, buf, tag);
+	if (unlikely (!success)) goto end;
+      }
 
-    if (!made_changes)
-    {
-      DEBUG_MSG (SUBSET, nullptr, "Table dependencies unable to be satisfied. Subset failed.");
-      success = false;
-      goto end;
+      if (!made_changes)
+      {
+	DEBUG_MSG (SUBSET, nullptr, "Table dependencies unable to be satisfied. Subset failed.");
+	success = false;
+	goto end;
+      }
     }
   }
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset.h 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset.h
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-subset.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-subset.h	2024-11-20 13:56:33.000000000 +0000
@@ -73,6 +73,11 @@ typedef struct hb_subset_plan_t hb_subse
  * OS/2 will not be recalculated.
  * @HB_SUBSET_FLAGS_NO_LAYOUT_CLOSURE: If set don't perform glyph closure on layout
  * substitution rules (GSUB). Since: 7.2.0.
+ * @HB_SUBSET_FLAGS_IFTB_REQUIREMENTS: If set enforce requirements on the output subset
+ * to allow it to be used with incremental font transfer IFTB patches. Primarily,
+ * this forces all outline data to use long (32 bit) offsets. Since: EXPERIMENTAL
+ * @HB_SUBSET_FLAGS_OPTIMIZE_IUP_DELTAS: If set perform IUP delta optimization on the
+ * remaining gvar table's deltas. Since: EXPERIMENTAL
  *
  * List of boolean properties that can be configured on the subset input.
  *
@@ -90,6 +95,10 @@ typedef enum { /*< flags >*/
   HB_SUBSET_FLAGS_GLYPH_NAMES =		     0x00000080u,
   HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES =  0x00000100u,
   HB_SUBSET_FLAGS_NO_LAYOUT_CLOSURE =        0x00000200u,
+#ifdef HB_EXPERIMENTAL_API
+  HB_SUBSET_FLAGS_IFTB_REQUIREMENTS       =  0x00000400u,
+  HB_SUBSET_FLAGS_OPTIMIZE_IUP_DELTAS	  =  0x00000800u,
+#endif
 } hb_subset_flags_t;
 
 /**
@@ -154,6 +163,9 @@ hb_subset_input_glyph_set (hb_subset_inp
 HB_EXTERN hb_set_t *
 hb_subset_input_set (hb_subset_input_t *input, hb_subset_sets_t set_type);
 
+HB_EXTERN hb_map_t*
+hb_subset_input_old_to_new_glyph_mapping (hb_subset_input_t *input);
+
 HB_EXTERN hb_subset_flags_t
 hb_subset_input_get_flags (hb_subset_input_t *input);
 
@@ -162,6 +174,10 @@ hb_subset_input_set_flags (hb_subset_inp
 			   unsigned value);
 
 HB_EXTERN hb_bool_t
+hb_subset_input_pin_all_axes_to_default (hb_subset_input_t  *input,
+					 hb_face_t          *face);
+
+HB_EXTERN hb_bool_t
 hb_subset_input_pin_axis_to_default (hb_subset_input_t  *input,
 				     hb_face_t          *face,
 				     hb_tag_t            axis_tag);
@@ -174,6 +190,21 @@ hb_subset_input_pin_axis_location (hb_su
 
 #ifdef HB_EXPERIMENTAL_API
 HB_EXTERN hb_bool_t
+hb_subset_input_get_axis_range (hb_subset_input_t  *input,
+				hb_tag_t            axis_tag,
+				float              *axis_min_value,
+				float              *axis_max_value,
+				float              *axis_def_value);
+
+HB_EXTERN hb_bool_t
+hb_subset_input_set_axis_range (hb_subset_input_t  *input,
+				hb_face_t          *face,
+				hb_tag_t            axis_tag,
+				float               axis_min_value,
+				float               axis_max_value,
+				float               axis_def_value);
+
+HB_EXTERN hb_bool_t
 hb_subset_input_override_name_table (hb_subset_input_t  *input,
 				     hb_ot_name_id_t     name_id,
 				     unsigned            platform_id,
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ucd-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ucd-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-ucd-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-ucd-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   ./gen-ucd-table.py ucd.nounihan.grouped.xml
  *
- * on file with this description: Unicode 15.0.0
+ * on file with this description: Unicode 15.1.0
  */
 
 #ifndef HB_UCD_TABLE_HH
@@ -1069,7 +1069,7 @@ _hb_ucd_dm2_u64_map[388] =
 #ifndef HB_OPTIMIZE_SIZE
 
 static const uint8_t
-_hb_ucd_u8[17868] =
+_hb_ucd_u8[17884] =
 {
     0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
     7,  7,  7,  7,  9, 10,  7,  7,  7,  7, 11, 12, 13, 13, 13, 14,
@@ -1146,13 +1146,13 @@ _hb_ucd_u8[17868] =
    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,243, 34,
   244, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,245, 34, 34,
-   34, 34, 34, 34, 34, 34, 34,246,122,122,122,122,122,122,122,122,
-   34, 34, 34, 34,247,122,122,122,122,122,122,122,122,122,122,122,
-   34, 34, 34, 34, 34, 34,248, 34, 34, 34, 34, 34, 34, 34, 34, 34,
-   34, 34, 34, 34, 34, 34, 34,249,122,122,122,122,122,122,122,122,
-  250,122,251,252,122,122,122,122,122,122,122,122,122,122,122,122,
-  107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,253,
+   34, 34, 34, 34, 34, 34, 34,246, 34, 34, 34, 34,247,122,122,122,
+   34, 34, 34, 34,248,122,122,122,122,122,122,122,122,122,122,122,
+   34, 34, 34, 34, 34, 34,249, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34,250,122,122,122,122,122,122,122,122,
+  251,122,252,253,122,122,122,122,122,122,122,122,122,122,122,122,
   107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,254,
+  107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,255,
     0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  2,  4,  5,  6,  2,
     7,  7,  7,  7,  7,  2,  8,  9, 10, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16,
@@ -1315,11 +1315,11 @@ _hb_ucd_u8[17868] =
   121,  4,  4,  4,  4,  2,  2, 88,  2,  2,  2,  2,  2,120,  2,  2,
   108,151,  2,  2,  2,  2,  2,  2, 67,  2,152,148,148,148,153, 44,
    67, 67, 67, 67, 67, 55, 67, 67, 67, 67, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 44, 44,
-    1,  2,154,155,  4,  4,  4,  4,  4, 67,  4,  4,  4,  4,156,157,
-  158,105,105,105,105, 43, 43, 86,159, 40, 40, 67,105,160, 63, 67,
-   36, 36, 36, 61, 57,161,162, 69, 36, 36, 36, 36, 36, 63, 40, 69,
-   44, 44, 62, 36, 36, 36, 36, 36, 67, 27, 27, 67, 67, 67, 67, 67,
+   67, 67, 67, 44, 44, 44, 44, 44,  1,  2,154,155,  4,  4,  4,  4,
+    4, 67,  4,  4,  4,  4,156,157,158,105,105,105,105, 43, 43, 86,
+  159, 40, 40, 67,105,160, 63, 67, 36, 36, 36, 61, 57,161,162, 69,
+   36, 36, 36, 36, 36, 63, 40, 69, 44, 44, 62, 36, 36, 36, 36, 36,
+   67, 27, 27, 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 44, 55,
    67, 67, 67, 67, 67, 67, 67, 92, 27, 27, 27, 27, 27, 67, 67, 67,
    67, 67, 67, 67, 27, 27, 27, 27,163, 27, 27, 27, 27, 27, 27, 27,
    36, 36, 83, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,164,  2,
@@ -1487,215 +1487,215 @@ _hb_ucd_u8[17868] =
    44, 61, 44, 62, 62, 62, 62, 36, 62, 61, 61, 62, 62, 62, 62, 62,
    62, 61, 61, 62, 36, 61, 36, 36, 36, 61, 36, 36, 62, 36, 61, 61,
    36, 36, 36, 36, 36, 62, 36, 36, 62, 36, 62, 36, 36, 62, 36, 36,
-    8, 44, 44, 44, 44, 44, 44, 44, 55, 67, 67, 67, 67, 67, 67, 67,
-   27, 27, 27, 27, 27, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 44,
-   44, 44, 44, 67, 67, 67, 67, 67, 67, 92, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 67, 92, 44, 44, 44, 67, 44, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 67, 67,
-   67, 67, 67, 92, 44, 55, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44,
-   67, 67, 67, 67, 67, 67, 67, 55, 67, 67, 67, 44, 44, 44, 44, 67,
-   67, 92, 67, 67, 67, 67, 67, 67, 79, 44, 44, 44, 44, 44, 44, 44,
-  171,171,171,171,171,171,171, 44,171,171,171,171,171,171,171,  0,
-    0,  0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13,
-   25, 25, 25, 21, 21,  9,  9,  9,  9, 22, 21, 18, 24, 16, 24,  5,
-    5,  5,  5, 22, 25, 18, 25,  0, 23, 23, 26, 21, 24, 26,  7, 20,
-   25,  1, 26, 24, 26, 25, 15, 15, 24, 15,  7, 19, 15, 21,  9, 25,
-    9,  5,  5, 25,  5,  9,  5,  7,  7,  7,  9,  8,  8,  5,  7,  5,
-    6,  6, 24, 24,  6, 24, 12, 12,  2,  2,  6,  5,  9, 21,  9,  2,
-    2,  9, 25,  9, 26, 12, 11, 11,  2,  6,  5, 21, 17,  2,  2, 26,
-   26, 23,  2, 12, 17, 12, 21, 12, 12, 21,  7,  2,  2,  7,  7, 21,
-   21,  2,  1,  1, 21, 23, 26, 26,  1, 21,  6,  7,  7, 12, 12,  7,
-   21,  7, 12,  1, 12,  6,  6, 12, 12, 26,  7, 26, 26,  7,  2,  1,
-   12,  2,  6,  2, 24,  7,  7,  6,  1, 12, 12, 10, 10, 10, 10, 12,
-   21,  6,  2, 10, 10,  2, 15, 26, 26,  2,  2, 21,  7, 10, 15,  7,
-    2, 23, 21, 26, 10,  7, 21, 15, 15,  2, 17,  7, 29,  7,  7, 22,
-   18,  2, 14, 14, 14,  7, 10, 21, 17, 21, 11, 12,  5,  2,  5,  6,
-    8,  8,  8, 24,  5, 24,  2, 24,  9, 24, 24,  2, 29, 29, 29,  1,
-   17, 17, 20, 19, 22, 20, 27, 28,  1, 29, 21, 20, 19, 21, 21, 16,
-   16, 21, 25, 22, 18, 21, 21, 29,  1,  2, 15,  6, 18,  6, 23,  2,
-   12, 11,  9, 26, 26,  9, 26,  5,  5, 26, 14,  9,  5, 14, 14, 15,
-   25, 26, 26, 22, 18, 26, 18, 25, 18, 22,  5, 12,  2,  5, 22, 21,
-   21, 22, 18, 17, 26,  6,  7, 14, 17, 22, 18, 18, 26, 14, 17,  6,
-   14,  6, 12, 24, 24,  6, 26, 15,  6, 21, 11, 21, 24,  9,  6,  9,
-   23, 26,  6, 10,  4,  4,  3,  3,  7, 25, 17, 16, 16, 22, 16, 16,
-   25, 17, 25,  2, 25, 24,  2, 15, 12, 15, 14,  2, 21, 14,  7, 15,
-   12, 17, 21,  1, 26, 10, 10,  1, 23, 15,  0,  1,  2,  3,  4,  5,
-    6,  7,  8,  9,  0, 10, 11, 12, 13,  0, 14,  0,  0,  0,  0,  0,
-   15,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17, 18, 19,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 20,  0, 21, 22, 23,  0,  0,  0, 24,
-   25, 26, 27, 28, 29, 30, 31, 32, 33, 34,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 35,
-    0, 36,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 37,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 38, 39,  0,  0,  0,  0,  0,  0, 40, 41, 42,  0, 43,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  0,  0,
-    0,  0,  3,  0,  0,  0,  4,  5,  6,  7,  0,  8,  9, 10,  0, 11,
-   12, 13, 14, 15, 16, 17, 16, 18, 16, 19, 16, 19, 16, 19,  0, 19,
-   16, 20, 16, 19, 21, 19,  0, 22, 23, 24, 25, 26, 27, 28, 29, 30,
-   31,  0, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 33,  0,  0,
-    0,  0,  0,  0, 34,  0,  0, 35,  0,  0, 36,  0, 37,  0,  0,  0,
-   38, 39, 40, 41, 42, 43, 44, 45, 46,  0,  0, 47,  0,  0,  0, 48,
-    0,  0,  0, 49,  0,  0,  0,  0,  0,  0,  0, 50,  0, 51,  0, 52,
-   53,  0, 54,  0,  0,  0,  0,  0,  0, 55, 56, 57,  0,  0,  0,  0,
-   58,  0,  0, 59, 60, 61, 62, 63,  0,  0, 64, 65,  0,  0,  0, 66,
-    0,  0,  0,  0, 67,  0,  0,  0, 68,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 69,  0,  0,  0, 70,  0, 71,  0,  0,
-   72,  0,  0, 73,  0,  0,  0,  0,  0,  0,  0,  0, 74,  0,  0,  0,
-    0,  0, 75, 76,  0, 77, 78,  0,  0, 79, 80,  0, 81, 62,  0, 82,
-   83,  0,  0, 84, 85, 86,  0,  0,  0, 87,  0, 88,  0,  0, 51, 89,
-   51,  0, 90,  0, 91,  0,  0,  0, 80,  0,  0,  0, 92, 93,  0, 94,
-   95, 96, 97,  0,  0,  0,  0,  0, 51,  0,  0,  0,  0, 98, 99,  0,
-    0,  0,  0,  0,  0,100,  0,  0,  0,  0,  0,101,102,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,103,  0,  0,104,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,105,106,  0,  0,107,  0,  0,  0,  0,  0,  0,
-  108,  0,109,  0,102,  0,  0,  0,  0,  0,110,111,  0,  0,  0,  0,
-    0,  0,  0,112,  0,  0,  0,  0,  0,  0,  0,113,  0,114,  0,  0,
-    0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  0,  8,  0,  0,  0,
-    0,  9, 10, 11, 12,  0,  0,  0,  0, 13,  0,  0, 14, 15,  0, 16,
-    0, 17, 18,  0,  0, 19,  0, 20, 21,  0,  0,  0,  0,  0, 22, 23,
-    0, 24, 25,  0,  0, 26,  0,  0,  0, 27,  0,  0, 28, 29, 30, 31,
-    0,  0,  0, 32, 33, 34,  0,  0, 33,  0,  0, 35, 33,  0,  0,  0,
-   33, 36,  0,  0,  0,  0,  0, 37, 38,  0,  0,  0,  0,  0,  0, 39,
-   40,  0,  0,  0,  0,  0,  0, 41, 42,  0,  0,  0,  0, 43,  0, 44,
-    0,  0,  0, 45, 46,  0,  0,  0, 47,  0,  0,  0,  0,  0,  0, 48,
-   49,  0,  0,  0,  0, 50,  0,  0,  0, 51,  0, 52,  0, 53,  0,  0,
-    0,  0, 54,  0,  0,  0,  0, 55,  0, 56,  0,  0,  0,  0, 57, 58,
-    0,  0,  0, 59, 60,  0,  0,  0,  0,  0,  0, 61, 52,  0, 62, 63,
-    0,  0, 64,  0,  0,  0, 65, 66,  0,  0,  0, 67,  0, 68, 69, 70,
-   71, 72,  1, 73,  0, 74, 75, 76,  0,  0, 77, 78,  0,  0,  0, 79,
-    0,  0,  1,  1,  0,  0, 80,  0,  0, 81,  0,  0,  0,  0, 77, 82,
-    0, 83,  0,  0,  0,  0,  0, 78, 84,  0, 85,  0, 52,  0,  1, 78,
-    0,  0, 86,  0,  0, 87,  0,  0,  0,  0,  0, 88, 57,  0,  0,  0,
-    0,  0,  0, 89, 90,  0,  0, 84,  0,  0, 33,  0,  0, 91,  0,  0,
-    0,  0, 92,  0,  0,  0,  0, 49,  0,  0, 93,  0,  0,  0,  0, 94,
-   95,  0,  0, 96,  0,  0, 97,  0,  0,  0, 98,  0,  0,  0, 99,  0,
-    0,  0,  0,100,101, 93,  0,  0,102,  0,  0,  0, 84,  0,  0,103,
-    0,  0,  0,104,105,  0,  0,106,107,  0,  0,  0,  0,  0,  0,108,
-    0,  0,109,  0,  0,  0,  0,110, 33,  0,111,112,113, 35,  0,  0,
-  114,  0,  0,  0,115,  0,  0,  0,  0,  0,  0,116,  0,  0,117,  0,
-    0,  0,  0,118, 88,  0,  0,  0,  0,  0, 57,  0,  0,  0,  0, 52,
-  119,  0,  0,  0,  0,120,  0,  0,121,  0,  0,  0,  0,119,  0,  0,
-  122,  0,  0,  0,  0,  0,  0,123,  0,  0,  0,124,  0,  0,  0,125,
-    0,126,  0,  0,  0,  0,127,128,129,  0,130,  0,131,  0,  0,  0,
-  132,133,134,  0, 77,  0,  0,  0,  0,  0, 35,  0,  0,  0,135,  0,
-    0,  0,136,  0,  0,137,  0,  0,138,  0,  0,  0,  0,  0,  0,  0,
-    1,  1,  1,  1,  1,  2,  3,  4,  5,  6,  7,  4,  4,  8,  9, 10,
-    1, 11, 12, 13, 14, 15, 16, 17, 18,  1,  1,  1, 19,  1,  0,  0,
-   20, 21, 22,  1, 23,  4, 21, 24, 25, 26, 27, 28, 29, 30,  0,  0,
-    1,  1, 31,  0,  0,  0, 32, 33, 34, 35,  1, 36, 37,  0,  0,  0,
-    0, 38,  1, 39, 14, 39, 40, 41, 42,  0,  0,  0, 43, 36, 44, 45,
-   21, 45, 46,  0,  0,  0, 19,  1, 21,  0,  0, 47,  0, 38, 48,  1,
-    1, 49, 49, 50,  0,  0, 51,  0,  0,  0, 52,  1,  0,  0, 38, 14,
-    4,  1,  1,  1, 53, 21, 43, 52, 54, 21, 35,  1,  0,  0,  0, 55,
-    0,  0,  0, 56, 57, 58,  0,  0,  0,  0,  0, 59,  0, 60,  0,  0,
-    0,  0, 61, 62,  0,  0, 63,  0,  0,  0, 64,  0,  0,  0, 65,  0,
-    0,  0, 66,  0,  0,  0, 67,  0,  0,  0, 68,  0,  0, 69, 70,  0,
-   71, 72, 73, 74, 75, 76,  0,  0,  0, 77,  0,  0,  0, 78, 79,  0,
-    0,  0,  0, 47,  0,  0,  0, 49,  0, 80,  0,  0,  0, 62,  0,  0,
-   63,  0,  0, 81,  0,  0, 82,  0,  0,  0, 83,  0,  0, 19, 84,  0,
-   62,  0,  0,  0,  0, 49,  1, 85,  1, 52, 15, 86, 36, 10, 21, 87,
-    0, 55,  0,  0,  0,  0, 19, 10,  1,  0,  0,  0,  0,  0, 88,  0,
-    0, 89,  0,  0, 88,  0,  0,  0,  0, 78,  0,  0, 87,  9, 12,  4,
-   90,  8, 91, 47,  0, 58, 50,  0, 21,  1, 21, 92, 93,  1,  1,  1,
-    1, 94, 95, 96, 97,  1, 98, 58, 81, 99,100,  4, 58,  0,  0,  0,
-    0,  0,  0, 19, 50,  0,  0,  0,  0,  0,  0, 61,  0,  0,101,102,
-    0,  0,103,  0,  0,  1,  1, 50,  0,  0,  0, 38,  0, 63,  0,  0,
-    0,  0,  0, 62,  0,  0,104, 68, 61,  0,  0,  0, 78,  0,  0,  0,
-  105,106, 58, 38, 81,  0,  0,  0,  0,  0,  0,107,  1, 14,  4, 12,
-   84,  0,  0,  0,  0, 38, 87,  0,  0,  0,  0,108,  0,  0,109, 61,
-    0,110,  0,  0,  0,  1,  0,  0,  0,  0, 19, 58,  0,  0,  0, 51,
-    0,111, 14, 52,112, 41,  0,  0, 62,  0,  0, 61,  0,  0,113,  0,
-   87,  0,  0,  0, 61, 62,  0,  0, 62,  0, 89,  0,  0,113,  0,  0,
-    0,  0,114,  0,  0,  0, 78, 55,  0, 38,  1, 58,  1, 58,  0,  0,
-   63, 89,  0,  0,115,  0,  0,  0, 55,  0,  0,  0,  0,115,  0,  0,
-    0,  0, 61,  0,  0,  0,  0, 79,  0, 61,  0,  0,  0,  0, 56,  0,
-   89, 80,  0,  0, 79,  0,  0,  0,  8, 91,  0,  0,  1, 87,  0,  0,
-  116,  0,  0,  0,  0,  0,  0,117,  0,118,119,120,121,  0,104,  4,
-  122, 49, 23,  0,  0,  0, 38, 50, 38, 58,  0,  0,  1, 87,  1,  1,
-    1,  1, 39,  1, 48,105, 87,  0,  0,  0,  0,  1,  0,  0,  0,123,
-    4,122,  0,  0,  0,  1,124,  0,  0,  0,  0,  0,230,230,230,230,
-  230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220,
-  220,220,220,202,202,220,220,220,  1,  1,  1,  1,  1,220,220,220,
-  220,230,230,230,230,240,230,220,220,220,230,230,230,220,220,  0,
-  230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233,
-  234,234,233,230,  0,  0,  0,230,  0,220,230,230,230,230,220,230,
-  230,230,222,220,230,230,220,220,230,222,228,230, 10, 11, 12, 13,
-   14, 15, 16, 17, 18, 19, 19, 20, 21, 22,  0, 23,  0, 24, 25,  0,
-  230,220,  0, 18, 30, 31, 32,  0,  0,  0,  0, 27, 28, 29, 30, 31,
-   32, 33, 34,230,230,220,220,230,220,230,230,220, 35,  0,  0,  0,
-    0,  0,230,230,230,  0,  0,230,230,  0,220,230,230,220,  0,  0,
-    0, 36,  0,  0,230,220,230,230,220,220,230,220,220,230,220,230,
-  220,230,230,  0,  0,220,  0,  0,230,230,  0,230,  0,230,230,230,
-  230,230,  0,  0,  0,220,220,220,230,220,220,220,230,230,  0,220,
-   27, 28, 29,230,  7,  0,  0,  0,  0,  9,  0,  0,  0,230,220,230,
-  230,  0,  0,  0,  0,  0,230,  0,  0, 84, 91,  0,  0,  0,  0,  9,
-    9,  0,  0,  0,  0,  0,  9,  0,103,103,  9,  0,107,107,107,107,
-  118,118,  9,  0,122,122,122,122,220,220,  0,  0,  0,220,  0,220,
-    0,216,  0,  0,  0,129,130,  0,132,  0,  0,  0,  0,  0,130,130,
-  130,130,  0,  0,130,  0,230,230,  9,  0,230,230,  0,  0,220,  0,
-    0,  0,  0,  7,  0,  9,  9,  0,  9,  9,  0,  0,  0,230,  0,  0,
-    0,228,  0,  0,  0,222,230,220,220,  0,  0,  0,230,  0,  0,220,
-  230,220,  0,220,230,230,230,  0,  0,  0,  9,  9,  0,  0,  7,  0,
-  230,  0,  1,  1,  1,  0,  0,  0,230,234,214,220,202,230,230,230,
-  230,230,232,228,228,220,218,230,233,220,230,220,230,230,  1,  1,
-    1,  1,  1,230,  0,  1,  1,230,220,230,  1,  1,  0,  0,218,228,
-  232,222,224,224,  0,  8,  8,  0,  0,  0,  0,220,230,  0,230,230,
-  220,  0,  0,230,  0,  0, 26,  0,  0,220,  0,230,230,  1,220,  0,
-    0,230,220,  0,  0,  0,220,220,  0,  0,230,220,  0,  9,  7,  0,
-    0,  7,  9,  0,  0,  0,  9,  7,  6,  6,  0,  0,  0,  0,  1,  0,
-    0,216,216,  1,  1,  1,  0,  0,  0,226,216,216,216,216,216,  0,
-  220,220,220,  0,232,232,220,230,230,230,  7,  0, 16, 17, 17, 17,
-   17, 17, 17, 33, 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113,
-  129,169, 17, 27, 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    8, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 44, 44,
+   55, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27, 27, 27, 91, 67,
+   67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67,
+   67, 92, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 92, 44, 44, 44,
+   67, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 25, 41, 41,
+   67, 67, 67, 67, 44, 44, 67, 67, 67, 67, 67, 92, 44, 55, 67, 67,
+   67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 67, 55,
+   67, 67, 67, 44, 44, 44, 44, 67, 67, 92, 67, 67, 67, 67, 67, 67,
+   79, 44, 44, 44, 44, 44, 44, 44,171,171,171,171,171,171,171, 44,
+  171,171,171,171,171,171,171,  0,  0,  0, 29, 21, 21, 21, 23, 21,
+   22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21,  9,  9,  9,
+    9, 22, 21, 18, 24, 16, 24,  5,  5,  5,  5, 22, 25, 18, 25,  0,
+   23, 23, 26, 21, 24, 26,  7, 20, 25,  1, 26, 24, 26, 25, 15, 15,
+   24, 15,  7, 19, 15, 21,  9, 25,  9,  5,  5, 25,  5,  9,  5,  7,
+    7,  7,  9,  8,  8,  5,  7,  5,  6,  6, 24, 24,  6, 24, 12, 12,
+    2,  2,  6,  5,  9, 21,  9,  2,  2,  9, 25,  9, 26, 12, 11, 11,
+    2,  6,  5, 21, 17,  2,  2, 26, 26, 23,  2, 12, 17, 12, 21, 12,
+   12, 21,  7,  2,  2,  7,  7, 21, 21,  2,  1,  1, 21, 23, 26, 26,
+    1, 21,  6,  7,  7, 12, 12,  7, 21,  7, 12,  1, 12,  6,  6, 12,
+   12, 26,  7, 26, 26,  7,  2,  1, 12,  2,  6,  2, 24,  7,  7,  6,
+    1, 12, 12, 10, 10, 10, 10, 12, 21,  6,  2, 10, 10,  2, 15, 26,
+   26,  2,  2, 21,  7, 10, 15,  7,  2, 23, 21, 26, 10,  7, 21, 15,
+   15,  2, 17,  7, 29,  7,  7, 22, 18,  2, 14, 14, 14,  7, 10, 21,
+   17, 21, 11, 12,  5,  2,  5,  6,  8,  8,  8, 24,  5, 24,  2, 24,
+    9, 24, 24,  2, 29, 29, 29,  1, 17, 17, 20, 19, 22, 20, 27, 28,
+    1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29,
+    1,  2, 15,  6, 18,  6, 23,  2, 12, 11,  9, 26, 26,  9, 26,  5,
+    5, 26, 14,  9,  5, 14, 14, 15, 25, 26, 26, 22, 18, 26, 18, 25,
+   18, 22,  5, 12,  2,  5, 22, 21, 21, 22, 18, 17, 26,  6,  7, 14,
+   17, 22, 18, 18, 26, 14, 17,  6, 14,  6, 12, 24, 24,  6, 26, 15,
+    6, 21, 11, 21, 24,  9,  6,  9, 23, 26,  6, 10,  4,  4,  3,  3,
+    7, 25, 17, 16, 16, 22, 16, 16, 25, 17, 25,  2, 25, 24,  2, 15,
+   12, 15, 14,  2, 21, 14,  7, 15, 12, 17, 21,  1, 26, 10, 10,  1,
+   23, 15,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  0, 10, 11, 12,
+   13,  0, 14,  0,  0,  0,  0,  0, 15,  0, 16,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 17, 18, 19,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 20,
+    0, 21, 22, 23,  0,  0,  0, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+   33, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 35,  0, 36,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   37,  0,  0,  0,  0,  0,  0,  0,  0,  0, 38, 39,  0,  0,  0,  0,
+    0,  0, 40, 41, 42,  0, 43,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  1,  2,  0,  0,  0,  0,  3,  0,  0,  0,  4,  5,
+    6,  7,  0,  8,  9, 10,  0, 11, 12, 13, 14, 15, 16, 17, 16, 18,
+   16, 19, 16, 19, 16, 19,  0, 19, 16, 20, 16, 19, 21, 19,  0, 22,
+   23, 24, 25, 26, 27, 28, 29, 30, 31,  0, 32,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 33,  0,  0,  0,  0,  0,  0, 34,  0,  0, 35,
+    0,  0, 36,  0, 37,  0,  0,  0, 38, 39, 40, 41, 42, 43, 44, 45,
+   46,  0,  0, 47,  0,  0,  0, 48,  0,  0,  0, 49,  0,  0,  0,  0,
+    0,  0,  0, 50,  0, 51,  0, 52, 53,  0, 54,  0,  0,  0,  0,  0,
+    0, 55, 56, 57,  0,  0,  0,  0, 58,  0,  0, 59, 60, 61, 62, 63,
+    0,  0, 64, 65,  0,  0,  0, 66,  0,  0,  0,  0, 67,  0,  0,  0,
+   68,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 69,
+    0,  0,  0, 70,  0, 71,  0,  0, 72,  0,  0, 73,  0,  0,  0,  0,
+    0,  0,  0,  0, 74,  0,  0,  0,  0,  0, 75, 76,  0, 77, 78,  0,
+    0, 79, 80,  0, 81, 62,  0, 82, 83,  0,  0, 84, 85, 86,  0,  0,
+    0, 87,  0, 88,  0,  0, 51, 89, 51,  0, 90,  0, 91,  0,  0,  0,
+   80,  0,  0,  0, 92, 93,  0, 94, 95, 96, 97,  0,  0,  0,  0,  0,
+   51,  0,  0,  0,  0, 98, 99,  0,  0,  0,  0,  0,  0,100,  0,  0,
+    0,  0,  0,101,102,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,103,
+    0,  0,104,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,105,106,  0,
+    0,107,  0,  0,  0,  0,  0,  0,108,  0,109,  0,102,  0,  0,  0,
+    0,  0,110,111,  0,  0,  0,  0,  0,  0,  0,112,  0,  0,  0,  0,
+    0,  0,  0,113,  0,114,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,
+    5,  6,  7,  0,  8,  0,  0,  0,  0,  9, 10, 11, 12,  0,  0,  0,
+    0, 13,  0,  0, 14, 15,  0, 16,  0, 17, 18,  0,  0, 19,  0, 20,
+   21,  0,  0,  0,  0,  0, 22, 23,  0, 24, 25,  0,  0, 26,  0,  0,
+    0, 27,  0,  0, 28, 29, 30, 31,  0,  0,  0, 32, 33, 34,  0,  0,
+   33,  0,  0, 35, 33,  0,  0,  0, 33, 36,  0,  0,  0,  0,  0, 37,
+   38,  0,  0,  0,  0,  0,  0, 39, 40,  0,  0,  0,  0,  0,  0, 41,
+   42,  0,  0,  0,  0, 43,  0, 44,  0,  0,  0, 45, 46,  0,  0,  0,
+   47,  0,  0,  0,  0,  0,  0, 48, 49,  0,  0,  0,  0, 50,  0,  0,
+    0, 51,  0, 52,  0, 53,  0,  0,  0,  0, 54,  0,  0,  0,  0, 55,
+    0, 56,  0,  0,  0,  0, 57, 58,  0,  0,  0, 59, 60,  0,  0,  0,
+    0,  0,  0, 61, 52,  0, 62, 63,  0,  0, 64,  0,  0,  0, 65, 66,
+    0,  0,  0, 67,  0, 68, 69, 70, 71, 72,  1, 73,  0, 74, 75, 76,
+    0,  0, 77, 78,  0,  0,  0, 79,  0,  0,  1,  1,  0,  0, 80,  0,
+    0, 81,  0,  0,  0,  0, 77, 82,  0, 83,  0,  0,  0,  0,  0, 78,
+   84,  0, 85,  0, 52,  0,  1, 78,  0,  0, 86,  0,  0, 87,  0,  0,
+    0,  0,  0, 88, 57,  0,  0,  0,  0,  0,  0, 89, 90,  0,  0, 84,
+    0,  0, 33,  0,  0, 91,  0,  0,  0,  0, 92,  0,  0,  0,  0, 49,
+    0,  0, 93,  0,  0,  0,  0, 94, 95,  0,  0, 96,  0,  0, 97,  0,
+    0,  0, 98,  0,  0,  0, 99,  0,  0,  0,  0,100,101, 93,  0,  0,
+  102,  0,  0,  0, 84,  0,  0,103,  0,  0,  0,104,105,  0,  0,106,
+  107,  0,  0,  0,  0,  0,  0,108,  0,  0,109,  0,  0,  0,  0,110,
+   33,  0,111,112,113, 35,  0,  0,114,  0,  0,  0,115,  0,  0,  0,
+    0,  0,  0,116,  0,  0,117,  0,  0,  0,  0,118, 88,  0,  0,  0,
+    0,  0, 57,  0,  0,  0,  0, 52,119,  0,  0,  0,  0,120,  0,  0,
+  121,  0,  0,  0,  0,119,  0,  0,122,  0,  0,  0,  0,  0,  0,123,
+    0,  0,  0,124,  0,  0,  0,125,  0,126,  0,  0,  0,  0,127,128,
+  129,  0,130,  0,131,  0,  0,  0,132,133,134,  0, 77,  0,  0,  0,
+    0,  0, 35,  0,  0,  0,135,  0,  0,  0,136,  0,  0,137,  0,  0,
+  138,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  2,  3,  4,
+    5,  6,  7,  4,  4,  8,  9, 10,  1, 11, 12, 13, 14, 15, 16, 17,
+   18,  1,  1,  1, 19,  1,  0,  0, 20, 21, 22,  1, 23,  4, 21, 24,
+   25, 26, 27, 28, 29, 30,  0,  0,  1,  1, 31,  0,  0,  0, 32, 33,
+   34, 35,  1, 36, 37,  0,  0,  0,  0, 38,  1, 39, 14, 39, 40, 41,
+   42,  0,  0,  0, 43, 36, 44, 45, 21, 45, 46,  0,  0,  0, 19,  1,
+   21,  0,  0, 47,  0, 38, 48,  1,  1, 49, 49, 50,  0,  0, 51,  0,
+    0,  0, 52,  1,  0,  0, 38, 14,  4,  1,  1,  1, 53, 21, 43, 52,
+   54, 21, 35,  1,  0,  0,  0, 55,  0,  0,  0, 56, 57, 58,  0,  0,
+    0,  0,  0, 59,  0, 60,  0,  0,  0,  0, 61, 62,  0,  0, 63,  0,
+    0,  0, 64,  0,  0,  0, 65,  0,  0,  0, 66,  0,  0,  0, 67,  0,
+    0,  0, 68,  0,  0, 69, 70,  0, 71, 72, 73, 74, 75, 76,  0,  0,
+    0, 77,  0,  0,  0, 78, 79,  0,  0,  0,  0, 47,  0,  0,  0, 49,
+    0, 80,  0,  0,  0, 62,  0,  0, 63,  0,  0, 81,  0,  0, 82,  0,
+    0,  0, 83,  0,  0, 19, 84,  0, 62,  0,  0,  0,  0, 49,  1, 85,
+    1, 52, 15, 86, 36, 10, 21, 87,  0, 55,  0,  0,  0,  0, 19, 10,
+    1,  0,  0,  0,  0,  0, 88,  0,  0, 89,  0,  0, 88,  0,  0,  0,
+    0, 78,  0,  0, 87,  9, 12,  4, 90,  8, 91, 47,  0, 58, 50,  0,
+   21,  1, 21, 92, 93,  1,  1,  1,  1, 94, 95, 96, 97,  1, 98, 58,
+   81, 99,100,  4, 58,  0,  0,  0,  0,  0,  0, 19, 50,  0,  0,  0,
+    0,  0,  0, 61,  0,  0,101,102,  0,  0,103,  0,  0,  1,  1, 50,
+    0,  0,  0, 38,  0, 63,  0,  0,  0,  0,  0, 62,  0,  0,104, 68,
+   61,  0,  0,  0, 78,  0,  0,  0,105,106, 58, 38, 81,  0,  0,  0,
+    0,  0,  0,107,  1, 14,  4, 12, 84,  0,  0,  0,  0, 38, 87,  0,
+    0,  0,  0,108,  0,  0,109, 61,  0,110,  0,  0,  0,  1,  0,  0,
+    0,  0, 19, 58,  0,  0,  0, 51,  0,111, 14, 52,112, 41,  0,  0,
+   62,  0,  0, 61,  0,  0,113,  0, 87,  0,  0,  0, 61, 62,  0,  0,
+   62,  0, 89,  0,  0,113,  0,  0,  0,  0,114,  0,  0,  0, 78, 55,
+    0, 38,  1, 58,  1, 58,  0,  0, 63, 89,  0,  0,115,  0,  0,  0,
+   55,  0,  0,  0,  0,115,  0,  0,  0,  0, 61,  0,  0,  0,  0, 79,
+    0, 61,  0,  0,  0,  0, 56,  0, 89, 80,  0,  0, 79,  0,  0,  0,
+    8, 91,  0,  0,  1, 87,  0,  0,116,  0,  0,  0,  0,  0,  0,117,
+    0,118,119,120,121,  0,104,  4,122, 49, 23,  0,  0,  0, 38, 50,
+   38, 58,  0,  0,  1, 87,  1,  1,  1,  1, 39,  1, 48,105, 87,  0,
+    0,  0,  0,  1,  0,  0,  0,123,  4,122,  0,  0,  0,  1,124,  0,
+    0,  0,  0,  0,230,230,230,230,230,232,220,220,220,220,232,216,
+  220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220,
+    1,  1,  1,  1,  1,220,220,220,220,230,230,230,230,240,230,220,
+  220,220,230,230,230,220,220,  0,230,230,230,220,220,220,220,230,
+  232,220,220,230,233,234,234,233,234,234,233,230,  0,  0,  0,230,
+    0,220,230,230,230,230,220,230,230,230,222,220,230,230,220,220,
+  230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20,
+   21, 22,  0, 23,  0, 24, 25,  0,230,220,  0, 18, 30, 31, 32,  0,
+    0,  0,  0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230,
+  220,230,230,220, 35,  0,  0,  0,  0,  0,230,230,230,  0,  0,230,
+  230,  0,220,230,230,220,  0,  0,  0, 36,  0,  0,230,220,230,230,
+  220,220,230,220,220,230,220,230,220,230,230,  0,  0,220,  0,  0,
+  230,230,  0,230,  0,230,230,230,230,230,  0,  0,  0,220,220,220,
+  230,220,220,220,230,230,  0,220, 27, 28, 29,230,  7,  0,  0,  0,
+    0,  9,  0,  0,  0,230,220,230,230,  0,  0,  0,  0,  0,230,  0,
+    0, 84, 91,  0,  0,  0,  0,  9,  9,  0,  0,  0,  0,  0,  9,  0,
+  103,103,  9,  0,107,107,107,107,118,118,  9,  0,122,122,122,122,
+  220,220,  0,  0,  0,220,  0,220,  0,216,  0,  0,  0,129,130,  0,
+  132,  0,  0,  0,  0,  0,130,130,130,130,  0,  0,130,  0,230,230,
+    9,  0,230,230,  0,  0,220,  0,  0,  0,  0,  7,  0,  9,  9,  0,
+    9,  9,  0,  0,  0,230,  0,  0,  0,228,  0,  0,  0,222,230,220,
+  220,  0,  0,  0,230,  0,  0,220,230,220,  0,220,230,230,230,  0,
+    0,  0,  9,  9,  0,  0,  7,  0,230,  0,  1,  1,  1,  0,  0,  0,
+  230,234,214,220,202,230,230,230,230,230,232,228,228,220,218,230,
+  233,220,230,220,230,230,  1,  1,  1,  1,  1,230,  0,  1,  1,230,
+  220,230,  1,  1,  0,  0,218,228,232,222,224,224,  0,  8,  8,  0,
+    0,  0,  0,220,230,  0,230,230,220,  0,  0,230,  0,  0, 26,  0,
+    0,220,  0,230,230,  1,220,  0,  0,230,220,  0,  0,  0,220,220,
+    0,  0,230,220,  0,  9,  7,  0,  0,  7,  9,  0,  0,  0,  9,  7,
+    6,  6,  0,  0,  0,  0,  1,  0,  0,216,216,  1,  1,  1,  0,  0,
+    0,226,216,216,216,216,216,  0,220,220,220,  0,232,232,220,230,
+  230,230,  7,  0, 16, 17, 17, 17, 17, 17, 17, 33, 17, 17, 17, 19,
+   17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27, 28, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,237,  0,  1,  2,  2,
-    0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  6,  7,  8,
-    9,  0,  0,  0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 20,  0,  0, 21, 22,  0,  0,  0,  0,
-   23, 24, 25, 26,  0, 27,  0, 28, 29, 30, 31, 32,  0,  0,  0,  0,
-    0,  0,  0, 33, 34, 35, 36,  0,  0,  0,  0,  0, 37,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 38, 39,  0,  0,  0,  0,  1,  2, 40, 41,
-    0,  1,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,
-    0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  3,  4,  0,  0,  5,  0,
-    0,  0,  6,  0,  0,  0,  0,  0,  0,  0,  7,  1,  0,  0,  0,  0,
-    0,  0,  8,  9,  0,  0,  0,  0,  0,  0, 10,  0,  0, 10,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0, 10,
-    0,  0,  0,  0,  0,  0, 11, 12,  0, 13,  0, 14, 15, 16,  0,  0,
-    0,  0,  0,  1, 17, 18,  0, 19,  7,  1,  0,  0,  0, 20, 20,  7,
-   20, 20, 20, 20, 20, 20, 20,  8, 21,  0, 22,  0,  7, 23, 24,  0,
-   20, 20, 25,  0,  0,  0, 26, 27,  1,  7, 20, 20, 20, 20, 20,  1,
-   28, 29, 30, 31,  0,  0, 20,  0,  0,  0,  0,  0,  0,  0, 10,  0,
-    0,  0,  0,  0,  0,  0, 20, 20, 20,  1,  0,  0,  8, 21, 32,  4,
-    0, 10,  0, 33,  7, 20, 20, 20,  0,  0,  0,  0,  8, 34, 34, 35,
-   36, 34, 37,  0, 38,  1, 20, 20,  0,  0, 39,  0,  1,  1,  0,  8,
-   21,  1, 20,  0,  0,  0,  1,  0,  0, 40,  1,  1,  0,  0,  8, 21,
-    0,  1,  0,  1,  0,  1,  0,  0,  0,  0, 26, 34, 34, 34, 34, 34,
-   34, 34, 34, 34, 21,  7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34,
-   34, 21,  0, 42, 43, 44,  0, 45,  0,  8, 21,  0,  0,  0,  0,  0,
-    0,  0,  0, 46,  7,  1, 10,  1,  0,  0,  0,  1, 20, 20,  1,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0, 26, 34,  9,  0,  0, 20, 20,
-    1, 20, 20,  0,  0,  0,  0,  0,  0,  0, 26, 21,  0,  1,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3, 47, 48,  0,  0,  0,
-    0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,
-    7,  7,  7,  7,  7,  7,  7,  7,  9, 10, 11, 11, 11, 11, 12, 13,
-   13, 13, 13, 14, 15, 16, 17, 18, 19, 20, 21, 13, 22, 13, 13, 13,
-   13, 23, 24, 24, 25, 26, 13, 13, 13, 27, 28, 29, 13, 30, 31, 32,
-   33, 34, 35, 36,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-    7,  7,  7,  7,  7,  7,  7,  7, 37,  7, 38, 39,  7, 40,  7,  7,
-    7, 41, 13, 42,  7,  7, 43,  7, 44, 13, 13, 13, 13, 13, 13, 13,
-   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+   17, 17, 17,237,  0,  1,  2,  2,  0,  3,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    5,  0,  0,  0,  0,  6,  7,  8,  9,  0,  0,  0, 10, 11, 12, 13,
+   14, 15, 16, 17, 18, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0, 20,
+    0,  0, 21, 22,  0,  0,  0,  0, 23, 24, 25, 26,  0, 27,  0, 28,
+   29, 30, 31, 32,  0,  0,  0,  0,  0,  0,  0, 33, 34, 35, 36,  0,
+    0,  0,  0,  0, 37,  0,  0,  0,  0,  0,  0,  0,  0,  0, 38, 39,
+    0,  0,  0,  0,  1,  2, 40, 41,  0,  1,  2,  2,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  2,  0,  0,  0,  0,
+    0,  0,  3,  4,  0,  0,  5,  0,  0,  0,  6,  0,  0,  0,  0,  0,
+    0,  0,  7,  1,  0,  0,  0,  0,  0,  0,  8,  9,  0,  0,  0,  0,
+    0,  0, 10,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0, 10,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0, 11, 12,
+    0, 13,  0, 14, 15, 16,  0,  0,  0,  0,  0,  1, 17, 18,  0, 19,
+    7,  1,  0,  0,  0, 20, 20,  7, 20, 20, 20, 20, 20, 20, 20,  8,
+   21,  0, 22,  0,  7, 23, 24,  0, 20, 20, 25,  0,  0,  0, 26, 27,
+    1,  7, 20, 20, 20, 20, 20,  1, 28, 29, 30, 31,  0,  0, 20,  0,
+    0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0, 20, 20,
+   20,  1,  0,  0,  8, 21, 32,  4,  0, 10,  0, 33,  7, 20, 20, 20,
+    0,  0,  0,  0,  8, 34, 34, 35, 36, 34, 37,  0, 38,  1, 20, 20,
+    0,  0, 39,  0,  1,  1,  0,  8, 21,  1, 20,  0,  0,  0,  1,  0,
+    0, 40,  1,  1,  0,  0,  8, 21,  0,  1,  0,  1,  0,  1,  0,  0,
+    0,  0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21,  7, 20, 41,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 21,  0, 42, 43, 44,  0, 45,
+    0,  8, 21,  0,  0,  0,  0,  0,  0,  0,  0, 46,  7,  1, 10,  1,
+    0,  0,  0,  1, 20, 20,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0, 26, 34,  9,  0,  0, 20, 20,  1, 20, 20,  0,  0,  0,  0,  0,
+    0,  0, 26, 21,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  3, 47, 48,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,
+    4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+    9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14, 15, 16, 17, 18,
+   19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24, 25, 26, 13, 13,
+   13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36,  7,  7,  7,  7,
+    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+   37,  7, 38, 39,  7, 40,  7,  7,  7, 41, 13, 42,  7,  7, 43,  7,
+   44, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
@@ -1716,201 +1716,202 @@ _hb_ucd_u8[17868] =
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-   13, 13, 13, 13, 45,  0,  0,  1,  2,  2,  2,  3,  4,  5,  6,  7,
-    8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
-   24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37,
-   37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
-   51, 52,  2,  2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59,
-   59, 59, 59, 59, 59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65,
-   66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 70, 70,
-   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45,  0,  0,  1,
+    2,  2,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
+   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+   32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42,
+   43, 44, 45, 46, 47, 48, 49, 50, 51, 52,  2,  2, 53, 54, 55, 56,
+   57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, 61, 61,
+   59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
+   74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
-   70, 79, 70, 70, 70, 70, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81,
-   82, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 32, 32,
-   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+   70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, 70, 70, 80, 80,
+   80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88,
+   89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-   32, 32, 32, 32, 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
-   96, 96, 96, 96, 96, 96, 96, 96, 70, 70, 97, 98, 99,100,101,101,
-  102,103,104,105,106,107,108,109,110,111, 96,112,113,114,115,116,
-  117,118,119,119,120,121,122,123,124,125,126,127,128,129,130,131,
-  132, 96,133,134,135,136,137,138,139,140,141,142,143, 96,144,145,
-   96,146,147,148,149, 96,150,151,152,153,154,155,156, 96,157,158,
-  159,160, 96,161,162,163,164,164,164,164,164,164,164,165,166,164,
-  167, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
-   96, 96, 96, 96, 96,168,169,169,169,169,169,169,169,169,170, 96,
-   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,171,171,
-  171,171,172, 96, 96, 96,173,173,173,173,174,175,176,177, 96, 96,
-   96, 96,178,179,180,181,182,182,182,182,182,182,182,182,182,182,
-  182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
-  182,182,182,182,182,183,182,182,182,182,182,182,184,184,184,185,
-  186, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
-   96, 96, 96, 96, 96,187,188,189,190,191,191,192, 96, 96, 96, 96,
-   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,193,194,
+   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 96, 96,
    96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
-   96, 96, 96, 96,195,196, 59,197,198,199,200,201,202, 96,203,204,
-  205, 59, 59,206, 59,207,208,208,208,208,208,209, 96, 96, 96, 96,
-   96, 96, 96, 96,210, 96,211,212,213, 96, 96,214, 96, 96, 96,215,
-   96, 96, 96, 96, 96,216,217,218,219, 96, 96, 96, 96, 96,220,221,
-  222, 96,223,224, 96, 96,225,226, 59,227,228, 96, 59, 59, 59, 59,
-   59, 59, 59,229,230,231,232,233, 59, 59,234,235, 59,236, 96, 96,
-   96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
-   70, 70, 70,237, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
-   70, 70, 70, 70,238, 70,239, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+   70, 70, 97, 98, 99,100,101,101,102,103,104,105,106,107,108,109,
+  110,111, 96,112,113,114,115,116,117,118,119,119,120,121,122,123,
+  124,125,126,127,128,129,130,131,132, 96,133,134,135,136,137,138,
+  139,140,141,142,143, 96,144,145, 96,146,147,148,149, 96,150,151,
+  152,153,154,155,156, 96,157,158,159,160, 96,161,162,163,164,164,
+  164,164,164,164,164,165,166,164,167, 96, 96, 96, 96, 96, 96, 96,
+   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,168,169,169,
+  169,169,169,169,169,169,170, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+   96, 96, 96, 96, 96, 96,171,171,171,171,172, 96, 96, 96,173,173,
+  173,173,174,175,176,177, 96, 96, 96, 96,178,179,180,181,182,182,
+  182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+  182,182,182,182,182,182,182,182,182,182,182,182,182,183,182,182,
+  182,182,182,182,184,184,184,185,186, 96, 96, 96, 96, 96, 96, 96,
+   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,187,188,189,
+  190,191,191,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+   96, 96, 96, 96, 96, 96,193,194, 96, 96, 96, 96, 96, 96, 96, 96,
+   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,195,196, 59,197,
+  198,199,200,201,202, 96,203,204,205, 59, 59,206, 59,207,208,208,
+  208,208,208,209, 96, 96, 96, 96, 96, 96, 96, 96,210, 96,211,212,
+  213, 96, 96,214, 96, 96, 96,215, 96, 96, 96, 96, 96,216,217,218,
+  219, 96, 96, 96, 96, 96,220,221,222, 96,223,224, 96, 96,225,226,
+   59,227,228, 96, 59, 59, 59, 59, 59, 59, 59,229,230,231,232,233,
+   59, 59,234,235, 59,236, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70,
+   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,237, 70, 70, 70, 70,
+   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,238, 70,239, 70,
    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
-   70, 70, 70,240, 70, 70, 70, 70, 70, 70, 70, 70, 70,241, 96, 96,
-   96, 96, 96, 96, 96, 96, 70, 70, 70, 70,242, 96, 96, 96, 96, 96,
-   96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70,243, 70, 70, 70,
-   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,244, 96, 96,
-   96, 96, 96, 96, 96, 96,245, 96,246,247,  0,  1,  2,  2,  0,  1,
-    2,  2,  2,  3,  4,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0, 19,
-   19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-   19,  0,  0,  0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0, 19, 19,
-   19, 19, 19, 19, 19,  0, 19,  0,  0,  0,  0,  0,  0,  0, 19, 19,
-   19, 19, 19,  0,  0,  0,  0,  0, 26, 26,  0,  0,  0,  0,  1,  1,
-    1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  0,  9,  9,  9,  2,  2,
-    9,  9,  9,  9,  0,  9,  2,  2,  2,  2,  9,  0,  9,  0,  9,  9,
-    9,  2,  9,  2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    2,  9,  9,  9,  9,  9,  9,  9, 55, 55, 55, 55, 55, 55, 55, 55,
-   55, 55, 55, 55, 55, 55,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-    6,  6,  6,  1,  1,  6,  2,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  2,  4,  4,
-    4,  2,  2,  4,  4,  4,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14,  2,  2,  2,  2,  2,  2,  2,  2, 14, 14,
-   14,  2,  2,  2,  2, 14, 14, 14, 14, 14, 14,  2,  2,  2,  3,  3,
-    3,  3,  3,  0,  3,  3,  3,  3,  3,  3,  0,  3,  3,  3,  3,  3,
-    3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  3,  3,  3,  0,  0,  3,
-    3,  3,  3,  3,  3,  3,  3,  3,  3,  1,  1,  1,  1,  1,  1,  1,
-    1,  1,  1,  1,  3,  3,  1,  3,  3,  3,  3,  3,  3,  3, 37, 37,
-   37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,  2, 37, 37, 37,
-   37,  2,  2, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
-    2,  2,  2,  2,  2,  2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-   64,  2,  2, 64, 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
-   90, 90, 90, 90,  2,  2, 90, 90, 90, 90, 90, 90, 90,  2, 95, 95,
-   95, 95, 95, 95, 95, 95, 95, 95, 95, 95,  2,  2, 95,  2, 37, 37,
-   37,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  2,  3,  3,
-    2,  2,  2,  2,  2,  2,  3,  3,  0,  3,  3,  3,  3,  3,  7,  7,
-    7,  7,  7,  7,  7,  7,  7,  1,  1,  1,  1,  7,  7,  7,  7,  7,
-    7,  7,  0,  0,  7,  7,  5,  5,  5,  5,  2,  5,  5,  5,  5,  5,
-    5,  5,  5,  2,  2,  5,  5,  2,  2,  5,  5,  5,  5,  5,  5,  5,
-    5,  5,  5,  5,  5,  5,  5,  2,  5,  5,  5,  5,  5,  5,  5,  2,
-    5,  2,  2,  2,  5,  5,  5,  5,  2,  2,  5,  5,  5,  5,  5,  2,
-    2,  5,  5,  5,  5,  2,  2,  2,  2,  2,  2,  2,  2,  5,  2,  2,
-    2,  2,  5,  5,  2,  5,  5,  5,  5,  5,  2,  2,  5,  5,  5,  5,
-    5,  5,  5,  5,  5,  2,  2, 11, 11, 11,  2, 11, 11, 11, 11, 11,
-   11,  2,  2,  2,  2, 11, 11,  2,  2, 11, 11, 11, 11, 11, 11, 11,
-   11, 11, 11, 11, 11, 11, 11,  2, 11, 11, 11, 11, 11, 11, 11,  2,
-   11, 11,  2, 11, 11,  2, 11, 11,  2,  2, 11,  2, 11, 11, 11,  2,
-    2, 11, 11, 11,  2,  2,  2, 11,  2,  2,  2,  2,  2,  2,  2, 11,
-   11, 11, 11,  2, 11,  2,  2,  2,  2,  2,  2,  2, 11, 11, 11, 11,
-   11, 11, 11, 11, 11,  2,  2, 10, 10, 10,  2, 10, 10, 10, 10, 10,
-   10, 10, 10, 10,  2, 10, 10, 10,  2, 10, 10, 10, 10, 10, 10, 10,
-   10, 10, 10, 10, 10, 10, 10,  2, 10, 10, 10, 10, 10, 10, 10,  2,
-   10, 10,  2, 10, 10, 10, 10, 10,  2,  2, 10, 10, 10, 10, 10, 10,
-    2, 10, 10, 10,  2,  2, 10,  2,  2,  2,  2,  2,  2,  2, 10, 10,
-   10, 10,  2,  2, 10, 10, 10, 10,  2,  2,  2,  2,  2,  2,  2, 10,
-   10, 10, 10, 10, 10, 10,  2, 21, 21, 21,  2, 21, 21, 21, 21, 21,
-   21, 21, 21,  2,  2, 21, 21,  2,  2, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21,  2, 21, 21, 21, 21, 21, 21, 21,  2,
-   21, 21,  2, 21, 21, 21, 21, 21,  2,  2, 21, 21, 21, 21, 21,  2,
-    2, 21, 21, 21,  2,  2,  2,  2,  2,  2,  2, 21, 21, 21,  2,  2,
-    2,  2, 21, 21,  2, 21, 21, 21, 21, 21,  2,  2, 21, 21,  2,  2,
-   22, 22,  2, 22, 22, 22, 22, 22, 22,  2,  2,  2, 22, 22, 22,  2,
-   22, 22, 22, 22,  2,  2,  2, 22, 22,  2, 22,  2, 22, 22,  2,  2,
-    2, 22, 22,  2,  2,  2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-    2,  2,  2,  2, 22, 22, 22,  2,  2,  2,  2,  2,  2, 22,  2,  2,
-    2,  2,  2,  2, 22, 22, 22, 22, 22,  2,  2,  2,  2,  2, 23, 23,
-   23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,  2, 23, 23, 23,  2,
-   23, 23, 23, 23, 23, 23, 23, 23,  2,  2, 23, 23, 23, 23, 23,  2,
-   23, 23, 23, 23,  2,  2,  2,  2,  2,  2,  2, 23, 23,  2, 23, 23,
-   23,  2,  2, 23,  2,  2, 23, 23, 23, 23,  2,  2, 23, 23,  2,  2,
-    2,  2,  2,  2,  2, 23, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-   16, 16, 16,  2, 16, 16, 16,  2, 16, 16, 16, 16, 16, 16, 16, 16,
-   16, 16,  2, 16, 16, 16, 16, 16,  2,  2, 16, 16, 16, 16, 16,  2,
-   16, 16, 16, 16,  2,  2,  2,  2,  2,  2,  2, 16, 16,  2, 16, 16,
-   16, 16,  2,  2, 16, 16,  2, 16, 16, 16,  2,  2,  2,  2, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,  2, 20, 20, 20,  2,
-   20, 20, 20, 20, 20, 20,  2,  2,  2,  2, 20, 20, 20, 20, 20, 20,
-   20, 20,  2,  2, 20, 20,  2, 36, 36, 36,  2, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,  2,  2,  2,
-   36, 36, 36, 36, 36, 36, 36, 36,  2, 36, 36, 36, 36, 36, 36, 36,
-   36, 36,  2, 36,  2,  2,  2,  2, 36,  2,  2,  2,  2, 36, 36, 36,
-   36, 36, 36,  2, 36,  2,  2,  2,  2,  2,  2,  2, 36, 36,  2,  2,
-   36, 36, 36,  2,  2,  2,  2, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-   24, 24, 24, 24, 24, 24, 24, 24, 24,  2,  2,  2,  2,  0, 24, 24,
-   24, 24,  2,  2,  2,  2,  2, 18, 18,  2, 18,  2, 18, 18, 18, 18,
-   18,  2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
-   18, 18,  2, 18,  2, 18, 18, 18, 18, 18, 18, 18,  2,  2, 18, 18,
-   18, 18, 18,  2, 18,  2, 18, 18, 18, 18, 18, 18, 18,  2, 18, 18,
-    2,  2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25,  2, 25,
-   25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,  2,  2,  2, 25, 25,
-   25, 25, 25,  2, 25, 25, 25, 25, 25, 25, 25,  0,  0,  0,  0, 25,
-   25,  2,  2,  2,  2,  2, 33, 33, 33, 33, 33, 33, 33, 33,  8,  8,
-    8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  2,  8,  2,  2,
-    2,  2,  2,  8,  2,  2,  8,  8,  8,  0,  8,  8,  8,  8, 12, 12,
-   12, 12, 12, 12, 12, 12, 30, 30, 30, 30, 30, 30, 30, 30, 30,  2,
-   30, 30, 30, 30,  2,  2, 30, 30, 30, 30, 30, 30, 30,  2, 30, 30,
-   30,  2,  2, 30, 30, 30, 30, 30, 30, 30, 30,  2,  2,  2, 30, 30,
-    2,  2,  2,  2,  2,  2, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
-   29, 29, 29, 29,  2,  2, 28, 28, 28, 28, 28, 28, 28, 28, 34, 34,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  2,  2,  2, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35,  0,  0,  0, 35, 35, 35,  2,
-    2,  2,  2,  2,  2,  2, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-   45, 45, 45, 45,  2,  2,  2,  2,  2,  2,  2,  2,  2, 45, 44, 44,
-   44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,  0,  0,  2, 43, 43,
-   43, 43, 43, 43, 43, 43, 43, 43, 43, 43,  2,  2,  2,  2, 46, 46,
-   46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,  2, 46, 46, 46,  2,
-   46, 46,  2,  2,  2,  2, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
-   31, 31, 31, 31,  2,  2, 31, 31,  2,  2,  2,  2,  2,  2, 32, 32,
-    0,  0, 32,  0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-    2,  2,  2,  2,  2,  2, 32,  2,  2,  2,  2,  2,  2,  2, 32, 32,
-   32,  2,  2,  2,  2,  2, 28, 28, 28, 28, 28, 28,  2,  2, 48, 48,
-   48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,  2, 48, 48,
-   48, 48,  2,  2,  2,  2, 48,  2,  2,  2, 48, 48, 48, 48, 52, 52,
-   52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,  2,  2, 52, 52,
-   52, 52, 52,  2,  2,  2, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
-   58, 58,  2,  2,  2,  2, 58, 58,  2,  2,  2,  2,  2,  2, 58, 58,
-   58,  2,  2,  2, 58, 58, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
-   54, 54,  2,  2, 54, 54, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
-   91, 91, 91, 91, 91,  2, 91, 91, 91, 91, 91,  2,  2, 91, 91, 91,
-    2,  2,  2,  2,  2,  2, 91, 91, 91, 91, 91, 91,  2,  2,  1,  1,
-    1,  1,  1,  1,  1,  2, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
-   62, 62, 62,  2,  2,  2, 62, 62, 62, 62, 62, 62, 62,  2, 76, 76,
-   76, 76, 76, 76, 76, 76, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
-   93, 93,  2,  2,  2,  2,  2,  2,  2,  2, 93, 93, 93, 93, 70, 70,
-   70, 70, 70, 70, 70, 70,  2,  2,  2, 70, 70, 70, 70, 70, 70, 70,
-    2,  2,  2, 70, 70, 70, 73, 73, 73, 73, 73, 73, 73, 73,  6,  2,
-    2,  2,  2,  2,  2,  2,  8,  8,  8,  2,  2,  8,  8,  8,  1,  1,
-    1,  0,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  0,
-    0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  1,
-    0,  2,  2,  2,  2,  2, 19, 19, 19, 19, 19, 19,  9,  9,  9,  9,
-    9,  6, 19, 19, 19, 19, 19, 19, 19, 19, 19,  9,  9,  9,  9,  9,
-   19, 19, 19, 19,  9,  9,  9,  9,  9, 19, 19, 19, 19, 19,  6, 19,
-   19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  9,  9,  9,
-    9,  9,  9,  9,  2,  2,  2,  9,  2,  9,  2,  9,  2,  9,  9,  9,
-    9,  9,  9,  2,  9,  9,  9,  9,  9,  9,  2,  2,  9,  9,  9,  9,
-    9,  9,  2,  9,  9,  9,  2,  2,  9,  9,  9,  2,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  2,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,
-    0,  0,  0,  2,  0,  0,  0, 19,  2,  2,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0,  0,  0,  2, 19, 19,
-   19, 19, 19,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  1,  2,
-    2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,
-   19, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 19,  0, 19,  0,
-    0,  0,  2,  2,  2,  2,  0,  0,  0,  2,  2,  2,  2,  2, 27, 27,
-   27, 27, 27, 27, 27, 27,  0,  0,  0,  0,  2,  2,  0,  0,  0,  0,
-    0,  0,  0,  0,  2,  0, 56, 56, 56, 56, 56, 56, 56, 56, 55, 55,
-   55, 55,  2,  2,  2,  2,  2, 55, 55, 55, 55, 55, 55, 55, 61, 61,
-   61, 61, 61, 61, 61, 61,  2,  2,  2,  2,  2,  2,  2, 61, 61,  2,
-    2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  2,  2, 13, 13,
-   13, 13, 13, 13, 13, 13, 13, 13,  2, 13, 13, 13, 13, 13, 13, 13,
-   13, 13,  2,  2,  2,  2, 13, 13, 13, 13, 13, 13,  2,  2,  0,  0,
-    0,  0,  2,  2,  2,  2,  0,  0,  0,  0,  0, 13,  0, 13,  0, 13,
+   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,240, 70, 70, 70, 70,
+   70, 70, 70, 70, 70,241, 70, 70, 70, 70,242, 96, 96, 96, 70, 70,
+   70, 70,243, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70,
+   70, 70, 70, 70,244, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+   70, 70, 70, 70, 70,245, 96, 96, 96, 96, 96, 96, 96, 96,246, 96,
+  247,248,  0,  1,  2,  2,  0,  1,  2,  2,  2,  3,  4,  5,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+   19, 19, 19, 19, 19, 19, 19, 19, 19,  0,  0,  0,  0,  0,  0,  0,
+   19,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19, 19, 19,  0, 19,  0,
+    0,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19,  0,  0,  0,  0,  0,
+   26, 26,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,
+    9,  9,  0,  9,  9,  9,  2,  2,  9,  9,  9,  9,  0,  9,  2,  2,
+    2,  2,  9,  0,  9,  0,  9,  9,  9,  2,  9,  2,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  2,  9,  9,  9,  9,  9,  9,  9,
+   55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,  6,  6,
+    6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  1,  1,  6,  2,  4,
+    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+    4,  4,  4,  4,  4,  2,  4,  4,  4,  2,  2,  4,  4,  4,  2, 14,
+   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  2,  2,
+    2,  2,  2,  2,  2,  2, 14, 14, 14,  2,  2,  2,  2, 14, 14, 14,
+   14, 14, 14,  2,  2,  2,  3,  3,  3,  3,  3,  0,  3,  3,  3,  3,
+    3,  3,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+    3,  0,  3,  3,  3,  0,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+    3,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  3,  1,  3,
+    3,  3,  3,  3,  3,  3, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+   37, 37, 37, 37,  2, 37, 37, 37, 37,  2,  2, 37, 37, 37, 38, 38,
+   38, 38, 38, 38, 38, 38, 38, 38,  2,  2,  2,  2,  2,  2, 64, 64,
+   64, 64, 64, 64, 64, 64, 64, 64, 64,  2,  2, 64, 64, 64, 90, 90,
+   90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,  2,  2, 90, 90,
+   90, 90, 90, 90, 90,  2, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+   95, 95,  2,  2, 95,  2, 37, 37, 37,  2,  2,  2,  2,  2,  3,  3,
+    3,  3,  3,  3,  3,  2,  3,  3,  2,  2,  2,  2,  2,  2,  3,  3,
+    0,  3,  3,  3,  3,  3,  7,  7,  7,  7,  7,  7,  7,  7,  7,  1,
+    1,  1,  1,  7,  7,  7,  7,  7,  7,  7,  0,  0,  7,  7,  5,  5,
+    5,  5,  2,  5,  5,  5,  5,  5,  5,  5,  5,  2,  2,  5,  5,  2,
+    2,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,
+    5,  5,  5,  5,  5,  5,  5,  2,  5,  2,  2,  2,  5,  5,  5,  5,
+    2,  2,  5,  5,  5,  5,  5,  2,  2,  5,  5,  5,  5,  2,  2,  2,
+    2,  2,  2,  2,  2,  5,  2,  2,  2,  2,  5,  5,  2,  5,  5,  5,
+    5,  5,  2,  2,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,  2, 11,
+   11, 11,  2, 11, 11, 11, 11, 11, 11,  2,  2,  2,  2, 11, 11,  2,
+    2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  2,
+   11, 11, 11, 11, 11, 11, 11,  2, 11, 11,  2, 11, 11,  2, 11, 11,
+    2,  2, 11,  2, 11, 11, 11,  2,  2, 11, 11, 11,  2,  2,  2, 11,
+    2,  2,  2,  2,  2,  2,  2, 11, 11, 11, 11,  2, 11,  2,  2,  2,
+    2,  2,  2,  2, 11, 11, 11, 11, 11, 11, 11, 11, 11,  2,  2, 10,
+   10, 10,  2, 10, 10, 10, 10, 10, 10, 10, 10, 10,  2, 10, 10, 10,
+    2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  2,
+   10, 10, 10, 10, 10, 10, 10,  2, 10, 10,  2, 10, 10, 10, 10, 10,
+    2,  2, 10, 10, 10, 10, 10, 10,  2, 10, 10, 10,  2,  2, 10,  2,
+    2,  2,  2,  2,  2,  2, 10, 10, 10, 10,  2,  2, 10, 10, 10, 10,
+    2,  2,  2,  2,  2,  2,  2, 10, 10, 10, 10, 10, 10, 10,  2, 21,
+   21, 21,  2, 21, 21, 21, 21, 21, 21, 21, 21,  2,  2, 21, 21,  2,
+    2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  2,
+   21, 21, 21, 21, 21, 21, 21,  2, 21, 21,  2, 21, 21, 21, 21, 21,
+    2,  2, 21, 21, 21, 21, 21,  2,  2, 21, 21, 21,  2,  2,  2,  2,
+    2,  2,  2, 21, 21, 21,  2,  2,  2,  2, 21, 21,  2, 21, 21, 21,
+   21, 21,  2,  2, 21, 21,  2,  2, 22, 22,  2, 22, 22, 22, 22, 22,
+   22,  2,  2,  2, 22, 22, 22,  2, 22, 22, 22, 22,  2,  2,  2, 22,
+   22,  2, 22,  2, 22, 22,  2,  2,  2, 22, 22,  2,  2,  2, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22,  2,  2,  2,  2, 22, 22, 22,  2,
+    2,  2,  2,  2,  2, 22,  2,  2,  2,  2,  2,  2, 22, 22, 22, 22,
+   22,  2,  2,  2,  2,  2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+   23, 23, 23,  2, 23, 23, 23,  2, 23, 23, 23, 23, 23, 23, 23, 23,
+    2,  2, 23, 23, 23, 23, 23,  2, 23, 23, 23, 23,  2,  2,  2,  2,
+    2,  2,  2, 23, 23,  2, 23, 23, 23,  2,  2, 23,  2,  2, 23, 23,
+   23, 23,  2,  2, 23, 23,  2,  2,  2,  2,  2,  2,  2, 23, 16, 16,
+   16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,  2, 16, 16, 16,  2,
+   16, 16, 16, 16, 16, 16, 16, 16, 16, 16,  2, 16, 16, 16, 16, 16,
+    2,  2, 16, 16, 16, 16, 16,  2, 16, 16, 16, 16,  2,  2,  2,  2,
+    2,  2,  2, 16, 16,  2, 16, 16, 16, 16,  2,  2, 16, 16,  2, 16,
+   16, 16,  2,  2,  2,  2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+   20, 20, 20,  2, 20, 20, 20,  2, 20, 20, 20, 20, 20, 20,  2,  2,
+    2,  2, 20, 20, 20, 20, 20, 20, 20, 20,  2,  2, 20, 20,  2, 36,
+   36, 36,  2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36,  2,  2,  2, 36, 36, 36, 36, 36, 36, 36, 36,
+    2, 36, 36, 36, 36, 36, 36, 36, 36, 36,  2, 36,  2,  2,  2,  2,
+   36,  2,  2,  2,  2, 36, 36, 36, 36, 36, 36,  2, 36,  2,  2,  2,
+    2,  2,  2,  2, 36, 36,  2,  2, 36, 36, 36,  2,  2,  2,  2, 24,
+   24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+   24,  2,  2,  2,  2,  0, 24, 24, 24, 24,  2,  2,  2,  2,  2, 18,
+   18,  2, 18,  2, 18, 18, 18, 18, 18,  2, 18, 18, 18, 18, 18, 18,
+   18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  2, 18,  2, 18, 18, 18,
+   18, 18, 18, 18,  2,  2, 18, 18, 18, 18, 18,  2, 18,  2, 18, 18,
+   18, 18, 18, 18, 18,  2, 18, 18,  2,  2, 18, 18, 18, 18, 25, 25,
+   25, 25, 25, 25, 25, 25,  2, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+   25, 25, 25,  2,  2,  2, 25, 25, 25, 25, 25,  2, 25, 25, 25, 25,
+   25, 25, 25,  0,  0,  0,  0, 25, 25,  2,  2,  2,  2,  2, 33, 33,
+   33, 33, 33, 33, 33, 33,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    8,  8,  8,  8,  2,  8,  2,  2,  2,  2,  2,  8,  2,  2,  8,  8,
+    8,  0,  8,  8,  8,  8, 12, 12, 12, 12, 12, 12, 12, 12, 30, 30,
+   30, 30, 30, 30, 30, 30, 30,  2, 30, 30, 30, 30,  2,  2, 30, 30,
+   30, 30, 30, 30, 30,  2, 30, 30, 30,  2,  2, 30, 30, 30, 30, 30,
+   30, 30, 30,  2,  2,  2, 30, 30,  2,  2,  2,  2,  2,  2, 29, 29,
+   29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,  2,  2, 28, 28,
+   28, 28, 28, 28, 28, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34,  2,  2,  2, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35,  0,  0,  0, 35, 35, 35,  2,  2,  2,  2,  2,  2,  2, 45, 45,
+   45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,  2,  2,  2,  2,
+    2,  2,  2,  2,  2, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+   44, 44, 44,  0,  0,  2, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+   43, 43,  2,  2,  2,  2, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+   46, 46, 46,  2, 46, 46, 46,  2, 46, 46,  2,  2,  2,  2, 31, 31,
+   31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,  2,  2, 31, 31,
+    2,  2,  2,  2,  2,  2, 32, 32,  0,  0, 32,  0, 32, 32, 32, 32,
+   32, 32, 32, 32, 32, 32, 32, 32,  2,  2,  2,  2,  2,  2, 32,  2,
+    2,  2,  2,  2,  2,  2, 32, 32, 32,  2,  2,  2,  2,  2, 28, 28,
+   28, 28, 28, 28,  2,  2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+   48, 48, 48, 48, 48,  2, 48, 48, 48, 48,  2,  2,  2,  2, 48,  2,
+    2,  2, 48, 48, 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+   52, 52, 52, 52,  2,  2, 52, 52, 52, 52, 52,  2,  2,  2, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58,  2,  2,  2,  2, 58, 58,
+    2,  2,  2,  2,  2,  2, 58, 58, 58,  2,  2,  2, 58, 58, 54, 54,
+   54, 54, 54, 54, 54, 54, 54, 54, 54, 54,  2,  2, 54, 54, 91, 91,
+   91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,  2, 91, 91,
+   91, 91, 91,  2,  2, 91, 91, 91,  2,  2,  2,  2,  2,  2, 91, 91,
+   91, 91, 91, 91,  2,  2,  1,  1,  1,  1,  1,  1,  1,  2, 62, 62,
+   62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,  2,  2,  2, 62, 62,
+   62, 62, 62, 62, 62,  2, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93,
+   93, 93, 93, 93, 93, 93, 93, 93, 93, 93,  2,  2,  2,  2,  2,  2,
+    2,  2, 93, 93, 93, 93, 70, 70, 70, 70, 70, 70, 70, 70,  2,  2,
+    2, 70, 70, 70, 70, 70, 70, 70,  2,  2,  2, 70, 70, 70, 73, 73,
+   73, 73, 73, 73, 73, 73,  6,  2,  2,  2,  2,  2,  2,  2,  8,  8,
+    8,  2,  2,  8,  8,  8,  1,  1,  1,  0,  1,  1,  1,  1,  1,  0,
+    1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,
+    0,  0,  1,  0,  0,  0,  1,  1,  0,  2,  2,  2,  2,  2, 19, 19,
+   19, 19, 19, 19,  9,  9,  9,  9,  9,  6, 19, 19, 19, 19, 19, 19,
+   19, 19, 19,  9,  9,  9,  9,  9, 19, 19, 19, 19,  9,  9,  9,  9,
+    9, 19, 19, 19, 19, 19,  6, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+   19, 19, 19, 19, 19,  9,  9,  9,  9,  9,  9,  9,  2,  2,  2,  9,
+    2,  9,  2,  9,  2,  9,  9,  9,  9,  9,  9,  2,  9,  9,  9,  9,
+    9,  9,  2,  2,  9,  9,  9,  9,  9,  9,  2,  9,  9,  9,  2,  2,
+    9,  9,  9,  2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  0,  0,
+    0,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0, 19,
+    2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 19,  0,  0,
+    0,  0,  0,  0,  0,  2, 19, 19, 19, 19, 19,  2,  2,  2,  0,  2,
+    2,  2,  2,  2,  2,  2,  1,  2,  2,  2,  2,  2,  2,  2,  0,  0,
+    0,  0,  0,  0,  9,  0,  0,  0, 19, 19,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 19,  0, 19,  0,  0,  0,  2,  2,  2,  2,  0,  0,
+    0,  2,  2,  2,  2,  2, 27, 27, 27, 27, 27, 27, 27, 27,  0,  0,
+    0,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0, 56, 56,
+   56, 56, 56, 56, 56, 56, 55, 55, 55, 55,  2,  2,  2,  2,  2, 55,
+   55, 55, 55, 55, 55, 55, 61, 61, 61, 61, 61, 61, 61, 61,  2,  2,
+    2,  2,  2,  2,  2, 61, 61,  2,  2,  2,  2,  2,  2,  2,  0,  0,
+    0,  0,  0,  0,  2,  2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    2, 13, 13, 13, 13, 13, 13, 13, 13, 13,  2,  2,  2,  2, 13, 13,
+   13, 13, 13, 13,  2,  2,  0,  0,  0,  0,  0, 13,  0, 13,  0, 13,
    13, 13, 13, 13, 13, 13, 13, 13,  1,  1,  1,  1, 12, 12, 13, 13,
    13, 13,  0,  0,  0,  0,  2, 15, 15, 15, 15, 15, 15, 15, 15, 15,
    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  2,  2,  1,
     1,  0,  0, 15, 15, 15,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0, 17, 17, 17,  2,  2,
     2,  2,  2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,  2, 12,
-   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  2, 12, 12,
+   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  2,  0,  0,
+    0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0, 12, 12,
    12, 12, 12, 12, 12,  0, 17, 17, 17, 17, 17, 17, 17,  0, 39, 39,
    39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,  2,  2,  2, 39, 39,
    39, 39, 39, 39, 39,  2, 86, 86, 86, 86, 86, 86, 86, 86, 77, 77,
@@ -2190,7 +2191,7 @@ _hb_ucd_u8[17868] =
     0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,
 };
 static const uint16_t
-_hb_ucd_u16[9320] =
+_hb_ucd_u16[9344] =
 {
      0,   0,   1,   2,   3,   4,   5,   6,   0,   0,   7,   8,   9,  10,  11,  12,
     13,  13,  13,  14,  15,  13,  13,  16,  17,  18,  19,  20,  21,  22,  13,  23,
@@ -2233,9 +2234,9 @@ _hb_ucd_u16[9320] =
    209, 306, 209, 209, 209, 209, 209, 209,   9,   9,   9,  11,  11,  11, 307, 308,
     13,  13,  13,  13,  13,  13, 309, 310,  11,  11, 311,  48,  48,  48, 312, 313,
     48, 314, 315, 315, 315, 315,  32,  32, 316, 317, 318, 319, 320, 321, 140, 140,
-   209, 322, 209, 209, 209, 209, 209, 323, 209, 209, 209, 209, 209, 324, 140, 325,
-   326, 327, 328, 329, 136,  48,  48,  48,  48, 330, 178,  48,  48,  48,  48, 331,
-   332,  48,  48, 136,  48,  48,  48,  48, 200, 333,  48,  48, 209, 209, 323,  48,
+   209, 322, 209, 209, 209, 209, 209, 323, 209, 209, 209, 209, 209, 324, 140, 209,
+   325, 326, 327, 328, 136,  48,  48,  48,  48, 329, 178,  48,  48,  48,  48, 330,
+   331,  48,  48, 136,  48,  48,  48,  48, 200, 332,  48,  48, 209, 209, 333,  48,
    209, 334, 335, 209, 336, 337, 209, 209, 335, 209, 209, 337, 209, 209, 209, 209,
     48,  48,  48,  48, 209, 209, 209, 209,  48, 338,  48,  48,  48,  48,  48,  48,
    151, 209, 209, 209, 287,  48,  48, 229, 339,  48, 340, 140,  13,  13, 341, 342,
@@ -2306,475 +2307,476 @@ _hb_ucd_u16[9320] =
      9,   9, 607,  11, 654, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 499,
    271, 271, 655, 656, 140, 140, 140, 140, 499, 271, 657, 658, 140, 140, 140, 140,
    659,  48, 660, 661, 662, 663, 664, 665, 666, 206, 667, 206, 140, 140, 140, 668,
-   209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 669, 669, 669, 209, 324,
-   670, 209, 209, 209, 209, 209, 209, 209, 209, 209, 671, 140, 140, 140, 672, 209,
-   673, 209, 209, 325, 674, 675, 324, 140, 209, 209, 209, 209, 209, 209, 209, 676,
-   209, 209, 209, 209, 209, 677, 426, 426, 209, 209, 209, 209, 209, 209, 209, 678,
-   209, 209, 209, 209, 209, 176, 325, 427, 325, 209, 209, 209, 679, 176, 209, 209,
-   679, 209, 671, 675, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 671, 426,
-   674, 209, 209, 680, 681, 325, 674, 674, 209, 682, 209, 209, 288, 140, 140, 192,
+   209, 209, 669, 209, 209, 209, 209, 209, 209, 323, 334, 670, 670, 670, 209, 324,
+   671, 209, 209, 209, 209, 209, 209, 209, 209, 209, 672, 140, 140, 140, 673, 209,
+   674, 209, 209, 669, 675, 676, 324, 140, 209, 209, 209, 209, 209, 209, 209, 677,
+   209, 209, 209, 209, 209, 678, 426, 426, 209, 209, 209, 209, 209, 209, 209, 679,
+   209, 209, 209, 209, 209, 176, 669, 427, 669, 209, 209, 209, 680, 176, 209, 209,
+   680, 209, 672, 676, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 672, 426,
+   675, 209, 209, 681, 682, 669, 675, 675, 209, 683, 209, 209, 288, 140, 140, 192,
     48,  48,  48,  48,  48,  48, 140, 140,  48,  48,  48, 207,  48,  48,  48,  48,
     48, 204,  48,  48,  48,  48,  48,  48,  48,  48, 478,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48, 100, 140,  48, 204, 140, 140, 140, 140, 140, 140,
-    48,  48,  48,  48,  71,  48,  48,  48,  48,  48,  48, 140, 140, 140, 140, 140,
-   683, 140, 570, 570, 570, 570, 570, 570,  32,  32,  32,  32,  32,  32,  32,  32,
-    32,  32,  32,  32,  32,  32,  32, 140, 391, 391, 391, 391, 391, 391, 391, 684,
-   391, 391, 391, 391, 391, 391, 391, 685,   0,   0,   0,   0,   0,   0,   0,   0,
-     1,   2,   2,   3,   1,   2,   2,   3,   0,   0,   0,   0,   0,   4,   0,   4,
-     2,   2,   5,   2,   2,   2,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   6,
-     0,   0,   0,   0,   7,   8,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,
-     9,   9,   9,   9,   9,   9,  10,  11,  12,  13,  14,  14,  15,  14,  14,  14,
-    14,  14,  14,  14,  16,  17,  14,  14,  18,  18,  18,  18,  18,  18,  18,  18,
-    18,  18,  18,  18,  18,  18,  18,  18,  19,  18,  18,  18,  18,  18,  18,  18,
-    18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  20,  21,
-    21,  21,  22,  20,  21,  21,  21,  21,  21,  23,  24,  25,  25,  25,  25,  25,
-    25,  26,  25,  25,  25,  27,  28,  26,  29,  30,  31,  32,  31,  31,  31,  31,
-    33,  34,  35,  31,  31,  31,  36,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-    31,  31,  31,  29,  31,  31,  31,  31,  37,  38,  37,  37,  37,  37,  37,  37,
-    37,  39,  31,  31,  31,  31,  31,  31,  40,  40,  40,  40,  40,  40,  41,  26,
-    42,  42,  42,  42,  42,  42,  42,  43,  44,  44,  44,  44,  44,  45,  44,  46,
-    47,  47,  47,  48,  37,  49,  31,  31,  31,  50,  51,  31,  31,  31,  31,  31,
-    31,  31,  31,  31,  52,  31,  31,  31,  53,  53,  53,  53,  53,  53,  53,  53,
-    53,  53,  54,  53,  55,  53,  53,  53,  56,  57,  58,  59,  59,  60,  61,  62,
-    57,  63,  64,  65,  66,  59,  59,  67,  68,  69,  70,  71,  71,  72,  73,  74,
-    69,  75,  76,  77,  78,  71,  79,  26,  80,  81,  82,  83,  83,  84,  85,  86,
-    81,  87,  88,  26,  89,  83,  90,  91,  92,  93,  94,  95,  95,  96,  97,  98,
-    93,  99, 100, 101, 102,  95,  95,  26, 103, 104, 105, 106, 107, 104, 108, 109,
-   104, 105, 110,  26, 111, 108, 108, 112, 113, 114, 115, 113, 113, 115, 113, 116,
-   114, 117, 118, 119, 120, 113, 121, 113, 122, 123, 124, 122, 122, 124, 125, 126,
-   123, 127, 128, 128, 129, 122, 130,  26, 131, 132, 133, 131, 131, 131, 131, 131,
-   132, 133, 134, 131, 135, 131, 131, 131, 136, 137, 138, 139, 137, 137, 140, 141,
-   138, 142, 143, 137, 144, 137, 145,  26, 146, 147, 147, 147, 147, 147, 147, 148,
-   147, 147, 147, 149,  26,  26,  26,  26, 150, 151, 152, 152, 153, 152, 152, 154,
-   155, 156, 152, 157,  26,  26,  26,  26, 158, 158, 158, 158, 158, 158, 158, 158,
-   158, 159, 158, 158, 158, 160, 159, 158, 158, 158, 158, 159, 158, 158, 158, 161,
-   158, 161, 162, 163,  26,  26,  26,  26, 164, 164, 164, 164, 164, 164, 164, 164,
-   164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
-   166, 167, 165, 165, 165, 165, 165, 168, 169, 169, 169, 169, 169, 169, 169, 169,
-   169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170, 170, 170,
-   170, 171, 172, 171, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 171, 172,
-   171, 170, 172, 170, 170, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 170,
-   170, 170, 170, 173, 170, 170, 170, 174, 170, 170, 170, 175, 176, 176, 176, 176,
-   176, 176, 176, 176, 176, 176, 177, 177, 178, 178, 178, 178, 178, 178, 178, 178,
-   178, 178, 178, 178, 178, 178, 178, 178, 179, 179, 179, 180, 181, 181, 181, 181,
-   181, 181, 181, 181, 181, 182, 181, 183, 184, 184, 185, 186, 187, 187, 188,  26,
-   189, 189, 190,  26, 191, 192, 193,  26, 194, 194, 194, 194, 194, 194, 194, 194,
-   194, 194, 194, 195, 194, 196, 194, 196, 197, 198, 198, 199, 198, 198, 198, 198,
-   198, 198, 198, 198, 198, 198, 198, 200, 198, 198, 198, 198, 198, 201, 178, 178,
-   178, 178, 178, 178, 178, 178, 202,  26, 203, 203, 203, 204, 203, 205, 203, 205,
-   206, 203, 207, 207, 207, 208, 209,  26, 210, 210, 210, 210, 210, 211, 210, 210,
-   210, 212, 210, 213, 194, 194, 194, 194, 214, 214, 214, 215, 216, 216, 216, 216,
-   216, 216, 216, 217, 216, 216, 216, 218, 216, 219, 216, 219, 216, 220,   9,   9,
-     9, 221,  26,  26,  26,  26,  26,  26, 222, 222, 222, 222, 222, 222, 222, 222,
-   222, 223, 222, 222, 222, 222, 222, 224, 225, 225, 225, 225, 225, 225, 225, 225,
-   226, 226, 226, 226, 226, 226, 227, 228, 229, 229, 229, 229, 229, 229, 229, 230,
-   229, 231, 232, 232, 232, 232, 232, 232,  18, 233, 165, 165, 165, 165, 165, 234,
-   225,  26, 235,   9, 236, 237, 238, 239,   2,   2,   2,   2, 240, 241,   2,   2,
-     2,   2,   2, 242, 243, 244,   2, 245,   2,   2,   2,   2,   2,   2,   2, 246,
-     9,   9,   9,   9,   9,   9,   9,   9,  14,  14, 247, 247,  14,  14,  14,  14,
-   247, 247,  14, 248,  14,  14,  14, 247,  14,  14,  14,  14,  14,  14, 249,  14,
-   249,  14, 250, 251,  14,  14, 252, 253,   0, 254,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0, 255,   0, 256, 257,   0, 258,   2, 259,   0,   0,   0,   0,
-   260,  26,   9,   9,   9,   9, 261,  26,   0,   0,   0,   0, 262, 263,   4,   0,
-     0, 264,   0,   0,   2,   2,   2,   2,   2, 265,   0,   0,   0,   0,   0,   0,
+    48,  48,  48,  48,  48,  48, 100,  48,  48,  48,  48,  48,  48, 204, 140, 140,
+    48, 204, 140, 140, 140, 140, 140, 140,  48,  48,  48,  48,  71,  48,  48,  48,
+    48,  48,  48, 140, 140, 140, 140, 140, 684, 140, 570, 570, 570, 570, 570, 570,
+    32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 140,
+   391, 391, 391, 391, 391, 391, 391, 685, 391, 391, 391, 391, 391, 391, 391, 686,
+     0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   2,   3,   1,   2,   2,   3,
+     0,   0,   0,   0,   0,   4,   0,   4,   2,   2,   5,   2,   2,   2,   5,   2,
+     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+     2,   2,   2,   2,   2,   2,   2,   6,   0,   0,   0,   0,   7,   8,   0,   0,
+     9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,  11,
+    12,  13,  14,  14,  15,  14,  14,  14,  14,  14,  14,  14,  16,  17,  14,  14,
+    18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+    19,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+    18,  18,  18,  18,  18,  18,  20,  21,  21,  21,  22,  20,  21,  21,  21,  21,
+    21,  23,  24,  25,  25,  25,  25,  25,  25,  26,  25,  25,  25,  27,  28,  26,
+    29,  30,  31,  32,  31,  31,  31,  31,  33,  34,  35,  31,  31,  31,  36,  31,
+    31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  29,  31,  31,  31,  31,
+    37,  38,  37,  37,  37,  37,  37,  37,  37,  39,  31,  31,  31,  31,  31,  31,
+    40,  40,  40,  40,  40,  40,  41,  26,  42,  42,  42,  42,  42,  42,  42,  43,
+    44,  44,  44,  44,  44,  45,  44,  46,  47,  47,  47,  48,  37,  49,  31,  31,
+    31,  50,  51,  31,  31,  31,  31,  31,  31,  31,  31,  31,  52,  31,  31,  31,
+    53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  54,  53,  55,  53,  53,  53,
+    56,  57,  58,  59,  59,  60,  61,  62,  57,  63,  64,  65,  66,  59,  59,  67,
+    68,  69,  70,  71,  71,  72,  73,  74,  69,  75,  76,  77,  78,  71,  79,  26,
+    80,  81,  82,  83,  83,  84,  85,  86,  81,  87,  88,  26,  89,  83,  90,  91,
+    92,  93,  94,  95,  95,  96,  97,  98,  93,  99, 100, 101, 102,  95,  95,  26,
+   103, 104, 105, 106, 107, 104, 108, 109, 104, 105, 110,  26, 111, 108, 108, 112,
+   113, 114, 115, 113, 113, 115, 113, 116, 114, 117, 118, 119, 120, 113, 121, 113,
+   122, 123, 124, 122, 122, 124, 125, 126, 123, 127, 128, 128, 129, 122, 130,  26,
+   131, 132, 133, 131, 131, 131, 131, 131, 132, 133, 134, 131, 135, 131, 131, 131,
+   136, 137, 138, 139, 137, 137, 140, 141, 138, 142, 143, 137, 144, 137, 145,  26,
+   146, 147, 147, 147, 147, 147, 147, 148, 147, 147, 147, 149,  26,  26,  26,  26,
+   150, 151, 152, 152, 153, 152, 152, 154, 155, 156, 152, 157,  26,  26,  26,  26,
+   158, 158, 158, 158, 158, 158, 158, 158, 158, 159, 158, 158, 158, 160, 159, 158,
+   158, 158, 158, 159, 158, 158, 158, 161, 158, 161, 162, 163,  26,  26,  26,  26,
+   164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+   164, 164, 164, 164, 165, 165, 165, 165, 166, 167, 165, 165, 165, 165, 165, 168,
+   169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+   170, 170, 170, 170, 170, 170, 170, 170, 170, 171, 172, 171, 170, 170, 170, 170,
+   170, 171, 170, 170, 170, 170, 171, 172, 171, 170, 172, 170, 170, 170, 170, 170,
+   170, 170, 171, 170, 170, 170, 170, 170, 170, 170, 170, 173, 170, 170, 170, 174,
+   170, 170, 170, 175, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 177, 177,
+   178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+   179, 179, 179, 180, 181, 181, 181, 181, 181, 181, 181, 181, 181, 182, 181, 183,
+   184, 184, 185, 186, 187, 187, 188,  26, 189, 189, 190,  26, 191, 192, 193,  26,
+   194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 195, 194, 196, 194, 196,
+   197, 198, 198, 199, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 200,
+   198, 198, 198, 198, 198, 201, 178, 178, 178, 178, 178, 178, 178, 178, 202,  26,
+   203, 203, 203, 204, 203, 205, 203, 205, 206, 203, 207, 207, 207, 208, 209,  26,
+   210, 210, 210, 210, 210, 211, 210, 210, 210, 212, 210, 213, 194, 194, 194, 194,
+   214, 214, 214, 215, 216, 216, 216, 216, 216, 216, 216, 217, 216, 216, 216, 218,
+   216, 219, 216, 219, 216, 220,   9,   9,   9, 221,  26,  26,  26,  26,  26,  26,
+   222, 222, 222, 222, 222, 222, 222, 222, 222, 223, 222, 222, 222, 222, 222, 224,
+   225, 225, 225, 225, 225, 225, 225, 225, 226, 226, 226, 226, 226, 226, 227, 228,
+   229, 229, 229, 229, 229, 229, 229, 230, 229, 231, 232, 232, 232, 232, 232, 232,
+    18, 233, 165, 165, 165, 165, 165, 234, 225,  26, 235,   9, 236, 237, 238, 239,
+     2,   2,   2,   2, 240, 241,   2,   2,   2,   2,   2, 242, 243, 244,   2, 245,
+     2,   2,   2,   2,   2,   2,   2, 246,   9,   9,   9,   9,   9,   9,   9,   9,
+    14,  14, 247, 247,  14,  14,  14,  14, 247, 247,  14, 248,  14,  14,  14, 247,
+    14,  14,  14,  14,  14,  14, 249,  14, 249,  14, 250, 251,  14,  14, 252, 253,
+     0, 254,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255,   0, 256, 257,
+     0, 258,   2, 259,   0,   0,   0,   0, 260,  26,   9,   9,   9,   9, 261,  26,
+     0,   0,   0,   0, 262, 263,   4,   0,   0, 264,   0,   0,   2,   2,   2,   2,
+     2, 265,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 258,  26,  26,  26,
-     0, 266,  26,  26,   0,   0,   0,   0, 267, 267, 267, 267, 267, 267, 267, 267,
-   267, 267, 267, 267, 267, 267, 267, 267,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0, 268,   0,   0,   0, 269,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0, 270, 270, 270, 270, 270, 270, 270, 270,
-   270, 270, 270, 270,   2,   2,   2,   2,  17,  17,  17,  17,  17,  17,  17,  17,
-    17,  17,  17,  17,  17,  17, 271, 272, 165, 165, 165, 165, 166, 167, 273, 273,
-   273, 273, 273, 273, 273, 274, 275, 274, 170, 170, 172,  26, 172, 172, 172, 172,
-   172, 172, 172, 172,  18,  18,  18,  18,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0, 276,  26,  26,  26,  26, 277, 277, 277, 278, 277, 277, 277, 277,
-   277, 277, 277, 277, 277, 277, 279,  26, 277, 277, 277, 277, 277, 277, 277, 277,
+     0,   0,   0,   0, 258,  26,  26,  26,   0, 266,  26,  26,   0,   0,   0,   0,
+   267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 268,   0,
+     0,   0, 269,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+   270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,   2,   2,   2,   2,
+    17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17, 271, 272,
+   165, 165, 165, 165, 166, 167, 273, 273, 273, 273, 273, 273, 273, 274, 275, 274,
+   170, 170, 172,  26, 172, 172, 172, 172, 172, 172, 172, 172,  18,  18,  18,  18,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 276,  26,  26,  26,  26,
+   277, 277, 277, 278, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 279,  26,
    277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
-   277, 277, 280,  26,  26,  26,   0, 281, 282,   0,   0,   0, 283, 284,   0, 285,
-   286, 287, 287, 287, 287, 287, 287, 287, 287, 287, 288, 289, 290, 291, 291, 291,
-   291, 291, 291, 291, 291, 291, 291, 292, 293, 294, 294, 294, 294, 294, 295, 169,
-   169, 169, 169, 169, 169, 169, 169, 169, 169, 296,   0,   0, 294, 294, 294, 294,
-     0,   0,   0,   0, 281,  26, 291, 291, 169, 169, 169, 296,   0,   0,   0,   0,
-     0,   0,   0,   0, 169, 169, 169, 297,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0, 291, 291, 291, 291, 291, 298, 291, 291, 291, 291, 291, 291, 291, 291,
-   291, 291, 291,   0,   0,   0,   0,   0, 277, 277, 277, 277, 277, 277, 277, 277,
-     0,   0,   0,   0,   0,   0,   0,   0, 299, 299, 299, 299, 299, 299, 299, 299,
-   299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 299, 299, 299, 299, 299, 299,
-   301,  26, 302, 302, 302, 302, 302, 302, 303, 303, 303, 303, 303, 303, 303, 303,
-   303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 304,  26,  26,
-    18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18, 305, 305, 305, 305,
-   305, 305, 305, 305, 305, 305, 305,  26,   0,   0,   0,   0, 306,   2,   2,   2,
-     2,   2,   2,   2,   2,   2,   2,   2,   2, 307,   2,   2,   2,   2,   2,   2,
-     2, 308, 309, 310,  26,  26, 311,   2, 312, 312, 312, 312, 312, 313,   0, 314,
-   315, 315, 315, 315, 315, 315, 315,  26, 316, 316, 316, 316, 316, 316, 316, 316,
-   317, 318, 316, 319,  53,  53,  53,  53, 320, 320, 320, 320, 320, 321, 322, 322,
-   322, 322, 323, 324, 169, 169, 169, 325, 326, 326, 326, 326, 326, 326, 326, 326,
-   326, 327, 326, 328, 164, 164, 164, 329, 330, 330, 330, 330, 330, 330, 331,  26,
-   330, 332, 330, 333, 164, 164, 164, 164, 334, 334, 334, 334, 334, 334, 334, 334,
-   335,  26,  26, 336, 337, 337, 338,  26, 339, 339, 339,  26, 172, 172,   2,   2,
-     2,   2,   2, 340, 341, 342, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
-   337, 337, 337, 337, 337, 343, 337, 344, 169, 169, 169, 169, 345,  26, 169, 169,
-   296, 346, 169, 169, 169, 169, 169, 345,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 277, 277, 277, 277, 277, 277, 277, 277,
-   277, 277, 277, 277, 277, 280, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
-   277, 277, 277, 347,  26,  26,  26,  26, 348,  26, 349, 350,  25,  25, 351, 352,
-   353,  25,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-   354,  26, 355,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-    31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 356,
-    31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 357,  31,  31,  31,  31,  31,
-    31, 358,  26,  26,  26,  26,  31,  31,   9,   9,   0, 314,   9, 359,   0,   0,
-     0,   0, 360,   0, 258, 281, 361,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-    31,  31,  31,  31,  31,  31,  31, 362, 363,   0,   0,   0,   1,   2,   2,   3,
-     1,   2,   2,   3, 364, 291, 290, 291, 291, 291, 291, 365, 169, 169, 169, 296,
-   366, 366, 366, 367, 258, 258,  26, 368, 369, 370, 369, 369, 371, 369, 369, 372,
-   369, 373, 369, 373,  26,  26,  26,  26, 369, 369, 369, 369, 369, 369, 369, 369,
-   369, 369, 369, 369, 369, 369, 369, 374, 375,   0,   0,   0,   0,   0, 376,   0,
-    14,  14,  14,  14,  14,  14,  14,  14,  14, 253,   0, 377, 378,  26,  26,  26,
-    26,  26,   0,   0,   0,   0,   0, 379, 380, 380, 380, 381, 382, 382, 382, 382,
-   382, 382, 383,  26, 384,   0,   0, 281, 385, 385, 385, 385, 386, 387, 388, 388,
-   388, 389, 390, 390, 390, 390, 390, 391, 392, 392, 392, 393, 394, 394, 394, 394,
-   395, 394, 396,  26,  26,  26,  26,  26, 397, 397, 397, 397, 397, 397, 397, 397,
-   397, 397, 398, 398, 398, 398, 398, 398, 399, 399, 399, 400, 399, 401, 402, 402,
-   402, 402, 403, 402, 402, 402, 402, 403, 404, 404, 404, 404, 404,  26, 405, 405,
-   405, 405, 405, 405, 406, 407, 408, 409, 408, 409, 410, 408, 411, 408, 411, 412,
-    26,  26,  26,  26,  26,  26,  26,  26, 413, 413, 413, 413, 413, 413, 413, 413,
-   413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 414,  26,
-   413, 413, 415,  26, 413,  26,  26,  26, 416,   2,   2,   2,   2,   2, 417, 308,
-    26,  26,  26,  26,  26,  26,  26,  26, 418, 419, 420, 420, 420, 420, 421, 422,
-   423, 423, 424, 423, 425, 425, 425, 425, 426, 426, 426, 427, 428, 426,  26,  26,
-    26,  26,  26,  26, 429, 429, 430, 431, 432, 432, 432, 433, 434, 434, 434, 435,
-    26,  26,  26,  26,  26,  26,  26,  26, 436, 436, 436, 436, 437, 437, 437, 438,
-   437, 437, 439, 437, 437, 437, 437, 437, 440, 441, 442, 443, 444, 444, 445, 446,
-   444, 447, 444, 447, 448, 448, 448, 448, 449, 449, 449, 449,  26,  26,  26,  26,
-   450, 450, 450, 450, 451, 452, 451,  26, 453, 453, 453, 453, 453, 453, 454, 455,
-   456, 456, 457, 456, 458, 458, 459, 458, 460, 460, 461, 462,  26, 463,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 464, 464, 464, 464, 464, 464, 464, 464,
-   464, 465,  26,  26,  26,  26,  26,  26, 466, 466, 466, 466, 466, 466, 467,  26,
-   466, 466, 466, 466, 466, 466, 467, 468, 469, 469, 469, 469, 469,  26, 469, 470,
-    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  31,  31,  31,  50, 471, 471, 471, 471, 471, 472, 473,  26,
-    26,  26,  26,  26,  26,  26,  26, 474, 475, 475, 475, 475, 475,  26, 476, 476,
-   476, 476, 476, 477,  26,  26, 478, 478, 478, 479,  26,  26,  26,  26, 480, 480,
-   480, 481,  26,  26, 482, 482, 483,  26, 484, 484, 484, 484, 484, 484, 484, 484,
-   484, 485, 486, 484, 484, 484, 485, 487, 488, 488, 488, 488, 488, 488, 488, 488,
-   489, 490, 491, 491, 491, 492, 491, 493, 494, 494, 494, 494, 494, 494, 495, 494,
-   494,  26, 496, 496, 496, 496, 497,  26, 498, 498, 498, 498, 498, 498, 498, 498,
-   498, 498, 498, 498, 499, 137, 500,  26, 501, 501, 502, 501, 501, 501, 501, 501,
-   503,  26,  26,  26,  26,  26,  26,  26, 504, 505, 506, 507, 506, 508, 509, 509,
-   509, 509, 509, 509, 509, 510, 509, 511, 512, 513, 514, 515, 515, 516, 517, 518,
-   513, 519, 520, 521, 522, 523, 523,  26, 524, 524, 524, 524, 524, 524, 524, 524,
-   524, 524, 524, 525, 526,  26,  26,  26, 527, 527, 527, 527, 527, 527, 527, 527,
-   527,  26, 527, 528,  26,  26,  26,  26, 529, 529, 529, 529, 529, 529, 530, 529,
-   529, 529, 529, 530,  26,  26,  26,  26, 531, 531, 531, 531, 531, 531, 531, 531,
-   532,  26, 531, 533, 198, 534,  26,  26, 535, 535, 535, 535, 535, 535, 535, 536,
-   535, 536,  26,  26,  26,  26,  26,  26, 537, 537, 537, 538, 537, 539, 537, 537,
-   540,  26,  26,  26,  26,  26,  26,  26, 541, 541, 541, 541, 541, 541, 541, 542,
-    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 543, 543, 543, 543,
-   543, 543, 543, 543, 543, 543, 544, 545, 546, 547, 548, 549, 549, 549, 550, 551,
-   546,  26, 549, 552,  26,  26,  26,  26,  26,  26,  26,  26, 553, 554, 553, 553,
-   553, 553, 553, 554, 555,  26,  26,  26, 556, 556, 556, 556, 556, 556, 556, 556,
-   556,  26, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 558,  26, 178, 178,
-   559, 559, 559, 559, 559, 559, 559, 560,  53, 561,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 562, 563, 562, 562, 562, 562, 564, 562,
-   565,  26, 562, 562, 562, 566, 567, 567, 567, 567, 568, 567, 567, 569, 570,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 571, 572, 573, 573, 573, 573, 571, 574,
-   573,  26, 573, 575, 576, 577, 578, 578, 578, 579, 580, 581, 578, 582,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26, 583, 583, 583, 584, 585, 585, 586, 585, 585, 585, 585, 587,
-   585, 585, 585, 588,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 589,  26,
-   108, 108, 108, 108, 108, 108, 590, 591, 592, 592, 592, 592, 592, 592, 592, 592,
-   592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 593,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 592, 592, 592, 592, 592, 592, 592, 592,
-   592, 592, 592, 592, 592, 594, 595,  26, 592, 592, 592, 592, 592, 592, 592, 592,
-   596,  26,  26,  26,  26,  26,  26,  26,  26,  26, 597, 597, 597, 597, 597, 597,
-   597, 597, 597, 597, 597, 597, 598,  26, 599, 599, 599, 599, 599, 599, 599, 599,
-   599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599,
-   599, 599, 600,  26,  26,  26,  26,  26, 601, 601, 601, 601, 601, 601, 601, 601,
-   601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601,
-   602,  26,  26,  26,  26,  26,  26,  26, 305, 305, 305, 305, 305, 305, 305, 305,
-   305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 603,
-   604, 604, 604, 605, 604, 606, 607, 607, 607, 607, 607, 607, 607, 607, 607, 608,
-   607, 609, 610, 610, 610, 611, 611,  26, 612, 612, 612, 612, 612, 612, 612, 612,
-   613,  26, 612, 614, 614, 612, 612, 615, 612, 612,  26,  26,  26,  26,  26,  26,
+   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280,  26,  26,  26,   0,   0,
+   281,   0,   0,   0, 282, 283,   0, 284, 285, 286, 286, 286, 286, 286, 286, 286,
+   286, 286, 287, 288, 289, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 291,
+   292, 293, 293, 293, 293, 293, 294, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+   169, 295,   0,   0, 293, 293, 293, 293,   0,   0,   0,   0, 296, 297, 290, 290,
+   169, 169, 169, 295,   0,   0,   0,   0,   0,   0,   0,   0, 169, 169, 169, 298,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 290, 290, 290, 290, 290, 299,
+   290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,   0,   0,   0,   0,   0,
+   277, 277, 277, 277, 277, 277, 277, 277,   0,   0,   0,   0,   0,   0,   0,   0,
+   300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
+   300, 301, 300, 300, 300, 300, 300, 300, 302,  26, 303, 303, 303, 303, 303, 303,
+   304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304,
+   304, 304, 304, 304, 304, 305,  26,  26,  18,  18,  18,  18,  18,  18,  18,  18,
+    18,  18,  18,  18, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306,  26,
+     0,   0,   0,   0, 307,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+     2, 308,   2,   2,   2,   2,   2,   2,   2, 309, 310, 311,  26,  26, 312,   2,
+   313, 313, 313, 313, 313, 314,   0, 315, 316, 316, 316, 316, 316, 316, 316,  26,
+   317, 317, 317, 317, 317, 317, 317, 317, 318, 319, 317, 320,  53,  53,  53,  53,
+   321, 321, 321, 321, 321, 322, 323, 323, 323, 323, 324, 325, 169, 169, 169, 326,
+   327, 327, 327, 327, 327, 327, 327, 327, 327, 328, 327, 329, 164, 164, 164, 330,
+   331, 331, 331, 331, 331, 331, 332,  26, 331, 333, 331, 334, 164, 164, 164, 164,
+   335, 335, 335, 335, 335, 335, 335, 335, 336,  26,  26, 337, 338, 338, 339,  26,
+   340, 340, 340,  26, 172, 172,   2,   2,   2,   2,   2, 341, 342, 343, 176, 176,
+   176, 176, 176, 176, 176, 176, 176, 176, 338, 338, 338, 338, 338, 344, 338, 345,
+   169, 169, 169, 169, 346,  26, 169, 169, 295, 347, 169, 169, 169, 169, 169, 346,
     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-   616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 617,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 618, 618, 618, 618, 618, 618, 618, 618,
-   618, 619, 618, 618, 618, 618, 618, 618, 618, 620, 618, 618,  26,  26,  26,  26,
-    26,  26,  26,  26, 621,  26, 347,  26, 622, 622, 622, 622, 622, 622, 622, 622,
-   622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622,
-   622, 622, 622, 622, 622, 622, 622,  26, 623, 623, 623, 623, 623, 623, 623, 623,
+   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280, 277, 277,
+   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 348,  26,  26,  26,  26,
+   349,  26, 350, 351,  25,  25, 352, 353, 354,  25,  31,  31,  31,  31,  31,  31,
+    31,  31,  31,  31,  31,  31,  31,  31, 355,  26, 356,  31,  31,  31,  31,  31,
+    31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+    31,  31,  31,  31,  31,  31,  31, 357,  31,  31,  31,  31,  31,  31,  31,  31,
+    31,  31, 358,  31,  31,  31,  31,  31,  31, 359,  26,  26,  26,  26,  31,  31,
+     9,   9,   0, 315,   9, 360,   0,   0,   0,   0, 361,   0, 258, 296, 362,  31,
+    31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 363,
+   364,   0,   0,   0,   1,   2,   2,   3,   1,   2,   2,   3, 365, 290, 289, 290,
+   290, 290, 290, 366, 169, 169, 169, 295, 367, 367, 367, 368, 258, 258,  26, 369,
+   370, 371, 370, 370, 372, 370, 370, 373, 370, 374, 370, 374,  26,  26,  26,  26,
+   370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 375,
+   376,   0,   0,   0,   0,   0, 377,   0,  14,  14,  14,  14,  14,  14,  14,  14,
+    14, 253,   0, 378, 379,  26,  26,  26,  26,  26,   0,   0,   0,   0,   0, 380,
+   381, 381, 381, 382, 383, 383, 383, 383, 383, 383, 384,  26, 385,   0,   0, 296,
+   386, 386, 386, 386, 387, 388, 389, 389, 389, 390, 391, 391, 391, 391, 391, 392,
+   393, 393, 393, 394, 395, 395, 395, 395, 396, 395, 397,  26,  26,  26,  26,  26,
+   398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 399, 399, 399, 399, 399, 399,
+   400, 400, 400, 401, 400, 402, 403, 403, 403, 403, 404, 403, 403, 403, 403, 404,
+   405, 405, 405, 405, 405,  26, 406, 406, 406, 406, 406, 406, 407, 408, 409, 410,
+   409, 410, 411, 409, 412, 409, 412, 413,  26,  26,  26,  26,  26,  26,  26,  26,
+   414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414,
+   414, 414, 414, 414, 414, 414, 415,  26, 414, 414, 416,  26, 414,  26,  26,  26,
+   417,   2,   2,   2,   2,   2, 418, 309,  26,  26,  26,  26,  26,  26,  26,  26,
+   419, 420, 421, 421, 421, 421, 422, 423, 424, 424, 425, 424, 426, 426, 426, 426,
+   427, 427, 427, 428, 429, 427,  26,  26,  26,  26,  26,  26, 430, 430, 431, 432,
+   433, 433, 433, 434, 435, 435, 435, 436,  26,  26,  26,  26,  26,  26,  26,  26,
+   437, 437, 437, 437, 438, 438, 438, 439, 438, 438, 440, 438, 438, 438, 438, 438,
+   441, 442, 443, 444, 445, 445, 446, 447, 445, 448, 445, 448, 449, 449, 449, 449,
+   450, 450, 450, 450,  26,  26,  26,  26, 451, 451, 451, 451, 452, 453, 452,  26,
+   454, 454, 454, 454, 454, 454, 455, 456, 457, 457, 458, 457, 459, 459, 460, 459,
+   461, 461, 462, 463,  26, 464,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   465, 465, 465, 465, 465, 465, 465, 465, 465, 466,  26,  26,  26,  26,  26,  26,
+   467, 467, 467, 467, 467, 467, 468,  26, 467, 467, 467, 467, 467, 467, 468, 469,
+   470, 470, 470, 470, 470,  26, 470, 471,  26,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  31,  31,  50,
+   472, 472, 472, 472, 472, 473, 474,  26,  26,  26,  26,  26,  26,  26,  26, 475,
+   476, 476, 476, 476, 476,  26, 477, 477, 477, 477, 477, 478,  26,  26, 479, 479,
+   479, 480,  26,  26,  26,  26, 481, 481, 481, 482,  26,  26, 483, 483, 484,  26,
+   485, 485, 485, 485, 485, 485, 485, 485, 485, 486, 487, 485, 485, 485, 486, 488,
+   489, 489, 489, 489, 489, 489, 489, 489, 490, 491, 492, 492, 492, 493, 492, 494,
+   495, 495, 495, 495, 495, 495, 496, 495, 495,  26, 497, 497, 497, 497, 498,  26,
+   499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 500, 137, 501,  26,
+   502, 502, 503, 502, 502, 502, 502, 502, 504,  26,  26,  26,  26,  26,  26,  26,
+   505, 506, 507, 508, 507, 509, 510, 510, 510, 510, 510, 510, 510, 511, 510, 512,
+   513, 514, 515, 516, 516, 517, 518, 519, 514, 520, 521, 522, 523, 524, 524,  26,
+   525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 526, 527,  26,  26,  26,
+   528, 528, 528, 528, 528, 528, 528, 528, 528,  26, 528, 529,  26,  26,  26,  26,
+   530, 530, 530, 530, 530, 530, 531, 530, 530, 530, 530, 531,  26,  26,  26,  26,
+   532, 532, 532, 532, 532, 532, 532, 532, 533,  26, 532, 534, 198, 535,  26,  26,
+   536, 536, 536, 536, 536, 536, 536, 537, 536, 537,  26,  26,  26,  26,  26,  26,
+   538, 538, 538, 539, 538, 540, 538, 538, 541,  26,  26,  26,  26,  26,  26,  26,
+   542, 542, 542, 542, 542, 542, 542, 543,  26,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 545, 546,
+   547, 548, 549, 550, 550, 550, 551, 552, 547,  26, 550, 553,  26,  26,  26,  26,
+    26,  26,  26,  26, 554, 555, 554, 554, 554, 554, 554, 555, 556,  26,  26,  26,
+   557, 557, 557, 557, 557, 557, 557, 557, 557,  26, 558, 558, 558, 558, 558, 558,
+   558, 558, 558, 558, 559,  26, 178, 178, 560, 560, 560, 560, 560, 560, 560, 561,
+    53, 562,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   563, 564, 563, 563, 563, 563, 565, 563, 566,  26, 563, 563, 563, 567, 568, 568,
+   568, 568, 569, 568, 568, 570, 571,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   572, 573, 574, 574, 574, 574, 572, 575, 574,  26, 574, 576, 577, 578, 579, 579,
+   579, 580, 581, 582, 579, 583,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 584, 584, 584, 585,
+   586, 586, 587, 586, 586, 586, 586, 588, 586, 586, 586, 589,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26, 590,  26, 108, 108, 108, 108, 108, 108, 591, 592,
+   593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593,
+   593, 593, 593, 594,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 595, 596,  26,
+   593, 593, 593, 593, 593, 593, 593, 593, 597,  26,  26,  26,  26,  26,  26,  26,
+    26,  26, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 599,  26,
+   600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
+   600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 601,  26,  26,  26,  26,  26,
+   602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602,
+   602, 602, 602, 602, 602, 602, 602, 602, 603,  26,  26,  26,  26,  26,  26,  26,
+   306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306,
+   306, 306, 306, 306, 306, 306, 306, 604, 605, 605, 605, 606, 605, 607, 608, 608,
+   608, 608, 608, 608, 608, 608, 608, 609, 608, 610, 611, 611, 611, 612, 612,  26,
+   613, 613, 613, 613, 613, 613, 613, 613, 614,  26, 613, 615, 615, 613, 613, 616,
+   613, 613,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26, 617, 617, 617, 617, 617, 617, 617, 617,
+   617, 617, 617, 618,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   619, 619, 619, 619, 619, 619, 619, 619, 619, 620, 619, 619, 619, 619, 619, 619,
+   619, 621, 619, 619,  26,  26,  26,  26,  26,  26,  26,  26, 622,  26, 348,  26,
    623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623,
-   623, 623, 624,  26,  26,  26,  26,  26, 622, 625,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26, 626, 627, 628, 287, 287, 287, 287, 287, 287, 287,
-   287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
-   287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 629,  26, 630,  26,
-    26,  26, 631,  26, 632,  26, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
-   633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
-   633, 633, 633, 633, 633, 633, 633, 634, 635, 635, 635, 635, 635, 635, 635, 635,
-   635, 635, 635, 635, 635, 636, 635, 637, 635, 638, 635, 639, 281,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26,   9,   9,   9,   9,   9, 640,   9,   9,
-   221,  26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-   281,  26,  26,  26,  26,  26,  26,  26,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0, 276,  26,   0,   0,   0,   0, 258, 363,   0,   0,
-     0,   0,   0,   0, 641, 642,   0, 643, 644, 645,   0,   0,   0, 646,   0,   0,
-     0,   0,   0,   0,   0, 266,  26,  26,  14,  14,  14,  14,  14,  14,  14,  14,
-   247,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     0,   0, 281,  26,   0,   0, 281,  26,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0, 258,  26,   0,   0,   0, 260,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0, 255,   0,   0,   0,   0,   0,   0,   0,   0, 255, 647, 648,   0, 649,
-   650,   0,   0,   0,   0,   0,   0,   0, 269, 651, 255, 255,   0,   0,   0, 652,
-   653, 654, 655,   0,   0,   0,   0,   0,   0,   0,   0,   0, 276,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0, 268,   0,   0,   0,   0,   0,   0, 656, 656, 656, 656, 656, 656, 656, 656,
-   656, 656, 656, 656, 656, 656, 656, 656, 656, 657,  26, 658, 659, 656,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26,   2,   2,   2, 348, 660, 308,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 661, 270, 270, 662, 663, 664,  18,  18,
-    18,  18,  18,  18,  18, 665,  26,  26,  26, 666,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 667, 667, 667, 667, 667, 668, 667, 669,
-   667, 670,  26,  26,  26,  26,  26,  26,  26,  26, 671, 671, 671, 672,  26,  26,
-   673, 673, 673, 673, 673, 673, 673, 674,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26, 675, 675, 675, 675, 675, 676,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26, 172, 677, 170, 172, 678, 678, 678, 678, 678, 678, 678, 678,
-   678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678,
-   679, 678, 680,  26,  26,  26,  26,  26, 681, 681, 681, 681, 681, 681, 681, 681,
-   681, 682, 681, 683,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26, 363,   0,   0,   0,   0,   0,   0,   0, 377,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 363,   0,   0,   0,   0,   0,   0, 276,
-    26,  26,  26,  26,  26,  26,  26,  26, 684,  31,  31,  31, 685, 686, 687, 688,
-   689, 690, 685, 691, 685, 687, 687, 692,  31, 693,  31, 694, 695, 693,  31, 694,
-    26,  26,  26,  26,  26,  26,  51,  26,   0,   0,   0,   0,   0, 281,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 281,  26,   0, 258, 363,   0,
-   363,   0, 363,   0,   0,   0, 276,  26,   0,   0,   0,   0,   0, 276,  26,  26,
-    26,  26,  26,  26, 696,   0,   0,   0, 697,  26,   0,   0,   0,   0,   0, 281,
-     0, 260, 314,  26, 276,  26,  26,  26,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0, 698,   0, 377,   0, 377,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0, 258, 699,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0, 314,   0, 281, 260,  26,   0, 281,   0,   0,   0,   0,   0,   0,
-     0,  26,   0, 314,   0,   0,   0,   0,   0,  26,   0,   0,   0, 276, 314,  26,
-    26,  26,  26,  26,  26,  26,  26,  26,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0, 281,  26,   0, 276,   0, 377,   0, 260,   0,   0,   0,   0,   0, 269,
-   276, 696,   0, 281,   0, 260,   0, 260,   0,   0, 360,   0,   0,   0,   0,   0,
-     0, 266,  26,  26,  26,  26,   0, 314, 277, 277, 277, 277, 277, 277, 277, 277,
-   277, 277, 277, 277,  26,  26,  26,  26, 277, 277, 277, 277, 277, 277, 277, 347,
-   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280, 277, 277, 277, 277,
-   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 347,  26, 277, 277,
-   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
-   277, 277, 277, 277, 700,  26,  26,  26, 277, 277, 277, 280,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 277, 277, 277, 277, 277, 277, 277, 277,
-   277, 701, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 702,  26,  26,  26,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,
+   623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623,  26,
+   624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624,
+   624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 625,  26,  26,  26,  26,  26,
+   623, 626,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 627, 628,
+   629, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286,
+   286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286,
+   286, 286, 286, 286, 630,  26, 631,  26,  26,  26, 632,  26, 633,  26, 634, 634,
+   634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634,
+   634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 635,
+   636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 637, 636, 638,
+   636, 639, 636, 640, 296,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     9,   9,   9,   9,   9, 641,   9,   9, 221,  26,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0, 296,  26,  26,  26,  26,  26,  26,  26,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 276,  26,
+     0,   0,   0,   0, 258, 364,   0,   0,   0,   0,   0,   0, 642, 643,   0, 644,
+   645, 646,   0,   0,   0, 647,   0,   0,   0,   0,   0,   0,   0, 266,  26,  26,
+    14,  14,  14,  14,  14,  14,  14,  14, 247,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26,   0,   0, 296,  26,   0,   0, 296,  26,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 258,  26,   0,   0,   0, 260,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255,   0,   0,   0,   0,   0,
+     0,   0,   0, 255, 648, 649,   0, 650, 651,   0,   0,   0,   0,   0,   0,   0,
+   269, 652, 255, 255,   0,   0,   0, 653, 654, 655, 656,   0,   0,   0,   0,   0,
+     0,   0,   0,   0, 276,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0, 268,   0,   0,   0,   0,   0,   0,
+   657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657,
+   657, 658,  26, 659, 660, 657,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     2,   2,   2, 349, 661, 309,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   662, 270, 270, 663, 664, 665,  18,  18,  18,  18,  18,  18,  18, 666,  26,  26,
+    26, 667,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   668, 668, 668, 668, 668, 669, 668, 670, 668, 671,  26,  26,  26,  26,  26,  26,
+    26,  26, 672, 672, 672, 673,  26,  26, 674, 674, 674, 674, 674, 674, 674, 675,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 676, 676, 676, 676, 676, 677,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 172, 678, 170, 172,
+   679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679,
+   679, 679, 679, 679, 679, 679, 679, 679, 680, 679, 681,  26,  26,  26,  26,  26,
+   682, 682, 682, 682, 682, 682, 682, 682, 682, 683, 682, 684,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 364,   0,
+     0,   0,   0,   0,   0,   0, 378,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   364,   0,   0,   0,   0,   0,   0, 276,  26,  26,  26,  26,  26,  26,  26,  26,
+   685,  31,  31,  31, 686, 687, 688, 689, 690, 691, 686, 692, 686, 688, 688, 693,
+    31, 694,  31, 695, 696, 694,  31, 695,  26,  26,  26,  26,  26,  26,  51,  26,
+     0,   0,   0,   0,   0, 296,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0, 296,  26,   0, 258, 364,   0, 364,   0, 364,   0,   0,   0, 276,  26,
+     0,   0,   0,   0,   0, 276,  26,  26,  26,  26,  26,  26, 697,   0,   0,   0,
+   698,  26,   0,   0,   0,   0,   0, 296,   0, 260, 315,  26, 276,  26,  26,  26,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 699,   0, 378,   0, 378,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 258, 700,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 315,   0, 296, 260,  26,
+     0, 296,   0,   0,   0,   0,   0,   0,   0,  26,   0, 315,   0,   0,   0,   0,
+     0,  26,   0,   0,   0, 276, 315,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 296,  26,   0, 276,   0, 378,
+     0, 260,   0,   0,   0,   0,   0, 269, 276, 697,   0, 296,   0, 260,   0, 260,
+     0,   0, 361,   0,   0,   0,   0,   0,   0, 266,  26,  26,  26,  26,   0, 315,
+   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,  26,  26,  26,  26,
+   277, 277, 277, 277, 277, 277, 277, 348, 277, 277, 277, 277, 277, 277, 277, 277,
+   277, 277, 277, 280, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+   277, 277, 277, 277, 348,  26, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 701,  26, 277, 277,
+   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280,  26,  26,  26,  26,
+   277, 277, 277, 280,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   277, 277, 277, 277, 277, 277, 277, 277, 277, 702, 277, 277, 277, 277, 277, 277,
+   277, 277, 277, 277, 277, 277,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   703,  26,  26,  26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-     9,   9,   9,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0, 939, 940, 941, 942, 946, 948,   0, 962,
-   969, 970, 971, 976,1001,1002,1003,1008,   0,1033,1040,1041,1042,1043,1047,   0,
-     0,1080,1081,1082,1086,1110,   0,   0,1124,1125,1126,1127,1131,1133,   0,1147,
-  1154,1155,1156,1161,1187,1188,1189,1193,   0,1219,1226,1227,1228,1229,1233,   0,
-     0,1267,1268,1269,1273,1298,   0,1303, 943,1128, 944,1129, 954,1139, 958,1143,
-   959,1144, 960,1145, 961,1146, 964,1149,   0,   0, 973,1158, 974,1159, 975,1160,
-   983,1168, 978,1163, 988,1173, 990,1175, 991,1176, 993,1178, 994,1179,   0,   0,
-  1004,1190,1005,1191,1006,1192,1014,1199,1007,   0,   0,   0,1016,1201,1020,1206,
-     0,1022,1208,1025,1211,1023,1209,   0,   0,   0,   0,1032,1218,1037,1223,1035,
-  1221,   0,   0,   0,1044,1230,1045,1231,1049,1235,   0,   0,1058,1244,1064,1250,
-  1060,1246,1066,1252,1067,1253,1072,1258,1069,1255,1077,1264,1074,1261,   0,   0,
-  1083,1270,1084,1271,1085,1272,1088,1275,1089,1276,1096,1283,1103,1290,1111,1299,
-  1115,1118,1307,1120,1309,1121,1310,   0,1053,1239,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,1093,1280,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0, 949,1134,1010,1195,1050,1236,1090,1277,1341,1368,1340,
-  1367,1342,1369,1339,1366,   0,1320,1347,1418,1419,1323,1350,   0,   0, 992,1177,
-  1018,1204,1055,1241,1416,1417,1415,1424,1202,   0,   0,   0, 987,1172,   0,   0,
-  1031,1217,1321,1348,1322,1349,1338,1365, 950,1135, 951,1136, 979,1164, 980,1165,
-  1011,1196,1012,1197,1051,1237,1052,1238,1061,1247,1062,1248,1091,1278,1092,1279,
-  1071,1257,1076,1263,   0,   0, 997,1182,   0,   0,   0,   0,   0,   0, 945,1130,
-   982,1167,1337,1364,1335,1362,1046,1232,1422,1423,1113,1301,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   8,   9,   0,  10,1425,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,1314,1427,   5,
-  1434,1438,1443,   0,1450,   0,1455,1461,1514,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1446,1458,1468,1476,1480,1486,1517,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1489,1503,1494,1500,1508,   0,   0,   0,   0,1520,1521,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,1526,1528,   0,1525,   0,   0,   0,1522,
-     0,   0,   0,   0,1536,1532,1539,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1534,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1556,   0,   0,   0,   0,   0,   0,1548,1550,   0,1547,   0,   0,   0,1567,
-     0,   0,   0,   0,1558,1554,1561,   0,   0,   0,   0,   0,   0,   0,1568,1569,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,1529,1551,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,1523,1545,1524,1546,   0,   0,1527,1549,
-     0,   0,1570,1571,1530,1552,1531,1553,   0,   0,1533,1555,1535,1557,1537,1559,
-     0,   0,1572,1573,1544,1566,1538,1560,1540,1562,1541,1563,1542,1564,   0,   0,
-  1543,1565,   0,   0,   0,   0,   0,   0,   0,   0,1606,1607,1609,1608,1610,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,1613,   0,1611,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1612,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1620,   0,   0,   0,   0,   0,   0,   0,1623,   0,   0,1624,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1614,1615,1616,1617,1618,1619,1621,1622,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1628,1629,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1625,1626,   0,1627,   0,   0,   0,1634,   0,   0,1635,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1630,1631,1632,   0,   0,1633,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1639,   0,   0,1638,1640,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1636,1637,   0,   0,   0,   0,   0,   0,1641,   0,   0,   0,
+     9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1642,1644,1643,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1645,   0,   0,   0,   0,   0,   0,   0,1646,   0,   0,   0,   0,   0,   0,1648,
-  1649,   0,1647,1650,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1651,1653,1652,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1654,   0,1655,1657,1656,   0,   0,   0,   0,1659,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1660,   0,   0,   0,   0,1661,   0,   0,   0,   0,1662,
-     0,   0,   0,   0,1663,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1658,   0,   0,   0,   0,   0,   0,   0,   0,   0,1664,   0,1665,1673,   0,
-  1674,   0,   0,   0,   0,   0,   0,   0,   0,1666,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1668,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1669,   0,   0,   0,   0,1670,   0,   0,   0,   0,1671,
-     0,   0,   0,   0,1672,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1667,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1675,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1676,   0,
-  1677,   0,1678,   0,1679,   0,1680,   0,   0,   0,1681,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1682,   0,1683,   0,   0,1684,1685,   0,1686,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0, 953,1138, 955,1140, 956,1141, 957,1142,
-  1324,1351, 963,1148, 965,1150, 968,1153, 966,1151, 967,1152,1378,1380,1379,1381,
-   984,1169, 985,1170,1420,1421, 986,1171, 989,1174, 995,1180, 998,1183, 996,1181,
-   999,1184,1000,1185,1015,1200,1329,1356,1017,1203,1019,1205,1021,1207,1024,1210,
-  1687,1688,1027,1213,1026,1212,1028,1214,1029,1215,1030,1216,1034,1220,1036,1222,
-  1039,1225,1038,1224,1334,1361,1336,1363,1382,1384,1383,1385,1056,1242,1057,1243,
-  1059,1245,1063,1249,1689,1690,1065,1251,1068,1254,1070,1256,1386,1387,1388,1389,
-  1691,1692,1073,1259,1075,1262,1079,1266,1078,1265,1095,1282,1098,1285,1097,1284,
-  1390,1391,1392,1393,1099,1286,1100,1287,1101,1288,1102,1289,1105,1292,1104,1291,
-  1106,1294,1107,1295,1108,1296,1114,1302,1119,1308,1122,1311,1123,1312,1186,1260,
-  1293,1305,   0,1394,   0,   0,   0,   0, 952,1137, 947,1132,1317,1344,1316,1343,
-  1319,1346,1318,1345,1693,1695,1371,1375,1370,1374,1373,1377,1372,1376,1694,1696,
-   981,1166, 977,1162, 972,1157,1326,1353,1325,1352,1328,1355,1327,1354,1697,1698,
-  1009,1194,1013,1198,1054,1240,1048,1234,1331,1358,1330,1357,1333,1360,1332,1359,
-  1699,1700,1396,1401,1395,1400,1398,1403,1397,1402,1399,1404,1094,1281,1087,1274,
-  1406,1411,1405,1410,1408,1413,1407,1412,1409,1414,1109,1297,1117,1306,1116,1304,
-  1112,1300,   0,   0,   0,   0,   0,   0,1471,1472,1701,1705,1702,1706,1703,1707,
-  1430,1431,1715,1719,1716,1720,1717,1721,1477,1478,1729,1731,1730,1732,   0,   0,
-  1435,1436,1733,1735,1734,1736,   0,   0,1481,1482,1737,1741,1738,1742,1739,1743,
-  1439,1440,1751,1755,1752,1756,1753,1757,1490,1491,1765,1768,1766,1769,1767,1770,
-  1447,1448,1771,1774,1772,1775,1773,1776,1495,1496,1777,1779,1778,1780,   0,   0,
-  1451,1452,1781,1783,1782,1784,   0,   0,1504,1505,1785,1788,1786,1789,1787,1790,
-     0,1459,   0,1791,   0,1792,   0,1793,1509,1510,1794,1798,1795,1799,1796,1800,
-  1462,1463,1808,1812,1809,1813,1810,1814,1467,  21,1475,  22,1479,  23,1485,  24,
-  1493,  27,1499,  28,1507,  29,   0,   0,1704,1708,1709,1710,1711,1712,1713,1714,
-  1718,1722,1723,1724,1725,1726,1727,1728,1740,1744,1745,1746,1747,1748,1749,1750,
-  1754,1758,1759,1760,1761,1762,1763,1764,1797,1801,1802,1803,1804,1805,1806,1807,
-  1811,1815,1816,1817,1818,1819,1820,1821,1470,1469,1822,1474,1465,   0,1473,1825,
-  1429,1428,1426,  12,1432,   0,  26,   0,   0,1315,1823,1484,1466,   0,1483,1829,
-  1433,  13,1437,  14,1441,1826,1827,1828,1488,1487,1513,  19,   0,   0,1492,1515,
-  1445,1444,1442,  15,   0,1831,1832,1833,1502,1501,1516,  25,1497,1498,1506,1518,
-  1457,1456,1454,  17,1453,1313,  11,   3,   0,   0,1824,1512,1519,   0,1511,1830,
-  1449,  16,1460,  18,1464,   4,   0,   0,  30,  31,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  20,   0,
-     0,   0,   2,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1834,1835,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,1836,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1837,1839,1838,   0,   0,   0,   0,1840,   0,   0,   0,
-     0,1841,   0,   0,1842,   0,   0,   0,   0,   0,   0,   0,1843,   0,1844,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,1845,   0,   0,1846,   0,   0,1847,
-     0,1848,   0,   0,   0,   0,   0,   0, 937,   0,1850,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1849, 936, 938,1851,1852,   0,   0,1853,1854,   0,   0,
-  1855,1856,   0,   0,   0,   0,   0,   0,1857,1858,   0,   0,1861,1862,   0,   0,
-  1863,1864,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1867,1868,1869,1870,1859,1860,1865,1866,   0,   0,   0,   0,
-     0,   0,1871,1872,1873,1874,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,  32,  33,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1875,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1877,   0,1878,   0,1879,   0,1880,   0,1881,   0,1882,   0,
-  1883,   0,1884,   0,1885,   0,1886,   0,1887,   0,1888,   0,   0,1889,   0,1890,
-     0,1891,   0,   0,   0,   0,   0,   0,1892,1893,   0,1894,1895,   0,1896,1897,
-     0,1898,1899,   0,1900,1901,   0,   0,   0,   0,   0,   0,1876,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,1902,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1904,   0,1905,   0,1906,   0,1907,   0,1908,   0,1909,   0,
-  1910,   0,1911,   0,1912,   0,1913,   0,1914,   0,1915,   0,   0,1916,   0,1917,
-     0,1918,   0,   0,   0,   0,   0,   0,1919,1920,   0,1921,1922,   0,1923,1924,
-     0,1925,1926,   0,1927,1928,   0,   0,   0,   0,   0,   0,1903,   0,   0,1929,
-  1930,1931,1932,   0,   0,   0,1933,   0, 710, 385, 724, 715, 455, 103, 186, 825,
-   825, 242, 751, 205, 241, 336, 524, 601, 663, 676, 688, 738, 411, 434, 474, 500,
-   649, 746, 799, 108, 180, 416, 482, 662, 810, 275, 462, 658, 692, 344, 618, 679,
-   293, 388, 440, 492, 740, 116, 146, 168, 368, 414, 481, 527, 606, 660, 665, 722,
-   781, 803, 809, 538, 553, 588, 642, 758, 811, 701, 233, 299, 573, 612, 487, 540,
-   714, 779, 232, 267, 412, 445, 457, 585, 594, 766, 167, 613, 149, 148, 560, 589,
-   648, 768, 708, 345, 411, 704, 105, 259, 313, 496, 518, 174, 542, 120, 307, 101,
-   430, 372, 584, 183, 228, 529, 650, 697, 424, 732, 428, 349, 632, 355, 517, 110,
-   135, 147, 403, 580, 624, 700, 750, 170, 193, 245, 297, 374, 463, 543, 763, 801,
-   812, 815, 162, 384, 420, 730, 287, 330, 337, 366, 459, 476, 509, 558, 591, 610,
-   726, 652, 734, 759, 154, 163, 198, 473, 683, 697, 292, 311, 353, 423, 572, 494,
-   113, 217, 259, 280, 314, 499, 506, 603, 608, 752, 778, 782, 788, 117, 557, 748,
-   774, 320, 109, 126, 260, 265, 373, 411, 479, 523, 655, 737, 823, 380, 765, 161,
-   395, 398, 438, 451, 502, 516, 537, 583, 791, 136, 340, 769, 122, 273, 446, 727,
-   305, 322, 400, 496, 771, 155, 190, 269, 377, 391, 406, 432, 501, 519, 599, 684,
-   687, 749, 776, 175, 452, 191, 480, 510, 659, 772, 805, 813, 397, 444, 619, 566,
-   568, 575, 491, 471, 707, 111, 636, 156, 153, 288, 346, 578, 256, 435, 383, 729,
-   680, 767, 694, 295, 128, 210,   0,   0, 227,   0, 379,   0,   0, 150, 493, 525,
-   544, 551, 552, 556, 783, 576, 604,   0, 661,   0, 703,   0,   0, 735, 743,   0,
-     0,   0, 793, 794, 795, 808, 741, 773, 118, 127, 130, 166, 169, 177, 207, 213,
-   215, 226, 229, 268, 270, 317, 327, 329, 335, 369, 375, 381, 404, 441, 448, 458,
-   477, 484, 503, 539, 545, 547, 546, 548, 549, 550, 554, 555, 561, 564, 569, 591,
-   593, 595, 598, 607, 620, 625, 625, 651, 690, 695, 705, 706, 716, 717, 733, 735,
-   777, 786, 790, 315, 869, 623,   0,   0, 102, 145, 134, 115, 129, 138, 165, 171,
-   207, 202, 206, 212, 227, 231, 240, 243, 250, 254, 294, 296, 303, 308, 319, 325,
-   321, 329, 326, 335, 341, 357, 360, 362, 370, 379, 388, 389, 393, 421, 424, 438,
-   456, 454, 458, 465, 477, 535, 485, 490, 493, 507, 512, 514, 521, 522, 525, 526,
-   528, 533, 532, 541, 565, 569, 574, 586, 591, 597, 607, 637, 647, 674, 691, 693,
-   695, 698, 703, 699, 705, 704, 702, 706, 709, 717, 728, 736, 747, 754, 770, 777,
-   783, 784, 786, 787, 790, 802, 825, 848, 847, 857,  55,  65,  66, 883, 892, 916,
-   822, 824,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1586,   0,1605,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1602,1603,1934,1935,1574,1575,1576,1577,1579,1580,1581,1583,1584,   0,
-  1585,1587,1588,1589,1591,   0,1592,   0,1593,1594,   0,1595,1596,   0,1598,1599,
-  1600,1601,1604,1582,1578,1590,1597,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1936,   0,1937,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1938,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,1939,1940,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1941,1942,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1944,1943,   0,1945,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1946,1947,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1948,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,1949,1950,1951,1952,1953,1954,1955,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1956,1957,1958,1960,1959,1961,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0, 106, 104, 107, 826, 114, 118, 119, 121,
-   123, 124, 127, 125,  34, 830, 130, 131, 132, 137, 827,  35, 133, 139, 829, 142,
-   143, 112, 144, 145, 924, 151, 152,  37, 157, 158, 159, 160,  38, 165, 166, 169,
-   171, 172, 173, 174, 176, 177, 178, 179, 181, 182, 182, 182, 833, 468, 184, 185,
-   834, 187, 188, 189, 196, 192, 194, 195, 197, 199, 200, 201, 203, 204, 204, 206,
-   208, 209, 211, 218, 213, 219, 214, 216, 153, 234, 221, 222, 223, 220, 225, 224,
-   230, 835, 235, 236, 237, 238, 239, 244, 836, 837, 247, 248, 249, 246, 251,  39,
-    40, 253, 255, 255, 838, 257, 258, 259, 261, 839, 262, 263, 301, 264,  41, 266,
-   270, 272, 271, 841, 274, 842, 277, 276, 278, 281, 282,  42, 283, 284, 285, 286,
-    43, 843,  44, 289, 290, 291, 293, 934, 298, 845, 845, 621, 300, 300,  45, 852,
-   894, 302, 304,  46, 306, 309, 310, 312, 316,  48,  47, 317, 846, 318, 323, 324,
-   325, 324, 328, 329, 333, 331, 332, 334, 335, 336, 338, 339, 342, 343, 347, 351,
-   849, 350, 348, 352, 354, 359, 850, 361, 358, 356,  49, 363, 365, 367, 364,  50,
-   369, 371, 851, 376, 386, 378,  53, 381,  52,  51, 140, 141, 387, 382, 614,  78,
-   388, 389, 390, 394, 392, 856,  54, 399, 396, 402, 404, 858, 405, 401, 407,  55,
-   408, 409, 410, 413, 859, 415,  56, 417, 860, 418,  57, 419, 422, 424, 425, 861,
-   840, 862, 426, 863, 429, 431, 427, 433, 437, 441, 438, 439, 442, 443, 864, 436,
-   449, 450,  58, 454, 453, 865, 447, 460, 866, 867, 461, 466, 465, 464,  59, 467,
-   470, 469, 472, 828, 475, 868, 478, 870, 483, 485, 486, 871, 488, 489, 872, 873,
-   495, 497,  60, 498,  61,  61, 504, 505, 507, 508, 511,  62, 513, 874, 515, 875,
-   518, 844, 520, 876, 877, 878,  63,  64, 528, 880, 879, 881, 882, 530, 531, 531,
-   533,  66, 534,  67,  68, 884, 536, 538, 541,  69, 885, 549, 886, 887, 556, 559,
-    70, 561, 562, 563, 888, 889, 889, 567,  71, 890, 570, 571,  72, 891, 577,  73,
-   581, 579, 582, 893, 587,  74, 590, 592, 596,  75, 895, 896,  76, 897, 600, 898,
-   602, 605, 607, 899, 900, 609, 901, 611, 853,  77, 615, 616,  79, 617, 252, 902,
-   903, 854, 855, 621, 622, 731,  80, 627, 626, 628, 164, 629, 630, 631, 633, 904,
-   632, 634, 639, 640, 635, 641, 646, 651, 638, 643, 644, 645, 905, 907, 906,  81,
-   653, 654, 656, 911, 657, 908,  82,  83, 909, 910,  84, 664, 665, 666, 667, 669,
-   668, 671, 670, 674, 672, 673, 675,  85, 677, 678,  86, 681, 682, 912, 685, 686,
-    87, 689,  36, 913, 914,  88,  89, 696, 702, 709, 711, 915, 712, 713, 718, 719,
-   917, 831, 721, 720, 723, 832, 725, 728, 918, 919, 739, 742, 744, 920, 745, 753,
-   756, 757, 755, 760, 761, 921, 762,  90, 764, 922,  91, 775, 279, 780, 923, 925,
-    92,  93, 785, 926,  94, 927, 787, 787, 789, 928, 792,  95, 796, 797, 798, 800,
-    96, 929, 802, 804, 806,  97,  98, 807, 930,  99, 931, 932, 933, 814, 100, 816,
-   817, 818, 819, 820, 821, 935,   0,   0,
+   939, 940, 941, 942, 946, 948,   0, 962, 969, 970, 971, 976,1001,1002,1003,1008,
+     0,1033,1040,1041,1042,1043,1047,   0,   0,1080,1081,1082,1086,1110,   0,   0,
+  1124,1125,1126,1127,1131,1133,   0,1147,1154,1155,1156,1161,1187,1188,1189,1193,
+     0,1219,1226,1227,1228,1229,1233,   0,   0,1267,1268,1269,1273,1298,   0,1303,
+   943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149,
+     0,   0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175,
+   991,1176, 993,1178, 994,1179,   0,   0,1004,1190,1005,1191,1006,1192,1014,1199,
+  1007,   0,   0,   0,1016,1201,1020,1206,   0,1022,1208,1025,1211,1023,1209,   0,
+     0,   0,   0,1032,1218,1037,1223,1035,1221,   0,   0,   0,1044,1230,1045,1231,
+  1049,1235,   0,   0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258,
+  1069,1255,1077,1264,1074,1261,   0,   0,1083,1270,1084,1271,1085,1272,1088,1275,
+  1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310,   0,
+  1053,1239,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1093,
+  1280,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 949,1134,1010,
+  1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366,   0,1320,1347,
+  1418,1419,1323,1350,   0,   0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424,
+  1202,   0,   0,   0, 987,1172,   0,   0,1031,1217,1321,1348,1322,1349,1338,1365,
+   950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238,
+  1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263,   0,   0, 997,1182,
+     0,   0,   0,   0,   0,   0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232,
+  1422,1423,1113,1301,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     8,   9,   0,  10,1425,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   7,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+     0,   0,   0,   0,   0,1314,1427,   5,1434,1438,1443,   0,1450,   0,1455,1461,
+  1514,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1446,1458,1468,1476,1480,1486,
+  1517,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1489,1503,1494,1500,1508,   0,
+     0,   0,   0,1520,1521,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+  1526,1528,   0,1525,   0,   0,   0,1522,   0,   0,   0,   0,1536,1532,1539,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1534,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1556,   0,   0,   0,   0,   0,   0,
+  1548,1550,   0,1547,   0,   0,   0,1567,   0,   0,   0,   0,1558,1554,1561,   0,
+     0,   0,   0,   0,   0,   0,1568,1569,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,1529,1551,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+  1523,1545,1524,1546,   0,   0,1527,1549,   0,   0,1570,1571,1530,1552,1531,1553,
+     0,   0,1533,1555,1535,1557,1537,1559,   0,   0,1572,1573,1544,1566,1538,1560,
+  1540,1562,1541,1563,1542,1564,   0,   0,1543,1565,   0,   0,   0,   0,   0,   0,
+     0,   0,1606,1607,1609,1608,1610,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+  1613,   0,1611,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,1612,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1620,   0,   0,   0,   0,   0,   0,
+     0,1623,   0,   0,1624,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1614,1615,1616,1617,1618,1619,1621,1622,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1628,1629,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1625,1626,   0,1627,
+     0,   0,   0,1634,   0,   0,1635,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1630,1631,1632,   0,   0,1633,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1639,   0,   0,1638,1640,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1636,1637,   0,   0,
+     0,   0,   0,   0,1641,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1642,1644,1643,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1645,   0,   0,   0,   0,   0,   0,   0,
+  1646,   0,   0,   0,   0,   0,   0,1648,1649,   0,1647,1650,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1651,1653,1652,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1654,   0,1655,1657,1656,   0,
+     0,   0,   0,1659,   0,   0,   0,   0,   0,   0,   0,   0,   0,1660,   0,   0,
+     0,   0,1661,   0,   0,   0,   0,1662,   0,   0,   0,   0,1663,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1658,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,1664,   0,1665,1673,   0,1674,   0,   0,   0,   0,   0,   0,   0,
+     0,1666,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,1668,   0,   0,   0,   0,   0,   0,   0,   0,   0,1669,   0,   0,
+     0,   0,1670,   0,   0,   0,   0,1671,   0,   0,   0,   0,1672,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1667,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1675,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1676,   0,1677,   0,1678,   0,1679,   0,1680,   0,
+     0,   0,1681,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1682,   0,1683,   0,   0,
+  1684,1685,   0,1686,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+   953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153,
+   966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171,
+   989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356,
+  1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214,
+  1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363,
+  1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251,
+  1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266,
+  1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287,
+  1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302,
+  1119,1308,1122,1311,1123,1312,1186,1260,1293,1305,   0,1394,   0,   0,   0,   0,
+   952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375,
+  1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353,
+  1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234,
+  1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403,
+  1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412,
+  1409,1414,1109,1297,1117,1306,1116,1304,1112,1300,   0,   0,   0,   0,   0,   0,
+  1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721,
+  1477,1478,1729,1731,1730,1732,   0,   0,1435,1436,1733,1735,1734,1736,   0,   0,
+  1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757,
+  1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776,
+  1495,1496,1777,1779,1778,1780,   0,   0,1451,1452,1781,1783,1782,1784,   0,   0,
+  1504,1505,1785,1788,1786,1789,1787,1790,   0,1459,   0,1791,   0,1792,   0,1793,
+  1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814,
+  1467,  21,1475,  22,1479,  23,1485,  24,1493,  27,1499,  28,1507,  29,   0,   0,
+  1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728,
+  1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764,
+  1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821,
+  1470,1469,1822,1474,1465,   0,1473,1825,1429,1428,1426,  12,1432,   0,  26,   0,
+     0,1315,1823,1484,1466,   0,1483,1829,1433,  13,1437,  14,1441,1826,1827,1828,
+  1488,1487,1513,  19,   0,   0,1492,1515,1445,1444,1442,  15,   0,1831,1832,1833,
+  1502,1501,1516,  25,1497,1498,1506,1518,1457,1456,1454,  17,1453,1313,  11,   3,
+     0,   0,1824,1512,1519,   0,1511,1830,1449,  16,1460,  18,1464,   4,   0,   0,
+    30,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,  20,   0,   0,   0,   2,   6,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1834,1835,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1836,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1837,1839,1838,
+     0,   0,   0,   0,1840,   0,   0,   0,   0,1841,   0,   0,1842,   0,   0,   0,
+     0,   0,   0,   0,1843,   0,1844,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,1845,   0,   0,1846,   0,   0,1847,   0,1848,   0,   0,   0,   0,   0,   0,
+   937,   0,1850,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1849, 936, 938,
+  1851,1852,   0,   0,1853,1854,   0,   0,1855,1856,   0,   0,   0,   0,   0,   0,
+  1857,1858,   0,   0,1861,1862,   0,   0,1863,1864,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1867,1868,1869,1870,
+  1859,1860,1865,1866,   0,   0,   0,   0,   0,   0,1871,1872,1873,1874,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,  32,  33,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1875,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1877,   0,1878,   0,
+  1879,   0,1880,   0,1881,   0,1882,   0,1883,   0,1884,   0,1885,   0,1886,   0,
+  1887,   0,1888,   0,   0,1889,   0,1890,   0,1891,   0,   0,   0,   0,   0,   0,
+  1892,1893,   0,1894,1895,   0,1896,1897,   0,1898,1899,   0,1900,1901,   0,   0,
+     0,   0,   0,   0,1876,   0,   0,   0,   0,   0,   0,   0,   0,   0,1902,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1904,   0,1905,   0,
+  1906,   0,1907,   0,1908,   0,1909,   0,1910,   0,1911,   0,1912,   0,1913,   0,
+  1914,   0,1915,   0,   0,1916,   0,1917,   0,1918,   0,   0,   0,   0,   0,   0,
+  1919,1920,   0,1921,1922,   0,1923,1924,   0,1925,1926,   0,1927,1928,   0,   0,
+     0,   0,   0,   0,1903,   0,   0,1929,1930,1931,1932,   0,   0,   0,1933,   0,
+   710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601,
+   663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662,
+   810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168,
+   368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758,
+   811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585,
+   594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259,
+   313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697,
+   424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170,
+   193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330,
+   337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473,
+   683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603,
+   608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411,
+   479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583,
+   791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269,
+   377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510,
+   659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156,
+   153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210,   0,   0,
+   227,   0, 379,   0,   0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604,   0,
+   661,   0, 703,   0,   0, 735, 743,   0,   0,   0, 793, 794, 795, 808, 741, 773,
+   118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329,
+   335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548,
+   549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651,
+   690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623,   0,   0,
+   102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243,
+   250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362,
+   370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490,
+   493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586,
+   591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706,
+   709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848,
+   847, 857,  55,  65,  66, 883, 892, 916, 822, 824,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1586,   0,1605,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1602,1603,1934,1935,1574,1575,
+  1576,1577,1579,1580,1581,1583,1584,   0,1585,1587,1588,1589,1591,   0,1592,   0,
+  1593,1594,   0,1595,1596,   0,1598,1599,1600,1601,1604,1582,1578,1590,1597,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1936,   0,1937,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1938,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1939,1940,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1941,1942,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1944,1943,   0,1945,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1946,1947,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1948,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1949,1950,
+  1951,1952,1953,1954,1955,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1956,1957,1958,1960,1959,
+  1961,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+   106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125,  34, 830, 130, 131,
+   132, 137, 827,  35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152,  37,
+   157, 158, 159, 160,  38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179,
+   181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195,
+   197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216,
+   153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244,
+   836, 837, 247, 248, 249, 246, 251,  39,  40, 253, 255, 255, 838, 257, 258, 259,
+   261, 839, 262, 263, 301, 264,  41, 266, 270, 272, 271, 841, 274, 842, 277, 276,
+   278, 281, 282,  42, 283, 284, 285, 286,  43, 843,  44, 289, 290, 291, 293, 934,
+   298, 845, 845, 621, 300, 300,  45, 852, 894, 302, 304,  46, 306, 309, 310, 312,
+   316,  48,  47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334,
+   335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361,
+   358, 356,  49, 363, 365, 367, 364,  50, 369, 371, 851, 376, 386, 378,  53, 381,
+    52,  51, 140, 141, 387, 382, 614,  78, 388, 389, 390, 394, 392, 856,  54, 399,
+   396, 402, 404, 858, 405, 401, 407,  55, 408, 409, 410, 413, 859, 415,  56, 417,
+   860, 418,  57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433,
+   437, 441, 438, 439, 442, 443, 864, 436, 449, 450,  58, 454, 453, 865, 447, 460,
+   866, 867, 461, 466, 465, 464,  59, 467, 470, 469, 472, 828, 475, 868, 478, 870,
+   483, 485, 486, 871, 488, 489, 872, 873, 495, 497,  60, 498,  61,  61, 504, 505,
+   507, 508, 511,  62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878,  63,  64,
+   528, 880, 879, 881, 882, 530, 531, 531, 533,  66, 534,  67,  68, 884, 536, 538,
+   541,  69, 885, 549, 886, 887, 556, 559,  70, 561, 562, 563, 888, 889, 889, 567,
+    71, 890, 570, 571,  72, 891, 577,  73, 581, 579, 582, 893, 587,  74, 590, 592,
+   596,  75, 895, 896,  76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611,
+   853,  77, 615, 616,  79, 617, 252, 902, 903, 854, 855, 621, 622, 731,  80, 627,
+   626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651,
+   638, 643, 644, 645, 905, 907, 906,  81, 653, 654, 656, 911, 657, 908,  82,  83,
+   909, 910,  84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675,  85,
+   677, 678,  86, 681, 682, 912, 685, 686,  87, 689,  36, 913, 914,  88,  89, 696,
+   702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728,
+   918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762,  90,
+   764, 922,  91, 775, 279, 780, 923, 925,  92,  93, 785, 926,  94, 927, 787, 787,
+   789, 928, 792,  95, 796, 797, 798, 800,  96, 929, 802, 804, 806,  97,  98, 807,
+   930,  99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935,   0,   0,
 };
 static const int16_t
 _hb_ucd_i16[196] =
@@ -2797,12 +2799,12 @@ _hb_ucd_i16[196] =
 static inline uint_fast8_t
 _hb_ucd_gc (unsigned u)
 {
-  return u<1114110u?_hb_ucd_u8[6800+(((_hb_ucd_u8[1312+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
+  return u<1114110u?_hb_ucd_u8[6808+(((_hb_ucd_u8[1312+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
 }
 static inline uint_fast8_t
 _hb_ucd_ccc (unsigned u)
 {
-  return u<125259u?_hb_ucd_u8[8792+(((_hb_ucd_u8[8236+(((_hb_ucd_u8[7776+(((_hb_ucd_u8[7424+(((_hb_ucd_u8[7178+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0;
+  return u<125259u?_hb_ucd_u8[8800+(((_hb_ucd_u8[8244+(((_hb_ucd_u8[7784+(((_hb_ucd_u8[7432+(((_hb_ucd_u8[7186+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0;
 }
 static inline unsigned
 _hb_ucd_b4 (const uint8_t* a, unsigned i)
@@ -2812,24 +2814,24 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i
 static inline int_fast16_t
 _hb_ucd_bmg (unsigned u)
 {
-  return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9540+(((_hb_ucd_u8[9420+(((_hb_ucd_b4(9292+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0;
+  return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9548+(((_hb_ucd_u8[9428+(((_hb_ucd_b4(9300+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0;
 }
 static inline uint_fast8_t
 _hb_ucd_sc (unsigned u)
 {
-  return u<918000u?_hb_ucd_u8[11062+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10326+(((_hb_ucd_u8[9876+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2;
+  return u<918000u?_hb_ucd_u8[11070+(((_hb_ucd_u16[2048+(((_hb_ucd_u8[10334+(((_hb_ucd_u8[9884+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2;
 }
 static inline uint_fast16_t
 _hb_ucd_dm (unsigned u)
 {
-  return u<195102u?_hb_ucd_u16[6008+(((_hb_ucd_u8[17068+(((_hb_ucd_u8[16686+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
+  return u<195102u?_hb_ucd_u16[6032+(((_hb_ucd_u8[17084+(((_hb_ucd_u8[16702+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
 }
 
 
 #elif !defined(HB_NO_UCD_UNASSIGNED)
 
 static const uint8_t
-_hb_ucd_u8[14744] =
+_hb_ucd_u8[14752] =
 {
     0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
     7,  7,  7,  7,  9, 10,  7,  7,  7,  7, 11, 12, 13, 13, 13, 14,
@@ -2906,13 +2908,13 @@ _hb_ucd_u8[14744] =
    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,243, 34,
   244, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,245, 34, 34,
-   34, 34, 34, 34, 34, 34, 34,246,122,122,122,122,122,122,122,122,
-   34, 34, 34, 34,247,122,122,122,122,122,122,122,122,122,122,122,
-   34, 34, 34, 34, 34, 34,248, 34, 34, 34, 34, 34, 34, 34, 34, 34,
-   34, 34, 34, 34, 34, 34, 34,249,122,122,122,122,122,122,122,122,
-  250,122,251,252,122,122,122,122,122,122,122,122,122,122,122,122,
-  107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,253,
+   34, 34, 34, 34, 34, 34, 34,246, 34, 34, 34, 34,247,122,122,122,
+   34, 34, 34, 34,248,122,122,122,122,122,122,122,122,122,122,122,
+   34, 34, 34, 34, 34, 34,249, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34,250,122,122,122,122,122,122,122,122,
+  251,122,252,253,122,122,122,122,122,122,122,122,122,122,122,122,
   107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,254,
+  107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,255,
     0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  2,  4,  5,  6,  2,
     7,  7,  7,  7,  7,  2,  8,  9, 10, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16,
@@ -3075,11 +3077,11 @@ _hb_ucd_u8[14744] =
   121,  4,  4,  4,  4,  2,  2, 88,  2,  2,  2,  2,  2,120,  2,  2,
   108,151,  2,  2,  2,  2,  2,  2, 67,  2,152,148,148,148,153, 44,
    67, 67, 67, 67, 67, 55, 67, 67, 67, 67, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 44, 44,
-    1,  2,154,155,  4,  4,  4,  4,  4, 67,  4,  4,  4,  4,156,157,
-  158,105,105,105,105, 43, 43, 86,159, 40, 40, 67,105,160, 63, 67,
-   36, 36, 36, 61, 57,161,162, 69, 36, 36, 36, 36, 36, 63, 40, 69,
-   44, 44, 62, 36, 36, 36, 36, 36, 67, 27, 27, 67, 67, 67, 67, 67,
+   67, 67, 67, 44, 44, 44, 44, 44,  1,  2,154,155,  4,  4,  4,  4,
+    4, 67,  4,  4,  4,  4,156,157,158,105,105,105,105, 43, 43, 86,
+  159, 40, 40, 67,105,160, 63, 67, 36, 36, 36, 61, 57,161,162, 69,
+   36, 36, 36, 36, 36, 63, 40, 69, 44, 44, 62, 36, 36, 36, 36, 36,
+   67, 27, 27, 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 44, 55,
    67, 67, 67, 67, 67, 67, 67, 92, 27, 27, 27, 27, 27, 67, 67, 67,
    67, 67, 67, 67, 27, 27, 27, 27,163, 27, 27, 27, 27, 27, 27, 27,
    36, 36, 83, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,164,  2,
@@ -3247,218 +3249,218 @@ _hb_ucd_u8[14744] =
    44, 61, 44, 62, 62, 62, 62, 36, 62, 61, 61, 62, 62, 62, 62, 62,
    62, 61, 61, 62, 36, 61, 36, 36, 36, 61, 36, 36, 62, 36, 61, 61,
    36, 36, 36, 36, 36, 62, 36, 36, 62, 36, 62, 36, 36, 62, 36, 36,
-    8, 44, 44, 44, 44, 44, 44, 44, 55, 67, 67, 67, 67, 67, 67, 67,
-   27, 27, 27, 27, 27, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 44,
-   44, 44, 44, 67, 67, 67, 67, 67, 67, 92, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 67, 92, 44, 44, 44, 67, 44, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 67, 67,
-   67, 67, 67, 92, 44, 55, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44,
-   67, 67, 67, 67, 67, 67, 67, 55, 67, 67, 67, 44, 44, 44, 44, 67,
-   67, 92, 67, 67, 67, 67, 67, 67, 79, 44, 44, 44, 44, 44, 44, 44,
-  171,171,171,171,171,171,171, 44,171,171,171,171,171,171,171,  0,
-    0,  0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13,
-   25, 25, 25, 21, 21,  9,  9,  9,  9, 22, 21, 18, 24, 16, 24,  5,
-    5,  5,  5, 22, 25, 18, 25,  0, 23, 23, 26, 21, 24, 26,  7, 20,
-   25,  1, 26, 24, 26, 25, 15, 15, 24, 15,  7, 19, 15, 21,  9, 25,
-    9,  5,  5, 25,  5,  9,  5,  7,  7,  7,  9,  8,  8,  5,  7,  5,
-    6,  6, 24, 24,  6, 24, 12, 12,  2,  2,  6,  5,  9, 21,  9,  2,
-    2,  9, 25,  9, 26, 12, 11, 11,  2,  6,  5, 21, 17,  2,  2, 26,
-   26, 23,  2, 12, 17, 12, 21, 12, 12, 21,  7,  2,  2,  7,  7, 21,
-   21,  2,  1,  1, 21, 23, 26, 26,  1, 21,  6,  7,  7, 12, 12,  7,
-   21,  7, 12,  1, 12,  6,  6, 12, 12, 26,  7, 26, 26,  7,  2,  1,
-   12,  2,  6,  2, 24,  7,  7,  6,  1, 12, 12, 10, 10, 10, 10, 12,
-   21,  6,  2, 10, 10,  2, 15, 26, 26,  2,  2, 21,  7, 10, 15,  7,
-    2, 23, 21, 26, 10,  7, 21, 15, 15,  2, 17,  7, 29,  7,  7, 22,
-   18,  2, 14, 14, 14,  7, 10, 21, 17, 21, 11, 12,  5,  2,  5,  6,
-    8,  8,  8, 24,  5, 24,  2, 24,  9, 24, 24,  2, 29, 29, 29,  1,
-   17, 17, 20, 19, 22, 20, 27, 28,  1, 29, 21, 20, 19, 21, 21, 16,
-   16, 21, 25, 22, 18, 21, 21, 29,  1,  2, 15,  6, 18,  6, 23,  2,
-   12, 11,  9, 26, 26,  9, 26,  5,  5, 26, 14,  9,  5, 14, 14, 15,
-   25, 26, 26, 22, 18, 26, 18, 25, 18, 22,  5, 12,  2,  5, 22, 21,
-   21, 22, 18, 17, 26,  6,  7, 14, 17, 22, 18, 18, 26, 14, 17,  6,
-   14,  6, 12, 24, 24,  6, 26, 15,  6, 21, 11, 21, 24,  9,  6,  9,
-   23, 26,  6, 10,  4,  4,  3,  3,  7, 25, 17, 16, 16, 22, 16, 16,
-   25, 17, 25,  2, 25, 24,  2, 15, 12, 15, 14,  2, 21, 14,  7, 15,
-   12, 17, 21,  1, 26, 10, 10,  1, 23, 15,  0,  1,  2,  3,  4,  5,
-    6,  7,  8,  9,  0, 10, 11, 12, 13,  0, 14,  0,  0,  0,  0,  0,
-   15,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17, 18, 19,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 20,  0, 21, 22, 23,  0,  0,  0, 24,
-   25, 26, 27, 28, 29, 30, 31, 32, 33, 34,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 35,
-    0, 36,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 37,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 38, 39,  0,  0,  0,  0,  0,  0, 40, 41, 42,  0, 43,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  0,  0,
-    0,  0,  3,  0,  0,  0,  4,  5,  6,  7,  0,  8,  9, 10,  0, 11,
-   12, 13, 14, 15, 16, 17, 16, 18, 16, 19, 16, 19, 16, 19,  0, 19,
-   16, 20, 16, 19, 21, 19,  0, 22, 23, 24, 25, 26, 27, 28, 29, 30,
-   31,  0, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 33,  0,  0,
-    0,  0,  0,  0, 34,  0,  0, 35,  0,  0, 36,  0, 37,  0,  0,  0,
-   38, 39, 40, 41, 42, 43, 44, 45, 46,  0,  0, 47,  0,  0,  0, 48,
-    0,  0,  0, 49,  0,  0,  0,  0,  0,  0,  0, 50,  0, 51,  0, 52,
-   53,  0, 54,  0,  0,  0,  0,  0,  0, 55, 56, 57,  0,  0,  0,  0,
-   58,  0,  0, 59, 60, 61, 62, 63,  0,  0, 64, 65,  0,  0,  0, 66,
-    0,  0,  0,  0, 67,  0,  0,  0, 68,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 69,  0,  0,  0, 70,  0, 71,  0,  0,
-   72,  0,  0, 73,  0,  0,  0,  0,  0,  0,  0,  0, 74,  0,  0,  0,
-    0,  0, 75, 76,  0, 77, 78,  0,  0, 79, 80,  0, 81, 62,  0, 82,
-   83,  0,  0, 84, 85, 86,  0,  0,  0, 87,  0, 88,  0,  0, 51, 89,
-   51,  0, 90,  0, 91,  0,  0,  0, 80,  0,  0,  0, 92, 93,  0, 94,
-   95, 96, 97,  0,  0,  0,  0,  0, 51,  0,  0,  0,  0, 98, 99,  0,
-    0,  0,  0,  0,  0,100,  0,  0,  0,  0,  0,101,102,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,103,  0,  0,104,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,105,106,  0,  0,107,  0,  0,  0,  0,  0,  0,
-  108,  0,109,  0,102,  0,  0,  0,  0,  0,110,111,  0,  0,  0,  0,
-    0,  0,  0,112,  0,  0,  0,  0,  0,  0,  0,113,  0,114,  0,  0,
-    0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  0,  8,  0,  0,  0,
-    0,  9, 10, 11, 12,  0,  0,  0,  0, 13,  0,  0, 14, 15,  0, 16,
-    0, 17, 18,  0,  0, 19,  0, 20, 21,  0,  0,  0,  0,  0, 22, 23,
-    0, 24, 25,  0,  0, 26,  0,  0,  0, 27,  0,  0, 28, 29, 30, 31,
-    0,  0,  0, 32, 33, 34,  0,  0, 33,  0,  0, 35, 33,  0,  0,  0,
-   33, 36,  0,  0,  0,  0,  0, 37, 38,  0,  0,  0,  0,  0,  0, 39,
-   40,  0,  0,  0,  0,  0,  0, 41, 42,  0,  0,  0,  0, 43,  0, 44,
-    0,  0,  0, 45, 46,  0,  0,  0, 47,  0,  0,  0,  0,  0,  0, 48,
-   49,  0,  0,  0,  0, 50,  0,  0,  0, 51,  0, 52,  0, 53,  0,  0,
-    0,  0, 54,  0,  0,  0,  0, 55,  0, 56,  0,  0,  0,  0, 57, 58,
-    0,  0,  0, 59, 60,  0,  0,  0,  0,  0,  0, 61, 52,  0, 62, 63,
-    0,  0, 64,  0,  0,  0, 65, 66,  0,  0,  0, 67,  0, 68, 69, 70,
-   71, 72,  1, 73,  0, 74, 75, 76,  0,  0, 77, 78,  0,  0,  0, 79,
-    0,  0,  1,  1,  0,  0, 80,  0,  0, 81,  0,  0,  0,  0, 77, 82,
-    0, 83,  0,  0,  0,  0,  0, 78, 84,  0, 85,  0, 52,  0,  1, 78,
-    0,  0, 86,  0,  0, 87,  0,  0,  0,  0,  0, 88, 57,  0,  0,  0,
-    0,  0,  0, 89, 90,  0,  0, 84,  0,  0, 33,  0,  0, 91,  0,  0,
-    0,  0, 92,  0,  0,  0,  0, 49,  0,  0, 93,  0,  0,  0,  0, 94,
-   95,  0,  0, 96,  0,  0, 97,  0,  0,  0, 98,  0,  0,  0, 99,  0,
-    0,  0,  0,100,101, 93,  0,  0,102,  0,  0,  0, 84,  0,  0,103,
-    0,  0,  0,104,105,  0,  0,106,107,  0,  0,  0,  0,  0,  0,108,
-    0,  0,109,  0,  0,  0,  0,110, 33,  0,111,112,113, 35,  0,  0,
-  114,  0,  0,  0,115,  0,  0,  0,  0,  0,  0,116,  0,  0,117,  0,
-    0,  0,  0,118, 88,  0,  0,  0,  0,  0, 57,  0,  0,  0,  0, 52,
-  119,  0,  0,  0,  0,120,  0,  0,121,  0,  0,  0,  0,119,  0,  0,
-  122,  0,  0,  0,  0,  0,  0,123,  0,  0,  0,124,  0,  0,  0,125,
-    0,126,  0,  0,  0,  0,127,128,129,  0,130,  0,131,  0,  0,  0,
-  132,133,134,  0, 77,  0,  0,  0,  0,  0, 35,  0,  0,  0,135,  0,
-    0,  0,136,  0,  0,137,  0,  0,138,  0,  0,  0,  0,  0,  0,  0,
-    1,  1,  1,  1,  1,  2,  3,  4,  5,  6,  7,  4,  4,  8,  9, 10,
-    1, 11, 12, 13, 14, 15, 16, 17, 18,  1,  1,  1, 19,  1,  0,  0,
-   20, 21, 22,  1, 23,  4, 21, 24, 25, 26, 27, 28, 29, 30,  0,  0,
-    1,  1, 31,  0,  0,  0, 32, 33, 34, 35,  1, 36, 37,  0,  0,  0,
-    0, 38,  1, 39, 14, 39, 40, 41, 42,  0,  0,  0, 43, 36, 44, 45,
-   21, 45, 46,  0,  0,  0, 19,  1, 21,  0,  0, 47,  0, 38, 48,  1,
-    1, 49, 49, 50,  0,  0, 51,  0,  0,  0, 52,  1,  0,  0, 38, 14,
-    4,  1,  1,  1, 53, 21, 43, 52, 54, 21, 35,  1,  0,  0,  0, 55,
-    0,  0,  0, 56, 57, 58,  0,  0,  0,  0,  0, 59,  0, 60,  0,  0,
-    0,  0, 61, 62,  0,  0, 63,  0,  0,  0, 64,  0,  0,  0, 65,  0,
-    0,  0, 66,  0,  0,  0, 67,  0,  0,  0, 68,  0,  0, 69, 70,  0,
-   71, 72, 73, 74, 75, 76,  0,  0,  0, 77,  0,  0,  0, 78, 79,  0,
-    0,  0,  0, 47,  0,  0,  0, 49,  0, 80,  0,  0,  0, 62,  0,  0,
-   63,  0,  0, 81,  0,  0, 82,  0,  0,  0, 83,  0,  0, 19, 84,  0,
-   62,  0,  0,  0,  0, 49,  1, 85,  1, 52, 15, 86, 36, 10, 21, 87,
-    0, 55,  0,  0,  0,  0, 19, 10,  1,  0,  0,  0,  0,  0, 88,  0,
-    0, 89,  0,  0, 88,  0,  0,  0,  0, 78,  0,  0, 87,  9, 12,  4,
-   90,  8, 91, 47,  0, 58, 50,  0, 21,  1, 21, 92, 93,  1,  1,  1,
-    1, 94, 95, 96, 97,  1, 98, 58, 81, 99,100,  4, 58,  0,  0,  0,
-    0,  0,  0, 19, 50,  0,  0,  0,  0,  0,  0, 61,  0,  0,101,102,
-    0,  0,103,  0,  0,  1,  1, 50,  0,  0,  0, 38,  0, 63,  0,  0,
-    0,  0,  0, 62,  0,  0,104, 68, 61,  0,  0,  0, 78,  0,  0,  0,
-  105,106, 58, 38, 81,  0,  0,  0,  0,  0,  0,107,  1, 14,  4, 12,
-   84,  0,  0,  0,  0, 38, 87,  0,  0,  0,  0,108,  0,  0,109, 61,
-    0,110,  0,  0,  0,  1,  0,  0,  0,  0, 19, 58,  0,  0,  0, 51,
-    0,111, 14, 52,112, 41,  0,  0, 62,  0,  0, 61,  0,  0,113,  0,
-   87,  0,  0,  0, 61, 62,  0,  0, 62,  0, 89,  0,  0,113,  0,  0,
-    0,  0,114,  0,  0,  0, 78, 55,  0, 38,  1, 58,  1, 58,  0,  0,
-   63, 89,  0,  0,115,  0,  0,  0, 55,  0,  0,  0,  0,115,  0,  0,
-    0,  0, 61,  0,  0,  0,  0, 79,  0, 61,  0,  0,  0,  0, 56,  0,
-   89, 80,  0,  0, 79,  0,  0,  0,  8, 91,  0,  0,  1, 87,  0,  0,
-  116,  0,  0,  0,  0,  0,  0,117,  0,118,119,120,121,  0,104,  4,
-  122, 49, 23,  0,  0,  0, 38, 50, 38, 58,  0,  0,  1, 87,  1,  1,
-    1,  1, 39,  1, 48,105, 87,  0,  0,  0,  0,  1,  0,  0,  0,123,
-    4,122,  0,  0,  0,  1,124,  0,  0,  0,  0,  0,230,230,230,230,
-  230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220,
-  220,220,220,202,202,220,220,220,  1,  1,  1,  1,  1,220,220,220,
-  220,230,230,230,230,240,230,220,220,220,230,230,230,220,220,  0,
-  230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233,
-  234,234,233,230,  0,  0,  0,230,  0,220,230,230,230,230,220,230,
-  230,230,222,220,230,230,220,220,230,222,228,230, 10, 11, 12, 13,
-   14, 15, 16, 17, 18, 19, 19, 20, 21, 22,  0, 23,  0, 24, 25,  0,
-  230,220,  0, 18, 30, 31, 32,  0,  0,  0,  0, 27, 28, 29, 30, 31,
-   32, 33, 34,230,230,220,220,230,220,230,230,220, 35,  0,  0,  0,
-    0,  0,230,230,230,  0,  0,230,230,  0,220,230,230,220,  0,  0,
-    0, 36,  0,  0,230,220,230,230,220,220,230,220,220,230,220,230,
-  220,230,230,  0,  0,220,  0,  0,230,230,  0,230,  0,230,230,230,
-  230,230,  0,  0,  0,220,220,220,230,220,220,220,230,230,  0,220,
-   27, 28, 29,230,  7,  0,  0,  0,  0,  9,  0,  0,  0,230,220,230,
-  230,  0,  0,  0,  0,  0,230,  0,  0, 84, 91,  0,  0,  0,  0,  9,
-    9,  0,  0,  0,  0,  0,  9,  0,103,103,  9,  0,107,107,107,107,
-  118,118,  9,  0,122,122,122,122,220,220,  0,  0,  0,220,  0,220,
-    0,216,  0,  0,  0,129,130,  0,132,  0,  0,  0,  0,  0,130,130,
-  130,130,  0,  0,130,  0,230,230,  9,  0,230,230,  0,  0,220,  0,
-    0,  0,  0,  7,  0,  9,  9,  0,  9,  9,  0,  0,  0,230,  0,  0,
-    0,228,  0,  0,  0,222,230,220,220,  0,  0,  0,230,  0,  0,220,
-  230,220,  0,220,230,230,230,  0,  0,  0,  9,  9,  0,  0,  7,  0,
-  230,  0,  1,  1,  1,  0,  0,  0,230,234,214,220,202,230,230,230,
-  230,230,232,228,228,220,218,230,233,220,230,220,230,230,  1,  1,
-    1,  1,  1,230,  0,  1,  1,230,220,230,  1,  1,  0,  0,218,228,
-  232,222,224,224,  0,  8,  8,  0,  0,  0,  0,220,230,  0,230,230,
-  220,  0,  0,230,  0,  0, 26,  0,  0,220,  0,230,230,  1,220,  0,
-    0,230,220,  0,  0,  0,220,220,  0,  0,230,220,  0,  9,  7,  0,
-    0,  7,  9,  0,  0,  0,  9,  7,  6,  6,  0,  0,  0,  0,  1,  0,
-    0,216,216,  1,  1,  1,  0,  0,  0,226,216,216,216,216,216,  0,
-  220,220,220,  0,232,232,220,230,230,230,  7,  0, 16, 17, 17, 33,
-   17, 49, 17, 17, 84, 97,135,145, 26, 17, 17, 17, 17, 17, 17, 17,
+    8, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 44, 44,
+   55, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27, 27, 27, 91, 67,
+   67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67,
+   67, 92, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 92, 44, 44, 44,
+   67, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 25, 41, 41,
+   67, 67, 67, 67, 44, 44, 67, 67, 67, 67, 67, 92, 44, 55, 67, 67,
+   67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 67, 55,
+   67, 67, 67, 44, 44, 44, 44, 67, 67, 92, 67, 67, 67, 67, 67, 67,
+   79, 44, 44, 44, 44, 44, 44, 44,171,171,171,171,171,171,171, 44,
+  171,171,171,171,171,171,171,  0,  0,  0, 29, 21, 21, 21, 23, 21,
+   22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21,  9,  9,  9,
+    9, 22, 21, 18, 24, 16, 24,  5,  5,  5,  5, 22, 25, 18, 25,  0,
+   23, 23, 26, 21, 24, 26,  7, 20, 25,  1, 26, 24, 26, 25, 15, 15,
+   24, 15,  7, 19, 15, 21,  9, 25,  9,  5,  5, 25,  5,  9,  5,  7,
+    7,  7,  9,  8,  8,  5,  7,  5,  6,  6, 24, 24,  6, 24, 12, 12,
+    2,  2,  6,  5,  9, 21,  9,  2,  2,  9, 25,  9, 26, 12, 11, 11,
+    2,  6,  5, 21, 17,  2,  2, 26, 26, 23,  2, 12, 17, 12, 21, 12,
+   12, 21,  7,  2,  2,  7,  7, 21, 21,  2,  1,  1, 21, 23, 26, 26,
+    1, 21,  6,  7,  7, 12, 12,  7, 21,  7, 12,  1, 12,  6,  6, 12,
+   12, 26,  7, 26, 26,  7,  2,  1, 12,  2,  6,  2, 24,  7,  7,  6,
+    1, 12, 12, 10, 10, 10, 10, 12, 21,  6,  2, 10, 10,  2, 15, 26,
+   26,  2,  2, 21,  7, 10, 15,  7,  2, 23, 21, 26, 10,  7, 21, 15,
+   15,  2, 17,  7, 29,  7,  7, 22, 18,  2, 14, 14, 14,  7, 10, 21,
+   17, 21, 11, 12,  5,  2,  5,  6,  8,  8,  8, 24,  5, 24,  2, 24,
+    9, 24, 24,  2, 29, 29, 29,  1, 17, 17, 20, 19, 22, 20, 27, 28,
+    1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29,
+    1,  2, 15,  6, 18,  6, 23,  2, 12, 11,  9, 26, 26,  9, 26,  5,
+    5, 26, 14,  9,  5, 14, 14, 15, 25, 26, 26, 22, 18, 26, 18, 25,
+   18, 22,  5, 12,  2,  5, 22, 21, 21, 22, 18, 17, 26,  6,  7, 14,
+   17, 22, 18, 18, 26, 14, 17,  6, 14,  6, 12, 24, 24,  6, 26, 15,
+    6, 21, 11, 21, 24,  9,  6,  9, 23, 26,  6, 10,  4,  4,  3,  3,
+    7, 25, 17, 16, 16, 22, 16, 16, 25, 17, 25,  2, 25, 24,  2, 15,
+   12, 15, 14,  2, 21, 14,  7, 15, 12, 17, 21,  1, 26, 10, 10,  1,
+   23, 15,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  0, 10, 11, 12,
+   13,  0, 14,  0,  0,  0,  0,  0, 15,  0, 16,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 17, 18, 19,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 20,
+    0, 21, 22, 23,  0,  0,  0, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+   33, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 35,  0, 36,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   37,  0,  0,  0,  0,  0,  0,  0,  0,  0, 38, 39,  0,  0,  0,  0,
+    0,  0, 40, 41, 42,  0, 43,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  1,  2,  0,  0,  0,  0,  3,  0,  0,  0,  4,  5,
+    6,  7,  0,  8,  9, 10,  0, 11, 12, 13, 14, 15, 16, 17, 16, 18,
+   16, 19, 16, 19, 16, 19,  0, 19, 16, 20, 16, 19, 21, 19,  0, 22,
+   23, 24, 25, 26, 27, 28, 29, 30, 31,  0, 32,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 33,  0,  0,  0,  0,  0,  0, 34,  0,  0, 35,
+    0,  0, 36,  0, 37,  0,  0,  0, 38, 39, 40, 41, 42, 43, 44, 45,
+   46,  0,  0, 47,  0,  0,  0, 48,  0,  0,  0, 49,  0,  0,  0,  0,
+    0,  0,  0, 50,  0, 51,  0, 52, 53,  0, 54,  0,  0,  0,  0,  0,
+    0, 55, 56, 57,  0,  0,  0,  0, 58,  0,  0, 59, 60, 61, 62, 63,
+    0,  0, 64, 65,  0,  0,  0, 66,  0,  0,  0,  0, 67,  0,  0,  0,
+   68,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 69,
+    0,  0,  0, 70,  0, 71,  0,  0, 72,  0,  0, 73,  0,  0,  0,  0,
+    0,  0,  0,  0, 74,  0,  0,  0,  0,  0, 75, 76,  0, 77, 78,  0,
+    0, 79, 80,  0, 81, 62,  0, 82, 83,  0,  0, 84, 85, 86,  0,  0,
+    0, 87,  0, 88,  0,  0, 51, 89, 51,  0, 90,  0, 91,  0,  0,  0,
+   80,  0,  0,  0, 92, 93,  0, 94, 95, 96, 97,  0,  0,  0,  0,  0,
+   51,  0,  0,  0,  0, 98, 99,  0,  0,  0,  0,  0,  0,100,  0,  0,
+    0,  0,  0,101,102,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,103,
+    0,  0,104,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,105,106,  0,
+    0,107,  0,  0,  0,  0,  0,  0,108,  0,109,  0,102,  0,  0,  0,
+    0,  0,110,111,  0,  0,  0,  0,  0,  0,  0,112,  0,  0,  0,  0,
+    0,  0,  0,113,  0,114,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,
+    5,  6,  7,  0,  8,  0,  0,  0,  0,  9, 10, 11, 12,  0,  0,  0,
+    0, 13,  0,  0, 14, 15,  0, 16,  0, 17, 18,  0,  0, 19,  0, 20,
+   21,  0,  0,  0,  0,  0, 22, 23,  0, 24, 25,  0,  0, 26,  0,  0,
+    0, 27,  0,  0, 28, 29, 30, 31,  0,  0,  0, 32, 33, 34,  0,  0,
+   33,  0,  0, 35, 33,  0,  0,  0, 33, 36,  0,  0,  0,  0,  0, 37,
+   38,  0,  0,  0,  0,  0,  0, 39, 40,  0,  0,  0,  0,  0,  0, 41,
+   42,  0,  0,  0,  0, 43,  0, 44,  0,  0,  0, 45, 46,  0,  0,  0,
+   47,  0,  0,  0,  0,  0,  0, 48, 49,  0,  0,  0,  0, 50,  0,  0,
+    0, 51,  0, 52,  0, 53,  0,  0,  0,  0, 54,  0,  0,  0,  0, 55,
+    0, 56,  0,  0,  0,  0, 57, 58,  0,  0,  0, 59, 60,  0,  0,  0,
+    0,  0,  0, 61, 52,  0, 62, 63,  0,  0, 64,  0,  0,  0, 65, 66,
+    0,  0,  0, 67,  0, 68, 69, 70, 71, 72,  1, 73,  0, 74, 75, 76,
+    0,  0, 77, 78,  0,  0,  0, 79,  0,  0,  1,  1,  0,  0, 80,  0,
+    0, 81,  0,  0,  0,  0, 77, 82,  0, 83,  0,  0,  0,  0,  0, 78,
+   84,  0, 85,  0, 52,  0,  1, 78,  0,  0, 86,  0,  0, 87,  0,  0,
+    0,  0,  0, 88, 57,  0,  0,  0,  0,  0,  0, 89, 90,  0,  0, 84,
+    0,  0, 33,  0,  0, 91,  0,  0,  0,  0, 92,  0,  0,  0,  0, 49,
+    0,  0, 93,  0,  0,  0,  0, 94, 95,  0,  0, 96,  0,  0, 97,  0,
+    0,  0, 98,  0,  0,  0, 99,  0,  0,  0,  0,100,101, 93,  0,  0,
+  102,  0,  0,  0, 84,  0,  0,103,  0,  0,  0,104,105,  0,  0,106,
+  107,  0,  0,  0,  0,  0,  0,108,  0,  0,109,  0,  0,  0,  0,110,
+   33,  0,111,112,113, 35,  0,  0,114,  0,  0,  0,115,  0,  0,  0,
+    0,  0,  0,116,  0,  0,117,  0,  0,  0,  0,118, 88,  0,  0,  0,
+    0,  0, 57,  0,  0,  0,  0, 52,119,  0,  0,  0,  0,120,  0,  0,
+  121,  0,  0,  0,  0,119,  0,  0,122,  0,  0,  0,  0,  0,  0,123,
+    0,  0,  0,124,  0,  0,  0,125,  0,126,  0,  0,  0,  0,127,128,
+  129,  0,130,  0,131,  0,  0,  0,132,133,134,  0, 77,  0,  0,  0,
+    0,  0, 35,  0,  0,  0,135,  0,  0,  0,136,  0,  0,137,  0,  0,
+  138,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  2,  3,  4,
+    5,  6,  7,  4,  4,  8,  9, 10,  1, 11, 12, 13, 14, 15, 16, 17,
+   18,  1,  1,  1, 19,  1,  0,  0, 20, 21, 22,  1, 23,  4, 21, 24,
+   25, 26, 27, 28, 29, 30,  0,  0,  1,  1, 31,  0,  0,  0, 32, 33,
+   34, 35,  1, 36, 37,  0,  0,  0,  0, 38,  1, 39, 14, 39, 40, 41,
+   42,  0,  0,  0, 43, 36, 44, 45, 21, 45, 46,  0,  0,  0, 19,  1,
+   21,  0,  0, 47,  0, 38, 48,  1,  1, 49, 49, 50,  0,  0, 51,  0,
+    0,  0, 52,  1,  0,  0, 38, 14,  4,  1,  1,  1, 53, 21, 43, 52,
+   54, 21, 35,  1,  0,  0,  0, 55,  0,  0,  0, 56, 57, 58,  0,  0,
+    0,  0,  0, 59,  0, 60,  0,  0,  0,  0, 61, 62,  0,  0, 63,  0,
+    0,  0, 64,  0,  0,  0, 65,  0,  0,  0, 66,  0,  0,  0, 67,  0,
+    0,  0, 68,  0,  0, 69, 70,  0, 71, 72, 73, 74, 75, 76,  0,  0,
+    0, 77,  0,  0,  0, 78, 79,  0,  0,  0,  0, 47,  0,  0,  0, 49,
+    0, 80,  0,  0,  0, 62,  0,  0, 63,  0,  0, 81,  0,  0, 82,  0,
+    0,  0, 83,  0,  0, 19, 84,  0, 62,  0,  0,  0,  0, 49,  1, 85,
+    1, 52, 15, 86, 36, 10, 21, 87,  0, 55,  0,  0,  0,  0, 19, 10,
+    1,  0,  0,  0,  0,  0, 88,  0,  0, 89,  0,  0, 88,  0,  0,  0,
+    0, 78,  0,  0, 87,  9, 12,  4, 90,  8, 91, 47,  0, 58, 50,  0,
+   21,  1, 21, 92, 93,  1,  1,  1,  1, 94, 95, 96, 97,  1, 98, 58,
+   81, 99,100,  4, 58,  0,  0,  0,  0,  0,  0, 19, 50,  0,  0,  0,
+    0,  0,  0, 61,  0,  0,101,102,  0,  0,103,  0,  0,  1,  1, 50,
+    0,  0,  0, 38,  0, 63,  0,  0,  0,  0,  0, 62,  0,  0,104, 68,
+   61,  0,  0,  0, 78,  0,  0,  0,105,106, 58, 38, 81,  0,  0,  0,
+    0,  0,  0,107,  1, 14,  4, 12, 84,  0,  0,  0,  0, 38, 87,  0,
+    0,  0,  0,108,  0,  0,109, 61,  0,110,  0,  0,  0,  1,  0,  0,
+    0,  0, 19, 58,  0,  0,  0, 51,  0,111, 14, 52,112, 41,  0,  0,
+   62,  0,  0, 61,  0,  0,113,  0, 87,  0,  0,  0, 61, 62,  0,  0,
+   62,  0, 89,  0,  0,113,  0,  0,  0,  0,114,  0,  0,  0, 78, 55,
+    0, 38,  1, 58,  1, 58,  0,  0, 63, 89,  0,  0,115,  0,  0,  0,
+   55,  0,  0,  0,  0,115,  0,  0,  0,  0, 61,  0,  0,  0,  0, 79,
+    0, 61,  0,  0,  0,  0, 56,  0, 89, 80,  0,  0, 79,  0,  0,  0,
+    8, 91,  0,  0,  1, 87,  0,  0,116,  0,  0,  0,  0,  0,  0,117,
+    0,118,119,120,121,  0,104,  4,122, 49, 23,  0,  0,  0, 38, 50,
+   38, 58,  0,  0,  1, 87,  1,  1,  1,  1, 39,  1, 48,105, 87,  0,
+    0,  0,  0,  1,  0,  0,  0,123,  4,122,  0,  0,  0,  1,124,  0,
+    0,  0,  0,  0,230,230,230,230,230,232,220,220,220,220,232,216,
+  220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220,
+    1,  1,  1,  1,  1,220,220,220,220,230,230,230,230,240,230,220,
+  220,220,230,230,230,220,220,  0,230,230,230,220,220,220,220,230,
+  232,220,220,230,233,234,234,233,234,234,233,230,  0,  0,  0,230,
+    0,220,230,230,230,230,220,230,230,230,222,220,230,230,220,220,
+  230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20,
+   21, 22,  0, 23,  0, 24, 25,  0,230,220,  0, 18, 30, 31, 32,  0,
+    0,  0,  0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230,
+  220,230,230,220, 35,  0,  0,  0,  0,  0,230,230,230,  0,  0,230,
+  230,  0,220,230,230,220,  0,  0,  0, 36,  0,  0,230,220,230,230,
+  220,220,230,220,220,230,220,230,220,230,230,  0,  0,220,  0,  0,
+  230,230,  0,230,  0,230,230,230,230,230,  0,  0,  0,220,220,220,
+  230,220,220,220,230,230,  0,220, 27, 28, 29,230,  7,  0,  0,  0,
+    0,  9,  0,  0,  0,230,220,230,230,  0,  0,  0,  0,  0,230,  0,
+    0, 84, 91,  0,  0,  0,  0,  9,  9,  0,  0,  0,  0,  0,  9,  0,
+  103,103,  9,  0,107,107,107,107,118,118,  9,  0,122,122,122,122,
+  220,220,  0,  0,  0,220,  0,220,  0,216,  0,  0,  0,129,130,  0,
+  132,  0,  0,  0,  0,  0,130,130,130,130,  0,  0,130,  0,230,230,
+    9,  0,230,230,  0,  0,220,  0,  0,  0,  0,  7,  0,  9,  9,  0,
+    9,  9,  0,  0,  0,230,  0,  0,  0,228,  0,  0,  0,222,230,220,
+  220,  0,  0,  0,230,  0,  0,220,230,220,  0,220,230,230,230,  0,
+    0,  0,  9,  9,  0,  0,  7,  0,230,  0,  1,  1,  1,  0,  0,  0,
+  230,234,214,220,202,230,230,230,230,230,232,228,228,220,218,230,
+  233,220,230,220,230,230,  1,  1,  1,  1,  1,230,  0,  1,  1,230,
+  220,230,  1,  1,  0,  0,218,228,232,222,224,224,  0,  8,  8,  0,
+    0,  0,  0,220,230,  0,230,230,220,  0,  0,230,  0,  0, 26,  0,
+    0,220,  0,230,230,  1,220,  0,  0,230,220,  0,  0,  0,220,220,
+    0,  0,230,220,  0,  9,  7,  0,  0,  7,  9,  0,  0,  0,  9,  7,
+    6,  6,  0,  0,  0,  0,  1,  0,  0,216,216,  1,  1,  1,  0,  0,
+    0,226,216,216,216,216,216,  0,220,220,220,  0,232,232,220,230,
+  230,230,  7,  0, 16, 17, 17, 33, 17, 49, 17, 17, 84, 97,135,145,
+   26, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,177,  0,  1,  2,  3,
-    3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-    4,  3,  3,  3,  3,  3,  5,  3,  3,  3,  3,  3,  6,  7,  8,  3,
-    3,  3,  3,  3,  9, 10, 11, 12, 13,  3,  3,  3,  3,  3,  3,  3,
-    3, 14,  3, 15,  3,  3,  3,  3,  3,  3, 16, 17, 18, 19, 20, 21,
-    3,  3,  3, 22, 23, 24,  3,  3,  3,  3,  3,  3, 25,  3,  3,  3,
-    3,  3,  3,  3,  3, 26,  3,  3, 27, 28,  0,  1,  0,  0,  0,  0,
-    0,  1,  0,  2,  0,  0,  0,  3,  0,  0,  0,  3,  0,  0,  0,  0,
-    0,  4,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  6,  0,  0,  0,  7,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  8,  9,  0,  0,  0,  0,  0,  0,  9,  0,  9,  0,  0,
-    0,  0,  0,  0,  0, 10, 11, 12, 13,  0,  0, 14, 15, 16,  6,  0,
-   17, 18, 19, 19, 19, 20, 21, 22, 23, 24, 19, 25,  0, 26, 27, 19,
-   19, 28, 29, 30,  0, 31,  0,  0,  0,  8,  0,  0,  0,  0,  0,  0,
-    0, 19, 28,  0, 32, 33,  9, 34, 35, 19,  0,  0, 36, 37, 38, 39,
-   40, 19,  0, 41, 42, 43, 44, 31,  0,  1, 45, 42,  0,  0,  0,  0,
-    0, 32, 14, 14,  0,  0,  0,  0, 14,  0,  0, 46, 47, 47, 47, 47,
-   48, 49, 47, 47, 47, 47, 50, 51, 52, 53, 43, 21,  0,  0,  0,  0,
-    0,  0,  0, 54,  6, 55,  0, 14, 19,  1,  0,  0,  0,  0, 56, 57,
-    0,  0,  0,  0,  0, 19, 58, 31,  0,  0,  0,  0,  0,  0,  0, 59,
-   14,  0,  0,  0,  0,  1,  0,  2,  0,  0,  0,  3,  0,  0,  0, 60,
-   61,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  2,  3,
-    0,  4,  5,  0,  0,  6,  0,  0,  0,  7,  0,  0,  0,  1,  1,  0,
-    0,  8,  9,  0,  8,  9,  0,  0,  0,  0,  8,  9, 10, 11, 12,  0,
-    0,  0, 13,  0,  0,  0,  0, 14, 15, 16, 17,  0,  0,  0,  1,  0,
-    0, 18, 19,  0,  0,  0, 20,  0,  0,  0,  1,  1,  1,  1,  0,  1,
-    1,  1,  1,  1,  1,  1,  0,  8, 21,  9,  0,  0, 22,  0,  0,  0,
-    0,  1,  0, 23, 24, 25,  0,  0, 26,  0,  0,  0,  8, 21, 27,  0,
-    1,  0,  0,  1,  1,  1,  1,  0,  1, 28, 29, 30,  0, 31, 32, 20,
-    1,  1,  0,  0,  0,  8, 21,  9,  1,  4,  5,  0,  0,  0, 33,  9,
-    0,  1,  1,  1,  0,  8, 21, 21, 21, 21, 34,  1, 35, 21, 21, 21,
-    9, 36,  0,  0, 37, 38,  1,  0, 39,  0,  0,  0,  1,  0,  1,  0,
-    0,  0,  0,  8, 21,  9,  1,  0,  0,  0, 40,  0,  8, 21, 21, 21,
-   21, 21, 21, 21, 21,  9,  0,  1,  1,  1,  1,  8, 21, 21, 21,  9,
-    0,  0,  0, 41,  0, 42, 43,  0,  0,  0,  1, 44,  0,  0,  0, 45,
-    8,  9,  1,  0,  0,  0,  8, 21, 21, 21,  9,  0,  1,  0,  1,  1,
-    8, 21, 21,  9,  0,  4,  5,  8,  9,  1,  0,  0,  0,  1,  2,  3,
-    4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-    9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14, 15, 16, 17, 18,
-   19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24, 25, 26, 13, 13,
-   13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36,  7,  7,  7,  7,
-    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-   37,  7, 38, 39,  7, 40,  7,  7,  7, 41, 13, 42,  7,  7, 43,  7,
-   44, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   17, 17, 17,177,  0,  1,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+    3,  3,  3,  3,  3,  3,  3,  3,  4,  3,  3,  3,  3,  3,  5,  3,
+    3,  3,  3,  3,  6,  7,  8,  3,  3,  3,  3,  3,  9, 10, 11, 12,
+   13,  3,  3,  3,  3,  3,  3,  3,  3, 14,  3, 15,  3,  3,  3,  3,
+    3,  3, 16, 17, 18, 19, 20, 21,  3,  3,  3, 22, 23, 24,  3,  3,
+    3,  3,  3,  3, 25,  3,  3,  3,  3,  3,  3,  3,  3, 26,  3,  3,
+   27, 28,  0,  1,  0,  0,  0,  0,  0,  1,  0,  2,  0,  0,  0,  3,
+    0,  0,  0,  3,  0,  0,  0,  0,  0,  4,  0,  5,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,  0,  7,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  9,  0,  0,  0,
+    0,  0,  0,  9,  0,  9,  0,  0,  0,  0,  0,  0,  0, 10, 11, 12,
+   13,  0,  0, 14, 15, 16,  6,  0, 17, 18, 19, 19, 19, 20, 21, 22,
+   23, 24, 19, 25,  0, 26, 27, 19, 19, 28, 29, 30,  0, 31,  0,  0,
+    0,  8,  0,  0,  0,  0,  0,  0,  0, 19, 28,  0, 32, 33,  9, 34,
+   35, 19,  0,  0, 36, 37, 38, 39, 40, 19,  0, 41, 42, 43, 44, 31,
+    0,  1, 45, 42,  0,  0,  0,  0,  0, 32, 14, 14,  0,  0,  0,  0,
+   14,  0,  0, 46, 47, 47, 47, 47, 48, 49, 47, 47, 47, 47, 50, 51,
+   52, 53, 43, 21,  0,  0,  0,  0,  0,  0,  0, 54,  6, 55,  0, 14,
+   19,  1,  0,  0,  0,  0, 56, 57,  0,  0,  0,  0,  0, 19, 58, 31,
+    0,  0,  0,  0,  0,  0,  0, 59, 14,  0,  0,  0,  0,  1,  0,  2,
+    0,  0,  0,  3,  0,  0,  0, 60, 61,  0,  0,  0,  0,  0,  0,  0,
+    1,  0,  0,  0,  0,  0,  2,  3,  0,  4,  5,  0,  0,  6,  0,  0,
+    0,  7,  0,  0,  0,  1,  1,  0,  0,  8,  9,  0,  8,  9,  0,  0,
+    0,  0,  8,  9, 10, 11, 12,  0,  0,  0, 13,  0,  0,  0,  0, 14,
+   15, 16, 17,  0,  0,  0,  1,  0,  0, 18, 19,  0,  0,  0, 20,  0,
+    0,  0,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  0,  8,
+   21,  9,  0,  0, 22,  0,  0,  0,  0,  1,  0, 23, 24, 25,  0,  0,
+   26,  0,  0,  0,  8, 21, 27,  0,  1,  0,  0,  1,  1,  1,  1,  0,
+    1, 28, 29, 30,  0, 31, 32, 20,  1,  1,  0,  0,  0,  8, 21,  9,
+    1,  4,  5,  0,  0,  0, 33,  9,  0,  1,  1,  1,  0,  8, 21, 21,
+   21, 21, 34,  1, 35, 21, 21, 21,  9, 36,  0,  0, 37, 38,  1,  0,
+   39,  0,  0,  0,  1,  0,  1,  0,  0,  0,  0,  8, 21,  9,  1,  0,
+    0,  0, 40,  0,  8, 21, 21, 21, 21, 21, 21, 21, 21,  9,  0,  1,
+    1,  1,  1,  8, 21, 21, 21,  9,  0,  0,  0, 41,  0, 42, 43,  0,
+    0,  0,  1, 44,  0,  0,  0, 45,  8,  9,  1,  0,  0,  0,  8, 21,
+   21, 21,  9,  0,  1,  0,  1,  1,  8, 21, 21,  9,  0,  4,  5,  8,
+    9,  1,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,
+    7,  7,  7,  7,  7,  7,  7,  7,  9, 10, 11, 11, 11, 11, 12, 13,
+   13, 13, 13, 14, 15, 16, 17, 18, 19, 20, 21, 13, 22, 13, 13, 13,
+   13, 23, 24, 24, 25, 26, 13, 13, 13, 27, 28, 29, 13, 30, 31, 32,
+   33, 34, 35, 36,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+    7,  7,  7,  7,  7,  7,  7,  7, 37,  7, 38, 39,  7, 40,  7,  7,
+    7, 41, 13, 42,  7,  7, 43,  7, 44, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
@@ -3479,221 +3481,221 @@ _hb_ucd_u8[14744] =
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45,  0,  0,  1,
-    2,  2,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
-   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
-   32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42,
-   43, 44, 45, 46, 47, 48, 49, 50, 51, 52,  2,  2, 53, 54, 55, 56,
-   57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, 61, 61,
-   59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
-   74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 45,  0,  0,  1,  2,  2,  2,  3,  4,  5,  6,  7,
+    8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+   24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37,
+   37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+   51, 52,  2,  2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59,
+   59, 59, 59, 59, 59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65,
+   66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 70, 70,
    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
-   70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, 70, 70, 80, 80,
-   80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88,
-   89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+   70, 79, 70, 70, 70, 70, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81,
+   82, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 32, 32,
    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 96, 96,
-   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
-   70, 70, 97, 98, 99,100,101,101,102,103,104,105,106,107,108,109,
-  110,111, 96,112,113,114,115,116,117,118,119,119,120,121,122,123,
-  124,125,126,127,128,129,130,131,132, 96,133,134,135,136,137,138,
-  139,140,141,142,143, 96,144,145, 96,146,147,148,149, 96,150,151,
-  152,153,154,155,156, 96,157,158,159,160, 96,161,162,163,164,164,
-  164,164,164,164,164,165,166,164,167, 96, 96, 96, 96, 96, 96, 96,
-   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,168,169,169,
-  169,169,169,169,169,169,170, 96, 96, 96, 96, 96, 96, 96, 96, 96,
-   96, 96, 96, 96, 96, 96,171,171,171,171,172, 96, 96, 96,173,173,
-  173,173,174,175,176,177, 96, 96, 96, 96,178,179,180,181,182,182,
+   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+   32, 32, 32, 32, 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+   96, 96, 96, 96, 96, 96, 96, 96, 70, 70, 97, 98, 99,100,101,101,
+  102,103,104,105,106,107,108,109,110,111, 96,112,113,114,115,116,
+  117,118,119,119,120,121,122,123,124,125,126,127,128,129,130,131,
+  132, 96,133,134,135,136,137,138,139,140,141,142,143, 96,144,145,
+   96,146,147,148,149, 96,150,151,152,153,154,155,156, 96,157,158,
+  159,160, 96,161,162,163,164,164,164,164,164,164,164,165,166,164,
+  167, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+   96, 96, 96, 96, 96,168,169,169,169,169,169,169,169,169,170, 96,
+   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,171,171,
+  171,171,172, 96, 96, 96,173,173,173,173,174,175,176,177, 96, 96,
+   96, 96,178,179,180,181,182,182,182,182,182,182,182,182,182,182,
   182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
-  182,182,182,182,182,182,182,182,182,182,182,182,182,183,182,182,
-  182,182,182,182,184,184,184,185,186, 96, 96, 96, 96, 96, 96, 96,
-   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,187,188,189,
-  190,191,191,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
-   96, 96, 96, 96, 96, 96,193,194, 96, 96, 96, 96, 96, 96, 96, 96,
-   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,195,196, 59,197,
-  198,199,200,201,202, 96,203,204,205, 59, 59,206, 59,207,208,208,
-  208,208,208,209, 96, 96, 96, 96, 96, 96, 96, 96,210, 96,211,212,
-  213, 96, 96,214, 96, 96, 96,215, 96, 96, 96, 96, 96,216,217,218,
-  219, 96, 96, 96, 96, 96,220,221,222, 96,223,224, 96, 96,225,226,
-   59,227,228, 96, 59, 59, 59, 59, 59, 59, 59,229,230,231,232,233,
-   59, 59,234,235, 59,236, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70,
-   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,237, 70, 70, 70, 70,
-   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,238, 70,239, 70,
+  182,182,182,182,182,183,182,182,182,182,182,182,184,184,184,185,
+  186, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+   96, 96, 96, 96, 96,187,188,189,190,191,191,192, 96, 96, 96, 96,
+   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,193,194,
+   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+   96, 96, 96, 96,195,196, 59,197,198,199,200,201,202, 96,203,204,
+  205, 59, 59,206, 59,207,208,208,208,208,208,209, 96, 96, 96, 96,
+   96, 96, 96, 96,210, 96,211,212,213, 96, 96,214, 96, 96, 96,215,
+   96, 96, 96, 96, 96,216,217,218,219, 96, 96, 96, 96, 96,220,221,
+  222, 96,223,224, 96, 96,225,226, 59,227,228, 96, 59, 59, 59, 59,
+   59, 59, 59,229,230,231,232,233, 59, 59,234,235, 59,236, 96, 96,
+   96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+   70, 70, 70,237, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+   70, 70, 70, 70,238, 70,239, 70, 70, 70, 70, 70, 70, 70, 70, 70,
    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
-   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,240, 70, 70, 70, 70,
-   70, 70, 70, 70, 70,241, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70,
-   70, 70,242, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70,
-   70, 70, 70, 70,243, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
-   70, 70, 70, 70, 70,244, 96, 96, 96, 96, 96, 96, 96, 96,245, 96,
-  246,247,  0,  1,  2,  2,  0,  1,  2,  2,  2,  3,  4,  5,  0,  0,
-    0,  0,  0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  0,  0,  0,
-   19,  0, 19,  0,  0,  0,  0,  0, 26, 26,  1,  1,  1,  1,  9,  9,
-    9,  9,  0,  9,  9,  9,  2,  2,  9,  9,  9,  9,  0,  9,  2,  2,
-    2,  2,  9,  0,  9,  0,  9,  9,  9,  2,  9,  2,  9,  9,  9,  9,
-    2,  9,  9,  9, 55, 55, 55, 55, 55, 55,  6,  6,  6,  6,  6,  1,
-    1,  6,  2,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  2,  2, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14,  2,  2,  2,  2, 14, 14,  2,
-    2,  2,  3,  3,  3,  3,  3,  0,  3,  3,  0,  3,  3,  3,  3,  3,
-    3,  0,  3,  3,  3,  1,  1,  1,  3,  3,  1,  3,  3,  3, 37, 37,
-   37, 37, 37, 37,  2, 37, 37, 37, 37,  2,  2, 37, 37, 37, 38, 38,
-   38, 38, 38, 38,  2,  2, 64, 64, 64, 64, 64, 64, 64,  2,  2, 64,
-   64, 64, 90, 90, 90, 90, 90, 90,  2,  2, 90, 90, 90,  2, 95, 95,
-   95, 95,  2,  2, 95,  2,  3,  3,  3,  2,  3,  3,  2,  2,  3,  3,
-    0,  3,  7,  7,  7,  7,  7,  1,  1,  1,  1,  7,  7,  7,  0,  0,
-    7,  7,  5,  5,  5,  5,  2,  5,  5,  5,  5,  2,  2,  5,  5,  2,
-    5,  5,  5,  2,  5,  2,  2,  2,  5,  5,  5,  5,  2,  2,  5,  5,
-    5,  2,  2,  2,  2,  5,  5,  5,  2,  5,  2, 11, 11, 11, 11, 11,
-   11,  2,  2,  2,  2, 11, 11,  2,  2, 11, 11, 11, 11, 11, 11,  2,
-   11, 11,  2, 11, 11,  2, 11, 11,  2,  2,  2, 11,  2,  2, 11,  2,
-   11,  2,  2,  2, 11, 11,  2, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-    2, 10, 10,  2, 10, 10, 10, 10,  2,  2, 10,  2,  2,  2,  2,  2,
-   10, 10,  2, 21, 21, 21, 21, 21, 21, 21, 21,  2,  2, 21, 21,  2,
-   21, 21, 21, 21,  2,  2, 21, 21,  2, 21,  2,  2, 21, 21,  2,  2,
-   22, 22,  2, 22, 22, 22, 22, 22, 22,  2, 22,  2, 22, 22, 22, 22,
-    2,  2,  2, 22, 22,  2,  2,  2,  2, 22, 22,  2,  2,  2, 22, 22,
-   22, 22, 23, 23, 23, 23, 23,  2, 23, 23, 23, 23,  2,  2,  2, 23,
-   23,  2, 23, 23, 23,  2,  2, 23,  2,  2,  2,  2, 23, 23,  2,  2,
-    2, 23, 16, 16, 16, 16, 16,  2, 16, 16,  2, 16, 16, 16, 16, 16,
-    2,  2,  2, 16, 16,  2,  2,  2, 16, 16, 20, 20, 20, 20, 20,  2,
-   20, 20,  2,  2, 20, 20,  2, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36,  2,  2,  2, 36, 36, 36, 36,  2, 36,  2, 36,  2,  2,  2,  2,
-   36,  2,  2,  2,  2, 36, 36,  2, 36,  2, 36,  2,  2,  2,  2, 24,
-   24, 24, 24, 24, 24, 24, 24, 24, 24,  2,  2,  2,  2,  0,  2, 18,
-   18,  2, 18,  2, 18, 18, 18, 18, 18,  2, 18, 18, 18, 18,  2, 18,
-    2, 18, 18, 18,  2,  2, 18,  2, 18,  2, 25, 25, 25, 25,  2, 25,
-   25, 25, 25,  2,  2,  2, 25,  2, 25, 25, 25,  0,  0,  0,  0, 25,
-   25,  2, 33, 33, 33, 33,  8,  8,  8,  8,  8,  8,  2,  8,  2,  8,
-    2,  2,  8,  8,  8,  0, 12, 12, 12, 12, 30, 30, 30, 30, 30,  2,
-   30, 30, 30, 30,  2,  2, 30, 30, 30,  2,  2, 30, 30, 30, 30,  2,
-    2,  2, 29, 29, 29, 29, 29, 29,  2,  2, 28, 28, 28, 28, 34, 34,
-   34, 34, 34,  2,  2,  2, 35, 35, 35, 35, 35, 35, 35,  0,  0,  0,
-   35, 35, 35,  2,  2,  2, 45, 45, 45, 45, 45, 45,  2,  2,  2,  2,
-    2, 45, 44, 44, 44, 44, 44,  0,  0,  2, 43, 43, 43, 43, 46, 46,
-   46, 46, 46,  2, 46, 46, 31, 31, 31, 31, 31, 31,  2,  2, 32, 32,
-    0,  0, 32,  0, 32, 32, 32, 32, 32, 32, 32, 32,  2,  2, 32,  2,
-    2,  2, 32, 32, 32,  2, 28, 28,  2,  2, 48, 48, 48, 48, 48, 48,
-   48,  2, 48,  2,  2,  2, 52, 52, 52, 52, 52, 52,  2,  2, 52,  2,
-    2,  2, 58, 58, 58, 58, 58, 58,  2,  2, 58, 58, 58,  2,  2,  2,
-   58, 58, 54, 54, 54, 54,  2,  2, 54, 54, 91, 91, 91, 91, 91, 91,
-   91,  2, 91,  2,  2, 91, 91, 91,  2,  2,  1,  1,  1,  2, 62, 62,
-   62, 62, 62,  2,  2,  2, 62, 62, 62,  2, 76, 76, 76, 76, 93, 93,
-   93, 93, 70, 70, 70, 70,  2,  2,  2, 70, 70, 70,  2,  2,  2, 70,
-   70, 70, 73, 73, 73, 73,  6,  2,  2,  2,  8,  8,  8,  2,  2,  8,
-    8,  8,  1,  1,  1,  0,  1,  0,  1,  1,  1,  0,  0,  0,  0,  1,
-    0,  0,  1,  1,  0,  2, 19, 19,  9,  9,  9,  9,  9,  6, 19,  9,
-    9,  9,  9,  9, 19, 19,  9,  9,  9, 19,  6, 19, 19, 19, 19, 19,
-   19,  9,  9,  9,  2,  2,  2,  9,  2,  9,  2,  9,  9,  9,  1,  1,
-    0,  0,  0,  2,  0,  0,  0, 19,  2,  2,  0,  0,  0, 19,  0,  0,
-    0,  2, 19,  2,  2,  2,  0,  2,  2,  2,  1,  2,  2,  2,  0,  0,
-    9,  0,  0,  0, 19, 19, 27, 27, 27, 27,  2,  2,  0,  0,  0,  0,
-    2,  0, 56, 56, 56, 56,  2, 55, 55, 55, 61, 61, 61, 61,  2,  2,
-    2, 61, 61,  2,  2,  2,  0,  0,  2,  2, 13, 13, 13, 13, 13, 13,
-    2, 13, 13, 13,  2,  2,  0, 13,  0, 13,  0, 13, 13, 13, 13, 13,
-    1,  1,  1,  1, 12, 12,  2, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15,  2,  2,  1,  1,  0,  0, 15, 15, 15,  0, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17,  0,  2, 26, 26, 26, 26, 26, 26, 26,  2, 12,
-   12, 12, 12, 12, 12,  2, 12, 12, 12,  0, 39, 39, 39, 39, 39,  2,
-    2,  2, 39, 39, 39,  2, 86, 86, 86, 86, 77, 77, 77, 77, 79, 79,
-   79, 79, 19, 19, 19,  2, 19, 19,  2, 19,  2, 19, 19, 19, 19, 19,
-    2,  2,  2,  2, 19, 19, 60, 60, 60, 60, 60,  2,  2,  2, 65, 65,
-   65, 65, 75, 75, 75, 75, 75, 75,  2,  2,  2,  2, 75, 75, 69, 69,
-   69, 69, 69, 69,  0, 69, 74, 74, 74, 74,  2,  2,  2, 74, 12,  2,
-    2,  2, 84, 84, 84, 84, 84, 84,  2,  0, 84, 84,  2,  2,  2,  2,
-   84, 84, 33, 33, 33,  2, 68, 68, 68, 68, 68, 68, 68,  2, 68, 68,
-    2,  2, 92, 92, 92, 92, 92, 92, 92,  2,  2,  2,  2, 92, 87, 87,
-   87, 87, 87, 87, 87,  2, 19,  9, 19, 19, 19, 19,  0,  0, 87, 87,
-    2,  2,  2,  2,  2, 12,  2,  2,  2,  4, 14,  2, 14,  2, 14, 14,
-    2, 14, 14,  2, 14, 14,  2,  2,  2,  3,  3,  3,  0,  0,  2,  2,
-    3,  3,  1,  1,  6,  6,  3,  2,  3,  3,  3,  2,  2,  0,  2,  0,
-    0,  0,  0,  0, 17, 17, 17, 17,  0,  0,  2,  2, 12, 12, 49, 49,
-   49, 49,  2, 49, 49, 49, 49, 49, 49,  2, 49, 49,  2, 49, 49, 49,
-    2,  2,  9,  2,  2,  2,  0,  1,  2,  2, 71, 71, 71, 71, 71,  2,
-    2,  2, 67, 67, 67, 67, 67,  2,  2,  2, 42, 42, 42, 42,  2, 42,
-   42, 42, 41, 41, 41, 41, 41, 41, 41,  2,118,118,118,118,118,118,
-  118,  2, 53, 53, 53, 53, 53, 53,  2, 53, 59, 59, 59, 59, 59, 59,
-    2,  2, 40, 40, 40, 40, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50,
-    2,  2,135,135,135,135,106,106,106,106,104,104,104,104,  2,  2,
-    2,104,161,161,161,161,161,161,161,  2,161,161,  2,161,161,  2,
-    2,  2,110,110,110,110,110,110,110,  2,110,110,  2,  2, 19,  2,
-   19, 19, 47, 47, 47, 47, 47, 47,  2,  2, 47,  2, 47, 47, 47, 47,
-    2, 47, 47,  2,  2,  2, 47,  2,  2, 47, 81, 81, 81, 81, 81, 81,
-    2, 81,120,120,120,120,116,116,116,116,116,116,116,  2,  2,  2,
-    2,116,128,128,128,128,128,128,128,  2,128,128,  2,  2,  2,  2,
-    2,128, 66, 66, 66, 66,  2,  2,  2, 66, 72, 72, 72, 72, 72, 72,
-    2,  2,  2,  2,  2, 72, 98, 98, 98, 98, 97, 97, 97, 97,  2,  2,
-   97, 97, 57, 57, 57, 57,  2, 57, 57,  2,  2, 57, 57, 57, 57, 57,
-    2,  2, 57, 57, 57,  2,  2,  2,  2, 57, 57,  2,  2,  2, 88, 88,
-   88, 88,117,117,117,117,112,112,112,112,112,112,112,  2,  2,  2,
-    2,112, 78, 78, 78, 78, 78, 78,  2,  2,  2, 78, 78, 78, 83, 83,
-   83, 83, 83, 83,  2,  2, 82, 82, 82, 82, 82, 82, 82,  2,122,122,
-  122,122,122,122,  2,  2,  2,122,122,122,122,  2,  2,  2, 89, 89,
-   89, 89, 89,  2,  2,  2,130,130,130,130,130,130,130,  2,  2,  2,
-  130,130,144,144,144,144,144,144,  2,  2,156,156,156,156,156,156,
-    2,156,156,156,  2,  2,  2,  3,  3,  3,147,147,147,147,148,148,
-  148,148,148,148,  2,  2,158,158,158,158,158,158,  2,  2,153,153,
-  153,153,149,149,149,149,149,149,149,  2, 94, 94, 94, 94, 94, 94,
-    2,  2,  2,  2, 94, 94,  2,  2,  2, 94, 85, 85, 85, 85, 85, 85,
-   85,  2,  2, 85,  2,  2,101,101,101,101,101,  2,  2,  2,101,101,
-    2,  2, 96, 96, 96, 96, 96,  2, 96, 96,111,111,111,111,111,111,
-  111,  2,100,100,100,100,108,108,108,108,108,108,  2,108,108,108,
-    2,  2,129,129,129,129,129,129,129,  2,129,  2,129,129,129,129,
-    2,129,129,129,  2,  2,109,109,109,109,109,109,109,  2,109,109,
-    2,  2,107,107,107,107,  2,107,107,107,107,  2,  2,107,107,  2,
-  107,107,107,107,  2,  1,107,107,  2,  2,107,  2,  2,  2,  2,  2,
-    2,107,  2,  2,107,107,137,137,137,137,  2,137,137,137,137,137,
-    2,  2,124,124,124,124,124,124,  2,  2,123,123,123,123,123,123,
-    2,  2,114,114,114,114,114,  2,  2,  2,114,114,  2,  2,102,102,
-  102,102,102,102,  2,  2,126,126,126,126,126,126,126,  2,  2,126,
-  126,126,142,142,142,142,125,125,125,125,125,125,125,  2,  2,  2,
-    2,125,154,154,154,154,154,154,154,  2,  2,154,  2,  2,  2,154,
-  154,  2,154,154,  2,154,154,  2,  2,154,154,154,  2,  2,150,150,
-  150,150,  2,  2,150,150,150,  2,  2,  2,141,141,141,141,140,140,
-  140,140,140,140,140,  2,121,121,121,121,121,  2,  2,  2,  7,  7,
-    2,  2,133,133,133,133,133,  2,133,133,133,133,133,  2,133,133,
-    2,  2,133,  2,  2,  2,134,134,134,134,  2,  2,134,134,  2,134,
-  134,134,134,134,134,  2,138,138,138,138,138,138,138,  2,138,138,
-    2,138,  2,  2,138,  2,138,138,  2,  2,143,143,143,143,143,143,
-    2,143,143,  2,143,143,143,143,143,  2,143,  2,  2,  2,143,143,
-    2,  2,145,145,145,145,145,  2,  2,  2,163,163,163,163,163,  2,
-  163,163,163,163,163,  2,  2,  2,163,163,163,163,  2,  2, 86,  2,
-    2,  2, 63, 63, 63, 63, 63, 63,  2,  2, 63, 63, 63,  2, 63,  2,
-    2,  2,157,157,157,157,157,157,157,  2, 80, 80, 80, 80, 80, 80,
-    2,  2,127,127,127,127,127,127,127,  2, 79,  2,  2,  2,115,115,
-  115,115,115,115,115,  2,115,115,  2,  2,  2,  2,115,115,159,159,
-  159,159,159,159,159,  2,159,159,  2,  2,103,103,103,103,103,103,
-    2,  2,119,119,119,119,119,119,  2,  2,119,119,  2,119,  2,119,
-  119,119,146,146,146,146,146,146,146,  2, 99, 99, 99, 99, 99, 99,
-   99,  2,  2,  2,  2, 99,136,139, 13, 13,155,  2,  2,  2,136,136,
-  136,136,155,155,155,155,155,155,  2,  2,136,  2,  2,  2,  2, 17,
-   17, 17,  2, 17, 17,  2, 17, 15, 15, 15, 17, 17, 17,  2,  2,  2,
-   15,  2,  2, 17,  2,  2,139,139,139,139,105,105,105,105,105,105,
-  105,  2,105,  2,  2,  2,105,105,  2,  2,  1,  1,  2,  2,  0,  0,
-    0,  1,  0,  1,  1,  1,  0,  0,  1,  1,  2,  2,  0,  2,  2,  0,
-    0,  2,  0,  2,  0,  2,131,131,131,131,  2,  2,  2,131,  2,131,
-  131,131, 56, 56, 56,  2, 56,  2,  2, 56, 56, 56,  2, 56, 56,  2,
-   56, 56,  6,  6,  2,  2,  2,  2,  2,  6,151,151,151,151,151,  2,
-    2,  2,151,151,  2,  2,  2,  2,151,151,160,160,160,160,160,160,
-  160,  2,152,152,152,152,152,152,  2,  2,  2,  2,  2,152,164,164,
-  164,164,164,164,  2,  2,  2, 30, 30,  2,113,113,113,113,113,  2,
-    2,113,113,113,113,  2,132,132,132,132,132,132,  2,  2,  2,  2,
-  132,132,  2,  3,  3,  2,  3,  2,  2,  3,  2,  3,  2,  3,  2,  2,
-    3,  2,  3,  2,  3,  2,  3,  3,  2,  3, 15,  0,  0,  2, 13,  2,
-    2,  2, 13, 13, 13,  2,  2,  0,  2,  2,  0,  1,  2,  3,  4,  5,
-    6,  7,  8,  9,  9,  9,  9, 10,  9, 11, 12, 13,  9,  9,  9, 14,
-    9,  9, 15,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   70, 70, 70,240, 70, 70, 70, 70, 70, 70, 70, 70, 70,241, 70, 70,
+   70, 70,242, 96, 96, 96, 70, 70, 70, 70,243, 96, 96, 96, 96, 96,
+   96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70,244, 70, 70, 70,
+   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,245, 96, 96,
+   96, 96, 96, 96, 96, 96,246, 96,247,248,  0,  1,  2,  2,  0,  1,
+    2,  2,  2,  3,  4,  5,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19,
+   19, 19, 19, 19, 19,  0,  0,  0, 19,  0, 19,  0,  0,  0,  0,  0,
+   26, 26,  1,  1,  1,  1,  9,  9,  9,  9,  0,  9,  9,  9,  2,  2,
+    9,  9,  9,  9,  0,  9,  2,  2,  2,  2,  9,  0,  9,  0,  9,  9,
+    9,  2,  9,  2,  9,  9,  9,  9,  2,  9,  9,  9, 55, 55, 55, 55,
+   55, 55,  6,  6,  6,  6,  6,  1,  1,  6,  2,  4,  4,  4,  4,  4,
+    4,  4,  4,  4,  4,  2,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+   14,  2,  2,  2,  2, 14, 14,  2,  2,  2,  3,  3,  3,  3,  3,  0,
+    3,  3,  0,  3,  3,  3,  3,  3,  3,  0,  3,  3,  3,  1,  1,  1,
+    3,  3,  1,  3,  3,  3, 37, 37, 37, 37, 37, 37,  2, 37, 37, 37,
+   37,  2,  2, 37, 37, 37, 38, 38, 38, 38, 38, 38,  2,  2, 64, 64,
+   64, 64, 64, 64, 64,  2,  2, 64, 64, 64, 90, 90, 90, 90, 90, 90,
+    2,  2, 90, 90, 90,  2, 95, 95, 95, 95,  2,  2, 95,  2,  3,  3,
+    3,  2,  3,  3,  2,  2,  3,  3,  0,  3,  7,  7,  7,  7,  7,  1,
+    1,  1,  1,  7,  7,  7,  0,  0,  7,  7,  5,  5,  5,  5,  2,  5,
+    5,  5,  5,  2,  2,  5,  5,  2,  5,  5,  5,  2,  5,  2,  2,  2,
+    5,  5,  5,  5,  2,  2,  5,  5,  5,  2,  2,  2,  2,  5,  5,  5,
+    2,  5,  2, 11, 11, 11, 11, 11, 11,  2,  2,  2,  2, 11, 11,  2,
+    2, 11, 11, 11, 11, 11, 11,  2, 11, 11,  2, 11, 11,  2, 11, 11,
+    2,  2,  2, 11,  2,  2, 11,  2, 11,  2,  2,  2, 11, 11,  2, 10,
+   10, 10, 10, 10, 10, 10, 10, 10,  2, 10, 10,  2, 10, 10, 10, 10,
+    2,  2, 10,  2,  2,  2,  2,  2, 10, 10,  2, 21, 21, 21, 21, 21,
+   21, 21, 21,  2,  2, 21, 21,  2, 21, 21, 21, 21,  2,  2, 21, 21,
+    2, 21,  2,  2, 21, 21,  2,  2, 22, 22,  2, 22, 22, 22, 22, 22,
+   22,  2, 22,  2, 22, 22, 22, 22,  2,  2,  2, 22, 22,  2,  2,  2,
+    2, 22, 22,  2,  2,  2, 22, 22, 22, 22, 23, 23, 23, 23, 23,  2,
+   23, 23, 23, 23,  2,  2,  2, 23, 23,  2, 23, 23, 23,  2,  2, 23,
+    2,  2,  2,  2, 23, 23,  2,  2,  2, 23, 16, 16, 16, 16, 16,  2,
+   16, 16,  2, 16, 16, 16, 16, 16,  2,  2,  2, 16, 16,  2,  2,  2,
+   16, 16, 20, 20, 20, 20, 20,  2, 20, 20,  2,  2, 20, 20,  2, 36,
+   36, 36, 36, 36, 36, 36, 36, 36, 36,  2,  2,  2, 36, 36, 36, 36,
+    2, 36,  2, 36,  2,  2,  2,  2, 36,  2,  2,  2,  2, 36, 36,  2,
+   36,  2, 36,  2,  2,  2,  2, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+   24,  2,  2,  2,  2,  0,  2, 18, 18,  2, 18,  2, 18, 18, 18, 18,
+   18,  2, 18, 18, 18, 18,  2, 18,  2, 18, 18, 18,  2,  2, 18,  2,
+   18,  2, 25, 25, 25, 25,  2, 25, 25, 25, 25,  2,  2,  2, 25,  2,
+   25, 25, 25,  0,  0,  0,  0, 25, 25,  2, 33, 33, 33, 33,  8,  8,
+    8,  8,  8,  8,  2,  8,  2,  8,  2,  2,  8,  8,  8,  0, 12, 12,
+   12, 12, 30, 30, 30, 30, 30,  2, 30, 30, 30, 30,  2,  2, 30, 30,
+   30,  2,  2, 30, 30, 30, 30,  2,  2,  2, 29, 29, 29, 29, 29, 29,
+    2,  2, 28, 28, 28, 28, 34, 34, 34, 34, 34,  2,  2,  2, 35, 35,
+   35, 35, 35, 35, 35,  0,  0,  0, 35, 35, 35,  2,  2,  2, 45, 45,
+   45, 45, 45, 45,  2,  2,  2,  2,  2, 45, 44, 44, 44, 44, 44,  0,
+    0,  2, 43, 43, 43, 43, 46, 46, 46, 46, 46,  2, 46, 46, 31, 31,
+   31, 31, 31, 31,  2,  2, 32, 32,  0,  0, 32,  0, 32, 32, 32, 32,
+   32, 32, 32, 32,  2,  2, 32,  2,  2,  2, 32, 32, 32,  2, 28, 28,
+    2,  2, 48, 48, 48, 48, 48, 48, 48,  2, 48,  2,  2,  2, 52, 52,
+   52, 52, 52, 52,  2,  2, 52,  2,  2,  2, 58, 58, 58, 58, 58, 58,
+    2,  2, 58, 58, 58,  2,  2,  2, 58, 58, 54, 54, 54, 54,  2,  2,
+   54, 54, 91, 91, 91, 91, 91, 91, 91,  2, 91,  2,  2, 91, 91, 91,
+    2,  2,  1,  1,  1,  2, 62, 62, 62, 62, 62,  2,  2,  2, 62, 62,
+   62,  2, 76, 76, 76, 76, 93, 93, 93, 93, 70, 70, 70, 70,  2,  2,
+    2, 70, 70, 70,  2,  2,  2, 70, 70, 70, 73, 73, 73, 73,  6,  2,
+    2,  2,  8,  8,  8,  2,  2,  8,  8,  8,  1,  1,  1,  0,  1,  0,
+    1,  1,  1,  0,  0,  0,  0,  1,  0,  0,  1,  1,  0,  2, 19, 19,
+    9,  9,  9,  9,  9,  6, 19,  9,  9,  9,  9,  9, 19, 19,  9,  9,
+    9, 19,  6, 19, 19, 19, 19, 19, 19,  9,  9,  9,  2,  2,  2,  9,
+    2,  9,  2,  9,  9,  9,  1,  1,  0,  0,  0,  2,  0,  0,  0, 19,
+    2,  2,  0,  0,  0, 19,  0,  0,  0,  2, 19,  2,  2,  2,  0,  2,
+    2,  2,  1,  2,  2,  2,  0,  0,  9,  0,  0,  0, 19, 19, 27, 27,
+   27, 27,  2,  2,  0,  0,  0,  0,  2,  0, 56, 56, 56, 56,  2, 55,
+   55, 55, 61, 61, 61, 61,  2,  2,  2, 61, 61,  2,  2,  2,  0,  0,
+    2,  2, 13, 13, 13, 13, 13, 13,  2, 13, 13, 13,  2,  2,  0, 13,
+    0, 13,  0, 13, 13, 13, 13, 13,  1,  1,  1,  1, 12, 12,  2, 15,
+   15, 15, 15, 15, 15, 15, 15, 15, 15,  2,  2,  1,  1,  0,  0, 15,
+   15, 15,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  2, 26,
+   26, 26, 26, 26, 26, 26,  2, 12, 12, 12, 12, 12, 12,  2, 12, 12,
+   12,  0, 39, 39, 39, 39, 39,  2,  2,  2, 39, 39, 39,  2, 86, 86,
+   86, 86, 77, 77, 77, 77, 79, 79, 79, 79, 19, 19, 19,  2, 19, 19,
+    2, 19,  2, 19, 19, 19, 19, 19,  2,  2,  2,  2, 19, 19, 60, 60,
+   60, 60, 60,  2,  2,  2, 65, 65, 65, 65, 75, 75, 75, 75, 75, 75,
+    2,  2,  2,  2, 75, 75, 69, 69, 69, 69, 69, 69,  0, 69, 74, 74,
+   74, 74,  2,  2,  2, 74, 12,  2,  2,  2, 84, 84, 84, 84, 84, 84,
+    2,  0, 84, 84,  2,  2,  2,  2, 84, 84, 33, 33, 33,  2, 68, 68,
+   68, 68, 68, 68, 68,  2, 68, 68,  2,  2, 92, 92, 92, 92, 92, 92,
+   92,  2,  2,  2,  2, 92, 87, 87, 87, 87, 87, 87, 87,  2, 19,  9,
+   19, 19, 19, 19,  0,  0, 87, 87,  2,  2,  2,  2,  2, 12,  2,  2,
+    2,  4, 14,  2, 14,  2, 14, 14,  2, 14, 14,  2, 14, 14,  2,  2,
+    2,  3,  3,  3,  0,  0,  2,  2,  3,  3,  1,  1,  6,  6,  3,  2,
+    3,  3,  3,  2,  2,  0,  2,  0,  0,  0,  0,  0, 17, 17, 17, 17,
+    0,  0,  2,  2, 12, 12, 49, 49, 49, 49,  2, 49, 49, 49, 49, 49,
+   49,  2, 49, 49,  2, 49, 49, 49,  2,  2,  9,  2,  2,  2,  0,  1,
+    2,  2, 71, 71, 71, 71, 71,  2,  2,  2, 67, 67, 67, 67, 67,  2,
+    2,  2, 42, 42, 42, 42,  2, 42, 42, 42, 41, 41, 41, 41, 41, 41,
+   41,  2,118,118,118,118,118,118,118,  2, 53, 53, 53, 53, 53, 53,
+    2, 53, 59, 59, 59, 59, 59, 59,  2,  2, 40, 40, 40, 40, 51, 51,
+   51, 51, 50, 50, 50, 50, 50, 50,  2,  2,135,135,135,135,106,106,
+  106,106,104,104,104,104,  2,  2,  2,104,161,161,161,161,161,161,
+  161,  2,161,161,  2,161,161,  2,  2,  2,110,110,110,110,110,110,
+  110,  2,110,110,  2,  2, 19,  2, 19, 19, 47, 47, 47, 47, 47, 47,
+    2,  2, 47,  2, 47, 47, 47, 47,  2, 47, 47,  2,  2,  2, 47,  2,
+    2, 47, 81, 81, 81, 81, 81, 81,  2, 81,120,120,120,120,116,116,
+  116,116,116,116,116,  2,  2,  2,  2,116,128,128,128,128,128,128,
+  128,  2,128,128,  2,  2,  2,  2,  2,128, 66, 66, 66, 66,  2,  2,
+    2, 66, 72, 72, 72, 72, 72, 72,  2,  2,  2,  2,  2, 72, 98, 98,
+   98, 98, 97, 97, 97, 97,  2,  2, 97, 97, 57, 57, 57, 57,  2, 57,
+   57,  2,  2, 57, 57, 57, 57, 57,  2,  2, 57, 57, 57,  2,  2,  2,
+    2, 57, 57,  2,  2,  2, 88, 88, 88, 88,117,117,117,117,112,112,
+  112,112,112,112,112,  2,  2,  2,  2,112, 78, 78, 78, 78, 78, 78,
+    2,  2,  2, 78, 78, 78, 83, 83, 83, 83, 83, 83,  2,  2, 82, 82,
+   82, 82, 82, 82, 82,  2,122,122,122,122,122,122,  2,  2,  2,122,
+  122,122,122,  2,  2,  2, 89, 89, 89, 89, 89,  2,  2,  2,130,130,
+  130,130,130,130,130,  2,  2,  2,130,130,144,144,144,144,144,144,
+    2,  2,156,156,156,156,156,156,  2,156,156,156,  2,  2,  2,  3,
+    3,  3,147,147,147,147,148,148,148,148,148,148,  2,  2,158,158,
+  158,158,158,158,  2,  2,153,153,153,153,149,149,149,149,149,149,
+  149,  2, 94, 94, 94, 94, 94, 94,  2,  2,  2,  2, 94, 94,  2,  2,
+    2, 94, 85, 85, 85, 85, 85, 85, 85,  2,  2, 85,  2,  2,101,101,
+  101,101,101,  2,  2,  2,101,101,  2,  2, 96, 96, 96, 96, 96,  2,
+   96, 96,111,111,111,111,111,111,111,  2,100,100,100,100,108,108,
+  108,108,108,108,  2,108,108,108,  2,  2,129,129,129,129,129,129,
+  129,  2,129,  2,129,129,129,129,  2,129,129,129,  2,  2,109,109,
+  109,109,109,109,109,  2,109,109,  2,  2,107,107,107,107,  2,107,
+  107,107,107,  2,  2,107,107,  2,107,107,107,107,  2,  1,107,107,
+    2,  2,107,  2,  2,  2,  2,  2,  2,107,  2,  2,107,107,137,137,
+  137,137,  2,137,137,137,137,137,  2,  2,124,124,124,124,124,124,
+    2,  2,123,123,123,123,123,123,  2,  2,114,114,114,114,114,  2,
+    2,  2,114,114,  2,  2,102,102,102,102,102,102,  2,  2,126,126,
+  126,126,126,126,126,  2,  2,126,126,126,142,142,142,142,125,125,
+  125,125,125,125,125,  2,  2,  2,  2,125,154,154,154,154,154,154,
+  154,  2,  2,154,  2,  2,  2,154,154,  2,154,154,  2,154,154,  2,
+    2,154,154,154,  2,  2,150,150,150,150,  2,  2,150,150,150,  2,
+    2,  2,141,141,141,141,140,140,140,140,140,140,140,  2,121,121,
+  121,121,121,  2,  2,  2,  7,  7,  2,  2,133,133,133,133,133,  2,
+  133,133,133,133,133,  2,133,133,  2,  2,133,  2,  2,  2,134,134,
+  134,134,  2,  2,134,134,  2,134,134,134,134,134,134,  2,138,138,
+  138,138,138,138,138,  2,138,138,  2,138,  2,  2,138,  2,138,138,
+    2,  2,143,143,143,143,143,143,  2,143,143,  2,143,143,143,143,
+  143,  2,143,  2,  2,  2,143,143,  2,  2,145,145,145,145,145,  2,
+    2,  2,163,163,163,163,163,  2,163,163,163,163,163,  2,  2,  2,
+  163,163,163,163,  2,  2, 86,  2,  2,  2, 63, 63, 63, 63, 63, 63,
+    2,  2, 63, 63, 63,  2, 63,  2,  2,  2,157,157,157,157,157,157,
+  157,  2, 80, 80, 80, 80, 80, 80,  2,  2,127,127,127,127,127,127,
+  127,  2, 79,  2,  2,  2,115,115,115,115,115,115,115,  2,115,115,
+    2,  2,  2,  2,115,115,159,159,159,159,159,159,159,  2,159,159,
+    2,  2,103,103,103,103,103,103,  2,  2,119,119,119,119,119,119,
+    2,  2,119,119,  2,119,  2,119,119,119,146,146,146,146,146,146,
+  146,  2, 99, 99, 99, 99, 99, 99, 99,  2,  2,  2,  2, 99,136,139,
+   13, 13,155,  2,  2,  2,136,136,136,136,155,155,155,155,155,155,
+    2,  2,136,  2,  2,  2,  2, 17, 17, 17,  2, 17, 17,  2, 17, 15,
+   15, 15, 17, 17, 17,  2,  2,  2, 15,  2,  2, 17,  2,  2,139,139,
+  139,139,105,105,105,105,105,105,105,  2,105,  2,  2,  2,105,105,
+    2,  2,  1,  1,  2,  2,  0,  0,  0,  1,  0,  1,  1,  1,  0,  0,
+    1,  1,  2,  2,  0,  2,  2,  0,  0,  2,  0,  2,  0,  2,131,131,
+  131,131,  2,  2,  2,131,  2,131,131,131, 56, 56, 56,  2, 56,  2,
+    2, 56, 56, 56,  2, 56, 56,  2, 56, 56,  6,  6,  2,  2,  2,  2,
+    2,  6,151,151,151,151,151,  2,  2,  2,151,151,  2,  2,  2,  2,
+  151,151,160,160,160,160,160,160,160,  2,152,152,152,152,152,152,
+    2,  2,  2,  2,  2,152,164,164,164,164,164,164,  2,  2,  2, 30,
+   30,  2,113,113,113,113,113,  2,  2,113,113,113,113,  2,132,132,
+  132,132,132,132,  2,  2,  2,  2,132,132,  2,  3,  3,  2,  3,  2,
+    2,  3,  2,  3,  2,  3,  2,  2,  3,  2,  3,  2,  3,  2,  3,  3,
+    2,  3, 15,  0,  0,  2, 13,  2,  2,  2, 13, 13, 13,  2,  2,  0,
+    2,  2,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9,  9,  9, 10,
+    9, 11, 12, 13,  9,  9,  9, 14,  9,  9, 15,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9, 16, 17,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9, 18, 19, 20,  9, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 16, 17,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18, 19, 20,  9, 21,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9, 22,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 22,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
@@ -3702,60 +3704,60 @@ _hb_ucd_u8[14744] =
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9, 23, 24,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
-    0,  0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 23,  0,  0, 24,
-   25, 26, 27, 28, 29, 30,  0,  0, 31, 32,  0, 33,  0, 34,  0, 35,
-    0,  0,  0,  0, 36, 37, 38, 39,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 40,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 41, 42,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 43, 44,  0, 45,  0,  0,
-    0,  0,  0,  0, 46, 47,  0,  0,  0,  0,  0, 48,  0, 49,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 50, 51,  0,  0,
-    0, 52,  0,  0, 53,  0,  0,  0,  0,  0,  0,  0, 54,  0,  0,  0,
-    0,  0,  0,  0, 55,  0,  0,  0,  0,  0,  0,  0, 56,  0,  0,  0,
-    0,  0,  0,  0,  0, 57,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 58, 59, 60, 61,
-   62, 63, 64, 65,  0,  0,  0,  0,  0,  0, 66,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 67, 68,  0, 69, 70,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 71, 72, 73, 74, 75, 76, 77, 78,
-   79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
-   95, 96, 97, 98, 99,100,101,102,103,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,104,  0,  0,  0,  0,  0,
-    0,105,106,  0,107,  0,  0,  0,108,  0,109,  0,110,  0,111,112,
-  113,  0,114,  0,  0,  0,115,  0,  0,  0,116,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,117,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,118,119,120,121,
-    0,122,123,124,125,126,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,128,129,130,131,132,133,134,135,
-  136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,
-  152,153,154,155,156,157,  0,  0,  0,158,159,160,161,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,162,163,  0,  0,  0,  0,  0,  0,  0,164,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,165,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,166,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,167,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,168,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,169,170,  0,
-    0,  0,  0,171,172,  0,  0,  0,173,174,175,176,177,178,179,180,
-  181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,
-  197,198,199,200,201,202,203,204,205,206,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  1,  2,  3,  4,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 23, 24,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,
+    5,  6,  7,  8,  9, 10, 11, 12,  0,  0, 13, 14, 15, 16, 17, 18,
+   19, 20, 21, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 23,  0,  0, 24, 25, 26, 27, 28, 29, 30,  0,  0,
+   31, 32,  0, 33,  0, 34,  0, 35,  0,  0,  0,  0, 36, 37, 38, 39,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 40,  0,  0,  0,  0,  0,  0,  0,  0,  0, 41, 42,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 43, 44,  0, 45,  0,  0,  0,  0,  0,  0, 46, 47,  0,  0,
+    0,  0,  0, 48,  0, 49,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 50, 51,  0,  0,  0, 52,  0,  0, 53,  0,  0,  0,
+    0,  0,  0,  0, 54,  0,  0,  0,  0,  0,  0,  0, 55,  0,  0,  0,
+    0,  0,  0,  0, 56,  0,  0,  0,  0,  0,  0,  0,  0, 57,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 58, 59, 60, 61, 62, 63, 64, 65,  0,  0,  0,  0,
+    0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   67, 68,  0, 69, 70,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
+   87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,
+  103,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,104,  0,  0,  0,  0,  0,  0,105,106,  0,107,  0,  0,  0,
+  108,  0,109,  0,110,  0,111,112,113,  0,114,  0,  0,  0,115,  0,
+    0,  0,116,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,117,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,118,119,120,121,  0,122,123,124,125,126,  0,127,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+  128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
+  144,145,146,147,148,149,150,151,152,153,154,155,156,157,  0,  0,
+    0,158,159,160,161,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,162,163,  0,  0,  0,  0,  0,
+    0,  0,164,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,165,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,166,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,167,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,168,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,169,170,  0,  0,  0,  0,171,172,  0,  0,  0,
+  173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,
+  189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,
+  205,206,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,
 };
 static const uint16_t
-_hb_ucd_u16[10040] =
+_hb_ucd_u16[10060] =
 {
      0,   0,   1,   2,   3,   4,   5,   6,   0,   0,   7,   8,   9,  10,  11,  12,
     13,  13,  13,  14,  15,  13,  13,  16,  17,  18,  19,  20,  21,  22,  13,  23,
@@ -3798,9 +3800,9 @@ _hb_ucd_u16[10040] =
    209, 306, 209, 209, 209, 209, 209, 209,   9,   9,   9,  11,  11,  11, 307, 308,
     13,  13,  13,  13,  13,  13, 309, 310,  11,  11, 311,  48,  48,  48, 312, 313,
     48, 314, 315, 315, 315, 315,  32,  32, 316, 317, 318, 319, 320, 321, 140, 140,
-   209, 322, 209, 209, 209, 209, 209, 323, 209, 209, 209, 209, 209, 324, 140, 325,
-   326, 327, 328, 329, 136,  48,  48,  48,  48, 330, 178,  48,  48,  48,  48, 331,
-   332,  48,  48, 136,  48,  48,  48,  48, 200, 333,  48,  48, 209, 209, 323,  48,
+   209, 322, 209, 209, 209, 209, 209, 323, 209, 209, 209, 209, 209, 324, 140, 209,
+   325, 326, 327, 328, 136,  48,  48,  48,  48, 329, 178,  48,  48,  48,  48, 330,
+   331,  48,  48, 136,  48,  48,  48,  48, 200, 332,  48,  48, 209, 209, 333,  48,
    209, 334, 335, 209, 336, 337, 209, 209, 335, 209, 209, 337, 209, 209, 209, 209,
     48,  48,  48,  48, 209, 209, 209, 209,  48, 338,  48,  48,  48,  48,  48,  48,
    151, 209, 209, 209, 287,  48,  48, 229, 339,  48, 340, 140,  13,  13, 341, 342,
@@ -3871,143 +3873,144 @@ _hb_ucd_u16[10040] =
      9,   9, 607,  11, 654, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 499,
    271, 271, 655, 656, 140, 140, 140, 140, 499, 271, 657, 658, 140, 140, 140, 140,
    659,  48, 660, 661, 662, 663, 664, 665, 666, 206, 667, 206, 140, 140, 140, 668,
-   209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 669, 669, 669, 209, 324,
-   670, 209, 209, 209, 209, 209, 209, 209, 209, 209, 671, 140, 140, 140, 672, 209,
-   673, 209, 209, 325, 674, 675, 324, 140, 209, 209, 209, 209, 209, 209, 209, 676,
-   209, 209, 209, 209, 209, 677, 426, 426, 209, 209, 209, 209, 209, 209, 209, 678,
-   209, 209, 209, 209, 209, 176, 325, 427, 325, 209, 209, 209, 679, 176, 209, 209,
-   679, 209, 671, 675, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 671, 426,
-   674, 209, 209, 680, 681, 325, 674, 674, 209, 682, 209, 209, 288, 140, 140, 192,
+   209, 209, 669, 209, 209, 209, 209, 209, 209, 323, 334, 670, 670, 670, 209, 324,
+   671, 209, 209, 209, 209, 209, 209, 209, 209, 209, 672, 140, 140, 140, 673, 209,
+   674, 209, 209, 669, 675, 676, 324, 140, 209, 209, 209, 209, 209, 209, 209, 677,
+   209, 209, 209, 209, 209, 678, 426, 426, 209, 209, 209, 209, 209, 209, 209, 679,
+   209, 209, 209, 209, 209, 176, 669, 427, 669, 209, 209, 209, 680, 176, 209, 209,
+   680, 209, 672, 676, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 672, 426,
+   675, 209, 209, 681, 682, 669, 675, 675, 209, 683, 209, 209, 288, 140, 140, 192,
     48,  48,  48,  48,  48,  48, 140, 140,  48,  48,  48, 207,  48,  48,  48,  48,
     48, 204,  48,  48,  48,  48,  48,  48,  48,  48, 478,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48, 100, 140,  48, 204, 140, 140, 140, 140, 140, 140,
-    48,  48,  48,  48,  71,  48,  48,  48,  48,  48,  48, 140, 140, 140, 140, 140,
-   683, 140, 570, 570, 570, 570, 570, 570,  32,  32,  32,  32,  32,  32,  32,  32,
-    32,  32,  32,  32,  32,  32,  32, 140, 391, 391, 391, 391, 391, 391, 391, 684,
-   391, 391, 391, 391, 391, 391, 391, 685,   0,   0,   0,   0,   1,   2,   1,   2,
-     0,   0,   3,   3,   4,   5,   4,   5,   4,   4,   4,   4,   4,   4,   4,   4,
-     4,   4,   4,   6,   0,   0,   7,   0,   8,   8,   8,   8,   8,   8,   8,   9,
-    10,  11,  12,  11,  11,  11,  13,  11,  14,  14,  14,  14,  14,  14,  14,  14,
-    15,  14,  14,  14,  14,  14,  14,  14,  14,  14,  14,  16,  17,  18,  17,  17,
-    19,  20,  21,  21,  22,  21,  23,  24,  25,  26,  27,  27,  28,  29,  27,  30,
-    27,  27,  27,  27,  27,  31,  27,  27,  32,  33,  33,  33,  34,  27,  27,  27,
-    35,  35,  35,  36,  37,  37,  37,  38,  39,  39,  40,  41,  42,  43,  44,  27,
-    45,  46,  27,  27,  27,  27,  47,  27,  48,  48,  48,  48,  48,  49,  50,  48,
-    51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,
-    67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,
-    83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,
-    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 109, 110, 111, 112, 109,
-   113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 122, 123, 122, 124, 125, 125,
-   126, 127, 128, 129, 130, 131, 125, 125, 132, 132, 132, 132, 133, 132, 134, 135,
-   132, 133, 132, 136, 136, 137, 125, 125, 138, 138, 138, 138, 138, 138, 138, 138,
-   138, 138, 139, 139, 140, 139, 139, 141, 142, 142, 142, 142, 142, 142, 142, 142,
-   143, 143, 143, 143, 144, 145, 143, 143, 144, 143, 143, 146, 147, 148, 143, 143,
-   143, 147, 143, 143, 143, 149, 143, 150, 143, 151, 152, 152, 152, 152, 152, 153,
-   154, 154, 154, 154, 154, 154, 154, 154, 155, 156, 157, 157, 157, 157, 158, 159,
-   160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 168, 168, 168, 169, 170, 170,
-   171, 172, 173, 173, 173, 173, 173, 174, 173, 173, 175, 154, 154, 154, 154, 176,
-   177, 178, 179, 179, 180, 181, 182, 183, 184, 184, 185, 184, 186, 187, 168, 168,
-   188, 189, 190, 190, 190, 191, 190, 192, 193, 193, 194,   8, 195, 125, 125, 125,
-   196, 196, 196, 196, 197, 196, 196, 198, 199, 199, 199, 199, 200, 200, 200, 201,
-   202, 202, 202, 203, 204, 205, 205, 205, 206, 139, 139, 207, 208, 209, 210, 211,
-     4,   4, 212,   4,   4, 213, 214, 215,   4,   4,   4, 216,   8,   8,   8,   8,
-    11, 217,  11,  11, 217, 218,  11, 219,  11,  11,  11, 220, 220, 221,  11, 222,
-   223,   0,   0,   0,   0,   0, 224, 225, 226, 227,   0,   0, 228,   8,   8, 229,
-     0,   0, 230, 231, 232,   0,   4,   4, 233,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 234, 125, 235, 125,   0,   0,
-   236, 236, 236, 236, 236, 236, 236, 236,   0,   0,   0,   0,   0,   0,   0, 237,
-     0, 238,   0,   0,   0,   0,   0,   0, 239, 239, 239, 239, 239, 239,   4,   4,
-   240, 240, 240, 240, 240, 240, 240, 241, 139, 139, 140, 242, 242, 242, 243, 244,
-   143, 245, 246, 246, 246, 246,  14,  14,   0,   0,   0,   0,   0, 247, 125, 125,
-   248, 249, 248, 248, 248, 248, 248, 250, 248, 248, 248, 248, 248, 248, 248, 248,
-   248, 248, 248, 248, 248, 251, 125, 252, 253,   0, 254, 255, 256, 257, 257, 257,
-   257, 258, 259, 260, 260, 260, 260, 261, 262, 263, 263, 264, 142, 142, 142, 142,
-   265,   0, 263, 263,   0,   0, 266, 260, 142, 265,   0,   0,   0,   0, 142, 267,
-     0,   0,   0,   0,   0, 260, 260, 268, 260, 260, 260, 260, 260, 269,   0,   0,
-   248, 248, 248, 248,   0,   0,   0,   0, 270, 270, 270, 270, 270, 270, 270, 270,
-   271, 270, 270, 270, 272, 273, 273, 273, 274, 274, 274, 274, 274, 274, 274, 274,
-   274, 274, 275, 125,  14,  14,  14,  14,  14,  14, 276, 276, 276, 276, 276, 277,
-     0,   0, 278,   4,   4,   4,   4,   4, 279,   4,   4,   4, 280, 281, 125, 282,
-   283, 283, 284, 285, 286, 286, 286, 287, 288, 288, 288, 288, 289, 290,  48,  48,
-   291, 291, 292, 293, 293, 294, 142, 295, 296, 296, 296, 296, 297, 298, 138, 299,
-   300, 300, 300, 301, 302, 303, 138, 138, 304, 304, 304, 304, 305, 306, 307, 308,
-   309, 310, 246,   4,   4, 311, 312, 152, 152, 152, 152, 152, 307, 307, 313, 314,
-   142, 142, 315, 142, 316, 142, 142, 317, 125, 125, 125, 125, 125, 125, 125, 125,
-   248, 248, 248, 248, 248, 248, 318, 248, 248, 248, 248, 248, 248, 319, 125, 125,
-   320, 321,  21, 322, 323,  27,  27,  27,  27,  27,  27,  27, 324, 325,  27,  27,
-    27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27, 326,  27,  27,  27,  27,
-    27, 327,  27,  27, 328, 125, 125,  27,   8, 285, 329,   0,   0, 330, 331, 332,
-    27,  27,  27,  27,  27,  27,  27, 333, 334,   0,   1,   2,   1,   2, 335, 259,
-   260, 336, 142, 265, 337, 338, 339, 340, 341, 342, 343, 344, 345, 345, 125, 125,
-   342, 342, 342, 342, 342, 342, 342, 346, 347,   0,   0, 348,  11,  11,  11,  11,
-   349, 350, 351, 125, 125,   0,   0, 352, 353, 354, 355, 355, 355, 356, 357, 252,
-   358, 358, 359, 360, 361, 362, 362, 363, 364, 365, 366, 366, 367, 368, 125, 125,
-   369, 369, 369, 369, 369, 370, 370, 370, 371, 372, 373, 374, 374, 375, 374, 376,
-   377, 377, 378, 379, 379, 379, 380, 381, 381, 382, 383, 384, 125, 125, 125, 125,
-   385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 386, 385, 387, 388, 125,
-   389,   4,   4, 390, 125, 125, 125, 125, 391, 392, 392, 393, 394, 395, 396, 396,
-   397, 398, 399, 125, 125, 125, 400, 401, 402, 403, 404, 405, 125, 125, 125, 125,
-   406, 406, 407, 408, 407, 409, 407, 407, 410, 411, 412, 413, 414, 414, 415, 415,
-   416, 416, 125, 125, 417, 417, 418, 419, 420, 420, 420, 421, 422, 423, 424, 425,
-   426, 427, 428, 125, 125, 125, 125, 125, 429, 429, 429, 429, 430, 125, 125, 125,
-   431, 431, 431, 432, 431, 431, 431, 433, 434, 434, 435, 436, 125, 125, 125, 125,
-   125, 125, 125, 125, 125, 125,  27,  45, 437, 437, 438, 439, 125, 125, 125, 440,
-   441, 441, 442, 443, 443, 444, 125, 445, 446, 125, 125, 447, 448, 125, 449, 450,
-   451, 451, 451, 451, 452, 453, 451, 454, 455, 455, 455, 455, 456, 457, 458, 459,
-   460, 460, 460, 461, 462, 463, 463, 464, 465, 465, 465, 465, 465, 465, 466, 467,
-   468, 469, 468, 468, 470, 125, 125, 125, 471, 472, 473, 474, 474, 474, 475, 476,
-   477, 478, 479, 480, 481, 482, 483, 484, 485, 485, 485, 485, 485, 486, 487, 125,
-   488, 488, 488, 488, 489, 490, 125, 125, 491, 491, 491, 492, 491, 493, 125, 125,
-   494, 494, 494, 494, 495, 496, 497, 125, 498, 498, 498, 499, 499, 125, 125, 125,
-   500, 501, 502, 500, 503, 125, 125, 125, 504, 504, 504, 505, 125, 125, 125, 125,
-   125, 125, 506, 506, 506, 506, 506, 507, 508, 509, 510, 511, 512, 513, 125, 125,
-   125, 125, 514, 515, 515, 514, 516, 125, 517, 517, 517, 517, 518, 519, 519, 519,
-   519, 519, 520, 154, 521, 521, 521, 522, 523, 125, 125, 125, 125, 125, 125, 125,
-   524, 525, 525, 526, 527, 525, 528, 529, 529, 530, 531, 532, 125, 125, 125, 125,
-   533, 534, 534, 535, 536, 537, 538, 539, 540, 541, 542, 125, 125, 125, 125, 125,
-   125, 125, 125, 125, 125, 125, 543, 544, 545, 546, 545, 547, 545, 548, 125, 125,
-   125, 125, 125, 549, 550, 550, 550, 551, 552, 552, 552, 552, 552, 552, 552, 552,
-   552, 553, 125, 125, 125, 125, 125, 125, 552, 552, 552, 552, 552, 552, 554, 555,
-   552, 552, 552, 552, 556, 125, 125, 125, 125, 557, 557, 557, 557, 557, 557, 558,
-   559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 560, 125, 125,
-   561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 562, 125, 125, 125,
-   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 563, 564, 565, 566, 567,
-   567, 567, 567, 568, 569, 570, 571, 572, 573, 573, 573, 573, 574, 575, 576, 577,
-   573, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 578, 578, 578, 578,
-   578, 579, 125, 125, 125, 125, 125, 125, 580, 580, 580, 580, 581, 580, 580, 580,
-   582, 580, 125, 125, 125, 125, 583, 584, 585, 585, 585, 585, 585, 585, 585, 585,
-   585, 585, 585, 585, 585, 585, 585, 586, 587, 587, 587, 587, 587, 587, 587, 587,
-   587, 587, 587, 587, 587, 588, 125, 125, 589, 125, 125, 125, 125, 125, 125, 125,
-   125, 125, 125, 125, 125, 125, 125, 590, 591, 257, 257, 257, 257, 257, 257, 257,
-   257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 592, 593, 125, 594, 595, 596,
-   596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 597,
-   598, 598, 598, 598, 598, 598, 599, 600, 601, 602, 266, 125, 125, 125, 125, 125,
-     8,   8, 603,   8, 604,   0,   0,   0,   0,   0,   0,   0, 266, 125, 125, 125,
-     0,   0,   0,   0,   0,   0,   0, 605,   0,   0, 606,   0,   0,   0, 607, 608,
-   609,   0, 610,   0,   0,   0, 235, 125,  11,  11,  11,  11, 611, 125, 125, 125,
-   125, 125, 125, 125,   0, 266,   0, 266,   0,   0,   0,   0,   0, 234,   0, 612,
-     0,   0,   0,   0,   0, 224,   0,   0,   0, 613, 614, 615, 616,   0,   0,   0,
-   617, 618,   0, 619, 620, 621,   0,   0,   0,   0, 622,   0,   0,   0,   0,   0,
-     0,   0,   0,   0, 623,   0,   0,   0, 624, 624, 624, 624, 624, 624, 624, 624,
-   625, 626, 627, 125, 125, 125, 125, 125,   4, 628, 629, 125, 125, 125, 125, 125,
-   630, 631, 632,  14,  14,  14, 633, 125, 634, 125, 125, 125, 125, 125, 125, 125,
-   635, 635, 636, 637, 638, 125, 125, 125, 125, 639, 640, 125, 641, 641, 641, 642,
-   125, 125, 125, 125, 125, 643, 643, 644, 125, 125, 125, 125, 125, 125, 645, 646,
-   647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 648, 649, 125, 125,
-   650, 650, 650, 650, 651, 652, 125, 125, 125, 125, 125, 125, 125, 125, 125, 334,
-     0,   0,   0, 653, 125, 125, 125, 125, 334,   0,   0, 247, 125, 125, 125, 125,
-   654,  27, 655, 656, 657, 658, 659, 660, 661, 662, 663, 662, 125, 125, 125, 664,
-     0,   0, 252,   0,   0,   0,   0,   0,   0, 266, 226, 334, 334, 334,   0, 605,
-     0,   0, 247, 125, 125, 125, 665,   0, 666,   0,   0, 252, 612, 667, 605, 125,
-     0,   0,   0,   0,   0, 668, 350, 350,   0,   0,   0,   0,   0,   0,   0, 669,
-     0,   0,   0,   0,   0, 285, 252, 228, 252,   0,   0,   0, 670, 285,   0,   0,
-   670,   0, 247, 667, 125, 125, 125, 125,   0,   0,   0,   0,   0, 266, 247, 350,
-   612,   0,   0, 671, 672, 252, 612, 612,   0, 330,   0,   0, 235, 125, 125, 285,
-   248, 248, 248, 248, 248, 248, 125, 125, 248, 248, 248, 319, 248, 248, 248, 248,
-   248, 318, 248, 248, 248, 248, 248, 248, 248, 248, 584, 248, 248, 248, 248, 248,
-   248, 248, 248, 248, 248, 248, 673, 125, 248, 318, 125, 125, 125, 125, 125, 125,
-   248, 248, 248, 248, 674, 248, 248, 248, 248, 248, 248, 125, 125, 125, 125, 125,
-   675, 125,   0,   0,   0,   0,   0,   0,   8,   8,   8,   8,   8,   8,   8,   8,
+    48,  48,  48,  48,  48,  48, 100,  48,  48,  48,  48,  48,  48, 204, 140, 140,
+    48, 204, 140, 140, 140, 140, 140, 140,  48,  48,  48,  48,  71,  48,  48,  48,
+    48,  48,  48, 140, 140, 140, 140, 140, 684, 140, 570, 570, 570, 570, 570, 570,
+    32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 140,
+   391, 391, 391, 391, 391, 391, 391, 685, 391, 391, 391, 391, 391, 391, 391, 686,
+     0,   0,   0,   0,   1,   2,   1,   2,   0,   0,   3,   3,   4,   5,   4,   5,
+     4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   6,   0,   0,   7,   0,
+     8,   8,   8,   8,   8,   8,   8,   9,  10,  11,  12,  11,  11,  11,  13,  11,
+    14,  14,  14,  14,  14,  14,  14,  14,  15,  14,  14,  14,  14,  14,  14,  14,
+    14,  14,  14,  16,  17,  18,  17,  17,  19,  20,  21,  21,  22,  21,  23,  24,
+    25,  26,  27,  27,  28,  29,  27,  30,  27,  27,  27,  27,  27,  31,  27,  27,
+    32,  33,  33,  33,  34,  27,  27,  27,  35,  35,  35,  36,  37,  37,  37,  38,
+    39,  39,  40,  41,  42,  43,  44,  27,  45,  46,  27,  27,  27,  27,  47,  27,
+    48,  48,  48,  48,  48,  49,  50,  48,  51,  52,  53,  54,  55,  56,  57,  58,
+    59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,
+    75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,
+    91,  92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106,
+   107, 108, 109, 109, 110, 111, 112, 109, 113, 114, 115, 116, 117, 118, 119, 120,
+   121, 122, 122, 123, 122, 124, 125, 125, 126, 127, 128, 129, 130, 131, 125, 125,
+   132, 132, 132, 132, 133, 132, 134, 135, 132, 133, 132, 136, 136, 137, 125, 125,
+   138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 140, 139, 139, 141,
+   142, 142, 142, 142, 142, 142, 142, 142, 143, 143, 143, 143, 144, 145, 143, 143,
+   144, 143, 143, 146, 147, 148, 143, 143, 143, 147, 143, 143, 143, 149, 143, 150,
+   143, 151, 152, 152, 152, 152, 152, 153, 154, 154, 154, 154, 154, 154, 154, 154,
+   155, 156, 157, 157, 157, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167,
+   168, 168, 168, 168, 168, 169, 170, 170, 171, 172, 173, 173, 173, 173, 173, 174,
+   173, 173, 175, 154, 154, 154, 154, 176, 177, 178, 179, 179, 180, 181, 182, 183,
+   184, 184, 185, 184, 186, 187, 168, 168, 188, 189, 190, 190, 190, 191, 190, 192,
+   193, 193, 194,   8, 195, 125, 125, 125, 196, 196, 196, 196, 197, 196, 196, 198,
+   199, 199, 199, 199, 200, 200, 200, 201, 202, 202, 202, 203, 204, 205, 205, 205,
+   206, 139, 139, 207, 208, 209, 210, 211,   4,   4, 212,   4,   4, 213, 214, 215,
+     4,   4,   4, 216,   8,   8,   8,   8,  11, 217,  11,  11, 217, 218,  11, 219,
+    11,  11,  11, 220, 220, 221,  11, 222, 223,   0,   0,   0,   0,   0, 224, 225,
+   226, 227,   0,   0, 228,   8,   8, 229,   0,   0, 230, 231, 232,   0,   4,   4,
+   233,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0, 234, 125, 235, 125,   0,   0, 236, 236, 236, 236, 236, 236, 236, 236,
+     0,   0,   0,   0,   0,   0,   0, 237,   0, 238,   0,   0,   0,   0,   0,   0,
+   239, 239, 239, 239, 239, 239,   4,   4, 240, 240, 240, 240, 240, 240, 240, 241,
+   139, 139, 140, 242, 242, 242, 243, 244, 143, 245, 246, 246, 246, 246,  14,  14,
+     0,   0,   0,   0,   0, 247, 125, 125, 248, 249, 248, 248, 248, 248, 248, 250,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 125,   0,
+   252,   0, 253, 254, 255, 256, 256, 256, 256, 257, 258, 259, 259, 259, 259, 260,
+   261, 262, 262, 263, 142, 142, 142, 142, 264,   0, 262, 262,   0,   0, 265, 259,
+   142, 264,   0,   0,   0,   0, 142, 266,   0,   0,   0,   0,   0, 259, 259, 267,
+   259, 259, 259, 259, 259, 268,   0,   0, 248, 248, 248, 248,   0,   0,   0,   0,
+   269, 269, 269, 269, 269, 269, 269, 269, 270, 269, 269, 269, 271, 272, 272, 272,
+   273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 274, 125,  14,  14,  14,  14,
+    14,  14, 275, 275, 275, 275, 275, 276,   0,   0, 277,   4,   4,   4,   4,   4,
+   278,   4,   4,   4, 279, 280, 125, 281, 282, 282, 283, 284, 285, 285, 285, 286,
+   287, 287, 287, 287, 288, 289,  48,  48, 290, 290, 291, 292, 292, 293, 142, 294,
+   295, 295, 295, 295, 296, 297, 138, 298, 299, 299, 299, 300, 301, 302, 138, 138,
+   303, 303, 303, 303, 304, 305, 306, 307, 308, 309, 246,   4,   4, 310, 311, 152,
+   152, 152, 152, 152, 306, 306, 312, 313, 142, 142, 314, 142, 315, 142, 142, 316,
+   125, 125, 125, 125, 125, 125, 125, 125, 248, 248, 248, 248, 248, 248, 317, 248,
+   248, 248, 248, 248, 248, 318, 125, 125, 319, 320,  21, 321, 322,  27,  27,  27,
+    27,  27,  27,  27, 323, 324,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+    27,  27,  27, 325,  27,  27,  27,  27,  27, 326,  27,  27, 327, 125, 125,  27,
+     8, 284, 328,   0,   0, 329, 330, 331,  27,  27,  27,  27,  27,  27,  27, 332,
+   333,   0,   1,   2,   1,   2, 334, 258, 259, 335, 142, 264, 336, 337, 338, 339,
+   340, 341, 342, 343, 344, 344, 125, 125, 341, 341, 341, 341, 341, 341, 341, 345,
+   346,   0,   0, 347,  11,  11,  11,  11, 348, 349, 350, 125, 125,   0,   0, 351,
+   352, 353, 354, 354, 354, 355, 356, 357, 358, 358, 359, 360, 361, 362, 362, 363,
+   364, 365, 366, 366, 367, 368, 125, 125, 369, 369, 369, 369, 369, 370, 370, 370,
+   371, 372, 373, 374, 374, 375, 374, 376, 377, 377, 378, 379, 379, 379, 380, 381,
+   381, 382, 383, 384, 125, 125, 125, 125, 385, 385, 385, 385, 385, 385, 385, 385,
+   385, 385, 385, 386, 385, 387, 388, 125, 389,   4,   4, 390, 125, 125, 125, 125,
+   391, 392, 392, 393, 394, 395, 396, 396, 397, 398, 399, 125, 125, 125, 400, 401,
+   402, 403, 404, 405, 125, 125, 125, 125, 406, 406, 407, 408, 407, 409, 407, 407,
+   410, 411, 412, 413, 414, 414, 415, 415, 416, 416, 125, 125, 417, 417, 418, 419,
+   420, 420, 420, 421, 422, 423, 424, 425, 426, 427, 428, 125, 125, 125, 125, 125,
+   429, 429, 429, 429, 430, 125, 125, 125, 431, 431, 431, 432, 431, 431, 431, 433,
+   434, 434, 435, 436, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,  27,  45,
+   437, 437, 438, 439, 125, 125, 125, 440, 441, 441, 442, 443, 443, 444, 125, 445,
+   446, 125, 125, 447, 448, 125, 449, 450, 451, 451, 451, 451, 452, 453, 451, 454,
+   455, 455, 455, 455, 456, 457, 458, 459, 460, 460, 460, 461, 462, 463, 463, 464,
+   465, 465, 465, 465, 465, 465, 466, 467, 468, 469, 468, 468, 470, 125, 125, 125,
+   471, 472, 473, 474, 474, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484,
+   485, 485, 485, 485, 485, 486, 487, 125, 488, 488, 488, 488, 489, 490, 125, 125,
+   491, 491, 491, 492, 491, 493, 125, 125, 494, 494, 494, 494, 495, 496, 497, 125,
+   498, 498, 498, 499, 499, 125, 125, 125, 500, 501, 502, 500, 503, 125, 125, 125,
+   504, 504, 504, 505, 125, 125, 125, 125, 125, 125, 506, 506, 506, 506, 506, 507,
+   508, 509, 510, 511, 512, 513, 125, 125, 125, 125, 514, 515, 515, 514, 516, 125,
+   517, 517, 517, 517, 518, 519, 519, 519, 519, 519, 520, 154, 521, 521, 521, 522,
+   523, 125, 125, 125, 125, 125, 125, 125, 524, 525, 525, 526, 527, 525, 528, 529,
+   529, 530, 531, 532, 125, 125, 125, 125, 533, 534, 534, 535, 536, 537, 538, 539,
+   540, 541, 542, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 543, 544,
+   545, 546, 545, 547, 545, 548, 125, 125, 125, 125, 125, 549, 550, 550, 550, 551,
+   552, 552, 552, 552, 552, 552, 552, 552, 552, 553, 125, 125, 125, 125, 125, 125,
+   552, 552, 552, 552, 552, 552, 554, 555, 552, 552, 552, 552, 556, 125, 125, 125,
+   125, 557, 557, 557, 557, 557, 557, 558, 559, 559, 559, 559, 559, 559, 559, 559,
+   559, 559, 559, 559, 559, 560, 125, 125, 561, 561, 561, 561, 561, 561, 561, 561,
+   561, 561, 561, 561, 562, 125, 125, 125, 275, 275, 275, 275, 275, 275, 275, 275,
+   275, 275, 275, 563, 564, 565, 566, 567, 567, 567, 567, 568, 569, 570, 571, 572,
+   573, 573, 573, 573, 574, 575, 576, 577, 573, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 578, 578, 578, 578, 578, 579, 125, 125, 125, 125, 125, 125,
+   580, 580, 580, 580, 581, 580, 580, 580, 582, 580, 125, 125, 125, 125, 583, 584,
+   585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 586,
+   587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 588, 125, 125,
+   589, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 590,
+   591, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
+   256, 256, 592, 593, 125, 594, 595, 596, 596, 596, 596, 596, 596, 596, 596, 596,
+   596, 596, 596, 596, 596, 596, 596, 597, 598, 598, 598, 598, 598, 598, 599, 600,
+   601, 602, 603, 125, 125, 125, 125, 125,   8,   8, 604,   8, 605,   0,   0,   0,
+     0,   0,   0,   0, 603, 125, 125, 125,   0,   0,   0,   0,   0,   0,   0, 606,
+     0,   0, 607,   0,   0,   0, 608, 609, 610,   0, 611,   0,   0,   0, 235, 125,
+    11,  11,  11,  11, 612, 125, 125, 125, 125, 125, 125, 125,   0, 603,   0, 603,
+     0,   0,   0,   0,   0, 234,   0, 613,   0,   0,   0,   0,   0, 224,   0,   0,
+     0, 614, 615, 616, 617,   0,   0,   0, 618, 619,   0, 620, 621, 622,   0,   0,
+     0,   0, 623,   0,   0,   0,   0,   0,   0,   0,   0,   0, 624,   0,   0,   0,
+   625, 625, 625, 625, 625, 625, 625, 625, 626, 627, 628, 125, 125, 125, 125, 125,
+     4, 629, 630, 125, 125, 125, 125, 125, 631, 632, 633,  14,  14,  14, 634, 125,
+   635, 125, 125, 125, 125, 125, 125, 125, 636, 636, 637, 638, 639, 125, 125, 125,
+   125, 640, 641, 125, 642, 642, 642, 643, 125, 125, 125, 125, 125, 644, 644, 645,
+   125, 125, 125, 125, 125, 125, 646, 647, 648, 648, 648, 648, 648, 648, 648, 648,
+   648, 648, 648, 648, 649, 650, 125, 125, 651, 651, 651, 651, 652, 653, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 333,   0,   0,   0, 654, 125, 125, 125, 125,
+   333,   0,   0, 247, 125, 125, 125, 125, 655,  27, 656, 657, 658, 659, 660, 661,
+   662, 663, 664, 663, 125, 125, 125, 665,   0,   0, 357,   0,   0,   0,   0,   0,
+     0, 603, 226, 333, 333, 333,   0, 606,   0,   0, 247, 125, 125, 125, 666,   0,
+   667,   0,   0, 357, 613, 668, 606, 125,   0,   0,   0,   0,   0, 669, 349, 349,
+     0,   0,   0,   0,   0,   0,   0, 670,   0,   0,   0,   0,   0, 284, 357, 228,
+   357,   0,   0,   0, 671, 284,   0,   0, 671,   0, 247, 668, 125, 125, 125, 125,
+     0,   0,   0,   0,   0, 603, 247, 349, 613,   0,   0, 672, 673, 357, 613, 613,
+     0, 329,   0,   0, 235, 125, 125, 284, 248, 248, 248, 248, 248, 248, 125, 125,
+   248, 248, 248, 318, 248, 248, 248, 248, 248, 317, 248, 248, 248, 248, 248, 248,
+   248, 248, 584, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 674, 248,
+   248, 248, 248, 248, 248, 317, 125, 125, 248, 317, 125, 125, 125, 125, 125, 125,
+   248, 248, 248, 248, 675, 248, 248, 248, 248, 248, 248, 125, 125, 125, 125, 125,
+   676, 125,   0,   0,   0,   0,   0,   0,   8,   8,   8,   8,   8,   8,   8,   8,
      8,   8,   8,   8,   8,   8,   8,   0,   0,   0,   0,   0,   1,   2,   2,   2,
      2,   2,   3,   0,   0,   0,   4,   0,   2,   2,   2,   2,   2,   3,   2,   2,
      2,   2,   5,   0,   2,   5,   6,   0,   7,   7,   7,   7,   8,   9,  10,  11,
@@ -4071,33 +4074,33 @@ _hb_ucd_u16[10040] =
      0, 240,   0,   0, 241, 241, 241, 241,  18,  18,  18,  18,  18,  12, 242,  18,
    243, 243, 243, 243, 243, 243,  12, 244, 245,  12,  12, 244, 151, 154,  12,  12,
    151, 154, 151, 154,   0,   0,   0, 246, 247, 247, 247, 247, 247, 247, 248, 247,
-   247,  12,  12,  12, 247, 249,  12,  12,   0,   0,   0,  12,   0, 250,   0,   0,
-   251, 247, 252, 253,   0,   0, 247,   0, 254, 255, 255, 255, 255, 255, 255, 255,
-   255, 256, 257, 258, 259, 260, 260, 260, 260, 260, 260, 260, 260, 260, 261, 259,
-    12, 262, 263, 263, 263, 263, 263, 263, 264, 150, 150, 150, 150, 150, 150, 265,
-     0,  12,  12,  12, 150, 150, 150, 266, 260, 260, 260, 261, 260, 260,   0,   0,
-   267, 267, 267, 267, 267, 267, 267, 268, 267, 269,  12,  12, 270, 270, 270, 270,
-   271, 271, 271, 271, 271, 271, 271,  12, 272, 272, 272, 272, 272, 272,  12,  12,
-   237,   2,   2,   2,   2,   2, 231,   2,   2,   2, 273,  12, 274, 275, 276,  12,
-   277,   2,   2,   2, 278, 278, 278, 278, 278, 278, 278, 279,   0,   0, 246,  12,
-   280, 280, 280, 280, 280, 280,  12,  12, 281, 281, 281, 281, 281, 282,  12, 283,
-   281, 281, 282,  12, 284, 284, 284, 284, 284, 284, 284, 285, 286, 286, 286, 286,
-   286,  12,  12, 287, 150, 150, 150, 288, 289, 289, 289, 289, 289, 289, 289, 290,
-   289, 289, 291, 292, 145, 145, 145, 293, 294, 294, 294, 294, 294, 295,  12,  12,
-   294, 294, 294, 296, 294, 294, 296, 294, 297, 297, 297, 297, 298,  12,  12,  12,
-    12,  12, 299, 297, 300, 300, 300, 300, 300, 301,  12,  12, 155, 154, 155, 154,
-   155, 154,  12,  12,   2,   2,   3,   2,   2, 302, 303,  12, 300, 300, 300, 304,
-   300, 300, 304,  12, 150,  12,  12,  12, 150, 265, 305, 150, 150, 150, 150,  12,
-   247, 247, 247, 249, 247, 247, 249,  12,   2, 273,  12,  12, 306,  22,  12,  24,
-    25,  26,  25, 307, 308, 309,  25,  25,  50,  12,  12,  12, 310,  29,  29,  29,
-    29,  29,  29, 311, 312,  29,  29,  29,  29,  29,  12, 310,   7,   7,   7, 313,
-   232,   0,   0,   0,   0, 232,   0,  12,  29, 314,  29,  29,  29,  29,  29, 315,
-   316,   0,   0,   0,   0, 317, 260, 260, 260, 260, 260, 318, 319, 150, 319, 150,
-   319, 150, 319, 288,   0, 232,   0, 232,  12,  12, 316, 246, 320, 320, 320, 321,
-   320, 320, 320, 320, 320, 322, 320, 320, 320, 320, 322, 323, 320, 320, 320, 324,
-   320, 320, 322,  12, 232, 131,   0,   0,   0, 131,   0,   0,   8,   8,   8,  14,
-     0,   0,   0, 234, 325,  12,  12,  12,   0,   0,   0, 326, 327, 327, 327, 327,
-   327, 327, 327, 328, 329, 329, 329, 329, 330,  12,  12,  12, 215,   0,   0,   0,
+   247,  12,  12,  12, 247, 249,  12,  12,   0, 250,   0,   0, 251, 247, 252, 253,
+     0,   0, 247,   0, 254, 255, 255, 255, 255, 255, 255, 255, 255, 256, 257, 258,
+   259, 260, 260, 260, 260, 260, 260, 260, 260, 260, 261, 259,  12, 262, 263, 263,
+   263, 263, 263, 263, 264, 150, 150, 150, 150, 150, 150, 265,   0,  12,  12, 131,
+   150, 150, 150, 266, 260, 260, 260, 261, 260, 260,   0,   0, 267, 267, 267, 267,
+   267, 267, 267, 268, 267, 269,  12,  12, 270, 270, 270, 270, 271, 271, 271, 271,
+   271, 271, 271,  12, 272, 272, 272, 272, 272, 272,  12,  12, 237,   2,   2,   2,
+     2,   2, 231,   2,   2,   2, 273,  12, 274, 275, 276,  12, 277,   2,   2,   2,
+   278, 278, 278, 278, 278, 278, 278, 279,   0,   0, 246,  12, 280, 280, 280, 280,
+   280, 280,  12,  12, 281, 281, 281, 281, 281, 282,  12, 283, 281, 281, 282,  12,
+   284, 284, 284, 284, 284, 284, 284, 285, 286, 286, 286, 286, 286,  12,  12, 287,
+   150, 150, 150, 288, 289, 289, 289, 289, 289, 289, 289, 290, 289, 289, 291, 292,
+   145, 145, 145, 293, 294, 294, 294, 294, 294, 295,  12,  12, 294, 294, 294, 296,
+   294, 294, 296, 294, 297, 297, 297, 297, 298,  12,  12,  12,  12,  12, 299, 297,
+   300, 300, 300, 300, 300, 301,  12,  12, 155, 154, 155, 154, 155, 154,  12,  12,
+     2,   2,   3,   2,   2, 302, 303,  12, 300, 300, 300, 304, 300, 300, 304,  12,
+   150,  12,  12,  12, 150, 265, 305, 150, 150, 150, 150,  12, 247, 247, 247, 249,
+   247, 247, 249,  12,   2, 273,  12,  12, 306,  22,  12,  24,  25,  26,  25, 307,
+   308, 309,  25,  25,  50,  12,  12,  12, 310,  29,  29,  29,  29,  29,  29, 311,
+   312,  29,  29,  29,  29,  29,  12, 310,   7,   7,   7, 313, 232,   0,   0,   0,
+     0, 232,   0,  12,  29, 314,  29,  29,  29,  29,  29, 315, 316,   0,   0,   0,
+     0, 317, 260, 260, 260, 260, 260, 318, 319, 150, 319, 150, 319, 150, 319, 288,
+     0, 232,   0, 232,  12,  12, 316, 246, 320, 320, 320, 321, 320, 320, 320, 320,
+   320, 322, 320, 320, 320, 320, 322, 323, 320, 320, 320, 324, 320, 320, 322,  12,
+   232, 131,   0,   0,   0, 131,   0,   0,   8,   8,   8,  14,   0,   0,   0, 234,
+   325,  12,  12,  12,   0,   0,   0, 326, 327, 327, 327, 327, 327, 327, 327, 328,
+   329, 329, 329, 329, 330,  12,  12,  12, 215,   0,   0,   0,   0,   0,   0,  12,
    331, 331, 331, 331, 331,  12,  12, 332, 333, 333, 333, 333, 333, 333, 334,  12,
    335, 335, 335, 335, 335, 335, 336,  12, 337, 337, 337, 337, 337, 337, 337, 338,
    339, 339, 339, 339, 339,  12, 339, 339, 339, 340,  12,  12, 341, 341, 341, 341,
@@ -4159,232 +4162,232 @@ _hb_ucd_u16[10040] =
    260, 556, 260, 557, 558, 255, 255, 255, 559,  12,  12,  12, 560,  12,  12,  12,
    256, 561,  12,  12,  12, 260,  12,  12, 562, 562, 562, 562, 562, 562, 562,  12,
    563, 563, 563, 563, 563, 563, 564,  12, 563, 563, 563, 565, 563, 563, 565,  12,
-   563, 563, 566, 563,   7,   7,   7, 567,   7, 199,  12,  12,   0, 246,  12,  12,
-     0, 232, 316,   0,   0, 568, 228,   0,   0,   0, 568,   7, 213, 569,   7,   0,
-     0,   0, 570, 228,   8, 225,  12,  12,   0,   0, 234,  12,   0,   0,   0, 229,
-   571, 572, 316, 229,   0,   0, 240, 316,   0, 316,   0,   0,   0, 240, 232, 316,
-     0, 229,   0, 229,   0,   0, 240, 232,   0, 573, 239,   0, 229,   0,   0,   0,
-     0, 246,   0,   0,   0,   0,   0, 239, 574, 574, 574, 574, 574, 574, 574,  12,
-    12,  12, 575, 574, 576, 574, 574, 574,   2,   2,   2, 273,  12, 275, 273,  12,
-   241, 577, 241, 241, 241, 241, 578, 241, 579, 580, 577,  12,  19,  19,  19, 581,
-    12,  12,  12, 582, 583, 583, 583, 583, 583, 583, 583, 584, 583, 583, 583, 585,
-   583, 583, 585, 586, 587, 587, 587, 587, 587, 587, 587, 588, 589, 589, 589, 589,
-   589, 589, 590, 591, 592, 592, 592, 592, 592, 592, 593,  12, 151, 154, 151, 594,
-   151, 151, 151, 154, 595, 595, 595, 595, 595, 596, 595, 595, 595, 597,  12,  12,
-   598, 598, 598, 598, 598, 598, 598,  12, 598, 598, 599, 600,   0, 234,  12,  12,
-    29, 414,  29,  29, 601, 602, 414,  29,  50,  29, 603,  12, 604, 310, 603, 414,
-   601, 602, 603, 603, 601, 602,  50,  29,  50,  29, 414, 605,  29,  29, 606,  29,
-    29,  29,  29,  12, 414, 414, 606,  29,  51,  12,  12,  12,  12, 239,   0,   0,
-   607,  12,  12,  12, 246,  12,  12,  12,   0,   0,  12,   0,   0, 232, 131,   0,
-     0,   0,  12,  12,   0,   0,   0, 240,   0, 246,  12, 239, 608,  12,  12,  12,
-   247, 247, 609,  12, 610,  12,  12,  12,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0, 939, 940, 941, 942, 946, 948,   0, 962,
-   969, 970, 971, 976,1001,1002,1003,1008,   0,1033,1040,1041,1042,1043,1047,   0,
-     0,1080,1081,1082,1086,1110,   0,   0,1124,1125,1126,1127,1131,1133,   0,1147,
-  1154,1155,1156,1161,1187,1188,1189,1193,   0,1219,1226,1227,1228,1229,1233,   0,
-     0,1267,1268,1269,1273,1298,   0,1303, 943,1128, 944,1129, 954,1139, 958,1143,
-   959,1144, 960,1145, 961,1146, 964,1149,   0,   0, 973,1158, 974,1159, 975,1160,
-   983,1168, 978,1163, 988,1173, 990,1175, 991,1176, 993,1178, 994,1179,   0,   0,
-  1004,1190,1005,1191,1006,1192,1014,1199,1007,   0,   0,   0,1016,1201,1020,1206,
-     0,1022,1208,1025,1211,1023,1209,   0,   0,   0,   0,1032,1218,1037,1223,1035,
-  1221,   0,   0,   0,1044,1230,1045,1231,1049,1235,   0,   0,1058,1244,1064,1250,
-  1060,1246,1066,1252,1067,1253,1072,1258,1069,1255,1077,1264,1074,1261,   0,   0,
-  1083,1270,1084,1271,1085,1272,1088,1275,1089,1276,1096,1283,1103,1290,1111,1299,
-  1115,1118,1307,1120,1309,1121,1310,   0,1053,1239,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,1093,1280,   0,   0,   0,   0,   0,   0,   0,
+   563, 563, 566, 563,   0,  12,  12,  12,   7,   7,   7, 567,   7, 199,  12,  12,
+     0, 246,  12,  12,   0, 232, 316,   0,   0, 568, 228,   0,   0,   0, 568,   7,
+   213, 569,   7,   0,   0,   0, 570, 228,   8, 225,  12,  12,   0,   0, 234,  12,
+     0,   0,   0, 229, 571, 572, 316, 229,   0,   0, 240, 316,   0, 316,   0,   0,
+     0, 240, 232, 316,   0, 229,   0, 229,   0,   0, 240, 232,   0, 573, 239,   0,
+   229,   0,   0,   0,   0, 246,   0,   0,   0,   0,   0, 239, 574, 574, 574, 574,
+   574, 574, 574,  12,  12,  12, 575, 574, 576, 574, 574, 574,   2,   2,   2, 273,
+    12, 275, 273,  12, 241, 577, 241, 241, 241, 241, 578, 241, 579, 580, 577,  12,
+    19,  19,  19, 581,  12,  12,  12, 582, 583, 583, 583, 583, 583, 583, 583, 584,
+   583, 583, 583, 585, 583, 583, 585, 586, 587, 587, 587, 587, 587, 587, 587, 588,
+   589, 589, 589, 589, 589, 589, 590, 591, 592, 592, 592, 592, 592, 592, 593,  12,
+   151, 154, 151, 594, 151, 151, 151, 154, 595, 595, 595, 595, 595, 596, 595, 595,
+   595, 597,  12,  12, 598, 598, 598, 598, 598, 598, 598,  12, 598, 598, 599, 600,
+     0, 234,  12,  12,  29, 414,  29,  29, 601, 602, 414,  29,  50,  29, 603,  12,
+   604, 310, 603, 414, 601, 602, 603, 603, 601, 602,  50,  29,  50,  29, 414, 605,
+    29,  29, 606,  29,  29,  29,  29,  12, 414, 414, 606,  29,  51,  12,  12,  12,
+    12, 239,   0,   0, 607,  12,  12,  12, 246,  12,  12,  12,   0,   0,  12,   0,
+     0, 232, 131,   0,   0,   0,  12,  12,   0,   0,   0, 240,   0, 246,  12, 239,
+   608,  12,  12,  12, 247, 247, 609,  12, 610,  12,  12,  12,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 939, 940, 941, 942,
+   946, 948,   0, 962, 969, 970, 971, 976,1001,1002,1003,1008,   0,1033,1040,1041,
+  1042,1043,1047,   0,   0,1080,1081,1082,1086,1110,   0,   0,1124,1125,1126,1127,
+  1131,1133,   0,1147,1154,1155,1156,1161,1187,1188,1189,1193,   0,1219,1226,1227,
+  1228,1229,1233,   0,   0,1267,1268,1269,1273,1298,   0,1303, 943,1128, 944,1129,
+   954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149,   0,   0, 973,1158,
+   974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175, 991,1176, 993,1178,
+   994,1179,   0,   0,1004,1190,1005,1191,1006,1192,1014,1199,1007,   0,   0,   0,
+  1016,1201,1020,1206,   0,1022,1208,1025,1211,1023,1209,   0,   0,   0,   0,1032,
+  1218,1037,1223,1035,1221,   0,   0,   0,1044,1230,1045,1231,1049,1235,   0,   0,
+  1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258,1069,1255,1077,1264,
+  1074,1261,   0,   0,1083,1270,1084,1271,1085,1272,1088,1275,1089,1276,1096,1283,
+  1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310,   0,1053,1239,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1093,1280,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0, 949,1134,1010,1195,1050,1236,1090,1277,1341,1368,1340,
-  1367,1342,1369,1339,1366,   0,1320,1347,1418,1419,1323,1350,   0,   0, 992,1177,
-  1018,1204,1055,1241,1416,1417,1415,1424,1202,   0,   0,   0, 987,1172,   0,   0,
-  1031,1217,1321,1348,1322,1349,1338,1365, 950,1135, 951,1136, 979,1164, 980,1165,
-  1011,1196,1012,1197,1051,1237,1052,1238,1061,1247,1062,1248,1091,1278,1092,1279,
-  1071,1257,1076,1263,   0,   0, 997,1182,   0,   0,   0,   0,   0,   0, 945,1130,
-   982,1167,1337,1364,1335,1362,1046,1232,1422,1423,1113,1301,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   8,   9,   0,  10,1425,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,1314,1427,   5,
-  1434,1438,1443,   0,1450,   0,1455,1461,1514,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0, 949,1134,1010,1195,1050,1236,1090,
+  1277,1341,1368,1340,1367,1342,1369,1339,1366,   0,1320,1347,1418,1419,1323,1350,
+     0,   0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424,1202,   0,   0,   0,
+   987,1172,   0,   0,1031,1217,1321,1348,1322,1349,1338,1365, 950,1135, 951,1136,
+   979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238,1061,1247,1062,1248,
+  1091,1278,1092,1279,1071,1257,1076,1263,   0,   0, 997,1182,   0,   0,   0,   0,
+     0,   0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232,1422,1423,1113,1301,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   8,   9,   0,  10,
+  1425,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     7,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+     0,1314,1427,   5,1434,1438,1443,   0,1450,   0,1455,1461,1514,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1446,1458,1468,1476,1480,1486,1517,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1446,1458,1468,1476,1480,1486,1517,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1489,1503,1494,1500,1508,   0,   0,   0,   0,1520,1521,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,1526,1528,   0,1525,   0,   0,   0,1522,
-     0,   0,   0,   0,1536,1532,1539,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1534,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1556,   0,   0,   0,   0,   0,   0,1548,1550,   0,1547,   0,   0,   0,1567,
-     0,   0,   0,   0,1558,1554,1561,   0,   0,   0,   0,   0,   0,   0,1568,1569,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,1529,1551,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,1523,1545,1524,1546,   0,   0,1527,1549,
-     0,   0,1570,1571,1530,1552,1531,1553,   0,   0,1533,1555,1535,1557,1537,1559,
-     0,   0,1572,1573,1544,1566,1538,1560,1540,1562,1541,1563,1542,1564,   0,   0,
-  1543,1565,   0,   0,   0,   0,   0,   0,   0,   0,1606,1607,1609,1608,1610,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,1613,   0,1611,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1612,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1489,1503,1494,1500,1508,   0,   0,   0,   0,1520,
+  1521,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1526,1528,   0,1525,
+     0,   0,   0,1522,   0,   0,   0,   0,1536,1532,1539,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,1534,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,1556,   0,   0,   0,   0,   0,   0,1548,1550,   0,1547,
+     0,   0,   0,1567,   0,   0,   0,   0,1558,1554,1561,   0,   0,   0,   0,   0,
+     0,   0,1568,1569,   0,   0,   0,   0,   0,   0,   0,   0,   0,1529,1551,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1523,1545,1524,1546,
+     0,   0,1527,1549,   0,   0,1570,1571,1530,1552,1531,1553,   0,   0,1533,1555,
+  1535,1557,1537,1559,   0,   0,1572,1573,1544,1566,1538,1560,1540,1562,1541,1563,
+  1542,1564,   0,   0,1543,1565,   0,   0,   0,   0,   0,   0,   0,   0,1606,1607,
+  1609,1608,1610,   0,   0,   0,   0,   0,   0,   0,   0,   0,1613,   0,1611,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1612,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1620,   0,   0,   0,   0,   0,   0,   0,1623,   0,   0,1624,   0,   0,   0,
+     0,   0,   0,   0,   0,1620,   0,   0,   0,   0,   0,   0,   0,1623,   0,   0,
+  1624,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,1614,1615,1616,1617,1618,1619,1621,1622,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,1628,1629,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1625,1626,   0,1627,   0,   0,   0,1634,
+     0,   0,1635,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,1630,1631,1632,   0,   0,1633,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,1639,   0,   0,1638,1640,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1636,1637,   0,   0,   0,   0,   0,   0,
+  1641,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1642,1644,1643,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,1645,   0,   0,   0,   0,   0,   0,   0,1646,   0,   0,   0,
+     0,   0,   0,1648,1649,   0,1647,1650,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1651,1653,1652,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1654,   0,1655,1657,1656,   0,   0,   0,   0,1659,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1660,   0,   0,   0,   0,1661,   0,
+     0,   0,   0,1662,   0,   0,   0,   0,1663,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,1658,   0,   0,   0,   0,   0,   0,   0,   0,   0,1664,
+     0,1665,1673,   0,1674,   0,   0,   0,   0,   0,   0,   0,   0,1666,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1668,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1669,   0,   0,   0,   0,1670,   0,
+     0,   0,   0,1671,   0,   0,   0,   0,1672,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,1667,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,1675,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,1676,   0,1677,   0,1678,   0,1679,   0,1680,   0,   0,   0,1681,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1614,1615,1616,1617,1618,1619,1621,1622,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1628,1629,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1625,1626,   0,1627,   0,   0,   0,1634,   0,   0,1635,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1630,1631,1632,   0,   0,1633,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1639,   0,   0,1638,1640,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1636,1637,   0,   0,   0,   0,   0,   0,1641,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,1682,   0,1683,   0,   0,1684,1685,   0,1686,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 953,1138, 955,1140,
+   956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153, 966,1151, 967,1152,
+  1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171, 989,1174, 995,1180,
+   998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356,1017,1203,1019,1205,
+  1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214,1029,1215,1030,1216,
+  1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363,1382,1384,1383,1385,
+  1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251,1068,1254,1070,1256,
+  1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266,1078,1265,1095,1282,
+  1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287,1101,1288,1102,1289,
+  1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302,1119,1308,1122,1311,
+  1123,1312,1186,1260,1293,1305,   0,1394,   0,   0,   0,   0, 952,1137, 947,1132,
+  1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375,1370,1374,1373,1377,
+  1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353,1325,1352,1328,1355,
+  1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234,1331,1358,1330,1357,
+  1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403,1397,1402,1399,1404,
+  1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412,1409,1414,1109,1297,
+  1117,1306,1116,1304,1112,1300,   0,   0,   0,   0,   0,   0,1471,1472,1701,1705,
+  1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721,1477,1478,1729,1731,
+  1730,1732,   0,   0,1435,1436,1733,1735,1734,1736,   0,   0,1481,1482,1737,1741,
+  1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757,1490,1491,1765,1768,
+  1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776,1495,1496,1777,1779,
+  1778,1780,   0,   0,1451,1452,1781,1783,1782,1784,   0,   0,1504,1505,1785,1788,
+  1786,1789,1787,1790,   0,1459,   0,1791,   0,1792,   0,1793,1509,1510,1794,1798,
+  1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814,1467,  21,1475,  22,
+  1479,  23,1485,  24,1493,  27,1499,  28,1507,  29,   0,   0,1704,1708,1709,1710,
+  1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728,1740,1744,1745,1746,
+  1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764,1797,1801,1802,1803,
+  1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821,1470,1469,1822,1474,
+  1465,   0,1473,1825,1429,1428,1426,  12,1432,   0,  26,   0,   0,1315,1823,1484,
+  1466,   0,1483,1829,1433,  13,1437,  14,1441,1826,1827,1828,1488,1487,1513,  19,
+     0,   0,1492,1515,1445,1444,1442,  15,   0,1831,1832,1833,1502,1501,1516,  25,
+  1497,1498,1506,1518,1457,1456,1454,  17,1453,1313,  11,   3,   0,   0,1824,1512,
+  1519,   0,1511,1830,1449,  16,1460,  18,1464,   4,   0,   0,  30,  31,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1642,1644,1643,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1645,   0,   0,   0,   0,   0,   0,   0,1646,   0,   0,   0,   0,   0,   0,1648,
-  1649,   0,1647,1650,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1651,1653,1652,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1654,   0,1655,1657,1656,   0,   0,   0,   0,1659,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1660,   0,   0,   0,   0,1661,   0,   0,   0,   0,1662,
-     0,   0,   0,   0,1663,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1658,   0,   0,   0,   0,   0,   0,   0,   0,   0,1664,   0,1665,1673,   0,
-  1674,   0,   0,   0,   0,   0,   0,   0,   0,1666,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1668,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1669,   0,   0,   0,   0,1670,   0,   0,   0,   0,1671,
-     0,   0,   0,   0,1672,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1667,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1675,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1676,   0,
-  1677,   0,1678,   0,1679,   0,1680,   0,   0,   0,1681,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1682,   0,1683,   0,   0,1684,1685,   0,1686,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0, 953,1138, 955,1140, 956,1141, 957,1142,
-  1324,1351, 963,1148, 965,1150, 968,1153, 966,1151, 967,1152,1378,1380,1379,1381,
-   984,1169, 985,1170,1420,1421, 986,1171, 989,1174, 995,1180, 998,1183, 996,1181,
-   999,1184,1000,1185,1015,1200,1329,1356,1017,1203,1019,1205,1021,1207,1024,1210,
-  1687,1688,1027,1213,1026,1212,1028,1214,1029,1215,1030,1216,1034,1220,1036,1222,
-  1039,1225,1038,1224,1334,1361,1336,1363,1382,1384,1383,1385,1056,1242,1057,1243,
-  1059,1245,1063,1249,1689,1690,1065,1251,1068,1254,1070,1256,1386,1387,1388,1389,
-  1691,1692,1073,1259,1075,1262,1079,1266,1078,1265,1095,1282,1098,1285,1097,1284,
-  1390,1391,1392,1393,1099,1286,1100,1287,1101,1288,1102,1289,1105,1292,1104,1291,
-  1106,1294,1107,1295,1108,1296,1114,1302,1119,1308,1122,1311,1123,1312,1186,1260,
-  1293,1305,   0,1394,   0,   0,   0,   0, 952,1137, 947,1132,1317,1344,1316,1343,
-  1319,1346,1318,1345,1693,1695,1371,1375,1370,1374,1373,1377,1372,1376,1694,1696,
-   981,1166, 977,1162, 972,1157,1326,1353,1325,1352,1328,1355,1327,1354,1697,1698,
-  1009,1194,1013,1198,1054,1240,1048,1234,1331,1358,1330,1357,1333,1360,1332,1359,
-  1699,1700,1396,1401,1395,1400,1398,1403,1397,1402,1399,1404,1094,1281,1087,1274,
-  1406,1411,1405,1410,1408,1413,1407,1412,1409,1414,1109,1297,1117,1306,1116,1304,
-  1112,1300,   0,   0,   0,   0,   0,   0,1471,1472,1701,1705,1702,1706,1703,1707,
-  1430,1431,1715,1719,1716,1720,1717,1721,1477,1478,1729,1731,1730,1732,   0,   0,
-  1435,1436,1733,1735,1734,1736,   0,   0,1481,1482,1737,1741,1738,1742,1739,1743,
-  1439,1440,1751,1755,1752,1756,1753,1757,1490,1491,1765,1768,1766,1769,1767,1770,
-  1447,1448,1771,1774,1772,1775,1773,1776,1495,1496,1777,1779,1778,1780,   0,   0,
-  1451,1452,1781,1783,1782,1784,   0,   0,1504,1505,1785,1788,1786,1789,1787,1790,
-     0,1459,   0,1791,   0,1792,   0,1793,1509,1510,1794,1798,1795,1799,1796,1800,
-  1462,1463,1808,1812,1809,1813,1810,1814,1467,  21,1475,  22,1479,  23,1485,  24,
-  1493,  27,1499,  28,1507,  29,   0,   0,1704,1708,1709,1710,1711,1712,1713,1714,
-  1718,1722,1723,1724,1725,1726,1727,1728,1740,1744,1745,1746,1747,1748,1749,1750,
-  1754,1758,1759,1760,1761,1762,1763,1764,1797,1801,1802,1803,1804,1805,1806,1807,
-  1811,1815,1816,1817,1818,1819,1820,1821,1470,1469,1822,1474,1465,   0,1473,1825,
-  1429,1428,1426,  12,1432,   0,  26,   0,   0,1315,1823,1484,1466,   0,1483,1829,
-  1433,  13,1437,  14,1441,1826,1827,1828,1488,1487,1513,  19,   0,   0,1492,1515,
-  1445,1444,1442,  15,   0,1831,1832,1833,1502,1501,1516,  25,1497,1498,1506,1518,
-  1457,1456,1454,  17,1453,1313,  11,   3,   0,   0,1824,1512,1519,   0,1511,1830,
-  1449,  16,1460,  18,1464,   4,   0,   0,  30,  31,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  20,   0,
-     0,   0,   2,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1834,1835,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,1836,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1837,1839,1838,   0,   0,   0,   0,1840,   0,   0,   0,
-     0,1841,   0,   0,1842,   0,   0,   0,   0,   0,   0,   0,1843,   0,1844,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,1845,   0,   0,1846,   0,   0,1847,
-     0,1848,   0,   0,   0,   0,   0,   0, 937,   0,1850,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1849, 936, 938,1851,1852,   0,   0,1853,1854,   0,   0,
-  1855,1856,   0,   0,   0,   0,   0,   0,1857,1858,   0,   0,1861,1862,   0,   0,
-  1863,1864,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1867,1868,1869,1870,1859,1860,1865,1866,   0,   0,   0,   0,
-     0,   0,1871,1872,1873,1874,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,  32,  33,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1875,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1877,   0,1878,   0,1879,   0,1880,   0,1881,   0,1882,   0,
-  1883,   0,1884,   0,1885,   0,1886,   0,1887,   0,1888,   0,   0,1889,   0,1890,
-     0,1891,   0,   0,   0,   0,   0,   0,1892,1893,   0,1894,1895,   0,1896,1897,
-     0,1898,1899,   0,1900,1901,   0,   0,   0,   0,   0,   0,1876,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,1902,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1904,   0,1905,   0,1906,   0,1907,   0,1908,   0,1909,   0,
-  1910,   0,1911,   0,1912,   0,1913,   0,1914,   0,1915,   0,   0,1916,   0,1917,
-     0,1918,   0,   0,   0,   0,   0,   0,1919,1920,   0,1921,1922,   0,1923,1924,
-     0,1925,1926,   0,1927,1928,   0,   0,   0,   0,   0,   0,1903,   0,   0,1929,
-  1930,1931,1932,   0,   0,   0,1933,   0, 710, 385, 724, 715, 455, 103, 186, 825,
-   825, 242, 751, 205, 241, 336, 524, 601, 663, 676, 688, 738, 411, 434, 474, 500,
-   649, 746, 799, 108, 180, 416, 482, 662, 810, 275, 462, 658, 692, 344, 618, 679,
-   293, 388, 440, 492, 740, 116, 146, 168, 368, 414, 481, 527, 606, 660, 665, 722,
-   781, 803, 809, 538, 553, 588, 642, 758, 811, 701, 233, 299, 573, 612, 487, 540,
-   714, 779, 232, 267, 412, 445, 457, 585, 594, 766, 167, 613, 149, 148, 560, 589,
-   648, 768, 708, 345, 411, 704, 105, 259, 313, 496, 518, 174, 542, 120, 307, 101,
-   430, 372, 584, 183, 228, 529, 650, 697, 424, 732, 428, 349, 632, 355, 517, 110,
-   135, 147, 403, 580, 624, 700, 750, 170, 193, 245, 297, 374, 463, 543, 763, 801,
-   812, 815, 162, 384, 420, 730, 287, 330, 337, 366, 459, 476, 509, 558, 591, 610,
-   726, 652, 734, 759, 154, 163, 198, 473, 683, 697, 292, 311, 353, 423, 572, 494,
-   113, 217, 259, 280, 314, 499, 506, 603, 608, 752, 778, 782, 788, 117, 557, 748,
-   774, 320, 109, 126, 260, 265, 373, 411, 479, 523, 655, 737, 823, 380, 765, 161,
-   395, 398, 438, 451, 502, 516, 537, 583, 791, 136, 340, 769, 122, 273, 446, 727,
-   305, 322, 400, 496, 771, 155, 190, 269, 377, 391, 406, 432, 501, 519, 599, 684,
-   687, 749, 776, 175, 452, 191, 480, 510, 659, 772, 805, 813, 397, 444, 619, 566,
-   568, 575, 491, 471, 707, 111, 636, 156, 153, 288, 346, 578, 256, 435, 383, 729,
-   680, 767, 694, 295, 128, 210,   0,   0, 227,   0, 379,   0,   0, 150, 493, 525,
-   544, 551, 552, 556, 783, 576, 604,   0, 661,   0, 703,   0,   0, 735, 743,   0,
-     0,   0, 793, 794, 795, 808, 741, 773, 118, 127, 130, 166, 169, 177, 207, 213,
-   215, 226, 229, 268, 270, 317, 327, 329, 335, 369, 375, 381, 404, 441, 448, 458,
-   477, 484, 503, 539, 545, 547, 546, 548, 549, 550, 554, 555, 561, 564, 569, 591,
-   593, 595, 598, 607, 620, 625, 625, 651, 690, 695, 705, 706, 716, 717, 733, 735,
-   777, 786, 790, 315, 869, 623,   0,   0, 102, 145, 134, 115, 129, 138, 165, 171,
-   207, 202, 206, 212, 227, 231, 240, 243, 250, 254, 294, 296, 303, 308, 319, 325,
-   321, 329, 326, 335, 341, 357, 360, 362, 370, 379, 388, 389, 393, 421, 424, 438,
-   456, 454, 458, 465, 477, 535, 485, 490, 493, 507, 512, 514, 521, 522, 525, 526,
-   528, 533, 532, 541, 565, 569, 574, 586, 591, 597, 607, 637, 647, 674, 691, 693,
-   695, 698, 703, 699, 705, 704, 702, 706, 709, 717, 728, 736, 747, 754, 770, 777,
-   783, 784, 786, 787, 790, 802, 825, 848, 847, 857,  55,  65,  66, 883, 892, 916,
-   822, 824,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1586,   0,1605,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1602,1603,1934,1935,1574,1575,1576,1577,1579,1580,1581,1583,1584,   0,
-  1585,1587,1588,1589,1591,   0,1592,   0,1593,1594,   0,1595,1596,   0,1598,1599,
-  1600,1601,1604,1582,1578,1590,1597,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1936,   0,1937,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1938,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,1939,1940,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1941,1942,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1944,1943,   0,1945,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1946,1947,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1948,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,1949,1950,1951,1952,1953,1954,1955,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1956,1957,1958,1960,1959,1961,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0, 106, 104, 107, 826, 114, 118, 119, 121,
-   123, 124, 127, 125,  34, 830, 130, 131, 132, 137, 827,  35, 133, 139, 829, 142,
-   143, 112, 144, 145, 924, 151, 152,  37, 157, 158, 159, 160,  38, 165, 166, 169,
-   171, 172, 173, 174, 176, 177, 178, 179, 181, 182, 182, 182, 833, 468, 184, 185,
-   834, 187, 188, 189, 196, 192, 194, 195, 197, 199, 200, 201, 203, 204, 204, 206,
-   208, 209, 211, 218, 213, 219, 214, 216, 153, 234, 221, 222, 223, 220, 225, 224,
-   230, 835, 235, 236, 237, 238, 239, 244, 836, 837, 247, 248, 249, 246, 251,  39,
-    40, 253, 255, 255, 838, 257, 258, 259, 261, 839, 262, 263, 301, 264,  41, 266,
-   270, 272, 271, 841, 274, 842, 277, 276, 278, 281, 282,  42, 283, 284, 285, 286,
-    43, 843,  44, 289, 290, 291, 293, 934, 298, 845, 845, 621, 300, 300,  45, 852,
-   894, 302, 304,  46, 306, 309, 310, 312, 316,  48,  47, 317, 846, 318, 323, 324,
-   325, 324, 328, 329, 333, 331, 332, 334, 335, 336, 338, 339, 342, 343, 347, 351,
-   849, 350, 348, 352, 354, 359, 850, 361, 358, 356,  49, 363, 365, 367, 364,  50,
-   369, 371, 851, 376, 386, 378,  53, 381,  52,  51, 140, 141, 387, 382, 614,  78,
-   388, 389, 390, 394, 392, 856,  54, 399, 396, 402, 404, 858, 405, 401, 407,  55,
-   408, 409, 410, 413, 859, 415,  56, 417, 860, 418,  57, 419, 422, 424, 425, 861,
-   840, 862, 426, 863, 429, 431, 427, 433, 437, 441, 438, 439, 442, 443, 864, 436,
-   449, 450,  58, 454, 453, 865, 447, 460, 866, 867, 461, 466, 465, 464,  59, 467,
-   470, 469, 472, 828, 475, 868, 478, 870, 483, 485, 486, 871, 488, 489, 872, 873,
-   495, 497,  60, 498,  61,  61, 504, 505, 507, 508, 511,  62, 513, 874, 515, 875,
-   518, 844, 520, 876, 877, 878,  63,  64, 528, 880, 879, 881, 882, 530, 531, 531,
-   533,  66, 534,  67,  68, 884, 536, 538, 541,  69, 885, 549, 886, 887, 556, 559,
-    70, 561, 562, 563, 888, 889, 889, 567,  71, 890, 570, 571,  72, 891, 577,  73,
-   581, 579, 582, 893, 587,  74, 590, 592, 596,  75, 895, 896,  76, 897, 600, 898,
-   602, 605, 607, 899, 900, 609, 901, 611, 853,  77, 615, 616,  79, 617, 252, 902,
-   903, 854, 855, 621, 622, 731,  80, 627, 626, 628, 164, 629, 630, 631, 633, 904,
-   632, 634, 639, 640, 635, 641, 646, 651, 638, 643, 644, 645, 905, 907, 906,  81,
-   653, 654, 656, 911, 657, 908,  82,  83, 909, 910,  84, 664, 665, 666, 667, 669,
-   668, 671, 670, 674, 672, 673, 675,  85, 677, 678,  86, 681, 682, 912, 685, 686,
-    87, 689,  36, 913, 914,  88,  89, 696, 702, 709, 711, 915, 712, 713, 718, 719,
-   917, 831, 721, 720, 723, 832, 725, 728, 918, 919, 739, 742, 744, 920, 745, 753,
-   756, 757, 755, 760, 761, 921, 762,  90, 764, 922,  91, 775, 279, 780, 923, 925,
-    92,  93, 785, 926,  94, 927, 787, 787, 789, 928, 792,  95, 796, 797, 798, 800,
-    96, 929, 802, 804, 806,  97,  98, 807, 930,  99, 931, 932, 933, 814, 100, 816,
-   817, 818, 819, 820, 821, 935,   0,   0,
+     0,   0,  20,   0,   0,   0,   2,   6,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1834,1835,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1836,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1837,1839,1838,   0,   0,   0,   0,
+  1840,   0,   0,   0,   0,1841,   0,   0,1842,   0,   0,   0,   0,   0,   0,   0,
+  1843,   0,1844,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1845,   0,   0,
+  1846,   0,   0,1847,   0,1848,   0,   0,   0,   0,   0,   0, 937,   0,1850,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1849, 936, 938,1851,1852,   0,   0,
+  1853,1854,   0,   0,1855,1856,   0,   0,   0,   0,   0,   0,1857,1858,   0,   0,
+  1861,1862,   0,   0,1863,1864,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1867,1868,1869,1870,1859,1860,1865,1866,
+     0,   0,   0,   0,   0,   0,1871,1872,1873,1874,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,  32,  33,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1875,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1877,   0,1878,   0,1879,   0,1880,   0,
+  1881,   0,1882,   0,1883,   0,1884,   0,1885,   0,1886,   0,1887,   0,1888,   0,
+     0,1889,   0,1890,   0,1891,   0,   0,   0,   0,   0,   0,1892,1893,   0,1894,
+  1895,   0,1896,1897,   0,1898,1899,   0,1900,1901,   0,   0,   0,   0,   0,   0,
+  1876,   0,   0,   0,   0,   0,   0,   0,   0,   0,1902,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1904,   0,1905,   0,1906,   0,1907,   0,
+  1908,   0,1909,   0,1910,   0,1911,   0,1912,   0,1913,   0,1914,   0,1915,   0,
+     0,1916,   0,1917,   0,1918,   0,   0,   0,   0,   0,   0,1919,1920,   0,1921,
+  1922,   0,1923,1924,   0,1925,1926,   0,1927,1928,   0,   0,   0,   0,   0,   0,
+  1903,   0,   0,1929,1930,1931,1932,   0,   0,   0,1933,   0, 710, 385, 724, 715,
+   455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601, 663, 676, 688, 738,
+   411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662, 810, 275, 462, 658,
+   692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168, 368, 414, 481, 527,
+   606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758, 811, 701, 233, 299,
+   573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585, 594, 766, 167, 613,
+   149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259, 313, 496, 518, 174,
+   542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697, 424, 732, 428, 349,
+   632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170, 193, 245, 297, 374,
+   463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330, 337, 366, 459, 476,
+   509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473, 683, 697, 292, 311,
+   353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603, 608, 752, 778, 782,
+   788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411, 479, 523, 655, 737,
+   823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583, 791, 136, 340, 769,
+   122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269, 377, 391, 406, 432,
+   501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510, 659, 772, 805, 813,
+   397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156, 153, 288, 346, 578,
+   256, 435, 383, 729, 680, 767, 694, 295, 128, 210,   0,   0, 227,   0, 379,   0,
+     0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604,   0, 661,   0, 703,   0,
+     0, 735, 743,   0,   0,   0, 793, 794, 795, 808, 741, 773, 118, 127, 130, 166,
+   169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329, 335, 369, 375, 381,
+   404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548, 549, 550, 554, 555,
+   561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651, 690, 695, 705, 706,
+   716, 717, 733, 735, 777, 786, 790, 315, 869, 623,   0,   0, 102, 145, 134, 115,
+   129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243, 250, 254, 294, 296,
+   303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362, 370, 379, 388, 389,
+   393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490, 493, 507, 512, 514,
+   521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586, 591, 597, 607, 637,
+   647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706, 709, 717, 728, 736,
+   747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848, 847, 857,  55,  65,
+    66, 883, 892, 916, 822, 824,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1586,   0,1605,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1602,1603,1934,1935,1574,1575,1576,1577,1579,1580,
+  1581,1583,1584,   0,1585,1587,1588,1589,1591,   0,1592,   0,1593,1594,   0,1595,
+  1596,   0,1598,1599,1600,1601,1604,1582,1578,1590,1597,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1936,   0,1937,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,1938,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1939,1940,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,1941,1942,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,1944,1943,   0,1945,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1946,1947,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,1948,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1949,1950,1951,1952,1953,1954,
+  1955,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,1956,1957,1958,1960,1959,1961,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 106, 104, 107, 826,
+   114, 118, 119, 121, 123, 124, 127, 125,  34, 830, 130, 131, 132, 137, 827,  35,
+   133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152,  37, 157, 158, 159, 160,
+    38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179, 181, 182, 182, 182,
+   833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195, 197, 199, 200, 201,
+   203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216, 153, 234, 221, 222,
+   223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244, 836, 837, 247, 248,
+   249, 246, 251,  39,  40, 253, 255, 255, 838, 257, 258, 259, 261, 839, 262, 263,
+   301, 264,  41, 266, 270, 272, 271, 841, 274, 842, 277, 276, 278, 281, 282,  42,
+   283, 284, 285, 286,  43, 843,  44, 289, 290, 291, 293, 934, 298, 845, 845, 621,
+   300, 300,  45, 852, 894, 302, 304,  46, 306, 309, 310, 312, 316,  48,  47, 317,
+   846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334, 335, 336, 338, 339,
+   342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361, 358, 356,  49, 363,
+   365, 367, 364,  50, 369, 371, 851, 376, 386, 378,  53, 381,  52,  51, 140, 141,
+   387, 382, 614,  78, 388, 389, 390, 394, 392, 856,  54, 399, 396, 402, 404, 858,
+   405, 401, 407,  55, 408, 409, 410, 413, 859, 415,  56, 417, 860, 418,  57, 419,
+   422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433, 437, 441, 438, 439,
+   442, 443, 864, 436, 449, 450,  58, 454, 453, 865, 447, 460, 866, 867, 461, 466,
+   465, 464,  59, 467, 470, 469, 472, 828, 475, 868, 478, 870, 483, 485, 486, 871,
+   488, 489, 872, 873, 495, 497,  60, 498,  61,  61, 504, 505, 507, 508, 511,  62,
+   513, 874, 515, 875, 518, 844, 520, 876, 877, 878,  63,  64, 528, 880, 879, 881,
+   882, 530, 531, 531, 533,  66, 534,  67,  68, 884, 536, 538, 541,  69, 885, 549,
+   886, 887, 556, 559,  70, 561, 562, 563, 888, 889, 889, 567,  71, 890, 570, 571,
+    72, 891, 577,  73, 581, 579, 582, 893, 587,  74, 590, 592, 596,  75, 895, 896,
+    76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611, 853,  77, 615, 616,
+    79, 617, 252, 902, 903, 854, 855, 621, 622, 731,  80, 627, 626, 628, 164, 629,
+   630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651, 638, 643, 644, 645,
+   905, 907, 906,  81, 653, 654, 656, 911, 657, 908,  82,  83, 909, 910,  84, 664,
+   665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675,  85, 677, 678,  86, 681,
+   682, 912, 685, 686,  87, 689,  36, 913, 914,  88,  89, 696, 702, 709, 711, 915,
+   712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728, 918, 919, 739, 742,
+   744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762,  90, 764, 922,  91, 775,
+   279, 780, 923, 925,  92,  93, 785, 926,  94, 927, 787, 787, 789, 928, 792,  95,
+   796, 797, 798, 800,  96, 929, 802, 804, 806,  97,  98, 807, 930,  99, 931, 932,
+   933, 814, 100, 816, 817, 818, 819, 820, 821, 935,   0,   0,
 };
 static const int16_t
 _hb_ucd_i16[92] =
@@ -4400,12 +4403,12 @@ _hb_ucd_i16[92] =
 static inline uint_fast8_t
 _hb_ucd_gc (unsigned u)
 {
-  return u<1114110u?_hb_ucd_u8[6800+(((_hb_ucd_u8[1312+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
+  return u<1114110u?_hb_ucd_u8[6808+(((_hb_ucd_u8[1312+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
 }
 static inline uint_fast8_t
 _hb_ucd_ccc (unsigned u)
 {
-  return u<125259u?_hb_ucd_u8[8792+(((_hb_ucd_u8[8236+(((_hb_ucd_u8[7776+(((_hb_ucd_u8[7424+(((_hb_ucd_u8[7178+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0;
+  return u<125259u?_hb_ucd_u8[8800+(((_hb_ucd_u8[8244+(((_hb_ucd_u8[7784+(((_hb_ucd_u8[7432+(((_hb_ucd_u8[7186+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0;
 }
 static inline unsigned
 _hb_ucd_b4 (const uint8_t* a, unsigned i)
@@ -4415,24 +4418,24 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i
 static inline int_fast16_t
 _hb_ucd_bmg (unsigned u)
 {
-  return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9684+(((_hb_ucd_u8[9452+(((_hb_ucd_u8[9356+(((_hb_ucd_b4(9292+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0;
+  return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9692+(((_hb_ucd_u8[9460+(((_hb_ucd_u8[9364+(((_hb_ucd_b4(9300+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0;
 }
 static inline uint_fast8_t
 _hb_ucd_sc (unsigned u)
 {
-  return u<918000u?_hb_ucd_u8[11118+(((_hb_ucd_u16[4024+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10382+(((_hb_ucd_u8[9932+(u>>2>>2>>3>>4)])<<4)+((u>>2>>2>>3)&15u))])<<3)+((u>>2>>2)&7u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2;
+  return u<918000u?_hb_ucd_u8[11126+(((_hb_ucd_u16[4040+(((_hb_ucd_u16[2048+(((_hb_ucd_u8[10390+(((_hb_ucd_u8[9940+(u>>2>>2>>3>>4)])<<4)+((u>>2>>2>>3)&15u))])<<3)+((u>>2>>2)&7u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2;
 }
 static inline uint_fast16_t
 _hb_ucd_dm (unsigned u)
 {
-  return u<195102u?_hb_ucd_u16[6728+(((_hb_ucd_u8[13944+(((_hb_ucd_u8[13562+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
+  return u<195102u?_hb_ucd_u16[6748+(((_hb_ucd_u8[13952+(((_hb_ucd_u8[13570+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
 }
 
 
 #else
 
 static const uint8_t
-_hb_ucd_u8[13370] =
+_hb_ucd_u8[13386] =
 {
     0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
     7,  7,  7,  7,  9, 10,  7,  7,  7,  7,  7, 11, 12, 12, 12, 13,
@@ -4440,7 +4443,7 @@ _hb_ucd_u8[13370] =
     7, 24, 21, 21, 21, 25, 26, 27, 21, 28, 29, 30, 31, 32, 33, 34,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 35, 21, 36,
-    7,  7,  7,  7, 35, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+    7,  7,  7,  7, 37, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
@@ -4462,7 +4465,7 @@ _hb_ucd_u8[13370] =
    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   37, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   38, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
@@ -4503,8 +4506,9 @@ _hb_ucd_u8[13370] =
    34,192,193,111,111,111,111,111,130,194,195,111, 34,196,111,111,
    67, 67,197, 67, 67,111, 67,198, 67, 67, 67, 67, 67, 67, 67, 67,
    67, 67, 67, 67, 67, 67, 67,199,111,111,111,111,111,111,111,111,
-   34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,
    34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111,111,
+   34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,
   200,111,188,188,111,111,111,111,111,111,111,111,111,111,111,111,
     0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  2,  4,  5,  6,  2,
     7,  7,  7,  7,  7,  2,  8,  9, 10, 11, 11, 11, 11, 11, 11, 11,
@@ -4967,7 +4971,7 @@ _hb_ucd_u8[13370] =
    31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 65, 66, 67, 31, 31,
    31, 31, 68, 31, 31, 31, 31, 31, 31, 31, 31, 69, 70, 71, 17, 17,
    72, 73, 31, 74, 75, 76, 77, 78, 79, 31, 80, 81, 17, 82, 17, 17,
-   17, 17, 31, 31, 23, 23, 23, 23, 23, 23, 31, 31, 31, 31, 31, 31,
+   17, 17, 31, 31, 23, 23, 23, 23, 23, 23, 23, 83, 31, 31, 31, 31,
    23, 83, 31, 31, 23, 23, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
    31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
    31, 31, 31, 31, 84,  0,  0,  1,  0,  1,  2,  3,  0,  1,  2,  3,
@@ -5597,12 +5601,12 @@ _hb_ucd_i16[92] =
 static inline uint_fast8_t
 _hb_ucd_gc (unsigned u)
 {
-  return u<1114112u?_hb_ucd_u8[5080+(((_hb_ucd_u8[1152+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
+  return u<1114112u?_hb_ucd_u8[5096+(((_hb_ucd_u8[1168+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
 }
 static inline uint_fast8_t
 _hb_ucd_ccc (unsigned u)
 {
-  return u<125259u?_hb_ucd_u8[7038+(((_hb_ucd_u8[6482+(((_hb_ucd_u8[6022+(((_hb_ucd_u8[5670+(((_hb_ucd_u8[5424+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0;
+  return u<125259u?_hb_ucd_u8[7054+(((_hb_ucd_u8[6498+(((_hb_ucd_u8[6038+(((_hb_ucd_u8[5686+(((_hb_ucd_u8[5440+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0;
 }
 static inline unsigned
 _hb_ucd_b4 (const uint8_t* a, unsigned i)
@@ -5612,17 +5616,17 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i
 static inline int_fast16_t
 _hb_ucd_bmg (unsigned u)
 {
-  return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[7930+(((_hb_ucd_u8[7698+(((_hb_ucd_u8[7602+(((_hb_ucd_b4(7538+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0;
+  return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[7946+(((_hb_ucd_u8[7714+(((_hb_ucd_u8[7618+(((_hb_ucd_b4(7554+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0;
 }
 static inline uint_fast8_t
 _hb_ucd_sc (unsigned u)
 {
-  return u<918016u?_hb_ucd_u8[11228+(((_hb_ucd_u8[10264+(((_hb_ucd_u8[9276+(((_hb_ucd_u8[8596+(((_hb_ucd_u8[8292+(((_hb_ucd_u8[8178+(u>>2>>2>>2>>3>>4)])<<4)+((u>>2>>2>>2>>3)&15u))])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2;
+  return u<918016u?_hb_ucd_u8[11244+(((_hb_ucd_u8[10280+(((_hb_ucd_u8[9292+(((_hb_ucd_u8[8612+(((_hb_ucd_u8[8308+(((_hb_ucd_u8[8194+(u>>2>>2>>2>>3>>4)])<<4)+((u>>2>>2>>2>>3)&15u))])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2;
 }
 static inline uint_fast16_t
 _hb_ucd_dm (unsigned u)
 {
-  return u<195102u?_hb_ucd_u16[1608+(((_hb_ucd_u8[12570+(((_hb_ucd_u8[12188+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
+  return u<195102u?_hb_ucd_u16[1608+(((_hb_ucd_u8[12586+(((_hb_ucd_u8[12204+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
 }
 
 #endif
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-unicode-emoji-table.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-unicode-emoji-table.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-unicode-emoji-table.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-unicode-emoji-table.hh	2024-11-20 13:56:33.000000000 +0000
@@ -7,13 +7,13 @@
  * on file with this header:
  *
  * # emoji-data.txt
- * # Date: 2022-08-02, 00:26:10 GMT
- * # © 2022 Unicode®, Inc.
+ * # Date: 2023-02-01, 02:22:54 GMT
+ * # © 2023 Unicode®, Inc.
  * # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
  * # For terms of use, see https://www.unicode.org/terms_of_use.html
  * #
  * # Emoji Data for UTS #51
- * # Used with Emoji Version 15.0 and subsequent minor revisions (if any)
+ * # Used with Emoji Version 15.1 and subsequent minor revisions (if any)
  * #
  * # For documentation and usage, see https://www.unicode.org/reports/tr51
  */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-uniscribe.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-uniscribe.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-uniscribe.cc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-uniscribe.cc	2024-11-20 13:56:33.000000000 +0000
@@ -699,7 +699,7 @@ retry:
 				     script_tags,
 				     &item_count);
   if (unlikely (FAILED (hr)))
-    FAIL ("ScriptItemizeOpenType() failed: 0x%08lx", hr);
+    FAIL ("ScriptItemizeOpenType() failed: 0x%08lx", (unsigned long) hr);
 
 #undef MAX_ITEMS
 
@@ -785,7 +785,7 @@ retry:
     }
     if (unlikely (FAILED (hr)))
     {
-      FAIL ("ScriptShapeOpenType() failed: 0x%08lx", hr);
+      FAIL ("ScriptShapeOpenType() failed: 0x%08lx", (unsigned long) hr);
     }
 
     for (unsigned int j = chars_offset; j < chars_offset + item_chars_len; j++)
@@ -811,7 +811,7 @@ retry:
 				     offsets + glyphs_offset,
 				     nullptr);
     if (unlikely (FAILED (hr)))
-      FAIL ("ScriptPlaceOpenType() failed: 0x%08lx", hr);
+      FAIL ("ScriptPlaceOpenType() failed: 0x%08lx", (unsigned long) hr);
 
     if (DEBUG_ENABLED (UNISCRIBE))
       fprintf (stderr, "Item %d RTL %d LayoutRTL %d LogicalOrder %d ScriptTag %c%c%c%c\n",
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-vector.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-vector.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-vector.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-vector.hh	2024-11-20 13:56:33.000000000 +0000
@@ -37,6 +37,8 @@ template <typename Type,
 	  bool sorted=false>
 struct hb_vector_t
 {
+  static constexpr bool realloc_move = true;
+
   typedef Type item_t;
   static constexpr unsigned item_size = hb_static_size (Type);
   using array_t = typename std::conditional<sorted, hb_sorted_array_t<Type>, hb_array_t<Type>>::type;
@@ -54,7 +56,7 @@ struct hb_vector_t
   hb_vector_t (const Iterable &o) : hb_vector_t ()
   {
     auto iter = hb_iter (o);
-    if (iter.is_random_access_iterator)
+    if (iter.is_random_access_iterator || iter.has_fast_len)
       alloc (hb_len (iter), true);
     hb_copy (iter, *this);
   }
@@ -62,9 +64,21 @@ struct hb_vector_t
   {
     alloc (o.length, true);
     if (unlikely (in_error ())) return;
-    copy_vector (o);
+    copy_array (o.as_array ());
+  }
+  hb_vector_t (array_t o) : hb_vector_t ()
+  {
+    alloc (o.length, true);
+    if (unlikely (in_error ())) return;
+    copy_array (o);
   }
-  hb_vector_t (hb_vector_t &&o)
+  hb_vector_t (c_array_t o) : hb_vector_t ()
+  {
+    alloc (o.length, true);
+    if (unlikely (in_error ())) return;
+    copy_array (o);
+  }
+  hb_vector_t (hb_vector_t &&o) noexcept
   {
     allocated = o.allocated;
     length = o.length;
@@ -74,7 +88,7 @@ struct hb_vector_t
   ~hb_vector_t () { fini (); }
 
   public:
-  int allocated = 0; /* == -1 means allocation failed. */
+  int allocated = 0; /* < 0 means allocation failed. */
   unsigned int length = 0;
   public:
   Type *arrayZ = nullptr;
@@ -90,23 +104,25 @@ struct hb_vector_t
 
   void fini ()
   {
-    shrink_vector (0);
-    hb_free (arrayZ);
+    /* We allow a hack to make the vector point to a foreign array
+     * by the user. In that case length/arrayZ are non-zero but
+     * allocated is zero. Don't free anything. */
+    if (allocated)
+    {
+      shrink_vector (0);
+      hb_free (arrayZ);
+    }
     init ();
   }
 
   void reset ()
   {
     if (unlikely (in_error ()))
-      /* Big Hack! We don't know the true allocated size before
-       * an allocation failure happened. But we know it was at
-       * least as big as length. Restore it to that and continue
-       * as if error did not happen. */
-      allocated = length;
+      reset_error ();
     resize (0);
   }
 
-  friend void swap (hb_vector_t& a, hb_vector_t& b)
+  friend void swap (hb_vector_t& a, hb_vector_t& b) noexcept
   {
     hb_swap (a.allocated, b.allocated);
     hb_swap (a.length, b.length);
@@ -119,11 +135,11 @@ struct hb_vector_t
     alloc (o.length, true);
     if (unlikely (in_error ())) return *this;
 
-    copy_vector (o);
+    copy_array (o.as_array ());
 
     return *this;
   }
-  hb_vector_t& operator = (hb_vector_t &&o)
+  hb_vector_t& operator = (hb_vector_t &&o) noexcept
   {
     hb_swap (*this, o);
     return *this;
@@ -191,47 +207,38 @@ struct hb_vector_t
   Type *push ()
   {
     if (unlikely (!resize (length + 1)))
-      return &Crap (Type);
+      return std::addressof (Crap (Type));
     return std::addressof (arrayZ[length - 1]);
   }
-  template <typename T,
-	    typename T2 = Type,
-	    hb_enable_if (!std::is_copy_constructible<T2>::value &&
-			  std::is_copy_assignable<T>::value)>
-  Type *push (T&& v)
-  {
-    Type *p = push ();
-    if (p == &Crap (Type))
-      // If push failed to allocate then don't copy v, since this may cause
-      // the created copy to leak memory since we won't have stored a
-      // reference to it.
-      return p;
-    *p = std::forward<T> (v);
-    return p;
-  }
-  template <typename T,
-	    typename T2 = Type,
-	    hb_enable_if (std::is_copy_constructible<T2>::value)>
-  Type *push (T&& v)
+  template <typename... Args> Type *push (Args&&... args)
   {
-    if (unlikely (!alloc (length + 1)))
+    if (unlikely ((int) length >= allocated && !alloc (length + 1)))
       // If push failed to allocate then don't copy v, since this may cause
       // the created copy to leak memory since we won't have stored a
       // reference to it.
-      return &Crap (Type);
+      return std::addressof (Crap (Type));
 
     /* Emplace. */
-    length++;
-    Type *p = std::addressof (arrayZ[length - 1]);
-    return new (p) Type (std::forward<T> (v));
+    Type *p = std::addressof (arrayZ[length++]);
+    return new (p) Type (std::forward<Args> (args)...);
   }
 
   bool in_error () const { return allocated < 0; }
+  void set_error ()
+  {
+    assert (allocated >= 0);
+    allocated = -allocated - 1;
+  }
+  void reset_error ()
+  {
+    assert (allocated < 0);
+    allocated = -(allocated + 1);
+  }
 
   template <typename T = Type,
 	    hb_enable_if (hb_is_trivially_copy_assignable(T))>
   Type *
-  realloc_vector (unsigned new_allocated)
+  realloc_vector (unsigned new_allocated, hb_priority<0>)
   {
     if (!new_allocated)
     {
@@ -243,7 +250,7 @@ struct hb_vector_t
   template <typename T = Type,
 	    hb_enable_if (!hb_is_trivially_copy_assignable(T))>
   Type *
-  realloc_vector (unsigned new_allocated)
+  realloc_vector (unsigned new_allocated, hb_priority<0>)
   {
     if (!new_allocated)
     {
@@ -263,47 +270,65 @@ struct hb_vector_t
     }
     return new_array;
   }
+  /* Specialization for types that can be moved using realloc(). */
+  template <typename T = Type,
+	    hb_enable_if (T::realloc_move)>
+  Type *
+  realloc_vector (unsigned new_allocated, hb_priority<1>)
+  {
+    if (!new_allocated)
+    {
+      hb_free (arrayZ);
+      return nullptr;
+    }
+    return (Type *) hb_realloc (arrayZ, new_allocated * sizeof (Type));
+  }
 
   template <typename T = Type,
 	    hb_enable_if (hb_is_trivially_constructible(T))>
   void
-  grow_vector (unsigned size)
+  grow_vector (unsigned size, hb_priority<0>)
   {
-    memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ));
+    hb_memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ));
     length = size;
   }
   template <typename T = Type,
 	    hb_enable_if (!hb_is_trivially_constructible(T))>
   void
-  grow_vector (unsigned size)
+  grow_vector (unsigned size, hb_priority<0>)
   {
-    while (length < size)
-    {
-      length++;
-      new (std::addressof (arrayZ[length - 1])) Type ();
-    }
+    for (; length < size; length++)
+      new (std::addressof (arrayZ[length])) Type ();
+  }
+  /* Specialization for hb_vector_t<hb_{vector,array}_t<U>> to speed up. */
+  template <typename T = Type,
+	    hb_enable_if (hb_is_same (T, hb_vector_t<typename T::item_t>) ||
+			  hb_is_same (T, hb_array_t <typename T::item_t>))>
+  void
+  grow_vector (unsigned size, hb_priority<1>)
+  {
+    hb_memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ));
+    length = size;
   }
 
   template <typename T = Type,
 	    hb_enable_if (hb_is_trivially_copyable (T))>
   void
-  copy_vector (const hb_vector_t &other)
+  copy_array (hb_array_t<const Type> other)
   {
     length = other.length;
-#ifndef HB_OPTIMIZE_SIZE
-    if (sizeof (T) >= sizeof (long long))
+    if (!HB_OPTIMIZE_SIZE_VAL && sizeof (T) >= sizeof (long long))
       /* This runs faster because of alignment. */
       for (unsigned i = 0; i < length; i++)
 	arrayZ[i] = other.arrayZ[i];
     else
-#endif
        hb_memcpy ((void *) arrayZ, (const void *) other.arrayZ, length * item_size);
   }
   template <typename T = Type,
 	    hb_enable_if (!hb_is_trivially_copyable (T) &&
 			   std::is_copy_constructible<T>::value)>
   void
-  copy_vector (const hb_vector_t &other)
+  copy_array (hb_array_t<const Type> other)
   {
     length = 0;
     while (length < other.length)
@@ -318,7 +343,7 @@ struct hb_vector_t
 			  std::is_default_constructible<T>::value &&
 			  std::is_copy_assignable<T>::value)>
   void
-  copy_vector (const hb_vector_t &other)
+  copy_array (hb_array_t<const Type> other)
   {
     length = 0;
     while (length < other.length)
@@ -332,11 +357,15 @@ struct hb_vector_t
   void
   shrink_vector (unsigned size)
   {
-    while ((unsigned) length > size)
+    assert (size <= length);
+    if (!std::is_trivially_destructible<Type>::value)
     {
-      arrayZ[(unsigned) length - 1].~Type ();
-      length--;
+      unsigned count = length - size;
+      Type *p = arrayZ + length - 1;
+      while (count--)
+        p--->~Type ();
     }
+    length = size;
   }
 
   void
@@ -383,18 +412,18 @@ struct hb_vector_t
 
     if (unlikely (overflows))
     {
-      allocated = -1;
+      set_error ();
       return false;
     }
 
-    Type *new_array = realloc_vector (new_allocated);
+    Type *new_array = realloc_vector (new_allocated, hb_prioritize);
 
     if (unlikely (new_allocated && !new_array))
     {
       if (new_allocated <= (unsigned) allocated)
         return true; // shrinking failed; it's okay; happens in our fuzzer
 
-      allocated = -1;
+      set_error ();
       return false;
     }
 
@@ -413,7 +442,7 @@ struct hb_vector_t
     if (size > length)
     {
       if (initialize)
-	grow_vector (size);
+	grow_vector (size, hb_prioritize);
     }
     else if (size < length)
     {
@@ -432,7 +461,7 @@ struct hb_vector_t
   Type pop ()
   {
     if (!length) return Null (Type);
-    Type v {std::move (arrayZ[length - 1])};
+    Type v (std::move (arrayZ[length - 1]));
     arrayZ[length - 1].~Type ();
     length--;
     return v;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-version.h 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-version.h
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-version.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-version.h	2024-11-20 13:56:33.000000000 +0000
@@ -41,13 +41,13 @@ HB_BEGIN_DECLS
  *
  * The major component of the library version available at compile-time.
  */
-#define HB_VERSION_MAJOR 7
+#define HB_VERSION_MAJOR 8
 /**
  * HB_VERSION_MINOR:
  *
  * The minor component of the library version available at compile-time.
  */
-#define HB_VERSION_MINOR 2
+#define HB_VERSION_MINOR 4
 /**
  * HB_VERSION_MICRO:
  *
@@ -60,7 +60,7 @@ HB_BEGIN_DECLS
  *
  * A string literal containing the library version available at compile-time.
  */
-#define HB_VERSION_STRING "7.2.0"
+#define HB_VERSION_STRING "8.4.0"
 
 /**
  * HB_VERSION_ATLEAST:
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-blob.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-blob.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-blob.hh	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-blob.hh	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,50 @@
+/*
+ * Copyright © 2023  Behdad Esfahbod
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_WASM_API_BLOB_HH
+#define HB_WASM_API_BLOB_HH
+
+#include "hb-wasm-api.hh"
+
+namespace hb {
+namespace wasm {
+
+
+HB_WASM_API (void, blob_free) (HB_WASM_EXEC_ENV
+			       ptr_d(blob_t, blob))
+{
+  HB_PTR_PARAM (blob_t, blob);
+  if (unlikely (!blob))
+    return;
+
+  module_free (blob->data);
+
+  blob->data = nullref;
+  blob->length = 0;
+}
+
+
+}}
+
+#endif /* HB_WASM_API_BLOB_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-buffer.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-buffer.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-buffer.hh	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-buffer.hh	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,217 @@
+/*
+ * Copyright © 2023  Behdad Esfahbod
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_WASM_API_BUFFER_HH
+#define HB_WASM_API_BUFFER_HH
+
+#include "hb-wasm-api.hh"
+
+#include "hb-buffer.hh"
+
+namespace hb {
+namespace wasm {
+
+static_assert (sizeof (glyph_info_t) == sizeof (hb_glyph_info_t), "");
+static_assert (sizeof (glyph_position_t) == sizeof (hb_glyph_position_t), "");
+
+HB_WASM_API (bool_t, buffer_contents_realloc) (HB_WASM_EXEC_ENV
+					       ptr_d(buffer_contents_t, contents),
+					       uint32_t size)
+{
+  HB_PTR_PARAM (buffer_contents_t, contents);
+  if (unlikely (!contents))
+    return false;
+
+  if (size <= contents->length)
+    return true;
+
+  unsigned bytes;
+  if (hb_unsigned_mul_overflows (size, sizeof (glyph_info_t), &bytes))
+    return false;
+
+  glyph_info_t *info = HB_ARRAY_APP2NATIVE (glyph_info_t, contents->info, contents->length);
+  glyph_position_t *pos = HB_ARRAY_APP2NATIVE (glyph_position_t, contents->pos, contents->length);
+
+  if (unlikely (!info || !pos))
+    return false;
+
+  glyph_info_t *new_info = nullptr;
+  uint32_t new_inforef = module_malloc (bytes, (void **) &new_info);
+  glyph_position_t *new_pos = nullptr;
+  uint32_t new_posref = module_malloc (bytes, (void **) &new_pos);
+
+  unsigned old_bytes = contents->length * sizeof (glyph_info_t);
+  if (likely (new_inforef))
+  {
+    hb_memcpy (new_info, info, old_bytes);
+    module_free (contents->info);
+    contents->info = new_inforef;
+  }
+  if (likely (new_posref))
+  {
+    hb_memcpy (new_pos, pos, old_bytes);
+    module_free (contents->pos);
+    contents->pos = new_posref;
+  }
+
+  if (likely (new_info && new_pos))
+  {
+    contents->length = size;
+    return true;
+  }
+
+  return false;
+}
+
+HB_WASM_API (void, buffer_contents_free) (HB_WASM_EXEC_ENV
+					  ptr_d(buffer_contents_t, contents))
+{
+  HB_PTR_PARAM (buffer_contents_t, contents);
+  if (unlikely (!contents))
+    return;
+
+  module_free (contents->info);
+  module_free (contents->pos);
+
+  contents->info = nullref;
+  contents->pos = nullref;
+  contents->length = 0;
+}
+
+HB_WASM_API (bool_t, buffer_copy_contents) (HB_WASM_EXEC_ENV
+					    ptr_d(buffer_t, buffer),
+					    ptr_d(buffer_contents_t, contents))
+{
+  HB_REF2OBJ (buffer);
+  HB_PTR_PARAM (buffer_contents_t, contents);
+  if (unlikely (!contents))
+    return false;
+
+  if (buffer->have_output)
+    buffer->sync ();
+  if (!buffer->have_positions)
+    buffer->clear_positions ();
+
+  unsigned length = buffer->len;
+
+  if (length <= contents->length)
+  {
+    glyph_info_t *info = HB_ARRAY_APP2NATIVE (glyph_info_t, contents->info, length);
+    glyph_position_t *pos = HB_ARRAY_APP2NATIVE (glyph_position_t, contents->pos, length);
+
+    if (unlikely (!info || !pos))
+    {
+      contents->length = 0;
+      return false;
+    }
+
+    unsigned bytes = length * sizeof (hb_glyph_info_t);
+    hb_memcpy (info, buffer->info, bytes);
+    hb_memcpy (pos, buffer->pos, bytes);
+
+    return true;
+  }
+
+  module_free (contents->info);
+  module_free (contents->pos);
+
+  contents->length = length;
+  unsigned bytes = length * sizeof (hb_glyph_info_t);
+  contents->info = wasm_runtime_module_dup_data (module_inst, (const char *) buffer->info, bytes);
+  contents->pos = wasm_runtime_module_dup_data (module_inst, (const char *) buffer->pos, bytes);
+
+  if (length && (!contents->info || !contents->pos))
+  {
+    contents->length = 0;
+    return false;
+  }
+
+  return true;
+}
+
+HB_WASM_API (bool_t, buffer_set_contents) (HB_WASM_EXEC_ENV
+					   ptr_d(buffer_t, buffer),
+					   ptr_d(const buffer_contents_t, contents))
+{
+  HB_REF2OBJ (buffer);
+  HB_PTR_PARAM (buffer_contents_t, contents);
+  if (unlikely (!contents))
+    return false;
+
+  unsigned length = contents->length;
+  unsigned bytes;
+  if (unlikely (hb_unsigned_mul_overflows (length, sizeof (buffer->info[0]), &bytes)))
+    return false;
+
+  if (unlikely (!buffer->resize (length)))
+    return false;
+
+  glyph_info_t *info = (glyph_info_t *) (validate_app_addr (contents->info, bytes) ? addr_app_to_native (contents->info) : nullptr);
+  glyph_position_t *pos = (glyph_position_t *) (validate_app_addr (contents->pos, bytes) ? addr_app_to_native (contents->pos) : nullptr);
+
+  if (!buffer->have_positions)
+    buffer->clear_positions (); /* This is wasteful. */
+
+  hb_memcpy (buffer->info, info, bytes);
+  hb_memcpy (buffer->pos, pos, bytes);
+  buffer->len = length;
+
+  return true;
+}
+
+HB_WASM_API (direction_t, buffer_get_direction) (HB_WASM_EXEC_ENV
+						 ptr_d(buffer_t, buffer))
+{
+  HB_REF2OBJ (buffer);
+
+  return (direction_t) hb_buffer_get_direction (buffer);
+}
+
+HB_WASM_API (script_t, buffer_get_script) (HB_WASM_EXEC_ENV
+					   ptr_d(buffer_t, buffer))
+{
+  HB_REF2OBJ (buffer);
+
+  return hb_script_to_iso15924_tag (hb_buffer_get_script (buffer));
+}
+
+HB_WASM_API (void, buffer_reverse) (HB_WASM_EXEC_ENV
+				    ptr_d(buffer_t, buffer))
+{
+  HB_REF2OBJ (buffer);
+
+  hb_buffer_reverse (buffer);
+}
+
+HB_WASM_API (void, buffer_reverse_clusters) (HB_WASM_EXEC_ENV
+					     ptr_d(buffer_t, buffer))
+{
+  HB_REF2OBJ (buffer);
+
+  hb_buffer_reverse_clusters (buffer);
+}
+
+}}
+
+#endif /* HB_WASM_API_BUFFER_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-common.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-common.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-common.hh	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-common.hh	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,44 @@
+/*
+ * Copyright © 2023  Behdad Esfahbod
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_WASM_API_COMMON_HH
+#define HB_WASM_API_COMMON_HH
+
+#include "hb-wasm-api.hh"
+
+namespace hb {
+namespace wasm {
+
+
+HB_WASM_API (direction_t, script_get_horizontal_direction) (HB_WASM_EXEC_ENV
+							    script_t script)
+{
+  return (direction_t)
+	 hb_script_get_horizontal_direction (hb_script_from_iso15924_tag (script));
+}
+
+
+}}
+
+#endif /* HB_WASM_API_COMMON_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-face.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-face.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-face.hh	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-face.hh	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,109 @@
+/*
+ * Copyright © 2023  Behdad Esfahbod
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_WASM_API_FACE_HH
+#define HB_WASM_API_FACE_HH
+
+#include "hb-wasm-api.hh"
+
+namespace hb {
+namespace wasm {
+
+
+HB_WASM_API (ptr_t(face_t), face_create) (HB_WASM_EXEC_ENV
+					  ptr_d(blob_t, blob),
+					  unsigned int index)
+{
+  HB_PTR_PARAM (blob_t, blob);
+  hb_blob_t *hb_blob = hb_blob_create(
+				      HB_ARRAY_APP2NATIVE (char, blob->data, blob->length),
+				      blob->length,
+				      HB_MEMORY_MODE_DUPLICATE,
+				      NULL,
+				      NULL);
+
+  hb_face_t *face = hb_face_create(hb_blob, index);
+
+  HB_OBJ2REF (face);
+  return faceref;
+}
+
+HB_WASM_API (bool_t, face_copy_table) (HB_WASM_EXEC_ENV
+				       ptr_d(face_t, face),
+				       tag_t table_tag,
+				       ptr_d(blob_t, blob))
+{
+  HB_REF2OBJ (face);
+  HB_PTR_PARAM (blob_t, blob);
+  if (unlikely (!blob))
+    return false;
+
+  hb_blob_t *hb_blob = hb_face_reference_table (face, table_tag);
+
+  unsigned length;
+  const char *hb_data = hb_blob_get_data (hb_blob, &length);
+
+  if (length <= blob->length)
+  {
+    char *data = HB_ARRAY_APP2NATIVE (char, blob->data, length);
+
+    if (unlikely (!data))
+    {
+      blob->length = 0;
+      return false;
+    }
+
+    hb_memcpy (data, hb_data, length);
+
+    return true;
+  }
+
+  module_free (blob->data);
+
+  blob->length = length;
+  blob->data = wasm_runtime_module_dup_data (module_inst, hb_data, length);
+
+  hb_blob_destroy (hb_blob);
+
+  if (blob->length && !blob->data)
+  {
+    blob->length = 0;
+    return false;
+  }
+
+  return true;
+}
+
+HB_WASM_API (unsigned, face_get_upem) (HB_WASM_EXEC_ENV
+				       ptr_d(face_t, face))
+{
+  HB_REF2OBJ (face);
+
+  return hb_face_get_upem (face);
+}
+
+
+}}
+
+#endif /* HB_WASM_API_FACE_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-font.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-font.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-font.hh	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-font.hh	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,263 @@
+/*
+ * Copyright © 2023  Behdad Esfahbod
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_WASM_API_FONT_HH
+#define HB_WASM_API_FONT_HH
+
+#include "hb-wasm-api.hh"
+
+#include "hb-outline.hh"
+
+namespace hb {
+namespace wasm {
+
+
+HB_WASM_API (ptr_t(font_t), font_create) (HB_WASM_EXEC_ENV
+					  ptr_d(face_t, face))
+{
+  HB_REF2OBJ (face);
+
+  hb_font_t *font = hb_font_create (face);
+
+  HB_OBJ2REF (font);
+  return fontref;
+}
+
+HB_WASM_API (ptr_t(face_t), font_get_face) (HB_WASM_EXEC_ENV
+					    ptr_d(font_t, font))
+{
+  HB_REF2OBJ (font);
+
+  hb_face_t *face = hb_font_get_face (font);
+
+  HB_OBJ2REF (face);
+  return faceref;
+}
+
+HB_WASM_API (void, font_get_scale) (HB_WASM_EXEC_ENV
+				    ptr_d(font_t, font),
+				    ptr_d(int32_t, x_scale),
+				    ptr_d(int32_t, y_scale))
+{
+  HB_REF2OBJ (font);
+
+  HB_PTR_PARAM(int32_t, x_scale);
+  HB_PTR_PARAM(int32_t, y_scale);
+
+  hb_font_get_scale (font, x_scale, y_scale);
+}
+
+HB_WASM_API (codepoint_t, font_get_glyph) (HB_WASM_EXEC_ENV
+					      ptr_d(font_t, font),
+					      codepoint_t unicode,
+					      codepoint_t variation_selector)
+{
+  HB_REF2OBJ (font);
+  codepoint_t glyph;
+
+  hb_font_get_glyph (font, unicode, variation_selector, &glyph);
+  return glyph;
+}
+
+HB_WASM_API (position_t, font_get_glyph_h_advance) (HB_WASM_EXEC_ENV
+						    ptr_d(font_t, font),
+						    codepoint_t glyph)
+{
+  HB_REF2OBJ (font);
+  return hb_font_get_glyph_h_advance (font, glyph);
+}
+
+HB_WASM_API (position_t, font_get_glyph_v_advance) (HB_WASM_EXEC_ENV
+						    ptr_d(font_t, font),
+						    codepoint_t glyph)
+{
+  HB_REF2OBJ (font);
+  return hb_font_get_glyph_v_advance (font, glyph);
+}
+
+static_assert (sizeof (glyph_extents_t) == sizeof (hb_glyph_extents_t), "");
+
+HB_WASM_API (bool_t, font_get_glyph_extents) (HB_WASM_EXEC_ENV
+					      ptr_d(font_t, font),
+					      codepoint_t glyph,
+					      ptr_d(glyph_extents_t, extents))
+{
+  HB_REF2OBJ (font);
+  HB_PTR_PARAM (glyph_extents_t, extents);
+  if (unlikely (!extents))
+    return false;
+
+  return hb_font_get_glyph_extents (font, glyph,
+				    (hb_glyph_extents_t *) extents);
+}
+
+HB_WASM_API (void, font_glyph_to_string) (HB_WASM_EXEC_ENV
+					  ptr_d(font_t, font),
+					  codepoint_t glyph,
+					  char *s, uint32_t size)
+{
+  HB_REF2OBJ (font);
+
+  hb_font_glyph_to_string (font, glyph, s, size);
+}
+
+static_assert (sizeof (glyph_outline_point_t) == sizeof (hb_outline_point_t), "");
+static_assert (sizeof (uint32_t) == sizeof (hb_outline_t::contours[0]), "");
+
+HB_WASM_API (bool_t, font_copy_glyph_outline) (HB_WASM_EXEC_ENV
+					       ptr_d(font_t, font),
+					       codepoint_t glyph,
+					       ptr_d(glyph_outline_t, outline))
+{
+  HB_REF2OBJ (font);
+  HB_PTR_PARAM (glyph_outline_t, outline);
+  if (unlikely (!outline))
+    return false;
+
+  hb_outline_t hb_outline;
+  auto *funcs = hb_outline_recording_pen_get_funcs ();
+
+  hb_font_draw_glyph (font, glyph, funcs, &hb_outline);
+
+  if (unlikely (hb_outline.points.in_error () ||
+		hb_outline.contours.in_error ()))
+  {
+    outline->n_points = outline->n_contours = 0;
+    return false;
+  }
+
+  // TODO Check two buffers separately
+  if (hb_outline.points.length <= outline->n_points &&
+      hb_outline.contours.length <= outline->n_contours)
+  {
+    glyph_outline_point_t *points = HB_ARRAY_APP2NATIVE (glyph_outline_point_t, outline->points, hb_outline.points.length);
+    uint32_t *contours = HB_ARRAY_APP2NATIVE (uint32_t, outline->contours, hb_outline.contours.length);
+
+    if (unlikely (!points || !contours))
+    {
+      outline->n_points = outline->n_contours = 0;
+      return false;
+    }
+
+    hb_memcpy (points, hb_outline.points.arrayZ, hb_outline.points.get_size ());
+    hb_memcpy (contours, hb_outline.contours.arrayZ, hb_outline.contours.get_size ());
+
+    return true;
+  }
+
+  outline->n_points = hb_outline.points.length;
+  outline->points = wasm_runtime_module_dup_data (module_inst,
+						  (const char *) hb_outline.points.arrayZ,
+						  hb_outline.points.get_size ());
+  outline->n_contours = hb_outline.contours.length;
+  outline->contours = wasm_runtime_module_dup_data (module_inst,
+						    (const char *) hb_outline.contours.arrayZ,
+						    hb_outline.contours.get_size ());
+
+  if ((outline->n_points && !outline->points) ||
+      (!outline->n_contours && !outline->contours))
+  {
+    outline->n_points = outline->n_contours = 0;
+    return false;
+  }
+
+  return true;
+}
+
+HB_WASM_API (void, glyph_outline_free) (HB_WASM_EXEC_ENV
+					ptr_d(glyph_outline_t, outline))
+{
+  HB_PTR_PARAM (glyph_outline_t, outline);
+  if (unlikely (!outline))
+    return;
+
+  module_free (outline->points);
+  module_free (outline->contours);
+
+  outline->n_points = 0;
+  outline->points = nullref;
+  outline->n_contours = 0;
+  outline->contours = nullref;
+}
+
+HB_WASM_API (bool_t, font_copy_coords) (HB_WASM_EXEC_ENV
+					  ptr_d(font_t, font),
+					  ptr_d(coords_t, coords))
+{
+  HB_REF2OBJ (font);
+  HB_PTR_PARAM (coords_t, coords);
+  if (unlikely (!coords))
+    return false;
+
+  unsigned our_length;
+  const int* our_coords = hb_font_get_var_coords_normalized(font, &our_length);
+
+  if (our_length <= coords->length) {
+    int *their_coords = HB_ARRAY_APP2NATIVE (int, coords->coords, our_length);
+    if (unlikely(!their_coords)) {
+    	coords->length = 0;
+    	return false;
+    }
+		unsigned bytes = our_length * sizeof (int);
+    hb_memcpy (their_coords, our_coords, bytes);
+
+    return true;
+  }
+
+  module_free (coords->coords);
+  coords->length = our_length;
+	unsigned bytes = our_length * sizeof (int);
+  coords->coords = wasm_runtime_module_dup_data (module_inst, (const char *) our_coords, bytes);
+	if (our_length && !coords->coords)
+	  {
+    coords->length = 0;
+    return false;
+  }
+
+  return true;
+}
+
+HB_WASM_API (bool_t, font_set_coords) (HB_WASM_EXEC_ENV
+					  ptr_d(font_t, font),
+					  ptr_d(coords_t, coords))
+{
+  HB_REF2OBJ (font);
+  HB_PTR_PARAM (coords_t, coords);
+  if (unlikely (!coords))
+    return false;
+
+  unsigned length = coords->length;
+  unsigned bytes;
+  if (unlikely (hb_unsigned_mul_overflows (length, sizeof (int), &bytes)))
+    return false;
+
+  const int *our_coords = (const int *) (validate_app_addr (coords->coords, bytes) ? addr_app_to_native (coords->coords) : nullptr);
+  hb_font_set_var_coords_normalized(font, our_coords, length);
+  return true;
+}
+
+
+}}
+
+#endif /* HB_WASM_API_FONT_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-shape.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-shape.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-shape.hh	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api-shape.hh	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,70 @@
+/*
+ * Copyright © 2023  Behdad Esfahbod
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_WASM_API_SHAPE_HH
+#define HB_WASM_API_SHAPE_HH
+
+#include "hb-wasm-api.hh"
+
+namespace hb {
+namespace wasm {
+
+
+static_assert (sizeof (feature_t) == sizeof (hb_feature_t), "");
+
+HB_WASM_INTERFACE (bool_t, shape_with) (HB_WASM_EXEC_ENV
+				        ptr_d(font_t, font),
+				        ptr_d(buffer_t, buffer),
+				        ptr_d(const feature_t, features),
+				        uint32_t num_features,
+					const char *shaper)
+{
+  if (unlikely (0 == strcmp (shaper, "wasm")))
+    return false;
+
+  HB_REF2OBJ (font);
+  HB_REF2OBJ (buffer);
+
+  /* Pre-conditions that make hb_shape_full() crash should be checked here. */
+
+  if (unlikely (!buffer->ensure_unicode ()))
+    return false;
+
+  if (unlikely (!HB_DIRECTION_IS_VALID (buffer->props.direction)))
+    return false;
+
+  HB_ARRAY_PARAM (const feature_t, features, num_features);
+  if (unlikely (!features && num_features))
+    return false;
+
+  const char * shaper_list[] = {shaper, nullptr};
+  return hb_shape_full (font, buffer,
+			(hb_feature_t *) features, num_features,
+			shaper_list);
+}
+
+
+}}
+
+#endif /* HB_WASM_API_SHAPE_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api.cc	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api.cc	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,46 @@
+/*
+ * Copyright © 2023  Behdad Esfahbod
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#include "hb.hh"
+
+#ifdef HAVE_WASM
+
+#include "hb-wasm-api.hh"
+
+#define module_inst wasm_runtime_get_module_inst (exec_env)
+
+
+#include "hb-wasm-api-blob.hh"
+#include "hb-wasm-api-buffer.hh"
+#include "hb-wasm-api-common.hh"
+#include "hb-wasm-api-face.hh"
+#include "hb-wasm-api-font.hh"
+#include "hb-wasm-api-shape.hh"
+
+
+#undef module_inst
+
+hb_user_data_key_t _hb_wasm_ref_type_key = {};
+
+#endif
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api.h 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api.h
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,319 @@
+/*
+ * Copyright © 2023  Behdad Esfahbod
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_WASM_API_H
+#define HB_WASM_API_H
+
+/*
+#include "hb.h"
+*/
+
+#include <stdint.h>
+
+
+#ifndef HB_WASM_BEGIN_DECLS
+# ifdef __cplusplus
+#  define HB_WASM_BEGIN_DECLS	extern "C" {
+#  define HB_WASM_END_DECLS	}
+# else /* !__cplusplus */
+#  define HB_WASM_BEGIN_DECLS
+#  define HB_WASM_END_DECLS
+# endif /* !__cplusplus */
+#endif
+
+
+HB_WASM_BEGIN_DECLS
+
+#ifndef HB_WASM_API
+#define HB_WASM_API(ret_t, name) ret_t name
+#endif
+#ifndef HB_WASM_API_COMPOUND /* compound return type */
+#define HB_WASM_API_COMPOUND(ret_t, name) HB_WASM_API(ret_t, name)
+#endif
+#ifndef HB_WASM_INTERFACE
+#define HB_WASM_INTERFACE(ret_t, name) ret_t name
+#endif
+#ifndef HB_WASM_EXEC_ENV
+#define HB_WASM_EXEC_ENV
+#endif
+#ifndef HB_WASM_EXEC_ENV_COMPOUND
+#define HB_WASM_EXEC_ENV_COMPOUND HB_WASM_EXEC_ENV
+#endif
+
+
+#ifndef bool_t
+#define bool_t uint32_t
+#endif
+#ifndef ptr_t
+#define ptr_t(type_t) type_t *
+#endif
+#ifndef ptr_d
+#define ptr_d(type_t, name) type_t *name
+#endif
+
+typedef uint32_t codepoint_t;
+typedef int32_t position_t;
+typedef uint32_t mask_t;
+typedef uint32_t tag_t;
+#define TAG(c1,c2,c3,c4) ((tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
+
+typedef enum {
+  DIRECTION_INVALID = 0,
+  DIRECTION_LTR = 4,
+  DIRECTION_RTL,
+  DIRECTION_TTB,
+  DIRECTION_BTT
+} direction_t;
+#define DIRECTION_IS_VALID(dir)		((((unsigned int) (dir)) & ~3U) == 4)
+#define DIRECTION_IS_HORIZONTAL(dir)	((((unsigned int) (dir)) & ~1U) == 4)
+#define DIRECTION_IS_VERTICAL(dir)	((((unsigned int) (dir)) & ~1U) == 6)
+#define DIRECTION_IS_FORWARD(dir)	((((unsigned int) (dir)) & ~2U) == 4)
+#define DIRECTION_IS_BACKWARD(dir)	((((unsigned int) (dir)) & ~2U) == 5)
+#define DIRECTION_REVERSE(dir)		((direction_t) (((unsigned int) (dir)) ^ 1))
+
+typedef tag_t script_t; /* ISO 15924 representation of Unicode scripts. */
+
+
+/* common */
+
+HB_WASM_API (direction_t, script_get_horizontal_direction) (HB_WASM_EXEC_ENV
+							    script_t script);
+
+
+/* blob */
+
+typedef struct
+{
+  uint32_t length;
+  ptr_t(char) data;
+} blob_t;
+#define BLOB_INIT {0, 0}
+
+HB_WASM_API (void, blob_free) (HB_WASM_EXEC_ENV
+			       ptr_d(blob_t, blob));
+
+/* buffer */
+
+typedef struct
+{
+  uint32_t codepoint;
+  uint32_t mask;
+  uint32_t cluster;
+  uint32_t var1;
+  uint32_t var2;
+} glyph_info_t;
+
+typedef struct
+{
+  position_t x_advance;
+  position_t y_advance;
+  position_t x_offset;
+  position_t y_offset;
+  uint32_t var;
+} glyph_position_t;
+
+typedef struct
+{
+  uint32_t length;
+  ptr_t(glyph_info_t) info;
+  ptr_t(glyph_position_t) pos;
+} buffer_contents_t;
+#define BUFFER_CONTENTS_INIT {0, 0, 0}
+
+HB_WASM_API (bool_t, buffer_contents_realloc) (HB_WASM_EXEC_ENV
+					       ptr_d(buffer_contents_t, contents),
+					       uint32_t size);
+
+HB_WASM_API (void, buffer_contents_free) (HB_WASM_EXEC_ENV
+					  ptr_d(buffer_contents_t, contents));
+
+typedef struct buffer_t buffer_t;
+
+HB_WASM_API (bool_t, buffer_copy_contents) (HB_WASM_EXEC_ENV
+					    ptr_d(buffer_t, buffer),
+					    ptr_d(buffer_contents_t, contents));
+
+HB_WASM_API (bool_t, buffer_set_contents) (HB_WASM_EXEC_ENV
+					   ptr_d(buffer_t, buffer),
+					   ptr_d(const buffer_contents_t, contents));
+
+HB_WASM_API (direction_t, buffer_get_direction) (HB_WASM_EXEC_ENV
+						 ptr_d(buffer_t, buffer));
+
+HB_WASM_API (script_t, buffer_get_script) (HB_WASM_EXEC_ENV
+					   ptr_d(buffer_t, buffer));
+
+HB_WASM_API (void, buffer_reverse) (HB_WASM_EXEC_ENV
+				    ptr_d(buffer_t, buffer));
+
+HB_WASM_API (void, buffer_reverse_clusters) (HB_WASM_EXEC_ENV
+					     ptr_d(buffer_t, buffer));
+
+/* face */
+
+typedef struct face_t face_t;
+
+HB_WASM_API (ptr_t(face_t), face_create) (HB_WASM_EXEC_ENV
+					  ptr_d(blob_t, blob),
+					  unsigned int);
+
+HB_WASM_API (bool_t, face_copy_table) (HB_WASM_EXEC_ENV
+				       ptr_d(face_t, face),
+				       tag_t table_tag,
+				       ptr_d(blob_t, blob));
+
+HB_WASM_API (unsigned, face_get_upem) (HB_WASM_EXEC_ENV
+				       ptr_d(face_t, face));
+
+/* font */
+
+typedef struct font_t font_t;
+
+HB_WASM_API (ptr_t(font_t), font_create) (HB_WASM_EXEC_ENV
+					  ptr_d(face_t, face));
+
+HB_WASM_API (ptr_t(face_t), font_get_face) (HB_WASM_EXEC_ENV
+					    ptr_d(font_t, font));
+
+HB_WASM_API (void, font_get_scale) (HB_WASM_EXEC_ENV
+				    ptr_d(font_t, font),
+				    ptr_d(int32_t, x_scale),
+				    ptr_d(int32_t, y_scale));
+
+HB_WASM_API (codepoint_t, font_get_glyph) (HB_WASM_EXEC_ENV
+					      ptr_d(font_t, font),
+					      codepoint_t unicode,
+					      codepoint_t variation_selector);
+
+HB_WASM_API (position_t, font_get_glyph_h_advance) (HB_WASM_EXEC_ENV
+						    ptr_d(font_t, font),
+						    codepoint_t glyph);
+
+HB_WASM_API (position_t, font_get_glyph_v_advance) (HB_WASM_EXEC_ENV
+						    ptr_d(font_t, font),
+						    codepoint_t glyph);
+
+typedef struct
+{
+  position_t x_bearing;
+  position_t y_bearing;
+  position_t width;
+  position_t height;
+} glyph_extents_t;
+
+HB_WASM_API (bool_t, font_get_glyph_extents) (HB_WASM_EXEC_ENV
+					      ptr_d(font_t, font),
+					      codepoint_t glyph,
+					      ptr_d(glyph_extents_t, extents));
+
+HB_WASM_API (void, font_glyph_to_string) (HB_WASM_EXEC_ENV
+					  ptr_d(font_t, font),
+					  codepoint_t glyph,
+					  char *s, uint32_t size);
+
+
+typedef struct
+{
+  unsigned int length;
+  ptr_t(int) coords;
+} coords_t;
+
+HB_WASM_API (bool_t, font_copy_coords) (HB_WASM_EXEC_ENV
+					  ptr_d(font_t, font),
+					  ptr_d(coords_t, coords));
+
+HB_WASM_API (bool_t, font_set_coords) (HB_WASM_EXEC_ENV
+					  ptr_d(font_t, font),
+					  ptr_d(coords_t, coords));
+
+/* outline */
+
+enum glyph_outline_point_type_t
+{
+  MOVE_TO,
+  LINE_TO,
+  QUADRATIC_TO,
+  CUBIC_TO,
+};
+
+typedef struct
+{
+  float x;
+  float y;
+  uint32_t type;
+} glyph_outline_point_t;
+
+typedef struct
+{
+  uint32_t n_points;
+  ptr_t(glyph_outline_point_t) points;
+  uint32_t n_contours;
+  ptr_t(uint32_t) contours;
+} glyph_outline_t;
+#define GLYPH_OUTLINE_INIT {0, 0, 0, 0}
+
+HB_WASM_API (void, glyph_outline_free) (HB_WASM_EXEC_ENV
+					ptr_d(glyph_outline_t, outline));
+
+HB_WASM_API (bool_t, font_copy_glyph_outline) (HB_WASM_EXEC_ENV
+					       ptr_d(font_t, font),
+					       codepoint_t glyph,
+					       ptr_d(glyph_outline_t, outline));
+
+
+/* shape */
+
+typedef struct
+{
+  tag_t    tag;
+  uint32_t value;
+  uint32_t start;
+  uint32_t end;
+} feature_t;
+#define FEATURE_GLOBAL_START	0
+#define FEATURE_GLOBAL_END	((uint32_t) -1)
+
+HB_WASM_API (bool_t, shape_with) (HB_WASM_EXEC_ENV
+				  ptr_d(font_t, font),
+				  ptr_d(buffer_t, buffer),
+				  ptr_d(const feature_t, features),
+				  uint32_t num_features,
+				  const char *shaper);
+
+/* Implement these in your shaper. */
+
+HB_WASM_INTERFACE (ptr_t(void), shape_plan_create) (ptr_d(face_t, face));
+
+HB_WASM_INTERFACE (bool_t, shape) (ptr_d(void, shape_plan),
+				   ptr_d(font_t, font),
+				   ptr_d(buffer_t, buffer),
+				   ptr_d(const feature_t, features),
+				   uint32_t num_features);
+
+HB_WASM_INTERFACE (void, shape_plan_destroy) (ptr_d(void, shape_plan));
+
+
+HB_WASM_END_DECLS
+
+#endif /* HB_WASM_API_H */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-api.hh	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-api.hh	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,117 @@
+/*
+ * Copyright © 2023  Behdad Esfahbod
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_WASM_API_HH
+#define HB_WASM_API_HH
+
+#include "hb.hh"
+
+#include <wasm_export.h>
+
+#define HB_WASM_BEGIN_DECLS namespace hb { namespace wasm {
+#define HB_WASM_END_DECLS }}
+
+#define HB_WASM_API(ret_t, name) HB_INTERNAL ret_t name
+#define HB_WASM_API_COMPOUND(ret_t, name) HB_INTERNAL void name
+
+#define HB_WASM_EXEC_ENV wasm_exec_env_t exec_env,
+#define HB_WASM_EXEC_ENV_COMPOUND wasm_exec_env_t exec_env, ptr_t() retptr,
+
+#define ptr_t(type_t) uint32_t
+#define ptr_d(type_t, name) uint32_t name##ptr
+
+#include "hb-wasm-api.h"
+
+#undef HB_WASM_BEGIN_DECLS
+#undef HB_WASM_END_DECLS
+
+
+enum {
+  hb_wasm_ref_type_none,
+  hb_wasm_ref_type_face,
+  hb_wasm_ref_type_font,
+  hb_wasm_ref_type_buffer,
+};
+
+HB_INTERNAL extern hb_user_data_key_t _hb_wasm_ref_type_key;
+
+#define nullref 0
+
+#define HB_REF2OBJ(obj) \
+  hb_##obj##_t *obj = nullptr; \
+  HB_STMT_START { \
+    (void) wasm_externref_ref2obj (obj##ptr, (void **) &obj); \
+    /* Check object type. */ \
+    /* This works because all our objects have the same hb_object_t layout. */ \
+    if (unlikely (hb_##obj##_get_user_data (obj, &_hb_wasm_ref_type_key) != \
+		  (void *) hb_wasm_ref_type_##obj)) \
+      obj = hb_##obj##_get_empty (); \
+  } HB_STMT_END
+
+#define HB_OBJ2REF(obj) \
+  uint32_t obj##ref = nullref; \
+  HB_STMT_START { \
+    hb_##obj##_set_user_data (obj, &_hb_wasm_ref_type_key, \
+			      (void *) hb_wasm_ref_type_##obj, \
+			      nullptr, false); \
+    (void) wasm_externref_obj2ref (module_inst, obj, &obj##ref); \
+  } HB_STMT_END
+
+#define HB_RETURN_STRUCT(type, name) \
+  type *_name_ptr = nullptr; \
+  { \
+    if (likely (wasm_runtime_validate_app_addr (module_inst, \
+						retptr, sizeof (type)))) \
+    { \
+      _name_ptr = (type *) wasm_runtime_addr_app_to_native (module_inst, retptr); \
+      if (unlikely (!_name_ptr)) \
+	return; \
+    } \
+  } \
+  type &name = *_name_ptr
+
+#define HB_PTR_PARAM(type, name) \
+  type *name = nullptr; \
+  HB_STMT_START { \
+    if (likely (wasm_runtime_validate_app_addr (module_inst, \
+						name##ptr, sizeof (type)))) \
+      name = (type *) wasm_runtime_addr_app_to_native (module_inst, name##ptr); \
+  } HB_STMT_END
+
+#define HB_ARRAY_PARAM(type, name, length) \
+  type *name = nullptr; \
+  HB_STMT_START { \
+    if (likely (!hb_unsigned_mul_overflows (length, sizeof (type)) && \
+		wasm_runtime_validate_app_addr (module_inst, \
+						name##ptr, length * sizeof (type)))) \
+      name = (type *) wasm_runtime_addr_app_to_native (module_inst, name##ptr); \
+  } HB_STMT_END
+
+#define HB_ARRAY_APP2NATIVE(type, name, length) \
+    ((type *) (!hb_unsigned_mul_overflows (length, sizeof (type)) && \
+	       validate_app_addr (name, (length) * sizeof (type)) ? \
+	       addr_app_to_native (name) : nullptr))
+
+
+#endif /* HB_WASM_API_HH */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-shape.cc 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-shape.cc
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb-wasm-shape.cc	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb-wasm-shape.cc	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,470 @@
+/*
+ * Copyright © 2011  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#undef HB_DEBUG_WASM
+#define HB_DEBUG_WASM 1
+
+#include "hb-shaper-impl.hh"
+
+#ifdef HAVE_WASM
+
+/* Compile wasm-micro-runtime with:
+ *
+ * $ cmake -DWAMR_BUILD_MULTI_MODULE=1 -DWAMR_BUILD_REF_TYPES=1 -DWAMR_BUILD_FAST_JIT=1
+ * $ make
+ *
+ * If you manage to build a wasm shared module successfully and want to use it,
+ * do the following:
+ *
+ *   - Add -DWAMR_BUILD_MULTI_MODULE=1 to your cmake build for wasm-micro-runtime,
+ *
+ *   - Remove the #define HB_WASM_NO_MODULES line below,
+ *
+ *   - Install your shared module with name ending in .wasm in
+ *     $(prefix)/$(libdir)/harfbuzz/wasm/
+ *
+ *   - Build your font's wasm code importing the shared modules with the desired
+ *     name. This can be done eg.: __attribute__((import_module("graphite2")))
+ *     before each symbol in the shared-module's headers.
+ *
+ *   - Try shaping your font and hope for the best...
+ *
+ * I haven't been able to get this to work since emcc's support for shared libraries
+ * requires support from the host that seems to be missing from wasm-micro-runtime?
+ */
+
+#include "hb-wasm-api.hh"
+#include "hb-wasm-api-list.hh"
+
+#ifndef HB_WASM_NO_MODULES
+#define HB_WASM_NO_MODULES
+#endif
+
+
+#ifndef HB_WASM_NO_MODULES
+static bool HB_UNUSED
+_hb_wasm_module_reader (const char *module_name,
+		       uint8_t **p_buffer, uint32_t *p_size)
+{
+  char path[sizeof (HB_WASM_MODULE_DIR) + 64] = HB_WASM_MODULE_DIR "/";
+  strncat (path, module_name, sizeof (path) - sizeof (HB_WASM_MODULE_DIR) - 16);
+  strncat (path, ".wasm", 6);
+
+  auto *blob = hb_blob_create_from_file (path);
+
+  unsigned length;
+  auto *data = hb_blob_get_data (blob, &length);
+
+  *p_buffer = (uint8_t *) hb_malloc (length);
+
+  if (length && !p_buffer)
+    return false;
+
+  memcpy (*p_buffer, data, length);
+  *p_size = length;
+
+  hb_blob_destroy (blob);
+
+  return true;
+}
+
+static void HB_UNUSED
+_hb_wasm_module_destroyer (uint8_t *buffer, uint32_t size)
+{
+  hb_free (buffer);
+}
+#endif
+
+/*
+ * shaper face data
+ */
+
+#define HB_WASM_TAG_WASM HB_TAG('W','a','s','m')
+
+struct hb_wasm_shape_plan_t {
+  wasm_module_inst_t module_inst;
+  wasm_exec_env_t exec_env;
+  ptr_d(void, wasm_shape_plan);
+};
+
+struct hb_wasm_face_data_t {
+  hb_blob_t *wasm_blob;
+  wasm_module_t wasm_module;
+  mutable hb_atomic_ptr_t<hb_wasm_shape_plan_t> plan;
+};
+
+static bool
+_hb_wasm_init ()
+{
+  /* XXX
+   *
+   * Umm. Make this threadsafe. How?!
+   * It's clunky that we can't allocate a static mutex.
+   * So we have to first allocate one on the heap atomically...
+   *
+   * Do we also need to lock around module creation?
+   *
+   * Also, wasm-micro-runtime uses a singleton instance. So if
+   * another library or client uses it, all bets are off. :-(
+   * If nothing else, around HB_REF2OBJ().
+   */
+
+  static bool initialized;
+  if (initialized)
+    return true;
+
+  RuntimeInitArgs init_args;
+  hb_memset (&init_args, 0, sizeof (RuntimeInitArgs));
+
+  init_args.mem_alloc_type = Alloc_With_Allocator;
+  init_args.mem_alloc_option.allocator.malloc_func = (void *) hb_malloc;
+  init_args.mem_alloc_option.allocator.realloc_func = (void *) hb_realloc;
+  init_args.mem_alloc_option.allocator.free_func = (void *) hb_free;
+
+  // Native symbols need below registration phase
+  init_args.n_native_symbols = ARRAY_LENGTH (_hb_wasm_native_symbols);
+  init_args.native_module_name = "env";
+  init_args.native_symbols = _hb_wasm_native_symbols;
+
+  if (unlikely (!wasm_runtime_full_init (&init_args)))
+  {
+    DEBUG_MSG (WASM, nullptr, "Init runtime environment failed.");
+    return false;
+  }
+
+#ifndef HB_WASM_NO_MODULES
+  wasm_runtime_set_module_reader (_hb_wasm_module_reader,
+				  _hb_wasm_module_destroyer);
+#endif
+
+  initialized = true;
+  return true;
+}
+
+hb_wasm_face_data_t *
+_hb_wasm_shaper_face_data_create (hb_face_t *face)
+{
+  char error[128];
+  hb_wasm_face_data_t *data = nullptr;
+  hb_blob_t *wasm_blob = nullptr;
+  wasm_module_t wasm_module = nullptr;
+
+  wasm_blob = hb_face_reference_table (face, HB_WASM_TAG_WASM);
+  unsigned length = hb_blob_get_length (wasm_blob);
+  if (!length)
+    goto fail;
+
+  if (!_hb_wasm_init ())
+    goto fail;
+
+  wasm_module = wasm_runtime_load ((uint8_t *) hb_blob_get_data_writable (wasm_blob, nullptr),
+				   length, error, sizeof (error));
+  if (unlikely (!wasm_module))
+  {
+    DEBUG_MSG (WASM, nullptr, "Load wasm module failed: %s", error);
+    goto fail;
+  }
+
+  data = (hb_wasm_face_data_t *) hb_calloc (1, sizeof (hb_wasm_face_data_t));
+  if (unlikely (!data))
+    goto fail;
+
+  data->wasm_blob = wasm_blob;
+  data->wasm_module = wasm_module;
+
+  return data;
+
+fail:
+  if (wasm_module)
+      wasm_runtime_unload (wasm_module);
+  hb_blob_destroy (wasm_blob);
+  hb_free (data);
+  return nullptr;
+}
+
+static hb_wasm_shape_plan_t *
+acquire_shape_plan (hb_face_t *face,
+		    const hb_wasm_face_data_t *face_data)
+{
+  char error[128];
+
+  /* Fetch cached one if available. */
+  hb_wasm_shape_plan_t *plan = face_data->plan.get_acquire ();
+  if (likely (plan && face_data->plan.cmpexch (plan, nullptr)))
+    return plan;
+
+  plan = (hb_wasm_shape_plan_t *) hb_calloc (1, sizeof (hb_wasm_shape_plan_t));
+
+  wasm_module_inst_t module_inst = nullptr;
+  wasm_exec_env_t exec_env = nullptr;
+  wasm_function_inst_t func = nullptr;
+
+  constexpr uint32_t stack_size = 32 * 1024, heap_size = 2 * 1024 * 1024;
+
+  module_inst = plan->module_inst = wasm_runtime_instantiate (face_data->wasm_module,
+							      stack_size, heap_size,
+							      error, sizeof (error));
+  if (unlikely (!module_inst))
+  {
+    DEBUG_MSG (WASM, face_data, "Create wasm module instance failed: %s", error);
+    goto fail;
+  }
+
+  exec_env = plan->exec_env = wasm_runtime_create_exec_env (module_inst,
+							    stack_size);
+  if (unlikely (!exec_env)) {
+    DEBUG_MSG (WASM, face_data, "Create wasm execution environment failed.");
+    goto fail;
+  }
+
+  func = wasm_runtime_lookup_function (module_inst, "shape_plan_create");
+  if (func)
+  {
+    wasm_val_t results[1];
+    wasm_val_t arguments[1];
+
+    HB_OBJ2REF (face);
+    if (unlikely (!faceref))
+    {
+      DEBUG_MSG (WASM, face_data, "Failed to register face object.");
+      goto fail;
+    }
+
+    results[0].kind = WASM_I32;
+    arguments[0].kind = WASM_I32;
+    arguments[0].of.i32 = faceref;
+    bool ret = wasm_runtime_call_wasm_a (exec_env, func,
+					 ARRAY_LENGTH (results), results,
+					 ARRAY_LENGTH (arguments), arguments);
+
+    if (unlikely (!ret))
+    {
+      DEBUG_MSG (WASM, module_inst, "Calling shape_plan_create() failed: %s",
+		 wasm_runtime_get_exception (module_inst));
+      goto fail;
+    }
+    plan->wasm_shape_planptr = results[0].of.i32;
+  }
+
+  return plan;
+
+fail:
+
+  if (exec_env)
+    wasm_runtime_destroy_exec_env (exec_env);
+  if (module_inst)
+    wasm_runtime_deinstantiate (module_inst);
+  hb_free (plan);
+  return nullptr;
+}
+
+static void
+release_shape_plan (const hb_wasm_face_data_t *face_data,
+		    hb_wasm_shape_plan_t *plan,
+		    bool cache = false)
+{
+  if (cache && face_data->plan.cmpexch (nullptr, plan))
+    return;
+
+  auto *module_inst = plan->module_inst;
+  auto *exec_env = plan->exec_env;
+
+  /* Is there even any point to having a shape_plan_destroy function
+   * and calling it? */
+  if (plan->wasm_shape_planptr)
+  {
+
+    auto *func = wasm_runtime_lookup_function (module_inst, "shape_plan_destroy");
+    if (func)
+    {
+      wasm_val_t arguments[1];
+
+      arguments[0].kind = WASM_I32;
+      arguments[0].of.i32 = plan->wasm_shape_planptr;
+      bool ret = wasm_runtime_call_wasm_a (exec_env, func,
+					   0, nullptr,
+					   ARRAY_LENGTH (arguments), arguments);
+
+      if (unlikely (!ret))
+      {
+	DEBUG_MSG (WASM, module_inst, "Calling shape_plan_destroy() failed: %s",
+		   wasm_runtime_get_exception (module_inst));
+      }
+    }
+  }
+
+  wasm_runtime_destroy_exec_env (exec_env);
+  wasm_runtime_deinstantiate (module_inst);
+  hb_free (plan);
+}
+
+void
+_hb_wasm_shaper_face_data_destroy (hb_wasm_face_data_t *data)
+{
+  if (data->plan.get_relaxed ())
+    release_shape_plan (data, data->plan);
+  wasm_runtime_unload (data->wasm_module);
+  hb_blob_destroy (data->wasm_blob);
+  hb_free (data);
+}
+
+
+/*
+ * shaper font data
+ */
+
+struct hb_wasm_font_data_t {};
+
+hb_wasm_font_data_t *
+_hb_wasm_shaper_font_data_create (hb_font_t *font HB_UNUSED)
+{
+  return (hb_wasm_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
+}
+
+void
+_hb_wasm_shaper_font_data_destroy (hb_wasm_font_data_t *data HB_UNUSED)
+{
+}
+
+
+/*
+ * shaper
+ */
+
+hb_bool_t
+_hb_wasm_shape (hb_shape_plan_t    *shape_plan,
+		hb_font_t          *font,
+		hb_buffer_t        *buffer,
+		const hb_feature_t *features,
+		unsigned int        num_features)
+{
+  if (unlikely (buffer->in_error ()))
+    return false;
+
+  bool ret = true;
+  hb_face_t *face = font->face;
+  const hb_wasm_face_data_t *face_data = face->data.wasm;
+
+  bool retried = false;
+  if (0)
+  {
+retry:
+    DEBUG_MSG (WASM, font, "Retrying...");
+  }
+
+  wasm_function_inst_t func = nullptr;
+
+  hb_wasm_shape_plan_t *plan = acquire_shape_plan (face, face_data);
+  if (unlikely (!plan))
+  {
+    DEBUG_MSG (WASM, face_data, "Acquiring shape-plan failed.");
+    return false;
+  }
+
+  auto *module_inst = plan->module_inst;
+  auto *exec_env = plan->exec_env;
+
+  HB_OBJ2REF (font);
+  HB_OBJ2REF (buffer);
+  if (unlikely (!fontref || !bufferref))
+  {
+    DEBUG_MSG (WASM, module_inst, "Failed to register objects.");
+    goto fail;
+  }
+
+  func = wasm_runtime_lookup_function (module_inst, "shape");
+  if (unlikely (!func))
+  {
+    DEBUG_MSG (WASM, module_inst, "Shape function not found.");
+    goto fail;
+  }
+
+  wasm_val_t results[1];
+  wasm_val_t arguments[5];
+
+  results[0].kind = WASM_I32;
+  arguments[0].kind = WASM_I32;
+  arguments[0].of.i32 = plan->wasm_shape_planptr;
+  arguments[1].kind = WASM_I32;
+  arguments[1].of.i32 = fontref;
+  arguments[2].kind = WASM_I32;
+  arguments[2].of.i32 = bufferref;
+  arguments[3].kind = WASM_I32;
+  arguments[3].of.i32 = num_features ? wasm_runtime_module_dup_data (module_inst,
+								     (const char *) features,
+								     num_features * sizeof (features[0])) : 0;
+  arguments[4].kind = WASM_I32;
+  arguments[4].of.i32 = num_features;
+
+  ret = wasm_runtime_call_wasm_a (exec_env, func,
+				  ARRAY_LENGTH (results), results,
+				  ARRAY_LENGTH (arguments), arguments);
+
+  if (num_features)
+    wasm_runtime_module_free (module_inst, arguments[2].of.i32);
+
+  if (unlikely (!ret || !results[0].of.i32))
+  {
+    DEBUG_MSG (WASM, module_inst, "Calling shape() failed: %s",
+	       wasm_runtime_get_exception (module_inst));
+    if (!buffer->ensure_unicode ())
+    {
+      DEBUG_MSG (WASM, font, "Shape failed but buffer is not in Unicode; failing...");
+      goto fail;
+    }
+    if (retried)
+    {
+      DEBUG_MSG (WASM, font, "Giving up...");
+      goto fail;
+    }
+    buffer->successful = true;
+    retried = true;
+    release_shape_plan (face_data, plan);
+    plan = nullptr;
+    goto retry;
+  }
+
+  /* TODO Regularize clusters according to direction & cluster level,
+   * such that client doesn't crash with unmet expectations. */
+
+  if (!results[0].of.i32)
+  {
+fail:
+    ret = false;
+  }
+
+  release_shape_plan (face_data, plan, ret);
+
+  if (ret)
+  {
+    buffer->clear_glyph_flags ();
+    buffer->unsafe_to_break ();
+  }
+
+  return ret;
+}
+
+#endif
diff -pruN 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb.hh 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb.hh
--- 5.15.15+dfsg-2/src/3rdparty/harfbuzz-ng/src/hb.hh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/harfbuzz-ng/src/hb.hh	2024-11-20 13:56:33.000000000 +0000
@@ -64,6 +64,8 @@
 #pragma GCC diagnostic error   "-Wbitwise-instead-of-logical"
 #pragma GCC diagnostic error   "-Wcast-align"
 #pragma GCC diagnostic error   "-Wcast-function-type"
+#pragma GCC diagnostic error   "-Wcast-function-type-strict"
+#pragma GCC diagnostic error   "-Wconstant-conversion"
 #pragma GCC diagnostic error   "-Wcomma"
 #pragma GCC diagnostic error   "-Wdelete-non-virtual-dtor"
 #pragma GCC diagnostic error   "-Wembedded-directive"
@@ -176,6 +178,11 @@
 #define HB_EXTERN __declspec (dllexport) extern
 #endif
 
+// https://github.com/harfbuzz/harfbuzz/pull/4619
+#ifndef __STDC_FORMAT_MACROS
+#define __STDC_FORMAT_MACROS 1
+#endif
+
 #include "hb.h"
 #define HB_H_IN
 #include "hb-ot.h"
@@ -211,6 +218,12 @@
 #include <winapifamily.h>
 #endif
 
+#ifndef PRId32
+# define PRId32 "d"
+# define PRIu32 "u"
+# define PRIx32 "x"
+#endif
+
 #define HB_PASTE1(a,b) a##b
 #define HB_PASTE(a,b) HB_PASTE1(a,b)
 
@@ -255,8 +268,8 @@ extern "C" void  hb_free_impl(void *ptr)
 #endif
 
 #if defined(__OPTIMIZE__) && hb_has_builtin(__builtin_expect)
-#define likely(expr) (__builtin_expect (!!(expr), 1))
-#define unlikely(expr) (__builtin_expect (!!(expr), 0))
+#define likely(expr) __builtin_expect (bool(expr), 1)
+#define unlikely(expr) __builtin_expect (bool(expr), 0)
 #else
 #define likely(expr) (expr)
 #define unlikely(expr) (expr)
@@ -315,6 +328,14 @@ extern "C" void  hb_free_impl(void *ptr)
 #define __restrict
 #endif
 
+#ifndef HB_ALWAYS_INLINE
+#if defined(_MSC_VER)
+#define HB_ALWAYS_INLINE __forceinline
+#else
+#define HB_ALWAYS_INLINE __attribute__((always_inline)) inline
+#endif
+#endif
+
 /*
  * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411
  * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/CMakeLists.txt 5.15.17+dfsg-1/src/3rdparty/libjpeg/CMakeLists.txt
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/CMakeLists.txt	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/CMakeLists.txt	2024-11-20 13:56:33.000000000 +0000
@@ -61,7 +61,8 @@ set(JPEG_SOURCES
     src/jerror.c
     src/jfdctflt.c
     src/jmemmgr.c
-    src/jmemnobs.c)
+    src/jmemnobs.c
+    src/jpeg_nbits.c)
 
 qt_internal_add_3rdparty_library(BundledLibjpeg16bits
     STATIC
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/COPYRIGHT.txt 5.15.17+dfsg-1/src/3rdparty/libjpeg/COPYRIGHT.txt
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/COPYRIGHT.txt	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/COPYRIGHT.txt	2024-11-20 13:56:33.000000000 +0000
@@ -1,4 +1,4 @@
-Copyright (C) 2009-2023 D. R. Commander
+Copyright (C) 2009-2024 D. R. Commander
 Copyright (C) 2015, 2020 Google, Inc.
 Copyright (C) 2019-2020 Arm Limited
 Copyright (C) 2015-2016, 2018 Matthieu Darbois
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/common.pri 5.15.17+dfsg-1/src/3rdparty/libjpeg/common.pri
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/common.pri	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/common.pri	2024-11-20 13:56:33.000000000 +0000
@@ -78,6 +78,7 @@ JPEG_SOURCES = \
     $$PWD/src/jerror.c \
     $$PWD/src/jfdctflt.c \
     $$PWD/src/jmemmgr.c \
-    $$PWD/src/jmemnobs.c
+    $$PWD/src/jmemnobs.c \
+    $$PWD/src/jpeg_nbits.c
 
 TR_EXCLUDE += $$PWD/*
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/import_from_libjpeg_tarball.sh 5.15.17+dfsg-1/src/3rdparty/libjpeg/import_from_libjpeg_tarball.sh
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/import_from_libjpeg_tarball.sh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/import_from_libjpeg_tarball.sh	2024-11-20 13:56:33.000000000 +0000
@@ -160,7 +160,7 @@ FILES="
    jmemnobs.c
    jmemsys.h
    jmorecfg.h
-   jpeg_nbits_table.h
+   jpeg_nbits.h
    jquant1.c
    jquant2.c
    jsamplecomp.h
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/libmain/libmain.pro 5.15.17+dfsg-1/src/3rdparty/libjpeg/libmain/libmain.pro
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/libmain/libmain.pro	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/libmain/libmain.pro	2024-11-20 13:56:33.000000000 +0000
@@ -13,7 +13,7 @@ include($$PWD/../common.pri)
 SOURCES = $$JPEG_SOURCES
 
 objdir = $$OBJECTS_DIR
-android {
+android:!single_android_abi {
     objdir = $$objdir/$${QT_ARCH}
 }
 windows|qtConfig(debug_and_release) {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/qt_attribution.json 5.15.17+dfsg-1/src/3rdparty/libjpeg/qt_attribution.json
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/qt_attribution.json	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/qt_attribution.json	2024-11-20 13:56:33.000000000 +0000
@@ -6,8 +6,8 @@
 
     "Description": "The Independent JPEG Group's JPEG software",
     "Homepage": "http://libjpeg-turbo.virtualgl.org/",
-    "Version": "3.0.0",
-    "DownloadLocation": "https://sourceforge.net/projects/libjpeg-turbo/files/3.0.0/libjpeg-turbo-3.0.0.tar.gz",
+    "Version": "3.0.2",
+    "DownloadLocation": "https://github.com/libjpeg-turbo/libjpeg-turbo/releases/download/3.0.2/libjpeg-turbo-3.0.2.tar.gz",
     "License": "Independent JPEG Group License and BSD 3-Clause \"New\" or \"Revised\" License and zlib License",
     "LicenseId": "IJG AND BSD-3-Clause AND Zlib",
     "LicenseFiles": [ "LICENSE", "ijg-license.txt", "zlib-license.txt"],
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/ChangeLog.md 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/ChangeLog.md
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/ChangeLog.md	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/ChangeLog.md	2024-11-20 13:56:33.000000000 +0000
@@ -1,3 +1,59 @@
+3.0.2
+=====
+
+### Significant changes relative to 3.0.1:
+
+1. Fixed a signed integer overflow in the `tj3CompressFromYUV8()`,
+`tj3DecodeYUV8()`, `tj3DecompressToYUV8()`, and `tj3EncodeYUV8()` functions,
+detected by the Clang and GCC undefined behavior sanitizers, that could be
+triggered by setting the `align` parameter to an unreasonably large value.
+This issue did not pose a security threat, but removing the warning made it
+easier to detect actual security issues, should they arise in the future.
+
+2. Introduced a new parameter (`TJPARAM_MAXMEMORY` in the TurboJPEG C API and
+`TJ.PARAM_MAXMEMORY` in the TurboJPEG Java API) and a corresponding TJBench
+option (`-maxmemory`) for specifying the maximum amount of memory (in
+megabytes) that will be allocated for intermediate buffers, which are used with
+progressive JPEG compression and decompression, optimized baseline entropy
+coding, lossless JPEG compression, and lossless transformation.  The new
+parameter and option serve the same purpose as the `max_memory_to_use` field in
+the `jpeg_memory_mgr` struct in the libjpeg API, the `JPEGMEM` environment
+variable, and the cjpeg/djpeg/jpegtran `-maxmemory` option.
+
+3. Introduced a new parameter (`TJPARAM_MAXPIXELS` in the TurboJPEG C API and
+`TJ.PARAM_MAXPIXELS` in the TurboJPEG Java API) and a corresponding TJBench
+option (`-maxpixels`) for specifying the maximum number of pixels that the
+decompression, lossless transformation, and packed-pixel image loading
+functions/methods will process.
+
+4. Fixed an error ("Unsupported color conversion request") that occurred when
+attempting to decompress a 3-component lossless JPEG image without an Adobe
+APP14 marker.  The decompressor now assumes that a 3-component lossless JPEG
+image without an Adobe APP14 marker uses the RGB colorspace if its component
+IDs are 1, 2, and 3.
+
+
+3.0.1
+=====
+
+### Significant changes relative to 3.0.0:
+
+1. The x86-64 SIMD functions now use a standard stack frame, prologue, and
+epilogue so that debuggers and profilers can reliably capture backtraces from
+within the functions.
+
+2. Fixed two minor issues in the interblock smoothing algorithm that caused
+mathematical (but not necessarily perceptible) edge block errors when
+decompressing progressive JPEG images exactly two MCU blocks in width or that
+use vertical chrominance subsampling.
+
+3. Fixed a regression introduced by 3.0 beta2[6] that, in rare cases, caused
+the C Huffman encoder (which is not used by default on x86 and Arm CPUs) to
+generate incorrect results if the Neon SIMD extensions were explicitly disabled
+at build time (by setting the `WITH_SIMD` CMake variable to `0`) in an AArch64
+build of libjpeg-turbo.
+
+
 3.0.0
 =====
 
@@ -398,9 +454,9 @@ transform a specially-crafted malformed
 
 ### Significant changes relative to 2.1 beta1:
 
-1. Fixed a regression introduced by 2.1 beta1[6(b)] whereby attempting to
-decompress certain progressive JPEG images with one or more component planes of
-width 8 or less caused a buffer overrun.
+1. Fixed a regression (CVE-2021-29390) introduced by 2.1 beta1[6(b)] whereby
+attempting to decompress certain progressive JPEG images with one or more
+component planes of width 8 or less caused a buffer overrun.
 
 2. Fixed a regression introduced by 2.1 beta1[6(b)] whereby attempting to
 decompress a specially-crafted malformed progressive JPEG image caused the
@@ -2125,7 +2181,7 @@ and unit tests now work on those archite
 0.0.93
 ======
 
-### Significant changes since 0.0.91:
+### Significant changes relative to 0.0.91:
 
 1. 2982659: Fixed x86-64 build on FreeBSD systems
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/README.md 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/README.md
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/README.md	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/README.md	2024-11-20 13:56:33.000000000 +0000
@@ -21,11 +21,28 @@ derivative of libjpeg v6b developed by M
 VirtualGL projects made numerous enhancements to the codec in 2009, and in
 early 2010, libjpeg-turbo spun off into an independent project, with the goal
 of making high-speed JPEG compression/decompression technology available to a
-broader range of users and developers.
+broader range of users and developers.  libjpeg-turbo is an ISO/IEC and ITU-T
+reference implementation of the JPEG standard.
 
 More information about libjpeg-turbo can be found at
 <https://libjpeg-turbo.org>.
 
+
+Funding
+=======
+
+libjpeg-turbo is an independent open source project, but we rely on patronage
+and funded development in order to maintain that independence.  The easiest way
+to ensure that libjpeg-turbo remains community-focused and free of any one
+organization's agenda is to
+[sponsor our project through GitHub](https://github.com/sponsors/libjpeg-turbo).
+All sponsorship money goes directly toward funding the labor necessary to
+maintain libjpeg-turbo, support the user community, and implement bug fixes and
+strategically important features.
+
+[![Sponsor libjpeg-turbo](https://img.shields.io/github/sponsors/libjpeg-turbo?label=Sponsor&logo=GitHub)](https://github.com/sponsors/libjpeg-turbo)
+
+
 License
 =======
 
@@ -266,30 +283,35 @@ Mathematical Compatibility
 ==========================
 
 For the most part, libjpeg-turbo should produce identical output to libjpeg
-v6b.  The one exception to this is when using the floating point DCT/IDCT, in
-which case the outputs of libjpeg v6b and libjpeg-turbo can differ for the
-following reasons:
-
-- The SSE/SSE2 floating point DCT implementation in libjpeg-turbo is ever so
-  slightly more accurate than the implementation in libjpeg v6b, but not by
-  any amount perceptible to human vision (generally in the range of 0.01 to
-  0.08 dB gain in PNSR.)
-
-- When not using the SIMD extensions, libjpeg-turbo uses the more accurate
-  (and slightly faster) floating point IDCT algorithm introduced in libjpeg
-  v8a as opposed to the algorithm used in libjpeg v6b.  It should be noted,
-  however, that this algorithm basically brings the accuracy of the floating
-  point IDCT in line with the accuracy of the accurate integer IDCT.  The
-  floating point DCT/IDCT algorithms are mainly a legacy feature, and they do
-  not produce significantly more accuracy than the accurate integer algorithms
-  (to put numbers on this, the typical difference in PNSR between the two
-  algorithms is less than 0.10 dB, whereas changing the quality level by 1 in
-  the upper range of the quality scale is typically more like a 1.0 dB
-  difference.)
-
-- If the floating point algorithms in libjpeg-turbo are not implemented using
-  SIMD instructions on a particular platform, then the accuracy of the
-  floating point DCT/IDCT can depend on the compiler settings.
+v6b.  There are two exceptions:
+
+1. When decompressing a JPEG image that uses 4:4:0 chrominance subsampling, the
+outputs of libjpeg v6b and libjpeg-turbo can differ because libjpeg-turbo
+implements a "fancy" (smooth) 4:4:0 upsampling algorithm and libjpeg did not.
+
+2. When using the floating point DCT/IDCT, the outputs of libjpeg v6b and
+libjpeg-turbo can differ for the following reasons:
+
+    - The SSE/SSE2 floating point DCT implementation in libjpeg-turbo is ever
+      so slightly more accurate than the implementation in libjpeg v6b, but not
+      by any amount perceptible to human vision (generally in the range of 0.01
+      to 0.08 dB gain in PNSR.)
+
+    - When not using the SIMD extensions, libjpeg-turbo uses the more accurate
+      (and slightly faster) floating point IDCT algorithm introduced in libjpeg
+      v8a as opposed to the algorithm used in libjpeg v6b.  It should be noted,
+      however, that this algorithm basically brings the accuracy of the
+      floating point IDCT in line with the accuracy of the accurate integer
+      IDCT.  The floating point DCT/IDCT algorithms are mainly a legacy
+      feature, and they do not produce significantly more accuracy than the
+      accurate integer algorithms.  (To put numbers on this, the typical
+      difference in PNSR between the two algorithms is less than 0.10 dB,
+      whereas changing the quality level by 1 in the upper range of the quality
+      scale is typically more like a 1.0 dB difference.)
+
+    - If the floating point algorithms in libjpeg-turbo are not implemented
+      using SIMD instructions on a particular platform, then the accuracy of
+      the floating point DCT/IDCT can depend on the compiler settings.
 
 While libjpeg-turbo does emulate the libjpeg v8 API/ABI, under the hood it is
 still using the same algorithms as libjpeg v6b, so there are several specific
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jchuff.c 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jchuff.c
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jchuff.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jchuff.c	2024-11-20 13:56:33.000000000 +0000
@@ -6,7 +6,7 @@
  * Lossless JPEG Modifications:
  * Copyright (C) 1999, Ken Murchison.
  * libjpeg-turbo Modifications:
- * Copyright (C) 2009-2011, 2014-2016, 2018-2023, D. R. Commander.
+ * Copyright (C) 2009-2011, 2014-2016, 2018-2024, D. R. Commander.
  * Copyright (C) 2015, Matthieu Darbois.
  * Copyright (C) 2018, Matthias Räncker.
  * Copyright (C) 2020, Arm Limited.
@@ -35,41 +35,7 @@
 #include "jchuff.h"             /* Declarations shared with jc*huff.c */
 #endif
 #include <limits.h>
-
-/*
- * NOTE: If USE_CLZ_INTRINSIC is defined, then clz/bsr instructions will be
- * used for bit counting rather than the lookup table.  This will reduce the
- * memory footprint by 64k, which is important for some mobile applications
- * that create many isolated instances of libjpeg-turbo (web browsers, for
- * instance.)  This may improve performance on some mobile platforms as well.
- * This feature is enabled by default only on Arm processors, because some x86
- * chips have a slow implementation of bsr, and the use of clz/bsr cannot be
- * shown to have a significant performance impact even on the x86 chips that
- * have a fast implementation of it.  When building for Armv6, you can
- * explicitly disable the use of clz/bsr by adding -mthumb to the compiler
- * flags (this defines __thumb__).
- */
-
-/* NOTE: Both GCC and Clang define __GNUC__ */
-#if (defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))) || \
-    defined(_M_ARM) || defined(_M_ARM64)
-#if !defined(__thumb__) || defined(__thumb2__)
-#define USE_CLZ_INTRINSIC
-#endif
-#endif
-
-#ifdef USE_CLZ_INTRINSIC
-#if defined(_MSC_VER) && !defined(__clang__)
-#define JPEG_NBITS_NONZERO(x)  (32 - _CountLeadingZeros(x))
-#else
-#define JPEG_NBITS_NONZERO(x)  (32 - __builtin_clz(x))
-#endif
-#define JPEG_NBITS(x)          (x ? JPEG_NBITS_NONZERO(x) : 0)
-#else
-#include "jpeg_nbits_table.h"
-#define JPEG_NBITS(x)          (jpeg_nbits_table[x])
-#define JPEG_NBITS_NONZERO(x)  JPEG_NBITS(x)
-#endif
+#include "jpeg_nbits.h"
 
 
 /* Expanded entropy encoder object for Huffman encoding.
@@ -108,7 +74,9 @@ typedef bit_buf_type simd_bit_buf_type;
 typedef struct {
   union {
     bit_buf_type c;
+#ifdef WITH_SIMD
     simd_bit_buf_type simd;
+#endif
   } put_buffer;                         /* current bit accumulation buffer */
   int free_bits;                        /* # of bits available in it */
                                         /* (Neon GAS: # of bits now in it) */
@@ -133,7 +101,9 @@ typedef struct {
   long *ac_count_ptrs[NUM_HUFF_TBLS];
 #endif
 
+#ifdef WITH_SIMD
   int simd;
+#endif
 } huff_entropy_encoder;
 
 typedef huff_entropy_encoder *huff_entropy_ptr;
@@ -147,7 +117,9 @@ typedef struct {
   size_t free_in_buffer;        /* # of byte spaces remaining in buffer */
   savable_state cur;            /* Current bit buffer & DC state */
   j_compress_ptr cinfo;         /* dump_buffer needs access to this */
+#ifdef WITH_SIMD
   int simd;
+#endif
 } working_state;
 
 
@@ -511,6 +483,7 @@ flush_bits(working_state *state)
   simd_bit_buf_type put_buffer;  int put_bits;
   int localbuf = 0;
 
+#ifdef WITH_SIMD
   if (state->simd) {
 #if defined(__aarch64__) && !defined(NEON_INTRINSICS)
     put_bits = state->cur.free_bits;
@@ -518,7 +491,9 @@ flush_bits(working_state *state)
     put_bits = SIMD_BIT_BUF_SIZE - state->cur.free_bits;
 #endif
     put_buffer = state->cur.put_buffer.simd;
-  } else {
+  } else
+#endif
+  {
     put_bits = BIT_BUF_SIZE - state->cur.free_bits;
     put_buffer = state->cur.put_buffer.c;
   }
@@ -536,6 +511,7 @@ flush_bits(working_state *state)
     EMIT_BYTE(temp)
   }
 
+#ifdef WITH_SIMD
   if (state->simd) {                    /* and reset bit buffer to empty */
     state->cur.put_buffer.simd = 0;
 #if defined(__aarch64__) && !defined(NEON_INTRINSICS)
@@ -543,7 +519,9 @@ flush_bits(working_state *state)
 #else
     state->cur.free_bits = SIMD_BIT_BUF_SIZE;
 #endif
-  } else {
+  } else
+#endif
+  {
     state->cur.put_buffer.c = 0;
     state->cur.free_bits = BIT_BUF_SIZE;
   }
@@ -719,7 +697,9 @@ encode_mcu_huff(j_compress_ptr cinfo, JB
   state.free_in_buffer = cinfo->dest->free_in_buffer;
   state.cur = entropy->saved;
   state.cinfo = cinfo;
+#ifdef WITH_SIMD
   state.simd = entropy->simd;
+#endif
 
   /* Emit restart marker if needed */
   if (cinfo->restart_interval) {
@@ -792,7 +772,9 @@ finish_pass_huff(j_compress_ptr cinfo)
   state.free_in_buffer = cinfo->dest->free_in_buffer;
   state.cur = entropy->saved;
   state.cinfo = cinfo;
+#ifdef WITH_SIMD
   state.simd = entropy->simd;
+#endif
 
   /* Flush out the last data */
   if (!flush_bits(&state))
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jconfig.h 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jconfig.h
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jconfig.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jconfig.h	2024-11-20 13:56:33.000000000 +0000
@@ -2,9 +2,9 @@
 
 #define JPEG_LIB_VERSION 80
 
-#define LIBJPEG_TURBO_VERSION 3.0.0
+#define LIBJPEG_TURBO_VERSION 3.0.2
 
-#define LIBJPEG_TURBO_VERSION_NUMBER 3000000
+#define LIBJPEG_TURBO_VERSION_NUMBER 3000002
 
 #define C_ARITH_CODING_SUPPORTED 1
 
@@ -17,3 +17,4 @@
 #endif
 
 #define NO_PUTENV
+
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jconfigint.h 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jconfigint.h
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jconfigint.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jconfigint.h	2024-11-20 13:56:33.000000000 +0000
@@ -4,11 +4,13 @@
 
 #define BUILD ""
 
+#define HIDDEN
+
 #define INLINE inline
 
 #define PACKAGE_NAME "libjpeg-turbo"
 
-#define VERSION "3.0.0"
+#define VERSION "3.0.2"
 
 #if SIZE_MAX == 0xffffffff
 #define SIZEOF_SIZE_T 4
@@ -46,3 +48,4 @@
 /* #undef WITH_SIMD */
 
 #endif
+
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jconfigint.h.in 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jconfigint.h.in
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jconfigint.h.in	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jconfigint.h.in	2024-11-20 13:56:33.000000000 +0000
@@ -1,6 +1,9 @@
 /* libjpeg-turbo build number */
 #define BUILD  "@BUILD@"
 
+/* How to hide global symbols. */
+#define HIDDEN  @HIDDEN@
+
 /* Compiler's inline keyword */
 #undef inline
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jcphuff.c 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jcphuff.c
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jcphuff.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jcphuff.c	2024-11-20 13:56:33.000000000 +0000
@@ -6,7 +6,7 @@
  * Lossless JPEG Modifications:
  * Copyright (C) 1999, Ken Murchison.
  * libjpeg-turbo Modifications:
- * Copyright (C) 2011, 2015, 2018, 2021-2022, D. R. Commander.
+ * Copyright (C) 2011, 2015, 2018, 2021-2022, 2024, D. R. Commander.
  * Copyright (C) 2016, 2018, 2022, Matthieu Darbois.
  * Copyright (C) 2020, Arm Limited.
  * Copyright (C) 2021, Alex Richardson.
@@ -44,40 +44,7 @@
 
 #ifdef C_PROGRESSIVE_SUPPORTED
 
-/*
- * NOTE: If USE_CLZ_INTRINSIC is defined, then clz/bsr instructions will be
- * used for bit counting rather than the lookup table.  This will reduce the
- * memory footprint by 64k, which is important for some mobile applications
- * that create many isolated instances of libjpeg-turbo (web browsers, for
- * instance.)  This may improve performance on some mobile platforms as well.
- * This feature is enabled by default only on Arm processors, because some x86
- * chips have a slow implementation of bsr, and the use of clz/bsr cannot be
- * shown to have a significant performance impact even on the x86 chips that
- * have a fast implementation of it.  When building for Armv6, you can
- * explicitly disable the use of clz/bsr by adding -mthumb to the compiler
- * flags (this defines __thumb__).
- */
-
-/* NOTE: Both GCC and Clang define __GNUC__ */
-#if (defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))) || \
-    defined(_M_ARM) || defined(_M_ARM64)
-#if !defined(__thumb__) || defined(__thumb2__)
-#define USE_CLZ_INTRINSIC
-#endif
-#endif
-
-#ifdef USE_CLZ_INTRINSIC
-#if defined(_MSC_VER) && !defined(__clang__)
-#define JPEG_NBITS_NONZERO(x)  (32 - _CountLeadingZeros(x))
-#else
-#define JPEG_NBITS_NONZERO(x)  (32 - __builtin_clz(x))
-#endif
-#define JPEG_NBITS(x)          (x ? JPEG_NBITS_NONZERO(x) : 0)
-#else
-#include "jpeg_nbits_table.h"
-#define JPEG_NBITS(x)          (jpeg_nbits_table[x])
-#define JPEG_NBITS_NONZERO(x)  JPEG_NBITS(x)
-#endif
+#include "jpeg_nbits.h"
 
 
 /* Expanded entropy encoder object for progressive Huffman encoding. */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jdapimin.c 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jdapimin.c
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jdapimin.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jdapimin.c	2024-11-20 13:56:33.000000000 +0000
@@ -6,7 +6,7 @@
  * Lossless JPEG Modifications:
  * Copyright (C) 1999, Ken Murchison.
  * libjpeg-turbo Modifications:
- * Copyright (C) 2016, 2022, D. R. Commander.
+ * Copyright (C) 2016, 2022, 2024, D. R. Commander.
  * For conditions of distribution and use, see the accompanying README.ijg
  * file.
  *
@@ -160,9 +160,12 @@ default_decompress_parms(j_decompress_pt
       int cid1 = cinfo->comp_info[1].component_id;
       int cid2 = cinfo->comp_info[2].component_id;
 
-      if (cid0 == 1 && cid1 == 2 && cid2 == 3)
-        cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */
-      else if (cid0 == 82 && cid1 == 71 && cid2 == 66)
+      if (cid0 == 1 && cid1 == 2 && cid2 == 3) {
+        if (cinfo->master->lossless)
+          cinfo->jpeg_color_space = JCS_RGB; /* assume RGB w/out marker */
+        else
+          cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */
+      } else if (cid0 == 82 && cid1 == 71 && cid2 == 66)
         cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */
       else {
         TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jdcoefct.c 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jdcoefct.c
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jdcoefct.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jdcoefct.c	2024-11-20 13:56:33.000000000 +0000
@@ -5,7 +5,7 @@
  * Copyright (C) 1994-1997, Thomas G. Lane.
  * libjpeg-turbo Modifications:
  * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
- * Copyright (C) 2010, 2015-2016, 2019-2020, 2022, D. R. Commander.
+ * Copyright (C) 2010, 2015-2016, 2019-2020, 2022-2023, D. R. Commander.
  * Copyright (C) 2015, 2020, Google, Inc.
  * For conditions of distribution and use, see the accompanying README.ijg
  * file.
@@ -431,7 +431,8 @@ decompress_smooth_data(j_decompress_ptr
   my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
   JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
   JDIMENSION block_num, last_block_column;
-  int ci, block_row, block_rows, access_rows;
+  int ci, block_row, block_rows, access_rows, image_block_row,
+    image_block_rows;
   JBLOCKARRAY buffer;
   JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
   JBLOCKROW next_block_row, next_next_block_row;
@@ -497,6 +498,7 @@ decompress_smooth_data(j_decompress_ptr
          (JDIMENSION)access_rows, FALSE);
       buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
     } else if (cinfo->output_iMCU_row > 0) {
+      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
       buffer = (*cinfo->mem->access_virt_barray)
         ((j_common_ptr)cinfo, coef->whole_image[ci],
          (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
@@ -539,29 +541,30 @@ decompress_smooth_data(j_decompress_ptr
     inverse_DCT = cinfo->idct->_inverse_DCT[ci];
     output_ptr = output_buf[ci];
     /* Loop over all DCT blocks to be processed. */
+    image_block_rows = block_rows * cinfo->total_iMCU_rows;
     for (block_row = 0; block_row < block_rows; block_row++) {
+      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
       buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
 
-      if (block_row > 0 || cinfo->output_iMCU_row > 0)
+      if (image_block_row > 0)
         prev_block_row =
           buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
       else
         prev_block_row = buffer_ptr;
 
-      if (block_row > 1 || cinfo->output_iMCU_row > 1)
+      if (image_block_row > 1)
         prev_prev_block_row =
           buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
       else
         prev_prev_block_row = prev_block_row;
 
-      if (block_row < block_rows - 1 || cinfo->output_iMCU_row < last_iMCU_row)
+      if (image_block_row < image_block_rows - 1)
         next_block_row =
           buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
       else
         next_block_row = buffer_ptr;
 
-      if (block_row < block_rows - 2 ||
-          cinfo->output_iMCU_row + 1 < last_iMCU_row)
+      if (image_block_row < image_block_rows - 2)
         next_next_block_row =
           buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
       else
@@ -584,11 +587,11 @@ decompress_smooth_data(j_decompress_ptr
         /* Update DC values */
         if (block_num == cinfo->master->first_MCU_col[ci] &&
             block_num < last_block_column) {
-          DC04 = (int)prev_prev_block_row[1][0];
-          DC09 = (int)prev_block_row[1][0];
-          DC14 = (int)buffer_ptr[1][0];
-          DC19 = (int)next_block_row[1][0];
-          DC24 = (int)next_next_block_row[1][0];
+          DC04 = DC05 = (int)prev_prev_block_row[1][0];
+          DC09 = DC10 = (int)prev_block_row[1][0];
+          DC14 = DC15 = (int)buffer_ptr[1][0];
+          DC19 = DC20 = (int)next_block_row[1][0];
+          DC24 = DC25 = (int)next_next_block_row[1][0];
         }
         if (block_num + 1 < last_block_column) {
           DC05 = (int)prev_prev_block_row[2][0];
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jerror.h 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jerror.h
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jerror.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jerror.h	2024-11-20 13:56:33.000000000 +0000
@@ -7,7 +7,7 @@
  * Lossless JPEG Modifications:
  * Copyright (C) 1999, Ken Murchison.
  * libjpeg-turbo Modifications:
- * Copyright (C) 2014, 2017, 2021-2022, D. R. Commander.
+ * Copyright (C) 2014, 2017, 2021-2023, D. R. Commander.
  * For conditions of distribution and use, see the accompanying README.ijg
  * file.
  *
@@ -111,7 +111,7 @@ JMESSAGE(JERR_NOT_COMPILED, "Requested f
 #if JPEG_LIB_VERSION >= 70
 JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined")
 #endif
-JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported")
+JMESSAGE(JERR_NO_BACKING_STORE, "Memory limit exceeded")
 JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined")
 JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image")
 JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined")
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jmemsys.h 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jmemsys.h
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jmemsys.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jmemsys.h	2024-11-20 13:56:33.000000000 +0000
@@ -99,24 +99,6 @@ EXTERN(size_t) jpeg_mem_available(j_comm
 #define TEMP_NAME_LENGTH   64   /* max length of a temporary file's name */
 
 
-#ifdef USE_MSDOS_MEMMGR         /* DOS-specific junk */
-
-typedef unsigned short XMSH;    /* type of extended-memory handles */
-typedef unsigned short EMSH;    /* type of expanded-memory handles */
-
-typedef union {
-  short file_handle;            /* DOS file handle if it's a temp file */
-  XMSH xms_handle;              /* handle if it's a chunk of XMS */
-  EMSH ems_handle;              /* handle if it's a chunk of EMS */
-} handle_union;
-
-#endif /* USE_MSDOS_MEMMGR */
-
-#ifdef USE_MAC_MEMMGR           /* Mac-specific junk */
-#include <Files.h>
-#endif /* USE_MAC_MEMMGR */
-
-
 typedef struct backing_store_struct *backing_store_ptr;
 
 typedef struct backing_store_struct {
@@ -130,22 +112,9 @@ typedef struct backing_store_struct {
   void (*close_backing_store) (j_common_ptr cinfo, backing_store_ptr info);
 
   /* Private fields for system-dependent backing-store management */
-#ifdef USE_MSDOS_MEMMGR
-  /* For the MS-DOS manager (jmemdos.c), we need: */
-  handle_union handle;          /* reference to backing-store storage object */
-  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
-#else
-#ifdef USE_MAC_MEMMGR
-  /* For the Mac manager (jmemmac.c), we need: */
-  short temp_file;              /* file reference number to temp file */
-  FSSpec tempSpec;              /* the FSSpec for the temp file */
-  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
-#else
   /* For a typical implementation with temp files, we need: */
   FILE *temp_file;              /* stdio reference to temp file */
   char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */
-#endif
-#endif
 } backing_store_info;
 
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jpeg_nbits.c 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jpeg_nbits.c
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jpeg_nbits.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jpeg_nbits.c	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,4134 @@
+/*
+ * Copyright (C) 2024, D. R. Commander.
+ *
+ * For conditions of distribution and use, see the accompanying README.ijg
+ * file.
+ */
+
+#include "jpeg_nbits.h"
+#include "jconfigint.h"
+
+
+#ifndef USE_CLZ_INTRINSIC
+
+#define INCLUDE_JPEG_NBITS_TABLE
+
+/* When building for x86[-64] with the SIMD extensions enabled, the C Huffman
+ * encoders can reuse jpeg_nbits_table from the SSE2 baseline Huffman encoder.
+ */
+#if (defined(__x86_64__) || defined(__i386__) || defined(_M_IX86) || \
+     defined(_M_X64)) && defined(WITH_SIMD)
+#undef INCLUDE_JPEG_NBITS_TABLE
+#endif
+
+#endif
+
+
+#ifdef INCLUDE_JPEG_NBITS_TABLE
+
+const unsigned char HIDDEN jpeg_nbits_table[65536] = {
+   0,  1,  2,  2,  3,  3,  3,  3,  4,  4,  4,  4,  4,  4,  4,  4,
+   5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+   6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+   6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+   7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+   7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+   7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+   7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16
+};
+
+#else
+
+/* Suppress compiler warnings about empty translation unit. */
+
+typedef int dummy_jpeg_nbits_table;
+
+#endif
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jpeg_nbits.h 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jpeg_nbits.h
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jpeg_nbits.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jpeg_nbits.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2014, 2021, 2024, D. R. Commander.
+ * Copyright (C) 2014, Olle Liljenzin.
+ * Copyright (C) 2020, Arm Limited.
+ *
+ * For conditions of distribution and use, see the accompanying README.ijg
+ * file.
+ */
+
+/*
+ * NOTE: If USE_CLZ_INTRINSIC is defined, then clz/bsr instructions will be
+ * used for bit counting rather than the lookup table.  This will reduce the
+ * memory footprint by 64k, which is important for some mobile applications
+ * that create many isolated instances of libjpeg-turbo (web browsers, for
+ * instance.)  This may improve performance on some mobile platforms as well.
+ * This feature is enabled by default only on Arm processors, because some x86
+ * chips have a slow implementation of bsr, and the use of clz/bsr cannot be
+ * shown to have a significant performance impact even on the x86 chips that
+ * have a fast implementation of it.  When building for Armv6, you can
+ * explicitly disable the use of clz/bsr by adding -mthumb to the compiler
+ * flags (this defines __thumb__).
+ */
+
+/* NOTE: Both GCC and Clang define __GNUC__ */
+#if (defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))) || \
+    defined(_M_ARM) || defined(_M_ARM64)
+#if !defined(__thumb__) || defined(__thumb2__)
+#define USE_CLZ_INTRINSIC
+#endif
+#endif
+
+#ifdef USE_CLZ_INTRINSIC
+#if defined(_MSC_VER) && !defined(__clang__)
+#define JPEG_NBITS_NONZERO(x)  (32 - _CountLeadingZeros(x))
+#else
+#define JPEG_NBITS_NONZERO(x)  (32 - __builtin_clz(x))
+#endif
+#define JPEG_NBITS(x)          (x ? JPEG_NBITS_NONZERO(x) : 0)
+#else
+extern const unsigned char jpeg_nbits_table[65536];
+#define JPEG_NBITS(x)          (jpeg_nbits_table[x])
+#define JPEG_NBITS_NONZERO(x)  JPEG_NBITS(x)
+#endif
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jpeg_nbits_table.h 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jpeg_nbits_table.h
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jpeg_nbits_table.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jpeg_nbits_table.h	1970-01-01 00:00:00.000000000 +0000
@@ -1,4098 +0,0 @@
-static const unsigned char jpeg_nbits_table[65536] = {
-   0,  1,  2,  2,  3,  3,  3,  3,  4,  4,  4,  4,  4,  4,  4,  4,
-   5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
-   6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-   6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-   7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-   7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-   7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-   7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16
-};
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jpeglib.h 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jpeglib.h
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jpeglib.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jpeglib.h	2024-11-20 13:56:33.000000000 +0000
@@ -7,7 +7,8 @@
  * Lossless JPEG Modifications:
  * Copyright (C) 1999, Ken Murchison.
  * libjpeg-turbo Modifications:
- * Copyright (C) 2009-2011, 2013-2014, 2016-2017, 2020, 2022, D. R. Commander.
+ * Copyright (C) 2009-2011, 2013-2014, 2016-2017, 2020, 2022-2023,
+             D. R. Commander.
  * Copyright (C) 2015, Google, Inc.
  * For conditions of distribution and use, see the accompanying README.ijg
  * file.
@@ -270,7 +271,8 @@ typedef enum {
   JCS_EXT_BGRA,           /* blue/green/red/alpha */
   JCS_EXT_ABGR,           /* alpha/blue/green/red */
   JCS_EXT_ARGB,           /* alpha/red/green/blue */
-  JCS_RGB565              /* 5-bit red/6-bit green/5-bit blue */
+  JCS_RGB565              /* 5-bit red/6-bit green/5-bit blue
+                             [decompression only] */
 } J_COLOR_SPACE;
 
 /* DCT/IDCT algorithm options. */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jversion.h 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jversion.h
--- 5.15.15+dfsg-2/src/3rdparty/libjpeg/src/jversion.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libjpeg/src/jversion.h	2024-11-20 13:56:33.000000000 +0000
@@ -4,7 +4,7 @@
  * This file was part of the Independent JPEG Group's software:
  * Copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding.
  * libjpeg-turbo Modifications:
- * Copyright (C) 2010, 2012-2023, D. R. Commander.
+ * Copyright (C) 2010, 2012-2024, D. R. Commander.
  * For conditions of distribution and use, see the accompanying README.ijg
  * file.
  *
@@ -37,7 +37,7 @@
  */
 
 #define JCOPYRIGHT \
-  "Copyright (C) 2009-2023 D. R. Commander\n" \
+  "Copyright (C) 2009-2024 D. R. Commander\n" \
   "Copyright (C) 2015, 2020 Google, Inc.\n" \
   "Copyright (C) 2019-2020 Arm Limited\n" \
   "Copyright (C) 2015-2016, 2018 Matthieu Darbois\n" \
@@ -52,4 +52,4 @@
   "Copyright (C) 1991-2020 Thomas G. Lane, Guido Vollbeding"
 
 #define JCOPYRIGHT_SHORT \
-  "Copyright (C) 1991-2023 The libjpeg-turbo Project and many others"
+  "Copyright (C) 1991-2024 The libjpeg-turbo Project and many others"
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/ANNOUNCE 5.15.17+dfsg-1/src/3rdparty/libpng/ANNOUNCE
--- 5.15.15+dfsg-2/src/3rdparty/libpng/ANNOUNCE	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/ANNOUNCE	2024-11-20 13:56:33.000000000 +0000
@@ -1,5 +1,5 @@
-libpng 1.6.40 - June 21, 2023
-=============================
+libpng 1.6.43 - February 23, 2024
+=================================
 
 This is a public release of libpng, intended for use in production code.
 
@@ -9,13 +9,13 @@ Files available for download
 
 Source files with LF line endings (for Unix/Linux):
 
- * libpng-1.6.40.tar.xz (LZMA-compressed, recommended)
- * libpng-1.6.40.tar.gz
+ * libpng-1.6.43.tar.xz (LZMA-compressed, recommended)
+ * libpng-1.6.43.tar.gz (deflate-compressed)
 
 Source files with CRLF line endings (for Windows):
 
- * lpng1640.7z (LZMA-compressed, recommended)
- * lpng1640.zip
+ * lpng1643.7z (LZMA-compressed, recommended)
+ * lpng1643.zip (deflate-compressed)
 
 Other information:
 
@@ -25,15 +25,36 @@ Other information:
  * TRADEMARK.md
 
 
-Changes from version 1.6.39 to version 1.6.40
+Changes from version 1.6.42 to version 1.6.43
 ---------------------------------------------
 
- * Fixed the eXIf chunk multiplicity checks.
- * Fixed a memory leak in pCAL processing.
- * Corrected the validity report about tRNS inside png_get_valid().
- * Fixed various build issues on *BSD, Mac and Windows.
- * Updated the configurations and the scripts for continuous integration.
- * Cleaned up the code, the build scripts, and the documentation.
+ * Fixed the row width check in png_check_IHDR().
+   This corrected a bug that was specific to the 16-bit platforms,
+   and removed a spurious compiler warning from the 64-bit builds.
+   (Reported by Jacek Caban; fixed by John Bowler)
+ * Added eXIf chunk support to the push-mode reader in pngpread.c.
+   (Contributed by Chris Blume)
+ * Added contrib/pngexif for the benefit of the users who would like
+   to inspect the content of eXIf chunks.
+ * Added contrib/conftest/basic.dfa, a basic build-time configuration.
+   (Contributed by John Bowler)
+ * Fixed a preprocessor condition in pngread.c that broke build-time
+   configurations like contrib/conftest/pngcp.dfa.
+   (Contributed by John Bowler)
+ * Added CMake build support for LoongArch LSX.
+   (Contributed by GuXiWei)
+ * Fixed a CMake build error that occurred under a peculiar state of the
+   dependency tree. This was a regression introduced in libpng-1.6.41.
+   (Contributed by Dan Rosser)
+ * Marked the installed libpng headers as system headers in CMake.
+   (Contributed by Benjamin Buch)
+ * Updated the build support for RISCOS.
+   (Contributed by Cameron Cawley)
+ * Updated the makefiles to allow cross-platform builds to initialize
+   conventional make variables like AR and ARFLAGS.
+ * Added various improvements to the CI scripts in areas like version
+   consistency verification and text linting.
+ * Added version consistency verification to pngtest.c also.
 
 
 Send comments/corrections/commendations to png-mng-implement at lists.sf.net.
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/CHANGES 5.15.17+dfsg-1/src/3rdparty/libpng/CHANGES
--- 5.15.15+dfsg-2/src/3rdparty/libpng/CHANGES	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/CHANGES	2024-11-20 13:56:33.000000000 +0000
@@ -6129,6 +6129,73 @@ Version 1.6.40 [June 21, 2023]
   Updated the configurations and the scripts for continuous integration.
   Cleaned up the code, the build scripts, and the documentation.
 
+Version 1.6.41 [January 24, 2024]
+  Added SIMD-optimized code for the LoongArch LSX hardware.
+    (Contributed by GuXiWei, JinBo and ZhangLixia)
+  Fixed the run-time discovery of MIPS MSA hardware.
+    (Contributed by Sui Jingfeng)
+  Fixed an off-by-one error in the function png_do_check_palette_indexes(),
+    which failed to recognize errors that might have existed in the first
+    column of a broken palette-encoded image. This was a benign regression
+    accidentally introduced in libpng-1.6.33. No pixel was harmed.
+    (Contributed by Adam Richter; reviewed by John Bowler)
+  Fixed, improved and modernized the contrib/pngminus programs, i.e.,
+    png2pnm.c and pnm2png.c
+  Removed old and peculiar portability hacks that were meant to silence
+    warnings issued by gcc version 7.1 alone.
+    (Contributed by John Bowler)
+  Fixed and modernized the CMake file, and raised the minimum required
+    CMake version from 3.1 to 3.6.
+    (Contributed by Clinton Ingram, Timothy Lyanguzov, Tyler Kropp, et al.)
+  Allowed the configure script to disable the building of auxiliary tools
+    and tests, thus catching up with the CMake file.
+    (Contributed by Carlo Bramini)
+  Fixed a build issue on Mac.
+    (Contributed by Zixu Wang)
+  Moved the Autoconf macro files to scripts/autoconf.
+  Moved the CMake files (except for the main CMakeLists.txt) to
+    scripts/cmake and moved the list of their contributing authors to
+    scripts/cmake/AUTHORS.md
+  Updated the CI configurations and scripts.
+  Relicensed the CI scripts to the MIT License.
+  Improved the test coverage.
+    (Contributed by John Bowler)
+
+Version 1.6.42 [January 29, 2024]
+  Fixed the implementation of the macro function png_check_sig().
+    This was an API regression, introduced in libpng-1.6.41.
+    (Reported by Matthieu Darbois)
+  Fixed and updated the libpng manual.
+
+Version 1.6.43 [February 23, 2024]
+  Fixed the row width check in png_check_IHDR().
+    This corrected a bug that was specific to the 16-bit platforms,
+    and removed a spurious compiler warning from the 64-bit builds.
+    (Reported by Jacek Caban; fixed by John Bowler)
+  Added eXIf chunk support to the push-mode reader in pngpread.c.
+    (Contributed by Chris Blume)
+  Added contrib/pngexif for the benefit of the users who would like
+    to inspect the content of eXIf chunks.
+  Added contrib/conftest/basic.dfa, a basic build-time configuration.
+    (Contributed by John Bowler)
+  Fixed a preprocessor condition in pngread.c that broke build-time
+    configurations like contrib/conftest/pngcp.dfa.
+    (Contributed by John Bowler)
+  Added CMake build support for LoongArch LSX.
+    (Contributed by GuXiWei)
+  Fixed a CMake build error that occurred under a peculiar state of the
+    dependency tree. This was a regression introduced in libpng-1.6.41.
+    (Contributed by Dan Rosser)
+  Marked the installed libpng headers as system headers in CMake.
+    (Contributed by Benjamin Buch)
+  Updated the build support for RISCOS.
+    (Contributed by Cameron Cawley)
+  Updated the makefiles to allow cross-platform builds to initialize
+    conventional make variables like AR and ARFLAGS.
+  Added various improvements to the CI scripts in areas like version
+    consistency verification and text linting.
+  Added version consistency verification to pngtest.c also.
+
 Send comments/corrections/commendations to png-mng-implement at lists.sf.net.
 Subscription is required; visit
 https://lists.sourceforge.net/lists/listinfo/png-mng-implement
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/LICENSE 5.15.17+dfsg-1/src/3rdparty/libpng/LICENSE
--- 5.15.15+dfsg-2/src/3rdparty/libpng/LICENSE	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/LICENSE	2024-11-20 13:56:33.000000000 +0000
@@ -4,8 +4,8 @@ COPYRIGHT NOTICE, DISCLAIMER, and LICENS
 PNG Reference Library License version 2
 ---------------------------------------
 
- * Copyright (c) 1995-2023 The PNG Reference Library Authors.
- * Copyright (c) 2018-2023 Cosmin Truta.
+ * Copyright (c) 1995-2024 The PNG Reference Library Authors.
+ * Copyright (c) 2018-2024 Cosmin Truta.
  * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson.
  * Copyright (c) 1996-1997 Andreas Dilger.
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/README 5.15.17+dfsg-1/src/3rdparty/libpng/README
--- 5.15.15+dfsg-2/src/3rdparty/libpng/README	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/README	2024-11-20 13:56:33.000000000 +0000
@@ -1,4 +1,4 @@
-README for libpng version 1.6.40
+README for libpng version 1.6.43
 ================================
 
 See the note about version numbers near the top of `png.h`.
@@ -142,10 +142,11 @@ Files included in this distribution
     pngwrite.c    =>  High-level write functions
     pngwtran.c    =>  Write data transformations
     pngwutil.c    =>  Write utility functions
-    arm/          =>  Optimized code for the ARM platform
-    intel/        =>  Optimized code for the INTEL-SSE2 platform
-    mips/         =>  Optimized code for the MIPS platform
-    powerpc/      =>  Optimized code for the PowerPC platform
+    arm/          =>  Optimized code for ARM Neon
+    intel/        =>  Optimized code for INTEL SSE2
+    loongarch/    =>  Optimized code for LoongArch LSX
+    mips/         =>  Optimized code for MIPS MSA and MIPS MMI
+    powerpc/      =>  Optimized code for PowerPC VSX
     ci/           =>  Scripts for continuous integration
     contrib/      =>  External contributions
         arm-neon/     =>  Optimized code for the ARM-NEON platform
@@ -158,6 +159,7 @@ Files included in this distribution
         libtests/     =>  Test programs
         oss-fuzz/     =>  Files used by the OSS-Fuzz project for fuzz-testing
                           libpng
+        pngexif/      =>  Program to inspect the EXIF information in PNG files
         pngminim/     =>  Minimal decoder, encoder, and progressive decoder
                           programs demonstrating the use of pngusr.dfa
         pngminus/     =>  Simple pnm2png and png2pnm programs
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/libpng-manual.txt 5.15.17+dfsg-1/src/3rdparty/libpng/libpng-manual.txt
--- 5.15.15+dfsg-2/src/3rdparty/libpng/libpng-manual.txt	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/libpng-manual.txt	2024-11-20 13:56:33.000000000 +0000
@@ -1,6 +1,6 @@
 libpng-manual.txt - A description on how to use and modify libpng
 
- Copyright (c) 2018-2023 Cosmin Truta
+ Copyright (c) 2018-2024 Cosmin Truta
  Copyright (c) 1998-2018 Glenn Randers-Pehrson
 
  This document is released under the libpng license.
@@ -9,9 +9,9 @@ libpng-manual.txt - A description on how
 
  Based on:
 
- libpng version 1.6.36, December 2018, through 1.6.40 - June 2023
+ libpng version 1.6.36, December 2018, through 1.6.43 - February 2024
  Updated and distributed by Cosmin Truta
- Copyright (c) 2018-2023 Cosmin Truta
+ Copyright (c) 2018-2024 Cosmin Truta
 
  libpng versions 0.97, January 1998, through 1.6.35 - July 2018
  Updated and distributed by Glenn Randers-Pehrson
@@ -357,7 +357,7 @@ Customizing libpng.
        return ERROR;
     }
 
-    is_png = !png_sig_cmp(header, 0, number);
+    is_png = (png_sig_cmp(header, 0, number) == 0);
     if (!is_png)
     {
        return NOT_PNG;
@@ -385,8 +385,7 @@ create the structure, so your applicatio
 
     if (!info_ptr)
     {
-       png_destroy_read_struct(&png_ptr,
-           (png_infopp)NULL, (png_infopp)NULL);
+       png_destroy_read_struct(&png_ptr, NULL, NULL);
        return ERROR;
     }
 
@@ -419,14 +418,13 @@ free any memory.
 
     if (setjmp(png_jmpbuf(png_ptr)))
     {
-       png_destroy_read_struct(&png_ptr, &info_ptr,
-           &end_info);
+       png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
        fclose(fp);
        return ERROR;
     }
 
-Pass (png_infopp)NULL instead of &end_info if you didn't create
-an end_info structure.
+Pass NULL instead of &end_info if you didn't create an end_info
+structure.
 
 If you would rather avoid the complexity of setjmp/longjmp issues,
 you can compile libpng with PNG_NO_SETJMP, in which case
@@ -496,7 +494,7 @@ You can set up a callback function to ha
 input stream. You must supply the function
 
     read_chunk_callback(png_structp png_ptr,
-         png_unknown_chunkp chunk);
+         png_unknown_chunkp chunk)
     {
        /* The unknown chunk structure contains your
           chunk data, along with similar data for any other
@@ -547,9 +545,9 @@ a progress meter or the like.  It's demo
 You must supply a function
 
     void read_row_callback(png_structp png_ptr,
-       png_uint_32 row, int pass);
+       png_uint_32 row, int pass)
     {
-      /* put your code here */
+       /* put your code here */
     }
 
 (You can give it another name that you like instead of "read_row_callback")
@@ -1180,22 +1178,22 @@ where row_pointers is an array of pointe
 If you know your image size and pixel size ahead of time, you can allocate
 row_pointers prior to calling png_read_png() with
 
-   if (height > PNG_UINT_32_MAX/(sizeof (png_byte)))
-      png_error (png_ptr,
+   if (height > PNG_UINT_32_MAX / (sizeof (png_bytep)))
+      png_error(png_ptr,
           "Image is too tall to process in memory");
 
-   if (width > PNG_UINT_32_MAX/pixel_size)
-      png_error (png_ptr,
+   if (width > PNG_UINT_32_MAX / pixel_size)
+      png_error(png_ptr,
           "Image is too wide to process in memory");
 
    row_pointers = png_malloc(png_ptr,
        height*(sizeof (png_bytep)));
 
-   for (int i=0; i<height, i++)
-      row_pointers[i]=NULL;  /* security precaution */
+   for (int i = 0; i < height, i++)
+      row_pointers[i] = NULL;  /* security precaution */
 
-   for (int i=0; i<height, i++)
-      row_pointers[i]=png_malloc(png_ptr,
+   for (int i = 0; i < height, i++)
+      row_pointers[i] = png_malloc(png_ptr,
           width*pixel_size);
 
    png_set_rows(png_ptr, info_ptr, &row_pointers);
@@ -1205,14 +1203,14 @@ row_pointers[i] to point into the proper
 be sure that your platform is able to allocate such a large buffer:
 
    /* Guard against integer overflow */
-   if (height > PNG_SIZE_MAX/(width*pixel_size)) {
-        png_error(png_ptr,"image_data buffer would be too large");
-   }
+   if (height > PNG_SIZE_MAX/(width*pixel_size))
+      png_error(png_ptr, "image_data buffer would be too large");
 
-   png_bytep buffer=png_malloc(png_ptr,height*width*pixel_size);
+   png_bytep buffer = png_malloc(png_ptr,
+      height*width*pixel_size);
 
-   for (int i=0; i<height, i++)
-      row_pointers[i]=buffer+i*width*pixel_size;
+   for (int i = 0; i < height, i++)
+      row_pointers[i] = buffer + i*width*pixel_size;
 
    png_set_rows(png_ptr, info_ptr, &row_pointers);
 
@@ -1465,25 +1463,24 @@ png_set_rgb_to_gray()).
                      non-paletted images (PNG_INFO_tRNS)
 
     png_get_eXIf_1(png_ptr, info_ptr, &num_exif, &exif);
-                     (PNG_INFO_eXIf)
 
     exif           - Exif profile (array of png_byte)
+                     (PNG_INFO_eXIf)
 
     png_get_hIST(png_ptr, info_ptr, &hist);
-                     (PNG_INFO_hIST)
 
     hist           - histogram of palette (array of
-                     png_uint_16)
+                     png_uint_16) (PNG_INFO_hIST)
 
     png_get_tIME(png_ptr, info_ptr, &mod_time);
 
     mod_time       - time image was last modified
-                    (PNG_VALID_tIME)
+                     (PNG_INFO_tIME)
 
     png_get_bKGD(png_ptr, info_ptr, &background);
 
     background     - background color (of type
-                     png_color_16p) (PNG_VALID_bKGD)
+                     png_color_16p) (PNG_INFO_bKGD)
                      valid 16-bit red, green and blue
                      values, regardless of color_type
 
@@ -1743,13 +1740,13 @@ grayscale images with bit depths of 2 or
 viewing application that wishes to treat all images in the same way.
 
     if (color_type == PNG_COLOR_TYPE_PALETTE)
-        png_set_palette_to_rgb(png_ptr);
+       png_set_palette_to_rgb(png_ptr);
 
-    if (png_get_valid(png_ptr, info_ptr,
-        PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr);
+    if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
+       png_set_tRNS_to_alpha(png_ptr);
 
-    if (color_type == PNG_COLOR_TYPE_GRAY &&
-        bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr);
+    if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
+       png_set_expand_gray_1_2_4_to_8(png_ptr);
 
 The first two functions are actually aliases for png_set_expand(), added
 in libpng version 1.0.4, with the function names expanded to improve code
@@ -1764,18 +1761,20 @@ png_set_expand(); however, the resultant
 Use this when the output color or gray channels are made linear to avoid fairly
 severe accuracy loss.
 
-   if (bit_depth < 16)
-      png_set_expand_16(png_ptr);
+    if (bit_depth < 16)
+       png_set_expand_16(png_ptr);
 
 PNG can have files with 16 bits per channel.  If you only can handle
 8 bits per channel, this will strip the pixels down to 8-bit.
 
     if (bit_depth == 16)
+    {
 #if PNG_LIBPNG_VER >= 10504
        png_set_scale_16(png_ptr);
 #else
        png_set_strip_16(png_ptr);
 #endif
+    }
 
 (The more accurate "png_set_scale_16()" API became available in libpng version
 1.5.4).
@@ -1901,7 +1900,7 @@ Note that png_set_filler() does not chan
 to do that, you can add a true alpha channel with
 
     if (color_type == PNG_COLOR_TYPE_RGB ||
-       color_type == PNG_COLOR_TYPE_GRAY)
+        color_type == PNG_COLOR_TYPE_GRAY)
        png_set_add_alpha(png_ptr, filler, PNG_FILLER_AFTER);
 
 where "filler" contains the alpha value to assign to each pixel.
@@ -1926,7 +1925,7 @@ with alpha.
     if (color_type == PNG_COLOR_TYPE_RGB ||
         color_type == PNG_COLOR_TYPE_RGB_ALPHA)
        png_set_rgb_to_gray(png_ptr, error_action,
-          double red_weight, double green_weight);
+          (double)red_weight, (double)green_weight);
 
     error_action = 1: silently do the conversion
 
@@ -1949,8 +1948,8 @@ In the corresponding fixed point API the
 simply scaled by 100,000:
 
     png_set_rgb_to_gray(png_ptr, error_action,
-       png_fixed_point red_weight,
-       png_fixed_point green_weight);
+       (png_fixed_point)red_weight,
+       (png_fixed_point)green_weight);
 
 If you have set error_action = 1 or 2, you can
 later check whether the image really was gray, after processing
@@ -2186,9 +2185,8 @@ do your own check for number_of_rows*wid
 a multiple-row buffer:
 
    /* Guard against integer overflow */
-   if (number_of_rows > PNG_SIZE_MAX/(width*pixel_size)) {
-        png_error(png_ptr,"image_data buffer would be too large");
-   }
+   if (number_of_rows > PNG_SIZE_MAX/(width*pixel_size))
+      png_error(png_ptr, "image_data buffer would be too large");
 
 Remember: Before you call png_read_update_info(), the png_get_*()
 functions return the values corresponding to the original PNG image.
@@ -2408,12 +2406,11 @@ separate.
 
     if (!end_info)
     {
-       png_destroy_read_struct(&png_ptr, &info_ptr,
-           (png_infopp)NULL);
+       png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
        return ERROR;
     }
 
-   png_read_end(png_ptr, end_info);
+    png_read_end(png_ptr, end_info);
 
 If you are not interested, you should still call png_read_end()
 but you can pass NULL, avoiding the need to create an end_info structure.
@@ -2421,7 +2418,7 @@ If you do this, libpng will not process
 skipping over them and perhaps (depending on whether you have called
 png_set_crc_action) checking their CRCs while looking for the IEND chunk.
 
-   png_read_end(png_ptr, (png_infop)NULL);
+   png_read_end(png_ptr, NULL);
 
 If you don't call png_read_end(), then your file pointer will be
 left pointing to the first chunk after the last IDAT, which is probably
@@ -2430,13 +2427,11 @@ the PNG datastream.
 
 When you are done, you can free all memory allocated by libpng like this:
 
-   png_destroy_read_struct(&png_ptr, &info_ptr,
-       &end_info);
+   png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
 
 or, if you didn't create an end_info structure,
 
-   png_destroy_read_struct(&png_ptr, &info_ptr,
-       (png_infopp)NULL);
+   png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
 
 It is also possible to individually free the info_ptr members that
 point to libpng-allocated storage with the following function:
@@ -2556,15 +2551,13 @@ png_infop info_ptr;
 
     if (!info_ptr)
     {
-       png_destroy_read_struct(&png_ptr,
-          (png_infopp)NULL, (png_infopp)NULL);
+       png_destroy_read_struct(&png_ptr, NULL, NULL);
        return ERROR;
     }
 
     if (setjmp(png_jmpbuf(png_ptr)))
     {
-       png_destroy_read_struct(&png_ptr, &info_ptr,
-          (png_infopp)NULL);
+       png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
        return ERROR;
     }
 
@@ -2597,8 +2590,7 @@ png_infop info_ptr;
  {
     if (setjmp(png_jmpbuf(png_ptr)))
     {
-       png_destroy_read_struct(&png_ptr, &info_ptr,
-           (png_infopp)NULL);
+       png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
        return ERROR;
     }
 
@@ -2763,8 +2755,7 @@ both "png_ptr"; you can call them anythi
     png_infop info_ptr = png_create_info_struct(png_ptr);
     if (!info_ptr)
     {
-       png_destroy_write_struct(&png_ptr,
-           (png_infopp)NULL);
+       png_destroy_write_struct(&png_ptr, NULL);
        return ERROR;
     }
 
@@ -2790,7 +2781,7 @@ section below for more information on th
 
     if (setjmp(png_jmpbuf(png_ptr)))
     {
-    png_destroy_write_struct(&png_ptr, &info_ptr);
+       png_destroy_write_struct(&png_ptr, &info_ptr);
        fclose(fp);
        return ERROR;
     }
@@ -2844,9 +2835,9 @@ a progress meter or the like.  It's demo
 You must supply a function
 
     void write_row_callback(png_structp png_ptr, png_uint_32 row,
-       int pass);
+       int pass)
     {
-      /* put your code here */
+       /* put your code here */
     }
 
 (You can give it another name that you like instead of "write_row_callback")
@@ -3116,8 +3107,8 @@ width, height, bit_depth, and color_type
 
     png_set_eXIf_1(png_ptr, info_ptr, num_exif, exif);
 
-    exif           - Exif profile (array of
-                     png_byte) (PNG_INFO_eXIf)
+    exif           - Exif profile (array of png_byte)
+                     (PNG_INFO_eXIf)
 
     png_set_hIST(png_ptr, info_ptr, hist);
 
@@ -3127,12 +3118,12 @@ width, height, bit_depth, and color_type
     png_set_tIME(png_ptr, info_ptr, mod_time);
 
     mod_time       - time image was last modified
-                     (PNG_VALID_tIME)
+                     (PNG_INFO_tIME)
 
     png_set_bKGD(png_ptr, info_ptr, background);
 
     background     - background color (of type
-                     png_color_16p) (PNG_VALID_bKGD)
+                     png_color_16p) (PNG_INFO_bKGD)
 
     png_set_text(png_ptr, info_ptr, text_ptr, num_text);
 
@@ -4218,7 +4209,7 @@ png_create_read_struct_2() or png_create
 own functions as described above.  These functions also provide a void
 pointer that can be retrieved via
 
-    mem_ptr=png_get_mem_ptr(png_ptr);
+    mem_ptr = png_get_mem_ptr(png_ptr);
 
 Your replacement memory functions must have prototypes as follows:
 
@@ -4515,7 +4506,7 @@ When PNG_DEBUG is defined but is zero, t
 can still use PNG_DEBUG to control your own debugging:
 
    #ifdef PNG_DEBUG
-       fprintf(stderr, ...
+       fprintf(stderr, ...);
    #endif
 
 When PNG_DEBUG = 1, the macros are defined, but only png_debug statements
@@ -4692,7 +4683,7 @@ deprecated since libpng-1.0.16 and libpn
 The function
     png_check_sig(sig, num)
 was replaced with
-    !png_sig_cmp(sig, 0, num)
+    png_sig_cmp(sig, 0, num) == 0
 It has been deprecated since libpng-0.90.
 
 The function
@@ -4756,8 +4747,8 @@ png_get_mmx_bitdepth_threshold(), png_ge
 png_set_asm_flags(), and png_mmx_supported()
 
 We removed the obsolete png_check_sig(), png_memcpy_check(), and
-png_memset_check() functions.  Instead use !png_sig_cmp(), memcpy(),
-and memset(), respectively.
+png_memset_check() functions.  Instead use png_sig_cmp() == 0,
+memcpy(), and memset(), respectively.
 
 The function png_set_gray_1_2_4_to_8() was removed. It has been
 deprecated since libpng-1.0.18 and 1.2.9, when it was replaced with
@@ -5239,7 +5230,7 @@ changed, and is unaffected by conditiona
 best choice for use in configure scripts for detecting the presence of any
 libpng version since 0.88.  In an autoconf "configure.in" you could use
 
-    AC_CHECK_LIB(png, png_get_io_ptr, ...
+    AC_CHECK_LIB(png, png_get_io_ptr, ...)
 
 XV. Source code repository
 
@@ -5248,12 +5239,12 @@ control.  The git repository was built f
 going back to version 0.70.  You can access the git repository (read only)
 at
 
-    https://github.com/glennrp/libpng or
+    https://github.com/pnggroup/libpng or
     https://git.code.sf.net/p/libpng/code.git
 
 or you can browse it with a web browser at
 
-    https://github.com/glennrp/libpng or
+    https://github.com/pnggroup/libpng or
     https://sourceforge.net/p/libpng/code/ci/libpng16/tree/
 
 Patches can be sent to png-mng-implement at lists.sourceforge.net or
@@ -5263,7 +5254,7 @@ uploaded to the libpng bug tracker at
 
 or as a "pull request" to
 
-    https://github.com/glennrp/libpng/pulls
+    https://github.com/pnggroup/libpng/pulls
 
 We also accept patches built from the tar or zip distributions, and
 simple verbal descriptions of bug fixes, reported either to the
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/png.c 5.15.17+dfsg-1/src/3rdparty/libpng/png.c
--- 5.15.15+dfsg-2/src/3rdparty/libpng/png.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/png.c	2024-11-20 13:56:33.000000000 +0000
@@ -1,7 +1,7 @@
 
 /* png.c - location for general purpose libpng functions
  *
- * Copyright (c) 2018-2023 Cosmin Truta
+ * Copyright (c) 2018-2024 Cosmin Truta
  * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
  * Copyright (c) 1996-1997 Andreas Dilger
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -14,27 +14,7 @@
 #include "pngpriv.h"
 
 /* Generate a compiler error if there is an old png.h in the search path. */
-typedef png_libpng_version_1_6_40 Your_png_h_is_not_version_1_6_40;
-
-#ifdef __GNUC__
-/* The version tests may need to be added to, but the problem warning has
- * consistently been fixed in GCC versions which obtain wide-spread release.
- * The problem is that many versions of GCC rearrange comparison expressions in
- * the optimizer in such a way that the results of the comparison will change
- * if signed integer overflow occurs.  Such comparisons are not permitted in
- * ANSI C90, however GCC isn't clever enough to work out that that do not occur
- * below in png_ascii_from_fp and png_muldiv, so it produces a warning with
- * -Wextra.  Unfortunately this is highly dependent on the optimizer and the
- * machine architecture so the warning comes and goes unpredictably and is
- * impossible to "fix", even were that a good idea.
- */
-#if __GNUC__ == 7 && __GNUC_MINOR__ == 1
-#define GCC_STRICT_OVERFLOW 1
-#endif /* GNU 7.1.x */
-#endif /* GNU */
-#ifndef GCC_STRICT_OVERFLOW
-#define GCC_STRICT_OVERFLOW 0
-#endif
+typedef png_libpng_version_1_6_43 Your_png_h_is_not_version_1_6_43;
 
 /* Tells libpng that we have already handled the first "num_bytes" bytes
  * of the PNG file signature.  If the PNG data is embedded into another
@@ -73,21 +53,21 @@ png_set_sig_bytes(png_structrp png_ptr,
 int PNGAPI
 png_sig_cmp(png_const_bytep sig, size_t start, size_t num_to_check)
 {
-   png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
+   static const png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
 
    if (num_to_check > 8)
       num_to_check = 8;
 
    else if (num_to_check < 1)
-      return (-1);
+      return -1;
 
    if (start > 7)
-      return (-1);
+      return -1;
 
    if (start + num_to_check > 8)
       num_to_check = 8 - start;
 
-   return ((int)(memcmp(&sig[start], &png_signature[start], num_to_check)));
+   return memcmp(&sig[start], &png_signature[start], num_to_check);
 }
 
 #endif /* READ */
@@ -447,7 +427,6 @@ png_info_init_3,(png_infopp ptr_ptr, siz
    memset(info_ptr, 0, (sizeof *info_ptr));
 }
 
-/* The following API is not called internally */
 void PNGAPI
 png_data_freer(png_const_structrp png_ptr, png_inforp info_ptr,
     int freer, png_uint_32 mask)
@@ -686,9 +665,9 @@ png_voidp PNGAPI
 png_get_io_ptr(png_const_structrp png_ptr)
 {
    if (png_ptr == NULL)
-      return (NULL);
+      return NULL;
 
-   return (png_ptr->io_ptr);
+   return png_ptr->io_ptr;
 }
 
 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
@@ -752,7 +731,7 @@ png_convert_to_rfc1123_buffer(char out[2
 
    {
       size_t pos = 0;
-      char number_buf[5]; /* enough for a four-digit year */
+      char number_buf[5] = {0, 0, 0, 0, 0}; /* enough for a four-digit year */
 
 #     define APPEND_STRING(string) pos = png_safecat(out, 29, pos, (string))
 #     define APPEND_NUMBER(format, value)\
@@ -815,8 +794,8 @@ png_get_copyright(png_const_structrp png
    return PNG_STRING_COPYRIGHT
 #else
    return PNG_STRING_NEWLINE \
-      "libpng version 1.6.40" PNG_STRING_NEWLINE \
-      "Copyright (c) 2018-2023 Cosmin Truta" PNG_STRING_NEWLINE \
+      "libpng version 1.6.43" PNG_STRING_NEWLINE \
+      "Copyright (c) 2018-2024 Cosmin Truta" PNG_STRING_NEWLINE \
       "Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson" \
       PNG_STRING_NEWLINE \
       "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
@@ -977,7 +956,7 @@ png_reset_zstream(png_structrp png_ptr)
       return Z_STREAM_ERROR;
 
    /* WARNING: this resets the window bits to the maximum! */
-   return (inflateReset(&png_ptr->zstream));
+   return inflateReset(&png_ptr->zstream);
 }
 #endif /* READ */
 
@@ -986,7 +965,7 @@ png_uint_32 PNGAPI
 png_access_version_number(void)
 {
    /* Version of *.c files used when building libpng */
-   return((png_uint_32)PNG_LIBPNG_VER);
+   return (png_uint_32)PNG_LIBPNG_VER;
 }
 
 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
@@ -1842,14 +1821,14 @@ png_icc_profile_error(png_const_structrp
    }
 #  ifdef PNG_WARNINGS_SUPPORTED
    else
-      {
-         char number[PNG_NUMBER_BUFFER_SIZE]; /* +24 = 114 */
+   {
+      char number[PNG_NUMBER_BUFFER_SIZE]; /* +24 = 114 */
 
-         pos = png_safecat(message, (sizeof message), pos,
-             png_format_number(number, number+(sizeof number),
-             PNG_NUMBER_FORMAT_x, value));
-         pos = png_safecat(message, (sizeof message), pos, "h: "); /* +2 = 116 */
-      }
+      pos = png_safecat(message, (sizeof message), pos,
+          png_format_number(number, number+(sizeof number),
+          PNG_NUMBER_FORMAT_x, value));
+      pos = png_safecat(message, (sizeof message), pos, "h: "); /* +2 = 116 */
+   }
 #  endif
    /* The 'reason' is an arbitrary message, allow +79 maximum 195 */
    pos = png_safecat(message, (sizeof message), pos, reason);
@@ -2532,17 +2511,6 @@ png_colorspace_set_rgb_coefficients(png_
 
 #endif /* COLORSPACE */
 
-#ifdef __GNUC__
-/* This exists solely to work round a warning from GNU C. */
-static int /* PRIVATE */
-png_gt(size_t a, size_t b)
-{
-   return a > b;
-}
-#else
-#   define png_gt(a,b) ((a) > (b))
-#endif
-
 void /* PRIVATE */
 png_check_IHDR(png_const_structrp png_ptr,
     png_uint_32 width, png_uint_32 height, int bit_depth,
@@ -2564,8 +2532,16 @@ png_check_IHDR(png_const_structrp png_pt
       error = 1;
    }
 
-   if (png_gt(((width + 7) & (~7U)),
-       ((PNG_SIZE_MAX
+   /* The bit mask on the first line below must be at least as big as a
+    * png_uint_32.  "~7U" is not adequate on 16-bit systems because it will
+    * be an unsigned 16-bit value.  Casting to (png_alloc_size_t) makes the
+    * type of the result at least as bit (in bits) as the RHS of the > operator
+    * which also avoids a common warning on 64-bit systems that the comparison
+    * of (png_uint_32) against the constant value on the RHS will always be
+    * false.
+    */
+   if (((width + 7) & ~(png_alloc_size_t)7) >
+       (((PNG_SIZE_MAX
            - 48        /* big_row_buf hack */
            - 1)        /* filter byte */
            / 8)        /* 8-byte RGBA pixels */
@@ -2891,14 +2867,6 @@ png_pow10(int power)
 /* Function to format a floating point value in ASCII with a given
  * precision.
  */
-#if GCC_STRICT_OVERFLOW
-#pragma GCC diagnostic push
-/* The problem arises below with exp_b10, which can never overflow because it
- * comes, originally, from frexp and is therefore limited to a range which is
- * typically +/-710 (log2(DBL_MAX)/log2(DBL_MIN)).
- */
-#pragma GCC diagnostic warning "-Wstrict-overflow=2"
-#endif /* GCC_STRICT_OVERFLOW */
 void /* PRIVATE */
 png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, size_t size,
     double fp, unsigned int precision)
@@ -3220,10 +3188,6 @@ png_ascii_from_fp(png_const_structrp png
    /* Here on buffer too small. */
    png_error(png_ptr, "ASCII conversion buffer too small");
 }
-#if GCC_STRICT_OVERFLOW
-#pragma GCC diagnostic pop
-#endif /* GCC_STRICT_OVERFLOW */
-
 #  endif /* FLOATING_POINT */
 
 #  ifdef PNG_FIXED_POINT_SUPPORTED
@@ -3251,7 +3215,7 @@ png_ascii_from_fixed(png_const_structrp
       if (num <= 0x80000000) /* else overflowed */
       {
          unsigned int ndigits = 0, first = 16 /* flag value */;
-         char digits[10];
+         char digits[10] = {0};
 
          while (num)
          {
@@ -3336,15 +3300,6 @@ png_fixed(png_const_structrp png_ptr, do
  * the nearest .00001).  Overflow and divide by zero are signalled in
  * the result, a boolean - true on success, false on overflow.
  */
-#if GCC_STRICT_OVERFLOW /* from above */
-/* It is not obvious which comparison below gets optimized in such a way that
- * signed overflow would change the result; looking through the code does not
- * reveal any tests which have the form GCC complains about, so presumably the
- * optimizer is moving an add or subtract into the 'if' somewhere.
- */
-#pragma GCC diagnostic push
-#pragma GCC diagnostic warning "-Wstrict-overflow=2"
-#endif /* GCC_STRICT_OVERFLOW */
 int
 png_muldiv(png_fixed_point_p res, png_fixed_point a, png_int_32 times,
     png_int_32 divisor)
@@ -3459,9 +3414,6 @@ png_muldiv(png_fixed_point_p res, png_fi
 
    return 0;
 }
-#if GCC_STRICT_OVERFLOW
-#pragma GCC diagnostic pop
-#endif /* GCC_STRICT_OVERFLOW */
 #endif /* READ_GAMMA || INCH_CONVERSIONS */
 
 #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_INCH_CONVERSIONS_SUPPORTED)
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/png.h 5.15.17+dfsg-1/src/3rdparty/libpng/png.h
--- 5.15.15+dfsg-2/src/3rdparty/libpng/png.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/png.h	2024-11-20 13:56:33.000000000 +0000
@@ -1,9 +1,9 @@
 
 /* png.h - header file for PNG reference library
  *
- * libpng version 1.6.40
+ * libpng version 1.6.43
  *
- * Copyright (c) 2018-2023 Cosmin Truta
+ * Copyright (c) 2018-2024 Cosmin Truta
  * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
  * Copyright (c) 1996-1997 Andreas Dilger
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -15,7 +15,7 @@
  *   libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger
  *   libpng versions 0.97, January 1998, through 1.6.35, July 2018:
  *     Glenn Randers-Pehrson
- *   libpng versions 1.6.36, December 2018, through 1.6.40, June 2023:
+ *   libpng versions 1.6.36, December 2018, through 1.6.43, February 2024:
  *     Cosmin Truta
  *   See also "Contributing Authors", below.
  */
@@ -27,8 +27,8 @@
  * PNG Reference Library License version 2
  * ---------------------------------------
  *
- *  * Copyright (c) 1995-2023 The PNG Reference Library Authors.
- *  * Copyright (c) 2018-2023 Cosmin Truta.
+ *  * Copyright (c) 1995-2024 The PNG Reference Library Authors.
+ *  * Copyright (c) 2018-2024 Cosmin Truta.
  *  * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson.
  *  * Copyright (c) 1996-1997 Andreas Dilger.
  *  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -239,7 +239,7 @@
  *    ...
  *    1.5.30                  15    10530  15.so.15.30[.0]
  *    ...
- *    1.6.40                  16    10640  16.so.16.40[.0]
+ *    1.6.43                  16    10643  16.so.16.43[.0]
  *
  *    Henceforth the source version will match the shared-library major and
  *    minor numbers; the shared-library major version number will be used for
@@ -255,9 +255,6 @@
  *    to the info_ptr or png_ptr members through png.h, and the compiled
  *    application is loaded with a different version of the library.
  *
- *    DLLNUM will change each time there are forward or backward changes
- *    in binary compatibility (e.g., when a new feature is added).
- *
  * See libpng.txt or libpng.3 for more information.  The PNG specification
  * is available as a W3C Recommendation and as an ISO/IEC Standard; see
  * <https://www.w3.org/TR/2003/REC-PNG-20031110/>
@@ -278,19 +275,21 @@
  */
 
 /* Version information for png.h - this should match the version in png.c */
-#define PNG_LIBPNG_VER_STRING "1.6.40"
-#define PNG_HEADER_VERSION_STRING " libpng version 1.6.40 - June 21, 2023\n"
+#define PNG_LIBPNG_VER_STRING "1.6.43"
+#define PNG_HEADER_VERSION_STRING " libpng version " PNG_LIBPNG_VER_STRING "\n"
 
-#define PNG_LIBPNG_VER_SONUM   16
-#define PNG_LIBPNG_VER_DLLNUM  16
+/* The versions of shared library builds should stay in sync, going forward */
+#define PNG_LIBPNG_VER_SHAREDLIB 16
+#define PNG_LIBPNG_VER_SONUM     PNG_LIBPNG_VER_SHAREDLIB /* [Deprecated] */
+#define PNG_LIBPNG_VER_DLLNUM    PNG_LIBPNG_VER_SHAREDLIB /* [Deprecated] */
 
 /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
 #define PNG_LIBPNG_VER_MAJOR   1
 #define PNG_LIBPNG_VER_MINOR   6
-#define PNG_LIBPNG_VER_RELEASE 40
+#define PNG_LIBPNG_VER_RELEASE 43
 
 /* This should be zero for a public release, or non-zero for a
- * development version.  [Deprecated]
+ * development version.
  */
 #define PNG_LIBPNG_VER_BUILD  0
 
@@ -318,7 +317,7 @@
  * From version 1.0.1 it is:
  * XXYYZZ, where XX=major, YY=minor, ZZ=release
  */
-#define PNG_LIBPNG_VER 10640 /* 1.6.40 */
+#define PNG_LIBPNG_VER 10643 /* 1.6.43 */
 
 /* Library configuration: these options cannot be changed after
  * the library has been built.
@@ -428,7 +427,7 @@ extern "C" {
 /* This triggers a compiler error in png.c, if png.c and png.h
  * do not agree upon the version number.
  */
-typedef char* png_libpng_version_1_6_40;
+typedef char* png_libpng_version_1_6_43;
 
 /* Basic control structions.  Read libpng-manual.txt or libpng.3 for more info.
  *
@@ -849,7 +848,7 @@ PNG_FUNCTION(void, (PNGCAPI *png_longjmp
 #define PNG_TRANSFORM_GRAY_TO_RGB   0x2000      /* read only */
 /* Added to libpng-1.5.4 */
 #define PNG_TRANSFORM_EXPAND_16     0x4000      /* read only */
-#if INT_MAX >= 0x8000 /* else this might break */
+#if ~0U > 0xffffU /* or else this might break on a 16-bit machine */
 #define PNG_TRANSFORM_SCALE_16      0x8000      /* read only */
 #endif
 
@@ -908,15 +907,15 @@ PNG_EXPORT(2, void, png_set_sig_bytes, (
 /* Check sig[start] through sig[start + num_to_check - 1] to see if it's a
  * PNG file.  Returns zero if the supplied bytes match the 8-byte PNG
  * signature, and non-zero otherwise.  Having num_to_check == 0 or
- * start > 7 will always fail (ie return non-zero).
+ * start > 7 will always fail (i.e. return non-zero).
  */
 PNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, size_t start,
     size_t num_to_check));
 
 /* Simple signature checking function.  This is the same as calling
- * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n).
+ * png_check_sig(sig, n) := (png_sig_cmp(sig, 0, n) == 0).
  */
-#define png_check_sig(sig, n) !png_sig_cmp((sig), 0, (n))
+#define png_check_sig(sig, n) (png_sig_cmp((sig), 0, (n)) == 0) /* DEPRECATED */
 
 /* Allocate and initialize png_ptr struct for reading, and any other memory. */
 PNG_EXPORTA(4, png_structp, png_create_read_struct,
@@ -1730,12 +1729,9 @@ PNG_EXPORT(97, void, png_free, (png_cons
 PNG_EXPORT(98, void, png_free_data, (png_const_structrp png_ptr,
     png_inforp info_ptr, png_uint_32 free_me, int num));
 
-/* Reassign responsibility for freeing existing data, whether allocated
+/* Reassign the responsibility for freeing existing data, whether allocated
  * by libpng or by the application; this works on the png_info structure passed
- * in, it does not change the state for other png_info structures.
- *
- * It is unlikely that this function works correctly as of 1.6.0 and using it
- * may result either in memory leaks or double free of allocated data.
+ * in, without changing the state for other png_info structures.
  */
 PNG_EXPORT(99, void, png_data_freer, (png_const_structrp png_ptr,
     png_inforp info_ptr, int freer, png_uint_32 mask));
@@ -3207,11 +3203,18 @@ PNG_EXPORT(245, int, png_image_write_to_
 #ifdef PNG_MIPS_MSA_API_SUPPORTED
 #  define PNG_MIPS_MSA   6 /* HARDWARE: MIPS Msa SIMD instructions supported */
 #endif
-#define PNG_IGNORE_ADLER32 8
+#ifdef PNG_DISABLE_ADLER32_CHECK_SUPPORTED
+#  define PNG_IGNORE_ADLER32 8 /* SOFTWARE: disable Adler32 check on IDAT */
+#endif
 #ifdef PNG_POWERPC_VSX_API_SUPPORTED
-#  define PNG_POWERPC_VSX   10 /* HARDWARE: PowerPC VSX SIMD instructions supported */
+#  define PNG_POWERPC_VSX   10 /* HARDWARE: PowerPC VSX SIMD instructions
+                                * supported */
 #endif
-#define PNG_OPTION_NEXT  12 /* Next option - numbers must be even */
+#ifdef PNG_MIPS_MMI_API_SUPPORTED
+#  define PNG_MIPS_MMI   12 /* HARDWARE: MIPS MMI SIMD instructions supported */
+#endif
+
+#define PNG_OPTION_NEXT  14 /* Next option - numbers must be even */
 
 /* Return values: NOTE: there are four values and 'off' is *not* zero */
 #define PNG_OPTION_UNSET   0 /* Unset - defaults to off */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/pngconf.h 5.15.17+dfsg-1/src/3rdparty/libpng/pngconf.h
--- 5.15.15+dfsg-2/src/3rdparty/libpng/pngconf.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/pngconf.h	2024-11-20 13:56:33.000000000 +0000
@@ -1,9 +1,9 @@
 
 /* pngconf.h - machine-configurable file for libpng
  *
- * libpng version 1.6.40
+ * libpng version 1.6.43
  *
- * Copyright (c) 2018-2022 Cosmin Truta
+ * Copyright (c) 2018-2024 Cosmin Truta
  * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson
  * Copyright (c) 1996-1997 Andreas Dilger
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/pngerror.c 5.15.17+dfsg-1/src/3rdparty/libpng/pngerror.c
--- 5.15.15+dfsg-2/src/3rdparty/libpng/pngerror.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/pngerror.c	2024-11-20 13:56:33.000000000 +0000
@@ -1,7 +1,7 @@
 
 /* pngerror.c - stub functions for i/o and memory allocation
  *
- * Copyright (c) 2018 Cosmin Truta
+ * Copyright (c) 2018-2024 Cosmin Truta
  * Copyright (c) 1998-2002,2004,2006-2017 Glenn Randers-Pehrson
  * Copyright (c) 1996-1997 Andreas Dilger
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -255,7 +255,7 @@ void
 png_warning_parameter_unsigned(png_warning_parameters p, int number, int format,
     png_alloc_size_t value)
 {
-   char buffer[PNG_NUMBER_BUFFER_SIZE];
+   char buffer[PNG_NUMBER_BUFFER_SIZE] = {0};
    png_warning_parameter(p, number, PNG_FORMAT_NUMBER(buffer, format, value));
 }
 
@@ -265,7 +265,7 @@ png_warning_parameter_signed(png_warning
 {
    png_alloc_size_t u;
    png_charp str;
-   char buffer[PNG_NUMBER_BUFFER_SIZE];
+   char buffer[PNG_NUMBER_BUFFER_SIZE] = {0};
 
    /* Avoid overflow by doing the negate in a png_alloc_size_t: */
    u = (png_alloc_size_t)value;
@@ -858,7 +858,7 @@ png_get_error_ptr(png_const_structrp png
    if (png_ptr == NULL)
       return NULL;
 
-   return ((png_voidp)png_ptr->error_ptr);
+   return (png_voidp)png_ptr->error_ptr;
 }
 
 
@@ -933,31 +933,25 @@ png_safe_warning(png_structp png_noncons
 #endif
 
 int /* PRIVATE */
-png_safe_execute(png_imagep image_in, int (*function)(png_voidp), png_voidp arg)
+png_safe_execute(png_imagep image, int (*function)(png_voidp), png_voidp arg)
 {
-   volatile png_imagep image = image_in;
-   volatile int result;
-   volatile png_voidp saved_error_buf;
+   png_voidp saved_error_buf = image->opaque->error_buf;
    jmp_buf safe_jmpbuf;
+   int result;
 
-   /* Safely execute function(arg) with png_error returning to this function. */
-   saved_error_buf = image->opaque->error_buf;
-   result = setjmp(safe_jmpbuf) == 0;
-
-   if (result != 0)
+   /* Safely execute function(arg), with png_error returning back here. */
+   if (setjmp(safe_jmpbuf) == 0)
    {
-
       image->opaque->error_buf = safe_jmpbuf;
       result = function(arg);
+      image->opaque->error_buf = saved_error_buf;
+      return result;
    }
 
+   /* On png_error, return via longjmp, pop the jmpbuf, and free the image. */
    image->opaque->error_buf = saved_error_buf;
-
-   /* And do the cleanup prior to any failure return. */
-   if (result == 0)
-      png_image_free(image);
-
-   return result;
+   png_image_free(image);
+   return 0;
 }
 #endif /* SIMPLIFIED READ || SIMPLIFIED_WRITE */
 #endif /* READ || WRITE */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/pngget.c 5.15.17+dfsg-1/src/3rdparty/libpng/pngget.c
--- 5.15.15+dfsg-2/src/3rdparty/libpng/pngget.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/pngget.c	2024-11-20 13:56:33.000000000 +0000
@@ -1,7 +1,7 @@
 
 /* pngget.c - retrieval of values from info struct
  *
- * Copyright (c) 2018-2023 Cosmin Truta
+ * Copyright (c) 2018-2024 Cosmin Truta
  * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
  * Copyright (c) 1996-1997 Andreas Dilger
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -28,22 +28,22 @@ png_get_valid(png_const_structrp png_ptr
        * valid tRNS chunk in this case.
        */
       if (flag == PNG_INFO_tRNS && png_ptr->num_trans == 0)
-         return(0);
+         return 0;
 #endif
 
-      return(info_ptr->valid & flag);
+      return info_ptr->valid & flag;
    }
 
-   return(0);
+   return 0;
 }
 
 size_t PNGAPI
 png_get_rowbytes(png_const_structrp png_ptr, png_const_inforp info_ptr)
 {
    if (png_ptr != NULL && info_ptr != NULL)
-      return(info_ptr->rowbytes);
+      return info_ptr->rowbytes;
 
-   return(0);
+   return 0;
 }
 
 #ifdef PNG_INFO_IMAGE_SUPPORTED
@@ -51,9 +51,9 @@ png_bytepp PNGAPI
 png_get_rows(png_const_structrp png_ptr, png_const_inforp info_ptr)
 {
    if (png_ptr != NULL && info_ptr != NULL)
-      return(info_ptr->row_pointers);
+      return info_ptr->row_pointers;
 
-   return(0);
+   return 0;
 }
 #endif
 
@@ -65,7 +65,7 @@ png_get_image_width(png_const_structrp p
    if (png_ptr != NULL && info_ptr != NULL)
       return info_ptr->width;
 
-   return (0);
+   return 0;
 }
 
 png_uint_32 PNGAPI
@@ -74,7 +74,7 @@ png_get_image_height(png_const_structrp
    if (png_ptr != NULL && info_ptr != NULL)
       return info_ptr->height;
 
-   return (0);
+   return 0;
 }
 
 png_byte PNGAPI
@@ -83,7 +83,7 @@ png_get_bit_depth(png_const_structrp png
    if (png_ptr != NULL && info_ptr != NULL)
       return info_ptr->bit_depth;
 
-   return (0);
+   return 0;
 }
 
 png_byte PNGAPI
@@ -92,7 +92,7 @@ png_get_color_type(png_const_structrp pn
    if (png_ptr != NULL && info_ptr != NULL)
       return info_ptr->color_type;
 
-   return (0);
+   return 0;
 }
 
 png_byte PNGAPI
@@ -101,7 +101,7 @@ png_get_filter_type(png_const_structrp p
    if (png_ptr != NULL && info_ptr != NULL)
       return info_ptr->filter_type;
 
-   return (0);
+   return 0;
 }
 
 png_byte PNGAPI
@@ -110,7 +110,7 @@ png_get_interlace_type(png_const_structr
    if (png_ptr != NULL && info_ptr != NULL)
       return info_ptr->interlace_type;
 
-   return (0);
+   return 0;
 }
 
 png_byte PNGAPI
@@ -119,7 +119,7 @@ png_get_compression_type(png_const_struc
    if (png_ptr != NULL && info_ptr != NULL)
       return info_ptr->compression_type;
 
-   return (0);
+   return 0;
 }
 
 png_uint_32 PNGAPI
@@ -127,21 +127,20 @@ png_get_x_pixels_per_meter(png_const_str
    info_ptr)
 {
 #ifdef PNG_pHYs_SUPPORTED
+   png_debug(1, "in png_get_x_pixels_per_meter");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_pHYs) != 0)
-      {
-         png_debug1(1, "in %s retrieval function",
-             "png_get_x_pixels_per_meter");
-
-         if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)
-            return (info_ptr->x_pixels_per_unit);
-      }
+   {
+      if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)
+         return info_ptr->x_pixels_per_unit;
+   }
 #else
    PNG_UNUSED(png_ptr)
    PNG_UNUSED(info_ptr)
 #endif
 
-   return (0);
+   return 0;
 }
 
 png_uint_32 PNGAPI
@@ -149,42 +148,41 @@ png_get_y_pixels_per_meter(png_const_str
     info_ptr)
 {
 #ifdef PNG_pHYs_SUPPORTED
+   png_debug(1, "in png_get_y_pixels_per_meter");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_pHYs) != 0)
    {
-      png_debug1(1, "in %s retrieval function",
-          "png_get_y_pixels_per_meter");
-
       if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)
-         return (info_ptr->y_pixels_per_unit);
+         return info_ptr->y_pixels_per_unit;
    }
 #else
    PNG_UNUSED(png_ptr)
    PNG_UNUSED(info_ptr)
 #endif
 
-   return (0);
+   return 0;
 }
 
 png_uint_32 PNGAPI
 png_get_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp info_ptr)
 {
 #ifdef PNG_pHYs_SUPPORTED
+   png_debug(1, "in png_get_pixels_per_meter");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_pHYs) != 0)
    {
-      png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter");
-
       if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER &&
           info_ptr->x_pixels_per_unit == info_ptr->y_pixels_per_unit)
-         return (info_ptr->x_pixels_per_unit);
+         return info_ptr->x_pixels_per_unit;
    }
 #else
    PNG_UNUSED(png_ptr)
    PNG_UNUSED(info_ptr)
 #endif
 
-   return (0);
+   return 0;
 }
 
 #ifdef PNG_FLOATING_POINT_SUPPORTED
@@ -193,21 +191,21 @@ png_get_pixel_aspect_ratio(png_const_str
    info_ptr)
 {
 #ifdef PNG_READ_pHYs_SUPPORTED
+   png_debug(1, "in png_get_pixel_aspect_ratio");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_pHYs) != 0)
    {
-      png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio");
-
       if (info_ptr->x_pixels_per_unit != 0)
-         return ((float)((float)info_ptr->y_pixels_per_unit
-             /(float)info_ptr->x_pixels_per_unit));
+         return (float)info_ptr->y_pixels_per_unit
+              / (float)info_ptr->x_pixels_per_unit;
    }
 #else
    PNG_UNUSED(png_ptr)
    PNG_UNUSED(info_ptr)
 #endif
 
-   return ((float)0.0);
+   return (float)0.0;
 }
 #endif
 
@@ -217,6 +215,8 @@ png_get_pixel_aspect_ratio_fixed(png_con
     png_const_inforp info_ptr)
 {
 #ifdef PNG_READ_pHYs_SUPPORTED
+   png_debug(1, "in png_get_pixel_aspect_ratio_fixed");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_pHYs) != 0 &&
        info_ptr->x_pixels_per_unit > 0 && info_ptr->y_pixels_per_unit > 0 &&
@@ -225,8 +225,6 @@ png_get_pixel_aspect_ratio_fixed(png_con
    {
       png_fixed_point res;
 
-      png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio_fixed");
-
       /* The following casts work because a PNG 4 byte integer only has a valid
        * range of 0..2^31-1; otherwise the cast might overflow.
        */
@@ -247,80 +245,80 @@ png_int_32 PNGAPI
 png_get_x_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr)
 {
 #ifdef PNG_oFFs_SUPPORTED
+   png_debug(1, "in png_get_x_offset_microns");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_oFFs) != 0)
    {
-      png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns");
-
       if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER)
-         return (info_ptr->x_offset);
+         return info_ptr->x_offset;
    }
 #else
    PNG_UNUSED(png_ptr)
    PNG_UNUSED(info_ptr)
 #endif
 
-   return (0);
+   return 0;
 }
 
 png_int_32 PNGAPI
 png_get_y_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr)
 {
 #ifdef PNG_oFFs_SUPPORTED
+   png_debug(1, "in png_get_y_offset_microns");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_oFFs) != 0)
    {
-      png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns");
-
       if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER)
-         return (info_ptr->y_offset);
+         return info_ptr->y_offset;
    }
 #else
    PNG_UNUSED(png_ptr)
    PNG_UNUSED(info_ptr)
 #endif
 
-   return (0);
+   return 0;
 }
 
 png_int_32 PNGAPI
 png_get_x_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr)
 {
 #ifdef PNG_oFFs_SUPPORTED
+   png_debug(1, "in png_get_x_offset_pixels");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_oFFs) != 0)
    {
-      png_debug1(1, "in %s retrieval function", "png_get_x_offset_pixels");
-
       if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL)
-         return (info_ptr->x_offset);
+         return info_ptr->x_offset;
    }
 #else
    PNG_UNUSED(png_ptr)
    PNG_UNUSED(info_ptr)
 #endif
 
-   return (0);
+   return 0;
 }
 
 png_int_32 PNGAPI
 png_get_y_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr)
 {
 #ifdef PNG_oFFs_SUPPORTED
+   png_debug(1, "in png_get_y_offset_pixels");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_oFFs) != 0)
    {
-      png_debug1(1, "in %s retrieval function", "png_get_y_offset_pixels");
-
       if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL)
-         return (info_ptr->y_offset);
+         return info_ptr->y_offset;
    }
 #else
    PNG_UNUSED(png_ptr)
    PNG_UNUSED(info_ptr)
 #endif
 
-   return (0);
+   return 0;
 }
 
 #ifdef PNG_INCH_CONVERSIONS_SUPPORTED
@@ -434,11 +432,11 @@ png_get_pHYs_dpi(png_const_structrp png_
 {
    png_uint_32 retval = 0;
 
+   png_debug1(1, "in %s retrieval function", "pHYs");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_pHYs) != 0)
    {
-      png_debug1(1, "in %s retrieval function", "pHYs");
-
       if (res_x != NULL)
       {
          *res_x = info_ptr->x_pixels_per_unit;
@@ -464,7 +462,7 @@ png_get_pHYs_dpi(png_const_structrp png_
       }
    }
 
-   return (retval);
+   return retval;
 }
 #endif /* pHYs */
 #endif /* INCH_CONVERSIONS */
@@ -478,9 +476,9 @@ png_byte PNGAPI
 png_get_channels(png_const_structrp png_ptr, png_const_inforp info_ptr)
 {
    if (png_ptr != NULL && info_ptr != NULL)
-      return(info_ptr->channels);
+      return info_ptr->channels;
 
-   return (0);
+   return 0;
 }
 
 #ifdef PNG_READ_SUPPORTED
@@ -488,9 +486,9 @@ png_const_bytep PNGAPI
 png_get_signature(png_const_structrp png_ptr, png_const_inforp info_ptr)
 {
    if (png_ptr != NULL && info_ptr != NULL)
-      return(info_ptr->signature);
+      return info_ptr->signature;
 
-   return (NULL);
+   return NULL;
 }
 #endif
 
@@ -499,17 +497,17 @@ png_uint_32 PNGAPI
 png_get_bKGD(png_const_structrp png_ptr, png_inforp info_ptr,
     png_color_16p *background)
 {
+   png_debug1(1, "in %s retrieval function", "bKGD");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_bKGD) != 0 &&
        background != NULL)
    {
-      png_debug1(1, "in %s retrieval function", "bKGD");
-
       *background = &(info_ptr->background);
-      return (PNG_INFO_bKGD);
+      return PNG_INFO_bKGD;
    }
 
-   return (0);
+   return 0;
 }
 #endif
 
@@ -524,6 +522,8 @@ png_get_cHRM(png_const_structrp png_ptr,
     double *white_x, double *white_y, double *red_x, double *red_y,
     double *green_x, double *green_y, double *blue_x, double *blue_y)
 {
+   png_debug1(1, "in %s retrieval function", "cHRM");
+
    /* Quiet API change: this code used to only return the end points if a cHRM
     * chunk was present, but the end points can also come from iCCP or sRGB
     * chunks, so in 1.6.0 the png_get_ APIs return the end points regardless and
@@ -533,8 +533,6 @@ png_get_cHRM(png_const_structrp png_ptr,
    if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
    {
-      png_debug1(1, "in %s retrieval function", "cHRM");
-
       if (white_x != NULL)
          *white_x = png_float(png_ptr,
              info_ptr->colorspace.end_points_xy.whitex, "cHRM white X");
@@ -559,10 +557,10 @@ png_get_cHRM(png_const_structrp png_ptr,
       if (blue_y != NULL)
          *blue_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluey,
              "cHRM blue Y");
-      return (PNG_INFO_cHRM);
+      return PNG_INFO_cHRM;
    }
 
-   return (0);
+   return 0;
 }
 
 png_uint_32 PNGAPI
@@ -571,11 +569,11 @@ png_get_cHRM_XYZ(png_const_structrp png_
     double *green_Y, double *green_Z, double *blue_X, double *blue_Y,
     double *blue_Z)
 {
+   png_debug1(1, "in %s retrieval function", "cHRM_XYZ(float)");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
    {
-      png_debug1(1, "in %s retrieval function", "cHRM_XYZ(float)");
-
       if (red_X != NULL)
          *red_X = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_X,
              "cHRM red X");
@@ -603,10 +601,10 @@ png_get_cHRM_XYZ(png_const_structrp png_
       if (blue_Z != NULL)
          *blue_Z = png_float(png_ptr,
              info_ptr->colorspace.end_points_XYZ.blue_Z, "cHRM blue Z");
-      return (PNG_INFO_cHRM);
+      return PNG_INFO_cHRM;
    }
 
-   return (0);
+   return 0;
 }
 #  endif
 
@@ -619,11 +617,11 @@ png_get_cHRM_XYZ_fixed(png_const_structr
     png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y,
     png_fixed_point *int_blue_Z)
 {
+   png_debug1(1, "in %s retrieval function", "cHRM_XYZ");
+
    if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
    {
-      png_debug1(1, "in %s retrieval function", "cHRM_XYZ");
-
       if (int_red_X != NULL)
          *int_red_X = info_ptr->colorspace.end_points_XYZ.red_X;
       if (int_red_Y != NULL)
@@ -642,10 +640,10 @@ png_get_cHRM_XYZ_fixed(png_const_structr
          *int_blue_Y = info_ptr->colorspace.end_points_XYZ.blue_Y;
       if (int_blue_Z != NULL)
          *int_blue_Z = info_ptr->colorspace.end_points_XYZ.blue_Z;
-      return (PNG_INFO_cHRM);
+      return PNG_INFO_cHRM;
    }
 
-   return (0);
+   return 0;
 }
 
 png_uint_32 PNGAPI
@@ -675,10 +673,10 @@ png_get_cHRM_fixed(png_const_structrp pn
          *blue_x = info_ptr->colorspace.end_points_xy.bluex;
       if (blue_y != NULL)
          *blue_y = info_ptr->colorspace.end_points_xy.bluey;
-      return (PNG_INFO_cHRM);
+      return PNG_INFO_cHRM;
    }
 
-   return (0);
+   return 0;
 }
 #  endif
 #endif
@@ -696,10 +694,10 @@ png_get_gAMA_fixed(png_const_structrp pn
        file_gamma != NULL)
    {
       *file_gamma = info_ptr->colorspace.gamma;
-      return (PNG_INFO_gAMA);
+      return PNG_INFO_gAMA;
    }
 
-   return (0);
+   return 0;
 }
 #  endif
 
@@ -716,10 +714,10 @@ png_get_gAMA(png_const_structrp png_ptr,
    {
       *file_gamma = png_float(png_ptr, info_ptr->colorspace.gamma,
           "png_get_gAMA");
-      return (PNG_INFO_gAMA);
+      return PNG_INFO_gAMA;
    }
 
-   return (0);
+   return 0;
 }
 #  endif
 #endif
@@ -735,10 +733,10 @@ png_get_sRGB(png_const_structrp png_ptr,
       (info_ptr->valid & PNG_INFO_sRGB) != 0 && file_srgb_intent != NULL)
    {
       *file_srgb_intent = info_ptr->colorspace.rendering_intent;
-      return (PNG_INFO_sRGB);
+      return PNG_INFO_sRGB;
    }
 
-   return (0);
+   return 0;
 }
 #endif
 
@@ -762,10 +760,10 @@ png_get_iCCP(png_const_structrp png_ptr,
        */
       if (compression_type != NULL)
          *compression_type = PNG_COMPRESSION_TYPE_BASE;
-      return (PNG_INFO_iCCP);
+      return PNG_INFO_iCCP;
    }
 
-   return (0);
+   return 0;
 
 }
 #endif
@@ -775,13 +773,15 @@ int PNGAPI
 png_get_sPLT(png_const_structrp png_ptr, png_inforp info_ptr,
     png_sPLT_tpp spalettes)
 {
+   png_debug1(1, "in %s retrieval function", "sPLT");
+
    if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL)
    {
       *spalettes = info_ptr->splt_palettes;
       return info_ptr->splt_palettes_num;
    }
 
-   return (0);
+   return 0;
 }
 #endif
 
@@ -807,10 +807,10 @@ png_get_eXIf_1(png_const_structrp png_pt
    {
       *num_exif = info_ptr->num_exif;
       *exif = info_ptr->exif;
-      return (PNG_INFO_eXIf);
+      return PNG_INFO_eXIf;
    }
 
-   return (0);
+   return 0;
 }
 #endif
 
@@ -825,10 +825,10 @@ png_get_hIST(png_const_structrp png_ptr,
        (info_ptr->valid & PNG_INFO_hIST) != 0 && hist != NULL)
    {
       *hist = info_ptr->hist;
-      return (PNG_INFO_hIST);
+      return PNG_INFO_hIST;
    }
 
-   return (0);
+   return 0;
 }
 #endif
 
@@ -841,7 +841,7 @@ png_get_IHDR(png_const_structrp png_ptr,
    png_debug1(1, "in %s retrieval function", "IHDR");
 
    if (png_ptr == NULL || info_ptr == NULL)
-      return (0);
+      return 0;
 
    if (width != NULL)
        *width = info_ptr->width;
@@ -873,7 +873,7 @@ png_get_IHDR(png_const_structrp png_ptr,
        info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type,
        info_ptr->compression_type, info_ptr->filter_type);
 
-   return (1);
+   return 1;
 }
 
 #ifdef PNG_oFFs_SUPPORTED
@@ -890,10 +890,10 @@ png_get_oFFs(png_const_structrp png_ptr,
       *offset_x = info_ptr->x_offset;
       *offset_y = info_ptr->y_offset;
       *unit_type = (int)info_ptr->offset_unit_type;
-      return (PNG_INFO_oFFs);
+      return PNG_INFO_oFFs;
    }
 
-   return (0);
+   return 0;
 }
 #endif
 
@@ -917,10 +917,10 @@ png_get_pCAL(png_const_structrp png_ptr,
       *nparams = (int)info_ptr->pcal_nparams;
       *units = info_ptr->pcal_units;
       *params = info_ptr->pcal_params;
-      return (PNG_INFO_pCAL);
+      return PNG_INFO_pCAL;
    }
 
-   return (0);
+   return 0;
 }
 #endif
 
@@ -932,6 +932,8 @@ png_uint_32 PNGAPI
 png_get_sCAL_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
     int *unit, png_fixed_point *width, png_fixed_point *height)
 {
+   png_debug1(1, "in %s retrieval function", "sCAL");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_sCAL) != 0)
    {
@@ -943,10 +945,10 @@ png_get_sCAL_fixed(png_const_structrp pn
       *width = png_fixed(png_ptr, atof(info_ptr->scal_s_width), "sCAL width");
       *height = png_fixed(png_ptr, atof(info_ptr->scal_s_height),
           "sCAL height");
-      return (PNG_INFO_sCAL);
+      return PNG_INFO_sCAL;
    }
 
-   return(0);
+   return 0;
 }
 #    endif /* FLOATING_ARITHMETIC */
 #  endif /* FIXED_POINT */
@@ -955,32 +957,36 @@ png_uint_32 PNGAPI
 png_get_sCAL(png_const_structrp png_ptr, png_const_inforp info_ptr,
     int *unit, double *width, double *height)
 {
+   png_debug1(1, "in %s retrieval function", "sCAL(float)");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_sCAL) != 0)
    {
       *unit = info_ptr->scal_unit;
       *width = atof(info_ptr->scal_s_width);
       *height = atof(info_ptr->scal_s_height);
-      return (PNG_INFO_sCAL);
+      return PNG_INFO_sCAL;
    }
 
-   return(0);
+   return 0;
 }
 #  endif /* FLOATING POINT */
 png_uint_32 PNGAPI
 png_get_sCAL_s(png_const_structrp png_ptr, png_const_inforp info_ptr,
     int *unit, png_charpp width, png_charpp height)
 {
+   png_debug1(1, "in %s retrieval function", "sCAL(str)");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_sCAL) != 0)
    {
       *unit = info_ptr->scal_unit;
       *width = info_ptr->scal_s_width;
       *height = info_ptr->scal_s_height;
-      return (PNG_INFO_sCAL);
+      return PNG_INFO_sCAL;
    }
 
-   return(0);
+   return 0;
 }
 #endif /* sCAL */
 
@@ -1015,7 +1021,7 @@ png_get_pHYs(png_const_structrp png_ptr,
       }
    }
 
-   return (retval);
+   return retval;
 }
 #endif /* pHYs */
 
@@ -1031,10 +1037,10 @@ png_get_PLTE(png_const_structrp png_ptr,
       *palette = info_ptr->palette;
       *num_palette = info_ptr->num_palette;
       png_debug1(3, "num_palette = %d", *num_palette);
-      return (PNG_INFO_PLTE);
+      return PNG_INFO_PLTE;
    }
 
-   return (0);
+   return 0;
 }
 
 #ifdef PNG_sBIT_SUPPORTED
@@ -1048,10 +1054,10 @@ png_get_sBIT(png_const_structrp png_ptr,
        (info_ptr->valid & PNG_INFO_sBIT) != 0 && sig_bit != NULL)
    {
       *sig_bit = &(info_ptr->sig_bit);
-      return (PNG_INFO_sBIT);
+      return PNG_INFO_sBIT;
    }
 
-   return (0);
+   return 0;
 }
 #endif
 
@@ -1062,7 +1068,7 @@ png_get_text(png_const_structrp png_ptr,
 {
    if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)
    {
-      png_debug1(1, "in 0x%lx retrieval function",
+      png_debug1(1, "in text retrieval function, chunk typeid = 0x%lx",
          (unsigned long)png_ptr->chunk_name);
 
       if (text_ptr != NULL)
@@ -1077,7 +1083,7 @@ png_get_text(png_const_structrp png_ptr,
    if (num_text != NULL)
       *num_text = 0;
 
-   return(0);
+   return 0;
 }
 #endif
 
@@ -1092,10 +1098,10 @@ png_get_tIME(png_const_structrp png_ptr,
        (info_ptr->valid & PNG_INFO_tIME) != 0 && mod_time != NULL)
    {
       *mod_time = &(info_ptr->mod_time);
-      return (PNG_INFO_tIME);
+      return PNG_INFO_tIME;
    }
 
-   return (0);
+   return 0;
 }
 #endif
 
@@ -1105,11 +1111,12 @@ png_get_tRNS(png_const_structrp png_ptr,
     png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color)
 {
    png_uint_32 retval = 0;
+
+   png_debug1(1, "in %s retrieval function", "tRNS");
+
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_tRNS) != 0)
    {
-      png_debug1(1, "in %s retrieval function", "tRNS");
-
       if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
       {
          if (trans_alpha != NULL)
@@ -1141,7 +1148,7 @@ png_get_tRNS(png_const_structrp png_ptr,
       }
    }
 
-   return (retval);
+   return retval;
 }
 #endif
 
@@ -1156,7 +1163,7 @@ png_get_unknown_chunks(png_const_structr
       return info_ptr->unknown_chunks_num;
    }
 
-   return (0);
+   return 0;
 }
 #endif
 
@@ -1252,7 +1259,7 @@ png_get_palette_max(png_const_structp pn
    if (png_ptr != NULL && info_ptr != NULL)
       return png_ptr->num_palette_max;
 
-   return (-1);
+   return -1;
 }
 #  endif
 #endif
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/pnglibconf.h 5.15.17+dfsg-1/src/3rdparty/libpng/pnglibconf.h
--- 5.15.15+dfsg-2/src/3rdparty/libpng/pnglibconf.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/pnglibconf.h	2024-11-20 13:56:33.000000000 +0000
@@ -1,8 +1,8 @@
 /* pnglibconf.h - library build configuration */
 
-/* libpng version 1.6.40 */
+/* libpng version 1.6.43 */
 
-/* Copyright (c) 2018-2023 Cosmin Truta */
+/* Copyright (c) 2018-2024 Cosmin Truta */
 /* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson */
 
 /* This code is released under the libpng license. */
@@ -27,6 +27,7 @@
 #define PNG_COLORSPACE_SUPPORTED
 #define PNG_CONSOLE_IO_SUPPORTED
 #define PNG_CONVERT_tIME_SUPPORTED
+/*#undef PNG_DISABLE_ADLER32_CHECK_SUPPORTED*/
 #define PNG_EASY_ACCESS_SUPPORTED
 /*#undef PNG_ERROR_NUMBERS_SUPPORTED*/
 #define PNG_ERROR_TEXT_SUPPORTED
@@ -41,6 +42,10 @@
 #define PNG_INCH_CONVERSIONS_SUPPORTED
 #define PNG_INFO_IMAGE_SUPPORTED
 #define PNG_IO_STATE_SUPPORTED
+/*#undef PNG_MIPS_MMI_API_SUPPORTED*/
+/*#undef PNG_MIPS_MMI_CHECK_SUPPORTED*/
+/*#undef PNG_MIPS_MSA_API_SUPPORTED*/
+/*#undef PNG_MIPS_MSA_CHECK_SUPPORTED*/
 #define PNG_MNG_FEATURES_SUPPORTED
 #define PNG_POINTER_INDEXING_SUPPORTED
 /*#undef PNG_POWERPC_VSX_API_SUPPORTED*/
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/pngpread.c 5.15.17+dfsg-1/src/3rdparty/libpng/pngpread.c
--- 5.15.15+dfsg-2/src/3rdparty/libpng/pngpread.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/pngpread.c	2024-11-20 13:56:33.000000000 +0000
@@ -1,7 +1,7 @@
 
 /* pngpread.c - read a png file in push mode
  *
- * Copyright (c) 2018 Cosmin Truta
+ * Copyright (c) 2018-2024 Cosmin Truta
  * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
  * Copyright (c) 1996-1997 Andreas Dilger
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -145,10 +145,10 @@ png_push_read_sig(png_structrp png_ptr,
        num_to_check);
    png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check);
 
-   if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
+   if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check) != 0)
    {
       if (num_checked < 4 &&
-          png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
+          png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4) != 0)
          png_error(png_ptr, "Not a PNG file");
 
       else
@@ -295,6 +295,14 @@ png_push_read_chunk(png_structrp png_ptr
    }
 
 #endif
+#ifdef PNG_READ_eXIf_SUPPORTED
+   else if (png_ptr->chunk_name == png_eXIf)
+   {
+      PNG_PUSH_SAVE_BUFFER_IF_FULL
+      png_handle_eXIf(png_ptr, info_ptr, png_ptr->push_length);
+   }
+
+#endif
 #ifdef PNG_READ_sRGB_SUPPORTED
    else if (chunk_name == png_sRGB)
    {
@@ -1089,7 +1097,7 @@ png_voidp PNGAPI
 png_get_progressive_ptr(png_const_structrp png_ptr)
 {
    if (png_ptr == NULL)
-      return (NULL);
+      return NULL;
 
    return png_ptr->io_ptr;
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/pngpriv.h 5.15.17+dfsg-1/src/3rdparty/libpng/pngpriv.h
--- 5.15.15+dfsg-2/src/3rdparty/libpng/pngpriv.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/pngpriv.h	2024-11-20 13:56:33.000000000 +0000
@@ -1,7 +1,7 @@
 
 /* pngpriv.h - private declarations for use inside libpng
  *
- * Copyright (c) 2018-2023 Cosmin Truta
+ * Copyright (c) 2018-2024 Cosmin Truta
  * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
  * Copyright (c) 1996-1997 Andreas Dilger
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -36,7 +36,7 @@
  * still required (as of 2011-05-02.)
  */
 #ifndef _POSIX_SOURCE
-# define _POSIX_SOURCE 1 /* Just the POSIX 1003.1 and C89 APIs */
+#  define _POSIX_SOURCE 1 /* Just the POSIX 1003.1 and C89 APIs */
 #endif
 
 #ifndef PNG_VERSION_INFO_ONLY
@@ -190,13 +190,27 @@
 #endif /* PNG_ARM_NEON_OPT > 0 */
 
 #ifndef PNG_MIPS_MSA_OPT
-#  if defined(__mips_msa) && (__mips_isa_rev >= 5) && defined(PNG_ALIGNED_MEMORY_SUPPORTED)
+#  if defined(__mips_msa) && (__mips_isa_rev >= 5) && \
+   defined(PNG_ALIGNED_MEMORY_SUPPORTED)
 #     define PNG_MIPS_MSA_OPT 2
 #  else
 #     define PNG_MIPS_MSA_OPT 0
 #  endif
 #endif
 
+#ifndef PNG_MIPS_MMI_OPT
+#  ifdef PNG_MIPS_MMI
+#    if defined(__mips_loongson_mmi) && (_MIPS_SIM == _ABI64) && \
+     defined(PNG_ALIGNED_MEMORY_SUPPORTED)
+#       define PNG_MIPS_MMI_OPT 1
+#    else
+#       define PNG_MIPS_MMI_OPT 0
+#    endif
+#  else
+#    define PNG_MIPS_MMI_OPT 0
+#  endif
+#endif
+
 #ifndef PNG_POWERPC_VSX_OPT
 #  if defined(__PPC64__) && defined(__ALTIVEC__) && defined(__VSX__)
 #     define PNG_POWERPC_VSX_OPT 2
@@ -205,13 +219,21 @@
 #  endif
 #endif
 
+#ifndef PNG_LOONGARCH_LSX_OPT
+#  if defined(__loongarch_sx)
+#     define PNG_LOONGARCH_LSX_OPT 1
+#  else
+#     define PNG_LOONGARCH_LSX_OPT 0
+#  endif
+#endif
+
 #ifndef PNG_INTEL_SSE_OPT
 #   ifdef PNG_INTEL_SSE
       /* Only check for SSE if the build configuration has been modified to
        * enable SSE optimizations.  This means that these optimizations will
        * be off by default.  See contrib/intel for more details.
        */
-#     if defined(__SSE4_1__) || defined(__AVX__) || defined(__SSSE3__) || \
+#      if defined(__SSE4_1__) || defined(__AVX__) || defined(__SSSE3__) || \
        defined(__SSE2__) || defined(_M_X64) || defined(_M_AMD64) || \
        (defined(_M_IX86_FP) && _M_IX86_FP >= 2)
 #         define PNG_INTEL_SSE_OPT 1
@@ -248,7 +270,6 @@
 #endif
 
 #if PNG_MIPS_MSA_OPT > 0
-#  define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_msa
 #  ifndef PNG_MIPS_MSA_IMPLEMENTATION
 #     if defined(__mips_msa)
 #        if defined(__clang__)
@@ -264,11 +285,28 @@
 
 #  ifndef PNG_MIPS_MSA_IMPLEMENTATION
 #     define PNG_MIPS_MSA_IMPLEMENTATION 1
+#     define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_mips
 #  endif
 #else
 #  define PNG_MIPS_MSA_IMPLEMENTATION 0
 #endif /* PNG_MIPS_MSA_OPT > 0 */
 
+#if PNG_MIPS_MMI_OPT > 0
+#  ifndef PNG_MIPS_MMI_IMPLEMENTATION
+#     if defined(__mips_loongson_mmi) && (_MIPS_SIM == _ABI64)
+#        define PNG_MIPS_MMI_IMPLEMENTATION 2
+#     else /* !defined __mips_loongson_mmi  || _MIPS_SIM != _ABI64 */
+#        define PNG_MIPS_MMI_IMPLEMENTATION 0
+#     endif /* __mips_loongson_mmi  && _MIPS_SIM == _ABI64 */
+#  endif /* !PNG_MIPS_MMI_IMPLEMENTATION */
+
+#   if PNG_MIPS_MMI_IMPLEMENTATION > 0
+#      define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_mips
+#   endif
+#else
+#   define PNG_MIPS_MMI_IMPLEMENTATION 0
+#endif /* PNG_MIPS_MMI_OPT > 0 */
+
 #if PNG_POWERPC_VSX_OPT > 0
 #  define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_vsx
 #  define PNG_POWERPC_VSX_IMPLEMENTATION 1
@@ -276,6 +314,12 @@
 #  define PNG_POWERPC_VSX_IMPLEMENTATION 0
 #endif
 
+#if PNG_LOONGARCH_LSX_OPT > 0
+#   define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_lsx
+#   define PNG_LOONGARCH_LSX_IMPLEMENTATION 1
+#else
+#   define PNG_LOONGARCH_LSX_IMPLEMENTATION 0
+#endif
 
 /* Is this a build of a DLL where compilation of the object modules requires
  * different preprocessor settings to those required for a simple library?  If
@@ -514,18 +558,8 @@
     */
 #  include <float.h>
 
-#  if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \
-    defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC)
-   /* We need to check that <math.h> hasn't already been included earlier
-    * as it seems it doesn't agree with <fp.h>, yet we should really use
-    * <fp.h> if possible.
-    */
-#    if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__)
-#      include <fp.h>
-#    endif
-#  else
-#    include <math.h>
-#  endif
+#  include <math.h>
+
 #  if defined(_AMIGA) && defined(__SASC) && defined(_M68881)
    /* Amiga SAS/C: We must include builtin FPU functions when compiling using
     * MATH=68881
@@ -1306,7 +1340,7 @@ PNG_INTERNAL_FUNCTION(void,png_read_filt
     row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
 #endif
 
-#if PNG_MIPS_MSA_OPT > 0
+#if PNG_MIPS_MSA_IMPLEMENTATION == 1
 PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_msa,(png_row_infop row_info,
     png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
 PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_msa,(png_row_infop
@@ -1323,6 +1357,23 @@ PNG_INTERNAL_FUNCTION(void,png_read_filt
     row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
 #endif
 
+#if PNG_MIPS_MMI_IMPLEMENTATION > 0
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_mmi,(png_row_infop row_info,
+    png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_mmi,(png_row_infop
+    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub4_mmi,(png_row_infop
+    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg3_mmi,(png_row_infop
+    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg4_mmi,(png_row_infop
+    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth3_mmi,(png_row_infop
+    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_mmi,(png_row_infop
+    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+#endif
+
 #if PNG_POWERPC_VSX_OPT > 0
 PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_vsx,(png_row_infop row_info,
     png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
@@ -1355,6 +1406,23 @@ PNG_INTERNAL_FUNCTION(void,png_read_filt
     row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
 #endif
 
+#if PNG_LOONGARCH_LSX_IMPLEMENTATION == 1
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_lsx,(png_row_infop
+    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_lsx,(png_row_infop
+    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub4_lsx,(png_row_infop
+    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg3_lsx,(png_row_infop
+    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg4_lsx,(png_row_infop
+    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth3_lsx,(png_row_infop
+    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_lsx,(png_row_infop
+    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+#endif
+
 /* Choose the best filter to use and filter the row data */
 PNG_INTERNAL_FUNCTION(void,png_write_find_filter,(png_structrp png_ptr,
     png_row_infop row_info),PNG_EMPTY);
@@ -2094,17 +2162,27 @@ PNG_INTERNAL_FUNCTION(void, png_init_fil
    (png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
 #endif
 
-#if PNG_MIPS_MSA_OPT > 0
-PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_msa,
+#if PNG_MIPS_MSA_IMPLEMENTATION == 1
+PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_mips,
    (png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
 #endif
 
+#  if PNG_MIPS_MMI_IMPLEMENTATION > 0
+PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_mips,
+   (png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
+#  endif
+
 #  if PNG_INTEL_SSE_IMPLEMENTATION > 0
 PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_sse2,
    (png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
 #  endif
 #endif
 
+#if PNG_LOONGARCH_LSX_OPT > 0
+PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_lsx,
+    (png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
+#endif
+
 PNG_INTERNAL_FUNCTION(png_uint_32, png_check_keyword, (png_structrp png_ptr,
    png_const_charp key, png_bytep new_key), PNG_EMPTY);
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/pngread.c 5.15.17+dfsg-1/src/3rdparty/libpng/pngread.c
--- 5.15.15+dfsg-2/src/3rdparty/libpng/pngread.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/pngread.c	2024-11-20 13:56:33.000000000 +0000
@@ -1,7 +1,7 @@
 
 /* pngread.c - read a PNG file
  *
- * Copyright (c) 2018-2019 Cosmin Truta
+ * Copyright (c) 2018-2024 Cosmin Truta
  * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
  * Copyright (c) 1996-1997 Andreas Dilger
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -568,7 +568,11 @@ png_read_row(png_structrp png_ptr, png_b
 #endif
 
 #ifdef PNG_READ_TRANSFORMS_SUPPORTED
-   if (png_ptr->transformations)
+   if (png_ptr->transformations
+#     ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
+         || png_ptr->num_palette_max >= 0
+#     endif
+      )
       png_do_read_transformations(png_ptr, &row_info);
 #endif
 
@@ -785,7 +789,7 @@ png_read_end(png_structrp png_ptr, png_i
 #ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
    /* Report invalid palette index; added at libng-1.5.10 */
    if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
-       png_ptr->num_palette_max > png_ptr->num_palette)
+       png_ptr->num_palette_max >= png_ptr->num_palette)
       png_benign_error(png_ptr, "Read palette index exceeding num_palette");
 #endif
 
@@ -1049,6 +1053,8 @@ void PNGAPI
 png_read_png(png_structrp png_ptr, png_inforp info_ptr,
     int transforms, voidp params)
 {
+   png_debug(1, "in png_read_png");
+
    if (png_ptr == NULL || info_ptr == NULL)
       return;
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/pngrtran.c 5.15.17+dfsg-1/src/3rdparty/libpng/pngrtran.c
--- 5.15.15+dfsg-2/src/3rdparty/libpng/pngrtran.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/pngrtran.c	2024-11-20 13:56:33.000000000 +0000
@@ -1,7 +1,7 @@
 
 /* pngrtran.c - transforms the data in a row for PNG readers
  *
- * Copyright (c) 2018-2019 Cosmin Truta
+ * Copyright (c) 2018-2024 Cosmin Truta
  * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
  * Copyright (c) 1996-1997 Andreas Dilger
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -290,21 +290,20 @@ png_set_alpha_mode_fixed(png_structrp pn
    int compose = 0;
    png_fixed_point file_gamma;
 
-   png_debug(1, "in png_set_alpha_mode");
+   png_debug(1, "in png_set_alpha_mode_fixed");
 
    if (png_rtran_ok(png_ptr, 0) == 0)
       return;
 
    output_gamma = translate_gamma_flags(png_ptr, output_gamma, 1/*screen*/);
 
-   /* Validate the value to ensure it is in a reasonable range. The value
+   /* Validate the value to ensure it is in a reasonable range.  The value
     * is expected to be 1 or greater, but this range test allows for some
-    * viewing correction values.  The intent is to weed out users of this API
-    * who use the inverse of the gamma value accidentally!  Since some of these
-    * values are reasonable this may have to be changed:
+    * viewing correction values.  The intent is to weed out the API users
+    * who might use the inverse of the gamma value accidentally!
     *
-    * 1.6.x: changed from 0.07..3 to 0.01..100 (to accommodate the optimal 16-bit
-    * gamma of 36, and its reciprocal.)
+    * In libpng 1.6.0, we changed from 0.07..3 to 0.01..100, to accommodate
+    * the optimal 16-bit gamma of 36 and its reciprocal.
     */
    if (output_gamma < 1000 || output_gamma > 10000000)
       png_error(png_ptr, "output gamma out of expected range");
@@ -441,7 +440,7 @@ png_set_quantize(png_structrp png_ptr, p
       int i;
 
       png_ptr->quantize_index = (png_bytep)png_malloc(png_ptr,
-          (png_alloc_size_t)((png_uint_32)num_palette * (sizeof (png_byte))));
+          (png_alloc_size_t)num_palette);
       for (i = 0; i < num_palette; i++)
          png_ptr->quantize_index[i] = (png_byte)i;
    }
@@ -458,7 +457,7 @@ png_set_quantize(png_structrp png_ptr, p
 
          /* Initialize an array to sort colors */
          png_ptr->quantize_sort = (png_bytep)png_malloc(png_ptr,
-             (png_alloc_size_t)((png_uint_32)num_palette * (sizeof (png_byte))));
+             (png_alloc_size_t)num_palette);
 
          /* Initialize the quantize_sort array */
          for (i = 0; i < num_palette; i++)
@@ -592,11 +591,9 @@ png_set_quantize(png_structrp png_ptr, p
 
          /* Initialize palette index arrays */
          png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr,
-             (png_alloc_size_t)((png_uint_32)num_palette *
-             (sizeof (png_byte))));
+             (png_alloc_size_t)num_palette);
          png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr,
-             (png_alloc_size_t)((png_uint_32)num_palette *
-             (sizeof (png_byte))));
+             (png_alloc_size_t)num_palette);
 
          /* Initialize the sort array */
          for (i = 0; i < num_palette; i++)
@@ -761,12 +758,11 @@ png_set_quantize(png_structrp png_ptr, p
       size_t num_entries = ((size_t)1 << total_bits);
 
       png_ptr->palette_lookup = (png_bytep)png_calloc(png_ptr,
-          (png_alloc_size_t)(num_entries * (sizeof (png_byte))));
+          (png_alloc_size_t)(num_entries));
 
-      distance = (png_bytep)png_malloc(png_ptr, (png_alloc_size_t)(num_entries *
-          (sizeof (png_byte))));
+      distance = (png_bytep)png_malloc(png_ptr, (png_alloc_size_t)num_entries);
 
-      memset(distance, 0xff, num_entries * (sizeof (png_byte)));
+      memset(distance, 0xff, num_entries);
 
       for (i = 0; i < num_palette; i++)
       {
@@ -970,7 +966,7 @@ void PNGFAPI
 png_set_rgb_to_gray_fixed(png_structrp png_ptr, int error_action,
     png_fixed_point red, png_fixed_point green)
 {
-   png_debug(1, "in png_set_rgb_to_gray");
+   png_debug(1, "in png_set_rgb_to_gray_fixed");
 
    /* Need the IHDR here because of the check on color_type below. */
    /* TODO: fix this */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/pngrutil.c 5.15.17+dfsg-1/src/3rdparty/libpng/pngrutil.c
--- 5.15.15+dfsg-2/src/3rdparty/libpng/pngrutil.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/pngrutil.c	2024-11-20 13:56:33.000000000 +0000
@@ -1,7 +1,7 @@
 
 /* pngrutil.c - utilities to read a PNG file
  *
- * Copyright (c) 2018-2022 Cosmin Truta
+ * Copyright (c) 2018-2024 Cosmin Truta
  * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
  * Copyright (c) 1996-1997 Andreas Dilger
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -26,7 +26,7 @@ png_get_uint_31(png_const_structrp png_p
    if (uval > PNG_UINT_31_MAX)
       png_error(png_ptr, "PNG unsigned integer out of range");
 
-   return (uval);
+   return uval;
 }
 
 #if defined(PNG_READ_gAMA_SUPPORTED) || defined(PNG_READ_cHRM_SUPPORTED)
@@ -140,7 +140,7 @@ png_read_sig(png_structrp png_ptr, png_i
    if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check) != 0)
    {
       if (num_checked < 4 &&
-          png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
+          png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4) != 0)
          png_error(png_ptr, "Not a PNG file");
       else
          png_error(png_ptr, "PNG file corrupted by ASCII conversion");
@@ -171,7 +171,7 @@ png_read_chunk_header(png_structrp png_p
    /* Put the chunk name into png_ptr->chunk_name. */
    png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(buf+4);
 
-   png_debug2(0, "Reading %lx chunk, length = %lu",
+   png_debug2(0, "Reading chunk typeid = 0x%lx, length = %lu",
        (unsigned long)png_ptr->chunk_name, (unsigned long)length);
 
    /* Reset the crc and run it over the chunk name. */
@@ -238,10 +238,10 @@ png_crc_finish(png_structrp png_ptr, png
       else
          png_chunk_error(png_ptr, "CRC error");
 
-      return (1);
+      return 1;
    }
 
-   return (0);
+   return 0;
 }
 
 /* Compare the CRC stored in the PNG file with that calculated by libpng from
@@ -277,11 +277,11 @@ png_crc_error(png_structrp png_ptr)
    if (need_crc != 0)
    {
       crc = png_get_uint_32(crc_bytes);
-      return ((int)(crc != png_ptr->crc));
+      return crc != png_ptr->crc;
    }
 
    else
-      return (0);
+      return 0;
 }
 
 #if defined(PNG_READ_iCCP_SUPPORTED) || defined(PNG_READ_iTXt_SUPPORTED) ||\
@@ -421,8 +421,7 @@ png_inflate_claim(png_structrp png_ptr,
             png_ptr->flags |= PNG_FLAG_ZSTREAM_INITIALIZED;
       }
 
-#if ZLIB_VERNUM >= 0x1290 && \
-   defined(PNG_SET_OPTION_SUPPORTED) && defined(PNG_IGNORE_ADLER32)
+#ifdef PNG_DISABLE_ADLER32_CHECK_SUPPORTED
       if (((png_ptr->options >> PNG_IGNORE_ADLER32) & 3) == PNG_OPTION_ON)
          /* Turn off validation of the ADLER32 checksum in IDAT chunks */
          ret = inflateValidate(&png_ptr->zstream, 0);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/pngset.c 5.15.17+dfsg-1/src/3rdparty/libpng/pngset.c
--- 5.15.15+dfsg-2/src/3rdparty/libpng/pngset.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/pngset.c	2024-11-20 13:56:33.000000000 +0000
@@ -1,7 +1,7 @@
 
 /* pngset.c - storage of image information into info struct
  *
- * Copyright (c) 2018-2023 Cosmin Truta
+ * Copyright (c) 2018-2024 Cosmin Truta
  * Copyright (c) 1998-2018 Glenn Randers-Pehrson
  * Copyright (c) 1996-1997 Andreas Dilger
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -763,11 +763,11 @@ png_set_text_2(png_const_structrp png_pt
 {
    int i;
 
-   png_debug1(1, "in %lx storage function", png_ptr == NULL ? 0xabadca11U :
-      (unsigned long)png_ptr->chunk_name);
+   png_debug1(1, "in text storage function, chunk typeid = 0x%lx",
+      png_ptr == NULL ? 0xabadca11UL : (unsigned long)png_ptr->chunk_name);
 
    if (png_ptr == NULL || info_ptr == NULL || num_text <= 0 || text_ptr == NULL)
-      return(0);
+      return 0;
 
    /* Make sure we have enough space in the "text" array in info_struct
     * to hold all of the incoming text_ptr objects.  This compare can't overflow
@@ -947,7 +947,7 @@ png_set_text_2(png_const_structrp png_pt
       png_debug1(3, "transferred text chunk %d", info_ptr->num_text);
    }
 
-   return(0);
+   return 0;
 }
 #endif
 
@@ -1063,6 +1063,8 @@ png_set_sPLT(png_const_structrp png_ptr,
 {
    png_sPLT_tp np;
 
+   png_debug1(1, "in %s storage function", "sPLT");
+
    if (png_ptr == NULL || info_ptr == NULL || nentries <= 0 || entries == NULL)
       return;
 
@@ -1537,7 +1539,7 @@ void PNGAPI
 png_set_rows(png_const_structrp png_ptr, png_inforp info_ptr,
     png_bytepp row_pointers)
 {
-   png_debug1(1, "in %s storage function", "rows");
+   png_debug(1, "in png_set_rows");
 
    if (png_ptr == NULL || info_ptr == NULL)
       return;
@@ -1556,6 +1558,8 @@ png_set_rows(png_const_structrp png_ptr,
 void PNGAPI
 png_set_compression_buffer_size(png_structrp png_ptr, size_t size)
 {
+   png_debug(1, "in png_set_compression_buffer_size");
+
    if (png_ptr == NULL)
       return;
 
@@ -1627,6 +1631,8 @@ void PNGAPI
 png_set_user_limits(png_structrp png_ptr, png_uint_32 user_width_max,
     png_uint_32 user_height_max)
 {
+   png_debug(1, "in png_set_user_limits");
+
    /* Images with dimensions larger than these limits will be
     * rejected by png_set_IHDR().  To accept any PNG datastream
     * regardless of dimensions, set both limits to 0x7fffffff.
@@ -1642,6 +1648,8 @@ png_set_user_limits(png_structrp png_ptr
 void PNGAPI
 png_set_chunk_cache_max(png_structrp png_ptr, png_uint_32 user_chunk_cache_max)
 {
+   png_debug(1, "in png_set_chunk_cache_max");
+
    if (png_ptr != NULL)
       png_ptr->user_chunk_cache_max = user_chunk_cache_max;
 }
@@ -1651,6 +1659,8 @@ void PNGAPI
 png_set_chunk_malloc_max(png_structrp png_ptr,
     png_alloc_size_t user_chunk_malloc_max)
 {
+   png_debug(1, "in png_set_chunk_malloc_max");
+
    if (png_ptr != NULL)
       png_ptr->user_chunk_malloc_max = user_chunk_malloc_max;
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/pngtrans.c 5.15.17+dfsg-1/src/3rdparty/libpng/pngtrans.c
--- 5.15.15+dfsg-2/src/3rdparty/libpng/pngtrans.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/pngtrans.c	2024-11-20 13:56:33.000000000 +0000
@@ -1,7 +1,7 @@
 
 /* pngtrans.c - transforms the data in a row (used by both readers and writers)
  *
- * Copyright (c) 2018 Cosmin Truta
+ * Copyright (c) 2018-2024 Cosmin Truta
  * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
  * Copyright (c) 1996-1997 Andreas Dilger
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -103,10 +103,10 @@ png_set_interlace_handling(png_structrp
    if (png_ptr != 0 && png_ptr->interlaced != 0)
    {
       png_ptr->transformations |= PNG_INTERLACE;
-      return (7);
+      return 7;
    }
 
-   return (1);
+   return 1;
 }
 #endif
 
@@ -498,6 +498,8 @@ png_do_strip_channel(png_row_infop row_i
    png_bytep dp = row; /* destination pointer */
    png_bytep ep = row + row_info->rowbytes; /* One beyond end of row */
 
+   png_debug(1, "in png_do_strip_channel");
+
    /* At the start sp will point to the first byte to copy and dp to where
     * it is copied to.  ep always points just beyond the end of the row, so
     * the loop simply copies (channels-1) channels until sp reaches ep.
@@ -698,6 +700,8 @@ png_do_bgr(png_row_infop row_info, png_b
 void /* PRIVATE */
 png_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info)
 {
+   png_debug(1, "in png_do_check_palette_indexes");
+
    if (png_ptr->num_palette < (1 << row_info->bit_depth) &&
       png_ptr->num_palette > 0) /* num_palette can be 0 in MNG files */
    {
@@ -708,7 +712,7 @@ png_do_check_palette_indexes(png_structr
        * forms produced on either GCC or MSVC.
        */
       int padding = PNG_PADBITS(row_info->pixel_depth, row_info->width);
-      png_bytep rp = png_ptr->row_buf + row_info->rowbytes - 1;
+      png_bytep rp = png_ptr->row_buf + row_info->rowbytes;
 
       switch (row_info->bit_depth)
       {
@@ -833,7 +837,7 @@ png_voidp PNGAPI
 png_get_user_transform_ptr(png_const_structrp png_ptr)
 {
    if (png_ptr == NULL)
-      return (NULL);
+      return NULL;
 
    return png_ptr->user_transform_ptr;
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/pngwrite.c 5.15.17+dfsg-1/src/3rdparty/libpng/pngwrite.c
--- 5.15.15+dfsg-2/src/3rdparty/libpng/pngwrite.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/pngwrite.c	2024-11-20 13:56:33.000000000 +0000
@@ -1,7 +1,7 @@
 
 /* pngwrite.c - general routines to write a PNG file
  *
- * Copyright (c) 2018-2023 Cosmin Truta
+ * Copyright (c) 2018-2024 Cosmin Truta
  * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
  * Copyright (c) 1996-1997 Andreas Dilger
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -369,7 +369,8 @@ png_write_end(png_structrp png_ptr, png_
       png_error(png_ptr, "No IDATs written into file");
 
 #ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED
-   if (png_ptr->num_palette_max > png_ptr->num_palette)
+   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
+       png_ptr->num_palette_max >= png_ptr->num_palette)
       png_benign_error(png_ptr, "Wrote palette index exceeding num_palette");
 #endif
 
@@ -714,12 +715,12 @@ png_write_row(png_structrp png_ptr, png_
    /* 1.5.6: moved from png_struct to be a local structure: */
    png_row_info row_info;
 
-   if (png_ptr == NULL)
-      return;
-
    png_debug2(1, "in png_write_row (row %u, pass %d)",
        png_ptr->row_number, png_ptr->pass);
 
+   if (png_ptr == NULL)
+      return;
+
    /* Initialize transformations and other stuff if first time */
    if (png_ptr->row_number == 0 && png_ptr->pass == 0)
    {
@@ -1210,6 +1211,8 @@ png_set_compression_strategy(png_structr
 void PNGAPI
 png_set_compression_window_bits(png_structrp png_ptr, int window_bits)
 {
+   png_debug(1, "in png_set_compression_window_bits");
+
    if (png_ptr == NULL)
       return;
 
@@ -1293,6 +1296,8 @@ png_set_text_compression_strategy(png_st
 void PNGAPI
 png_set_text_compression_window_bits(png_structrp png_ptr, int window_bits)
 {
+   png_debug(1, "in png_set_text_compression_window_bits");
+
    if (png_ptr == NULL)
       return;
 
@@ -1330,6 +1335,8 @@ png_set_text_compression_method(png_stru
 void PNGAPI
 png_set_write_status_fn(png_structrp png_ptr, png_write_status_ptr write_row_fn)
 {
+   png_debug(1, "in png_set_write_status_fn");
+
    if (png_ptr == NULL)
       return;
 
@@ -1357,6 +1364,8 @@ void PNGAPI
 png_write_png(png_structrp png_ptr, png_inforp info_ptr,
     int transforms, voidp params)
 {
+   png_debug(1, "in png_write_png");
+
    if (png_ptr == NULL || info_ptr == NULL)
       return;
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/pngwutil.c 5.15.17+dfsg-1/src/3rdparty/libpng/pngwutil.c
--- 5.15.15+dfsg-2/src/3rdparty/libpng/pngwutil.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/pngwutil.c	2024-11-20 13:56:33.000000000 +0000
@@ -1,7 +1,7 @@
 
 /* pngwutil.c - utilities to write a PNG file
  *
- * Copyright (c) 2018-2022 Cosmin Truta
+ * Copyright (c) 2018-2024 Cosmin Truta
  * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
  * Copyright (c) 1996-1997 Andreas Dilger
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -2311,7 +2311,7 @@ png_setup_sub_row(png_structrp png_ptr,
         break;
    }
 
-   return (sum);
+   return sum;
 }
 
 static void /* PRIVATE */
@@ -2361,7 +2361,7 @@ png_setup_up_row(png_structrp png_ptr, s
         break;
    }
 
-   return (sum);
+   return sum;
 }
 static void /* PRIVATE */
 png_setup_up_row_only(png_structrp png_ptr, size_t row_bytes)
@@ -2417,7 +2417,7 @@ png_setup_avg_row(png_structrp png_ptr,
         break;
    }
 
-   return (sum);
+   return sum;
 }
 static void /* PRIVATE */
 png_setup_avg_row_only(png_structrp png_ptr, png_uint_32 bpp,
@@ -2500,7 +2500,7 @@ png_setup_paeth_row(png_structrp png_ptr
         break;
    }
 
-   return (sum);
+   return sum;
 }
 static void /* PRIVATE */
 png_setup_paeth_row_only(png_structrp png_ptr, png_uint_32 bpp,
diff -pruN 5.15.15+dfsg-2/src/3rdparty/libpng/qt_attribution.json 5.15.17+dfsg-1/src/3rdparty/libpng/qt_attribution.json
--- 5.15.15+dfsg-2/src/3rdparty/libpng/qt_attribution.json	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/libpng/qt_attribution.json	2024-11-20 13:56:33.000000000 +0000
@@ -6,13 +6,13 @@
 
     "Description": "libpng is the official PNG reference library.",
     "Homepage": "http://www.libpng.org/pub/png/libpng.html",
-    "Version": "1.6.40",
-    "DownloadLocation": "https://download.sourceforge.net/libpng/libpng-1.6.40.tar.xz",
+    "Version": "1.6.43",
+    "DownloadLocation": "https://download.sourceforge.net/libpng/libpng-1.6.43.tar.xz",
     "License": "libpng License and PNG Reference Library version 2",
     "LicenseId": "Libpng AND libpng-2.0",
     "LicenseFile": "LICENSE",
-    "Copyright": "Copyright (c) 1995-2023 The PNG Reference Library Authors
-Copyright (c) 2000-2023 Cosmin Truta
+    "Copyright": "Copyright (c) 1995-2024 The PNG Reference Library Authors
+Copyright (c) 2000-2024 Cosmin Truta
 Copyright (c) 1998-2018 Glenn Randers-Pehrson
 Copyright (c) 1996-1997 Andreas Dilger
 Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
diff -pruN 5.15.15+dfsg-2/src/3rdparty/md4c/md4c.c 5.15.17+dfsg-1/src/3rdparty/md4c/md4c.c
--- 5.15.15+dfsg-2/src/3rdparty/md4c/md4c.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/md4c/md4c.c	2024-11-20 13:56:33.000000000 +0000
@@ -2,7 +2,7 @@
  * MD4C: Markdown parser for C
  * (http://github.com/mity/md4c)
  *
- * Copyright (c) 2016-2020 Martin Mitas
+ * Copyright (c) 2016-2024 Martin Mitáš
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -67,11 +67,72 @@
 #define STRINGIZE_(x)       #x
 #define STRINGIZE(x)        STRINGIZE_(x)
 
+#define MAX(a,b)            ((a) > (b) ? (a) : (b))
+#define MIN(a,b)            ((a) < (b) ? (a) : (b))
+
 #ifndef TRUE
     #define TRUE            1
     #define FALSE           0
 #endif
 
+#define MD_LOG(msg)                                                     \
+    do {                                                                \
+        if(ctx->parser.debug_log != NULL)                               \
+            ctx->parser.debug_log((msg), ctx->userdata);                \
+    } while(0)
+
+#ifdef DEBUG
+    #define MD_ASSERT(cond)                                             \
+            do {                                                        \
+                if(!(cond)) {                                           \
+                    MD_LOG(__FILE__ ":" STRINGIZE(__LINE__) ": "        \
+                           "Assertion '" STRINGIZE(cond) "' failed.");  \
+                    exit(1);                                            \
+                }                                                       \
+            } while(0)
+
+    #define MD_UNREACHABLE()        MD_ASSERT(1 == 0)
+#else
+    #ifdef __GNUC__
+        #define MD_ASSERT(cond)     do { if(!(cond)) __builtin_unreachable(); } while(0)
+        #define MD_UNREACHABLE()    do { __builtin_unreachable(); } while(0)
+    #elif defined _MSC_VER  &&  _MSC_VER > 120
+        #define MD_ASSERT(cond)     do { __assume(cond); } while(0)
+        #define MD_UNREACHABLE()    do { __assume(0); } while(0)
+    #else
+        #define MD_ASSERT(cond)     do {} while(0)
+        #define MD_UNREACHABLE()    do {} while(0)
+    #endif
+#endif
+
+/* For falling through case labels in switch statements. */
+#if defined __clang__ && __clang_major__ >= 12
+    #define MD_FALLTHROUGH()        __attribute__((fallthrough))
+#elif defined __GNUC__ && __GNUC__ >= 7
+    #define MD_FALLTHROUGH()        __attribute__((fallthrough))
+#else
+    #define MD_FALLTHROUGH()        ((void)0)
+#endif
+
+/* Suppress "unused parameter" warnings. */
+#define MD_UNUSED(x)                ((void)x)
+
+
+/******************************
+ ***  Some internal limits  ***
+ ******************************/
+
+/* We limit code span marks to lower than 32 backticks. This solves the
+ * pathologic case of too many openers, each of different length: Their
+ * resolving would be then O(n^2). */
+#define CODESPAN_MARK_MAXLEN    32
+
+/* We limit column count of tables to prevent quadratic explosion of output
+ * from pathological input of a table thousands of columns and thousands
+ * of rows where rows are requested with as little as single character
+ * per-line, relying on us to "helpfully" fill all the missing "<td></td>". */
+#define TABLE_MAXCOLCOUNT       128
+
 
 /************************
  ***  Internal Types  ***
@@ -88,14 +149,13 @@ typedef struct MD_CONTAINER_tag MD_CONTA
 typedef struct MD_REF_DEF_tag MD_REF_DEF;
 
 
-/* During analyzes of inline marks, we need to manage some "mark chains",
- * of (yet unresolved) openers. This structure holds start/end of the chain.
- * The chain internals are then realized through MD_MARK::prev and ::next.
+/* During analyzes of inline marks, we need to manage stacks of unresolved
+ * openers of the given type.
+ * The stack connects the marks via MD_MARK::next;
  */
-typedef struct MD_MARKCHAIN_tag MD_MARKCHAIN;
-struct MD_MARKCHAIN_tag {
-    int head;   /* Index of first mark in the chain, or -1 if empty. */
-    int tail;   /* Index of last mark in the chain, or -1 if empty. */
+typedef struct MD_MARKSTACK_tag MD_MARKSTACK;
+struct MD_MARKSTACK_tag {
+    int top;        /* -1 if empty. */
 };
 
 /* Context propagated through all the parsing. */
@@ -136,24 +196,33 @@ struct MD_CTX_tag {
 #endif
 
     /* For resolving of inline spans. */
-    MD_MARKCHAIN mark_chains[13];
-#define PTR_CHAIN                               (ctx->mark_chains[0])
-#define TABLECELLBOUNDARIES                     (ctx->mark_chains[1])
-#define ASTERISK_OPENERS_extraword_mod3_0       (ctx->mark_chains[2])
-#define ASTERISK_OPENERS_extraword_mod3_1       (ctx->mark_chains[3])
-#define ASTERISK_OPENERS_extraword_mod3_2       (ctx->mark_chains[4])
-#define ASTERISK_OPENERS_intraword_mod3_0       (ctx->mark_chains[5])
-#define ASTERISK_OPENERS_intraword_mod3_1       (ctx->mark_chains[6])
-#define ASTERISK_OPENERS_intraword_mod3_2       (ctx->mark_chains[7])
-#define UNDERSCORE_OPENERS                      (ctx->mark_chains[8])
-#define TILDE_OPENERS_1                         (ctx->mark_chains[9])
-#define TILDE_OPENERS_2                         (ctx->mark_chains[10])
-#define BRACKET_OPENERS                         (ctx->mark_chains[11])
-#define DOLLAR_OPENERS                          (ctx->mark_chains[12])
-#define OPENERS_CHAIN_FIRST                     2
-#define OPENERS_CHAIN_LAST                      12
+    MD_MARKSTACK opener_stacks[16];
+#define ASTERISK_OPENERS_oo_mod3_0      (ctx->opener_stacks[0])     /* Opener-only */
+#define ASTERISK_OPENERS_oo_mod3_1      (ctx->opener_stacks[1])
+#define ASTERISK_OPENERS_oo_mod3_2      (ctx->opener_stacks[2])
+#define ASTERISK_OPENERS_oc_mod3_0      (ctx->opener_stacks[3])     /* Both opener and closer candidate */
+#define ASTERISK_OPENERS_oc_mod3_1      (ctx->opener_stacks[4])
+#define ASTERISK_OPENERS_oc_mod3_2      (ctx->opener_stacks[5])
+#define UNDERSCORE_OPENERS_oo_mod3_0    (ctx->opener_stacks[6])     /* Opener-only */
+#define UNDERSCORE_OPENERS_oo_mod3_1    (ctx->opener_stacks[7])
+#define UNDERSCORE_OPENERS_oo_mod3_2    (ctx->opener_stacks[8])
+#define UNDERSCORE_OPENERS_oc_mod3_0    (ctx->opener_stacks[9])     /* Both opener and closer candidate */
+#define UNDERSCORE_OPENERS_oc_mod3_1    (ctx->opener_stacks[10])
+#define UNDERSCORE_OPENERS_oc_mod3_2    (ctx->opener_stacks[11])
+#define TILDE_OPENERS_1                 (ctx->opener_stacks[12])
+#define TILDE_OPENERS_2                 (ctx->opener_stacks[13])
+#define BRACKET_OPENERS                 (ctx->opener_stacks[14])
+#define DOLLAR_OPENERS                  (ctx->opener_stacks[15])
+
+    /* Stack of dummies which need to call free() for pointers stored in them.
+     * These are constructed during inline parsing and freed after all the block
+     * is processed (i.e. all callbacks referring those strings are called). */
+    MD_MARKSTACK ptr_stack;
 
+    /* For resolving table rows. */
     int n_table_cell_boundaries;
+    int table_cell_boundaries_head;
+    int table_cell_boundaries_tail;
 
     /* For resolving links. */
     int unresolved_link_head;
@@ -209,8 +278,9 @@ typedef enum MD_LINETYPE_tag MD_LINETYPE
 
 typedef struct MD_LINE_ANALYSIS_tag MD_LINE_ANALYSIS;
 struct MD_LINE_ANALYSIS_tag {
-    MD_LINETYPE type    : 16;
-    unsigned data       : 16;
+    MD_LINETYPE type;
+    unsigned data;
+    int enforce_new_block;
     OFF beg;
     OFF end;
     unsigned indent;        /* Indentation level. */
@@ -230,41 +300,6 @@ struct MD_VERBATIMLINE_tag {
 };
 
 
-/*******************
- ***  Debugging  ***
- *******************/
-
-#define MD_LOG(msg)                                                     \
-    do {                                                                \
-        if(ctx->parser.debug_log != NULL)                               \
-            ctx->parser.debug_log((msg), ctx->userdata);                \
-    } while(0)
-
-#ifdef DEBUG
-    #define MD_ASSERT(cond)                                             \
-            do {                                                        \
-                if(!(cond)) {                                           \
-                    MD_LOG(__FILE__ ":" STRINGIZE(__LINE__) ": "        \
-                           "Assertion '" STRINGIZE(cond) "' failed.");  \
-                    exit(1);                                            \
-                }                                                       \
-            } while(0)
-
-    #define MD_UNREACHABLE()        MD_ASSERT(1 == 0)
-#else
-    #ifdef __GNUC__
-        #define MD_ASSERT(cond)     do { if(!(cond)) __builtin_unreachable(); } while(0)
-        #define MD_UNREACHABLE()    do { __builtin_unreachable(); } while(0)
-    #elif defined _MSC_VER  &&  _MSC_VER > 120
-        #define MD_ASSERT(cond)     do { __assume(cond); } while(0)
-        #define MD_UNREACHABLE()    do { __assume(0); } while(0)
-    #else
-        #define MD_ASSERT(cond)     do {} while(0)
-        #define MD_UNREACHABLE()    do {} while(0)
-    #endif
-#endif
-
-
 /*****************
  ***  Helpers  ***
  *****************/
@@ -458,6 +493,40 @@ md_text_with_null_replacement(MD_CTX* ct
     } while(0)
 
 
+/* If the offset falls into a gap between line, we return the following
+ * line. */
+static const MD_LINE*
+md_lookup_line(OFF off, const MD_LINE* lines, MD_SIZE n_lines, MD_SIZE* p_line_index)
+{
+    MD_SIZE lo, hi;
+    MD_SIZE pivot;
+    const MD_LINE* line;
+
+    lo = 0;
+    hi = n_lines - 1;
+    while(lo <= hi) {
+        pivot = (lo + hi) / 2;
+        line = &lines[pivot];
+
+        if(off < line->beg) {
+            if(hi == 0  ||  lines[hi-1].end < off) {
+                if(p_line_index != NULL)
+                    *p_line_index = pivot;
+                return line;
+            }
+            hi = pivot - 1;
+        } else if(off > line->end) {
+            lo = pivot + 1;
+        } else {
+            if(p_line_index != NULL)
+                *p_line_index = pivot;
+            return line;
+        }
+    }
+
+    return NULL;
+}
+
 
 /*************************
  ***  Unicode Support  ***
@@ -466,7 +535,7 @@ md_text_with_null_replacement(MD_CTX* ct
 typedef struct MD_UNICODE_FOLD_INFO_tag MD_UNICODE_FOLD_INFO;
 struct MD_UNICODE_FOLD_INFO_tag {
     unsigned codepoints[3];
-    int n_codepoints;
+    unsigned n_codepoints;
 };
 
 
@@ -530,39 +599,67 @@ struct MD_UNICODE_FOLD_INFO_tag {
     {
 #define R(cp_min, cp_max)   ((cp_min) | 0x40000000), ((cp_max) | 0x80000000)
 #define S(cp)               (cp)
-        /* Unicode "Pc", "Pd", "Pe", "Pf", "Pi", "Po", "Ps" categories.
+        /* Unicode general "P" and "S" categories.
          * (generated by scripts/build_punct_map.py) */
         static const unsigned PUNCT_MAP[] = {
-            R(0x0021,0x0023), R(0x0025,0x002a), R(0x002c,0x002f), R(0x003a,0x003b), R(0x003f,0x0040),
-            R(0x005b,0x005d), S(0x005f), S(0x007b), S(0x007d), S(0x00a1), S(0x00a7), S(0x00ab), R(0x00b6,0x00b7),
-            S(0x00bb), S(0x00bf), S(0x037e), S(0x0387), R(0x055a,0x055f), R(0x0589,0x058a), S(0x05be), S(0x05c0),
-            S(0x05c3), S(0x05c6), R(0x05f3,0x05f4), R(0x0609,0x060a), R(0x060c,0x060d), S(0x061b), R(0x061e,0x061f),
-            R(0x066a,0x066d), S(0x06d4), R(0x0700,0x070d), R(0x07f7,0x07f9), R(0x0830,0x083e), S(0x085e),
-            R(0x0964,0x0965), S(0x0970), S(0x09fd), S(0x0a76), S(0x0af0), S(0x0c77), S(0x0c84), S(0x0df4), S(0x0e4f),
-            R(0x0e5a,0x0e5b), R(0x0f04,0x0f12), S(0x0f14), R(0x0f3a,0x0f3d), S(0x0f85), R(0x0fd0,0x0fd4),
-            R(0x0fd9,0x0fda), R(0x104a,0x104f), S(0x10fb), R(0x1360,0x1368), S(0x1400), S(0x166e), R(0x169b,0x169c),
-            R(0x16eb,0x16ed), R(0x1735,0x1736), R(0x17d4,0x17d6), R(0x17d8,0x17da), R(0x1800,0x180a),
-            R(0x1944,0x1945), R(0x1a1e,0x1a1f), R(0x1aa0,0x1aa6), R(0x1aa8,0x1aad), R(0x1b5a,0x1b60),
-            R(0x1bfc,0x1bff), R(0x1c3b,0x1c3f), R(0x1c7e,0x1c7f), R(0x1cc0,0x1cc7), S(0x1cd3), R(0x2010,0x2027),
-            R(0x2030,0x2043), R(0x2045,0x2051), R(0x2053,0x205e), R(0x207d,0x207e), R(0x208d,0x208e),
-            R(0x2308,0x230b), R(0x2329,0x232a), R(0x2768,0x2775), R(0x27c5,0x27c6), R(0x27e6,0x27ef),
-            R(0x2983,0x2998), R(0x29d8,0x29db), R(0x29fc,0x29fd), R(0x2cf9,0x2cfc), R(0x2cfe,0x2cff), S(0x2d70),
-            R(0x2e00,0x2e2e), R(0x2e30,0x2e4f), S(0x2e52), R(0x3001,0x3003), R(0x3008,0x3011), R(0x3014,0x301f),
-            S(0x3030), S(0x303d), S(0x30a0), S(0x30fb), R(0xa4fe,0xa4ff), R(0xa60d,0xa60f), S(0xa673), S(0xa67e),
-            R(0xa6f2,0xa6f7), R(0xa874,0xa877), R(0xa8ce,0xa8cf), R(0xa8f8,0xa8fa), S(0xa8fc), R(0xa92e,0xa92f),
-            S(0xa95f), R(0xa9c1,0xa9cd), R(0xa9de,0xa9df), R(0xaa5c,0xaa5f), R(0xaade,0xaadf), R(0xaaf0,0xaaf1),
-            S(0xabeb), R(0xfd3e,0xfd3f), R(0xfe10,0xfe19), R(0xfe30,0xfe52), R(0xfe54,0xfe61), S(0xfe63), S(0xfe68),
-            R(0xfe6a,0xfe6b), R(0xff01,0xff03), R(0xff05,0xff0a), R(0xff0c,0xff0f), R(0xff1a,0xff1b),
-            R(0xff1f,0xff20), R(0xff3b,0xff3d), S(0xff3f), S(0xff5b), S(0xff5d), R(0xff5f,0xff65), R(0x10100,0x10102),
-            S(0x1039f), S(0x103d0), S(0x1056f), S(0x10857), S(0x1091f), S(0x1093f), R(0x10a50,0x10a58), S(0x10a7f),
-            R(0x10af0,0x10af6), R(0x10b39,0x10b3f), R(0x10b99,0x10b9c), S(0x10ead), R(0x10f55,0x10f59),
-            R(0x11047,0x1104d), R(0x110bb,0x110bc), R(0x110be,0x110c1), R(0x11140,0x11143), R(0x11174,0x11175),
-            R(0x111c5,0x111c8), S(0x111cd), S(0x111db), R(0x111dd,0x111df), R(0x11238,0x1123d), S(0x112a9),
-            R(0x1144b,0x1144f), R(0x1145a,0x1145b), S(0x1145d), S(0x114c6), R(0x115c1,0x115d7), R(0x11641,0x11643),
-            R(0x11660,0x1166c), R(0x1173c,0x1173e), S(0x1183b), R(0x11944,0x11946), S(0x119e2), R(0x11a3f,0x11a46),
-            R(0x11a9a,0x11a9c), R(0x11a9e,0x11aa2), R(0x11c41,0x11c45), R(0x11c70,0x11c71), R(0x11ef7,0x11ef8),
-            S(0x11fff), R(0x12470,0x12474), R(0x16a6e,0x16a6f), S(0x16af5), R(0x16b37,0x16b3b), S(0x16b44),
-            R(0x16e97,0x16e9a), S(0x16fe2), S(0x1bc9f), R(0x1da87,0x1da8b), R(0x1e95e,0x1e95f)
+            R(0x0021,0x002f), R(0x003a,0x0040), R(0x005b,0x0060), R(0x007b,0x007e), R(0x00a1,0x00a9),
+            R(0x00ab,0x00ac), R(0x00ae,0x00b1), S(0x00b4), R(0x00b6,0x00b8), S(0x00bb), S(0x00bf), S(0x00d7),
+            S(0x00f7), R(0x02c2,0x02c5), R(0x02d2,0x02df), R(0x02e5,0x02eb), S(0x02ed), R(0x02ef,0x02ff), S(0x0375),
+            S(0x037e), R(0x0384,0x0385), S(0x0387), S(0x03f6), S(0x0482), R(0x055a,0x055f), R(0x0589,0x058a),
+            R(0x058d,0x058f), S(0x05be), S(0x05c0), S(0x05c3), S(0x05c6), R(0x05f3,0x05f4), R(0x0606,0x060f),
+            S(0x061b), R(0x061d,0x061f), R(0x066a,0x066d), S(0x06d4), S(0x06de), S(0x06e9), R(0x06fd,0x06fe),
+            R(0x0700,0x070d), R(0x07f6,0x07f9), R(0x07fe,0x07ff), R(0x0830,0x083e), S(0x085e), S(0x0888),
+            R(0x0964,0x0965), S(0x0970), R(0x09f2,0x09f3), R(0x09fa,0x09fb), S(0x09fd), S(0x0a76), R(0x0af0,0x0af1),
+            S(0x0b70), R(0x0bf3,0x0bfa), S(0x0c77), S(0x0c7f), S(0x0c84), S(0x0d4f), S(0x0d79), S(0x0df4), S(0x0e3f),
+            S(0x0e4f), R(0x0e5a,0x0e5b), R(0x0f01,0x0f17), R(0x0f1a,0x0f1f), S(0x0f34), S(0x0f36), S(0x0f38),
+            R(0x0f3a,0x0f3d), S(0x0f85), R(0x0fbe,0x0fc5), R(0x0fc7,0x0fcc), R(0x0fce,0x0fda), R(0x104a,0x104f),
+            R(0x109e,0x109f), S(0x10fb), R(0x1360,0x1368), R(0x1390,0x1399), S(0x1400), R(0x166d,0x166e),
+            R(0x169b,0x169c), R(0x16eb,0x16ed), R(0x1735,0x1736), R(0x17d4,0x17d6), R(0x17d8,0x17db),
+            R(0x1800,0x180a), S(0x1940), R(0x1944,0x1945), R(0x19de,0x19ff), R(0x1a1e,0x1a1f), R(0x1aa0,0x1aa6),
+            R(0x1aa8,0x1aad), R(0x1b5a,0x1b6a), R(0x1b74,0x1b7e), R(0x1bfc,0x1bff), R(0x1c3b,0x1c3f),
+            R(0x1c7e,0x1c7f), R(0x1cc0,0x1cc7), S(0x1cd3), S(0x1fbd), R(0x1fbf,0x1fc1), R(0x1fcd,0x1fcf),
+            R(0x1fdd,0x1fdf), R(0x1fed,0x1fef), R(0x1ffd,0x1ffe), R(0x2010,0x2027), R(0x2030,0x205e),
+            R(0x207a,0x207e), R(0x208a,0x208e), R(0x20a0,0x20c0), R(0x2100,0x2101), R(0x2103,0x2106),
+            R(0x2108,0x2109), S(0x2114), R(0x2116,0x2118), R(0x211e,0x2123), S(0x2125), S(0x2127), S(0x2129),
+            S(0x212e), R(0x213a,0x213b), R(0x2140,0x2144), R(0x214a,0x214d), S(0x214f), R(0x218a,0x218b),
+            R(0x2190,0x2426), R(0x2440,0x244a), R(0x249c,0x24e9), R(0x2500,0x2775), R(0x2794,0x2b73),
+            R(0x2b76,0x2b95), R(0x2b97,0x2bff), R(0x2ce5,0x2cea), R(0x2cf9,0x2cfc), R(0x2cfe,0x2cff), S(0x2d70),
+            R(0x2e00,0x2e2e), R(0x2e30,0x2e5d), R(0x2e80,0x2e99), R(0x2e9b,0x2ef3), R(0x2f00,0x2fd5),
+            R(0x2ff0,0x2fff), R(0x3001,0x3004), R(0x3008,0x3020), S(0x3030), R(0x3036,0x3037), R(0x303d,0x303f),
+            R(0x309b,0x309c), S(0x30a0), S(0x30fb), R(0x3190,0x3191), R(0x3196,0x319f), R(0x31c0,0x31e3), S(0x31ef),
+            R(0x3200,0x321e), R(0x322a,0x3247), S(0x3250), R(0x3260,0x327f), R(0x328a,0x32b0), R(0x32c0,0x33ff),
+            R(0x4dc0,0x4dff), R(0xa490,0xa4c6), R(0xa4fe,0xa4ff), R(0xa60d,0xa60f), S(0xa673), S(0xa67e),
+            R(0xa6f2,0xa6f7), R(0xa700,0xa716), R(0xa720,0xa721), R(0xa789,0xa78a), R(0xa828,0xa82b),
+            R(0xa836,0xa839), R(0xa874,0xa877), R(0xa8ce,0xa8cf), R(0xa8f8,0xa8fa), S(0xa8fc), R(0xa92e,0xa92f),
+            S(0xa95f), R(0xa9c1,0xa9cd), R(0xa9de,0xa9df), R(0xaa5c,0xaa5f), R(0xaa77,0xaa79), R(0xaade,0xaadf),
+            R(0xaaf0,0xaaf1), S(0xab5b), R(0xab6a,0xab6b), S(0xabeb), S(0xfb29), R(0xfbb2,0xfbc2), R(0xfd3e,0xfd4f),
+            S(0xfdcf), R(0xfdfc,0xfdff), R(0xfe10,0xfe19), R(0xfe30,0xfe52), R(0xfe54,0xfe66), R(0xfe68,0xfe6b),
+            R(0xff01,0xff0f), R(0xff1a,0xff20), R(0xff3b,0xff40), R(0xff5b,0xff65), R(0xffe0,0xffe6),
+            R(0xffe8,0xffee), R(0xfffc,0xfffd), R(0x10100,0x10102), R(0x10137,0x1013f), R(0x10179,0x10189),
+            R(0x1018c,0x1018e), R(0x10190,0x1019c), S(0x101a0), R(0x101d0,0x101fc), S(0x1039f), S(0x103d0),
+            S(0x1056f), S(0x10857), R(0x10877,0x10878), S(0x1091f), S(0x1093f), R(0x10a50,0x10a58), S(0x10a7f),
+            S(0x10ac8), R(0x10af0,0x10af6), R(0x10b39,0x10b3f), R(0x10b99,0x10b9c), S(0x10ead), R(0x10f55,0x10f59),
+            R(0x10f86,0x10f89), R(0x11047,0x1104d), R(0x110bb,0x110bc), R(0x110be,0x110c1), R(0x11140,0x11143),
+            R(0x11174,0x11175), R(0x111c5,0x111c8), S(0x111cd), S(0x111db), R(0x111dd,0x111df), R(0x11238,0x1123d),
+            S(0x112a9), R(0x1144b,0x1144f), R(0x1145a,0x1145b), S(0x1145d), S(0x114c6), R(0x115c1,0x115d7),
+            R(0x11641,0x11643), R(0x11660,0x1166c), S(0x116b9), R(0x1173c,0x1173f), S(0x1183b), R(0x11944,0x11946),
+            S(0x119e2), R(0x11a3f,0x11a46), R(0x11a9a,0x11a9c), R(0x11a9e,0x11aa2), R(0x11b00,0x11b09),
+            R(0x11c41,0x11c45), R(0x11c70,0x11c71), R(0x11ef7,0x11ef8), R(0x11f43,0x11f4f), R(0x11fd5,0x11ff1),
+            S(0x11fff), R(0x12470,0x12474), R(0x12ff1,0x12ff2), R(0x16a6e,0x16a6f), S(0x16af5), R(0x16b37,0x16b3f),
+            R(0x16b44,0x16b45), R(0x16e97,0x16e9a), S(0x16fe2), S(0x1bc9c), S(0x1bc9f), R(0x1cf50,0x1cfc3),
+            R(0x1d000,0x1d0f5), R(0x1d100,0x1d126), R(0x1d129,0x1d164), R(0x1d16a,0x1d16c), R(0x1d183,0x1d184),
+            R(0x1d18c,0x1d1a9), R(0x1d1ae,0x1d1ea), R(0x1d200,0x1d241), S(0x1d245), R(0x1d300,0x1d356), S(0x1d6c1),
+            S(0x1d6db), S(0x1d6fb), S(0x1d715), S(0x1d735), S(0x1d74f), S(0x1d76f), S(0x1d789), S(0x1d7a9),
+            S(0x1d7c3), R(0x1d800,0x1d9ff), R(0x1da37,0x1da3a), R(0x1da6d,0x1da74), R(0x1da76,0x1da83),
+            R(0x1da85,0x1da8b), S(0x1e14f), S(0x1e2ff), R(0x1e95e,0x1e95f), S(0x1ecac), S(0x1ecb0), S(0x1ed2e),
+            R(0x1eef0,0x1eef1), R(0x1f000,0x1f02b), R(0x1f030,0x1f093), R(0x1f0a0,0x1f0ae), R(0x1f0b1,0x1f0bf),
+            R(0x1f0c1,0x1f0cf), R(0x1f0d1,0x1f0f5), R(0x1f10d,0x1f1ad), R(0x1f1e6,0x1f202), R(0x1f210,0x1f23b),
+            R(0x1f240,0x1f248), R(0x1f250,0x1f251), R(0x1f260,0x1f265), R(0x1f300,0x1f6d7), R(0x1f6dc,0x1f6ec),
+            R(0x1f6f0,0x1f6fc), R(0x1f700,0x1f776), R(0x1f77b,0x1f7d9), R(0x1f7e0,0x1f7eb), S(0x1f7f0),
+            R(0x1f800,0x1f80b), R(0x1f810,0x1f847), R(0x1f850,0x1f859), R(0x1f860,0x1f887), R(0x1f890,0x1f8ad),
+            R(0x1f8b0,0x1f8b1), R(0x1f900,0x1fa53), R(0x1fa60,0x1fa6d), R(0x1fa70,0x1fa7c), R(0x1fa80,0x1fa88),
+            R(0x1fa90,0x1fabd), R(0x1fabf,0x1fac5), R(0x1face,0x1fadb), R(0x1fae0,0x1fae8), R(0x1faf0,0x1faf8),
+            R(0x1fb00,0x1fb92), R(0x1fb94,0x1fbca)
         };
 #undef R
 #undef S
@@ -603,13 +700,14 @@ struct MD_UNICODE_FOLD_INFO_tag {
             R(0x1f68,0x1f6f), S(0x1fb8), S(0x1fb9), S(0x1fba), S(0x1fbb), S(0x1fbe), R(0x1fc8,0x1fcb), S(0x1fd8),
             S(0x1fd9), S(0x1fda), S(0x1fdb), S(0x1fe8), S(0x1fe9), S(0x1fea), S(0x1feb), S(0x1fec), S(0x1ff8),
             S(0x1ff9), S(0x1ffa), S(0x1ffb), S(0x2126), S(0x212a), S(0x212b), S(0x2132), R(0x2160,0x216f), S(0x2183),
-            R(0x24b6,0x24cf), R(0x2c00,0x2c2e), S(0x2c60), S(0x2c62), S(0x2c63), S(0x2c64), R(0x2c67,0x2c6b),
+            R(0x24b6,0x24cf), R(0x2c00,0x2c2f), S(0x2c60), S(0x2c62), S(0x2c63), S(0x2c64), R(0x2c67,0x2c6b),
             S(0x2c6d), S(0x2c6e), S(0x2c6f), S(0x2c70), S(0x2c72), S(0x2c75), S(0x2c7e), S(0x2c7f), R(0x2c80,0x2ce2),
             S(0x2ceb), S(0x2ced), S(0x2cf2), R(0xa640,0xa66c), R(0xa680,0xa69a), R(0xa722,0xa72e), R(0xa732,0xa76e),
             S(0xa779), S(0xa77b), S(0xa77d), R(0xa77e,0xa786), S(0xa78b), S(0xa78d), S(0xa790), S(0xa792),
             R(0xa796,0xa7a8), S(0xa7aa), S(0xa7ab), S(0xa7ac), S(0xa7ad), S(0xa7ae), S(0xa7b0), S(0xa7b1), S(0xa7b2),
-            S(0xa7b3), R(0xa7b4,0xa7be), S(0xa7c2), S(0xa7c4), S(0xa7c5), S(0xa7c6), S(0xa7c7), S(0xa7c9), S(0xa7f5),
-            R(0xab70,0xabbf), R(0xff21,0xff3a), R(0x10400,0x10427), R(0x104b0,0x104d3), R(0x10c80,0x10cb2),
+            S(0xa7b3), R(0xa7b4,0xa7c2), S(0xa7c4), S(0xa7c5), S(0xa7c6), S(0xa7c7), S(0xa7c9), S(0xa7d0), S(0xa7d6),
+            S(0xa7d8), S(0xa7f5), R(0xab70,0xabbf), R(0xff21,0xff3a), R(0x10400,0x10427), R(0x104b0,0x104d3),
+            R(0x10570,0x1057a), R(0x1057c,0x1058a), R(0x1058c,0x10592), S(0x10594), S(0x10595), R(0x10c80,0x10cb2),
             R(0x118a0,0x118bf), R(0x16e40,0x16e5f), R(0x1e900,0x1e921)
         };
         static const unsigned FOLD_MAP_1_DATA[] = {
@@ -628,13 +726,13 @@ struct MD_UNICODE_FOLD_INFO_tag {
             0x1f10, 0x1f15, 0x1f20, 0x1f27, 0x1f30, 0x1f37, 0x1f40, 0x1f45, 0x1f51, 0x1f53, 0x1f55, 0x1f57, 0x1f60,
             0x1f67, 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0x03b9, 0x1f72, 0x1f75, 0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0x1fe0,
             0x1fe1, 0x1f7a, 0x1f7b, 0x1fe5, 0x1f78, 0x1f79, 0x1f7c, 0x1f7d, 0x03c9, 0x006b, 0x00e5, 0x214e, 0x2170,
-            0x217f, 0x2184, 0x24d0, 0x24e9, 0x2c30, 0x2c5e, 0x2c61, 0x026b, 0x1d7d, 0x027d, 0x2c68, 0x2c6c, 0x0251,
+            0x217f, 0x2184, 0x24d0, 0x24e9, 0x2c30, 0x2c5f, 0x2c61, 0x026b, 0x1d7d, 0x027d, 0x2c68, 0x2c6c, 0x0251,
             0x0271, 0x0250, 0x0252, 0x2c73, 0x2c76, 0x023f, 0x0240, 0x2c81, 0x2ce3, 0x2cec, 0x2cee, 0x2cf3, 0xa641,
             0xa66d, 0xa681, 0xa69b, 0xa723, 0xa72f, 0xa733, 0xa76f, 0xa77a, 0xa77c, 0x1d79, 0xa77f, 0xa787, 0xa78c,
             0x0265, 0xa791, 0xa793, 0xa797, 0xa7a9, 0x0266, 0x025c, 0x0261, 0x026c, 0x026a, 0x029e, 0x0287, 0x029d,
-            0xab53, 0xa7b5, 0xa7bf, 0xa7c3, 0xa794, 0x0282, 0x1d8e, 0xa7c8, 0xa7ca, 0xa7f6, 0x13a0, 0x13ef, 0xff41,
-            0xff5a, 0x10428, 0x1044f, 0x104d8, 0x104fb, 0x10cc0, 0x10cf2, 0x118c0, 0x118df, 0x16e60, 0x16e7f, 0x1e922,
-            0x1e943
+            0xab53, 0xa7b5, 0xa7c3, 0xa794, 0x0282, 0x1d8e, 0xa7c8, 0xa7ca, 0xa7d1, 0xa7d7, 0xa7d9, 0xa7f6, 0x13a0,
+            0x13ef, 0xff41, 0xff5a, 0x10428, 0x1044f, 0x104d8, 0x104fb, 0x10597, 0x105a1, 0x105a3, 0x105b1, 0x105b3,
+            0x105b9, 0x105bb, 0x105bc, 0x10cc0, 0x10cf2, 0x118c0, 0x118df, 0x16e60, 0x16e7f, 0x1e922, 0x1e943
         };
         static const unsigned FOLD_MAP_2[] = {
             S(0x00df), S(0x0130), S(0x0149), S(0x01f0), S(0x0587), S(0x1e96), S(0x1e97), S(0x1e98), S(0x1e99),
@@ -670,7 +768,7 @@ struct MD_UNICODE_FOLD_INFO_tag {
             const unsigned* map;
             const unsigned* data;
             size_t map_size;
-            int n_codepoints;
+            unsigned n_codepoints;
         } FOLD_MAP_LIST[] = {
             { FOLD_MAP_1, FOLD_MAP_1_DATA, SIZEOF_ARRAY(FOLD_MAP_1), 1 },
             { FOLD_MAP_2, FOLD_MAP_2_DATA, SIZEOF_ARRAY(FOLD_MAP_2), 2 },
@@ -695,7 +793,7 @@ struct MD_UNICODE_FOLD_INFO_tag {
             index = md_unicode_bsearch__(codepoint, FOLD_MAP_LIST[i].map, FOLD_MAP_LIST[i].map_size);
             if(index >= 0) {
                 /* Found the mapping. */
-                int n_codepoints = FOLD_MAP_LIST[i].n_codepoints;
+                unsigned n_codepoints = FOLD_MAP_LIST[i].n_codepoints;
                 const unsigned* map = FOLD_MAP_LIST[i].map;
                 const unsigned* codepoints = FOLD_MAP_LIST[i].data + (index * n_codepoints);
 
@@ -887,13 +985,15 @@ struct MD_UNICODE_FOLD_INFO_tag {
  * what the caller should allocate.)
  */
 static void
-md_merge_lines(MD_CTX* ctx, OFF beg, OFF end, const MD_LINE* lines, int n_lines,
+md_merge_lines(MD_CTX* ctx, OFF beg, OFF end, const MD_LINE* lines, MD_SIZE n_lines,
                CHAR line_break_replacement_char, CHAR* buffer, SZ* p_size)
 {
     CHAR* ptr = buffer;
     int line_index = 0;
     OFF off = beg;
 
+    MD_UNUSED(n_lines);
+
     while(1) {
         const MD_LINE* line = &lines[line_index];
         OFF line_end = line->end;
@@ -907,7 +1007,7 @@ md_merge_lines(MD_CTX* ctx, OFF beg, OFF
         }
 
         if(off >= end) {
-            *p_size = ptr - buffer;
+            *p_size = (MD_SIZE)(ptr - buffer);
             return;
         }
 
@@ -922,7 +1022,7 @@ md_merge_lines(MD_CTX* ctx, OFF beg, OFF
 /* Wrapper of md_merge_lines() which allocates new buffer for the output string.
  */
 static int
-md_merge_lines_alloc(MD_CTX* ctx, OFF beg, OFF end, const MD_LINE* lines, int n_lines,
+md_merge_lines_alloc(MD_CTX* ctx, OFF beg, OFF end, const MD_LINE* lines, MD_SIZE n_lines,
                     CHAR line_break_replacement_char, CHAR** p_str, SZ* p_size)
 {
     CHAR* buffer;
@@ -969,12 +1069,12 @@ md_skip_unicode_whitespace(const CHAR* l
  * by n_lines == 0.
  */
 static int
-md_is_html_tag(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg, OFF max_end, OFF* p_end)
+md_is_html_tag(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg, OFF max_end, OFF* p_end)
 {
     int attr_state;
     OFF off = beg;
     OFF line_end = (n_lines > 0) ? lines[0].end : ctx->size;
-    int i = 0;
+    MD_SIZE line_index = 0;
 
     MD_ASSERT(CH(beg) == _T('<'));
 
@@ -1064,12 +1164,12 @@ md_is_html_tag(MD_CTX* ctx, const MD_LIN
         if(n_lines == 0)
             return FALSE;
 
-        i++;
-        if(i >= n_lines)
+        line_index++;
+        if(line_index >= n_lines)
             return FALSE;
 
-        off = lines[i].beg;
-        line_end = lines[i].end;
+        off = lines[line_index].beg;
+        line_end = lines[line_index].end;
 
         if(attr_state == 0  ||  attr_state == 41)
             attr_state = 1;
@@ -1088,12 +1188,12 @@ done:
 
 static int
 md_scan_for_html_closer(MD_CTX* ctx, const MD_CHAR* str, MD_SIZE len,
-                        const MD_LINE* lines, int n_lines,
+                        const MD_LINE* lines, MD_SIZE n_lines,
                         OFF beg, OFF max_end, OFF* p_end,
                         OFF* p_scan_horizon)
 {
     OFF off = beg;
-    int i = 0;
+    MD_SIZE line_index = 0;
 
     if(off < *p_scan_horizon  &&  *p_scan_horizon >= max_end - len) {
         /* We have already scanned the range up to the max_end so we know
@@ -1102,7 +1202,7 @@ md_scan_for_html_closer(MD_CTX* ctx, con
     }
 
     while(TRUE) {
-        while(off + len <= lines[i].end  &&  off + len <= max_end) {
+        while(off + len <= lines[line_index].end  &&  off + len <= max_end) {
             if(md_ascii_eq(STR(off), str, len)) {
                 /* Success. */
                 *p_end = off + len;
@@ -1111,19 +1211,19 @@ md_scan_for_html_closer(MD_CTX* ctx, con
             off++;
         }
 
-        i++;
-        if(off >= max_end  ||  i >= n_lines) {
+        line_index++;
+        if(off >= max_end  ||  line_index >= n_lines) {
             /* Failure. */
             *p_scan_horizon = off;
             return FALSE;
         }
 
-        off = lines[i].beg;
+        off = lines[line_index].beg;
     }
 }
 
 static int
-md_is_html_comment(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg, OFF max_end, OFF* p_end)
+md_is_html_comment(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg, OFF max_end, OFF* p_end)
 {
     OFF off = beg;
 
@@ -1133,30 +1233,17 @@ md_is_html_comment(MD_CTX* ctx, const MD
         return FALSE;
     if(CH(off+1) != _T('!')  ||  CH(off+2) != _T('-')  ||  CH(off+3) != _T('-'))
         return FALSE;
-    off += 4;
 
-    /* ">" and "->" must not follow the opening. */
-    if(off < lines[0].end  &&  CH(off) == _T('>'))
-        return FALSE;
-    if(off+1 < lines[0].end  &&  CH(off) == _T('-')  &&  CH(off+1) == _T('>'))
-        return FALSE;
-
-    /* HTML comment must not contain "--", so we scan just for "--" instead
-     * of "-->" and verify manually that '>' follows. */
-    if(md_scan_for_html_closer(ctx, _T("--"), 2,
-                lines, n_lines, off, max_end, p_end, &ctx->html_comment_horizon))
-    {
-        if(*p_end < max_end  &&  CH(*p_end) == _T('>')) {
-            *p_end = *p_end + 1;
-            return TRUE;
-        }
-    }
+    /* Skip only "<!" so that we accept also "<!-->" or "<!--->" */
+    off += 2;
 
-    return FALSE;
+    /* Scan for ordinary comment closer "-->". */
+    return md_scan_for_html_closer(ctx, _T("-->"), 3,
+                lines, n_lines, off, max_end, p_end, &ctx->html_comment_horizon);
 }
 
 static int
-md_is_html_processing_instruction(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg, OFF max_end, OFF* p_end)
+md_is_html_processing_instruction(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg, OFF max_end, OFF* p_end)
 {
     OFF off = beg;
 
@@ -1171,7 +1258,7 @@ md_is_html_processing_instruction(MD_CTX
 }
 
 static int
-md_is_html_declaration(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg, OFF max_end, OFF* p_end)
+md_is_html_declaration(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg, OFF max_end, OFF* p_end)
 {
     OFF off = beg;
 
@@ -1187,15 +1274,13 @@ md_is_html_declaration(MD_CTX* ctx, cons
     off++;
     while(off < lines[0].end  &&  ISALPHA(off))
         off++;
-    if(off < lines[0].end  &&  !ISWHITESPACE(off))
-        return FALSE;
 
     return md_scan_for_html_closer(ctx, _T(">"), 1,
                 lines, n_lines, off, max_end, p_end, &ctx->html_decl_horizon);
 }
 
 static int
-md_is_html_cdata(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg, OFF max_end, OFF* p_end)
+md_is_html_cdata(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg, OFF max_end, OFF* p_end)
 {
     static const CHAR open_str[] = _T("<![CDATA[");
     static const SZ open_size = SIZEOF_ARRAY(open_str) - 1;
@@ -1208,15 +1293,12 @@ md_is_html_cdata(MD_CTX* ctx, const MD_L
         return FALSE;
     off += open_size;
 
-    if(lines[n_lines-1].end < max_end)
-        max_end = lines[n_lines-1].end - 2;
-
     return md_scan_for_html_closer(ctx, _T("]]>"), 3,
                 lines, n_lines, off, max_end, p_end, &ctx->html_cdata_horizon);
 }
 
 static int
-md_is_html_any(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg, OFF max_end, OFF* p_end)
+md_is_html_any(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg, OFF max_end, OFF* p_end)
 {
     MD_ASSERT(CH(beg) == _T('<'));
     return (md_is_html_tag(ctx, lines, n_lines, beg, max_end, p_end)  ||
@@ -1235,6 +1317,7 @@ static int
 md_is_hex_entity_contents(MD_CTX* ctx, const CHAR* text, OFF beg, OFF max_end, OFF* p_end)
 {
     OFF off = beg;
+    MD_UNUSED(ctx);
 
     while(off < max_end  &&  ISXDIGIT_(text[off])  &&  off - beg <= 8)
         off++;
@@ -1251,6 +1334,7 @@ static int
 md_is_dec_entity_contents(MD_CTX* ctx, const CHAR* text, OFF beg, OFF max_end, OFF* p_end)
 {
     OFF off = beg;
+    MD_UNUSED(ctx);
 
     while(off < max_end  &&  ISDIGIT_(text[off])  &&  off - beg <= 8)
         off++;
@@ -1267,6 +1351,7 @@ static int
 md_is_named_entity_contents(MD_CTX* ctx, const CHAR* text, OFF beg, OFF max_end, OFF* p_end)
 {
     OFF off = beg;
+    MD_UNUSED(ctx);
 
     if(off < max_end  &&  ISALPHA_(text[off]))
         off++;
@@ -1372,6 +1457,8 @@ md_build_attr_append_substr(MD_CTX* ctx,
 static void
 md_free_attribute(MD_CTX* ctx, MD_ATTRIBUTE_BUILD* build)
 {
+    MD_UNUSED(ctx);
+
     if(build->substr_alloc > 0) {
         free(build->text);
         free(build->substr_types);
@@ -1547,12 +1634,6 @@ md_link_label_cmp_load_fold_info(const C
         goto whitespace;
     }
 
-    if(ISNEWLINE_(label[off])) {
-        /* Treat new lines as a whitespace. */
-        off++;
-        goto whitespace;
-    }
-
     codepoint = md_decode_unicode(label, off, size, &char_size);
     off += char_size;
     if(ISUNICODEWHITESPACE_(codepoint)) {
@@ -1575,8 +1656,6 @@ md_link_label_cmp(const CHAR* a_label, S
 {
     OFF a_off;
     OFF b_off;
-    int a_reached_end = FALSE;
-    int b_reached_end = FALSE;
     MD_UNICODE_FOLD_INFO a_fi = { { 0 }, 0 };
     MD_UNICODE_FOLD_INFO b_fi = { { 0 }, 0 };
     OFF a_fi_off = 0;
@@ -1585,17 +1664,17 @@ md_link_label_cmp(const CHAR* a_label, S
 
     a_off = md_skip_unicode_whitespace(a_label, 0, a_size);
     b_off = md_skip_unicode_whitespace(b_label, 0, b_size);
-    while(!a_reached_end  ||  !b_reached_end) {
+    while(a_off < a_size || a_fi_off < a_fi.n_codepoints ||
+          b_off < b_size || b_fi_off < b_fi.n_codepoints)
+    {
         /* If needed, load fold info for next char. */
         if(a_fi_off >= a_fi.n_codepoints) {
             a_fi_off = 0;
             a_off = md_link_label_cmp_load_fold_info(a_label, a_off, a_size, &a_fi);
-            a_reached_end = (a_off >= a_size);
         }
         if(b_fi_off >= b_fi.n_codepoints) {
             b_fi_off = 0;
             b_off = md_link_label_cmp_load_fold_info(b_label, b_off, b_size, &b_fi);
-            b_reached_end = (b_off >= b_size);
         }
 
         cmp = b_fi.codepoints[b_fi_off] - a_fi.codepoints[a_fi_off];
@@ -1847,14 +1926,14 @@ struct MD_LINK_ATTR_tag {
 
 
 static int
-md_is_link_label(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg,
-                 OFF* p_end, int* p_beg_line_index, int* p_end_line_index,
+md_is_link_label(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg,
+                 OFF* p_end, MD_SIZE* p_beg_line_index, MD_SIZE* p_end_line_index,
                  OFF* p_contents_beg, OFF* p_contents_end)
 {
     OFF off = beg;
     OFF contents_beg = 0;
     OFF contents_end = 0;
-    int line_index = 0;
+    MD_SIZE line_index = 0;
     int len = 0;
 
     if(CH(off) != _T('['))
@@ -2004,13 +2083,13 @@ md_is_link_destination(MD_CTX* ctx, OFF
 }
 
 static int
-md_is_link_title(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg,
-                 OFF* p_end, int* p_beg_line_index, int* p_end_line_index,
+md_is_link_title(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg,
+                 OFF* p_end, MD_SIZE* p_beg_line_index, MD_SIZE* p_end_line_index,
                  OFF* p_contents_beg, OFF* p_contents_end)
 {
     OFF off = beg;
     CHAR closer_char;
-    int line_index = 0;
+    MD_SIZE line_index = 0;
 
     /* White space with up to one line break. */
     while(off < lines[line_index].end  &&  ISWHITESPACE(off))
@@ -2072,21 +2151,21 @@ md_is_link_title(MD_CTX* ctx, const MD_L
  * Returns -1 in case of an error (out of memory).
  */
 static int
-md_is_link_reference_definition(MD_CTX* ctx, const MD_LINE* lines, int n_lines)
+md_is_link_reference_definition(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines)
 {
     OFF label_contents_beg;
     OFF label_contents_end;
-    int label_contents_line_index = -1;
+    MD_SIZE label_contents_line_index;
     int label_is_multiline = FALSE;
     OFF dest_contents_beg;
     OFF dest_contents_end;
     OFF title_contents_beg;
     OFF title_contents_end;
-    int title_contents_line_index;
+    MD_SIZE title_contents_line_index;
     int title_is_multiline = FALSE;
     OFF off;
-    int line_index = 0;
-    int tmp_line_index;
+    MD_SIZE line_index = 0;
+    MD_SIZE tmp_line_index;
     MD_REF_DEF* def = NULL;
     int ret = 0;
 
@@ -2194,12 +2273,12 @@ abort:
 }
 
 static int
-md_is_link_reference(MD_CTX* ctx, const MD_LINE* lines, int n_lines,
+md_is_link_reference(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines,
                      OFF beg, OFF end, MD_LINK_ATTR* attr)
 {
     const MD_REF_DEF* def;
     const MD_LINE* beg_line;
-    const MD_LINE* end_line;
+    int is_multiline;
     CHAR* label;
     SZ label_size;
     int ret;
@@ -2211,19 +2290,12 @@ md_is_link_reference(MD_CTX* ctx, const
     end--;
 
     /* Find lines corresponding to the beg and end positions. */
-    MD_ASSERT(lines[0].beg <= beg);
-    beg_line = lines;
-    while(beg >= beg_line->end)
-        beg_line++;
-
-    MD_ASSERT(end <= lines[n_lines-1].end);
-    end_line = beg_line;
-    while(end >= end_line->end)
-        end_line++;
+    beg_line = md_lookup_line(beg, lines, n_lines, NULL);
+    is_multiline = (end > beg_line->end);
 
-    if(beg_line != end_line) {
+    if(is_multiline) {
         MD_CHECK(md_merge_lines_alloc(ctx, beg, end, beg_line,
-                 n_lines - (beg_line - lines), _T(' '), &label, &label_size));
+                 (int)(n_lines - (beg_line - lines)), _T(' '), &label, &label_size));
     } else {
         label = (CHAR*) STR(beg);
         label_size = end - beg;
@@ -2238,7 +2310,7 @@ md_is_link_reference(MD_CTX* ctx, const
         attr->title_needs_free = FALSE;
     }
 
-    if(beg_line != end_line)
+    if(is_multiline)
         free(label);
 
     ret = (def != NULL);
@@ -2248,14 +2320,14 @@ abort:
 }
 
 static int
-md_is_inline_link_spec(MD_CTX* ctx, const MD_LINE* lines, int n_lines,
+md_is_inline_link_spec(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines,
                        OFF beg, OFF* p_end, MD_LINK_ATTR* attr)
 {
-    int line_index = 0;
-    int tmp_line_index;
+    MD_SIZE line_index = 0;
+    MD_SIZE tmp_line_index;
     OFF title_contents_beg;
     OFF title_contents_end;
-    int title_contents_line_index;
+    MD_SIZE title_contents_line_index;
     int title_is_multiline;
     OFF off = beg;
     int ret = FALSE;
@@ -2269,7 +2341,7 @@ md_is_inline_link_spec(MD_CTX* ctx, cons
     /* Optional white space with up to one line break. */
     while(off < lines[line_index].end  &&  ISWHITESPACE(off))
         off++;
-    if(off >= lines[line_index].end  &&  ISNEWLINE(off)) {
+    if(off >= lines[line_index].end  &&  (off >= ctx->size  ||  ISNEWLINE(off))) {
         line_index++;
         if(line_index >= n_lines)
             return FALSE;
@@ -2312,7 +2384,7 @@ md_is_inline_link_spec(MD_CTX* ctx, cons
     /* Optional whitespace followed with final ')'. */
     while(off < lines[line_index].end  &&  ISWHITESPACE(off))
         off++;
-    if(off >= lines[line_index].end  &&  ISNEWLINE(off)) {
+    if(off >= lines[line_index].end) {
         line_index++;
         if(line_index >= n_lines)
             return FALSE;
@@ -2432,11 +2504,11 @@ struct MD_MARK_tag {
     OFF beg;
     OFF end;
 
-    /* For unresolved openers, 'prev' and 'next' form the chain of open openers
-     * of given type 'ch'.
+    /* For unresolved openers, 'next' may be used to form a stack of
+     * unresolved open openers.
      *
-     * During resolving, we disconnect from the chain and point to the
-     * corresponding counterpart so opener points to its closer and vice versa.
+     * When resolved with MD_MARK_OPENER/CLOSER flag, next/prev is index of the
+     * respective closer/opener.
      */
     int prev;
     int next;
@@ -2452,46 +2524,60 @@ struct MD_MARK_tag {
 #define MD_MARK_RESOLVED                    0x10  /* Resolved in any definite way. */
 
 /* Mark flags specific for various mark types (so they can share bits). */
-#define MD_MARK_EMPH_INTRAWORD              0x20  /* Helper for the "rule of 3". */
+#define MD_MARK_EMPH_OC                     0x20  /* Opener/closer mixed candidate. Helper for the "rule of 3". */
 #define MD_MARK_EMPH_MOD3_0                 0x40
 #define MD_MARK_EMPH_MOD3_1                 0x80
 #define MD_MARK_EMPH_MOD3_2                 (0x40 | 0x80)
 #define MD_MARK_EMPH_MOD3_MASK              (0x40 | 0x80)
 #define MD_MARK_AUTOLINK                    0x20  /* Distinguisher for '<', '>'. */
+#define MD_MARK_AUTOLINK_MISSING_MAILTO     0x40
 #define MD_MARK_VALIDPERMISSIVEAUTOLINK     0x20  /* For permissive autolinks. */
+#define MD_MARK_HASNESTEDBRACKETS           0x20  /* For '[' to rule out invalid link labels early */
 
-static MD_MARKCHAIN*
-md_asterisk_chain(MD_CTX* ctx, unsigned flags)
+static MD_MARKSTACK*
+md_emph_stack(MD_CTX* ctx, MD_CHAR ch, unsigned flags)
 {
-    switch(flags & (MD_MARK_EMPH_INTRAWORD | MD_MARK_EMPH_MOD3_MASK)) {
-        case MD_MARK_EMPH_INTRAWORD | MD_MARK_EMPH_MOD3_0:  return &ASTERISK_OPENERS_intraword_mod3_0;
-        case MD_MARK_EMPH_INTRAWORD | MD_MARK_EMPH_MOD3_1:  return &ASTERISK_OPENERS_intraword_mod3_1;
-        case MD_MARK_EMPH_INTRAWORD | MD_MARK_EMPH_MOD3_2:  return &ASTERISK_OPENERS_intraword_mod3_2;
-        case MD_MARK_EMPH_MOD3_0:                           return &ASTERISK_OPENERS_extraword_mod3_0;
-        case MD_MARK_EMPH_MOD3_1:                           return &ASTERISK_OPENERS_extraword_mod3_1;
-        case MD_MARK_EMPH_MOD3_2:                           return &ASTERISK_OPENERS_extraword_mod3_2;
-        default:                                            MD_UNREACHABLE();
+    MD_MARKSTACK* stack;
+
+    switch(ch) {
+        case '*':   stack = &ASTERISK_OPENERS_oo_mod3_0; break;
+        case '_':   stack = &UNDERSCORE_OPENERS_oo_mod3_0; break;
+        default:    MD_UNREACHABLE();
     }
-    return NULL;
+
+    if(flags & MD_MARK_EMPH_OC)
+        stack += 3;
+
+    switch(flags & MD_MARK_EMPH_MOD3_MASK) {
+        case MD_MARK_EMPH_MOD3_0:   stack += 0; break;
+        case MD_MARK_EMPH_MOD3_1:   stack += 1; break;
+        case MD_MARK_EMPH_MOD3_2:   stack += 2; break;
+        default:                    MD_UNREACHABLE();
+    }
+
+    return stack;
 }
 
-static MD_MARKCHAIN*
-md_mark_chain(MD_CTX* ctx, int mark_index)
+static MD_MARKSTACK*
+md_opener_stack(MD_CTX* ctx, int mark_index)
 {
     MD_MARK* mark = &ctx->marks[mark_index];
 
     switch(mark->ch) {
-        case _T('*'):   return md_asterisk_chain(ctx, mark->flags);
-        case _T('_'):   return &UNDERSCORE_OPENERS;
+        case _T('*'):
+        case _T('_'):   return md_emph_stack(ctx, mark->ch, mark->flags);
+
         case _T('~'):   return (mark->end - mark->beg == 1) ? &TILDE_OPENERS_1 : &TILDE_OPENERS_2;
+
+        case _T('!'):
         case _T('['):   return &BRACKET_OPENERS;
-        case _T('|'):   return &TABLECELLBOUNDARIES;
-        default:        return NULL;
+
+        default:        MD_UNREACHABLE();
     }
 }
 
 static MD_MARK*
-md_push_mark(MD_CTX* ctx)
+md_add_mark(MD_CTX* ctx)
 {
     if(ctx->n_marks >= ctx->alloc_marks) {
         MD_MARK* new_marks;
@@ -2511,18 +2597,18 @@ md_push_mark(MD_CTX* ctx)
     return &ctx->marks[ctx->n_marks++];
 }
 
-#define PUSH_MARK_()                                                    \
+#define ADD_MARK_()                                                     \
         do {                                                            \
-            mark = md_push_mark(ctx);                                   \
+            mark = md_add_mark(ctx);                                    \
             if(mark == NULL) {                                          \
                 ret = -1;                                               \
                 goto abort;                                             \
             }                                                           \
         } while(0)
 
-#define PUSH_MARK(ch_, beg_, end_, flags_)                              \
+#define ADD_MARK(ch_, beg_, end_, flags_)                               \
         do {                                                            \
-            PUSH_MARK_();                                               \
+            ADD_MARK_();                                                \
             mark->beg = (beg_);                                         \
             mark->end = (end_);                                         \
             mark->prev = -1;                                            \
@@ -2532,17 +2618,20 @@ md_push_mark(MD_CTX* ctx)
         } while(0)
 
 
-static void
-md_mark_chain_append(MD_CTX* ctx, MD_MARKCHAIN* chain, int mark_index)
+static inline void
+md_mark_stack_push(MD_CTX* ctx, MD_MARKSTACK* stack, int mark_index)
 {
-    if(chain->tail >= 0)
-        ctx->marks[chain->tail].next = mark_index;
-    else
-        chain->head = mark_index;
+    ctx->marks[mark_index].next = stack->top;
+    stack->top = mark_index;
+}
 
-    ctx->marks[mark_index].prev = chain->tail;
-    ctx->marks[mark_index].next = -1;
-    chain->tail = mark_index;
+static inline int
+md_mark_stack_pop(MD_CTX* ctx, MD_MARKSTACK* stack)
+{
+    int top = stack->top;
+    if(top >= 0)
+        stack->top = ctx->marks[top].next;
+    return top;
 }
 
 /* Sometimes, we need to store a pointer into the mark. It is quite rare
@@ -2569,112 +2658,52 @@ md_mark_get_ptr(MD_CTX* ctx, int mark_in
     return ptr;
 }
 
-static void
-md_resolve_range(MD_CTX* ctx, MD_MARKCHAIN* chain, int opener_index, int closer_index)
+static inline void
+md_resolve_range(MD_CTX* ctx, int opener_index, int closer_index)
 {
     MD_MARK* opener = &ctx->marks[opener_index];
     MD_MARK* closer = &ctx->marks[closer_index];
 
-    /* Remove opener from the list of openers. */
-    if(chain != NULL) {
-        if(opener->prev >= 0)
-            ctx->marks[opener->prev].next = opener->next;
-        else
-            chain->head = opener->next;
-
-        if(opener->next >= 0)
-            ctx->marks[opener->next].prev = opener->prev;
-        else
-            chain->tail = opener->prev;
-    }
-
     /* Interconnect opener and closer and mark both as resolved. */
     opener->next = closer_index;
-    opener->flags |= MD_MARK_OPENER | MD_MARK_RESOLVED;
     closer->prev = opener_index;
+
+    opener->flags |= MD_MARK_OPENER | MD_MARK_RESOLVED;
     closer->flags |= MD_MARK_CLOSER | MD_MARK_RESOLVED;
 }
 
 
-#define MD_ROLLBACK_ALL         0
-#define MD_ROLLBACK_CROSSING    1
+#define MD_ROLLBACK_CROSSING    0
+#define MD_ROLLBACK_ALL         1
 
 /* In the range ctx->marks[opener_index] ... [closer_index], undo some or all
  * resolvings accordingly to these rules:
  *
- * (1) All openers BEFORE the range corresponding to any closer inside the
- *     range are un-resolved and they are re-added to their respective chains
- *     of unresolved openers. This ensures we can reuse the opener for closers
- *     AFTER the range.
+ * (1) All stacks of openers are cut so that any pending potential openers
+ *     are discarded from future consideration.
  *
  * (2) If 'how' is MD_ROLLBACK_ALL, then ALL resolved marks inside the range
- *     are discarded.
+ *     are thrown away and turned into dummy marks ('D').
  *
- * (3) If 'how' is MD_ROLLBACK_CROSSING, only closers with openers handled
- *     in (1) are discarded. I.e. pairs of openers and closers which are both
- *     inside the range are retained as well as any unpaired marks.
+ * WARNING: Do not call for arbitrary range of opener and closer.
+ * This must form (potentially) valid range not crossing nesting boundaries
+ * of already resolved ranges.
  */
 static void
 md_rollback(MD_CTX* ctx, int opener_index, int closer_index, int how)
 {
     int i;
-    int mark_index;
-
-    /* Cut all unresolved openers at the mark index. */
-    for(i = OPENERS_CHAIN_FIRST; i < OPENERS_CHAIN_LAST+1; i++) {
-        MD_MARKCHAIN* chain = &ctx->mark_chains[i];
-
-        while(chain->tail >= opener_index)
-            chain->tail = ctx->marks[chain->tail].prev;
 
-        if(chain->tail >= 0)
-            ctx->marks[chain->tail].next = -1;
-        else
-            chain->head = -1;
+    for(i = 0; i < (int) SIZEOF_ARRAY(ctx->opener_stacks); i++) {
+        MD_MARKSTACK* stack = &ctx->opener_stacks[i];
+        while(stack->top >= opener_index)
+            md_mark_stack_pop(ctx, stack);
     }
 
-    /* Go backwards so that unresolved openers are re-added into their
-     * respective chains, in the right order. */
-    mark_index = closer_index - 1;
-    while(mark_index > opener_index) {
-        MD_MARK* mark = &ctx->marks[mark_index];
-        int mark_flags = mark->flags;
-        int discard_flag = (how == MD_ROLLBACK_ALL);
-
-        if(mark->flags & MD_MARK_CLOSER) {
-            int mark_opener_index = mark->prev;
-
-            /* Undo opener BEFORE the range. */
-            if(mark_opener_index < opener_index) {
-                MD_MARK* mark_opener = &ctx->marks[mark_opener_index];
-                MD_MARKCHAIN* chain;
-
-                mark_opener->flags &= ~(MD_MARK_OPENER | MD_MARK_CLOSER | MD_MARK_RESOLVED);
-                chain = md_mark_chain(ctx, opener_index);
-                if(chain != NULL) {
-                    md_mark_chain_append(ctx, chain, mark_opener_index);
-                    discard_flag = 1;
-                }
-            }
-        }
-
-        /* And reset our flags. */
-        if(discard_flag)
-            mark->flags &= ~(MD_MARK_OPENER | MD_MARK_CLOSER | MD_MARK_RESOLVED);
-
-        /* Jump as far as we can over unresolved or non-interesting marks. */
-        switch(how) {
-            case MD_ROLLBACK_CROSSING:
-                if((mark_flags & MD_MARK_CLOSER)  &&  mark->prev > opener_index) {
-                    /* If we are closer with opener INSIDE the range, there may
-                     * not be any other crosser inside the subrange. */
-                    mark_index = mark->prev;
-                    break;
-                }
-                /* Pass through. */
-            default:
-                mark_index--;
-                break;
+    if(how == MD_ROLLBACK_ALL) {
+        for(i = opener_index + 1; i < closer_index; i++) {
+            ctx->marks[i].ch = 'D';
+            ctx->marks[i].flags = 0;
         }
     }
 }
@@ -2725,15 +2754,9 @@ md_build_mark_char_map(MD_CTX* ctx)
     }
 }
 
-/* We limit code span marks to lower than 32 backticks. This solves the
- * pathologic case of too many openers, each of different length: Their
- * resolving would be then O(n^2). */
-#define CODESPAN_MARK_MAXLEN    32
-
 static int
-md_is_code_span(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg,
-                OFF* p_opener_beg, OFF* p_opener_end,
-                OFF* p_closer_beg, OFF* p_closer_end,
+md_is_code_span(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg,
+                MD_MARK* opener, MD_MARK* closer,
                 OFF last_potential_closers[CODESPAN_MARK_MAXLEN],
                 int* p_reached_paragraph_end)
 {
@@ -2748,7 +2771,7 @@ md_is_code_span(MD_CTX* ctx, const MD_LI
     int has_space_before_closer = FALSE;
     int has_eol_before_closer = FALSE;
     int has_only_space = TRUE;
-    int line_index = 0;
+    MD_SIZE line_index = 0;
 
     line_end = lines[0].end;
     opener_end = opener_beg;
@@ -2758,7 +2781,7 @@ md_is_code_span(MD_CTX* ctx, const MD_LI
     has_eol_after_opener = (opener_end == line_end);
 
     /* The caller needs to know end of the opening mark even if we fail. */
-    *p_opener_end = opener_end;
+    opener->end = opener_end;
 
     mark_len = opener_end - opener_beg;
     if(mark_len > CODESPAN_MARK_MAXLEN)
@@ -2834,18 +2857,22 @@ md_is_code_span(MD_CTX* ctx, const MD_LI
         if(has_space_before_closer)
             closer_beg--;
         else {
+            /* Go back to the end of prev line */
             closer_beg = lines[line_index-1].end;
-            /* We need to eat the preceding "\r\n" but not any line trailing
-             * spaces. */
+            /* But restore any trailing whitespace */
             while(closer_beg < ctx->size  &&  ISBLANK(closer_beg))
                 closer_beg++;
         }
     }
 
-    *p_opener_beg = opener_beg;
-    *p_opener_end = opener_end;
-    *p_closer_beg = closer_beg;
-    *p_closer_end = closer_end;
+    opener->ch = _T('`');
+    opener->beg = opener_beg;
+    opener->end = opener_end;
+    opener->flags = MD_MARK_POTENTIAL_OPENER;
+    closer->ch = _T('`');
+    closer->beg = closer_beg;
+    closer->end = closer_end;
+    closer->flags = MD_MARK_POTENTIAL_CLOSER;
     return TRUE;
 }
 
@@ -2955,18 +2982,17 @@ md_is_autolink(MD_CTX* ctx, OFF beg, OFF
 }
 
 static int
-md_collect_marks(MD_CTX* ctx, const MD_LINE* lines, int n_lines, int table_mode)
+md_collect_marks(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, int table_mode)
 {
-    int i;
+    MD_SIZE line_index;
     int ret = 0;
     MD_MARK* mark;
     OFF codespan_last_potential_closers[CODESPAN_MARK_MAXLEN] = { 0 };
     int codespan_scanned_till_paragraph_end = FALSE;
 
-    for(i = 0; i < n_lines; i++) {
-        const MD_LINE* line = &lines[i];
+    for(line_index = 0; line_index < n_lines; line_index++) {
+        const MD_LINE* line = &lines[line_index];
         OFF off = line->beg;
-        OFF line_end = line->end;
 
         while(TRUE) {
             CHAR ch;
@@ -2981,13 +3007,13 @@ md_collect_marks(MD_CTX* ctx, const MD_L
 #endif
 
             /* Optimization: Use some loop unrolling. */
-            while(off + 3 < line_end  &&  !IS_MARK_CHAR(off+0)  &&  !IS_MARK_CHAR(off+1)
-                                      &&  !IS_MARK_CHAR(off+2)  &&  !IS_MARK_CHAR(off+3))
+            while(off + 3 < line->end  &&  !IS_MARK_CHAR(off+0)  &&  !IS_MARK_CHAR(off+1)
+                                       &&  !IS_MARK_CHAR(off+2)  &&  !IS_MARK_CHAR(off+3))
                 off += 4;
-            while(off < line_end  &&  !IS_MARK_CHAR(off+0))
+            while(off < line->end  &&  !IS_MARK_CHAR(off+0))
                 off++;
 
-            if(off >= line_end)
+            if(off >= line->end)
                 break;
 
             ch = CH(off);
@@ -2997,8 +3023,8 @@ md_collect_marks(MD_CTX* ctx, const MD_L
              * line to form a hard break. */
             if(ch == _T('\\')  &&  off+1 < ctx->size  &&  (ISPUNCT(off+1) || ISNEWLINE(off+1))) {
                 /* Hard-break cannot be on the last line of the block. */
-                if(!ISNEWLINE(off+1)  ||  i+1 < n_lines)
-                    PUSH_MARK(ch, off, off+2, MD_MARK_RESOLVED);
+                if(!ISNEWLINE(off+1)  ||  line_index+1 < n_lines)
+                    ADD_MARK(ch, off, off+2, MD_MARK_RESOLVED);
                 off += 2;
                 continue;
             }
@@ -3009,7 +3035,7 @@ md_collect_marks(MD_CTX* ctx, const MD_L
                 int left_level;     /* What precedes: 0 = whitespace; 1 = punctuation; 2 = other char. */
                 int right_level;    /* What follows: 0 = whitespace; 1 = punctuation; 2 = other char. */
 
-                while(tmp < line_end  &&  CH(tmp) == ch)
+                while(tmp < line->end  &&  CH(tmp) == ch)
                     tmp++;
 
                 if(off == line->beg  ||  ISUNICODEWHITESPACEBEFORE(off))
@@ -3019,7 +3045,7 @@ md_collect_marks(MD_CTX* ctx, const MD_L
                 else
                     left_level = 2;
 
-                if(tmp == line_end  ||  ISUNICODEWHITESPACE(tmp))
+                if(tmp == line->end  ||  ISUNICODEWHITESPACE(tmp))
                     right_level = 0;
                 else if(ISUNICODEPUNCT(tmp))
                     right_level = 1;
@@ -3039,8 +3065,8 @@ md_collect_marks(MD_CTX* ctx, const MD_L
                         flags |= MD_MARK_POTENTIAL_CLOSER;
                     if(right_level > 0  &&  right_level >= left_level)
                         flags |= MD_MARK_POTENTIAL_OPENER;
-                    if(left_level == 2  &&  right_level == 2)
-                        flags |= MD_MARK_EMPH_INTRAWORD;
+                    if(flags == (MD_MARK_POTENTIAL_OPENER | MD_MARK_POTENTIAL_CLOSER))
+                        flags |= MD_MARK_EMPH_OC;
 
                     /* For "the rule of three" we need to remember the original
                      * size of the mark (modulo three), before we potentially
@@ -3052,7 +3078,7 @@ md_collect_marks(MD_CTX* ctx, const MD_L
                         case 2: flags |= MD_MARK_EMPH_MOD3_2; break;
                     }
 
-                    PUSH_MARK(ch, off, tmp, flags);
+                    ADD_MARK(ch, off, tmp, flags);
 
                     /* During resolving, multiple asterisks may have to be
                      * split into independent span start/ends. Consider e.g.
@@ -3060,7 +3086,7 @@ md_collect_marks(MD_CTX* ctx, const MD_L
                      * marks to have enough space for that. */
                     off++;
                     while(off < tmp) {
-                        PUSH_MARK('D', off, off, 0);
+                        ADD_MARK('D', off, off, 0);
                         off++;
                     }
                     continue;
@@ -3072,38 +3098,32 @@ md_collect_marks(MD_CTX* ctx, const MD_L
 
             /* A potential code span start/end. */
             if(ch == _T('`')) {
-                OFF opener_beg, opener_end;
-                OFF closer_beg, closer_end;
+                MD_MARK opener;
+                MD_MARK closer;
                 int is_code_span;
 
-                is_code_span = md_is_code_span(ctx, lines + i, n_lines - i, off,
-                                    &opener_beg, &opener_end, &closer_beg, &closer_end,
-                                    codespan_last_potential_closers,
-                                    &codespan_scanned_till_paragraph_end);
+                is_code_span = md_is_code_span(ctx, line, n_lines - line_index, off,
+                            &opener, &closer, codespan_last_potential_closers,
+                            &codespan_scanned_till_paragraph_end);
                 if(is_code_span) {
-                    PUSH_MARK(_T('`'), opener_beg, opener_end, MD_MARK_OPENER | MD_MARK_RESOLVED);
-                    PUSH_MARK(_T('`'), closer_beg, closer_end, MD_MARK_CLOSER | MD_MARK_RESOLVED);
-                    ctx->marks[ctx->n_marks-2].next = ctx->n_marks-1;
-                    ctx->marks[ctx->n_marks-1].prev = ctx->n_marks-2;
-
-                    off = closer_end;
+                    ADD_MARK(opener.ch, opener.beg, opener.end, opener.flags);
+                    ADD_MARK(closer.ch, closer.beg, closer.end, closer.flags);
+                    md_resolve_range(ctx, ctx->n_marks-2, ctx->n_marks-1);
+                    off = closer.end;
 
                     /* Advance the current line accordingly. */
-                    while(off > line_end) {
-                        i++;
-                        line++;
-                        line_end = line->end;
-                    }
+                    if(off > line->end)
+                        line = md_lookup_line(off, lines, n_lines, &line_index);
                     continue;
                 }
 
-                off = opener_end;
+                off = opener.end;
                 continue;
             }
 
             /* A potential entity start. */
             if(ch == _T('&')) {
-                PUSH_MARK(ch, off, off+1, MD_MARK_POTENTIAL_OPENER);
+                ADD_MARK(ch, off, off+1, MD_MARK_POTENTIAL_OPENER);
                 off++;
                 continue;
             }
@@ -3112,7 +3132,7 @@ md_collect_marks(MD_CTX* ctx, const MD_L
             if(ch == _T(';')) {
                 /* We surely cannot be entity unless the previous mark is '&'. */
                 if(ctx->n_marks > 0  &&  ctx->marks[ctx->n_marks-1].ch == _T('&'))
-                    PUSH_MARK(ch, off, off+1, MD_MARK_POTENTIAL_CLOSER);
+                    ADD_MARK(ch, off, off+1, MD_MARK_POTENTIAL_CLOSER);
 
                 off++;
                 continue;
@@ -3131,21 +3151,18 @@ md_collect_marks(MD_CTX* ctx, const MD_L
                     /* Given the nature of the raw HTML, we have to recognize
                      * it here. Doing so later in md_analyze_lt_gt() could
                      * open can of worms of quadratic complexity. */
-                    is_html = md_is_html_any(ctx, lines + i, n_lines - i, off,
+                    is_html = md_is_html_any(ctx, line, n_lines - line_index, off,
                                     lines[n_lines-1].end, &html_end);
                     if(is_html) {
-                        PUSH_MARK(_T('<'), off, off, MD_MARK_OPENER | MD_MARK_RESOLVED);
-                        PUSH_MARK(_T('>'), html_end, html_end, MD_MARK_CLOSER | MD_MARK_RESOLVED);
+                        ADD_MARK(_T('<'), off, off, MD_MARK_OPENER | MD_MARK_RESOLVED);
+                        ADD_MARK(_T('>'), html_end, html_end, MD_MARK_CLOSER | MD_MARK_RESOLVED);
                         ctx->marks[ctx->n_marks-2].next = ctx->n_marks-1;
                         ctx->marks[ctx->n_marks-1].prev = ctx->n_marks-2;
                         off = html_end;
 
                         /* Advance the current line accordingly. */
-                        while(off > line_end) {
-                            i++;
-                            line++;
-                            line_end = line->end;
-                        }
+                        if(off > line->end)
+                            line = md_lookup_line(off, lines, n_lines, &line_index);
                         continue;
                     }
                 }
@@ -3153,10 +3170,12 @@ md_collect_marks(MD_CTX* ctx, const MD_L
                 is_autolink = md_is_autolink(ctx, off, lines[n_lines-1].end,
                                     &autolink_end, &missing_mailto);
                 if(is_autolink) {
-                    PUSH_MARK((missing_mailto ? _T('@') : _T('<')), off, off+1,
-                                MD_MARK_OPENER | MD_MARK_RESOLVED | MD_MARK_AUTOLINK);
-                    PUSH_MARK(_T('>'), autolink_end-1, autolink_end,
-                                MD_MARK_CLOSER | MD_MARK_RESOLVED | MD_MARK_AUTOLINK);
+                    unsigned flags = MD_MARK_RESOLVED | MD_MARK_AUTOLINK;
+                    if(missing_mailto)
+                        flags |= MD_MARK_AUTOLINK_MISSING_MAILTO;
+
+                    ADD_MARK(_T('<'), off, off+1, MD_MARK_OPENER | flags);
+                    ADD_MARK(_T('>'), autolink_end-1, autolink_end, MD_MARK_CLOSER | flags);
                     ctx->marks[ctx->n_marks-2].next = ctx->n_marks-1;
                     ctx->marks[ctx->n_marks-1].prev = ctx->n_marks-2;
                     off = autolink_end;
@@ -3168,18 +3187,18 @@ md_collect_marks(MD_CTX* ctx, const MD_L
             }
 
             /* A potential link or its part. */
-            if(ch == _T('[')  ||  (ch == _T('!') && off+1 < line_end && CH(off+1) == _T('['))) {
+            if(ch == _T('[')  ||  (ch == _T('!') && off+1 < line->end && CH(off+1) == _T('['))) {
                 OFF tmp = (ch == _T('[') ? off+1 : off+2);
-                PUSH_MARK(ch, off, tmp, MD_MARK_POTENTIAL_OPENER);
+                ADD_MARK(ch, off, tmp, MD_MARK_POTENTIAL_OPENER);
                 off = tmp;
                 /* Two dummies to make enough place for data we need if it is
                  * a link. */
-                PUSH_MARK('D', off, off, 0);
-                PUSH_MARK('D', off, off, 0);
+                ADD_MARK('D', off, off, 0);
+                ADD_MARK('D', off, off, 0);
                 continue;
             }
             if(ch == _T(']')) {
-                PUSH_MARK(ch, off, off+1, MD_MARK_POTENTIAL_CLOSER);
+                ADD_MARK(ch, off, off+1, MD_MARK_POTENTIAL_CLOSER);
                 off++;
                 continue;
             }
@@ -3189,9 +3208,9 @@ md_collect_marks(MD_CTX* ctx, const MD_L
                 if(line->beg + 1 <= off  &&  ISALNUM(off-1)  &&
                     off + 3 < line->end  &&  ISALNUM(off+1))
                 {
-                    PUSH_MARK(ch, off, off+1, MD_MARK_POTENTIAL_OPENER);
+                    ADD_MARK(ch, off, off+1, MD_MARK_POTENTIAL_OPENER);
                     /* Push a dummy as a reserve for a closer. */
-                    PUSH_MARK('D', off, off, 0);
+                    ADD_MARK('D', line->beg, line->end, 0);
                 }
 
                 off++;
@@ -3220,14 +3239,13 @@ md_collect_marks(MD_CTX* ctx, const MD_L
                     const SZ suffix_size = scheme_map[scheme_index].suffix_size;
 
                     if(line->beg + scheme_size <= off  &&  md_ascii_eq(STR(off-scheme_size), scheme, scheme_size)  &&
-                        (line->beg + scheme_size == off || ISWHITESPACE(off-scheme_size-1) || ISANYOF(off-scheme_size-1, _T("*_~([")))  &&
                         off + 1 + suffix_size < line->end  &&  md_ascii_eq(STR(off+1), suffix, suffix_size))
                     {
-                        PUSH_MARK(ch, off-scheme_size, off+1+suffix_size, MD_MARK_POTENTIAL_OPENER);
+                        ADD_MARK(ch, off-scheme_size, off+1+suffix_size, MD_MARK_POTENTIAL_OPENER);
                         /* Push a dummy as a reserve for a closer. */
-                        PUSH_MARK('D', off, off, 0);
+                        ADD_MARK('D', line->beg, line->end, 0);
                         off += 1 + suffix_size;
-                        continue;
+                        break;
                     }
                 }
 
@@ -3238,12 +3256,11 @@ md_collect_marks(MD_CTX* ctx, const MD_L
             /* A potential permissive WWW autolink. */
             if(ch == _T('.')) {
                 if(line->beg + 3 <= off  &&  md_ascii_eq(STR(off-3), _T("www"), 3)  &&
-                    (line->beg + 3 == off || ISWHITESPACE(off-4) || ISANYOF(off-4, _T("*_~([")))  &&
-                    off + 1 < line_end)
+                   (off-3 == line->beg || ISUNICODEWHITESPACEBEFORE(off-3) || ISUNICODEPUNCTBEFORE(off-3)))
                 {
-                    PUSH_MARK(ch, off-3, off+1, MD_MARK_POTENTIAL_OPENER);
+                    ADD_MARK(ch, off-3, off+1, MD_MARK_POTENTIAL_OPENER);
                     /* Push a dummy as a reserve for a closer. */
-                    PUSH_MARK('D', off, off, 0);
+                    ADD_MARK('D', line->beg, line->end, 0);
                     off++;
                     continue;
                 }
@@ -3254,7 +3271,7 @@ md_collect_marks(MD_CTX* ctx, const MD_L
 
             /* A potential table cell boundary or wiki link label delimiter. */
             if((table_mode || ctx->parser.flags & MD_FLAG_WIKILINKS) && ch == _T('|')) {
-                PUSH_MARK(ch, off, off+1, 0);
+                ADD_MARK(ch, off, off+1, 0);
                 off++;
                 continue;
             }
@@ -3263,18 +3280,18 @@ md_collect_marks(MD_CTX* ctx, const MD_L
             if(ch == _T('~')) {
                 OFF tmp = off+1;
 
-                while(tmp < line_end  &&  CH(tmp) == _T('~'))
+                while(tmp < line->end  &&  CH(tmp) == _T('~'))
                     tmp++;
 
                 if(tmp - off < 3) {
                     unsigned flags = 0;
 
-                    if(tmp < line_end  &&  !ISUNICODEWHITESPACE(tmp))
+                    if(tmp < line->end  &&  !ISUNICODEWHITESPACE(tmp))
                         flags |= MD_MARK_POTENTIAL_OPENER;
                     if(off > line->beg  &&  !ISUNICODEWHITESPACEBEFORE(off))
                         flags |= MD_MARK_POTENTIAL_CLOSER;
                     if(flags != 0)
-                        PUSH_MARK(ch, off, tmp, flags);
+                        ADD_MARK(ch, off, tmp, flags);
                 }
 
                 off = tmp;
@@ -3287,11 +3304,20 @@ md_collect_marks(MD_CTX* ctx, const MD_L
                  * where two dollar signs signify a display equation. */
                 OFF tmp = off+1;
 
-                while(tmp < line_end && CH(tmp) == _T('$'))
+                while(tmp < line->end && CH(tmp) == _T('$'))
                     tmp++;
 
-                if (tmp - off <= 2)
-                    PUSH_MARK(ch, off, tmp, MD_MARK_POTENTIAL_OPENER | MD_MARK_POTENTIAL_CLOSER);
+                if(tmp - off <= 2) {
+                    unsigned flags = MD_MARK_POTENTIAL_OPENER | MD_MARK_POTENTIAL_CLOSER;
+
+                    if(off > line->beg  &&  !ISUNICODEWHITESPACEBEFORE(off)  &&  !ISUNICODEPUNCTBEFORE(off))
+                        flags &= ~MD_MARK_POTENTIAL_OPENER;
+                    if(tmp < line->end  &&  !ISUNICODEWHITESPACE(tmp)  &&  !ISUNICODEPUNCT(tmp))
+                        flags &= ~MD_MARK_POTENTIAL_CLOSER;
+                    if(flags != 0)
+                        ADD_MARK(ch, off, tmp, flags);
+                }
+
                 off = tmp;
                 continue;
             }
@@ -3300,11 +3326,11 @@ md_collect_marks(MD_CTX* ctx, const MD_L
             if(ISWHITESPACE_(ch)) {
                 OFF tmp = off+1;
 
-                while(tmp < line_end  &&  ISWHITESPACE(tmp))
+                while(tmp < line->end  &&  ISWHITESPACE(tmp))
                     tmp++;
 
                 if(tmp - off > 1  ||  ch != _T(' '))
-                    PUSH_MARK(ch, off, tmp, MD_MARK_RESOLVED);
+                    ADD_MARK(ch, off, tmp, MD_MARK_RESOLVED);
 
                 off = tmp;
                 continue;
@@ -3312,7 +3338,7 @@ md_collect_marks(MD_CTX* ctx, const MD_L
 
             /* NULL character. */
             if(ch == _T('\0')) {
-                PUSH_MARK(ch, off, off+1, MD_MARK_RESOLVED);
+                ADD_MARK(ch, off, off+1, MD_MARK_RESOLVED);
                 off++;
                 continue;
             }
@@ -3323,7 +3349,7 @@ md_collect_marks(MD_CTX* ctx, const MD_L
 
     /* Add a dummy mark at the end of the mark vector to simplify
      * process_inlines(). */
-    PUSH_MARK(127, ctx->size, ctx->size, MD_MARK_RESOLVED);
+    ADD_MARK(127, ctx->size, ctx->size, MD_MARK_RESOLVED);
 
 abort:
     return ret;
@@ -3337,36 +3363,33 @@ md_analyze_bracket(MD_CTX* ctx, int mark
      * or enclosing pair of brackets (if the inner is the link, the outer
      * one cannot be.)
      *
-     * Therefore we here only construct a list of resolved '[' ']' pairs
-     * ordered by position of the closer. This allows ur to analyze what is
-     * or is not link in the right order, from inside to outside in case
-     * of nested brackets.
+     * Therefore we here only construct a list of '[' ']' pairs ordered by
+     * position of the closer. This allows us to analyze what is or is not
+     * link in the right order, from inside to outside in case of nested
+     * brackets.
      *
-     * The resolving itself is deferred into md_resolve_links().
+     * The resolving itself is deferred to md_resolve_links().
      */
 
     MD_MARK* mark = &ctx->marks[mark_index];
 
     if(mark->flags & MD_MARK_POTENTIAL_OPENER) {
-        md_mark_chain_append(ctx, &BRACKET_OPENERS, mark_index);
+        if(BRACKET_OPENERS.top >= 0)
+            ctx->marks[BRACKET_OPENERS.top].flags |= MD_MARK_HASNESTEDBRACKETS;
+
+        md_mark_stack_push(ctx, &BRACKET_OPENERS, mark_index);
         return;
     }
 
-    if(BRACKET_OPENERS.tail >= 0) {
-        /* Pop the opener from the chain. */
-        int opener_index = BRACKET_OPENERS.tail;
+    if(BRACKET_OPENERS.top >= 0) {
+        int opener_index = md_mark_stack_pop(ctx, &BRACKET_OPENERS);
         MD_MARK* opener = &ctx->marks[opener_index];
-        if(opener->prev >= 0)
-            ctx->marks[opener->prev].next = -1;
-        else
-            BRACKET_OPENERS.head = -1;
-        BRACKET_OPENERS.tail = opener->prev;
 
         /* Interconnect the opener and closer. */
         opener->next = mark_index;
         mark->prev = opener_index;
 
-        /* Add the pair into chain of potential links for md_resolve_links().
+        /* Add the pair into a list of potential links for md_resolve_links().
          * Note we misuse opener->prev for this as opener->next points to its
          * closer. */
         if(ctx->unresolved_link_tail >= 0)
@@ -3379,11 +3402,11 @@ md_analyze_bracket(MD_CTX* ctx, int mark
 }
 
 /* Forward declaration. */
-static void md_analyze_link_contents(MD_CTX* ctx, const MD_LINE* lines, int n_lines,
+static void md_analyze_link_contents(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines,
                                      int mark_beg, int mark_end);
 
 static int
-md_resolve_links(MD_CTX* ctx, const MD_LINE* lines, int n_lines)
+md_resolve_links(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines)
 {
     int opener_index = ctx->unresolved_link_head;
     OFF last_link_beg = 0;
@@ -3454,10 +3477,15 @@ md_resolve_links(MD_CTX* ctx, const MD_L
                     delim = m;
                     break;
                 }
-                if(m->ch != 'D'  &&  m->beg - opener->end > 100)
-                    break;
+                if(m->ch != 'D') {
+                    if(m->beg - opener->end > 100)
+                        break;
+                    if(m->ch != 'D'  &&  (m->flags & MD_MARK_OPENER))
+                        delim_index = m->next;
+                }
                 delim_index++;
             }
+
             dest_beg = opener->end;
             dest_end = (delim != NULL) ? delim->beg : closer->beg;
             if(dest_end - dest_beg == 0 || dest_end - dest_beg > 100)
@@ -3477,9 +3505,13 @@ md_resolve_links(MD_CTX* ctx, const MD_L
             if(is_link) {
                 if(delim != NULL) {
                     if(delim->end < closer->beg) {
+                        md_rollback(ctx, opener_index, delim_index, MD_ROLLBACK_ALL);
+                        md_rollback(ctx, delim_index, closer_index, MD_ROLLBACK_CROSSING);
+                        delim->flags |= MD_MARK_RESOLVED;
                         opener->end = delim->beg;
                     } else {
                         /* The pipe is just before the closer: [[foo|]] */
+                        md_rollback(ctx, opener_index, closer_index, MD_ROLLBACK_ALL);
                         closer->beg = delim->beg;
                         delim = NULL;
                     }
@@ -3496,13 +3528,8 @@ md_resolve_links(MD_CTX* ctx, const MD_L
                 last_link_beg = opener->beg;
                 last_link_end = closer->end;
 
-                if(delim != NULL) {
-                    delim->flags |= MD_MARK_RESOLVED;
-                    md_rollback(ctx, opener_index, delim_index, MD_ROLLBACK_ALL);
-                    md_analyze_link_contents(ctx, lines, n_lines, opener_index+1, closer_index);
-                } else {
-                    md_rollback(ctx, opener_index, closer_index, MD_ROLLBACK_ALL);
-                }
+                if(delim != NULL)
+                    md_analyze_link_contents(ctx, lines, n_lines, delim_index+1, closer_index);
 
                 opener_index = next_opener->prev;
                 continue;
@@ -3512,10 +3539,12 @@ md_resolve_links(MD_CTX* ctx, const MD_L
         if(next_opener != NULL  &&  next_opener->beg == closer->end) {
             if(next_closer->beg > closer->end + 1) {
                 /* Might be full reference link. */
-                is_link = md_is_link_reference(ctx, lines, n_lines, next_opener->beg, next_closer->end, &attr);
+                if(!(next_opener->flags & MD_MARK_HASNESTEDBRACKETS))
+                    is_link = md_is_link_reference(ctx, lines, n_lines, next_opener->beg, next_closer->end, &attr);
             } else {
                 /* Might be shortcut reference link. */
-                is_link = md_is_link_reference(ctx, lines, n_lines, opener->beg, closer->end, &attr);
+                if(!(opener->flags & MD_MARK_HASNESTEDBRACKETS))
+                    is_link = md_is_link_reference(ctx, lines, n_lines, opener->beg, closer->end, &attr);
             }
 
             if(is_link < 0)
@@ -3524,6 +3553,10 @@ md_resolve_links(MD_CTX* ctx, const MD_L
             if(is_link) {
                 /* Eat the 2nd "[...]". */
                 closer->end = next_closer->end;
+
+                /* Do not analyze the label as a standalone link in the next
+                 * iteration. */
+                next_index = ctx->marks[next_index].prev;
             }
         } else {
             if(closer->end < ctx->size  &&  CH(closer->end) == _T('(')) {
@@ -3568,7 +3601,8 @@ md_resolve_links(MD_CTX* ctx, const MD_L
 
             if(!is_link) {
                 /* Might be collapsed reference link. */
-                is_link = md_is_link_reference(ctx, lines, n_lines, opener->beg, closer->end, &attr);
+                if(!(opener->flags & MD_MARK_HASNESTEDBRACKETS))
+                    is_link = md_is_link_reference(ctx, lines, n_lines, opener->beg, closer->end, &attr);
                 if(is_link < 0)
                     return -1;
             }
@@ -3589,7 +3623,7 @@ md_resolve_links(MD_CTX* ctx, const MD_L
             md_mark_store_ptr(ctx, opener_index+2, attr.title);
             /* The title might or might not have been allocated for us. */
             if(attr.title_needs_free)
-                md_mark_chain_append(ctx, &PTR_CHAIN, opener_index+2);
+                md_mark_stack_push(ctx, &ctx->ptr_stack, opener_index+2);
             ctx->marks[opener_index+2].prev = attr.title_size;
 
             if(opener->ch == '[') {
@@ -3662,7 +3696,7 @@ md_analyze_entity(MD_CTX* ctx, int mark_
     if(md_is_entity(ctx, opener->beg, closer->end, &off)) {
         MD_ASSERT(off == closer->end);
 
-        md_resolve_range(ctx, NULL, mark_index, mark_index+1);
+        md_resolve_range(ctx, mark_index, mark_index+1);
         opener->end = closer->end;
     }
 }
@@ -3672,8 +3706,13 @@ md_analyze_table_cell_boundary(MD_CTX* c
 {
     MD_MARK* mark = &ctx->marks[mark_index];
     mark->flags |= MD_MARK_RESOLVED;
+    mark->next = -1;
 
-    md_mark_chain_append(ctx, &TABLECELLBOUNDARIES, mark_index);
+    if(ctx->table_cell_boundaries_head < 0)
+        ctx->table_cell_boundaries_head = mark_index;
+    else
+        ctx->marks[ctx->table_cell_boundaries_tail].next = mark_index;
+    ctx->table_cell_boundaries_tail = mark_index;
     ctx->n_table_cell_boundaries++;
 }
 
@@ -3702,257 +3741,323 @@ static void
 md_analyze_emph(MD_CTX* ctx, int mark_index)
 {
     MD_MARK* mark = &ctx->marks[mark_index];
-    MD_MARKCHAIN* chain = md_mark_chain(ctx, mark_index);
 
     /* If we can be a closer, try to resolve with the preceding opener. */
     if(mark->flags & MD_MARK_POTENTIAL_CLOSER) {
         MD_MARK* opener = NULL;
-        int opener_index;
-
-        if(mark->ch == _T('*')) {
-            MD_MARKCHAIN* opener_chains[6];
-            int i, n_opener_chains;
-            unsigned flags = mark->flags;
-
-            /* Apply the "rule of three". */
-            n_opener_chains = 0;
-            opener_chains[n_opener_chains++] = &ASTERISK_OPENERS_intraword_mod3_0;
-            if((flags & MD_MARK_EMPH_MOD3_MASK) != MD_MARK_EMPH_MOD3_2)
-                opener_chains[n_opener_chains++] = &ASTERISK_OPENERS_intraword_mod3_1;
-            if((flags & MD_MARK_EMPH_MOD3_MASK) != MD_MARK_EMPH_MOD3_1)
-                opener_chains[n_opener_chains++] = &ASTERISK_OPENERS_intraword_mod3_2;
-            opener_chains[n_opener_chains++] = &ASTERISK_OPENERS_extraword_mod3_0;
-            if(!(flags & MD_MARK_EMPH_INTRAWORD)  ||  (flags & MD_MARK_EMPH_MOD3_MASK) != MD_MARK_EMPH_MOD3_2)
-                opener_chains[n_opener_chains++] = &ASTERISK_OPENERS_extraword_mod3_1;
-            if(!(flags & MD_MARK_EMPH_INTRAWORD)  ||  (flags & MD_MARK_EMPH_MOD3_MASK) != MD_MARK_EMPH_MOD3_1)
-                opener_chains[n_opener_chains++] = &ASTERISK_OPENERS_extraword_mod3_2;
-
-            /* Opener is the most recent mark from the allowed chains. */
-            for(i = 0; i < n_opener_chains; i++) {
-                if(opener_chains[i]->tail >= 0) {
-                    int tmp_index = opener_chains[i]->tail;
-                    MD_MARK* tmp_mark = &ctx->marks[tmp_index];
-                    if(opener == NULL  ||  tmp_mark->end > opener->end) {
-                        opener_index = tmp_index;
-                        opener = tmp_mark;
-                    }
+        int opener_index = 0;
+        MD_MARKSTACK* opener_stacks[6];
+        int i, n_opener_stacks;
+        unsigned flags = mark->flags;
+
+        n_opener_stacks = 0;
+
+        /* Apply the rule of 3 */
+        opener_stacks[n_opener_stacks++] = md_emph_stack(ctx, mark->ch, MD_MARK_EMPH_MOD3_0 | MD_MARK_EMPH_OC);
+        if((flags & MD_MARK_EMPH_MOD3_MASK) != MD_MARK_EMPH_MOD3_2)
+            opener_stacks[n_opener_stacks++] = md_emph_stack(ctx, mark->ch, MD_MARK_EMPH_MOD3_1 | MD_MARK_EMPH_OC);
+        if((flags & MD_MARK_EMPH_MOD3_MASK) != MD_MARK_EMPH_MOD3_1)
+            opener_stacks[n_opener_stacks++] = md_emph_stack(ctx, mark->ch, MD_MARK_EMPH_MOD3_2 | MD_MARK_EMPH_OC);
+        opener_stacks[n_opener_stacks++] = md_emph_stack(ctx, mark->ch, MD_MARK_EMPH_MOD3_0);
+        if(!(flags & MD_MARK_EMPH_OC)  ||  (flags & MD_MARK_EMPH_MOD3_MASK) != MD_MARK_EMPH_MOD3_2)
+            opener_stacks[n_opener_stacks++] = md_emph_stack(ctx, mark->ch, MD_MARK_EMPH_MOD3_1);
+        if(!(flags & MD_MARK_EMPH_OC)  ||  (flags & MD_MARK_EMPH_MOD3_MASK) != MD_MARK_EMPH_MOD3_1)
+            opener_stacks[n_opener_stacks++] = md_emph_stack(ctx, mark->ch, MD_MARK_EMPH_MOD3_2);
+
+        /* Opener is the most recent mark from the allowed stacks. */
+        for(i = 0; i < n_opener_stacks; i++) {
+            if(opener_stacks[i]->top >= 0) {
+                int m_index = opener_stacks[i]->top;
+                MD_MARK* m = &ctx->marks[m_index];
+
+                if(opener == NULL  ||  m->end > opener->end) {
+                    opener_index = m_index;
+                    opener = m;
                 }
             }
-        } else {
-            /* Simple emph. mark */
-            if(chain->tail >= 0) {
-                opener_index = chain->tail;
-                opener = &ctx->marks[opener_index];
-            }
         }
 
         /* Resolve, if we have found matching opener. */
         if(opener != NULL) {
             SZ opener_size = opener->end - opener->beg;
             SZ closer_size = mark->end - mark->beg;
-            MD_MARKCHAIN* opener_chain = md_mark_chain(ctx, opener_index);
+            MD_MARKSTACK* stack = md_opener_stack(ctx, opener_index);
 
             if(opener_size > closer_size) {
                 opener_index = md_split_emph_mark(ctx, opener_index, closer_size);
-                md_mark_chain_append(ctx, opener_chain, opener_index);
+                md_mark_stack_push(ctx, stack, opener_index);
             } else if(opener_size < closer_size) {
                 md_split_emph_mark(ctx, mark_index, closer_size - opener_size);
             }
 
+            /* Above we were only peeking. */
+            md_mark_stack_pop(ctx, stack);
+
             md_rollback(ctx, opener_index, mark_index, MD_ROLLBACK_CROSSING);
-            md_resolve_range(ctx, opener_chain, opener_index, mark_index);
+            md_resolve_range(ctx, opener_index, mark_index);
             return;
         }
     }
 
     /* If we could not resolve as closer, we may be yet be an opener. */
     if(mark->flags & MD_MARK_POTENTIAL_OPENER)
-        md_mark_chain_append(ctx, chain, mark_index);
+        md_mark_stack_push(ctx, md_emph_stack(ctx, mark->ch, mark->flags), mark_index);
 }
 
 static void
 md_analyze_tilde(MD_CTX* ctx, int mark_index)
 {
     MD_MARK* mark = &ctx->marks[mark_index];
-    MD_MARKCHAIN* chain = md_mark_chain(ctx, mark_index);
+    MD_MARKSTACK* stack = md_opener_stack(ctx, mark_index);
 
     /* We attempt to be Github Flavored Markdown compatible here. GFM accepts
      * only tildes sequences of length 1 and 2, and the length of the opener
      * and closer has to match. */
 
-    if((mark->flags & MD_MARK_POTENTIAL_CLOSER)  &&  chain->head >= 0) {
-        int opener_index = chain->head;
+    if((mark->flags & MD_MARK_POTENTIAL_CLOSER)  &&  stack->top >= 0) {
+        int opener_index = stack->top;
 
+        md_mark_stack_pop(ctx, stack);
         md_rollback(ctx, opener_index, mark_index, MD_ROLLBACK_CROSSING);
-        md_resolve_range(ctx, chain, opener_index, mark_index);
+        md_resolve_range(ctx, opener_index, mark_index);
         return;
     }
 
     if(mark->flags & MD_MARK_POTENTIAL_OPENER)
-        md_mark_chain_append(ctx, chain, mark_index);
+        md_mark_stack_push(ctx, stack, mark_index);
 }
 
 static void
 md_analyze_dollar(MD_CTX* ctx, int mark_index)
 {
-    /* This should mimic the way inline equations work in LaTeX, so there
-     * can only ever be one item in the chain (i.e. the dollars can't be
-     * nested). This is basically the same as the md_analyze_tilde function,
-     * except that we require matching openers and closers to be of the same
-     * length.
-     *
-     * E.g.: $abc$$def$$ => abc (display equation) def (end equation) */
-    if(DOLLAR_OPENERS.head >= 0) {
+    MD_MARK* mark = &ctx->marks[mark_index];
+
+    if((mark->flags & MD_MARK_POTENTIAL_CLOSER)  &&  DOLLAR_OPENERS.top >= 0) {
         /* If the potential closer has a non-matching number of $, discard */
-        MD_MARK* open = &ctx->marks[DOLLAR_OPENERS.head];
-        MD_MARK* close = &ctx->marks[mark_index];
+        MD_MARK* opener = &ctx->marks[DOLLAR_OPENERS.top];
+        int opener_index = DOLLAR_OPENERS.top;
+        MD_MARK* closer = mark;
+        int closer_index = mark_index;
 
-        int opener_index = DOLLAR_OPENERS.head;
-        md_rollback(ctx, opener_index, mark_index, MD_ROLLBACK_ALL);
-        if (open->end - open->beg == close->end - close->beg) {
+        if(opener->end - opener->beg == closer->end - closer->beg) {
             /* We are the matching closer */
-            md_resolve_range(ctx, &DOLLAR_OPENERS, opener_index, mark_index);
-        } else {
-            /* We don't match the opener, so discard old opener and insert as opener */
-            md_mark_chain_append(ctx, &DOLLAR_OPENERS, mark_index);
+            md_mark_stack_pop(ctx, &DOLLAR_OPENERS);
+            md_rollback(ctx, opener_index, closer_index, MD_ROLLBACK_ALL);
+            md_resolve_range(ctx, opener_index, closer_index);
+
+            /* Discard all pending openers: Latex math span do not allow
+             * nesting. */
+            DOLLAR_OPENERS.top = -1;
+            return;
         }
-    } else {
-        /* No unmatched openers, so we are opener */
-        md_mark_chain_append(ctx, &DOLLAR_OPENERS, mark_index);
     }
+
+    if(mark->flags & MD_MARK_POTENTIAL_OPENER)
+        md_mark_stack_push(ctx, &DOLLAR_OPENERS, mark_index);
 }
 
-static void
-md_analyze_permissive_url_autolink(MD_CTX* ctx, int mark_index)
+static MD_MARK*
+md_scan_left_for_resolved_mark(MD_CTX* ctx, MD_MARK* mark_from, OFF off, MD_MARK** p_cursor)
 {
-    MD_MARK* opener = &ctx->marks[mark_index];
-    int closer_index = mark_index + 1;
-    MD_MARK* closer = &ctx->marks[closer_index];
-    MD_MARK* next_resolved_mark;
-    OFF off = opener->end;
-    int n_dots = FALSE;
-    int has_underscore_in_last_seg = FALSE;
-    int has_underscore_in_next_to_last_seg = FALSE;
-    int n_opened_parenthesis = 0;
+    MD_MARK* mark;
 
-    /* Check for domain. */
-    while(off < ctx->size) {
-        if(ISALNUM(off) || CH(off) == _T('-')) {
-            off++;
-        } else if(CH(off) == _T('.')) {
-            /* We must see at least one period. */
-            n_dots++;
-            has_underscore_in_next_to_last_seg = has_underscore_in_last_seg;
-            has_underscore_in_last_seg = FALSE;
-            off++;
-        } else if(CH(off) == _T('_')) {
-            /* No underscore may be present in the last two domain segments. */
-            has_underscore_in_last_seg = TRUE;
-            off++;
-        } else {
-            break;
+    for(mark = mark_from; mark >= ctx->marks; mark--) {
+        if(mark->ch == 'D'  ||  mark->beg > off)
+            continue;
+        if(mark->beg <= off  &&  off < mark->end  &&  (mark->flags & MD_MARK_RESOLVED)) {
+            if(p_cursor != NULL)
+                *p_cursor = mark;
+            return mark;
         }
+        if(mark->end <= off)
+            break;
     }
-    if(off > opener->end  &&  CH(off-1) == _T('.')) {
-        off--;
-        n_dots--;
-    }
-    if(off <= opener->end || n_dots == 0 || has_underscore_in_next_to_last_seg || has_underscore_in_last_seg)
-        return;
 
-    /* Check for path. */
-    next_resolved_mark = closer + 1;
-    while(next_resolved_mark->ch == 'D' || !(next_resolved_mark->flags & MD_MARK_RESOLVED))
-        next_resolved_mark++;
-    while(off < next_resolved_mark->beg  &&  CH(off) != _T('<')  &&  !ISWHITESPACE(off)  &&  !ISNEWLINE(off)) {
-        /* Parenthesis must be balanced. */
-        if(CH(off) == _T('(')) {
-            n_opened_parenthesis++;
-        } else if(CH(off) == _T(')')) {
-            if(n_opened_parenthesis > 0)
-                n_opened_parenthesis--;
-            else
-                break;
-        }
+    if(p_cursor != NULL)
+        *p_cursor = mark;
+    return NULL;
+}
 
-        off++;
+static MD_MARK*
+md_scan_right_for_resolved_mark(MD_CTX* ctx, MD_MARK* mark_from, OFF off, MD_MARK** p_cursor)
+{
+    MD_MARK* mark;
+
+    for(mark = mark_from; mark < ctx->marks + ctx->n_marks; mark++) {
+        if(mark->ch == 'D'  ||  mark->end <= off)
+            continue;
+        if(mark->beg <= off  &&  off < mark->end  &&  (mark->flags & MD_MARK_RESOLVED)) {
+            if(p_cursor != NULL)
+                *p_cursor = mark;
+            return mark;
+        }
+        if(mark->beg > off)
+            break;
     }
-    /* These cannot be last char In such case they are more likely normal
-     * punctuation. */
-    if(ISANYOF(off-1, _T("?!.,:*_~")))
-        off--;
 
-    /* Ok. Lets call it auto-link. Adapt opener and create closer to zero
-     * length so all the contents becomes the link text. */
-    MD_ASSERT(closer->ch == 'D');
-    opener->end = opener->beg;
-    closer->ch = opener->ch;
-    closer->beg = off;
-    closer->end = off;
-    md_resolve_range(ctx, NULL, mark_index, closer_index);
+    if(p_cursor != NULL)
+        *p_cursor = mark;
+    return NULL;
 }
 
-/* The permissive autolinks do not have to be enclosed in '<' '>' but we
- * instead impose stricter rules what is understood as an e-mail address
- * here. Actually any non-alphanumeric characters with exception of '.'
- * are prohibited both in username and after '@'. */
 static void
-md_analyze_permissive_email_autolink(MD_CTX* ctx, int mark_index)
+md_analyze_permissive_autolink(MD_CTX* ctx, int mark_index)
 {
+    static const struct {
+        const MD_CHAR start_char;
+        const MD_CHAR delim_char;
+        const MD_CHAR* allowed_nonalnum_chars;
+        int min_components;
+        const MD_CHAR optional_end_char;
+    } URL_MAP[] = {
+        { _T('\0'), _T('.'),  _T(".-_"),      2, _T('\0') },    /* host, mandatory */
+        { _T('/'),  _T('/'),  _T("/.-_"),     0, _T('/') },     /* path */
+        { _T('?'),  _T('&'),  _T("&.-+_=()"), 1, _T('\0') },    /* query */
+        { _T('#'),  _T('\0'), _T(".-+_") ,    1, _T('\0') }     /* fragment */
+    };
+
     MD_MARK* opener = &ctx->marks[mark_index];
-    int closer_index;
-    MD_MARK* closer;
+    MD_MARK* closer = &ctx->marks[mark_index + 1];  /* The dummy. */
+    OFF line_beg = closer->beg;     /* md_collect_mark() set this for us */
+    OFF line_end = closer->end;     /* ditto */
     OFF beg = opener->beg;
     OFF end = opener->end;
-    int dot_count = 0;
+    MD_MARK* left_cursor = opener;
+    int left_boundary_ok = FALSE;
+    MD_MARK* right_cursor = opener;
+    int right_boundary_ok = FALSE;
+    unsigned i;
 
-    MD_ASSERT(CH(beg) == _T('@'));
+    MD_ASSERT(closer->ch == 'D');
 
-    /* Scan for name before '@'. */
-    while(beg > 0  &&  (ISALNUM(beg-1) || ISANYOF(beg-1, _T(".-_+"))))
-        beg--;
-
-    /* Scan for domain after '@'. */
-    while(end < ctx->size  &&  (ISALNUM(end) || ISANYOF(end, _T(".-_")))) {
-        if(CH(end) == _T('.'))
-            dot_count++;
-        end++;
+    if(opener->ch == '@') {
+        MD_ASSERT(CH(opener->beg) == _T('@'));
+
+        /* Scan backwards for the user name (before '@'). */
+        while(beg > line_beg) {
+            if(ISALNUM(beg-1))
+                beg--;
+            else if(beg >= line_beg+2  &&  ISALNUM(beg-2)  &&
+                        ISANYOF(beg-1, _T(".-_+"))  &&
+                        md_scan_left_for_resolved_mark(ctx, left_cursor, beg-1, &left_cursor) == NULL  &&
+                        ISALNUM(beg))
+                beg--;
+            else
+                break;
+        }
+        if(beg == opener->beg)      /* empty user name */
+            return;
     }
-    if(CH(end-1) == _T('.')) {  /* Final '.' not part of it. */
-        dot_count--;
-        end--;
+
+    /* Verify there's line boundary, whitespace, allowed punctuation or
+     * resolved emphasis mark just before the suspected autolink. */
+    if(beg == line_beg  ||  ISUNICODEWHITESPACEBEFORE(beg)  ||  ISANYOF(beg-1, _T("({["))) {
+        left_boundary_ok = TRUE;
+    } else if(ISANYOF(beg-1, _T("*_~"))) {
+        MD_MARK* left_mark;
+
+        left_mark = md_scan_left_for_resolved_mark(ctx, left_cursor, beg-1, &left_cursor);
+        if(left_mark != NULL  &&  (left_mark->flags & MD_MARK_OPENER))
+            left_boundary_ok = TRUE;
     }
-    else if(ISANYOF2(end-1, _T('-'), _T('_'))) /* These are forbidden at the end. */
-        return;
-    if(CH(end-1) == _T('@')  ||  dot_count == 0)
+    if(!left_boundary_ok)
         return;
 
-    /* Ok. Lets call it auto-link. Adapt opener and create closer to zero
-     * length so all the contents becomes the link text. */
-    closer_index = mark_index + 1;
-    closer = &ctx->marks[closer_index];
-    MD_ASSERT(closer->ch == 'D');
+    for(i = 0; i < SIZEOF_ARRAY(URL_MAP); i++) {
+        int n_components = 0;
+        int n_open_brackets = 0;
+
+        if(URL_MAP[i].start_char != _T('\0')) {
+            if(end >= line_end  ||  CH(end) != URL_MAP[i].start_char)
+                continue;
+            if(URL_MAP[i].min_components > 0  &&  (end+1 >= line_end  ||  !ISALNUM(end+1)))
+                continue;
+            end++;
+        }
+
+        while(end < line_end) {
+            if(ISALNUM(end)) {
+                if(n_components == 0)
+                    n_components++;
+                end++;
+            } else if(end < line_end  &&
+                        ISANYOF(end, URL_MAP[i].allowed_nonalnum_chars)  &&
+                        md_scan_right_for_resolved_mark(ctx, right_cursor, end, &right_cursor) == NULL  &&
+                        ((end > line_beg && (ISALNUM(end-1) || CH(end-1) == _T(')')))  ||  CH(end) == _T('('))  &&
+                        ((end+1 < line_end && (ISALNUM(end+1) || CH(end+1) == _T('(')))  ||  CH(end) == _T(')')))
+            {
+                if(CH(end) == URL_MAP[i].delim_char)
+                    n_components++;
 
+                /* brackets have to be balanced. */
+                if(CH(end) == _T('(')) {
+                    n_open_brackets++;
+                } else if(CH(end) == _T(')')) {
+                    if(n_open_brackets <= 0)
+                        break;
+                    n_open_brackets--;
+                }
+
+                end++;
+            } else {
+                break;
+            }
+        }
+
+        if(end < line_end  &&  URL_MAP[i].optional_end_char != _T('\0')  &&
+                CH(end) == URL_MAP[i].optional_end_char)
+            end++;
+
+        if(n_components < URL_MAP[i].min_components  ||  n_open_brackets != 0)
+            return;
+
+        if(opener->ch == '@')   /* E-mail autolinks wants only the host. */
+            break;
+    }
+
+    /* Verify there's line boundary, whitespace, allowed punctuation or
+     * resolved emphasis mark just after the suspected autolink. */
+    if(end == line_end  ||  ISUNICODEWHITESPACE(end)  ||  ISANYOF(end, _T(")}].!?,;"))) {
+        right_boundary_ok = TRUE;
+    } else {
+        MD_MARK* right_mark;
+
+        right_mark = md_scan_right_for_resolved_mark(ctx, right_cursor, end, &right_cursor);
+        if(right_mark != NULL  &&  (right_mark->flags & MD_MARK_CLOSER))
+            right_boundary_ok = TRUE;
+    }
+    if(!right_boundary_ok)
+        return;
+
+    /* Success, we are an autolink. */
     opener->beg = beg;
     opener->end = beg;
-    closer->ch = opener->ch;
     closer->beg = end;
     closer->end = end;
-    md_resolve_range(ctx, NULL, mark_index, closer_index);
+    closer->ch = opener->ch;
+    md_resolve_range(ctx, mark_index, mark_index + 1);
 }
 
+#define MD_ANALYZE_NOSKIP_EMPH  0x01
+
 static inline void
-md_analyze_marks(MD_CTX* ctx, const MD_LINE* lines, int n_lines,
-                 int mark_beg, int mark_end, const CHAR* mark_chars)
+md_analyze_marks(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines,
+                 int mark_beg, int mark_end, const CHAR* mark_chars, unsigned flags)
 {
     int i = mark_beg;
+    OFF last_end = lines[0].beg;
+
+    MD_UNUSED(lines);
+    MD_UNUSED(n_lines);
 
     while(i < mark_end) {
         MD_MARK* mark = &ctx->marks[i];
 
         /* Skip resolved spans. */
         if(mark->flags & MD_MARK_RESOLVED) {
-            if(mark->flags & MD_MARK_OPENER) {
+            if((mark->flags & MD_MARK_OPENER)  &&
+               !((flags & MD_ANALYZE_NOSKIP_EMPH) && ISANYOF_(mark->ch, "*_~")))
+            {
                 MD_ASSERT(i < mark->next);
                 i = mark->next + 1;
             } else {
@@ -3967,6 +4072,12 @@ md_analyze_marks(MD_CTX* ctx, const MD_L
             continue;
         }
 
+        /* The resolving in previous step could have expanded a mark. */
+        if(mark->beg < last_end) {
+            i++;
+            continue;
+        }
+
         /* Analyze the mark. */
         switch(mark->ch) {
             case '[':   /* Pass through. */
@@ -3979,8 +4090,15 @@ md_analyze_marks(MD_CTX* ctx, const MD_L
             case '~':   md_analyze_tilde(ctx, i); break;
             case '$':   md_analyze_dollar(ctx, i); break;
             case '.':   /* Pass through. */
-            case ':':   md_analyze_permissive_url_autolink(ctx, i); break;
-            case '@':   md_analyze_permissive_email_autolink(ctx, i); break;
+            case ':':   /* Pass through. */
+            case '@':   md_analyze_permissive_autolink(ctx, i); break;
+        }
+
+        if(mark->flags & MD_MARK_RESOLVED) {
+            if(mark->flags & MD_MARK_OPENER)
+                last_end = ctx->marks[mark->next].end;
+            else
+                last_end = mark->end;
         }
 
         i++;
@@ -3989,7 +4107,7 @@ md_analyze_marks(MD_CTX* ctx, const MD_L
 
 /* Analyze marks (build ctx->marks). */
 static int
-md_analyze_inlines(MD_CTX* ctx, const MD_LINE* lines, int n_lines, int table_mode)
+md_analyze_inlines(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, int table_mode)
 {
     int ret;
 
@@ -3999,31 +4117,22 @@ md_analyze_inlines(MD_CTX* ctx, const MD
     /* Collect all marks. */
     MD_CHECK(md_collect_marks(ctx, lines, n_lines, table_mode));
 
-    /* We analyze marks in few groups to handle their precedence. */
-    /* (1) Entities; code spans; autolinks; raw HTML. */
-    md_analyze_marks(ctx, lines, n_lines, 0, ctx->n_marks, _T("&"));
-
-    /* (2) Links. */
-    md_analyze_marks(ctx, lines, n_lines, 0, ctx->n_marks, _T("[]!"));
+    /* (1) Links. */
+    md_analyze_marks(ctx, lines, n_lines, 0, ctx->n_marks, _T("[]!"), 0);
     MD_CHECK(md_resolve_links(ctx, lines, n_lines));
-    BRACKET_OPENERS.head = -1;
-    BRACKET_OPENERS.tail = -1;
+    BRACKET_OPENERS.top = -1;
     ctx->unresolved_link_head = -1;
     ctx->unresolved_link_tail = -1;
 
     if(table_mode) {
-        /* (3) Analyze table cell boundaries.
-         * Note we reset TABLECELLBOUNDARIES chain prior to the call md_analyze_marks(),
-         * not after, because caller may need it. */
+        /* (2) Analyze table cell boundaries. */
         MD_ASSERT(n_lines == 1);
-        TABLECELLBOUNDARIES.head = -1;
-        TABLECELLBOUNDARIES.tail = -1;
         ctx->n_table_cell_boundaries = 0;
-        md_analyze_marks(ctx, lines, n_lines, 0, ctx->n_marks, _T("|"));
+        md_analyze_marks(ctx, lines, n_lines, 0, ctx->n_marks, _T("|"), 0);
         return ret;
     }
 
-    /* (4) Emphasis and strong emphasis; permissive autolinks. */
+    /* (3) Emphasis and strong emphasis; permissive autolinks. */
     md_analyze_link_contents(ctx, lines, n_lines, 0, ctx->n_marks);
 
 abort:
@@ -4031,22 +4140,28 @@ abort:
 }
 
 static void
-md_analyze_link_contents(MD_CTX* ctx, const MD_LINE* lines, int n_lines,
+md_analyze_link_contents(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines,
                          int mark_beg, int mark_end)
 {
     int i;
 
-    md_analyze_marks(ctx, lines, n_lines, mark_beg, mark_end, _T("*_~$@:."));
+    md_analyze_marks(ctx, lines, n_lines, mark_beg, mark_end, _T("&"), 0);
+    md_analyze_marks(ctx, lines, n_lines, mark_beg, mark_end, _T("*_~$"), 0);
 
-    for(i = OPENERS_CHAIN_FIRST; i <= OPENERS_CHAIN_LAST; i++) {
-        ctx->mark_chains[i].head = -1;
-        ctx->mark_chains[i].tail = -1;
+    if((ctx->parser.flags & MD_FLAG_PERMISSIVEAUTOLINKS) != 0) {
+        /* These have to be processed last, as they may be greedy and expand
+         * from their original mark. Also their implementation must be careful
+         * not to cross any (previously) resolved marks when doing so. */
+        md_analyze_marks(ctx, lines, n_lines, mark_beg, mark_end, _T("@:."), MD_ANALYZE_NOSKIP_EMPH);
     }
+
+    for(i = 0; i < (int) SIZEOF_ARRAY(ctx->opener_stacks); i++)
+        ctx->opener_stacks[i].top = -1;
 }
 
 static int
 md_enter_leave_span_a(MD_CTX* ctx, int enter, MD_SPANTYPE type,
-                      const CHAR* dest, SZ dest_size, int prohibit_escapes_in_dest,
+                      const CHAR* dest, SZ dest_size, int is_autolink,
                       const CHAR* title, SZ title_size)
 {
     MD_ATTRIBUTE_BUILD href_build = { 0 };
@@ -4058,10 +4173,10 @@ md_enter_leave_span_a(MD_CTX* ctx, int e
      * MD_SPAN_IMG_DETAIL are binary-compatible. */
     memset(&det, 0, sizeof(MD_SPAN_A_DETAIL));
     MD_CHECK(md_build_attribute(ctx, dest, dest_size,
-                    (prohibit_escapes_in_dest ? MD_BUILD_ATTR_NO_ESCAPES : 0),
+                    (is_autolink ? MD_BUILD_ATTR_NO_ESCAPES : 0),
                     &det.href, &href_build));
     MD_CHECK(md_build_attribute(ctx, title, title_size, 0, &det.title, &title_build));
-
+    det.is_autolink = is_autolink;
     if(enter)
         MD_ENTER_SPAN(type, &det);
     else
@@ -4096,7 +4211,7 @@ abort:
 
 /* Render the output, accordingly to the analyzed ctx->marks. */
 static int
-md_process_inlines(MD_CTX* ctx, const MD_LINE* lines, int n_lines)
+md_process_inlines(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines)
 {
     MD_TEXTTYPE text_type;
     const MD_LINE* line = lines;
@@ -4104,6 +4219,7 @@ md_process_inlines(MD_CTX* ctx, const MD
     MD_MARK* mark;
     OFF off = lines[0].beg;
     OFF end = lines[n_lines-1].end;
+    OFF tmp;
     int enforce_hardbreak = 0;
     int ret = 0;
 
@@ -4119,7 +4235,7 @@ md_process_inlines(MD_CTX* ctx, const MD
 
     while(1) {
         /* Process the text up to the next mark or end-of-line. */
-        OFF tmp = (line->end < mark->beg ? line->end : mark->beg);
+        tmp = (line->end < mark->beg ? line->end : mark->beg);
         if(tmp > off) {
             MD_TEXT(text_type, STR(off), tmp - off);
             off = tmp;
@@ -4164,7 +4280,7 @@ md_process_inlines(MD_CTX* ctx, const MD
                         }
                         break;
                     }
-                    /* Fall though. */
+                    MD_FALLTHROUGH();
 
                 case '*':       /* Emphasis, strong emphasis. */
                     if(mark->flags & MD_MARK_OPENER) {
@@ -4241,7 +4357,8 @@ md_process_inlines(MD_CTX* ctx, const MD
                     MD_CHECK(md_enter_leave_span_a(ctx, (mark->ch != ']'),
                                 (opener->ch == '!' ? MD_SPAN_IMG : MD_SPAN_A),
                                 STR(dest_mark->beg), dest_mark->end - dest_mark->beg, FALSE,
-                                md_mark_get_ptr(ctx, title_mark - ctx->marks), title_mark->prev));
+                                md_mark_get_ptr(ctx, (int)(title_mark - ctx->marks)),
+								title_mark->prev));
 
                     /* link/image closer may span multiple lines. */
                     if(mark->ch == ']') {
@@ -4263,6 +4380,7 @@ md_process_inlines(MD_CTX* ctx, const MD
                         break;
                     }
                     /* Pass through, if auto-link. */
+                    MD_FALLTHROUGH();
 
                 case '@':       /* Permissive e-mail autolink. */
                 case ':':       /* Permissive URL autolink. */
@@ -4282,11 +4400,13 @@ md_process_inlines(MD_CTX* ctx, const MD
                     if(mark->flags & MD_MARK_OPENER)
                         closer->flags |= MD_MARK_VALIDPERMISSIVEAUTOLINK;
 
-                    if(opener->ch == '@' || opener->ch == '.') {
+                    if(opener->ch == '@' || opener->ch == '.' ||
+                        (opener->ch == '<' && (opener->flags & MD_MARK_AUTOLINK_MISSING_MAILTO)))
+                    {
                         dest_size += 7;
                         MD_TEMP_BUFFER(dest_size * sizeof(CHAR));
                         memcpy(ctx->buffer,
-                                (opener->ch == '@' ? _T("mailto:") : _T("http://")),
+                                (opener->ch == '.' ? _T("http://") : _T("mailto:")),
                                 7 * sizeof(CHAR));
                         memcpy(ctx->buffer + 7, dest, (dest_size-7) * sizeof(CHAR));
                         dest = ctx->buffer;
@@ -4326,8 +4446,6 @@ md_process_inlines(MD_CTX* ctx, const MD
                 break;
 
             if(text_type == MD_TEXT_CODE || text_type == MD_TEXT_LATEXMATH) {
-                OFF tmp;
-
                 MD_ASSERT(prev_mark != NULL);
                 MD_ASSERT(ISANYOF2_(prev_mark->ch, '`', '$')  &&  (prev_mark->flags & MD_MARK_OPENER));
                 MD_ASSERT(ISANYOF2_(mark->ch, '`', '$')  &&  (mark->flags & MD_MARK_CLOSER));
@@ -4341,13 +4459,12 @@ md_process_inlines(MD_CTX* ctx, const MD
                     MD_TEXT(text_type, STR(tmp), off-tmp);
 
                 /* and new lines are transformed into single spaces. */
-                if(prev_mark->end < off  &&  off < mark->beg)
+                if(off == line->end)
                     MD_TEXT(text_type, _T(" "), 1);
             } else if(text_type == MD_TEXT_HTML) {
                 /* Inside raw HTML, we output the new line verbatim, including
                  * any trailing spaces. */
-                OFF tmp = off;
-
+                tmp = off;
                 while(tmp < end  &&  ISBLANK(tmp))
                     tmp++;
                 if(tmp > off)
@@ -4358,7 +4475,9 @@ md_process_inlines(MD_CTX* ctx, const MD
                 MD_TEXTTYPE break_type = MD_TEXT_SOFTBR;
 
                 if(text_type == MD_TEXT_NORMAL) {
-                    if(enforce_hardbreak)
+                    if(ctx->parser.flags & MD_FLAG_HARD_SOFT_BREAKS)
+                        break_type = MD_TEXT_BR;
+                    else if(enforce_hardbreak)
                         break_type = MD_TEXT_BR;
                     else if((CH(line->end) == _T(' ') && CH(line->end+1) == _T(' ')))
                         break_type = MD_TEXT_BR;
@@ -4410,7 +4529,7 @@ md_analyze_table_alignment(MD_CTX* ctx,
 }
 
 /* Forward declaration. */
-static int md_process_normal_block_contents(MD_CTX* ctx, const MD_LINE* lines, int n_lines);
+static int md_process_normal_block_contents(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines);
 
 static int
 md_process_table_cell(MD_CTX* ctx, MD_BLOCKTYPE cell_type, MD_ALIGN align, OFF beg, OFF end)
@@ -4463,7 +4582,7 @@ md_process_table_row(MD_CTX* ctx, MD_BLO
     }
     j = 0;
     pipe_offs[j++] = beg;
-    for(i = TABLECELLBOUNDARIES.head; i >= 0; i = ctx->marks[i].next) {
+    for(i = ctx->table_cell_boundaries_head; i >= 0; i = ctx->marks[i].next) {
         MD_MARK* mark = &ctx->marks[i];
         pipe_offs[j++] = mark->end;
     }
@@ -4485,20 +4604,17 @@ md_process_table_row(MD_CTX* ctx, MD_BLO
 abort:
     free(pipe_offs);
 
-    /* Free any temporary memory blocks stored within some dummy marks. */
-    for(i = PTR_CHAIN.head; i >= 0; i = ctx->marks[i].next)
-        free(md_mark_get_ptr(ctx, i));
-    PTR_CHAIN.head = -1;
-    PTR_CHAIN.tail = -1;
+    ctx->table_cell_boundaries_head = -1;
+    ctx->table_cell_boundaries_tail = -1;
 
     return ret;
 }
 
 static int
-md_process_table_block_contents(MD_CTX* ctx, int col_count, const MD_LINE* lines, int n_lines)
+md_process_table_block_contents(MD_CTX* ctx, int col_count, const MD_LINE* lines, MD_SIZE n_lines)
 {
     MD_ALIGN* align;
-    int i;
+    MD_SIZE line_index;
     int ret = 0;
 
     /* At least two lines have to be present: The column headers and the line
@@ -4519,12 +4635,14 @@ md_process_table_block_contents(MD_CTX*
                         lines[0].beg, lines[0].end, align, col_count));
     MD_LEAVE_BLOCK(MD_BLOCK_THEAD, NULL);
 
-    MD_ENTER_BLOCK(MD_BLOCK_TBODY, NULL);
-    for(i = 2; i < n_lines; i++) {
-        MD_CHECK(md_process_table_row(ctx, MD_BLOCK_TD,
-                        lines[i].beg, lines[i].end, align, col_count));
+    if(n_lines > 2) {
+        MD_ENTER_BLOCK(MD_BLOCK_TBODY, NULL);
+        for(line_index = 2; line_index < n_lines; line_index++) {
+            MD_CHECK(md_process_table_row(ctx, MD_BLOCK_TD,
+                     lines[line_index].beg, lines[line_index].end, align, col_count));
+        }
+        MD_LEAVE_BLOCK(MD_BLOCK_TBODY, NULL);
     }
-    MD_LEAVE_BLOCK(MD_BLOCK_TBODY, NULL);
 
 abort:
     free(align);
@@ -4557,7 +4675,7 @@ struct MD_BLOCK_tag {
      * MD_BLOCK_LI:     Task mark offset in the input doc.
      * MD_BLOCK_OL:     Start item number.
      */
-    unsigned n_lines;
+    MD_SIZE n_lines;
 };
 
 struct MD_CONTAINER_tag {
@@ -4573,7 +4691,7 @@ struct MD_CONTAINER_tag {
 
 
 static int
-md_process_normal_block_contents(MD_CTX* ctx, const MD_LINE* lines, int n_lines)
+md_process_normal_block_contents(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines)
 {
     int i;
     int ret;
@@ -4583,25 +4701,24 @@ md_process_normal_block_contents(MD_CTX*
 
 abort:
     /* Free any temporary memory blocks stored within some dummy marks. */
-    for(i = PTR_CHAIN.head; i >= 0; i = ctx->marks[i].next)
+    for(i = ctx->ptr_stack.top; i >= 0; i = ctx->marks[i].next)
         free(md_mark_get_ptr(ctx, i));
-    PTR_CHAIN.head = -1;
-    PTR_CHAIN.tail = -1;
+    ctx->ptr_stack.top = -1;
 
     return ret;
 }
 
 static int
-md_process_verbatim_block_contents(MD_CTX* ctx, MD_TEXTTYPE text_type, const MD_VERBATIMLINE* lines, int n_lines)
+md_process_verbatim_block_contents(MD_CTX* ctx, MD_TEXTTYPE text_type, const MD_VERBATIMLINE* lines, MD_SIZE n_lines)
 {
     static const CHAR indent_chunk_str[] = _T("                ");
     static const SZ indent_chunk_size = SIZEOF_ARRAY(indent_chunk_str) - 1;
 
-    int i;
+    MD_SIZE line_index;
     int ret = 0;
 
-    for(i = 0; i < n_lines; i++) {
-        const MD_VERBATIMLINE* line = &lines[i];
+    for(line_index = 0; line_index < n_lines; line_index++) {
+        const MD_VERBATIMLINE* line = &lines[line_index];
         int indent = line->indent;
 
         MD_ASSERT(indent >= 0);
@@ -4626,7 +4743,7 @@ abort:
 }
 
 static int
-md_process_code_block_contents(MD_CTX* ctx, int is_fenced, const MD_VERBATIMLINE* lines, int n_lines)
+md_process_code_block_contents(MD_CTX* ctx, int is_fenced, const MD_VERBATIMLINE* lines, MD_SIZE n_lines)
 {
     if(is_fenced) {
         /* Skip the first line in case of fenced code: It is the fence.
@@ -4693,6 +4810,7 @@ md_process_leaf_block(MD_CTX* ctx, const
     union {
         MD_BLOCK_H_DETAIL header;
         MD_BLOCK_CODE_DETAIL code;
+        MD_BLOCK_TABLE_DETAIL table;
     } det;
     MD_ATTRIBUTE_BUILD info_build;
     MD_ATTRIBUTE_BUILD lang_build;
@@ -4721,6 +4839,12 @@ md_process_leaf_block(MD_CTX* ctx, const
             }
             break;
 
+        case MD_BLOCK_TABLE:
+            det.table.col_count = block->data;
+            det.table.head_row_count = 1;
+            det.table.body_row_count = block->n_lines - 2;
+            break;
+
         default:
             /* Noop. */
             break;
@@ -4874,7 +4998,7 @@ md_push_block_bytes(MD_CTX* ctx, int n_b
 
         /* Fix the ->current_block after the reallocation. */
         if(ctx->current_block != NULL) {
-            OFF off_current_block = (char*) ctx->current_block - (char*) ctx->block_bytes;
+            OFF off_current_block = (OFF) ((char*) ctx->current_block - (char*) ctx->block_bytes);
             ctx->current_block = (MD_BLOCK*) ((char*) new_block_bytes + off_current_block);
         }
 
@@ -4946,8 +5070,8 @@ static int
 md_consume_link_reference_definitions(MD_CTX* ctx)
 {
     MD_LINE* lines = (MD_LINE*) (ctx->current_block + 1);
-    int n_lines = ctx->current_block->n_lines;
-    int n = 0;
+    MD_SIZE n_lines = ctx->current_block->n_lines;
+    MD_SIZE n = 0;
 
     /* Compute how many lines at the start of the block form one or more
      * reference definitions. */
@@ -5002,7 +5126,7 @@ md_end_current_block(MD_CTX* ctx)
        (ctx->current_block->type == MD_BLOCK_H  &&  (ctx->current_block->flags & MD_BLOCK_SETEXT_HEADER)))
     {
         MD_LINE* lines = (MD_LINE*) (ctx->current_block + 1);
-        if(CH(lines[0].beg) == _T('[')) {
+        if(lines[0].beg < ctx->size  &&  CH(lines[0].beg) == _T('[')) {
             MD_CHECK(md_consume_link_reference_definitions(ctx));
             if(ctx->current_block == NULL)
                 return ret;
@@ -5010,7 +5134,7 @@ md_end_current_block(MD_CTX* ctx)
     }
 
     if(ctx->current_block->type == MD_BLOCK_H  &&  (ctx->current_block->flags & MD_BLOCK_SETEXT_HEADER)) {
-        int n_lines = ctx->current_block->n_lines;
+        MD_SIZE n_lines = ctx->current_block->n_lines;
 
         if(n_lines > 1) {
             /* Get rid of the underline. */
@@ -5149,8 +5273,8 @@ md_is_setext_underline(MD_CTX* ctx, OFF
     while(off < ctx->size  &&  CH(off) == CH(beg))
         off++;
 
-    /* Optionally, space(s) can follow. */
-    while(off < ctx->size  &&  CH(off) == _T(' '))
+    /* Optionally, space(s) or tabs can follow. */
+    while(off < ctx->size  &&  ISBLANK(off))
         off++;
 
     /* But nothing more is allowed on the line. */
@@ -5177,21 +5301,23 @@ md_is_table_underline(MD_CTX* ctx, OFF b
     }
 
     while(1) {
-        OFF cell_beg;
         int delimited = FALSE;
 
         /* Cell underline ("-----", ":----", "----:" or ":----:") */
-        cell_beg = off;
         if(off < ctx->size  &&  CH(off) == _T(':'))
             off++;
+        if(off >= ctx->size  ||  CH(off) != _T('-'))
+            return FALSE;
         while(off < ctx->size  &&  CH(off) == _T('-'))
             off++;
         if(off < ctx->size  &&  CH(off) == _T(':'))
             off++;
-        if(off - cell_beg < 3)
-            return FALSE;
 
         col_count++;
+        if(col_count > TABLE_MAXCOLCOUNT) {
+            MD_LOG("Suppressing table (column_count >" STRINGIZE(TABLE_MAXCOLCOUNT) ")");
+            return FALSE;
+        }
 
         /* Pipe delimiter (optional at the end of line). */
         while(off < ctx->size  &&  ISWHITESPACE(off))
@@ -5280,48 +5406,55 @@ out:
     return ret;
 }
 
-/* Returns type of the raw HTML block, or FALSE if it is not HTML block.
- * (Refer to CommonMark specification for details about the types.)
- */
-static int
-md_is_html_block_start_condition(MD_CTX* ctx, OFF beg)
-{
-    typedef struct TAG_tag TAG;
-    struct TAG_tag {
-        const CHAR* name;
-        unsigned len    : 8;
-    };
 
-    /* Type 6 is started by a long list of allowed tags. We use two-level
-     * tree to speed-up the search. */
+/* Helper data for md_is_html_block_start_condition() and
+ * md_is_html_block_end_condition() */
+typedef struct TAG_tag TAG;
+struct TAG_tag {
+    const CHAR* name;
+    unsigned len    : 8;
+};
+
 #ifdef X
     #undef X
 #endif
 #define X(name)     { _T(name), (sizeof(name)-1) / sizeof(CHAR) }
 #define Xend        { NULL, 0 }
-    static const TAG t1[] = { X("script"), X("pre"), X("style"), Xend };
 
-    static const TAG a6[] = { X("address"), X("article"), X("aside"), Xend };
-    static const TAG b6[] = { X("base"), X("basefont"), X("blockquote"), X("body"), Xend };
-    static const TAG c6[] = { X("caption"), X("center"), X("col"), X("colgroup"), Xend };
-    static const TAG d6[] = { X("dd"), X("details"), X("dialog"), X("dir"),
-                              X("div"), X("dl"), X("dt"), Xend };
-    static const TAG f6[] = { X("fieldset"), X("figcaption"), X("figure"), X("footer"),
-                              X("form"), X("frame"), X("frameset"), Xend };
-    static const TAG h6[] = { X("h1"), X("head"), X("header"), X("hr"), X("html"), Xend };
-    static const TAG i6[] = { X("iframe"), Xend };
-    static const TAG l6[] = { X("legend"), X("li"), X("link"), Xend };
-    static const TAG m6[] = { X("main"), X("menu"), X("menuitem"), Xend };
-    static const TAG n6[] = { X("nav"), X("noframes"), Xend };
-    static const TAG o6[] = { X("ol"), X("optgroup"), X("option"), Xend };
-    static const TAG p6[] = { X("p"), X("param"), Xend };
-    static const TAG s6[] = { X("section"), X("source"), X("summary"), Xend };
-    static const TAG t6[] = { X("table"), X("tbody"), X("td"), X("tfoot"), X("th"),
-                              X("thead"), X("title"), X("tr"), X("track"), Xend };
-    static const TAG u6[] = { X("ul"), Xend };
-    static const TAG xx[] = { Xend };
+static const TAG t1[] = { X("pre"), X("script"), X("style"), X("textarea"), Xend };
+
+static const TAG a6[] = { X("address"), X("article"), X("aside"), Xend };
+static const TAG b6[] = { X("base"), X("basefont"), X("blockquote"), X("body"), Xend };
+static const TAG c6[] = { X("caption"), X("center"), X("col"), X("colgroup"), Xend };
+static const TAG d6[] = { X("dd"), X("details"), X("dialog"), X("dir"),
+                          X("div"), X("dl"), X("dt"), Xend };
+static const TAG f6[] = { X("fieldset"), X("figcaption"), X("figure"), X("footer"),
+                          X("form"), X("frame"), X("frameset"), Xend };
+static const TAG h6[] = { X("h1"), X("h2"), X("h3"), X("h4"), X("h5"), X("h6"),
+                          X("head"), X("header"), X("hr"), X("html"), Xend };
+static const TAG i6[] = { X("iframe"), Xend };
+static const TAG l6[] = { X("legend"), X("li"), X("link"), Xend };
+static const TAG m6[] = { X("main"), X("menu"), X("menuitem"), Xend };
+static const TAG n6[] = { X("nav"), X("noframes"), Xend };
+static const TAG o6[] = { X("ol"), X("optgroup"), X("option"), Xend };
+static const TAG p6[] = { X("p"), X("param"), Xend };
+static const TAG s6[] = { X("search"), X("section"), X("summary"), Xend };
+static const TAG t6[] = { X("table"), X("tbody"), X("td"), X("tfoot"), X("th"),
+                          X("thead"), X("title"), X("tr"), X("track"), Xend };
+static const TAG u6[] = { X("ul"), Xend };
+static const TAG xx[] = { Xend };
+
 #undef X
+#undef Xend
 
+/* Returns type of the raw HTML block, or FALSE if it is not HTML block.
+ * (Refer to CommonMark specification for details about the types.)
+ */
+static int
+md_is_html_block_start_condition(MD_CTX* ctx, OFF beg)
+{
+    /* Type 6 is started by a long list of allowed tags. We use two-level
+     * tree to speed-up the search. */
     static const TAG* map6[26] = {
         a6, b6, c6, d6, xx, f6, xx, h6, i6, xx, xx, l6, m6,
         n6, o6, p6, xx, xx, s6, t6, u6, xx, xx, xx, xx, xx
@@ -5348,7 +5481,7 @@ md_is_html_block_start_condition(MD_CTX*
     /* Check for type 4 or 5: <! */
     if(off < ctx->size  &&  CH(off) == _T('!')) {
         /* Check for type 4: <! followed by uppercase letter. */
-        if(off + 1 < ctx->size  &&  ISUPPER(off+1))
+        if(off + 1 < ctx->size  &&  ISASCII(off+1))
             return 4;
 
         /* Check for type 5: <![CDATA[ */
@@ -5432,25 +5565,21 @@ md_is_html_block_end_condition(MD_CTX* c
         case 1:
         {
             OFF off = beg;
+            int i;
 
-            while(off < ctx->size  &&  !ISNEWLINE(off)) {
-                if(CH(off) == _T('<')) {
-                    if(md_ascii_case_eq(STR(off), _T("</script>"), 9)) {
-                        *p_end = off + 9;
-                        return TRUE;
-                    }
-
-                    if(md_ascii_case_eq(STR(off), _T("</style>"), 8)) {
-                        *p_end = off + 8;
-                        return TRUE;
-                    }
-
-                    if(md_ascii_case_eq(STR(off), _T("</pre>"), 6)) {
-                        *p_end = off + 6;
-                        return TRUE;
+            while(off+1 < ctx->size  &&  !ISNEWLINE(off)) {
+                if(CH(off) == _T('<')  &&  CH(off+1) == _T('/')) {
+                    for(i = 0; t1[i].name != NULL; i++) {
+                        if(off + 2 + t1[i].len < ctx->size) {
+                            if(md_ascii_case_eq(STR(off+2), t1[i].name, t1[i].len)  &&
+                               CH(off+2+t1[i].len) == _T('>'))
+                            {
+                                *p_end = off+2+t1[i].len+1;
+                                return TRUE;
+                            }
+                        }
                     }
                 }
-
                 off++;
             }
             *p_end = off;
@@ -5471,8 +5600,12 @@ md_is_html_block_end_condition(MD_CTX* c
 
         case 6:     /* Pass through */
         case 7:
-            *p_end = beg;
-            return (ISNEWLINE(beg) ? ctx->html_block_type : FALSE);
+            if(beg >= ctx->size  ||  ISNEWLINE(beg)) {
+                /* Blank line ends types 6 and 7. */
+                *p_end = beg;
+                return ctx->html_block_type;
+            }
+            return FALSE;
 
         default:
             MD_UNREACHABLE();
@@ -5532,7 +5665,7 @@ md_enter_child_containers(MD_CTX* ctx, i
             case _T(')'):
             case _T('.'):
                 is_ordered_list = TRUE;
-                /* Pass through */
+                MD_FALLTHROUGH();
 
             case _T('-'):
             case _T('+'):
@@ -5578,7 +5711,7 @@ md_leave_child_containers(MD_CTX* ctx, i
             case _T(')'):
             case _T('.'):
                 is_ordered_list = TRUE;
-                /* Pass through */
+                MD_FALLTHROUGH();
 
             case _T('-'):
             case _T('+'):
@@ -5614,11 +5747,11 @@ md_is_container_mark(MD_CTX* ctx, unsign
     OFF off = beg;
     OFF max_end;
 
-    if(indent >= ctx->code_indent_offset)
+    if(off >= ctx->size  ||  indent >= ctx->code_indent_offset)
         return FALSE;
 
     /* Check for block quote mark. */
-    if(off < ctx->size  &&  CH(off) == _T('>')) {
+    if(CH(off) == _T('>')) {
         off++;
         p_container->ch = _T('>');
         p_container->is_loose = FALSE;
@@ -5630,13 +5763,13 @@ md_is_container_mark(MD_CTX* ctx, unsign
     }
 
     /* Check for list item bullet mark. */
-    if(off+1 < ctx->size  &&  ISANYOF(off, _T("-+*"))  &&  (ISBLANK(off+1) || ISNEWLINE(off+1))) {
+    if(ISANYOF(off, _T("-+*"))  &&  (off+1 >= ctx->size || ISBLANK(off+1) || ISNEWLINE(off+1))) {
         p_container->ch = CH(off);
         p_container->is_loose = FALSE;
         p_container->is_task = FALSE;
         p_container->mark_indent = indent;
         p_container->contents_indent = indent + 1;
-        *p_end = off + 1;
+        *p_end = off+1;
         return TRUE;
     }
 
@@ -5649,16 +5782,17 @@ md_is_container_mark(MD_CTX* ctx, unsign
         p_container->start = p_container->start * 10 + CH(off) - _T('0');
         off++;
     }
-    if(off > beg  &&  off+1 < ctx->size  &&
+    if(off > beg  &&
+       off < ctx->size  &&
        (CH(off) == _T('.') || CH(off) == _T(')'))  &&
-       (ISBLANK(off+1) || ISNEWLINE(off+1)))
+       (off+1 >= ctx->size || ISBLANK(off+1) || ISNEWLINE(off+1)))
     {
         p_container->ch = CH(off);
         p_container->is_loose = FALSE;
         p_container->is_task = FALSE;
         p_container->mark_indent = indent;
         p_container->contents_indent = indent + off - beg + 1;
-        *p_end = off + 1;
+        *p_end = off+1;
         return TRUE;
     }
 
@@ -5683,7 +5817,7 @@ md_line_indentation(MD_CTX* ctx, unsigne
     return indent - total_indent;
 }
 
-static const MD_LINE_ANALYSIS md_dummy_blank_line = { MD_LINE_BLANK, 0 };
+static const MD_LINE_ANALYSIS md_dummy_blank_line = { MD_LINE_BLANK, 0, 0, 0, 0, 0 };
 
 /* Analyze type of the line and find some its properties. This serves as a
  * main input for determining type and boundaries of a block. */
@@ -5704,6 +5838,7 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OF
     line->indent = md_line_indentation(ctx, total_indent, off, &off);
     total_indent += line->indent;
     line->beg = off;
+    line->enforce_new_block = FALSE;
 
     /* Given the indentation and block quote marks '>', determine how many of
      * the current containers are our parents. */
@@ -5819,12 +5954,14 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OF
     #if 1
                 /* See https://github.com/mity/md4c/issues/6
                  *
-                 * This ugly checking tests we are in (yet empty) list item but not
-                 * its very first line (with the list item mark).
+                 * This ugly checking tests we are in (yet empty) list item but
+                 * not its very first line (i.e. not the line with the list
+                 * item mark).
                  *
-                 * If we are such blank line, then any following non-blank line
-                 * which would be part of this list item actually ends the list
-                 * because "a list item can begin with at most one blank line."
+                 * If we are such a blank line, then any following non-blank
+                 * line which would be part of the list item actually has to
+                 * end the list because according to the specification, "a list
+                 * item can begin with at most one blank line."
                  */
                 if(n_parents > 0  &&  ctx->containers[n_parents-1].ch != _T('>')  &&
                    n_brothers + n_children == 0  &&  ctx->current_block == NULL  &&
@@ -5839,23 +5976,30 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OF
             break;
         } else {
     #if 1
-            /* This is 2nd half of the hack. If the flag is set (that is there
-             * were 2nd blank line at the start of the list item) and we would also
-             * belonging to such list item, than interrupt the list. */
-            ctx->last_line_has_list_loosening_effect = FALSE;
+            /* This is the 2nd half of the hack. If the flag is set (i.e. there
+             * was a 2nd blank line at the beginning of the list item) and if
+             * we would otherwise still belong to the list item, we enforce
+             * the end of the list. */
             if(ctx->last_list_item_starts_with_two_blank_lines) {
-                if(n_parents > 0  &&  ctx->containers[n_parents-1].ch != _T('>')  &&
+                if(n_parents > 0  &&  n_parents == ctx->n_containers  &&
+                   ctx->containers[n_parents-1].ch != _T('>')  &&
                    n_brothers + n_children == 0  &&  ctx->current_block == NULL  &&
                    ctx->n_block_bytes > (int) sizeof(MD_BLOCK))
                 {
                     MD_BLOCK* top_block = (MD_BLOCK*) ((char*)ctx->block_bytes + ctx->n_block_bytes - sizeof(MD_BLOCK));
-                    if(top_block->type == MD_BLOCK_LI)
+                    if(top_block->type == MD_BLOCK_LI) {
                         n_parents--;
+
+                        line->indent = total_indent;
+                        if(n_parents > 0)
+                            line->indent -= MIN(line->indent, ctx->containers[n_parents-1].contents_indent);
+                    }
                 }
 
                 ctx->last_list_item_starts_with_two_blank_lines = FALSE;
             }
     #endif
+            ctx->last_line_has_list_loosening_effect = FALSE;
         }
 
         /* Check whether we are Setext underline. */
@@ -5921,11 +6065,8 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OF
 
         /* Check for indented code.
          * Note indented code block cannot interrupt a paragraph. */
-        if(line->indent >= ctx->code_indent_offset  &&
-            (pivot_line->type == MD_LINE_BLANK || pivot_line->type == MD_LINE_INDENTEDCODE))
-        {
+        if(line->indent >= ctx->code_indent_offset  &&  (pivot_line->type != MD_LINE_TEXT)) {
             line->type = MD_LINE_INDENTEDCODE;
-            MD_ASSERT(line->indent >= ctx->code_indent_offset);
             line->indent -= ctx->code_indent_offset;
             line->data = 0;
             break;
@@ -5994,10 +6135,13 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OF
         }
 
         /* Check whether we are starting code fence. */
-        if(off < ctx->size  &&  ISANYOF2(off, _T('`'), _T('~'))) {
+        if(line->indent < ctx->code_indent_offset  &&
+                off < ctx->size  &&  ISANYOF2(off, _T('`'), _T('~')))
+        {
             if(md_is_opening_code_fence(ctx, off, &off)) {
                 line->type = MD_LINE_FENCEDCODE;
                 line->data = 1;
+                line->enforce_new_block = TRUE;
                 break;
             }
         }
@@ -6019,6 +6163,7 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OF
                     ctx->html_block_type = 0;
                 }
 
+                line->enforce_new_block = TRUE;
                 line->type = MD_LINE_HTML;
                 break;
             }
@@ -6063,7 +6208,7 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OF
                 task_container->is_task = TRUE;
                 task_container->task_mark_off = tmp + 1;
                 off = tmp + 3;
-                while(ISWHITESPACE(off))
+                while(off < ctx->size  &&  ISWHITESPACE(off))
                     off++;
                 line->beg = off;
             }
@@ -6117,7 +6262,7 @@ md_analyze_line(MD_CTX* ctx, OFF beg, OF
     }
 
     /* Trim trailing spaces. */
-    if(line->type != MD_LINE_INDENTEDCODE  &&  line->type != MD_LINE_FENCEDCODE) {
+    if(line->type != MD_LINE_INDENTEDCODE  &&  line->type != MD_LINE_FENCEDCODE  && line->type != MD_LINE_HTML) {
         while(line->end > line->beg && CH(line->end-1) == _T(' '))
             line->end--;
     }
@@ -6178,6 +6323,9 @@ md_process_line(MD_CTX* ctx, const MD_LI
         return 0;
     }
 
+    if(line->enforce_new_block)
+        MD_CHECK(md_end_current_block(ctx));
+
     /* Some line types form block on their own. */
     if(line->type == MD_LINE_HR || line->type == MD_LINE_ATXHEADER) {
         MD_CHECK(md_end_current_block(ctx));
@@ -6322,13 +6470,14 @@ md_parse(const MD_CHAR* text, MD_SIZE si
     md_build_mark_char_map(&ctx);
     ctx.doc_ends_with_newline = (size > 0  &&  ISNEWLINE_(text[size-1]));
 
-    /* Reset all unresolved opener mark chains. */
-    for(i = 0; i < (int) SIZEOF_ARRAY(ctx.mark_chains); i++) {
-        ctx.mark_chains[i].head = -1;
-        ctx.mark_chains[i].tail = -1;
-    }
+    /* Reset all mark stacks and lists. */
+    for(i = 0; i < (int) SIZEOF_ARRAY(ctx.opener_stacks); i++)
+        ctx.opener_stacks[i].top = -1;
+    ctx.ptr_stack.top = -1;
     ctx.unresolved_link_head = -1;
     ctx.unresolved_link_tail = -1;
+    ctx.table_cell_boundaries_head = -1;
+    ctx.table_cell_boundaries_tail = -1;
 
     /* All the work. */
     ret = md_process_doc(&ctx);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/md4c/md4c.h 5.15.17+dfsg-1/src/3rdparty/md4c/md4c.h
--- 5.15.15+dfsg-2/src/3rdparty/md4c/md4c.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/md4c/md4c.h	2024-11-20 13:56:33.000000000 +0000
@@ -2,7 +2,7 @@
  * MD4C: Markdown parser for C
  * (http://github.com/mity/md4c)
  *
- * Copyright (c) 2016-2020 Martin Mitas
+ * Copyright (c) 2016-2024 Martin Mitáš
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -91,7 +91,8 @@ typedef enum MD_BLOCKTYPE {
     MD_BLOCK_P,
 
     /* <table>...</table> and its contents.
-     * Detail: Structure MD_BLOCK_TD_DETAIL (used with MD_BLOCK_TH and MD_BLOCK_TD)
+     * Detail: Structure MD_BLOCK_TABLE_DETAIL (for MD_BLOCK_TABLE),
+     *         structure MD_BLOCK_TD_DETAIL (for MD_BLOCK_TH and MD_BLOCK_TD)
      * Note all of these are used only if extension MD_FLAG_TABLES is enabled. */
     MD_BLOCK_TABLE,
     MD_BLOCK_THEAD,
@@ -267,6 +268,13 @@ typedef struct MD_BLOCK_CODE_DETAIL {
     MD_CHAR fence_char;     /* The character used for fenced code block; or zero for indented code block. */
 } MD_BLOCK_CODE_DETAIL;
 
+/* Detailed info for MD_BLOCK_TABLE. */
+typedef struct MD_BLOCK_TABLE_DETAIL {
+    unsigned col_count;         /* Count of columns in the table. */
+    unsigned head_row_count;    /* Count of rows in the table header (currently always 1) */
+    unsigned body_row_count;    /* Count of rows in the table body */
+} MD_BLOCK_TABLE_DETAIL;
+
 /* Detailed info for MD_BLOCK_TH and MD_BLOCK_TD. */
 typedef struct MD_BLOCK_TD_DETAIL {
     MD_ALIGN align;
@@ -276,6 +284,7 @@ typedef struct MD_BLOCK_TD_DETAIL {
 typedef struct MD_SPAN_A_DETAIL {
     MD_ATTRIBUTE href;
     MD_ATTRIBUTE title;
+    int is_autolink;            /* nonzero if this is an autolink */
 } MD_SPAN_A_DETAIL;
 
 /* Detailed info for MD_SPAN_IMG. */
@@ -308,6 +317,7 @@ typedef struct MD_SPAN_WIKILINK {
 #define MD_FLAG_LATEXMATHSPANS              0x1000  /* Enable $ and $$ containing LaTeX equations. */
 #define MD_FLAG_WIKILINKS                   0x2000  /* Enable wiki links extension. */
 #define MD_FLAG_UNDERLINE                   0x4000  /* Enable underline extension (and disables '_' for normal emphasis). */
+#define MD_FLAG_HARD_SOFT_BREAKS            0x8000  /* Force all soft breaks to act as hard breaks. */
 
 #define MD_FLAG_PERMISSIVEAUTOLINKS         (MD_FLAG_PERMISSIVEEMAILAUTOLINKS | MD_FLAG_PERMISSIVEURLAUTOLINKS | MD_FLAG_PERMISSIVEWWWAUTOLINKS)
 #define MD_FLAG_NOHTML                      (MD_FLAG_NOHTMLBLOCKS | MD_FLAG_NOHTMLSPANS)
diff -pruN 5.15.15+dfsg-2/src/3rdparty/md4c/qt_attribution.json 5.15.17+dfsg-1/src/3rdparty/md4c/qt_attribution.json
--- 5.15.15+dfsg-2/src/3rdparty/md4c/qt_attribution.json	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/md4c/qt_attribution.json	2024-11-20 13:56:33.000000000 +0000
@@ -9,7 +9,7 @@
     "License": "MIT License",
     "LicenseId": "MIT",
     "LicenseFile": "LICENSE.md",
-    "Version": "0.4.8",
-    "DownloadLocation": "https://github.com/mity/md4c/releases/tag/release-0.4.8",
-    "Copyright": "Copyright © 2016-2020 Martin Mitáš"
+    "Version": "0.5.2",
+    "DownloadLocation": "https://github.com/mity/md4c/releases/tag/release-0.5.2",
+    "Copyright": "Copyright © 2016-2024 Martin Mitáš"
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/AUTHORS 5.15.17+dfsg-1/src/3rdparty/pcre2/AUTHORS
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/AUTHORS	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/AUTHORS	2024-11-20 13:56:33.000000000 +0000
@@ -8,7 +8,7 @@ Email domain:     gmail.com
 Retired from University of Cambridge Computing Service,
 Cambridge, England.
 
-Copyright (c) 1997-2022 University of Cambridge
+Copyright (c) 1997-2024 University of Cambridge
 All rights reserved
 
 
@@ -19,7 +19,7 @@ Written by:       Zoltan Herczeg
 Email local part: hzmester
 Emain domain:     freemail.hu
 
-Copyright(c) 2010-2022 Zoltan Herczeg
+Copyright(c) 2010-2024 Zoltan Herczeg
 All rights reserved.
 
 
@@ -30,7 +30,7 @@ Written by:       Zoltan Herczeg
 Email local part: hzmester
 Emain domain:     freemail.hu
 
-Copyright(c) 2009-2022 Zoltan Herczeg
+Copyright(c) 2009-2024 Zoltan Herczeg
 All rights reserved.
 
 ####
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/LICENCE 5.15.17+dfsg-1/src/3rdparty/pcre2/LICENCE
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/LICENCE	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/LICENCE	2024-11-20 13:56:33.000000000 +0000
@@ -26,7 +26,7 @@ Email domain:     gmail.com
 Retired from University of Cambridge Computing Service,
 Cambridge, England.
 
-Copyright (c) 1997-2022 University of Cambridge
+Copyright (c) 1997-2024 University of Cambridge
 All rights reserved.
 
 
@@ -37,7 +37,7 @@ Written by:       Zoltan Herczeg
 Email local part: hzmester
 Email domain:     freemail.hu
 
-Copyright(c) 2010-2022 Zoltan Herczeg
+Copyright(c) 2010-2024 Zoltan Herczeg
 All rights reserved.
 
 
@@ -48,7 +48,7 @@ Written by:       Zoltan Herczeg
 Email local part: hzmester
 Email domain:     freemail.hu
 
-Copyright(c) 2009-2022 Zoltan Herczeg
+Copyright(c) 2009-2024 Zoltan Herczeg
 All rights reserved.
 
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/import_from_pcre2_tarball.sh 5.15.17+dfsg-1/src/3rdparty/pcre2/import_from_pcre2_tarball.sh
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/import_from_pcre2_tarball.sh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/import_from_pcre2_tarball.sh	2024-11-20 13:56:33.000000000 +0000
@@ -83,6 +83,7 @@ FILES="
     LICENCE
 
     src/pcre2_auto_possess.c
+    src/pcre2_chkdint.c
     src/pcre2_compile.c
     src/pcre2_config.c
     src/pcre2_context.c
@@ -115,9 +116,9 @@ FILES="
     src/pcre2_ucptables.c
     src/pcre2_valid_utf.c
     src/pcre2_xclass.c
+    src/sljit/sljitConfigCPU.h
     src/sljit/sljitConfig.h
     src/sljit/sljitConfigInternal.h
-    src/sljit/sljitExecAllocator.c
     src/sljit/sljitLir.c
     src/sljit/sljitLir.h
     src/sljit/sljitNativeARM_32.c
@@ -136,9 +137,15 @@ FILES="
     src/sljit/sljitNativeX86_32.c
     src/sljit/sljitNativeX86_64.c
     src/sljit/sljitNativeX86_common.c
-    src/sljit/sljitProtExecAllocator.c
-    src/sljit/sljitUtils.c
-    src/sljit/sljitWXExecAllocator.c
+    src/sljit/allocator_src/sljitExecAllocatorPosix.c
+    src/sljit/allocator_src/sljitProtExecAllocatorPosix.c
+    src/sljit/allocator_src/sljitWXExecAllocatorPosix.c
+    src/sljit/allocator_src/sljitProtExecAllocatorNetBSD.c
+    src/sljit/allocator_src/sljitExecAllocatorWindows.c
+    src/sljit/allocator_src/sljitExecAllocatorFreeBSD.c
+    src/sljit/allocator_src/sljitExecAllocatorApple.c
+    src/sljit/allocator_src/sljitWXExecAllocatorWindows.c
+    src/sljit/allocator_src/sljitExecAllocatorCore.c
 "
 
 for i in $FILES; do
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/pcre2.pro 5.15.17+dfsg-1/src/3rdparty/pcre2/pcre2.pro
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/pcre2.pro	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/pcre2.pro	2024-11-20 13:56:33.000000000 +0000
@@ -28,6 +28,7 @@ macos:contains(QT_ARCHS, "arm64"): QMAKE
 SOURCES += \
     $$PWD/src/pcre2_auto_possess.c \
     $$PWD/src/pcre2_chartables.c \
+    $$PWD/src/pcre2_chkdint.c \
     $$PWD/src/pcre2_compile.c \
     $$PWD/src/pcre2_config.c \
     $$PWD/src/pcre2_context.c \
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/qt_attribution.json 5.15.17+dfsg-1/src/3rdparty/pcre2/qt_attribution.json
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/qt_attribution.json	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/qt_attribution.json	2024-11-20 13:56:33.000000000 +0000
@@ -7,13 +7,13 @@
 
     "Description": "The PCRE library is a set of functions that implement regular expression pattern matching using the same syntax and semantics as Perl 5.",
     "Homepage": "http://www.pcre.org/",
-    "Version": "10.42",
-    "DownloadLocation": "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.42/pcre2-10.42.tar.bz2",
-    "License": "BSD 3-clause \"New\" or \"Revised\" License",
-    "LicenseId": "BSD-3-Clause",
+    "Version": "10.43",
+    "DownloadLocation": "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.43/pcre2-10.43.tar.bz2",
+    "License": "BSD 3-clause \"New\" or \"Revised\" License with PCRE2 binary-like Packages Exception",
+    "LicenseId": "LicenseRef-BSD-3-Clause-with-PCRE2-Binary-Like-Packages-Exception",
     "LicenseFile": "LICENCE",
-    "Copyright": "Copyright (c) 1997-2022 University of Cambridge
-Copyright (c) 2010-2022 Zoltan Herczeg"
+    "Copyright": "Copyright (c) 1997-2024 University of Cambridge
+Copyright (c) 2010-2024 Zoltan Herczeg"
 },
 {
     "Id": "pcre2-sljit",
@@ -24,11 +24,11 @@ Copyright (c) 2010-2022 Zoltan Herczeg"
     "Path": "src/sljit",
     "Description": "The PCRE library is a set of functions that implement regular expression pattern matching using the same syntax and semantics as Perl 5.",
     "Homepage": "http://www.pcre.org/",
-    "Version": "10.42",
-    "DownloadLocation": "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.42/pcre2-10.42.tar.bz2",
+    "Version": "10.43",
+    "DownloadLocation": "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.43/pcre2-10.43.tar.bz2",
     "License": "BSD 2-clause \"Simplified\" License",
     "LicenseId": "BSD-2-Clause",
     "LicenseFile": "LICENCE-SLJIT",
-    "Copyright": "Copyright (c) 2009-2022 Zoltan Herczeg"
+    "Copyright": "Copyright (c) 2009-2024 Zoltan Herczeg"
 }
 ]
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/config.h 5.15.17+dfsg-1/src/3rdparty/pcre2/src/config.h
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/config.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/config.h	2024-11-20 13:56:33.000000000 +0000
@@ -14,13 +14,15 @@
 #define MAX_NAME_SIZE 32
 #define NEWLINE_DEFAULT 2
 #define PARENS_NEST_LIMIT 250
+#define MAX_VARLOOKBEHIND 255
 
 #define SUPPORT_UNICODE
+#define PCRE2_EXPORT
 
 /*
     man 3 pcre2jit for a list of supported platforms;
-    as PCRE2 10.22, stable JIT support is available for:
-    - ARM 32-bit (v5, v7, and Thumb2)
+    as PCRE2 10.43, stable JIT support is available for:
+    - ARM 32-bit (v7 and Thumb2)
     - ARM 64-bit
     - Intel x86 32-bit and 64-bit
     - MIPS 32-bit and 64-bit
@@ -32,7 +34,7 @@
 #if !defined(PCRE2_DISABLE_JIT) && (\
     /* ARM */ \
     (defined(__GNUC__) \
-        && (defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM) || defined(__aarch64__))) \
+        && (defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__aarch64__))) \
     /* x86 32/64 */ \
     || defined(__i386) || defined(__i386__) || defined(_M_IX86) \
     || defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64) \
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2.h 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2.h
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2.h	2024-11-20 13:56:33.000000000 +0000
@@ -5,7 +5,7 @@
 /* This is the public header file for the PCRE library, second API, to be
 #included by applications that call PCRE2 functions.
 
-           Copyright (c) 2016-2021 University of Cambridge
+           Copyright (c) 2016-2024 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -42,9 +42,9 @@ POSSIBILITY OF SUCH DAMAGE.
 /* The current PCRE version information. */
 
 #define PCRE2_MAJOR           10
-#define PCRE2_MINOR           42
+#define PCRE2_MINOR           43
 #define PCRE2_PRERELEASE      
-#define PCRE2_DATE            2022-12-11
+#define PCRE2_DATE            2024-02-16
 
 /* When an application links to a PCRE DLL in Windows, the symbols that are
 imported have to be identified as such. When building PCRE2, the appropriate
@@ -153,6 +153,12 @@ D   is inspected during pcre2_dfa_match(
 #define PCRE2_EXTRA_ESCAPED_CR_IS_LF         0x00000010u  /* C */
 #define PCRE2_EXTRA_ALT_BSUX                 0x00000020u  /* C */
 #define PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK     0x00000040u  /* C */
+#define PCRE2_EXTRA_CASELESS_RESTRICT        0x00000080u  /* C */
+#define PCRE2_EXTRA_ASCII_BSD                0x00000100u  /* C */
+#define PCRE2_EXTRA_ASCII_BSS                0x00000200u  /* C */
+#define PCRE2_EXTRA_ASCII_BSW                0x00000400u  /* C */
+#define PCRE2_EXTRA_ASCII_POSIX              0x00000800u  /* C */
+#define PCRE2_EXTRA_ASCII_DIGIT              0x00001000u  /* C */
 
 /* These are for pcre2_jit_compile(). */
 
@@ -180,11 +186,12 @@ pcre2_jit_match() ignores the latter sin
 #define PCRE2_SUBSTITUTE_UNSET_EMPTY      0x00000400u  /* pcre2_substitute() only */
 #define PCRE2_SUBSTITUTE_UNKNOWN_UNSET    0x00000800u  /* pcre2_substitute() only */
 #define PCRE2_SUBSTITUTE_OVERFLOW_LENGTH  0x00001000u  /* pcre2_substitute() only */
-#define PCRE2_NO_JIT                      0x00002000u  /* Not for pcre2_dfa_match() */
+#define PCRE2_NO_JIT                      0x00002000u  /* not for pcre2_dfa_match() */
 #define PCRE2_COPY_MATCHED_SUBJECT        0x00004000u
 #define PCRE2_SUBSTITUTE_LITERAL          0x00008000u  /* pcre2_substitute() only */
 #define PCRE2_SUBSTITUTE_MATCHED          0x00010000u  /* pcre2_substitute() only */
 #define PCRE2_SUBSTITUTE_REPLACEMENT_ONLY 0x00020000u  /* pcre2_substitute() only */
+#define PCRE2_DISABLE_RECURSELOOP_CHECK   0x00040000u  /* not for pcre2_dfa_match() or pcre2_jit_match() */
 
 /* Options for pcre2_pattern_convert(). */
 
@@ -399,6 +406,7 @@ released, the numbers must not be change
 #define PCRE2_ERROR_CONVERT_SYNTAX    (-64)
 #define PCRE2_ERROR_INTERNAL_DUPMATCH (-65)
 #define PCRE2_ERROR_DFA_UINVALID_UTF  (-66)
+#define PCRE2_ERROR_INVALIDOFFSET     (-67)
 
 
 /* Request types for pcre2_pattern_info() */
@@ -575,7 +583,7 @@ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION
 PCRE2_EXP_DECL pcre2_general_context *PCRE2_CALL_CONVENTION \
   pcre2_general_context_copy(pcre2_general_context *); \
 PCRE2_EXP_DECL pcre2_general_context *PCRE2_CALL_CONVENTION \
-  pcre2_general_context_create(void *(*)(PCRE2_SIZE, void *), \
+  pcre2_general_context_create(void *(*)(size_t, void *), \
     void (*)(void *, void *), void *); \
 PCRE2_EXP_DECL void PCRE2_CALL_CONVENTION \
   pcre2_general_context_free(pcre2_general_context *);
@@ -596,6 +604,8 @@ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION
 PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
   pcre2_set_max_pattern_length(pcre2_compile_context *, PCRE2_SIZE); \
 PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
+  pcre2_set_max_varlookbehind(pcre2_compile_context *, uint32_t); \
+PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
   pcre2_set_newline(pcre2_compile_context *, uint32_t); \
 PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
   pcre2_set_parens_nest_limit(pcre2_compile_context *, uint32_t); \
@@ -628,7 +638,7 @@ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION
   pcre2_set_recursion_limit(pcre2_match_context *, uint32_t); \
 PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
   pcre2_set_recursion_memory_management(pcre2_match_context *, \
-    void *(*)(PCRE2_SIZE, void *), void (*)(void *, void *), void *);
+    void *(*)(size_t, void *), void (*)(void *, void *), void *);
 
 #define PCRE2_CONVERT_CONTEXT_FUNCTIONS \
 PCRE2_EXP_DECL pcre2_convert_context *PCRE2_CALL_CONVENTION \
@@ -687,6 +697,8 @@ PCRE2_EXP_DECL PCRE2_SPTR PCRE2_CALL_CON
   pcre2_get_mark(pcre2_match_data *); \
 PCRE2_EXP_DECL PCRE2_SIZE PCRE2_CALL_CONVENTION \
   pcre2_get_match_data_size(pcre2_match_data *); \
+PCRE2_EXP_DECL PCRE2_SIZE PCRE2_CALL_CONVENTION \
+  pcre2_get_match_data_heapframes_size(pcre2_match_data *); \
 PCRE2_EXP_DECL uint32_t PCRE2_CALL_CONVENTION \
   pcre2_get_ovector_count(pcre2_match_data *); \
 PCRE2_EXP_DECL PCRE2_SIZE *PCRE2_CALL_CONVENTION \
@@ -722,7 +734,7 @@ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION
 PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
   pcre2_substring_number_from_name(const pcre2_code *, PCRE2_SPTR); \
 PCRE2_EXP_DECL void PCRE2_CALL_CONVENTION \
-  pcre2_substring_list_free(PCRE2_SPTR *); \
+  pcre2_substring_list_free(PCRE2_UCHAR **); \
 PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
   pcre2_substring_list_get(pcre2_match_data *, PCRE2_UCHAR ***, PCRE2_SIZE **);
 
@@ -771,7 +783,7 @@ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION
 PCRE2_EXP_DECL void PCRE2_CALL_CONVENTION \
   pcre2_jit_free_unused_memory(pcre2_general_context *); \
 PCRE2_EXP_DECL pcre2_jit_stack *PCRE2_CALL_CONVENTION \
-  pcre2_jit_stack_create(PCRE2_SIZE, PCRE2_SIZE, pcre2_general_context *); \
+  pcre2_jit_stack_create(size_t, size_t, pcre2_general_context *); \
 PCRE2_EXP_DECL void PCRE2_CALL_CONVENTION \
   pcre2_jit_stack_assign(pcre2_match_context *, pcre2_jit_callback, void *); \
 PCRE2_EXP_DECL void PCRE2_CALL_CONVENTION \
@@ -851,6 +863,7 @@ pcre2_compile are called by application
 #define pcre2_general_context_free            PCRE2_SUFFIX(pcre2_general_context_free_)
 #define pcre2_get_error_message               PCRE2_SUFFIX(pcre2_get_error_message_)
 #define pcre2_get_mark                        PCRE2_SUFFIX(pcre2_get_mark_)
+#define pcre2_get_match_data_heapframes_size  PCRE2_SUFFIX(pcre2_get_match_data_heapframes_size_)
 #define pcre2_get_match_data_size             PCRE2_SUFFIX(pcre2_get_match_data_size_)
 #define pcre2_get_ovector_pointer             PCRE2_SUFFIX(pcre2_get_ovector_pointer_)
 #define pcre2_get_ovector_count               PCRE2_SUFFIX(pcre2_get_ovector_count_)
@@ -886,6 +899,7 @@ pcre2_compile are called by application
 #define pcre2_set_glob_separator              PCRE2_SUFFIX(pcre2_set_glob_separator_)
 #define pcre2_set_heap_limit                  PCRE2_SUFFIX(pcre2_set_heap_limit_)
 #define pcre2_set_match_limit                 PCRE2_SUFFIX(pcre2_set_match_limit_)
+#define pcre2_set_max_varlookbehind           PCRE2_SUFFIX(pcre2_set_max_varlookbehind_)
 #define pcre2_set_max_pattern_length          PCRE2_SUFFIX(pcre2_set_max_pattern_length_)
 #define pcre2_set_newline                     PCRE2_SUFFIX(pcre2_set_newline_)
 #define pcre2_set_parens_nest_limit           PCRE2_SUFFIX(pcre2_set_parens_nest_limit_)
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_auto_possess.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_auto_possess.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_auto_possess.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_auto_possess.c	2024-11-20 13:56:33.000000000 +0000
@@ -560,6 +560,8 @@ matches to an empty string (also represe
 
 for(;;)
   {
+  PCRE2_SPTR bracode;
+
   /* All operations move the code pointer forward.
   Therefore infinite recursions are not possible. */
 
@@ -617,7 +619,8 @@ for(;;)
     recursions. (This could be improved by keeping a list of group numbers that
     are called by recursion.) */
 
-    switch(*(code - GET(code, 1)))
+    bracode = code - GET(code, 1);
+    switch(*bracode)
       {
       case OP_CBRA:
       case OP_SCBRA:
@@ -636,16 +639,19 @@ for(;;)
       break;
 
       /* Atomic sub-patterns and assertions can always auto-possessify their
-      last iterator. However, if the group was entered as a result of checking
-      a previous iterator, this is not possible. */
+      last iterator except for variable length lookbehinds. However, if the
+      group was entered as a result of checking a previous iterator, this is
+      not possible. */
 
       case OP_ASSERT:
       case OP_ASSERT_NOT:
-      case OP_ASSERTBACK:
-      case OP_ASSERTBACK_NOT:
       case OP_ONCE:
       return !entered_a_group;
 
+      case OP_ASSERTBACK:
+      case OP_ASSERTBACK_NOT:
+      return (bracode[1+LINK_SIZE] == OP_VREVERSE)? FALSE : !entered_a_group;
+
       /* Non-atomic assertions - don't possessify last iterator. This needs
       more thought. */
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_chartables.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_chartables.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_chartables.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_chartables.c	2024-11-20 13:56:33.000000000 +0000
@@ -5,7 +5,8 @@
 /* This file was automatically written by the pcre2_dftables auxiliary
 program. It contains character tables that are used when no external
 tables are passed to PCRE2 by the application that calls it. The tables
-are used only for characters whose code values are less than 256. */
+are used only for characters whose code values are less than 256, and
+only relevant if not in UCP mode. */
 
 /* This set of tables was written in the C locale. */
 
@@ -18,13 +19,6 @@ PCRE2 is configured with --enable-rebuil
 pcre2_dftables manually with the -L option to build tables using the LC_ALL
 locale. */
 
-/* The following #include is present because without it gcc 4.x may remove
-the array definition from the final binary if PCRE2 is built into a static
-library and dead code stripping is activated. This leads to link errors.
-Pulling in the header ensures that the array gets flagged as "someone
-outside this compilation unit might reference this" and so it will always
-be supplied to the linker. */
-
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -163,7 +157,7 @@ graph, print, punct, and cntrl. Other cl
   0x02   letter
   0x04   lower case letter
   0x08   decimal digit
-  0x10   alphanumeric or '_'
+  0x10   word (alphanumeric or '_')
 */
 
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   0-  7 */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_chkdint.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_chkdint.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_chkdint.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_chkdint.c	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,96 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                     Written by Philip Hazel
+            Copyright (c) 2023 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * 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.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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.
+-----------------------------------------------------------------------------
+*/
+
+/* This file contains functions to implement checked integer operation */
+
+#ifndef PCRE2_PCRE2TEST
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcre2_internal.h"
+#endif
+
+/*************************************************
+*        Checked Integer Multiplication          *
+*************************************************/
+
+/*
+Arguments:
+  r         A pointer to PCRE2_SIZE to store the answer
+  a, b      Two integers
+
+Returns:    Bool indicating if the operation overflows
+
+It is modeled after C23's <stdckdint.h> interface
+The INT64_OR_DOUBLE type is a 64-bit integer type when available,
+otherwise double. */
+
+BOOL
+PRIV(ckd_smul)(PCRE2_SIZE *r, int a, int b)
+{
+#ifdef HAVE_BUILTIN_MUL_OVERFLOW
+PCRE2_SIZE m;
+
+if (__builtin_mul_overflow(a, b, &m)) return TRUE;
+
+*r = m;
+#else
+INT64_OR_DOUBLE m;
+
+#ifdef PCRE2_DEBUG
+if (a < 0 || b < 0) abort();
+#endif
+
+m = (INT64_OR_DOUBLE)a * (INT64_OR_DOUBLE)b;
+
+#if defined INT64_MAX || defined int64_t
+if (sizeof(m) > sizeof(*r) && m > (INT64_OR_DOUBLE)PCRE2_SIZE_MAX) return TRUE;
+*r = (PCRE2_SIZE)m;
+#else
+if (m > PCRE2_SIZE_MAX) return TRUE;
+*r = m;
+#endif
+
+#endif
+
+return FALSE;
+}
+
+/* End of pcre_chkdint.c */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_compile.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_compile.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_compile.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_compile.c	2024-11-20 13:56:33.000000000 +0000
@@ -7,7 +7,7 @@ and semantics are as close as possible t
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2022 University of Cambridge
+          New API code Copyright (c) 2016-2023 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -118,17 +118,17 @@ them will be able to (i.e. assume a 64-b
 
 #ifdef SUPPORT_UNICODE
 static unsigned int
-  add_list_to_class_internal(uint8_t *, PCRE2_UCHAR **, uint32_t,
+  add_list_to_class_internal(uint8_t *, PCRE2_UCHAR **, uint32_t, uint32_t,
     compile_block *, const uint32_t *, unsigned int);
 #endif
 
 static int
-  compile_regex(uint32_t, PCRE2_UCHAR **, uint32_t **, int *, uint32_t,
-    uint32_t *, uint32_t *, uint32_t *, uint32_t *, branch_chain *,
-    compile_block *, PCRE2_SIZE *);
+  compile_regex(uint32_t, uint32_t, PCRE2_UCHAR **, uint32_t **, int *,
+    uint32_t, uint32_t *, uint32_t *, uint32_t *, uint32_t *, branch_chain *,
+    open_capitem *, compile_block *, PCRE2_SIZE *);
 
 static int
-  get_branchlength(uint32_t **, int *, int *, parsed_recurse_check *,
+  get_branchlength(uint32_t **, int *, int *, int *, parsed_recurse_check *,
     compile_block *);
 
 static BOOL
@@ -694,8 +694,8 @@ static uint32_t chartypeoffset[] = {
 now all in a single string, to reduce the number of relocations when a shared
 library is dynamically loaded. The list of lengths is terminated by a zero
 length entry. The first three must be alpha, lower, upper, as this is assumed
-for handling case independence. The indices for graph, print, and punct are
-needed, so identify them. */
+for handling case independence. The indices for several classes are needed, so
+identify them. */
 
 static const char posix_names[] =
   STRING_alpha0 STRING_lower0 STRING_upper0 STRING_alnum0
@@ -706,9 +706,11 @@ static const char posix_names[] =
 static const uint8_t posix_name_lengths[] = {
   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 };
 
-#define PC_GRAPH  8
-#define PC_PRINT  9
-#define PC_PUNCT 10
+#define PC_DIGIT   7
+#define PC_GRAPH   8
+#define PC_PRINT   9
+#define PC_PUNCT  10
+#define PC_XDIGIT 13
 
 /* Table of class bit maps for each POSIX class. Each class is formed from a
 base map, with an optional addition or removal of another map. Then, for some
@@ -721,20 +723,20 @@ absolute value of the third field has th
 remove vertical space characters, 2 => remove underscore. */
 
 static const int posix_class_maps[] = {
-  cbit_word,  cbit_digit, -2,             /* alpha */
-  cbit_lower, -1,          0,             /* lower */
-  cbit_upper, -1,          0,             /* upper */
-  cbit_word,  -1,          2,             /* alnum - word without underscore */
-  cbit_print, cbit_cntrl,  0,             /* ascii */
-  cbit_space, -1,          1,             /* blank - a GNU extension */
-  cbit_cntrl, -1,          0,             /* cntrl */
-  cbit_digit, -1,          0,             /* digit */
-  cbit_graph, -1,          0,             /* graph */
-  cbit_print, -1,          0,             /* print */
-  cbit_punct, -1,          0,             /* punct */
-  cbit_space, -1,          0,             /* space */
-  cbit_word,  -1,          0,             /* word - a Perl extension */
-  cbit_xdigit,-1,          0              /* xdigit */
+  cbit_word,   cbit_digit, -2,            /* alpha */
+  cbit_lower,  -1,          0,            /* lower */
+  cbit_upper,  -1,          0,            /* upper */
+  cbit_word,   -1,          2,            /* alnum - word without underscore */
+  cbit_print,  cbit_cntrl,  0,            /* ascii */
+  cbit_space,  -1,          1,            /* blank - a GNU extension */
+  cbit_cntrl,  -1,          0,            /* cntrl */
+  cbit_digit,  -1,          0,            /* digit */
+  cbit_graph,  -1,          0,            /* graph */
+  cbit_print,  -1,          0,            /* print */
+  cbit_punct,  -1,          0,            /* punct */
+  cbit_space,  -1,          0,            /* space */
+  cbit_word,   -1,          0,            /* word - a Perl extension */
+  cbit_xdigit, -1,          0             /* xdigit */
 };
 
 #ifdef SUPPORT_UNICODE
@@ -756,7 +758,7 @@ static int posix_substitutes[] = {
   PT_PXPUNCT, 0,    /* punct */
   PT_PXSPACE, 0,    /* space */   /* Xps is POSIX space, but from 8.34 */
   PT_WORD, 0,       /* word  */   /* Perl and POSIX space are the same */
-  -1, 0             /* xdigit, treat as non-UCP */
+  PT_PXXDIGIT, 0    /* xdigit */  /* Perl has additional hex digits */
 };
 #define POSIX_SUBSIZE (sizeof(posix_substitutes) / (2*sizeof(uint32_t)))
 #endif  /* SUPPORT_UNICODE */
@@ -779,13 +781,15 @@ are allowed. */
    PCRE2_NO_DOTSTAR_ANCHOR|PCRE2_UCP|PCRE2_UNGREEDY)
 
 #define PUBLIC_LITERAL_COMPILE_EXTRA_OPTIONS \
-   (PCRE2_EXTRA_MATCH_LINE|PCRE2_EXTRA_MATCH_WORD)
+   (PCRE2_EXTRA_MATCH_LINE|PCRE2_EXTRA_MATCH_WORD|PCRE2_EXTRA_CASELESS_RESTRICT)
 
 #define PUBLIC_COMPILE_EXTRA_OPTIONS \
    (PUBLIC_LITERAL_COMPILE_EXTRA_OPTIONS| \
     PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES|PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL| \
     PCRE2_EXTRA_ESCAPED_CR_IS_LF|PCRE2_EXTRA_ALT_BSUX| \
-    PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK)
+    PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK|PCRE2_EXTRA_ASCII_BSD| \
+    PCRE2_EXTRA_ASCII_BSS|PCRE2_EXTRA_ASCII_BSW|PCRE2_EXTRA_ASCII_POSIX| \
+    PCRE2_EXTRA_ASCII_DIGIT)
 
 /* Compile time error code numbers. They are given names so that they can more
 easily be tracked. When a new number is added, the tables called eint1 and
@@ -804,7 +808,7 @@ enum { ERR0 = COMPILE_ERROR_BASE,
        ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERR68, ERR69, ERR70,
        ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERR78, ERR79, ERR80,
        ERR81, ERR82, ERR83, ERR84, ERR85, ERR86, ERR87, ERR88, ERR89, ERR90,
-       ERR91, ERR92, ERR93, ERR94, ERR95, ERR96, ERR97, ERR98, ERR99 };
+       ERR91, ERR92, ERR93, ERR94, ERR95, ERR96, ERR97, ERR98, ERR99, ERR100 };
 
 /* This is a table of start-of-pattern options such as (*UTF) and settings such
 as (*LIMIT_MATCH=nnnn) and (*CRLF). For completeness and backward
@@ -817,7 +821,8 @@ enum { PSO_OPT,     /* Value is an optio
        PSO_BSR,     /* Value is a \R type */
        PSO_LIMH,    /* Read integer value for heap limit */
        PSO_LIMM,    /* Read integer value for match limit */
-       PSO_LIMD };  /* Read integer value for depth limit */
+       PSO_LIMD     /* Read integer value for depth limit */
+     };
 
 typedef struct pso {
   const uint8_t *name;
@@ -828,7 +833,7 @@ typedef struct pso {
 
 /* NB: STRING_UTFn_RIGHTPAR contains the length as well */
 
-static pso pso_list[] = {
+static const pso pso_list[] = {
   { (uint8_t *)STRING_UTFn_RIGHTPAR,                  PSO_OPT, PCRE2_UTF },
   { (uint8_t *)STRING_UTF_RIGHTPAR,                4, PSO_OPT, PCRE2_UTF },
   { (uint8_t *)STRING_UCP_RIGHTPAR,                4, PSO_OPT, PCRE2_UCP },
@@ -1059,24 +1064,24 @@ for (;;)
     case META_SKIP: fprintf(stderr, "META (*SKIP)"); break;
     case META_THEN: fprintf(stderr, "META (*THEN)"); break;
 
-    case META_OPTIONS: fprintf(stderr, "META_OPTIONS 0x%02x", *pptr++); break;
+    case META_OPTIONS:
+    fprintf(stderr, "META_OPTIONS 0x%08x 0x%08x", pptr[0], pptr[1]);
+    pptr += 2;
+    break;
 
     case META_LOOKBEHIND:
-    fprintf(stderr, "META (?<= %d offset=", meta_arg);
-    GETOFFSET(offset, pptr);
-    fprintf(stderr, "%zd", offset);
+    fprintf(stderr, "META (?<= %d %d", meta_arg, *pptr);
+    pptr += 2;
     break;
 
     case META_LOOKBEHIND_NA:
-    fprintf(stderr, "META (*naplb: %d offset=", meta_arg);
-    GETOFFSET(offset, pptr);
-    fprintf(stderr, "%zd", offset);
+    fprintf(stderr, "META (*naplb: %d %d", meta_arg, *pptr);
+    pptr += 2;
     break;
 
     case META_LOOKBEHINDNOT:
-    fprintf(stderr, "META (?<! %d offset=", meta_arg);
-    GETOFFSET(offset, pptr);
-    fprintf(stderr, "%zd", offset);
+    fprintf(stderr, "META (?<! %d %d", meta_arg, *pptr);
+    pptr += 2;
     break;
 
     case META_CALLOUT_NUMBER:
@@ -1297,9 +1302,9 @@ if (code != NULL)
 *************************************************/
 
 /* This function is used to read numbers in the pattern. The initial pointer
-must be the sign or first digit of the number. When relative values (introduced
-by + or -) are allowed, they are relative group numbers, and the result must be
-greater than zero.
+must be at the sign or first digit of the number. When relative values
+(introduced by + or -) are allowed, they are relative group numbers, and the
+result must be greater than zero.
 
 Arguments:
   ptrptr      points to the character pointer variable
@@ -1383,17 +1388,18 @@ return yield;
 *         Read repeat counts                     *
 *************************************************/
 
-/* Read an item of the form {n,m} and return the values if non-NULL pointers
+/* Read an item of the form {n,m} and return the values when non-NULL pointers
 are supplied. Repeat counts must be less than 65536 (MAX_REPEAT_COUNT); a
 larger value is used for "unlimited". We have to use signed arguments for
-read_number() because it is capable of returning a signed value.
+read_number() because it is capable of returning a signed value. As of Perl
+5.34.0 either n or m may be absent, but not both. Perl also allows spaces and
+tabs after { and before } and between the numbers and the comma, so we do too.
 
 Arguments:
-  ptrptr         points to pointer to character after'{'
+  ptrptr         points to pointer to character after '{'
   ptrend         pointer to end of input
   minp           if not NULL, pointer to int for min
-  maxp           if not NULL, pointer to int for max (-1 if no max)
-                 returned as -1 if no max
+  maxp           if not NULL, pointer to int for max
   errorcodeptr   points to error code variable
 
 Returns:         FALSE if not a repeat quantifier, errorcode set zero
@@ -1405,57 +1411,96 @@ static BOOL
 read_repeat_counts(PCRE2_SPTR *ptrptr, PCRE2_SPTR ptrend, uint32_t *minp,
   uint32_t *maxp, int *errorcodeptr)
 {
-PCRE2_SPTR p;
+PCRE2_SPTR p = *ptrptr;
+PCRE2_SPTR pp;
 BOOL yield = FALSE;
-BOOL had_comma = FALSE;
+BOOL had_minimum = FALSE;
 int32_t min = 0;
 int32_t max = REPEAT_UNLIMITED; /* This value is larger than MAX_REPEAT_COUNT */
 
-/* Check the syntax */
-
 *errorcodeptr = 0;
-for (p = *ptrptr;; p++)
+while (p < ptrend && (*p == CHAR_SPACE || *p == CHAR_HT)) p++;
+
+/* Check the syntax before interpreting. Otherwise, a non-quantifier sequence
+such as "X{123456ABC" would incorrectly give a "number too big in quantifier"
+error. */
+
+pp = p;
+if (pp < ptrend && IS_DIGIT(*pp))
   {
-  uint32_t c;
-  if (p >= ptrend) return FALSE;
-  c = *p;
-  if (IS_DIGIT(c)) continue;
-  if (c == CHAR_RIGHT_CURLY_BRACKET) break;
-  if (c == CHAR_COMMA)
+  had_minimum = TRUE;
+  while (++pp < ptrend && IS_DIGIT(*pp)) {}
+  }
+
+while (pp < ptrend && (*pp == CHAR_SPACE || *pp == CHAR_HT)) pp++;
+if (pp >= ptrend) return FALSE;
+
+if (*pp == CHAR_RIGHT_CURLY_BRACKET)
+  {
+  if (!had_minimum) return FALSE;
+  }
+else
+  {
+  if (*pp++ != CHAR_COMMA) return FALSE;
+  while (pp < ptrend && (*pp == CHAR_SPACE || *pp == CHAR_HT)) pp++;
+  if (pp >= ptrend) return FALSE;
+  if (IS_DIGIT(*pp))
     {
-    if (had_comma) return FALSE;
-    had_comma = TRUE;
+    while (++pp < ptrend && IS_DIGIT(*pp)) {}
     }
-  else return FALSE;
+  else if (!had_minimum) return FALSE;
+  while (pp < ptrend && (*pp == CHAR_SPACE || *pp == CHAR_HT)) pp++;
+  if (pp >= ptrend || *pp != CHAR_RIGHT_CURLY_BRACKET) return FALSE;
   }
 
-/* The only error from read_number() is for a number that is too big. */
+/* Now process the quantifier for real. We know it must be {n} or (n,} or {,m}
+or {n,m}. The only error that read_number() can return is for a number that is
+too big. If *errorcodeptr is returned as zero it means no number was found. */
 
-p = *ptrptr;
-if (!read_number(&p, ptrend, -1, MAX_REPEAT_COUNT, ERR5, &min, errorcodeptr))
-  goto EXIT;
+/* Deal with {,m} or n too big. If we successfully read m there is no need to
+check m >= n because n defaults to zero. */
 
-if (*p == CHAR_RIGHT_CURLY_BRACKET)
+if (!read_number(&p, ptrend, -1, MAX_REPEAT_COUNT, ERR5, &min, errorcodeptr))
   {
-  p++;
-  max = min;
+  if (*errorcodeptr != 0) goto EXIT;    /* n too big */
+  p++;  /* Skip comma and subsequent spaces */
+  while (p < ptrend && (*p == CHAR_SPACE || *p == CHAR_HT)) p++;
+  if (!read_number(&p, ptrend, -1, MAX_REPEAT_COUNT, ERR5, &max, errorcodeptr))
+    {
+    if (*errorcodeptr != 0) goto EXIT;  /* m too big */
+    }
   }
+
+/* Have read one number. Deal with {n} or {n,} or {n,m} */
+
 else
   {
-  if (*(++p) != CHAR_RIGHT_CURLY_BRACKET)
+  while (p < ptrend && (*p == CHAR_SPACE || *p == CHAR_HT)) p++;
+  if (*p == CHAR_RIGHT_CURLY_BRACKET)
     {
-    if (!read_number(&p, ptrend, -1, MAX_REPEAT_COUNT, ERR5, &max,
-        errorcodeptr))
-      goto EXIT;
+    max = min;
+    }
+  else   /* Handle {n,} or {n,m} */
+    {
+    p++;    /* Skip comma and subsequent spaces */
+    while (p < ptrend && (*p == CHAR_SPACE || *p == CHAR_HT)) p++;
+    if (!read_number(&p, ptrend, -1, MAX_REPEAT_COUNT, ERR5, &max, errorcodeptr))
+      {
+      if (*errorcodeptr != 0) goto EXIT;   /* m too big */
+      }
+
     if (max < min)
       {
       *errorcodeptr = ERR4;
       goto EXIT;
       }
     }
-  p++;
   }
 
+/* Valid quantifier exists */
+
+while (p < ptrend && (*p == CHAR_SPACE || *p == CHAR_HT)) p++;
+p++;
 yield = TRUE;
 if (minp != NULL) *minp = (uint32_t)min;
 if (maxp != NULL) *maxp = (uint32_t)max;
@@ -1491,6 +1536,7 @@ Arguments:
   chptr          points to a returned data character
   errorcodeptr   points to the errorcode variable (containing zero)
   options        the current options bits
+  xoptions       the current extra options bits
   isclass        TRUE if inside a character class
   cb             compile data block or NULL when called from pcre2_substitute()
 
@@ -1502,10 +1548,12 @@ Returns:         zero => a data characte
 
 int
 PRIV(check_escape)(PCRE2_SPTR *ptrptr, PCRE2_SPTR ptrend, uint32_t *chptr,
-  int *errorcodeptr, uint32_t options, uint32_t extra_options, BOOL isclass,
+  int *errorcodeptr, uint32_t options, uint32_t xoptions, BOOL isclass,
   compile_block *cb)
 {
 BOOL utf = (options & PCRE2_UTF) != 0;
+BOOL alt_bsux =
+  ((options & PCRE2_ALT_BSUX) | (xoptions & PCRE2_EXTRA_ALT_BSUX)) != 0;
 PCRE2_SPTR ptr = *ptrptr;
 uint32_t c, cc;
 int escape = 0;
@@ -1539,7 +1587,7 @@ else if ((i = escapes[c - ESCAPES_FIRST]
   if (i > 0)
     {
     c = (uint32_t)i;
-    if (c == CHAR_CR && (extra_options & PCRE2_EXTRA_ESCAPED_CR_IS_LF) != 0)
+    if (c == CHAR_CR && (xoptions & PCRE2_EXTRA_ESCAPED_CR_IS_LF) != 0)
       c = CHAR_LF;
     }
   else  /* Negative table entry */
@@ -1557,6 +1605,10 @@ else if ((i = escapes[c - ESCAPES_FIRST]
       {
       PCRE2_SPTR p = ptr + 1;
 
+      /* Perl ignores spaces and tabs after { */
+
+      while (p < ptrend && (*p == CHAR_SPACE || *p == CHAR_HT)) p++;
+
       /* \N{U+ can be handled by the \x{ code. However, this construction is
       not valid in EBCDIC environments because it specifies a Unicode
       character, not a codepoint in the local code. For example \N{U+0041}
@@ -1571,7 +1623,7 @@ else if ((i = escapes[c - ESCAPES_FIRST]
 #else
         if (utf)
           {
-          ptr = p + 1;
+          ptr = p + 2;
           escape = 0;   /* Not a fancy escape after all */
           goto COME_FROM_NU;
           }
@@ -1602,8 +1654,6 @@ else
   int s;
   PCRE2_SPTR oldptr;
   BOOL overflow;
-  BOOL alt_bsux =
-    ((options & PCRE2_ALT_BSUX) | (extra_options & PCRE2_EXTRA_ALT_BSUX)) != 0;
 
   /* Filter calls from pcre2_substitute(). */
 
@@ -1632,7 +1682,9 @@ else
     is set. Otherwise, \u must be followed by exactly four hex digits or, if
     PCRE2_EXTRA_ALT_BSUX is set, by any number of hex digits in braces.
     Otherwise it is a lowercase u letter. This gives some compatibility with
-    ECMAScript (aka JavaScript). */
+    ECMAScript (aka JavaScript). Unlike other braced items, white space is NOT
+    allowed. When \u{ is not followed by hex digits, a special return is given
+    because otherwise \u{ 12} (for example) would be treated as u{12}. */
 
     case CHAR_u:
     if (!alt_bsux) *errorcodeptr = ERR37; else
@@ -1641,11 +1693,11 @@ else
 
       if (ptr >= ptrend) break;
       if (*ptr == CHAR_LEFT_CURLY_BRACKET &&
-          (extra_options & PCRE2_EXTRA_ALT_BSUX) != 0)
+          (xoptions & PCRE2_EXTRA_ALT_BSUX) != 0)
         {
         PCRE2_SPTR hptr = ptr + 1;
-        cc = 0;
 
+        cc = 0;
         while (hptr < ptrend && (xc = XDIGIT(*hptr)) != 0xff)
           {
           if ((cc & 0xf0000000) != 0)  /* Test for 32-bit overflow */
@@ -1661,7 +1713,11 @@ else
         if (hptr == ptr + 1 ||   /* No hex digits */
             hptr >= ptrend ||    /* Hit end of input */
             *hptr != CHAR_RIGHT_CURLY_BRACKET)  /* No } terminator */
-          break;         /* Hex escape not recognized */
+          {
+          escape = ESC_ub;    /* Special return */
+          ptr++;              /* Skip { */
+          break;              /* Hex escape not recognized */
+          }
 
         c = cc;          /* Accept the code point */
         ptr = hptr + 1;
@@ -1685,7 +1741,7 @@ else
         if (c > 0x10ffffU) *errorcodeptr = ERR77;
         else
           if (c >= 0xd800 && c <= 0xdfff &&
-              (extra_options & PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES) == 0)
+              (xoptions & PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES) == 0)
                 *errorcodeptr = ERR73;
         }
       else if (c > MAX_NON_UTF_CHAR) *errorcodeptr = ERR77;
@@ -1741,12 +1797,16 @@ else
     if (*ptr == CHAR_LEFT_CURLY_BRACKET)
       {
       PCRE2_SPTR p = ptr + 1;
+
+      while (p < ptrend && (*p == CHAR_SPACE || *p == CHAR_HT)) p++;
       if (!read_number(&p, ptrend, cb->bracount, MAX_GROUP_NUMBER, ERR61, &s,
           errorcodeptr))
         {
         if (*errorcodeptr == 0) escape = ESC_k;  /* No number found */
         break;
         }
+      while (p < ptrend && (*p == CHAR_SPACE || *p == CHAR_HT)) p++;
+
       if (p >= ptrend || *p != CHAR_RIGHT_CURLY_BRACKET)
         {
         *errorcodeptr = ERR57;
@@ -1842,56 +1902,64 @@ else
     break;
 
     /* \o is a relatively new Perl feature, supporting a more general way of
-    specifying character codes in octal. The only supported form is \o{ddd}. */
+    specifying character codes in octal. The only supported form is \o{ddd},
+    with optional spaces or tabs after { and before }. */
 
     case CHAR_o:
     if (ptr >= ptrend || *ptr++ != CHAR_LEFT_CURLY_BRACKET)
       {
       ptr--;
       *errorcodeptr = ERR55;
+      break;
       }
-    else if (ptr >= ptrend || *ptr == CHAR_RIGHT_CURLY_BRACKET)
+
+    while (ptr < ptrend && (*ptr == CHAR_SPACE || *ptr == CHAR_HT)) ptr++;
+    if (ptr >= ptrend || *ptr == CHAR_RIGHT_CURLY_BRACKET)
+      {
       *errorcodeptr = ERR78;
-    else
+      break;
+      }
+
+    c = 0;
+    overflow = FALSE;
+    while (ptr < ptrend && *ptr >= CHAR_0 && *ptr <= CHAR_7)
       {
-      c = 0;
-      overflow = FALSE;
-      while (ptr < ptrend && *ptr >= CHAR_0 && *ptr <= CHAR_7)
-        {
-        cc = *ptr++;
-        if (c == 0 && cc == CHAR_0) continue;     /* Leading zeroes */
+      cc = *ptr++;
+      if (c == 0 && cc == CHAR_0) continue;     /* Leading zeroes */
 #if PCRE2_CODE_UNIT_WIDTH == 32
-        if (c >= 0x20000000l) { overflow = TRUE; break; }
+      if (c >= 0x20000000l) { overflow = TRUE; break; }
 #endif
-        c = (c << 3) + (cc - CHAR_0);
+      c = (c << 3) + (cc - CHAR_0);
 #if PCRE2_CODE_UNIT_WIDTH == 8
-        if (c > (utf ? 0x10ffffU : 0xffU)) { overflow = TRUE; break; }
+      if (c > (utf ? 0x10ffffU : 0xffU)) { overflow = TRUE; break; }
 #elif PCRE2_CODE_UNIT_WIDTH == 16
-        if (c > (utf ? 0x10ffffU : 0xffffU)) { overflow = TRUE; break; }
+      if (c > (utf ? 0x10ffffU : 0xffffU)) { overflow = TRUE; break; }
 #elif PCRE2_CODE_UNIT_WIDTH == 32
-        if (utf && c > 0x10ffffU) { overflow = TRUE; break; }
+      if (utf && c > 0x10ffffU) { overflow = TRUE; break; }
 #endif
-        }
-      if (overflow)
-        {
-        while (ptr < ptrend && *ptr >= CHAR_0 && *ptr <= CHAR_7) ptr++;
-        *errorcodeptr = ERR34;
-        }
-      else if (ptr < ptrend && *ptr++ == CHAR_RIGHT_CURLY_BRACKET)
-        {
-        if (utf && c >= 0xd800 && c <= 0xdfff &&
-            (extra_options & PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES) == 0)
-          {
-          ptr--;
-          *errorcodeptr = ERR73;
-          }
-        }
-      else
+      }
+
+    while (ptr < ptrend && (*ptr == CHAR_SPACE || *ptr == CHAR_HT)) ptr++;
+
+    if (overflow)
+      {
+      while (ptr < ptrend && *ptr >= CHAR_0 && *ptr <= CHAR_7) ptr++;
+      *errorcodeptr = ERR34;
+      }
+    else if (ptr < ptrend && *ptr++ == CHAR_RIGHT_CURLY_BRACKET)
+      {
+      if (utf && c >= 0xd800 && c <= 0xdfff &&
+          (xoptions & PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES) == 0)
         {
         ptr--;
-        *errorcodeptr = ERR64;
+        *errorcodeptr = ERR73;
         }
       }
+    else
+      {
+      ptr--;
+      *errorcodeptr = ERR64;
+      }
     break;
 
     /* When PCRE2_ALT_BSUX or PCRE2_EXTRA_ALT_BSUX is set, \x must be followed
@@ -1919,10 +1987,13 @@ else
       {
       if (ptr < ptrend && *ptr == CHAR_LEFT_CURLY_BRACKET)
         {
+        ptr++;
+        while (ptr < ptrend && (*ptr == CHAR_SPACE || *ptr == CHAR_HT)) ptr++;
+
 #ifndef EBCDIC
         COME_FROM_NU:
 #endif
-        if (++ptr >= ptrend || *ptr == CHAR_RIGHT_CURLY_BRACKET)
+        if (ptr >= ptrend || *ptr == CHAR_RIGHT_CURLY_BRACKET)
           {
           *errorcodeptr = ERR78;
           break;
@@ -1945,6 +2016,12 @@ else
             }
           }
 
+        /* Perl ignores spaces and tabs before } */
+
+        while (ptr < ptrend && (*ptr == CHAR_SPACE || *ptr == CHAR_HT)) ptr++;
+
+        /* On overflow, skip remaining hex digits */
+
         if (overflow)
           {
           while (ptr < ptrend && XDIGIT(*ptr) != 0xff) ptr++;
@@ -1953,17 +2030,17 @@ else
         else if (ptr < ptrend && *ptr++ == CHAR_RIGHT_CURLY_BRACKET)
           {
           if (utf && c >= 0xd800 && c <= 0xdfff &&
-              (extra_options & PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES) == 0)
+              (xoptions & PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES) == 0)
             {
             ptr--;
             *errorcodeptr = ERR73;
             }
           }
 
-        /* If the sequence of hex digits does not end with '}', give an error.
-        We used just to recognize this construct and fall through to the normal
-        \x handling, but nowadays Perl gives an error, which seems much more
-        sensible, so we do too. */
+        /* If the sequence of hex digits (followed by optional space) does not
+        end with '}', give an error. We used just to recognize this construct
+        and fall through to the normal \x handling, but nowadays Perl gives an
+        error, which seems much more sensible, so we do too. */
 
         else
           {
@@ -2117,7 +2194,11 @@ if (c == CHAR_LEFT_CURLY_BRACKET)
     {
     if (ptr >= cb->end_pattern) goto ERROR_RETURN;
     c = *ptr++;
+#if PCRE2_CODE_UNIT_WIDTH != 8
+    while (c == '_' || c == '-' || (c <= 0xff && isspace(c)))
+#else
     while (c == '_' || c == '-' || isspace(c))
+#endif
       {
       if (ptr >= cb->end_pattern) goto ERROR_RETURN;
       c = *ptr++;
@@ -2355,12 +2436,13 @@ return -1;
 
 /* This function is called from parse_regex() below whenever it needs to read
 the name of a subpattern or a (*VERB) or an (*alpha_assertion). The initial
-pointer must be to the character before the name. If that character is '*' we
-are reading a verb or alpha assertion name. The pointer is updated to point
-after the name, for a VERB or alpha assertion name, or after tha name's
-terminator for a subpattern name. Returning both the offset and the name
-pointer is redundant information, but some callers use one and some the other,
-so it is simplest just to return both.
+pointer must be to the preceding character. If that character is '*' we are
+reading a verb or alpha assertion name. The pointer is updated to point after
+the name, for a VERB or alpha assertion name, or after tha name's terminator
+for a subpattern name. Returning both the offset and the name pointer is
+redundant information, but some callers use one and some the other, so it is
+simplest just to return both. When the name is in braces, spaces and tabs are
+allowed (and ignored) at either end.
 
 Arguments:
   ptrptr      points to the character pointer variable
@@ -2383,9 +2465,13 @@ read_name(PCRE2_SPTR *ptrptr, PCRE2_SPTR
   int *errorcodeptr, compile_block *cb)
 {
 PCRE2_SPTR ptr = *ptrptr;
-BOOL is_group = (*ptr != CHAR_ASTERISK);
+BOOL is_group = (*ptr++ != CHAR_ASTERISK);
+BOOL is_braced = terminator == CHAR_RIGHT_CURLY_BRACKET;
 
-if (++ptr >= ptrend)               /* No characters in name */
+if (is_braced)
+  while (ptr < ptrend && (*ptr == CHAR_SPACE || *ptr == CHAR_HT)) ptr++;
+
+if (ptr >= ptrend)                 /* No characters in name */
   {
   *errorcodeptr = is_group? ERR62: /* Subpattern name expected */
                             ERR60; /* Verb not recognized or malformed */
@@ -2464,6 +2550,8 @@ if (is_group)
     *errorcodeptr = ERR62;   /* Subpattern name expected */
     goto FAILED;
     }
+  if (is_braced)
+    while (ptr < ptrend && (*ptr == CHAR_SPACE || *ptr == CHAR_HT)) ptr++;
   if (ptr >= ptrend || *ptr != (PCRE2_UCHAR)terminator)
     {
     *errorcodeptr = ERR42;
@@ -2533,6 +2621,85 @@ return parsed_pattern;
 
 
 /*************************************************
+*          Handle \d, \D, \s, \S, \w, \W         *
+*************************************************/
+
+/* This function is called from parse_regex() below, both for freestanding
+escapes, and those within classes, to handle those escapes that may change when
+Unicode property support is requested. Note that PCRE2_UCP will never be set
+without Unicode support because that is checked when pcre2_compile() is called.
+
+Arguments:
+  escape          the ESC_... value
+  parsed_pattern  where to add the code
+  options         options bits
+  xoptions        extra options bits
+
+Returns:          updated value of parsed_pattern
+*/
+static uint32_t *
+handle_escdsw(int escape, uint32_t *parsed_pattern, uint32_t options,
+  uint32_t xoptions)
+{
+uint32_t ascii_option = 0;
+uint32_t prop = ESC_p;
+
+switch(escape)
+  {
+  case ESC_D:
+  prop = ESC_P;
+  /* Fall through */
+  case ESC_d:
+  ascii_option = PCRE2_EXTRA_ASCII_BSD;
+  break;
+
+  case ESC_S:
+  prop = ESC_P;
+  /* Fall through */
+  case ESC_s:
+  ascii_option = PCRE2_EXTRA_ASCII_BSS;
+  break;
+
+  case ESC_W:
+  prop = ESC_P;
+  /* Fall through */
+  case ESC_w:
+  ascii_option = PCRE2_EXTRA_ASCII_BSW;
+  break;
+  }
+
+if ((options & PCRE2_UCP) == 0 || (xoptions & ascii_option) != 0)
+  {
+  *parsed_pattern++ = META_ESCAPE + escape;
+  }
+else
+  {
+  *parsed_pattern++ = META_ESCAPE + prop;
+  switch(escape)
+    {
+    case ESC_d:
+    case ESC_D:
+    *parsed_pattern++ = (PT_PC << 16) | ucp_Nd;
+    break;
+
+    case ESC_s:
+    case ESC_S:
+    *parsed_pattern++ = PT_SPACE << 16;
+    break;
+
+    case ESC_w:
+    case ESC_W:
+    *parsed_pattern++ = PT_WORD << 16;
+    break;
+    }
+  }
+
+return parsed_pattern;
+}
+
+
+
+/*************************************************
 *      Parse regex and identify named groups     *
 *************************************************/
 
@@ -2560,6 +2727,7 @@ typedef struct nest_save {
   uint16_t  max_group;
   uint16_t  flags;
   uint32_t  options;
+  uint32_t  xoptions;
 } nest_save;
 
 #define NSF_RESET          0x0001u
@@ -2575,6 +2743,10 @@ the main compiling phase. */
   PCRE2_EXTENDED|PCRE2_EXTENDED_MORE|PCRE2_MULTILINE|PCRE2_NO_AUTO_CAPTURE| \
   PCRE2_UNGREEDY)
 
+#define PARSE_TRACKED_EXTRA_OPTIONS (PCRE2_EXTRA_CASELESS_RESTRICT| \
+  PCRE2_EXTRA_ASCII_BSD|PCRE2_EXTRA_ASCII_BSS|PCRE2_EXTRA_ASCII_BSW| \
+  PCRE2_EXTRA_ASCII_DIGIT|PCRE2_EXTRA_ASCII_POSIX)
+
 /* States used for analyzing ranges in character classes. The two OK values
 must be last. */
 
@@ -2609,9 +2781,11 @@ uint32_t *verbstartptr = NULL;
 uint32_t *previous_callout = NULL;
 uint32_t *parsed_pattern = cb->parsed_pattern;
 uint32_t *parsed_pattern_end = cb->parsed_pattern_end;
+uint32_t *this_parsed_item = NULL;
+uint32_t *prev_parsed_item = NULL;
 uint32_t meta_quantifier = 0;
 uint32_t add_after_mark = 0;
-uint32_t extra_options = cb->cx->extra_options;
+uint32_t xoptions = cb->cx->extra_options;
 uint16_t nest_depth = 0;
 int after_manual_callout = 0;
 int expect_cond_assert = 0;
@@ -2635,12 +2809,12 @@ nest_save *top_nest, *end_nests;
 /* Insert leading items for word and line matching (features provided for the
 benefit of pcre2grep). */
 
-if ((extra_options & PCRE2_EXTRA_MATCH_LINE) != 0)
+if ((xoptions & PCRE2_EXTRA_MATCH_LINE) != 0)
   {
   *parsed_pattern++ = META_CIRCUMFLEX;
   *parsed_pattern++ = META_NOCAPTURE;
   }
-else if ((extra_options & PCRE2_EXTRA_MATCH_WORD) != 0)
+else if ((xoptions & PCRE2_EXTRA_MATCH_WORD) != 0)
   {
   *parsed_pattern++ = META_ESCAPE + ESC_b;
   *parsed_pattern++ = META_NOCAPTURE;
@@ -2691,6 +2865,7 @@ while (ptr < ptrend)
   int prev_expect_cond_assert;
   uint32_t min_repeat = 0, max_repeat = 0;
   uint32_t set, unset, *optset;
+  uint32_t xset, xunset, *xoptset;
   uint32_t terminator;
   uint32_t prev_meta_quantifier;
   BOOL prev_okquantifier;
@@ -2709,6 +2884,17 @@ while (ptr < ptrend)
     goto FAILED;        /* Parentheses too deeply nested */
     }
 
+  /* If the last time round this loop something was added, parsed_pattern will
+  no longer be equal to this_parsed_item. Remember where the previous item
+  started and reset for the next item. Note that sometimes round the loop,
+  nothing gets added (e.g. for ignored white space). */
+
+  if (this_parsed_item != parsed_pattern)
+    {
+    prev_parsed_item = this_parsed_item;
+    this_parsed_item = parsed_pattern;
+    }
+
   /* Get next input character, save its position for callout handling. */
 
   thisptr = ptr;
@@ -2817,7 +3003,7 @@ while (ptr < ptrend)
       if ((options & PCRE2_ALT_VERBNAMES) != 0)
         {
         escape = PRIV(check_escape)(&ptr, ptrend, &c, &errorcode, options,
-          cb->cx->extra_options, FALSE, cb);
+          xoptions, FALSE, cb);
         if (errorcode != 0) goto FAILED;
         }
       else escape = 0;   /* Treat all as literal */
@@ -2831,6 +3017,11 @@ while (ptr < ptrend)
         *parsed_pattern++ = c;
         break;
 
+        case ESC_ub:
+        *parsed_pattern++ = CHAR_u;
+        PARSED_LITERAL(CHAR_LEFT_CURLY_BRACKET, parsed_pattern);
+        break;
+
         case ESC_Q:
         inescq = TRUE;
         break;
@@ -2917,8 +3108,11 @@ while (ptr < ptrend)
          !read_repeat_counts(&tempptr, ptrend, NULL, NULL, &errorcode))))
     {
     if (after_manual_callout-- <= 0)
+      {
       parsed_pattern = manage_callouts(thisptr, &previous_callout, auto_callout,
         parsed_pattern, cb);
+      this_parsed_item = parsed_pattern;  /* New start for current item */
+      }
     }
 
   /* If expect_cond_assert is 2, we have just passed (?( and are expecting an
@@ -2995,7 +3189,6 @@ while (ptr < ptrend)
     continue;  /* Next character in pattern */
     }
 
-
   /* Process the next item in the main part of a pattern. */
 
   switch(c)
@@ -3010,11 +3203,11 @@ while (ptr < ptrend)
     case CHAR_BACKSLASH:
     tempptr = ptr;
     escape = PRIV(check_escape)(&ptr, ptrend, &c, &errorcode, options,
-      cb->cx->extra_options, FALSE, cb);
+      xoptions, FALSE, cb);
     if (errorcode != 0)
       {
       ESCAPE_FAILED:
-      if ((extra_options & PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL) == 0)
+      if ((xoptions & PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL) == 0)
         goto FAILED;
       ptr = tempptr;
       if (ptr >= ptrend) c = CHAR_BACKSLASH; else
@@ -3088,6 +3281,16 @@ while (ptr < ptrend)
       *parsed_pattern++ = META_ESCAPE + escape;
       break;
 
+      /* This is a special return that happens only in EXTRA_ALT_BSUX mode,
+      when \u{ is not followed by hex digits and }. It requests two literal
+      characters, u and { and we need this, as otherwise \u{ 12} (for example)
+      would be treated as u{12} now that spaces are allowed in quantifiers. */
+
+      case ESC_ub:
+      *parsed_pattern++ = CHAR_u;
+      PARSED_LITERAL(CHAR_LEFT_CURLY_BRACKET, parsed_pattern);
+      break;
+
       case ESC_X:
 #ifndef SUPPORT_UNICODE
       errorcode = ERR45;   /* Supported only with Unicode support */
@@ -3107,9 +3310,7 @@ while (ptr < ptrend)
       *parsed_pattern++ = META_ESCAPE + escape;
       break;
 
-      /* Escapes that change in UCP mode. Note that PCRE2_UCP will never be set
-      without Unicode support because it is checked when pcre2_compile() is
-      called. */
+      /* Escapes that may change in UCP mode. */
 
       case ESC_d:
       case ESC_D:
@@ -3118,33 +3319,8 @@ while (ptr < ptrend)
       case ESC_w:
       case ESC_W:
       okquantifier = TRUE;
-      if ((options & PCRE2_UCP) == 0)
-        {
-        *parsed_pattern++ = META_ESCAPE + escape;
-        }
-      else
-        {
-        *parsed_pattern++ = META_ESCAPE +
-          ((escape == ESC_d || escape == ESC_s || escape == ESC_w)?
-            ESC_p : ESC_P);
-        switch(escape)
-          {
-          case ESC_d:
-          case ESC_D:
-          *parsed_pattern++ = (PT_PC << 16) | ucp_Nd;
-          break;
-
-          case ESC_s:
-          case ESC_S:
-          *parsed_pattern++ = PT_SPACE << 16;
-          break;
-
-          case ESC_w:
-          case ESC_W:
-          *parsed_pattern++ = PT_WORD << 16;
-          break;
-          }
-        }
+      parsed_pattern = handle_escdsw(escape, parsed_pattern, options,
+        xoptions);
       break;
 
       /* Unicode property matching */
@@ -3206,7 +3382,8 @@ while (ptr < ptrend)
         if (errorcode != 0) goto ESCAPE_FAILED;
         }
 
-      /* Not a numerical recursion */
+      /* Not a numerical recursion. Perl allows spaces and tabs after { and
+      before } but not for other delimiters. */
 
       if (!read_name(&ptr, ptrend, utf, terminator, &offset, &name, &namelen,
           &errorcode, cb)) goto ESCAPE_FAILED;
@@ -3273,7 +3450,8 @@ while (ptr < ptrend)
 
     /* ---- Quantifier post-processing ---- */
 
-    /* Check that a quantifier is allowed after the previous item. */
+    /* Check that a quantifier is allowed after the previous item. This
+    guarantees that there is a previous item. */
 
     CHECK_QUANTIFIER:
     if (!prev_okquantifier)
@@ -3288,7 +3466,7 @@ while (ptr < ptrend)
     wrapping it in non-capturing brackets, but we have to allow for a preceding
     (*MARK) for when (*ACCEPT) has an argument. */
 
-    if (parsed_pattern[-1] == META_ACCEPT)
+    if (*prev_parsed_item == META_ACCEPT)
       {
       uint32_t *p;
       for (p = parsed_pattern - 1; p >= verbstartptr; p--) p[1] = p[0];
@@ -3507,18 +3685,24 @@ while (ptr < ptrend)
 
         class_range_state = RANGE_NO;
 
-        /* When PCRE2_UCP is set, some of the POSIX classes are converted to
-        use Unicode properties \p or \P or, in one case, \h or \H. The
-        substitutes table has two values per class, containing the type and
-        value of a \p or \P item. The special cases are specified with a
-        negative type: a non-zero value causes \h or \H to be used, and a zero
-        value falls through to behave like a non-UCP POSIX class. */
+        /* When PCRE2_UCP is set, unless PCRE2_EXTRA_ASCII_POSIX is set, some
+        of the POSIX classes are converted to use Unicode properties \p or \P
+        or, in one case, \h or \H. The substitutes table has two values per
+        class, containing the type and value of a \p or \P item. The special
+        cases are specified with a negative type: a non-zero value causes \h or
+        \H to be used, and a zero value falls through to behave like a non-UCP
+        POSIX class. There are now also some extra options that force ASCII for
+        some classes. */
 
 #ifdef SUPPORT_UNICODE
-        if ((options & PCRE2_UCP) != 0)
+        if ((options & PCRE2_UCP) != 0 &&
+            (xoptions & PCRE2_EXTRA_ASCII_POSIX) == 0 &&
+            !((xoptions & PCRE2_EXTRA_ASCII_DIGIT) != 0 &&
+              (posix_class == PC_DIGIT || posix_class == PC_XDIGIT)))
           {
           int ptype = posix_substitutes[2*posix_class];
           int pvalue = posix_substitutes[2*posix_class + 1];
+
           if (ptype >= 0)
             {
             *parsed_pattern++ = META_ESCAPE + (posix_negate? ESC_P : ESC_p);
@@ -3587,11 +3771,11 @@ while (ptr < ptrend)
         {
         tempptr = ptr;
         escape = PRIV(check_escape)(&ptr, ptrend, &c, &errorcode, options,
-          cb->cx->extra_options, TRUE, cb);
+          xoptions, TRUE, cb);
 
         if (errorcode != 0)
           {
-          if ((extra_options & PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL) == 0)
+          if ((xoptions & PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL) == 0)
             goto FAILED;
           ptr = tempptr;
           if (ptr >= ptrend) c = CHAR_BACKSLASH; else
@@ -3605,7 +3789,7 @@ while (ptr < ptrend)
           {
           case 0:  /* Escaped character code point is in c */
           char_is_literal = FALSE;
-          goto CLASS_LITERAL;
+          goto CLASS_LITERAL;      /* (a few lines above) */
 
           case ESC_b:
           c = CHAR_BS;    /* \b is backspace in a class */
@@ -3656,7 +3840,7 @@ while (ptr < ptrend)
           *parsed_pattern++ = META_ESCAPE + escape;
           break;
 
-          /* These escapes are converted to Unicode property tests when
+          /* These escapes may be converted to Unicode property tests when
           PCRE2_UCP is set. */
 
           case ESC_d:
@@ -3665,33 +3849,8 @@ while (ptr < ptrend)
           case ESC_S:
           case ESC_w:
           case ESC_W:
-          if ((options & PCRE2_UCP) == 0)
-            {
-            *parsed_pattern++ = META_ESCAPE + escape;
-            }
-          else
-            {
-            *parsed_pattern++ = META_ESCAPE +
-              ((escape == ESC_d || escape == ESC_s || escape == ESC_w)?
-                ESC_p : ESC_P);
-            switch(escape)
-              {
-              case ESC_d:
-              case ESC_D:
-              *parsed_pattern++ = (PT_PC << 16) | ucp_Nd;
-              break;
-
-              case ESC_s:
-              case ESC_S:
-              *parsed_pattern++ = PT_SPACE << 16;
-              break;
-
-              case ESC_w:
-              case ESC_W:
-              *parsed_pattern++ = PT_WORD << 16;
-              break;
-              }
-            }
+          parsed_pattern = handle_escdsw(escape, parsed_pattern, options,
+            xoptions);
           break;
 
           /* Explicit Unicode property matching */
@@ -3890,6 +4049,7 @@ while (ptr < ptrend)
             top_nest->nest_depth = nest_depth;
             top_nest->flags = NSF_ATOMICSR;
             top_nest->options = options & PARSE_TRACKED_OPTIONS;
+            top_nest->xoptions = xoptions & PARSE_TRACKED_EXTRA_OPTIONS;
             }
           break;
 #else  /* SUPPORT_UNICODE */
@@ -4022,6 +4182,7 @@ while (ptr < ptrend)
       top_nest->nest_depth = nest_depth;
       top_nest->flags = 0;
       top_nest->options = options & PARSE_TRACKED_OPTIONS;
+      top_nest->xoptions = xoptions & PARSE_TRACKED_EXTRA_OPTIONS;
 
       /* Start of non-capturing group that resets the capture count for each
       branch. */
@@ -4036,24 +4197,28 @@ while (ptr < ptrend)
         ptr++;
         }
 
-      /* Scan for options imnsxJU to be set or unset. */
+      /* Scan for options imnrsxJU to be set or unset. */
 
       else
         {
         BOOL hyphenok = TRUE;
         uint32_t oldoptions = options;
+        uint32_t oldxoptions = xoptions;
 
         top_nest->reset_group = 0;
         top_nest->max_group = 0;
         set = unset = 0;
         optset = &set;
+        xset = xunset = 0;
+        xoptset = &xset;
 
-        /* ^ at the start unsets imnsx and disables the subsequent use of - */
+        /* ^ at the start unsets irmnsx and disables the subsequent use of - */
 
         if (ptr < ptrend && *ptr == CHAR_CIRCUMFLEX_ACCENT)
           {
           options &= ~(PCRE2_CASELESS|PCRE2_MULTILINE|PCRE2_NO_AUTO_CAPTURE|
                        PCRE2_DOTALL|PCRE2_EXTENDED|PCRE2_EXTENDED_MORE);
+          xoptions &= ~(PCRE2_EXTRA_CASELESS_RESTRICT);
           hyphenok = FALSE;
           ptr++;
           }
@@ -4071,9 +4236,51 @@ while (ptr < ptrend)
               goto FAILED;
               }
             optset = &unset;
+            xoptset = &xunset;
             hyphenok = FALSE;
             break;
 
+            /* There are some two-character sequences that start with 'a'. */
+
+            case CHAR_a:
+            if (ptr < ptrend)
+              {
+              if (*ptr == CHAR_D)
+                {
+                *xoptset |= PCRE2_EXTRA_ASCII_BSD;
+                ptr++;
+                break;
+                }
+              if (*ptr == CHAR_P)
+                {
+                *xoptset |= (PCRE2_EXTRA_ASCII_POSIX|PCRE2_EXTRA_ASCII_DIGIT);
+                ptr++;
+                break;
+                }
+              if (*ptr == CHAR_S)
+                {
+                *xoptset |= PCRE2_EXTRA_ASCII_BSS;
+                ptr++;
+                break;
+                }
+              if (*ptr == CHAR_T)
+                {
+                *xoptset |= PCRE2_EXTRA_ASCII_DIGIT;
+                ptr++;
+                break;
+                }
+              if (*ptr == CHAR_W)
+                {
+                *xoptset |= PCRE2_EXTRA_ASCII_BSW;
+                ptr++;
+                break;
+                }
+              }
+            *xoptset |= PCRE2_EXTRA_ASCII_BSD|PCRE2_EXTRA_ASCII_BSS|
+                        PCRE2_EXTRA_ASCII_BSW|
+                        PCRE2_EXTRA_ASCII_DIGIT|PCRE2_EXTRA_ASCII_POSIX;
+            break;
+
             case CHAR_J:  /* Record that it changed in the external options */
             *optset |= PCRE2_DUPNAMES;
             cb->external_flags |= PCRE2_JCHANGED;
@@ -4082,6 +4289,7 @@ while (ptr < ptrend)
             case CHAR_i: *optset |= PCRE2_CASELESS; break;
             case CHAR_m: *optset |= PCRE2_MULTILINE; break;
             case CHAR_n: *optset |= PCRE2_NO_AUTO_CAPTURE; break;
+            case CHAR_r: *xoptset|= PCRE2_EXTRA_CASELESS_RESTRICT; break;
             case CHAR_s: *optset |= PCRE2_DOTALL; break;
             case CHAR_U: *optset |= PCRE2_UNGREEDY; break;
 
@@ -4112,6 +4320,7 @@ while (ptr < ptrend)
           unset |= PCRE2_EXTENDED_MORE;
 
         options = (options | set) & (~unset);
+        xoptions = (xoptions | xset) & (~xunset);
 
         /* If the options ended with ')' this is not the start of a nested
         group with option changes, so the options change at this level.
@@ -4132,10 +4341,11 @@ while (ptr < ptrend)
 
         /* If nothing changed, no need to record. */
 
-        if (options != oldoptions)
+        if (options != oldoptions || xoptions != oldxoptions)
           {
           *parsed_pattern++ = META_OPTIONS;
           *parsed_pattern++ = options;
+          *parsed_pattern++ = xoptions;
           }
         }     /* End options processing */
       break;  /* End default case after (? */
@@ -4605,6 +4815,7 @@ while (ptr < ptrend)
         top_nest->nest_depth = nest_depth;
         top_nest->flags = NSF_CONDASSERT;
         top_nest->options = options & PARSE_TRACKED_OPTIONS;
+        top_nest->xoptions = xoptions & PARSE_TRACKED_EXTRA_OPTIONS;
         }
       break;
 
@@ -4738,6 +4949,7 @@ while (ptr < ptrend)
     if (top_nest != NULL && top_nest->nest_depth == nest_depth)
       {
       options = (options & ~PARSE_TRACKED_OPTIONS) | top_nest->options;
+      xoptions = (xoptions & ~PARSE_TRACKED_EXTRA_OPTIONS) | top_nest->xoptions;
       if ((top_nest->flags & NSF_RESET) != 0 &&
           top_nest->max_group > cb->bracount)
         cb->bracount = top_nest->max_group;
@@ -4780,12 +4992,12 @@ parsed_pattern = manage_callouts(ptr, &p
 /* Insert trailing items for word and line matching (features provided for the
 benefit of pcre2grep). */
 
-if ((extra_options & PCRE2_EXTRA_MATCH_LINE) != 0)
+if ((xoptions & PCRE2_EXTRA_MATCH_LINE) != 0)
   {
   *parsed_pattern++ = META_KET;
   *parsed_pattern++ = META_DOLLAR;
   }
-else if ((extra_options & PCRE2_EXTRA_MATCH_WORD) != 0)
+else if ((xoptions & PCRE2_EXTRA_MATCH_WORD) != 0)
   {
   *parsed_pattern++ = META_KET;
   *parsed_pattern++ = META_ESCAPE + ESC_b;
@@ -4862,6 +5074,8 @@ for (;;)
 
     case OP_WORD_BOUNDARY:
     case OP_NOT_WORD_BOUNDARY:
+    case OP_UCP_WORD_BOUNDARY:
+    case OP_NOT_UCP_WORD_BOUNDARY:
     if (!skipassert) return code;
     /* Fall through */
 
@@ -4913,7 +5127,8 @@ for (;;)
 *           Get othercase range                  *
 *************************************************/
 
-/* This function is passed the start and end of a class range in UCP mode. It
+/* This function is passed the start and end of a class range in UCP mode. For
+single characters the range may be just one character long. The function
 searches up the characters, looking for ranges of characters in the "other"
 case. Each call returns the next one, updating the start address. A character
 with multiple other cases is returned on its own with a special return value.
@@ -4923,31 +5138,44 @@ Arguments:
   d           end value
   ocptr       where to put start of othercase range
   odptr       where to put end of othercase range
+  restricted  TRUE if caseless restriction applies
 
 Yield:        -1 when no more
                0 when a range is returned
-              >0 the CASESET offset for char with multiple other cases
-                in this case, ocptr contains the original
+              >0 the CASESET offset for char with multiple other cases;
+                 for this return, *ocptr contains the original
 */
 
 static int
 get_othercase_range(uint32_t *cptr, uint32_t d, uint32_t *ocptr,
-  uint32_t *odptr)
+  uint32_t *odptr, BOOL restricted)
 {
 uint32_t c, othercase, next;
 unsigned int co;
 
 /* Find the first character that has an other case. If it has multiple other
-cases, return its case offset value. */
+cases, return its case offset value. When CASELESS_RESTRICT is set, ignore the
+multi-case entries that begin with ASCII values. In 32-bit mode, a value
+greater than the Unicode maximum ends the range. */
 
 for (c = *cptr; c <= d; c++)
   {
-  if ((co = UCD_CASESET(c)) != 0)
+#if PCRE2_CODE_UNIT_WIDTH == 32
+  if (c > MAX_UTF_CODE_POINT) return -1;
+#endif
+  if ((co = UCD_CASESET(c)) != 0 &&
+      (!restricted || PRIV(ucd_caseless_sets)[co] > 127))
     {
     *ocptr = c++;   /* Character that has the set */
     *cptr = c;      /* Rest of input range */
     return (int)co;
     }
+
+   /* This is not a valid multiple-case character. Check that the single other
+   case is different to the original. We don't need to check "restricted" here
+   because the non-ASCII characters with multiple cases that include an ASCII
+   character don't have a different "othercase". */
+
   if ((othercase = UCD_OTHERCASE(c)) != c) break;
   }
 
@@ -4988,7 +5216,8 @@ add_to_class().
 Arguments:
   classbits     the bit map for characters < 256
   uchardptr     points to the pointer for extra data
-  options       the options word
+  options       the options bits
+  xoptions      the extra options bits
   cb            compile data
   start         start of range character
   end           end of range character
@@ -4999,7 +5228,8 @@ Returns:        the number of < 256 char
 
 static unsigned int
 add_to_class_internal(uint8_t *classbits, PCRE2_UCHAR **uchardptr,
-  uint32_t options, compile_block *cb, uint32_t start, uint32_t end)
+  uint32_t options, uint32_t xoptions, compile_block *cb, uint32_t start,
+  uint32_t end)
 {
 uint32_t c;
 uint32_t classbits_end = (end <= 0xff ? end : 0xff);
@@ -5007,8 +5237,8 @@ unsigned int n8 = 0;
 
 /* If caseless matching is required, scan the range and process alternate
 cases. In Unicode, there are 8-bit characters that have alternate cases that
-are greater than 255 and vice-versa. Sometimes we can just extend the original
-range. */
+are greater than 255 and vice-versa (though these may be ignored if caseless
+restriction is in force). Sometimes we can just extend the original range. */
 
 if ((options & PCRE2_CASELESS) != 0)
   {
@@ -5021,20 +5251,23 @@ if ((options & PCRE2_CASELESS) != 0)
     options &= ~PCRE2_CASELESS;   /* Remove for recursive calls */
     c = start;
 
-    while ((rc = get_othercase_range(&c, end, &oc, &od)) >= 0)
+    while ((rc = get_othercase_range(&c, end, &oc, &od,
+             (xoptions & PCRE2_EXTRA_CASELESS_RESTRICT) != 0)) >= 0)
       {
       /* Handle a single character that has more than one other case. */
 
-      if (rc > 0) n8 += add_list_to_class_internal(classbits, uchardptr, options, cb,
-        PRIV(ucd_caseless_sets) + rc, oc);
+      if (rc > 0) n8 += add_list_to_class_internal(classbits, uchardptr,
+        options, xoptions, cb, PRIV(ucd_caseless_sets) + rc, oc);
 
       /* Do nothing if the other case range is within the original range. */
 
-      else if (oc >= cb->class_range_start && od <= cb->class_range_end) continue;
+      else if (oc >= cb->class_range_start && od <= cb->class_range_end)
+        continue;
 
-      /* Extend the original range if there is overlap, noting that if oc < c, we
-      can't have od > end because a subrange is always shorter than the basic
-      range. Otherwise, use a recursive call to add the additional range. */
+      /* Extend the original range if there is overlap, noting that if oc < c,
+      we can't have od > end because a subrange is always shorter than the
+      basic range. Otherwise, use a recursive call to add the additional range.
+      */
 
       else if (oc < start && od >= start - 1) start = oc; /* Extend downwards */
       else if (od > end && oc <= end + 1)
@@ -5042,10 +5275,13 @@ if ((options & PCRE2_CASELESS) != 0)
         end = od;       /* Extend upwards */
         if (end > classbits_end) classbits_end = (end <= 0xff ? end : 0xff);
         }
-      else n8 += add_to_class_internal(classbits, uchardptr, options, cb, oc, od);
+      else n8 += add_to_class_internal(classbits, uchardptr, options, xoptions,
+        cb, oc, od);
       }
     }
   else
+#else
+  (void)xoptions;   /* Avoid compiler warning */
 #endif  /* SUPPORT_UNICODE */
 
   /* Not UTF mode */
@@ -5141,7 +5377,8 @@ add_to_class_internal(), with which it i
 Arguments:
   classbits     the bit map for characters < 256
   uchardptr     points to the pointer for extra data
-  options       the options word
+  options       the options bits
+  xoptions      the extra options bits
   cb            contains pointers to tables etc.
   p             points to row of 32-bit values, terminated by NOTACHAR
   except        character to omit; this is used when adding lists of
@@ -5154,7 +5391,8 @@ Returns:        the number of < 256 char
 
 static unsigned int
 add_list_to_class_internal(uint8_t *classbits, PCRE2_UCHAR **uchardptr,
-  uint32_t options, compile_block *cb, const uint32_t *p, unsigned int except)
+  uint32_t options, uint32_t xoptions, compile_block *cb, const uint32_t *p,
+  unsigned int except)
 {
 unsigned int n8 = 0;
 while (p[0] < NOTACHAR)
@@ -5163,7 +5401,8 @@ while (p[0] < NOTACHAR)
   if (p[0] != except)
     {
     while(p[n+1] == p[0] + n + 1) n++;
-    n8 += add_to_class_internal(classbits, uchardptr, options, cb, p[0], p[n]);
+    n8 += add_to_class_internal(classbits, uchardptr, options, xoptions, cb,
+      p[0], p[n]);
     }
   p += n + 1;
   }
@@ -5183,7 +5422,8 @@ to avoid duplication when handling case-
 Arguments:
   classbits     the bit map for characters < 256
   uchardptr     points to the pointer for extra data
-  options       the options word
+  options       the options bits
+  xoptions      the extra options bits
   cb            compile data
   start         start of range character
   end           end of range character
@@ -5194,11 +5434,12 @@ Returns:        the number of < 256 char
 
 static unsigned int
 add_to_class(uint8_t *classbits, PCRE2_UCHAR **uchardptr, uint32_t options,
-  compile_block *cb, uint32_t start, uint32_t end)
+  uint32_t xoptions, compile_block *cb, uint32_t start, uint32_t end)
 {
 cb->class_range_start = start;
 cb->class_range_end = end;
-return add_to_class_internal(classbits, uchardptr, options, cb, start, end);
+return add_to_class_internal(classbits, uchardptr, options, xoptions, cb,
+  start, end);
 }
 
 
@@ -5215,7 +5456,8 @@ case-independence.
 Arguments:
   classbits     the bit map for characters < 256
   uchardptr     points to the pointer for extra data
-  options       the options word
+  options       the options bits
+  xoptions      the extra options bits
   cb            contains pointers to tables etc.
   p             points to row of 32-bit values, terminated by NOTACHAR
   except        character to omit; this is used when adding lists of
@@ -5228,7 +5470,7 @@ Returns:        the number of < 256 char
 
 static unsigned int
 add_list_to_class(uint8_t *classbits, PCRE2_UCHAR **uchardptr, uint32_t options,
-  compile_block *cb, const uint32_t *p, unsigned int except)
+  uint32_t xoptions, compile_block *cb, const uint32_t *p, unsigned int except)
 {
 unsigned int n8 = 0;
 while (p[0] < NOTACHAR)
@@ -5239,7 +5481,8 @@ while (p[0] < NOTACHAR)
     while(p[n+1] == p[0] + n + 1) n++;
     cb->class_range_start = p[0];
     cb->class_range_end = p[n];
-    n8 += add_to_class_internal(classbits, uchardptr, options, cb, p[0], p[n]);
+    n8 += add_to_class_internal(classbits, uchardptr, options, xoptions, cb,
+      p[0], p[n]);
     }
   p += n + 1;
   }
@@ -5258,7 +5501,8 @@ vertical whitespace to a class. The list
 Arguments:
   classbits     the bit map for characters < 256
   uchardptr     points to the pointer for extra data
-  options       the options word
+  options       the options bits
+  xoptions      the extra options bits
   cb            contains pointers to tables etc.
   p             points to row of 32-bit values, terminated by NOTACHAR
 
@@ -5268,16 +5512,16 @@ Returns:        the number of < 256 char
 
 static unsigned int
 add_not_list_to_class(uint8_t *classbits, PCRE2_UCHAR **uchardptr,
-  uint32_t options, compile_block *cb, const uint32_t *p)
+  uint32_t options, uint32_t xoptions, compile_block *cb, const uint32_t *p)
 {
 BOOL utf = (options & PCRE2_UTF) != 0;
 unsigned int n8 = 0;
 if (p[0] > 0)
-  n8 += add_to_class(classbits, uchardptr, options, cb, 0, p[0] - 1);
+  n8 += add_to_class(classbits, uchardptr, options, xoptions, cb, 0, p[0] - 1);
 while (p[0] < NOTACHAR)
   {
   while (p[1] == p[0] + 1) p++;
-  n8 += add_to_class(classbits, uchardptr, options, cb, p[0] + 1,
+  n8 += add_to_class(classbits, uchardptr, options, xoptions, cb, p[0] + 1,
     (p[1] == NOTACHAR) ? (utf ? 0x10ffffu : 0xffffffffu) : p[1] - 1);
   p++;
   }
@@ -5368,6 +5612,7 @@ real compile phase. The value of lengthp
 
 Arguments:
   optionsptr        pointer to the option bits
+  xoptionsptr       pointer to the extra option bits
   codeptr           points to the pointer to the current code point
   pptrptr           points to the current parsed pattern pointer
   errorcodeptr      points to error code variable
@@ -5376,6 +5621,7 @@ Arguments:
   reqcuptr          place to put the last required code unit
   reqcuflagsptr     place to put the last required code unit flags
   bcptr             points to current branch chain
+  open_caps         points to current capitem
   cb                contains pointers to tables etc.
   lengthptr         NULL during the real compile phase
                     points to length accumulator during pre-compile phase
@@ -5386,9 +5632,10 @@ Returns:            0 There's been an er
 */
 
 static int
-compile_branch(uint32_t *optionsptr, PCRE2_UCHAR **codeptr, uint32_t **pptrptr,
-  int *errorcodeptr, uint32_t *firstcuptr, uint32_t *firstcuflagsptr,
-  uint32_t *reqcuptr, uint32_t *reqcuflagsptr, branch_chain *bcptr,
+compile_branch(uint32_t *optionsptr, uint32_t *xoptionsptr,
+  PCRE2_UCHAR **codeptr, uint32_t **pptrptr, int *errorcodeptr,
+  uint32_t *firstcuptr, uint32_t *firstcuflagsptr, uint32_t *reqcuptr,
+  uint32_t *reqcuflagsptr, branch_chain *bcptr, open_capitem *open_caps,
   compile_block *cb, PCRE2_SIZE *lengthptr)
 {
 int bravalue = 0;
@@ -5398,6 +5645,7 @@ uint32_t repeat_min = 0, repeat_max = 0;
 uint32_t greedy_default, greedy_non_default;
 uint32_t repeat_type, op_type;
 uint32_t options = *optionsptr;               /* May change dynamically */
+uint32_t xoptions = *xoptionsptr;             /* May change dynamically */
 uint32_t firstcu, reqcu;
 uint32_t zeroreqcu, zerofirstcu;
 uint32_t escape;
@@ -5423,8 +5671,8 @@ const uint8_t *cbits = cb->cbits;
 uint8_t classbits[32];
 
 /* We can fish out the UTF setting once and for all into a BOOL, but we must
-not do this for other options (e.g. PCRE2_EXTENDED) because they may change
-dynamically as we process the pattern. */
+not do this for other options (e.g. PCRE2_EXTENDED) that may change dynamically
+as we process the pattern. */
 
 #ifdef SUPPORT_UNICODE
 BOOL utf = (options & PCRE2_UTF) != 0;
@@ -5633,8 +5881,8 @@ for (;; pptr++)
 
     If the class contains characters outside the 0-255 range, a different
     opcode is compiled. It may optionally have a bit map for characters < 256,
-    but those above are are explicitly listed afterwards. A flag code unit
-    tells whether the bitmap is present, and whether this is a negated class or
+    but those above are explicitly listed afterwards. A flag code unit tells
+    whether the bitmap is present, and whether this is a negated class or
     not. */
 
     case META_CLASS_NOT:
@@ -5675,11 +5923,14 @@ for (;; pptr++)
 
       /* For caseless UTF or UCP mode, check whether this character has more
       than one other case. If so, generate a special OP_NOTPROP item instead of
-      OP_NOTI. */
+      OP_NOTI. When restricted by PCRE2_EXTRA_CASELESS_RESTRICT, ignore any
+      caseless set that starts with an ASCII character. */
 
 #ifdef SUPPORT_UNICODE
       if ((utf||ucp) && (options & PCRE2_CASELESS) != 0 &&
-          (d = UCD_CASESET(c)) != 0)
+          (d = UCD_CASESET(c)) != 0 &&
+          ((xoptions & PCRE2_EXTRA_CASELESS_RESTRICT) == 0 ||
+          PRIV(ucd_caseless_sets)[d] > 127))
         {
         *code++ = OP_NOTPROP;
         *code++ = PT_CLIST;
@@ -5687,7 +5938,7 @@ for (;; pptr++)
         break;   /* We are finished with this class */
         }
 #endif
-      /* Char has only one other case, or UCP not available */
+      /* Char has only one other (usable) case, or UCP not available */
 
       *code++ = ((options & PCRE2_CASELESS) != 0)? OP_NOTI: OP_NOT;
       code += PUTCHAR(c, code);
@@ -5697,7 +5948,9 @@ for (;; pptr++)
     /* Handle character classes that contain more than just one literal
     character. If there are exactly two characters in a positive class, see if
     they are case partners. This can be optimized to generate a caseless single
-    character match (which also sets first/required code units if relevant). */
+    character match (which also sets first/required code units if relevant).
+    When casing restrictions apply, ignore a caseless set if both characters
+    are ASCII. */
 
     if (meta == META_CLASS && pptr[1] < META_END && pptr[2] < META_END &&
         pptr[3] == META_CLASS_END)
@@ -5705,7 +5958,9 @@ for (;; pptr++)
       uint32_t c = pptr[1];
 
 #ifdef SUPPORT_UNICODE
-      if (UCD_CASESET(c) == 0)
+      if (UCD_CASESET(c) == 0 ||
+         ((xoptions & PCRE2_EXTRA_CASELESS_RESTRICT) != 0 &&
+         c < 128 && pptr[2] < 128))
 #endif
         {
         uint32_t d;
@@ -5797,41 +6052,45 @@ for (;; pptr++)
         XCL_PROP/XCL_NOTPROP directly, which is done here. */
 
 #ifdef SUPPORT_UNICODE
-        if ((options & PCRE2_UCP) != 0) switch(posix_class)
+        if ((options & PCRE2_UCP) != 0 &&
+            (xoptions & PCRE2_EXTRA_ASCII_POSIX) == 0)
           {
-          case PC_GRAPH:
-          case PC_PRINT:
-          case PC_PUNCT:
-          *class_uchardata++ = local_negate? XCL_NOTPROP : XCL_PROP;
-          *class_uchardata++ = (PCRE2_UCHAR)
-            ((posix_class == PC_GRAPH)? PT_PXGRAPH :
-             (posix_class == PC_PRINT)? PT_PXPRINT : PT_PXPUNCT);
-          *class_uchardata++ = 0;
-          xclass_has_prop = TRUE;
-          goto CONTINUE_CLASS;
-
-          /* For the other POSIX classes (ascii, xdigit) we are going to
-          fall through to the non-UCP case and build a bit map for
-          characters with code points less than 256. However, if we are in
-          a negated POSIX class, characters with code points greater than
-          255 must either all match or all not match, depending on whether
-          the whole class is not or is negated. For example, for
-          [[:^ascii:]... they must all match, whereas for [^[:^xdigit:]...
-          they must not.
-
-          In the special case where there are no xclass items, this is
-          automatically handled by the use of OP_CLASS or OP_NCLASS, but an
-          explicit range is needed for OP_XCLASS. Setting a flag here
-          causes the range to be generated later when it is known that
-          OP_XCLASS is required. In the 8-bit library this is relevant only in
-          utf mode, since no wide characters can exist otherwise. */
+          switch(posix_class)
+            {
+            case PC_GRAPH:
+            case PC_PRINT:
+            case PC_PUNCT:
+            *class_uchardata++ = local_negate? XCL_NOTPROP : XCL_PROP;
+            *class_uchardata++ = (PCRE2_UCHAR)
+              ((posix_class == PC_GRAPH)? PT_PXGRAPH :
+               (posix_class == PC_PRINT)? PT_PXPRINT : PT_PXPUNCT);
+            *class_uchardata++ = 0;
+            xclass_has_prop = TRUE;
+            goto CONTINUE_CLASS;
 
-          default:
+            /* For the other POSIX classes (ex: ascii) we are going to
+            fall through to the non-UCP case and build a bit map for
+            characters with code points less than 256. However, if we are in
+            a negated POSIX class, characters with code points greater than
+            255 must either all match or all not match, depending on whether
+            the whole class is not or is negated. For example, for
+            [[:^ascii:]... they must all match, whereas for [^[:^ascii:]...
+            they must not.
+
+            In the special case where there are no xclass items, this is
+            automatically handled by the use of OP_CLASS or OP_NCLASS, but an
+            explicit range is needed for OP_XCLASS. Setting a flag here
+            causes the range to be generated later when it is known that
+            OP_XCLASS is required. In the 8-bit library this is relevant only in
+            utf mode, since no wide characters can exist otherwise. */
+
+            default:
 #if PCRE2_CODE_UNIT_WIDTH == 8
-          if (utf)
+            if (utf)
 #endif
-          match_all_or_no_wide_chars |= local_negate;
-          break;
+            match_all_or_no_wide_chars |= local_negate;
+            break;
+            }
           }
 #endif  /* SUPPORT_UNICODE */
 
@@ -5957,22 +6216,24 @@ for (;; pptr++)
 
           case ESC_h:
           (void)add_list_to_class(classbits, &class_uchardata,
-            options & ~PCRE2_CASELESS, cb, PRIV(hspace_list), NOTACHAR);
+            options & ~PCRE2_CASELESS, xoptions, cb, PRIV(hspace_list),
+              NOTACHAR);
           break;
 
           case ESC_H:
           (void)add_not_list_to_class(classbits, &class_uchardata,
-            options & ~PCRE2_CASELESS, cb, PRIV(hspace_list));
+            options & ~PCRE2_CASELESS, xoptions, cb, PRIV(hspace_list));
           break;
 
           case ESC_v:
           (void)add_list_to_class(classbits, &class_uchardata,
-            options & ~PCRE2_CASELESS, cb, PRIV(vspace_list), NOTACHAR);
+            options & ~PCRE2_CASELESS, xoptions, cb, PRIV(vspace_list),
+              NOTACHAR);
           break;
 
           case ESC_V:
           (void)add_not_list_to_class(classbits, &class_uchardata,
-            options & ~PCRE2_CASELESS, cb, PRIV(vspace_list));
+            options & ~PCRE2_CASELESS, xoptions, cb, PRIV(vspace_list));
           break;
 
           /* If Unicode is not supported, \P and \p are not allowed and are
@@ -6046,32 +6307,32 @@ for (;; pptr++)
             if (C <= CHAR_i)
               {
               class_has_8bitchar +=
-                add_to_class(classbits, &class_uchardata, options, cb, C + uc,
-                  ((D < CHAR_i)? D : CHAR_i) + uc);
+                add_to_class(classbits, &class_uchardata, options, xoptions,
+                  cb, C + uc, ((D < CHAR_i)? D : CHAR_i) + uc);
               C = CHAR_j;
               }
 
             if (C <= D && C <= CHAR_r)
               {
               class_has_8bitchar +=
-                add_to_class(classbits, &class_uchardata, options, cb, C + uc,
-                  ((D < CHAR_r)? D : CHAR_r) + uc);
+                add_to_class(classbits, &class_uchardata, options, xoptions,
+                  cb, C + uc, ((D < CHAR_r)? D : CHAR_r) + uc);
               C = CHAR_s;
               }
 
             if (C <= D)
               {
               class_has_8bitchar +=
-                add_to_class(classbits, &class_uchardata, options, cb, C + uc,
-                  D + uc);
+                add_to_class(classbits, &class_uchardata, options, xoptions,
+                  cb, C + uc, D + uc);
               }
             }
           else
 #endif
           /* Not an EBCDIC special range */
 
-          class_has_8bitchar +=
-            add_to_class(classbits, &class_uchardata, options, cb, c, d);
+          class_has_8bitchar += add_to_class(classbits, &class_uchardata,
+            options, xoptions, cb, c, d);
           goto CONTINUE_CLASS;   /* Go get the next char in the class */
           }  /* End of range handling */
 
@@ -6079,7 +6340,8 @@ for (;; pptr++)
         /* Handle a single character. */
 
         class_has_8bitchar +=
-          add_to_class(classbits, &class_uchardata, options, cb, meta, meta);
+          add_to_class(classbits, &class_uchardata, options, xoptions, cb,
+            meta, meta);
         }
 
       /* Continue to the next item in the class. */
@@ -6124,11 +6386,11 @@ for (;; pptr++)
     characters > 255 are in or not in the class, so any that were explicitly
     given as well can be ignored.
 
-    In the UCP case, if certain negated POSIX classes ([:^ascii:] or
-    [^:xdigit:]) were present in a class, we either have to match or not match
-    all wide characters (depending on whether the whole class is or is not
-    negated). This requirement is indicated by match_all_or_no_wide_chars being
-    true. We do this by including an explicit range, which works in both cases.
+    In the UCP case, if certain negated POSIX classes (ex: [:^ascii:]) were
+    were present in a class, we either have to match or not match all wide
+    characters (depending on whether the whole class is or is not negated).
+    This requirement is indicated by match_all_or_no_wide_chars being true.
+    We do this by including an explicit range, which works in both cases.
     This applies only in UTF and 16-bit and 32-bit non-UTF modes, since there
     cannot be any wide characters in 8-bit non-UTF mode.
 
@@ -6232,7 +6494,7 @@ for (;; pptr++)
 
     case META_ACCEPT:
     cb->had_accept = had_accept = TRUE;
-    for (oc = cb->open_caps;
+    for (oc = open_caps;
          oc != NULL && oc->assert_depth >= cb->assert_depth;
          oc = oc->next)
       {
@@ -6317,6 +6579,7 @@ for (;; pptr++)
 
     case META_OPTIONS:
     *optionsptr = options = *(++pptr);
+    *xoptionsptr = xoptions = *(++pptr);
     greedy_default = ((options & PCRE2_UNGREEDY) != 0);
     greedy_non_default = greedy_default ^ 1;
     req_caseopt = ((options & PCRE2_CASELESS) != 0)? REQ_CASELESS : 0;
@@ -6562,7 +6825,8 @@ for (;; pptr++)
 
     if ((group_return =
          compile_regex(
-         options,                         /* The option state */
+         options,                         /* The options state */
+         xoptions,                        /* The extra options state */
          &tempcode,                       /* Where to put code (updated) */
          &pptr,                           /* Input pointer (updated) */
          errorcodeptr,                    /* Where to put an error message */
@@ -6572,6 +6836,7 @@ for (;; pptr++)
          &subreqcu,                       /* For possible last char */
          &subreqcuflags,
          bcptr,                           /* Current branch chain */
+         open_caps,                       /* Pointer to capture stack */
          cb,                              /* Compile data block */
          (lengthptr == NULL)? NULL :      /* Actual compile phase */
            &length_prevgroup              /* Pre-compile phase */
@@ -7112,15 +7377,12 @@ for (;; pptr++)
 
         /* In the pre-compile phase, we don't actually do the replication. We
         just adjust the length as if we had. Do some paranoid checks for
-        potential integer overflow. The INT64_OR_DOUBLE type is a 64-bit
-        integer type when available, otherwise double. */
+        potential integer overflow. */
 
         if (lengthptr != NULL)
           {
-          PCRE2_SIZE delta = replicate*(1 + LINK_SIZE);
-          if ((INT64_OR_DOUBLE)replicate*
-                (INT64_OR_DOUBLE)(1 + LINK_SIZE) >
-                  (INT64_OR_DOUBLE)INT_MAX ||
+          PCRE2_SIZE delta;
+          if (PRIV(ckd_smul)(&delta, replicate, 1 + LINK_SIZE) ||
               OFLOW_MAX - *lengthptr < delta)
             {
             *errorcodeptr = ERR20;
@@ -7282,15 +7544,12 @@ for (;; pptr++)
             {
             /* In the pre-compile phase, we don't actually do the replication.
             We just adjust the length as if we had. Do some paranoid checks for
-            potential integer overflow. The INT64_OR_DOUBLE type is a 64-bit
-            integer type when available, otherwise double. */
+            potential integer overflow. */
 
             if (lengthptr != NULL)
               {
-              PCRE2_SIZE delta = (repeat_min - 1)*length_prevgroup;
-              if ((INT64_OR_DOUBLE)(repeat_min - 1)*
-                    (INT64_OR_DOUBLE)length_prevgroup >
-                      (INT64_OR_DOUBLE)INT_MAX ||
+              PCRE2_SIZE delta;
+              if (PRIV(ckd_smul)(&delta, repeat_min - 1, length_prevgroup) ||
                   OFLOW_MAX - *lengthptr < delta)
                 {
                 *errorcodeptr = ERR20;
@@ -7334,21 +7593,19 @@ for (;; pptr++)
           just adjust the length as if we had. For each repetition we must add
           1 to the length for BRAZERO and for all but the last repetition we
           must add 2 + 2*LINKSIZE to allow for the nesting that occurs. Do some
-          paranoid checks to avoid integer overflow. The INT64_OR_DOUBLE type
-          is a 64-bit integer type when available, otherwise double. */
+          paranoid checks to avoid integer overflow. */
 
           if (lengthptr != NULL && repeat_max > 0)
             {
-            PCRE2_SIZE delta = repeat_max*(length_prevgroup + 1 + 2 + 2*LINK_SIZE) -
-                        2 - 2*LINK_SIZE;   /* Last one doesn't nest */
-            if ((INT64_OR_DOUBLE)repeat_max *
-                  (INT64_OR_DOUBLE)(length_prevgroup + 1 + 2 + 2*LINK_SIZE)
-                    > (INT64_OR_DOUBLE)INT_MAX ||
-                OFLOW_MAX - *lengthptr < delta)
+            PCRE2_SIZE delta;
+            if (PRIV(ckd_smul)(&delta, repeat_max,
+                               length_prevgroup + 1 + 2 + 2*LINK_SIZE) ||
+                OFLOW_MAX + (2 + 2*LINK_SIZE) - *lengthptr < delta)
               {
               *errorcodeptr = ERR20;
               return 0;
               }
+            delta -= (2 + 2*LINK_SIZE);   /* Last one doesn't nest */
             *lengthptr += delta;
             }
 
@@ -7901,7 +8158,7 @@ for (;; pptr++)
     done. However, there's an option, in case anyone was relying on it. */
 
     if (cb->assert_depth > 0 && meta_arg == ESC_K &&
-        (cb->cx->extra_options & PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK) == 0)
+        (xoptions & PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK) == 0)
       {
       *errorcodeptr = ERR99;
       return 0;
@@ -7909,23 +8166,41 @@ for (;; pptr++)
 
     /* For the rest (including \X when Unicode is supported - if not it's
     faulted at parse time), the OP value is the escape value when PCRE2_UCP is
-    not set; if it is set, these escapes do not show up here because they are
-    converted into Unicode property tests in parse_regex(). Note that \b and \B
-    do a one-character lookbehind, and \A also behaves as if it does. */
-
-    if (meta_arg == ESC_C) cb->external_flags |= PCRE2_HASBKC; /* Record */
-    if ((meta_arg == ESC_b || meta_arg == ESC_B || meta_arg == ESC_A) &&
-         cb->max_lookbehind == 0)
-      cb->max_lookbehind = 1;
+    not set; if it is set, most of them do not show up here because they are
+    converted into Unicode property tests in parse_regex().
+
+    In non-UTF mode, and for both 32-bit modes, we turn \C into OP_ALLANY
+    instead of OP_ANYBYTE so that it works in DFA mode and in lookbehinds.
+    There are special UCP codes for \B and \b which are used in UCP mode unless
+    "word" matching is being forced to ASCII.
 
-    /* In non-UTF mode, and for both 32-bit modes, we turn \C into OP_ALLANY
-    instead of OP_ANYBYTE so that it works in DFA mode and in lookbehinds. */
+    Note that \b and \B do a one-character lookbehind, and \A also behaves as
+    if it does. */
 
+    switch(meta_arg)
+      {
+      case ESC_C:
+      cb->external_flags |= PCRE2_HASBKC;  /* Record */
 #if PCRE2_CODE_UNIT_WIDTH == 32
-    *code++ = (meta_arg == ESC_C)? OP_ALLANY : meta_arg;
+      meta_arg = OP_ALLANY;
 #else
-    *code++ = (!utf && meta_arg == ESC_C)? OP_ALLANY : meta_arg;
+      if (!utf) meta_arg = OP_ALLANY;
 #endif
+      break;
+
+      case ESC_B:
+      case ESC_b:
+      if ((options & PCRE2_UCP) != 0 && (xoptions & PCRE2_EXTRA_ASCII_BSW) == 0)
+        meta_arg = (meta_arg == ESC_B)? OP_NOT_UCP_WORD_BOUNDARY :
+          OP_UCP_WORD_BOUNDARY;
+      /* Fall through */
+
+      case ESC_A:
+      if (cb->max_lookbehind == 0) cb->max_lookbehind = 1;
+      break;
+      }
+
+    *code++ = meta_arg;
     break;  /* End META_ESCAPE */
 
 
@@ -7953,13 +8228,16 @@ for (;; pptr++)
 
     /* For caseless UTF or UCP mode, check whether this character has more than
     one other case. If so, generate a special OP_PROP item instead of OP_CHARI.
-    */
+    When casing restrictions apply, ignore caseless sets that start with an
+    ASCII character. */
 
 #ifdef SUPPORT_UNICODE
     if ((utf||ucp) && (options & PCRE2_CASELESS) != 0)
       {
       uint32_t caseset = UCD_CASESET(meta);
-      if (caseset != 0)
+      if (caseset != 0 &&
+           ((xoptions & PCRE2_EXTRA_CASELESS_RESTRICT) == 0 ||
+           PRIV(ucd_caseless_sets)[caseset] > 127))
         {
         *code++ = OP_PROP;
         *code++ = PT_CLIST;
@@ -8075,6 +8353,7 @@ the two phases.
 
 Arguments:
   options           option bits, including any changes for this subpattern
+  xoptions          extra option bits, ditto
   codeptr           -> the address of the current code pointer
   pptrptr           -> the address of the current parsed pattern pointer
   errorcodeptr      -> pointer to error code variable
@@ -8094,10 +8373,11 @@ Returns:            0 There has been an
 */
 
 static int
-compile_regex(uint32_t options, PCRE2_UCHAR **codeptr, uint32_t **pptrptr,
-  int *errorcodeptr, uint32_t skipunits, uint32_t *firstcuptr,
-  uint32_t *firstcuflagsptr, uint32_t *reqcuptr, uint32_t *reqcuflagsptr,
-  branch_chain *bcptr, compile_block *cb, PCRE2_SIZE *lengthptr)
+compile_regex(uint32_t options, uint32_t xoptions, PCRE2_UCHAR **codeptr,
+  uint32_t **pptrptr, int *errorcodeptr, uint32_t skipunits,
+  uint32_t *firstcuptr, uint32_t *firstcuflagsptr, uint32_t *reqcuptr,
+  uint32_t *reqcuflagsptr, branch_chain *bcptr, open_capitem *open_caps,
+  compile_block *cb, PCRE2_SIZE *lengthptr)
 {
 PCRE2_UCHAR *code = *codeptr;
 PCRE2_UCHAR *last_branch = code;
@@ -8109,6 +8389,7 @@ int okreturn = 1;
 uint32_t *pptr = *pptrptr;
 uint32_t firstcu, reqcu;
 uint32_t lookbehindlength;
+uint32_t lookbehindminlength;
 uint32_t firstcuflags, reqcuflags;
 uint32_t branchfirstcu, branchreqcu;
 uint32_t branchfirstcuflags, branchreqcuflags;
@@ -8151,9 +8432,10 @@ lookbehind = *code == OP_ASSERTBACK ||
 if (lookbehind)
   {
   lookbehindlength = META_DATA(pptr[-1]);
+  lookbehindminlength = *pptr;
   pptr += SIZEOFFSET;
   }
-else lookbehindlength = 0;
+else lookbehindlength = lookbehindminlength = 0;
 
 /* If this is a capturing subpattern, add to the chain of open capturing items
 so that we can detect them if (*ACCEPT) is encountered. Note that only OP_CBRA
@@ -8164,9 +8446,9 @@ if (*code == OP_CBRA)
   {
   capnumber = GET2(code, 1 + LINK_SIZE);
   capitem.number = capnumber;
-  capitem.next = cb->open_caps;
+  capitem.next = open_caps;
   capitem.assert_depth = cb->assert_depth;
-  cb->open_caps = &capitem;
+  open_caps = &capitem;
   }
 
 /* Offset is set zero to mark that this bracket is still open */
@@ -8180,22 +8462,39 @@ for (;;)
   {
   int branch_return;
 
-  /* Insert OP_REVERSE if this is as lookbehind assertion. */
+  /* Insert OP_REVERSE or OP_VREVERSE if this is a lookbehind assertion. There
+  is only a single mimimum length for the whole assertion. When the mimimum
+  length is LOOKBEHIND_MAX it means that all branches are of fixed length,
+  though not necessarily the same length. In this case, the original OP_REVERSE
+  can be used. It can also be used if a branch in a variable length lookbehind
+  has the same maximum and minimum. Otherwise, use OP_VREVERSE, which has both
+  maximum and minimum values. */
 
   if (lookbehind && lookbehindlength > 0)
     {
-    *code++ = OP_REVERSE;
-    PUTINC(code, 0, lookbehindlength);
-    length += 1 + LINK_SIZE;
+    if (lookbehindminlength == LOOKBEHIND_MAX ||
+        lookbehindminlength == lookbehindlength)
+      {
+      *code++ = OP_REVERSE;
+      PUT2INC(code, 0, lookbehindlength);
+      length += 1 + IMM2_SIZE;
+      }
+    else
+      {
+      *code++ = OP_VREVERSE;
+      PUT2INC(code, 0, lookbehindminlength);
+      PUT2INC(code, 0, lookbehindlength);
+      length += 1 + 2*IMM2_SIZE;
+      }
     }
 
   /* Now compile the branch; in the pre-compile phase its length gets added
   into the length. */
 
   if ((branch_return =
-        compile_branch(&options, &code, &pptr, errorcodeptr, &branchfirstcu,
-          &branchfirstcuflags, &branchreqcu, &branchreqcuflags, &bc,
-          cb, (lengthptr == NULL)? NULL : &length)) == 0)
+        compile_branch(&options, &xoptions, &code, &pptr, errorcodeptr,
+          &branchfirstcu, &branchfirstcuflags, &branchreqcu, &branchreqcuflags,
+          &bc, open_caps, cb, (lengthptr == NULL)? NULL : &length)) == 0)
     return 0;
 
   /* If a branch can match an empty string, so can the whole group. */
@@ -8293,10 +8592,6 @@ for (;;)
     PUT(code, 1, (int)(code - start_bracket));
     code += 1 + LINK_SIZE;
 
-    /* If it was a capturing subpattern, remove the block from the chain. */
-
-    if (capnumber > 0) cb->open_caps = cb->open_caps->next;
-
     /* Set values to pass back */
 
     *codeptr = code;
@@ -8339,8 +8634,8 @@ for (;;)
     code += 1 + LINK_SIZE;
     }
 
-  /* Set the lookbehind length (if not in a lookbehind the value will be zero)
-  and then advance past the vertical bar. */
+  /* Set the maximum lookbehind length for the next branch (if not in a
+  lookbehind the value will be zero) and then advance past the vertical bar. */
 
   lookbehindlength = META_DATA(*pptr);
   pptr++;
@@ -9051,13 +9346,13 @@ return pptr;
 *************************************************/
 
 /* This is called for nested groups within a branch of a lookbehind whose
-length is being computed. If all the branches in the nested group have the same
-length, that is OK. On entry, the pointer must be at the first element after
-the group initializing code. On exit it points to OP_KET. Caching is used to
-improve processing speed when the same capturing group occurs many times.
+length is being computed. On entry, the pointer must be at the first element
+after the group initializing code. On exit it points to OP_KET. Caching is used
+to improve processing speed when the same capturing group occurs many times.
 
 Arguments:
   pptrptr     pointer to pointer in the parsed pattern
+  minptr      where to return the minimum length
   isinline    FALSE if a reference or recursion; TRUE for inline group
   errcodeptr  pointer to the errorcode
   lcptr       pointer to the loop counter
@@ -9065,15 +9360,17 @@ Arguments:
   recurses    chain of recurse_check to catch mutual recursion
   cb          pointer to the compile data
 
-Returns:      the group length or a negative number
+Returns:      the maximum group length or a negative number
 */
 
 static int
-get_grouplength(uint32_t **pptrptr, BOOL isinline, int *errcodeptr, int *lcptr,
-   int group, parsed_recurse_check *recurses, compile_block *cb)
+get_grouplength(uint32_t **pptrptr, int *minptr, BOOL isinline, int *errcodeptr,
+  int *lcptr, int group, parsed_recurse_check *recurses, compile_block *cb)
 {
-int branchlength;
+uint32_t *gi = cb->groupinfo + 2 * group;
+int branchlength, branchminlength;
 int grouplength = -1;
+int groupminlength = INT_MAX;
 
 /* The cache can be used only if there is no possibility of there being two
 groups with the same number. We do not need to set the end pointer for a group
@@ -9082,11 +9379,12 @@ an inline group. */
 
 if (group > 0 && (cb->external_flags & PCRE2_DUPCAPUSED) == 0)
   {
-  uint32_t groupinfo = cb->groupinfo[group];
+  uint32_t groupinfo = gi[0];
   if ((groupinfo & GI_NOT_FIXED_LENGTH) != 0) return -1;
   if ((groupinfo & GI_SET_FIXED_LENGTH) != 0)
     {
     if (isinline) *pptrptr = parsed_skip(*pptrptr, PSKIP_KET);
+    *minptr = gi[1];
     return groupinfo & GI_FIXED_LENGTH_MASK;
     }
   }
@@ -9095,20 +9393,26 @@ if (group > 0 && (cb->external_flags & P
 
 for(;;)
   {
-  branchlength = get_branchlength(pptrptr, errcodeptr, lcptr, recurses, cb);
+  branchlength = get_branchlength(pptrptr, &branchminlength, errcodeptr, lcptr,
+    recurses, cb);
   if (branchlength < 0) goto ISNOTFIXED;
-  if (grouplength == -1) grouplength = branchlength;
-    else if (grouplength != branchlength) goto ISNOTFIXED;
+  if (branchlength > grouplength) grouplength = branchlength;
+  if (branchminlength < groupminlength) groupminlength = branchminlength;
   if (**pptrptr == META_KET) break;
   *pptrptr += 1;   /* Skip META_ALT */
   }
 
 if (group > 0)
-  cb->groupinfo[group] |= (uint32_t)(GI_SET_FIXED_LENGTH | grouplength);
+  {
+  gi[0] |= (uint32_t)(GI_SET_FIXED_LENGTH | grouplength);
+  gi[1] = groupminlength;
+  }
+
+*minptr = groupminlength;
 return grouplength;
 
 ISNOTFIXED:
-if (group > 0) cb->groupinfo[group] |= GI_NOT_FIXED_LENGTH;
+if (group > 0) gi[0] |= GI_NOT_FIXED_LENGTH;
 return -1;
 }
 
@@ -9118,27 +9422,30 @@ return -1;
 *        Find length of a parsed branch          *
 *************************************************/
 
-/* Return a fixed length for a branch in a lookbehind, giving an error if the
-length is not fixed. On entry, *pptrptr points to the first element inside the
-branch. On exit it is set to point to the ALT or KET.
+/* Return fixed maximum and minimum lengths for a branch in a lookbehind,
+giving an error if the length is not limited. On entry, *pptrptr points to the
+first element inside the branch. On exit it is set to point to the ALT or KET.
 
 Arguments:
   pptrptr     pointer to pointer in the parsed pattern
+  minptr      where to return the minimum length
   errcodeptr  pointer to error code
   lcptr       pointer to loop counter
   recurses    chain of recurse_check to catch mutual recursion
   cb          pointer to compile block
 
-Returns:      the length, or a negative value on error
+Returns:      the maximum length, or a negative value on error
 */
 
 static int
-get_branchlength(uint32_t **pptrptr, int *errcodeptr, int *lcptr,
+get_branchlength(uint32_t **pptrptr, int *minptr, int *errcodeptr, int *lcptr,
   parsed_recurse_check *recurses, compile_block *cb)
 {
 int branchlength = 0;
-int grouplength;
+int branchminlength = 0;
+int grouplength, groupminlength;
 uint32_t lastitemlength = 0;
+uint32_t lastitemminlength = 0;
 uint32_t *pptr = *pptrptr;
 PCRE2_SIZE offset;
 parsed_recurse_check this_recurse;
@@ -9162,10 +9469,12 @@ for (;; pptr++)
   uint32_t escape;
   uint32_t group = 0;
   uint32_t itemlength = 0;
+  uint32_t itemminlength = 0;
+  uint32_t min, max;
 
   if (*pptr < META_END)
     {
-    itemlength = 1;
+    itemlength = itemminlength = 1;
     }
 
   else switch (META_CODE(*pptr))
@@ -9200,24 +9509,24 @@ for (;; pptr++)
     break;
 
     case META_OPTIONS:
-    pptr += 1;
+    pptr += 2;
     break;
 
     case META_BIGVALUE:
-    itemlength = 1;
+    itemlength = itemminlength = 1;
     pptr += 1;
     break;
 
     case META_CLASS:
     case META_CLASS_NOT:
-    itemlength = 1;
+    itemlength = itemminlength = 1;
     pptr = parsed_skip(pptr, PSKIP_CLASS);
     if (pptr == NULL) goto PARSED_SKIP_FAILED;
     break;
 
     case META_CLASS_EMPTY_NOT:
     case META_DOT:
-    itemlength = 1;
+    itemlength = itemminlength = 1;
     break;
 
     case META_CALLOUT_NUMBER:
@@ -9228,14 +9537,19 @@ for (;; pptr++)
     pptr += 3 + SIZEOFFSET;
     break;
 
-    /* Only some escapes consume a character. Of those, \R and \X are never
-    allowed because they might match more than character. \C is allowed only in
-    32-bit and non-UTF 8/16-bit modes. */
+    /* Only some escapes consume a character. Of those, \R can match one or two
+    characters, but \X is never allowed because it matches an unknown number of
+    characters. \C is allowed only in 32-bit and non-UTF 8/16-bit modes. */
 
     case META_ESCAPE:
     escape = META_DATA(*pptr);
-    if (escape == ESC_R || escape == ESC_X) return -1;
-    if (escape > ESC_b && escape < ESC_Z)
+    if (escape == ESC_X) return -1;
+    if (escape == ESC_R)
+      {
+      itemminlength = 1;
+      itemlength = 2;
+      }
+    else if (escape > ESC_b && escape < ESC_Z)
       {
 #if PCRE2_CODE_UNIT_WIDTH != 32
       if ((cb->external_options & PCRE2_UTF) != 0 && escape == ESC_C)
@@ -9244,7 +9558,7 @@ for (;; pptr++)
         return -1;
         }
 #endif
-      itemlength = 1;
+      itemlength = itemminlength = 1;
       if (escape == ESC_p || escape == ESC_P) pptr++;  /* Skip prop data */
       }
     break;
@@ -9400,14 +9714,15 @@ for (;; pptr++)
     in the cache. */
 
     gptr++;
-    grouplength = get_grouplength(&gptr, FALSE, errcodeptr, lcptr, group,
-      &this_recurse, cb);
+    grouplength = get_grouplength(&gptr, &groupminlength, FALSE, errcodeptr,
+      lcptr, group, &this_recurse, cb);
     if (grouplength < 0)
       {
       if (*errcodeptr == 0) goto ISNOTFIXED;
       return -1;  /* Error already set */
       }
     itemlength = grouplength;
+    itemminlength = groupminlength;
     break;
 
     /* A (DEFINE) group is never obeyed inline and so it does not contribute to
@@ -9445,41 +9760,44 @@ for (;; pptr++)
     case META_SCRIPT_RUN:
     pptr++;
     CHECK_GROUP:
-    grouplength = get_grouplength(&pptr, TRUE, errcodeptr, lcptr, group,
-      recurses, cb);
+    grouplength = get_grouplength(&pptr, &groupminlength, TRUE, errcodeptr,
+      lcptr, group, recurses, cb);
     if (grouplength < 0) return -1;
     itemlength = grouplength;
+    itemminlength = groupminlength;
     break;
 
+    case META_QUERY:
+    case META_QUERY_PLUS:
+    case META_QUERY_QUERY:
+    min = 0;
+    max = 1;
+    goto REPETITION;
+
     /* Exact repetition is OK; variable repetition is not. A repetition of zero
     must subtract the length that has already been added. */
 
     case META_MINMAX:
     case META_MINMAX_PLUS:
     case META_MINMAX_QUERY:
-    if (pptr[1] == pptr[2])
+    min = pptr[1];
+    max = pptr[2];
+    pptr += 2;
+
+    REPETITION:
+    if (max != REPEAT_UNLIMITED)
       {
-      switch(pptr[1])
+      if (lastitemlength != 0 &&  /* Should not occur, but just in case */
+          max != 0 &&
+          (INT_MAX - branchlength)/lastitemlength < max - 1)
         {
-        case 0:
-        branchlength -= lastitemlength;
-        break;
-
-        case 1:
-        itemlength = 0;
-        break;
-
-        default:  /* Check for integer overflow */
-        if (lastitemlength != 0 &&  /* Should not occur, but just in case */
-            INT_MAX/lastitemlength < pptr[1] - 1)
-          {
-          *errcodeptr = ERR87;  /* Integer overflow; lookbehind too big */
-          return -1;
-          }
-        itemlength = (pptr[1] - 1) * lastitemlength;
-        break;
+        *errcodeptr = ERR87;  /* Integer overflow; lookbehind too big */
+        return -1;
         }
-      pptr += 2;
+      if (min == 0) branchminlength -= lastitemminlength;
+        else itemminlength = (min - 1) * lastitemminlength;
+      if (max == 0) branchlength -= lastitemlength;
+        else itemlength = (max - 1) * lastitemlength;
       break;
       }
     /* Fall through */
@@ -9493,7 +9811,9 @@ for (;; pptr++)
     }
 
   /* Add the item length to the branchlength, checking for integer overflow and
-  for the branch length exceeding the limit. */
+  for the branch length exceeding the overall limit. Later, if there is at
+  least one variable-length branch in the group, there is a test for the
+  (smaller) variable-length branch length limit. */
 
   if (INT_MAX - branchlength < (int)itemlength ||
       (branchlength += itemlength) > LOOKBEHIND_MAX)
@@ -9502,13 +9822,17 @@ for (;; pptr++)
     return -1;
     }
 
+  branchminlength += itemminlength;
+
   /* Save this item length for use if the next item is a quantifier. */
 
   lastitemlength = itemlength;
+  lastitemminlength = itemminlength;
   }
 
 EXIT:
 *pptrptr = pptr;
+*minptr = branchminlength;
 return branchlength;
 
 PARSED_SKIP_FAILED:
@@ -9523,9 +9847,9 @@ return -1;
 *************************************************/
 
 /* This function is called for each lookbehind, to set the lengths in its
-branches. An error occurs if any branch does not have a fixed length that is
-less than the maximum (65535). On exit, the pointer must be left on the final
-ket.
+branches. An error occurs if any branch does not have a limited maximum length
+that is less than the limit (65535). On exit, the pointer must be left on the
+final ket.
 
 The function also maintains the max_lookbehind value. Any lookbehind branch
 that contains a nested lookbehind may actually look further back than the
@@ -9548,16 +9872,27 @@ set_lookbehind_lengths(uint32_t **pptrpt
   parsed_recurse_check *recurses, compile_block *cb)
 {
 PCRE2_SIZE offset;
-int branchlength;
 uint32_t *bptr = *pptrptr;
+uint32_t *gbptr = bptr;
+int maxlength = 0;
+int minlength = INT_MAX;
+BOOL variable = FALSE;
 
 READPLUSOFFSET(offset, bptr);  /* Offset for error messages */
 *pptrptr += SIZEOFFSET;
 
+/* Each branch can have a different maximum length, but we can keep only a
+single minimum for the whole group, because there's nowhere to save individual
+values in the META_ALT item. */
+
 do
   {
+  int branchlength, branchminlength;
+
   *pptrptr += 1;
-  branchlength = get_branchlength(pptrptr, errcodeptr, lcptr, recurses, cb);
+  branchlength = get_branchlength(pptrptr, &branchminlength, errcodeptr, lcptr,
+    recurses, cb);
+
   if (branchlength < 0)
     {
     /* The errorcode and offset may already be set from a nested lookbehind. */
@@ -9565,12 +9900,37 @@ do
     if (cb->erroroffset == PCRE2_UNSET) cb->erroroffset = offset;
     return FALSE;
     }
+
+  if (branchlength != branchminlength) variable = TRUE;
+  if (branchminlength < minlength) minlength = branchminlength;
+  if (branchlength > maxlength) maxlength = branchlength;
   if (branchlength > cb->max_lookbehind) cb->max_lookbehind = branchlength;
   *bptr |= branchlength;  /* branchlength never more than 65535 */
   bptr = *pptrptr;
   }
 while (*bptr == META_ALT);
 
+/* If any branch is of variable length, the whole lookbehind is of variable
+length. If the maximum length of any branch exceeds the maximum for variable
+lookbehinds, give an error. Otherwise, the minimum length is set in the word
+that follows the original group META value. For a fixed-length lookbehind, this
+is set to LOOKBEHIND_MAX, to indicate that each branch is of a fixed (but
+possibly different) length. */
+
+if (variable)
+  {
+  gbptr[1] = minlength;
+  if ((uint32_t)maxlength > cb->max_varlookbehind)
+    {
+    *errcodeptr = ERR100;
+    cb->erroroffset = offset;
+    return FALSE;
+    }
+  }
+else gbptr[1] = LOOKBEHIND_MAX;
+
+
+gbptr[1] = variable? minlength : LOOKBEHIND_MAX;
 return TRUE;
 }
 
@@ -9703,7 +10063,6 @@ for (; *pptr != META_END; pptr++)
     break;
 
     case META_BIGVALUE:
-    case META_OPTIONS:
     case META_POSIX:
     case META_POSIX_NEG:
     pptr += 1;
@@ -9712,6 +10071,7 @@ for (; *pptr != META_END; pptr++)
     case META_MINMAX:
     case META_MINMAX_QUERY:
     case META_MINMAX_PLUS:
+    case META_OPTIONS:
     pptr += 2;
     break;
 
@@ -9820,12 +10180,15 @@ if (errorptr == NULL || erroroffset == N
 *errorptr = ERR0;
 *erroroffset = 0;
 
-/* There must be a pattern! */
+/* There must be a pattern, but NULL is allowed with zero length. */
 
 if (pattern == NULL)
   {
-  *errorptr = ERR16;
-  return NULL;
+  if (patlen == 0) pattern = (PCRE2_SPTR)""; else
+    {
+    *errorptr = ERR16;
+    return NULL;
+    }
   }
 
 /* A NULL compile context means "use a default context" */
@@ -9890,13 +10253,13 @@ cb.external_options = options;
 cb.groupinfo = stack_groupinfo;
 cb.had_recurse = FALSE;
 cb.lastcapture = 0;
-cb.max_lookbehind = 0;
+cb.max_lookbehind = 0;                               /* Max encountered */
+cb.max_varlookbehind = ccontext->max_varlookbehind;  /* Limit */
 cb.name_entry_size = 0;
 cb.name_table = NULL;
 cb.named_groups = named_groups;
 cb.named_group_list_size = NAMED_GROUP_LIST_SIZE;
 cb.names_found = 0;
-cb.open_caps = NULL;
 cb.parens_depth = 0;
 cb.parsed_pattern = stack_parsed_pattern;
 cb.req_varyopt = 0;
@@ -9949,7 +10312,7 @@ if ((options & PCRE2_LITERAL) == 0)
     for (i = 0; i < sizeof(pso_list)/sizeof(pso); i++)
       {
       uint32_t c, pp;
-      pso *p = pso_list + i;
+      const pso *p = pso_list + i;
 
       if (patlen - skipatstart - 2 >= p->length &&
           PRIV(strncmp_c8)(ptr + skipatstart + 2, (char *)(p->name),
@@ -10158,39 +10521,36 @@ cb.parsed_pattern_end = cb.parsed_patter
 errorcode = parse_regex(ptr, cb.external_options, &has_lookbehind, &cb);
 if (errorcode != 0) goto HAD_CB_ERROR;
 
-/* Workspace is needed to remember information about numbered groups: whether a
-group can match an empty string and what its fixed length is. This is done to
-avoid the possibility of recursive references causing very long compile times
-when checking these features. Unnumbered groups do not have this exposure since
-they cannot be referenced. We use an indexed vector for this purpose. If there
-are sufficiently few groups, the default vector on the stack, as set up above,
-can be used. Otherwise we have to get/free a special vector. The vector must be
-initialized to zero. */
-
-if (cb.bracount >= GROUPINFO_DEFAULT_SIZE)
-  {
-  cb.groupinfo = ccontext->memctl.malloc(
-    (cb.bracount + 1)*sizeof(uint32_t), ccontext->memctl.memory_data);
-  if (cb.groupinfo == NULL)
-    {
-    errorcode = ERR21;
-    cb.erroroffset = 0;
-    goto HAD_CB_ERROR;
-    }
-  }
-memset(cb.groupinfo, 0, (cb.bracount + 1) * sizeof(uint32_t));
-
-/* If there were any lookbehinds, scan the parsed pattern to figure out their
-lengths. */
+/* If there are any lookbehinds, scan the parsed pattern to figure out their
+lengths. Workspace is needed to remember whether numbered groups are or are not
+of limited length, and if limited, what the minimum and maximum lengths are.
+This caching saves re-computing the length of any group that is referenced more
+than once, which is particularly relevant when recursion is involved.
+Unnumbered groups do not have this exposure because they cannot be referenced.
+If there are sufficiently few groups, the default index vector on the stack, as
+set up above, can be used. Otherwise we have to get/free some heap memory. The
+vector must be initialized to zero. */
 
 if (has_lookbehind)
   {
   int loopcount = 0;
+  if (cb.bracount >= GROUPINFO_DEFAULT_SIZE/2)
+    {
+    cb.groupinfo = ccontext->memctl.malloc(
+      (2 * (cb.bracount + 1))*sizeof(uint32_t), ccontext->memctl.memory_data);
+    if (cb.groupinfo == NULL)
+      {
+      errorcode = ERR21;
+      cb.erroroffset = 0;
+      goto HAD_CB_ERROR;
+      }
+    }
+  memset(cb.groupinfo, 0, (2 * cb.bracount + 1) * sizeof(uint32_t));
   errorcode = check_lookbehinds(cb.parsed_pattern, NULL, NULL, &cb, &loopcount);
   if (errorcode != 0) goto HAD_CB_ERROR;
   }
 
-/* For debugging, there is a function that shows the parsed data vector. */
+/* For debugging, there is a function that shows the parsed pattern vector. */
 
 #ifdef DEBUG_SHOW_PARSED
 fprintf(stderr, "+++ Pre-scan complete:\n");
@@ -10227,8 +10587,9 @@ pptr = cb.parsed_pattern;
 code = cworkspace;
 *code = OP_BRA;
 
-(void)compile_regex(cb.external_options, &code, &pptr, &errorcode, 0, &firstcu,
-   &firstcuflags, &reqcu, &reqcuflags, NULL, &cb, &length);
+(void)compile_regex(cb.external_options, ccontext->extra_options, &code, &pptr,
+   &errorcode, 0, &firstcu, &firstcuflags, &reqcu, &reqcuflags, NULL, NULL,
+   &cb, &length);
 
 if (errorcode != 0) goto HAD_CB_ERROR;  /* Offset is in cb.erroroffset */
 
@@ -10306,7 +10667,6 @@ cb.start_code = codestart;
 cb.req_varyopt = 0;
 cb.had_accept = FALSE;
 cb.had_pruneorskip = FALSE;
-cb.open_caps = NULL;
 
 /* If any named groups were found, create the name/number table from the list
 created in the pre-pass. */
@@ -10325,8 +10685,9 @@ of the function here. */
 pptr = cb.parsed_pattern;
 code = (PCRE2_UCHAR *)codestart;
 *code = OP_BRA;
-regexrc = compile_regex(re->overall_options, &code, &pptr, &errorcode, 0,
-  &firstcu, &firstcuflags, &reqcu, &reqcuflags, NULL, &cb, NULL);
+regexrc = compile_regex(re->overall_options, ccontext->extra_options, &code,
+  &pptr, &errorcode, 0, &firstcu, &firstcuflags, &reqcu, &reqcuflags, NULL,
+  NULL, &cb, NULL);
 if (regexrc < 0) re->flags |= PCRE2_MATCH_EMPTY;
 re->top_bracket = cb.bracount;
 re->top_backref = cb.top_backref;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_context.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_context.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_context.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_context.c	2024-11-20 13:56:33.000000000 +0000
@@ -7,7 +7,7 @@ and semantics are as close as possible t
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2022 University of Cambridge
+          New API code Copyright (c) 2016-2023 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -139,7 +139,9 @@ const pcre2_compile_context PRIV(default
   BSR_DEFAULT,                               /* Backslash R default */
   NEWLINE_DEFAULT,                           /* Newline convention */
   PARENS_NEST_LIMIT,                         /* As it says */
-  0 };                                       /* Extra options */
+  0,                                         /* Extra options */
+  MAX_VARLOOKBEHIND                          /* As it says */
+  };
 
 /* The create function copies the default into the new memory, but must
 override the default memory handling functions if a gcontext was provided. */
@@ -228,49 +230,48 @@ return ccontext;
 PCRE2_EXP_DEFN pcre2_general_context * PCRE2_CALL_CONVENTION
 pcre2_general_context_copy(pcre2_general_context *gcontext)
 {
-pcre2_general_context *new =
+pcre2_general_context *newcontext =
   gcontext->memctl.malloc(sizeof(pcre2_real_general_context),
   gcontext->memctl.memory_data);
-if (new == NULL) return NULL;
-memcpy(new, gcontext, sizeof(pcre2_real_general_context));
-return new;
+if (newcontext == NULL) return NULL;
+memcpy(newcontext, gcontext, sizeof(pcre2_real_general_context));
+return newcontext;
 }
 
 
 PCRE2_EXP_DEFN pcre2_compile_context * PCRE2_CALL_CONVENTION
 pcre2_compile_context_copy(pcre2_compile_context *ccontext)
 {
-pcre2_compile_context *new =
+pcre2_compile_context *newcontext =
   ccontext->memctl.malloc(sizeof(pcre2_real_compile_context),
   ccontext->memctl.memory_data);
-if (new == NULL) return NULL;
-memcpy(new, ccontext, sizeof(pcre2_real_compile_context));
-return new;
+if (newcontext == NULL) return NULL;
+memcpy(newcontext, ccontext, sizeof(pcre2_real_compile_context));
+return newcontext;
 }
 
 
 PCRE2_EXP_DEFN pcre2_match_context * PCRE2_CALL_CONVENTION
 pcre2_match_context_copy(pcre2_match_context *mcontext)
 {
-pcre2_match_context *new =
+pcre2_match_context *newcontext =
   mcontext->memctl.malloc(sizeof(pcre2_real_match_context),
   mcontext->memctl.memory_data);
-if (new == NULL) return NULL;
-memcpy(new, mcontext, sizeof(pcre2_real_match_context));
-return new;
+if (newcontext == NULL) return NULL;
+memcpy(newcontext, mcontext, sizeof(pcre2_real_match_context));
+return newcontext;
 }
 
 
-
 PCRE2_EXP_DEFN pcre2_convert_context * PCRE2_CALL_CONVENTION
 pcre2_convert_context_copy(pcre2_convert_context *ccontext)
 {
-pcre2_convert_context *new =
+pcre2_convert_context *newcontext =
   ccontext->memctl.malloc(sizeof(pcre2_real_convert_context),
   ccontext->memctl.memory_data);
-if (new == NULL) return NULL;
-memcpy(new, ccontext, sizeof(pcre2_real_convert_context));
-return new;
+if (newcontext == NULL) return NULL;
+memcpy(newcontext, ccontext, sizeof(pcre2_real_convert_context));
+return newcontext;
 }
 
 
@@ -371,6 +372,13 @@ switch(newline)
 }
 
 PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_set_max_varlookbehind(pcre2_compile_context *ccontext, uint32_t limit)
+{
+ccontext->max_varlookbehind = limit;
+return 0;
+}
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
 pcre2_set_parens_nest_limit(pcre2_compile_context *ccontext, uint32_t limit)
 {
 ccontext->parens_nest_limit = limit;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_dfa_match.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_dfa_match.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_dfa_match.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_dfa_match.c	2024-11-20 13:56:33.000000000 +0000
@@ -7,7 +7,7 @@ and semantics are as close as possible t
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2022 University of Cambridge
+          New API code Copyright (c) 2016-2023 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -168,7 +168,7 @@ static const uint8_t coptable[] = {
   0,                             /* KetRmax                                */
   0,                             /* KetRmin                                */
   0,                             /* KetRpos                                */
-  0,                             /* Reverse                                */
+  0, 0,                          /* Reverse, Vreverse                      */
   0,                             /* Assert                                 */
   0,                             /* Assert not                             */
   0,                             /* Assert behind                          */
@@ -187,7 +187,8 @@ static const uint8_t coptable[] = {
   0, 0, 0, 0,                    /* SKIP, SKIP_ARG, THEN, THEN_ARG         */
   0, 0,                          /* COMMIT, COMMIT_ARG                     */
   0, 0, 0,                       /* FAIL, ACCEPT, ASSERT_ACCEPT            */
-  0, 0, 0                        /* CLOSE, SKIPZERO, DEFINE                */
+  0, 0, 0,                       /* CLOSE, SKIPZERO, DEFINE                */
+  0, 0                           /* \B and \b in UCP mode                  */
 };
 
 /* This table identifies those opcodes that inspect a character. It is used to
@@ -245,7 +246,7 @@ static const uint8_t poptable[] = {
   0,                             /* KetRmax                                */
   0,                             /* KetRmin                                */
   0,                             /* KetRpos                                */
-  0,                             /* Reverse                                */
+  0, 0,                          /* Reverse, Vreverse                      */
   0,                             /* Assert                                 */
   0,                             /* Assert not                             */
   0,                             /* Assert behind                          */
@@ -264,7 +265,8 @@ static const uint8_t poptable[] = {
   0, 0, 0, 0,                    /* SKIP, SKIP_ARG, THEN, THEN_ARG         */
   0, 0,                          /* COMMIT, COMMIT_ARG                     */
   0, 0, 0,                       /* FAIL, ACCEPT, ASSERT_ACCEPT            */
-  0, 0, 0                        /* CLOSE, SKIPZERO, DEFINE                */
+  0, 0, 0,                       /* CLOSE, SKIPZERO, DEFINE                */
+  1, 1                           /* \B and \b in UCP mode                  */
 };
 
 /* These 2 tables allow for compact code for testing for \D, \d, \S, \s, \W,
@@ -426,7 +428,7 @@ overflow. */
 
 else
   {
-  uint32_t newsize = (rws->size >= UINT32_MAX/2)? UINT32_MAX/2 : rws->size * 2;
+  uint32_t newsize = (rws->size >= UINT32_MAX/(sizeof(int)*2))? UINT32_MAX/sizeof(int) : rws->size * 2;
   uint32_t newsizeK = newsize/(1024/sizeof(int));
 
   if (newsizeK + mb->heap_used > mb->heap_limit)
@@ -589,7 +591,7 @@ if (*this_start_code == OP_ASSERTBACK ||
   end_code = this_start_code;
   do
     {
-    size_t back = (size_t)GET(end_code, 2+LINK_SIZE);
+    size_t back = (size_t)GET2(end_code, 2+LINK_SIZE);
     if (back > max_back) max_back = back;
     end_code += GET(end_code, 1);
     }
@@ -633,8 +635,8 @@ if (*this_start_code == OP_ASSERTBACK ||
   end_code = this_start_code;
   do
     {
-    uint32_t revlen = (end_code[1+LINK_SIZE] == OP_REVERSE)? 1 + LINK_SIZE : 0;
-    size_t back = (revlen == 0)? 0 : (size_t)GET(end_code, 2+LINK_SIZE);
+    uint32_t revlen = (end_code[1+LINK_SIZE] == OP_REVERSE)? 1 + IMM2_SIZE : 0;
+    size_t back = (revlen == 0)? 0 : (size_t)GET2(end_code, 2+LINK_SIZE);
     if (back <= gone_back)
       {
       int bstate = (int)(end_code - start_code + 1 + LINK_SIZE + revlen);
@@ -1100,6 +1102,8 @@ for (;;)
       /*-----------------------------------------------------------------*/
       case OP_WORD_BOUNDARY:
       case OP_NOT_WORD_BOUNDARY:
+      case OP_NOT_UCP_WORD_BOUNDARY:
+      case OP_UCP_WORD_BOUNDARY:
         {
         int left_word, right_word;
 
@@ -1112,13 +1116,13 @@ for (;;)
 #endif
           GETCHARTEST(d, temp);
 #ifdef SUPPORT_UNICODE
-          if ((mb->poptions & PCRE2_UCP) != 0)
+          if (codevalue == OP_UCP_WORD_BOUNDARY ||
+              codevalue == OP_NOT_UCP_WORD_BOUNDARY)
             {
-            if (d == '_') left_word = TRUE; else
-              {
-              uint32_t cat = UCD_CATEGORY(d);
-              left_word = (cat == ucp_L || cat == ucp_N);
-              }
+            int chartype = UCD_CHARTYPE(d);
+            int category = PRIV(ucp_gentype)[chartype];
+            left_word = (category == ucp_L || category == ucp_N ||
+              chartype == ucp_Mn || chartype == ucp_Pc);
             }
           else
 #endif
@@ -1137,13 +1141,13 @@ for (;;)
             mb->last_used_ptr = temp;
             }
 #ifdef SUPPORT_UNICODE
-          if ((mb->poptions & PCRE2_UCP) != 0)
+          if (codevalue == OP_UCP_WORD_BOUNDARY ||
+              codevalue == OP_NOT_UCP_WORD_BOUNDARY)
             {
-            if (c == '_') right_word = TRUE; else
-              {
-              uint32_t cat = UCD_CATEGORY(c);
-              right_word = (cat == ucp_L || cat == ucp_N);
-              }
+            int chartype = UCD_CHARTYPE(c);
+            int category = PRIV(ucp_gentype)[chartype];
+            right_word = (category == ucp_L || category == ucp_N ||
+              chartype == ucp_Mn || chartype == ucp_Pc);
             }
           else
 #endif
@@ -1151,7 +1155,9 @@ for (;;)
           }
         else right_word = FALSE;
 
-        if ((left_word == right_word) == (codevalue == OP_NOT_WORD_BOUNDARY))
+        if ((left_word == right_word) ==
+            (codevalue == OP_NOT_WORD_BOUNDARY ||
+             codevalue == OP_NOT_UCP_WORD_BOUNDARY))
           { ADD_ACTIVE(state_offset + 1, 0); }
         }
       break;
@@ -1168,6 +1174,7 @@ for (;;)
       if (clen > 0)
         {
         BOOL OK;
+        int chartype;
         const uint32_t *cp;
         const ucd_record * prop = GET_UCD(c);
         switch(code[1])
@@ -1177,8 +1184,9 @@ for (;;)
           break;
 
           case PT_LAMP:
-          OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||
-               prop->chartype == ucp_Lt;
+          chartype = prop->chartype;
+          OK = chartype == ucp_Lu || chartype == ucp_Ll ||
+               chartype == ucp_Lt;
           break;
 
           case PT_GC:
@@ -1201,8 +1209,9 @@ for (;;)
           /* These are specials for combination cases. */
 
           case PT_ALNUM:
-          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
-               PRIV(ucp_gentype)[prop->chartype] == ucp_N;
+          chartype = prop->chartype;
+          OK = PRIV(ucp_gentype)[chartype] == ucp_L ||
+               PRIV(ucp_gentype)[chartype] == ucp_N;
           break;
 
           /* Perl space used to exclude VT, but from Perl 5.18 it is included,
@@ -1225,12 +1234,20 @@ for (;;)
           break;
 
           case PT_WORD:
-          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
-               PRIV(ucp_gentype)[prop->chartype] == ucp_N ||
-               c == CHAR_UNDERSCORE;
+          chartype = prop->chartype;
+          OK = PRIV(ucp_gentype)[chartype] == ucp_L ||
+               PRIV(ucp_gentype)[chartype] == ucp_N ||
+               chartype == ucp_Mn || chartype == ucp_Pc;
           break;
 
           case PT_CLIST:
+#if PCRE2_CODE_UNIT_WIDTH == 32
+          if (c > MAX_UTF_CODE_POINT)
+            {
+            OK = FALSE;
+            break;
+            }
+#endif
           cp = PRIV(ucd_caseless_sets) + code[2];
           for (;;)
             {
@@ -1440,6 +1457,7 @@ for (;;)
       if (clen > 0)
         {
         BOOL OK;
+        int chartype;
         const uint32_t *cp;
         const ucd_record * prop = GET_UCD(c);
         switch(code[2])
@@ -1449,8 +1467,8 @@ for (;;)
           break;
 
           case PT_LAMP:
-          OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||
-            prop->chartype == ucp_Lt;
+          chartype = prop->chartype;
+          OK = chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt;
           break;
 
           case PT_GC:
@@ -1473,8 +1491,9 @@ for (;;)
           /* These are specials for combination cases. */
 
           case PT_ALNUM:
-          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
-               PRIV(ucp_gentype)[prop->chartype] == ucp_N;
+          chartype = prop->chartype;
+          OK = PRIV(ucp_gentype)[chartype] == ucp_L ||
+               PRIV(ucp_gentype)[chartype] == ucp_N;
           break;
 
           /* Perl space used to exclude VT, but from Perl 5.18 it is included,
@@ -1497,12 +1516,20 @@ for (;;)
           break;
 
           case PT_WORD:
-          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
-               PRIV(ucp_gentype)[prop->chartype] == ucp_N ||
-               c == CHAR_UNDERSCORE;
+          chartype = prop->chartype;
+          OK = PRIV(ucp_gentype)[chartype] == ucp_L ||
+               PRIV(ucp_gentype)[chartype] == ucp_N ||
+               chartype == ucp_Mn || chartype == ucp_Pc;
           break;
 
           case PT_CLIST:
+#if PCRE2_CODE_UNIT_WIDTH == 32
+          if (c > MAX_UTF_CODE_POINT)
+            {
+            OK = FALSE;
+            break;
+            }
+#endif
           cp = PRIV(ucd_caseless_sets) + code[3];
           for (;;)
             {
@@ -1695,6 +1722,7 @@ for (;;)
       if (clen > 0)
         {
         BOOL OK;
+        int chartype;
         const uint32_t *cp;
         const ucd_record * prop = GET_UCD(c);
         switch(code[2])
@@ -1704,8 +1732,8 @@ for (;;)
           break;
 
           case PT_LAMP:
-          OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||
-            prop->chartype == ucp_Lt;
+          chartype = prop->chartype;
+          OK = chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt;
           break;
 
           case PT_GC:
@@ -1728,8 +1756,9 @@ for (;;)
           /* These are specials for combination cases. */
 
           case PT_ALNUM:
-          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
-               PRIV(ucp_gentype)[prop->chartype] == ucp_N;
+          chartype = prop->chartype;
+          OK = PRIV(ucp_gentype)[chartype] == ucp_L ||
+               PRIV(ucp_gentype)[chartype] == ucp_N;
           break;
 
           /* Perl space used to exclude VT, but from Perl 5.18 it is included,
@@ -1752,12 +1781,20 @@ for (;;)
           break;
 
           case PT_WORD:
-          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
-               PRIV(ucp_gentype)[prop->chartype] == ucp_N ||
-               c == CHAR_UNDERSCORE;
+          chartype = prop->chartype;
+          OK = PRIV(ucp_gentype)[chartype] == ucp_L ||
+               PRIV(ucp_gentype)[chartype] == ucp_N ||
+               chartype == ucp_Mn || chartype == ucp_Pc;
           break;
 
           case PT_CLIST:
+#if PCRE2_CODE_UNIT_WIDTH == 32
+          if (c > MAX_UTF_CODE_POINT)
+            {
+            OK = FALSE;
+            break;
+            }
+#endif
           cp = PRIV(ucd_caseless_sets) + code[3];
           for (;;)
             {
@@ -1975,6 +2012,7 @@ for (;;)
       if (clen > 0)
         {
         BOOL OK;
+        int chartype;
         const uint32_t *cp;
         const ucd_record * prop = GET_UCD(c);
         switch(code[1 + IMM2_SIZE + 1])
@@ -1984,8 +2022,8 @@ for (;;)
           break;
 
           case PT_LAMP:
-          OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||
-            prop->chartype == ucp_Lt;
+          chartype = prop->chartype;
+          OK = chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt;
           break;
 
           case PT_GC:
@@ -2009,8 +2047,9 @@ for (;;)
           /* These are specials for combination cases. */
 
           case PT_ALNUM:
-          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
-               PRIV(ucp_gentype)[prop->chartype] == ucp_N;
+          chartype = prop->chartype;
+          OK = PRIV(ucp_gentype)[chartype] == ucp_L ||
+               PRIV(ucp_gentype)[chartype] == ucp_N;
           break;
 
           /* Perl space used to exclude VT, but from Perl 5.18 it is included,
@@ -2033,12 +2072,20 @@ for (;;)
           break;
 
           case PT_WORD:
-          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
-               PRIV(ucp_gentype)[prop->chartype] == ucp_N ||
-               c == CHAR_UNDERSCORE;
+          chartype = prop->chartype;
+          OK = PRIV(ucp_gentype)[chartype] == ucp_L ||
+               PRIV(ucp_gentype)[chartype] == ucp_N ||
+               chartype == ucp_Mn || chartype == ucp_Pc;
           break;
 
           case PT_CLIST:
+#if PCRE2_CODE_UNIT_WIDTH == 32
+          if (c > MAX_UTF_CODE_POINT)
+            {
+            OK = FALSE;
+            break;
+            }
+#endif
           cp = PRIV(ucd_caseless_sets) + code[1 + IMM2_SIZE + 2];
           for (;;)
             {
@@ -2894,7 +2941,6 @@ for (;;)
         int *local_workspace;
         PCRE2_SIZE *local_offsets;
         RWS_anchor *rws = (RWS_anchor *)RWS;
-        dfa_recursion_info *ri;
         PCRE2_SPTR callpat = start_code + GET(code, 1);
         uint32_t recno = (callpat == mb->start_code)? 0 :
           GET2(callpat, 1 + LINK_SIZE);
@@ -2911,18 +2957,24 @@ for (;;)
         rws->free -= RWS_RSIZE + RWS_OVEC_RSIZE;
 
         /* Check for repeating a recursion without advancing the subject
-        pointer. This should catch convoluted mutual recursions. (Some simple
-        cases are caught at compile time.) */
+        pointer or last used character. This should catch convoluted mutual
+        recursions. (Some simple cases are caught at compile time.) */
 
-        for (ri = mb->recursive; ri != NULL; ri = ri->prevrec)
-          if (recno == ri->group_num && ptr == ri->subject_position)
+        for (dfa_recursion_info *ri = mb->recursive;
+             ri != NULL;
+             ri = ri->prevrec)
+          {
+          if (recno == ri->group_num && ptr == ri->subject_position &&
+              mb->last_used_ptr == ri->last_used_ptr)
             return PCRE2_ERROR_RECURSELOOP;
+          }
 
         /* Remember this recursion and where we started it so as to
         catch infinite loops. */
 
         new_recursive.group_num = recno;
         new_recursive.subject_position = ptr;
+        new_recursive.last_used_ptr = mb->last_used_ptr;
         new_recursive.prevrec = mb->recursive;
         mb->recursive = &new_recursive;
 
@@ -3424,7 +3476,7 @@ anchored = (options & (PCRE2_ANCHORED|PC
 where to start. */
 
 startline = (re->flags & PCRE2_STARTLINE) != 0;
-firstline = (re->overall_options & PCRE2_FIRSTLINE) != 0;
+firstline = !anchored && (re->overall_options & PCRE2_FIRSTLINE) != 0;
 bumpalong_limit = end_subject;
 
 /* Initialize and set up the fixed fields in the callout block, with a pointer
@@ -3994,8 +4046,9 @@ for (;;)
       match_data->ovector[0] = (PCRE2_SIZE)(start_match - subject);
       match_data->ovector[1] = (PCRE2_SIZE)(end_subject - subject);
       }
+    match_data->subject_length = length;
     match_data->leftchar = (PCRE2_SIZE)(mb->start_used_ptr - subject);
-    match_data->rightchar = (PCRE2_SIZE)( mb->last_used_ptr - subject);
+    match_data->rightchar = (PCRE2_SIZE)(mb->last_used_ptr - subject);
     match_data->startchar = (PCRE2_SIZE)(start_match - subject);
     match_data->rc = rc;
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_error.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_error.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_error.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_error.c	2024-11-20 13:56:33.000000000 +0000
@@ -7,7 +7,7 @@ and semantics are as close as possible t
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2021 University of Cambridge
+          New API code Copyright (c) 2016-2023 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -82,7 +82,7 @@ static const unsigned char compile_error
   "missing closing parenthesis\0"
   /* 15 */
   "reference to non-existent subpattern\0"
-  "pattern passed as NULL\0"
+  "pattern passed as NULL with non-zero length\0"
   "unrecognised compile-time option bit(s)\0"
   "missing ) after (?# comment\0"
   "parentheses are too deeply nested\0"
@@ -93,7 +93,7 @@ static const unsigned char compile_error
   "internal error: code overflow\0"
   "missing closing parenthesis for condition\0"
   /* 25 */
-  "lookbehind assertion is not fixed length\0"
+  "length of lookbehind assertion is not limited\0"
   "a relative value of zero is not allowed\0"
   "conditional subpattern contains more than two branches\0"
   "assertion expected after (?( or (?(?C)\0"
@@ -187,6 +187,8 @@ static const unsigned char compile_error
   "too many capturing groups (maximum 65535)\0"
   "atomic assertion expected after (?( or (?(?C)\0"
   "\\K is not allowed in lookarounds (but see PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK)\0"
+  /* 100 */
+  "branch too long in variable-length lookbehind assertion\0"
   ;
 
 /* Match-time and UTF error texts are in the same format. */
@@ -272,6 +274,7 @@ static const unsigned char match_error_t
   /* 65 */
   "internal error - duplicate substitution match\0"
   "PCRE2_MATCH_INVALID_UTF is not supported for DFA matching\0"
+  "INTERNAL ERROR: invalid substring offset\0"
   ;
 
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_find_bracket.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_find_bracket.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_find_bracket.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_find_bracket.c	2024-11-20 13:56:33.000000000 +0000
@@ -7,7 +7,7 @@ and semantics are as close as possible t
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2018 University of Cambridge
+          New API code Copyright (c) 2016-2023 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -41,9 +41,9 @@ POSSIBILITY OF SUCH DAMAGE.
 
 /* This module contains a single function that scans through a compiled pattern
 until it finds a capturing bracket with the given number, or, if the number is
-negative, an instance of OP_REVERSE for a lookbehind. The function is called
-from pcre2_compile.c and also from pcre2_study.c when finding the minimum
-matching length. */
+negative, an instance of OP_REVERSE or OP_VREVERSE for a lookbehind. The
+function is called from pcre2_compile.c and also from pcre2_study.c when
+finding the minimum matching length. */
 
 
 #ifdef HAVE_CONFIG_H
@@ -85,7 +85,7 @@ for (;;)
 
   /* Handle lookbehind */
 
-  else if (c == OP_REVERSE)
+  else if (c == OP_REVERSE || c == OP_VREVERSE)
     {
     if (number < 0) return (PCRE2_UCHAR *)code;
     code += PRIV(OP_lengths)[c];
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_internal.h 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_internal.h
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_internal.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_internal.h	2024-11-20 13:56:33.000000000 +0000
@@ -7,7 +7,7 @@ and semantics are as close as possible t
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2022 University of Cambridge
+          New API code Copyright (c) 2016-2023 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -51,6 +51,24 @@ pcre2test.c with CODE_UNIT_WIDTH == 0. *
 #error The use of both EBCDIC and SUPPORT_UNICODE is not supported.
 #endif
 
+/* When compiling one of the libraries, the value of PCRE2_CODE_UNIT_WIDTH must
+be 8, 16, or 32. AutoTools and CMake ensure that this is always the case, but
+other other building methods may not, so here is a check. It is cut out when
+building pcre2test, bcause that sets the value to zero. No other source should
+be including this file. There is no explicit way of forcing a compile to be
+abandoned, but trying to include a non-existent file seems cleanest. Otherwise
+there will be many irrelevant consequential errors. */
+
+#if (!defined PCRE2_BUILDING_PCRE2TEST && !defined PCRE2_DFTABLES) && \
+  (!defined PCRE2_CODE_UNIT_WIDTH ||     \
+    (PCRE2_CODE_UNIT_WIDTH != 8 &&       \
+     PCRE2_CODE_UNIT_WIDTH != 16 &&      \
+     PCRE2_CODE_UNIT_WIDTH != 32))
+#error PCRE2_CODE_UNIT_WIDTH must be defined as 8, 16, or 32.
+#include <AbandonCompile>
+#endif
+
+
 /* Standard C headers */
 
 #include <ctype.h>
@@ -119,20 +137,20 @@ only if it is not already set. */
 #ifndef PCRE2_EXP_DECL
 #  ifdef _WIN32
 #    ifndef PCRE2_STATIC
-#      define PCRE2_EXP_DECL       extern __declspec(dllexport)
-#      define PCRE2_EXP_DEFN       __declspec(dllexport)
+#      define PCRE2_EXP_DECL		extern __declspec(dllexport)
+#      define PCRE2_EXP_DEFN		__declspec(dllexport)
 #    else
-#      define PCRE2_EXP_DECL       extern
+#      define PCRE2_EXP_DECL		extern PCRE2_EXPORT
 #      define PCRE2_EXP_DEFN
 #    endif
 #  else
 #    ifdef __cplusplus
-#      define PCRE2_EXP_DECL       extern "C"
+#      define PCRE2_EXP_DECL		extern "C" PCRE2_EXPORT
 #    else
-#      define PCRE2_EXP_DECL       extern
+#      define PCRE2_EXP_DECL		extern PCRE2_EXPORT
 #    endif
 #    ifndef PCRE2_EXP_DEFN
-#      define PCRE2_EXP_DEFN       PCRE2_EXP_DECL
+#      define PCRE2_EXP_DEFN		PCRE2_EXP_DECL
 #    endif
 #  endif
 #endif
@@ -156,8 +174,8 @@ pcre2_match() because of the way it back
 #define PCRE2_SPTR CUSTOM_SUBJECT_PTR
 #endif
 
-/* When checking for integer overflow in pcre2_compile(), we need to handle
-large integers. If a 64-bit integer type is available, we can use that.
+/* When checking for integer overflow, we need to handle large integers.
+If a 64-bit integer type is available, we can use that.
 Otherwise we have to cast to double, which of course requires floating point
 arithmetic. Handle this by defining a macro for the appropriate type. */
 
@@ -1281,7 +1299,7 @@ match. */
 #define PT_ALNUM      6    /* Alphanumeric - the union of L and N */
 #define PT_SPACE      7    /* Perl space - general category Z plus 9,10,12,13 */
 #define PT_PXSPACE    8    /* POSIX space - Z plus 9,10,11,12,13 */
-#define PT_WORD       9    /* Word - L plus N plus underscore */
+#define PT_WORD       9    /* Word - L, N, Mn, or Pc */
 #define PT_CLIST     10    /* Pseudo-property: match character list */
 #define PT_UCNC      11    /* Universal Character nameable character */
 #define PT_BIDICL    12    /* Specified bidi class */
@@ -1297,6 +1315,7 @@ table. */
 #define PT_PXGRAPH   14    /* [:graph:] - characters that mark the paper */
 #define PT_PXPRINT   15    /* [:print:] - [:graph:] plus non-control spaces */
 #define PT_PXPUNCT   16    /* [:punct:] - punctuation characters */
+#define PT_PXXDIGIT  17    /* [:xdigit:] - hex digits */
 
 /* This value is used when parsing \p and \P escapes to indicate that neither
 \p{script:...} nor \p{scx:...} has been encountered. */
@@ -1327,6 +1346,12 @@ mode rather than an escape sequence. It
 compatibility mode, and for \C in non-utf mode. In non-DOTALL mode, "." behaves
 like \N.
 
+ESC_ub is a special return from check_escape() when, in BSUX mode, \u{ is not
+followed by hex digits and }, in which case it should mean a literal "u"
+followed by a literal "{". This hack is necessary for cases like \u{ 12}
+because without it, this is interpreted as u{12} now that spaces are allowed in
+quantifiers.
+
 Negative numbers are used to encode a backreference (\1, \2, \3, etc.) in
 check_escape(). There are tests in the code for an escape greater than ESC_b
 and less than ESC_Z to detect the types that may be repeated. These are the
@@ -1336,7 +1361,7 @@ consume a character, that code will have
 enum { ESC_A = 1, ESC_G, ESC_K, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s,
        ESC_W, ESC_w, ESC_N, ESC_dum, ESC_C, ESC_P, ESC_p, ESC_R, ESC_H,
        ESC_h, ESC_V, ESC_v, ESC_X, ESC_Z, ESC_z,
-       ESC_E, ESC_Q, ESC_g, ESC_k };
+       ESC_E, ESC_Q, ESC_g, ESC_k, ESC_ub };
 
 
 /********************** Opcode definitions ******************/
@@ -1372,8 +1397,8 @@ enum {
   OP_SOD,            /* 1 Start of data: \A */
   OP_SOM,            /* 2 Start of match (subject + offset): \G */
   OP_SET_SOM,        /* 3 Set start of match (\K) */
-  OP_NOT_WORD_BOUNDARY,  /*  4 \B */
-  OP_WORD_BOUNDARY,      /*  5 \b */
+  OP_NOT_WORD_BOUNDARY,  /*  4 \B -- see also OP_NOT_UCP_WORD_BOUNDARY */
+  OP_WORD_BOUNDARY,      /*  5 \b -- see also OP_UCP_WORD_BOUNDARY */
   OP_NOT_DIGIT,          /*  6 \D */
   OP_DIGIT,              /*  7 \d */
   OP_NOT_WHITESPACE,     /*  8 \S */
@@ -1547,78 +1572,85 @@ enum {
   /* The assertions must come before BRA, CBRA, ONCE, and COND. */
 
   OP_REVERSE,        /* 125 Move pointer back - used in lookbehind assertions */
-  OP_ASSERT,         /* 126 Positive lookahead */
-  OP_ASSERT_NOT,     /* 127 Negative lookahead */
-  OP_ASSERTBACK,     /* 128 Positive lookbehind */
-  OP_ASSERTBACK_NOT, /* 129 Negative lookbehind */
-  OP_ASSERT_NA,      /* 130 Positive non-atomic lookahead */
-  OP_ASSERTBACK_NA,  /* 131 Positive non-atomic lookbehind */
+  OP_VREVERSE,       /* 126 Move pointer back - variable */
+  OP_ASSERT,         /* 127 Positive lookahead */
+  OP_ASSERT_NOT,     /* 128 Negative lookahead */
+  OP_ASSERTBACK,     /* 129 Positive lookbehind */
+  OP_ASSERTBACK_NOT, /* 130 Negative lookbehind */
+  OP_ASSERT_NA,      /* 131 Positive non-atomic lookahead */
+  OP_ASSERTBACK_NA,  /* 132 Positive non-atomic lookbehind */
 
   /* ONCE, SCRIPT_RUN, BRA, BRAPOS, CBRA, CBRAPOS, and COND must come
   immediately after the assertions, with ONCE first, as there's a test for >=
   ONCE for a subpattern that isn't an assertion. The POS versions must
   immediately follow the non-POS versions in each case. */
 
-  OP_ONCE,           /* 132 Atomic group, contains captures */
-  OP_SCRIPT_RUN,     /* 133 Non-capture, but check characters' scripts */
-  OP_BRA,            /* 134 Start of non-capturing bracket */
-  OP_BRAPOS,         /* 135 Ditto, with unlimited, possessive repeat */
-  OP_CBRA,           /* 136 Start of capturing bracket */
-  OP_CBRAPOS,        /* 137 Ditto, with unlimited, possessive repeat */
-  OP_COND,           /* 138 Conditional group */
+  OP_ONCE,           /* 133 Atomic group, contains captures */
+  OP_SCRIPT_RUN,     /* 134 Non-capture, but check characters' scripts */
+  OP_BRA,            /* 135 Start of non-capturing bracket */
+  OP_BRAPOS,         /* 136 Ditto, with unlimited, possessive repeat */
+  OP_CBRA,           /* 137 Start of capturing bracket */
+  OP_CBRAPOS,        /* 138 Ditto, with unlimited, possessive repeat */
+  OP_COND,           /* 139 Conditional group */
 
   /* These five must follow the previous five, in the same order. There's a
   check for >= SBRA to distinguish the two sets. */
 
-  OP_SBRA,           /* 139 Start of non-capturing bracket, check empty  */
-  OP_SBRAPOS,        /* 149 Ditto, with unlimited, possessive repeat */
-  OP_SCBRA,          /* 141 Start of capturing bracket, check empty */
-  OP_SCBRAPOS,       /* 142 Ditto, with unlimited, possessive repeat */
-  OP_SCOND,          /* 143 Conditional group, check empty */
+  OP_SBRA,           /* 140 Start of non-capturing bracket, check empty  */
+  OP_SBRAPOS,        /* 141 Ditto, with unlimited, possessive repeat */
+  OP_SCBRA,          /* 142 Start of capturing bracket, check empty */
+  OP_SCBRAPOS,       /* 143 Ditto, with unlimited, possessive repeat */
+  OP_SCOND,          /* 144 Conditional group, check empty */
 
   /* The next two pairs must (respectively) be kept together. */
 
-  OP_CREF,           /* 144 Used to hold a capture number as condition */
-  OP_DNCREF,         /* 145 Used to point to duplicate names as a condition */
-  OP_RREF,           /* 146 Used to hold a recursion number as condition */
-  OP_DNRREF,         /* 147 Used to point to duplicate names as a condition */
-  OP_FALSE,          /* 148 Always false (used by DEFINE and VERSION) */
-  OP_TRUE,           /* 149 Always true (used by VERSION) */
-
-  OP_BRAZERO,        /* 150 These two must remain together and in this */
-  OP_BRAMINZERO,     /* 151 order. */
-  OP_BRAPOSZERO,     /* 152 */
+  OP_CREF,           /* 145 Used to hold a capture number as condition */
+  OP_DNCREF,         /* 146 Used to point to duplicate names as a condition */
+  OP_RREF,           /* 147 Used to hold a recursion number as condition */
+  OP_DNRREF,         /* 148 Used to point to duplicate names as a condition */
+  OP_FALSE,          /* 149 Always false (used by DEFINE and VERSION) */
+  OP_TRUE,           /* 150 Always true (used by VERSION) */
+
+  OP_BRAZERO,        /* 151 These two must remain together and in this */
+  OP_BRAMINZERO,     /* 152 order. */
+  OP_BRAPOSZERO,     /* 153 */
 
   /* These are backtracking control verbs */
 
-  OP_MARK,           /* 153 always has an argument */
-  OP_PRUNE,          /* 154 */
-  OP_PRUNE_ARG,      /* 155 same, but with argument */
-  OP_SKIP,           /* 156 */
-  OP_SKIP_ARG,       /* 157 same, but with argument */
-  OP_THEN,           /* 158 */
-  OP_THEN_ARG,       /* 159 same, but with argument */
-  OP_COMMIT,         /* 160 */
-  OP_COMMIT_ARG,     /* 161 same, but with argument */
+  OP_MARK,           /* 154 always has an argument */
+  OP_PRUNE,          /* 155 */
+  OP_PRUNE_ARG,      /* 156 same, but with argument */
+  OP_SKIP,           /* 157 */
+  OP_SKIP_ARG,       /* 158 same, but with argument */
+  OP_THEN,           /* 159 */
+  OP_THEN_ARG,       /* 160 same, but with argument */
+  OP_COMMIT,         /* 161 */
+  OP_COMMIT_ARG,     /* 162 same, but with argument */
 
   /* These are forced failure and success verbs. FAIL and ACCEPT do accept an
   argument, but these cases can be compiled as, for example, (*MARK:X)(*FAIL)
   without the need for a special opcode. */
 
-  OP_FAIL,           /* 162 */
-  OP_ACCEPT,         /* 163 */
-  OP_ASSERT_ACCEPT,  /* 164 Used inside assertions */
-  OP_CLOSE,          /* 165 Used before OP_ACCEPT to close open captures */
+  OP_FAIL,           /* 163 */
+  OP_ACCEPT,         /* 164 */
+  OP_ASSERT_ACCEPT,  /* 165 Used inside assertions */
+  OP_CLOSE,          /* 166 Used before OP_ACCEPT to close open captures */
 
   /* This is used to skip a subpattern with a {0} quantifier */
 
-  OP_SKIPZERO,       /* 166 */
+  OP_SKIPZERO,       /* 167 */
 
   /* This is used to identify a DEFINE group during compilation so that it can
   be checked for having only one branch. It is changed to OP_FALSE before
   compilation finishes. */
 
-  OP_DEFINE,         /* 167 */
+  OP_DEFINE,         /* 168 */
+
+  /* These opcodes replace their normal counterparts in UCP mode when
+  PCRE2_EXTRA_ASCII_BSW is not set. */
+
+  OP_NOT_UCP_WORD_BOUNDARY, /* 169 */
+  OP_UCP_WORD_BOUNDARY,     /* 170 */
 
   /* This is not an opcode, but is used to check that tables indexed by opcode
   are the correct length, in order to catch updating errors - there have been
@@ -1664,7 +1696,7 @@ some cases doesn't actually use these na
   "class", "nclass", "xclass", "Ref", "Refi", "DnRef", "DnRefi",  \
   "Recurse", "Callout", "CalloutStr",                             \
   "Alt", "Ket", "KetRmax", "KetRmin", "KetRpos",                  \
-  "Reverse", "Assert", "Assert not",                              \
+  "Reverse", "VReverse", "Assert", "Assert not",                  \
   "Assert back", "Assert back not",                               \
   "Non-atomic assert", "Non-atomic assert back",                  \
   "Once",                                                         \
@@ -1679,7 +1711,7 @@ some cases doesn't actually use these na
   "*MARK", "*PRUNE", "*PRUNE", "*SKIP", "*SKIP",                  \
   "*THEN", "*THEN", "*COMMIT", "*COMMIT", "*FAIL",                \
   "*ACCEPT", "*ASSERT_ACCEPT",                                    \
-  "Close", "Skip zero", "Define"
+  "Close", "Skip zero", "Define", "\\B (ucp)", "\\b (ucp)"
 
 
 /* This macro defines the length of fixed length operations in the compiled
@@ -1746,7 +1778,8 @@ in UTF-8 mode. The code that uses this t
   1+LINK_SIZE,                   /* KetRmax                                */ \
   1+LINK_SIZE,                   /* KetRmin                                */ \
   1+LINK_SIZE,                   /* KetRpos                                */ \
-  1+LINK_SIZE,                   /* Reverse                                */ \
+  1+IMM2_SIZE,                   /* Reverse                                */ \
+  1+2*IMM2_SIZE,                 /* VReverse                               */ \
   1+LINK_SIZE,                   /* Assert                                 */ \
   1+LINK_SIZE,                   /* Assert not                             */ \
   1+LINK_SIZE,                   /* Assert behind                          */ \
@@ -1775,7 +1808,8 @@ in UTF-8 mode. The code that uses this t
   1, 3,                          /* COMMIT, COMMIT_ARG                     */ \
   1, 1, 1,                       /* FAIL, ACCEPT, ASSERT_ACCEPT            */ \
   1+IMM2_SIZE, 1,                /* CLOSE, SKIPZERO                        */ \
-  1                              /* DEFINE                                 */
+  1,                             /* DEFINE                                 */ \
+  1, 1                           /* \B and \b in UCP mode                  */
 
 /* A magic value for OP_RREF to indicate the "any recursion" condition. */
 
@@ -2042,6 +2076,9 @@ extern void *       _pcre2_memmove(void
 #endif
 
 #endif  /* PCRE2_CODE_UNIT_WIDTH */
+
+extern BOOL         PRIV(ckd_smul)(PCRE2_SIZE *, int, int);
+
 #endif  /* PCRE2_INTERNAL_H_IDEMPOTENT_GUARD */
 
 /* End of pcre2_internal.h */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_intmodedep.h 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_intmodedep.h
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_intmodedep.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_intmodedep.h	2024-11-20 13:56:33.000000000 +0000
@@ -7,7 +7,7 @@ and semantics are as close as possible t
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2022 University of Cambridge
+          New API code Copyright (c) 2016-2023 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -572,6 +572,7 @@ typedef struct pcre2_real_compile_contex
   uint16_t newline_convention;
   uint32_t parens_nest_limit;
   uint32_t extra_options;
+  uint32_t max_varlookbehind;
 } pcre2_real_compile_context;
 
 /* The real match context structure. */
@@ -605,12 +606,12 @@ defined specially because it is required
 copying the size from possibly unaligned memory into a variable of the same
 type. Use a macro rather than a typedef to avoid compiler warnings when this
 file is included multiple times by pcre2test. LOOKBEHIND_MAX specifies the
-largest lookbehind that is supported. (OP_REVERSE in a pattern has a 16-bit
-argument in 8-bit and 16-bit modes, so we need no more than a 16-bit field
-here.) */
+largest lookbehind that is supported. (OP_REVERSE and OP_VREVERSE in a pattern
+have 16-bit arguments in 8-bit and 16-bit modes, so we need no more than a
+16-bit field here.) */
 
 #undef  CODE_BLOCKSIZE_TYPE
-#define CODE_BLOCKSIZE_TYPE size_t
+#define CODE_BLOCKSIZE_TYPE PCRE2_SIZE
 
 #undef  LOOKBEHIND_MAX
 #define LOOKBEHIND_MAX UINT16_MAX
@@ -658,6 +659,7 @@ typedef struct pcre2_real_match_data {
   PCRE2_SPTR       mark;             /* Pointer to last mark */
   struct heapframe *heapframes;      /* Backtracking frames heap memory */
   PCRE2_SIZE       heapframes_size;  /* Malloc-ed size */
+  PCRE2_SIZE       subject_length;   /* Subject length */
   PCRE2_SIZE       leftchar;         /* Offset to leftmost code unit */
   PCRE2_SIZE       rightchar;        /* Offset to rightmost code unit */
   PCRE2_SIZE       startchar;        /* Offset to starting code unit */
@@ -675,8 +677,8 @@ typedef struct pcre2_real_match_data {
 
 #ifndef PCRE2_PCRE2TEST
 
-/* Structures for checking for mutual recursion when scanning compiled or
-parsed code. */
+/* Structures for checking for mutual function recursion when scanning compiled
+or parsed code. */
 
 typedef struct recurse_check {
   struct recurse_check *prev;
@@ -688,7 +690,7 @@ typedef struct parsed_recurse_check {
   uint32_t *groupptr;
 } parsed_recurse_check;
 
-/* Structure for building a cache when filling in recursion offsets. */
+/* Structure for building a cache when filling in pattern recursion offsets. */
 
 typedef struct recurse_cache {
   PCRE2_SPTR group;
@@ -734,7 +736,6 @@ typedef struct compile_block {
   uint16_t name_entry_size;        /* Size of each entry */
   uint16_t parens_depth;           /* Depth of nested parentheses */
   uint16_t assert_depth;           /* Depth of nested assertions */
-  open_capitem *open_caps;         /* Chain of open capture items */
   named_group *named_groups;       /* Points to vector in pre-compile */
   uint32_t named_group_list_size;  /* Number of entries in the list */
   uint32_t external_options;       /* External (initial) options */
@@ -752,10 +753,11 @@ typedef struct compile_block {
   uint32_t class_range_end;        /* Overall class range end */
   PCRE2_UCHAR nl[4];               /* Newline string when fixed length */
   uint32_t req_varyopt;            /* "After variable item" flag for reqbyte */
-  int  max_lookbehind;             /* Maximum lookbehind (characters) */
+  uint32_t max_varlookbehind;      /* Limit for variable lookbehinds */
+  int  max_lookbehind;             /* Maximum lookbehind encountered (characters) */
   BOOL had_accept;                 /* (*ACCEPT) encountered */
   BOOL had_pruneorskip;            /* (*PRUNE) or (*SKIP) encountered */
-  BOOL had_recurse;                /* Had a recursion or subroutine call */
+  BOOL had_recurse;                /* Had a pattern recursion or subroutine call */
   BOOL dupnames;                   /* Duplicate names exist */
 } compile_block;
 
@@ -773,6 +775,7 @@ call within the pattern when running pcr
 typedef struct dfa_recursion_info {
   struct dfa_recursion_info *prevrec;
   PCRE2_SPTR subject_position;
+  PCRE2_SPTR last_used_ptr;
   uint32_t group_num;
 } dfa_recursion_info;
 
@@ -793,7 +796,7 @@ typedef struct heapframe {
   PCRE2_SIZE length;         /* Used for character, string, or code lengths */
   PCRE2_SIZE back_frame;     /* Amount to subtract on RRETURN */
   PCRE2_SIZE temp_size;      /* Used for short-term PCRE2_SIZE values */
-  uint32_t rdepth;           /* "Recursion" depth */
+  uint32_t rdepth;           /* Function "recursion" depth within pcre2_match() */
   uint32_t group_frame_type; /* Type information for group frames */
   uint32_t temp_32[4];       /* Used for short-term 32-bit or BOOL values */
   uint8_t return_id;         /* Where to go on in internal "return" */
@@ -826,14 +829,15 @@ typedef struct heapframe {
   allows for exactly the right size ovector for the number of capturing
   parentheses. (See also the comment for pcre2_real_match_data above.) */
 
-  PCRE2_SPTR eptr;           /* MUST BE FIRST */
-  PCRE2_SPTR start_match;    /* Can be adjusted by \K */
-  PCRE2_SPTR mark;           /* Most recent mark on the success path */
-  uint32_t current_recurse;  /* Current (deepest) recursion number */
-  uint32_t capture_last;     /* Most recent capture */
-  PCRE2_SIZE last_group_offset;  /* Saved offset to most recent group frame */
-  PCRE2_SIZE offset_top;     /* Offset after highest capture */
-  PCRE2_SIZE ovector[131072]; /* Must be last in the structure */
+  PCRE2_SPTR eptr;              /* MUST BE FIRST */
+  PCRE2_SPTR start_match;       /* Can be adjusted by \K */
+  PCRE2_SPTR mark;              /* Most recent mark on the success path */
+  PCRE2_SPTR recurse_last_used; /* Last character used at time of pattern recursion */
+  uint32_t current_recurse;     /* Group number of current (deepest) pattern recursion */
+  uint32_t capture_last;        /* Most recent capture */
+  PCRE2_SIZE last_group_offset; /* Saved offset to most recent group frame */
+  PCRE2_SIZE offset_top;        /* Offset after highest capture */
+  PCRE2_SIZE ovector[131072];   /* Must be last in the structure */
 } heapframe;
 
 /* This typedef is a check that the size of the heapframe structure is a
@@ -858,7 +862,7 @@ doing traditional NFA matching (pcre2_ma
 
 typedef struct match_block {
   pcre2_memctl memctl;            /* For general use */
-  PCRE2_SIZE heap_limit;          /* As it says */
+  uint32_t heap_limit;            /* As it says */
   uint32_t match_limit;           /* As it says */
   uint32_t match_limit_depth;     /* As it says */
   uint32_t match_call_count;      /* Number of times a new frame is created */
@@ -875,10 +879,11 @@ typedef struct match_block {
   uint16_t name_count;            /* Number of names in name table */
   uint16_t name_entry_size;       /* Size of entry in names table */
   PCRE2_SPTR name_table;          /* Table of group names */
-  PCRE2_SPTR start_code;          /* For use when recursing */
+  PCRE2_SPTR start_code;          /* For use in pattern recursion */
   PCRE2_SPTR start_subject;       /* Start of the subject string */
   PCRE2_SPTR check_subject;       /* Where UTF-checked from */
-  PCRE2_SPTR end_subject;         /* End of the subject string */
+  PCRE2_SPTR end_subject;         /* Usable end of the subject string */
+  PCRE2_SPTR true_end_subject;    /* Actual end of the subject string */
   PCRE2_SPTR end_match_ptr;       /* Subject position at end match */
   PCRE2_SPTR start_used_ptr;      /* Earliest consulted character */
   PCRE2_SPTR last_used_ptr;       /* Latest consulted character */
@@ -886,7 +891,7 @@ typedef struct match_block {
   PCRE2_SPTR nomatch_mark;        /* Mark pointer to pass back on failure */
   PCRE2_SPTR verb_ecode_ptr;      /* For passing back info */
   PCRE2_SPTR verb_skip_ptr;       /* For passing back a (*SKIP) name */
-  uint32_t verb_current_recurse;  /* Current recurse when (*VERB) happens */
+  uint32_t verb_current_recurse;  /* Current recursion group when (*VERB) happens */
   uint32_t moptions;              /* Match options */
   uint32_t poptions;              /* Pattern options */
   uint32_t skip_arg_count;        /* For counting SKIP_ARGs */
@@ -911,7 +916,7 @@ typedef struct dfa_match_block {
   PCRE2_SPTR last_used_ptr;       /* Latest consulted character */
   const uint8_t *tables;          /* Character tables */
   PCRE2_SIZE start_offset;        /* The start offset value */
-  PCRE2_SIZE heap_limit;          /* As it says */
+  uint32_t heap_limit;            /* As it says */
   PCRE2_SIZE heap_used;           /* As it says */
   uint32_t match_limit;           /* As it says */
   uint32_t match_limit_depth;     /* As it says */
@@ -926,7 +931,7 @@ typedef struct dfa_match_block {
   pcre2_callout_block *cb;        /* Points to a callout block */
   void *callout_data;             /* To pass back to callouts */
   int (*callout)(pcre2_callout_block *,void *);  /* Callout function or NULL */
-  dfa_recursion_info *recursive;  /* Linked list of recursion data */
+  dfa_recursion_info *recursive;  /* Linked list of pattern recursion data */
 } dfa_match_block;
 
 #endif  /* PCRE2_PCRE2TEST */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_jit_compile.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_jit_compile.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_jit_compile.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_jit_compile.c	2024-11-20 13:56:33.000000000 +0000
@@ -43,6 +43,12 @@ POSSIBILITY OF SUCH DAMAGE.
 #include "config.h"
 #endif
 
+#if defined(__has_feature)
+#if __has_feature(memory_sanitizer)
+#include <sanitizer/msan_interface.h>
+#endif /* __has_feature(memory_sanitizer) */
+#endif /* defined(__has_feature) */
+
 #include "pcre2_internal.h"
 
 #ifdef SUPPORT_JIT
@@ -236,12 +242,21 @@ code generator. It is allocated by compi
 the arguments for compile_backtrackingpath. Must be the first member
 of its descendants. */
 typedef struct backtrack_common {
-  /* Concatenation stack. */
+  /* Backtracking path of an opcode, which falls back
+     to our opcode, if it cannot resume matching. */
   struct backtrack_common *prev;
-  jump_list *nextbacktracks;
-  /* Internal stack (for component operators). */
+  /* Backtracks for opcodes without backtracking path.
+     These opcodes are between 'prev' and the current
+     opcode, and they never resume the match. */
+  jump_list *simple_backtracks;
+  /* Internal backtracking list for block constructs
+     which contains other opcodes, such as brackets,
+     asserts, conditionals, etc. */
   struct backtrack_common *top;
-  jump_list *topbacktracks;
+  /* Backtracks used internally by the opcode. For component
+     opcodes, this list is also used by those opcodes without
+     backtracking path which follows the 'top' backtrack. */
+  jump_list *own_backtracks;
   /* Opcode pointer. */
   PCRE2_SPTR cc;
 } backtrack_common;
@@ -338,6 +353,12 @@ typedef struct recurse_backtrack {
   BOOL inlined_pattern;
 } recurse_backtrack;
 
+typedef struct vreverse_backtrack {
+  backtrack_common common;
+  /* Return to the matching path. */
+  struct sljit_label *matchingpath;
+} vreverse_backtrack;
+
 #define OP_THEN_TRAP OP_TABLE_LENGTH
 
 typedef struct then_trap_backtrack {
@@ -404,7 +425,9 @@ typedef struct compiler_common {
   sljit_s32 match_end_ptr;
   /* Points to the marked string. */
   sljit_s32 mark_ptr;
-  /* Recursive control verb management chain. */
+  /* Head of the recursive control verb management chain.
+     Each item must have a previous offset and type
+     (see control_types) values. See do_search_mark. */
   sljit_s32 control_head_ptr;
   /* Points to the last matched capture block index. */
   sljit_s32 capture_last_ptr;
@@ -474,12 +497,15 @@ typedef struct compiler_common {
   jump_list *stackalloc;
   jump_list *revertframes;
   jump_list *wordboundary;
+  jump_list *ucp_wordboundary;
   jump_list *anynewline;
   jump_list *hspace;
   jump_list *vspace;
   jump_list *casefulcmp;
   jump_list *caselesscmp;
   jump_list *reset_match;
+  /* Same as reset_match, but resets the STR_PTR as well. */
+  jump_list *restart_match;
   BOOL unset_backref;
   BOOL alt_circumflex;
 #ifdef SUPPORT_UNICODE
@@ -636,8 +662,8 @@ the start pointers when the end of the c
   sljit_set_label(sljit_emit_cmp(compiler, (type), (src1), (src1w), (src2), (src2w)), (label))
 #define OP_FLAGS(op, dst, dstw, type) \
   sljit_emit_op_flags(compiler, (op), (dst), (dstw), (type))
-#define CMOV(type, dst_reg, src, srcw) \
-  sljit_emit_cmov(compiler, (type), (dst_reg), (src), (srcw))
+#define SELECT(type, dst_reg, src1, src1w, src2_reg) \
+  sljit_emit_select(compiler, (type), (dst_reg), (src1), (src1w), (src2_reg))
 #define GET_LOCAL_BASE(dst, dstw, offset) \
   sljit_get_local_base(compiler, (dst), (dstw), (offset))
 
@@ -857,6 +883,21 @@ SLJIT_ASSERT(*cc >= OP_KET && *cc <= OP_
 return count;
 }
 
+static BOOL find_vreverse(PCRE2_SPTR cc)
+{
+  SLJIT_ASSERT(*cc == OP_ASSERTBACK || *cc == OP_ASSERTBACK_NOT ||  *cc == OP_ASSERTBACK_NA);
+
+  do
+    {
+    if (cc[1 + LINK_SIZE] == OP_VREVERSE)
+      return TRUE;
+    cc += GET(cc, 1);
+    }
+  while (*cc == OP_ALT);
+
+  return FALSE;
+}
+
 /* Functions whose might need modification for all new supported opcodes:
  next_opcode
  check_opcode_types
@@ -927,6 +968,7 @@ switch(*cc)
   case OP_KETRMIN:
   case OP_KETRPOS:
   case OP_REVERSE:
+  case OP_VREVERSE:
   case OP_ASSERT:
   case OP_ASSERT_NOT:
   case OP_ASSERTBACK:
@@ -963,6 +1005,8 @@ switch(*cc)
   case OP_ASSERT_ACCEPT:
   case OP_CLOSE:
   case OP_SKIPZERO:
+  case OP_NOT_UCP_WORD_BOUNDARY:
+  case OP_UCP_WORD_BOUNDARY:
   return cc + PRIV(OP_lengths)[*cc];
 
   case OP_CHAR:
@@ -1231,34 +1275,37 @@ while (cc < ccend)
 return TRUE;
 }
 
-#define EARLY_FAIL_ENHANCE_MAX (1 + 3)
+#define EARLY_FAIL_ENHANCE_MAX (3 + 3)
 
 /*
-start:
-  0 - skip / early fail allowed
-  1 - only early fail with range allowed
-  >1 - (start - 1) early fail is processed
+  Start represent the number of allowed early fail enhancements
 
-return: current number of iterators enhanced with fast fail
+  The 0-2 values has a special meaning:
+    0 - skip is allowed for all iterators
+    1 - fail is allowed for all iterators
+    2 - fail is allowed for greedy iterators
+    3 - only ranged early fail is allowed
+  >3 - (start - 3) number of remaining ranged early fails allowed
+
+return: the updated value of start
 */
-static int detect_early_fail(compiler_common *common, PCRE2_SPTR cc, int *private_data_start,
-   sljit_s32 depth, int start, BOOL fast_forward_allowed)
+static int detect_early_fail(compiler_common *common, PCRE2_SPTR cc,
+   int *private_data_start, sljit_s32 depth, int start)
 {
 PCRE2_SPTR begin = cc;
 PCRE2_SPTR next_alt;
 PCRE2_SPTR end;
 PCRE2_SPTR accelerated_start;
-BOOL prev_fast_forward_allowed;
 int result = 0;
-int count;
+int count, prev_count;
 
 SLJIT_ASSERT(*cc == OP_ONCE || *cc == OP_BRA || *cc == OP_CBRA);
 SLJIT_ASSERT(*cc != OP_CBRA || common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] != 0);
 SLJIT_ASSERT(start < EARLY_FAIL_ENHANCE_MAX);
 
 next_alt = cc + GET(cc, 1);
-if (*next_alt == OP_ALT)
-  fast_forward_allowed = FALSE;
+if (*next_alt == OP_ALT && start < 1)
+  start = 1;
 
 do
   {
@@ -1282,6 +1329,8 @@ do
       case OP_CIRCM:
       case OP_DOLL:
       case OP_DOLLM:
+      case OP_NOT_UCP_WORD_BOUNDARY:
+      case OP_UCP_WORD_BOUNDARY:
       /* Zero width assertions. */
       cc++;
       continue;
@@ -1299,21 +1348,22 @@ do
       case OP_HSPACE:
       case OP_NOT_VSPACE:
       case OP_VSPACE:
-      fast_forward_allowed = FALSE;
+      if (count < 1)
+        count = 1;
       cc++;
       continue;
 
       case OP_ANYNL:
       case OP_EXTUNI:
-      fast_forward_allowed = FALSE;
-      if (count == 0)
-        count = 1;
+      if (count < 3)
+        count = 3;
       cc++;
       continue;
 
       case OP_NOTPROP:
       case OP_PROP:
-      fast_forward_allowed = FALSE;
+      if (count < 1)
+        count = 1;
       cc += 1 + 2;
       continue;
 
@@ -1321,17 +1371,22 @@ do
       case OP_CHARI:
       case OP_NOT:
       case OP_NOTI:
-      fast_forward_allowed = FALSE;
+      if (count < 1)
+        count = 1;
       cc += 2;
 #ifdef SUPPORT_UNICODE
       if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
 #endif
       continue;
 
-      case OP_TYPESTAR:
       case OP_TYPEMINSTAR:
-      case OP_TYPEPLUS:
       case OP_TYPEMINPLUS:
+      if (count == 2)
+        count = 3;
+      /* Fall through */
+
+      case OP_TYPESTAR:
+      case OP_TYPEPLUS:
       case OP_TYPEPOSSTAR:
       case OP_TYPEPOSPLUS:
       /* The type or prop opcode is skipped in the next iteration. */
@@ -1343,14 +1398,18 @@ do
         break;
         }
 
-      if (count == 0)
+      if (count < 3)
+        count = 3;
+      continue;
+
+      case OP_TYPEEXACT:
+      if (count < 1)
         count = 1;
-      fast_forward_allowed = FALSE;
+      cc += 1 + IMM2_SIZE;
       continue;
 
       case OP_TYPEUPTO:
       case OP_TYPEMINUPTO:
-      case OP_TYPEEXACT:
       case OP_TYPEPOSUPTO:
       cc += IMM2_SIZE;
       /* Fall through */
@@ -1359,37 +1418,40 @@ do
       case OP_TYPEMINQUERY:
       case OP_TYPEPOSQUERY:
       /* The type or prop opcode is skipped in the next iteration. */
-      fast_forward_allowed = FALSE;
-      if (count == 0)
-        count = 1;
+      if (count < 3)
+        count = 3;
       cc += 1;
       continue;
 
-      case OP_STAR:
       case OP_MINSTAR:
-      case OP_PLUS:
       case OP_MINPLUS:
+      case OP_MINSTARI:
+      case OP_MINPLUSI:
+      case OP_NOTMINSTAR:
+      case OP_NOTMINPLUS:
+      case OP_NOTMINSTARI:
+      case OP_NOTMINPLUSI:
+      if (count == 2)
+        count = 3;
+      /* Fall through */
+
+      case OP_STAR:
+      case OP_PLUS:
       case OP_POSSTAR:
       case OP_POSPLUS:
 
       case OP_STARI:
-      case OP_MINSTARI:
       case OP_PLUSI:
-      case OP_MINPLUSI:
       case OP_POSSTARI:
       case OP_POSPLUSI:
 
       case OP_NOTSTAR:
-      case OP_NOTMINSTAR:
       case OP_NOTPLUS:
-      case OP_NOTMINPLUS:
       case OP_NOTPOSSTAR:
       case OP_NOTPOSPLUS:
 
       case OP_NOTSTARI:
-      case OP_NOTMINSTARI:
       case OP_NOTPLUSI:
-      case OP_NOTMINPLUSI:
       case OP_NOTPOSSTARI:
       case OP_NOTPOSPLUSI:
       accelerated_start = cc;
@@ -1399,9 +1461,17 @@ do
 #endif
       break;
 
+      case OP_EXACT:
+      if (count < 1)
+        count = 1;
+      cc += 2 + IMM2_SIZE;
+#ifdef SUPPORT_UNICODE
+      if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
+#endif
+      continue;
+
       case OP_UPTO:
       case OP_MINUPTO:
-      case OP_EXACT:
       case OP_POSUPTO:
       case OP_UPTOI:
       case OP_MINUPTOI:
@@ -1430,9 +1500,8 @@ do
       case OP_NOTQUERYI:
       case OP_NOTMINQUERYI:
       case OP_NOTPOSQUERYI:
-      fast_forward_allowed = FALSE;
-      if (count == 0)
-        count = 1;
+      if (count < 3)
+        count = 3;
       cc += 2;
 #ifdef SUPPORT_UNICODE
       if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
@@ -1452,10 +1521,14 @@ do
 
       switch (*cc)
         {
-        case OP_CRSTAR:
         case OP_CRMINSTAR:
-        case OP_CRPLUS:
         case OP_CRMINPLUS:
+        if (count == 2)
+          count = 3;
+        /* Fall through */
+
+        case OP_CRSTAR:
+        case OP_CRPLUS:
         case OP_CRPOSSTAR:
         case OP_CRPOSPLUS:
         cc++;
@@ -1464,44 +1537,60 @@ do
         case OP_CRRANGE:
         case OP_CRMINRANGE:
         case OP_CRPOSRANGE:
+        if (GET2(cc, 1) == GET2(cc, 1 + IMM2_SIZE))
+          {
+          /* Exact repeat. */
+          cc += 1 + 2 * IMM2_SIZE;
+          if (count < 1)
+            count = 1;
+          continue;
+          }
+
         cc += 2 * IMM2_SIZE;
         /* Fall through */
         case OP_CRQUERY:
         case OP_CRMINQUERY:
         case OP_CRPOSQUERY:
         cc++;
-        if (count == 0)
-          count = 1;
-        /* Fall through */
+        if (count < 3)
+          count = 3;
+        continue;
+
         default:
-        accelerated_start = NULL;
-        fast_forward_allowed = FALSE;
+        /* No repeat. */
+        if (count < 1)
+          count = 1;
         continue;
         }
       break;
 
-      case OP_ONCE:
       case OP_BRA:
       case OP_CBRA:
-      end = cc + GET(cc, 1);
+      prev_count = count;
+      if (count < 1)
+        count = 1;
 
-      prev_fast_forward_allowed = fast_forward_allowed;
-      fast_forward_allowed = FALSE;
       if (depth >= 4)
         break;
 
-      end = bracketend(cc) - (1 + LINK_SIZE);
-      if (*end != OP_KET || (*cc == OP_CBRA && common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0))
+      if (count < 3 && cc[GET(cc, 1)] == OP_ALT)
+        count = 3;
+
+      end = bracketend(cc);
+      if (end[-1 - LINK_SIZE] != OP_KET || (*cc == OP_CBRA && common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0))
         break;
 
-      count = detect_early_fail(common, cc, private_data_start, depth + 1, count, prev_fast_forward_allowed);
+      prev_count = detect_early_fail(common, cc, private_data_start, depth + 1, prev_count);
+
+      if (prev_count > count)
+        count = prev_count;
 
       if (PRIVATE_DATA(cc) != 0)
         common->private_data_ptrs[begin - common->start] = 1;
 
       if (count < EARLY_FAIL_ENHANCE_MAX)
         {
-        cc = end + (1 + LINK_SIZE);
+        cc = end;
         continue;
         }
       break;
@@ -1514,55 +1603,52 @@ do
       continue;
       }
 
-    if (accelerated_start != NULL)
+    if (accelerated_start == NULL)
+      break;
+
+    if (count == 0)
       {
-      if (count == 0)
-        {
-        count++;
+      common->fast_forward_bc_ptr = accelerated_start;
+      common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_skip;
+      *private_data_start += sizeof(sljit_sw);
+      count = 4;
+      }
+    else if (count < 3)
+      {
+      common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_fail;
 
-        if (fast_forward_allowed)
-          {
-          common->fast_forward_bc_ptr = accelerated_start;
-          common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_skip;
-          *private_data_start += sizeof(sljit_sw);
-          }
-        else
-          {
-          common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_fail;
+      if (common->early_fail_start_ptr == 0)
+        common->early_fail_start_ptr = *private_data_start;
 
-          if (common->early_fail_start_ptr == 0)
-            common->early_fail_start_ptr = *private_data_start;
+      *private_data_start += sizeof(sljit_sw);
+      common->early_fail_end_ptr = *private_data_start;
 
-          *private_data_start += sizeof(sljit_sw);
-          common->early_fail_end_ptr = *private_data_start;
+      if (*private_data_start > SLJIT_MAX_LOCAL_SIZE)
+        return EARLY_FAIL_ENHANCE_MAX;
 
-          if (*private_data_start > SLJIT_MAX_LOCAL_SIZE)
-            return EARLY_FAIL_ENHANCE_MAX;
-          }
-        }
-      else
-        {
-        common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_fail_range;
+      count = 4;
+      }
+    else
+      {
+      common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_fail_range;
 
-        if (common->early_fail_start_ptr == 0)
-          common->early_fail_start_ptr = *private_data_start;
+      if (common->early_fail_start_ptr == 0)
+        common->early_fail_start_ptr = *private_data_start;
 
-        *private_data_start += 2 * sizeof(sljit_sw);
-        common->early_fail_end_ptr = *private_data_start;
+      *private_data_start += 2 * sizeof(sljit_sw);
+      common->early_fail_end_ptr = *private_data_start;
 
-        if (*private_data_start > SLJIT_MAX_LOCAL_SIZE)
-          return EARLY_FAIL_ENHANCE_MAX;
-        }
+      if (*private_data_start > SLJIT_MAX_LOCAL_SIZE)
+        return EARLY_FAIL_ENHANCE_MAX;
 
-      /* Cannot be part of a repeat. */
-      common->private_data_ptrs[begin - common->start] = 1;
       count++;
-
-      if (count < EARLY_FAIL_ENHANCE_MAX)
-        continue;
       }
 
-    break;
+    /* Cannot be part of a repeat. */
+    common->private_data_ptrs[begin - common->start] = 1;
+
+    if (count >= EARLY_FAIL_ENHANCE_MAX)
+      break;
     }
 
   if (*cc != OP_ALT && *cc != OP_KET)
@@ -1795,7 +1881,6 @@ while (cc < ccend)
     case OP_ASSERTBACK:
     case OP_ASSERTBACK_NOT:
     case OP_ASSERT_NA:
-    case OP_ASSERTBACK_NA:
     case OP_ONCE:
     case OP_SCRIPT_RUN:
     case OP_BRAPOS:
@@ -1807,6 +1892,19 @@ while (cc < ccend)
     bracketlen = 1 + LINK_SIZE;
     break;
 
+    case OP_ASSERTBACK_NA:
+    common->private_data_ptrs[cc - common->start] = private_data_ptr;
+    private_data_ptr += sizeof(sljit_sw);
+
+    if (find_vreverse(cc))
+      {
+      common->private_data_ptrs[cc + 1 - common->start] = 1;
+      private_data_ptr += sizeof(sljit_sw);
+      }
+
+    bracketlen = 1 + LINK_SIZE;
+    break;
+
     case OP_CBRAPOS:
     case OP_SCBRAPOS:
     common->private_data_ptrs[cc - common->start] = private_data_ptr;
@@ -2106,6 +2204,9 @@ while (cc < ccend)
     case OP_CALLOUT:
     case OP_CALLOUT_STR:
 
+    case OP_NOT_UCP_WORD_BOUNDARY:
+    case OP_UCP_WORD_BOUNDARY:
+
     cc = next_opcode(common, cc);
     SLJIT_ASSERT(cc != NULL);
     break;
@@ -2261,7 +2362,7 @@ int i;
 for (i = 0; i < RECURSE_TMP_REG_COUNT; i++)
   {
   SLJIT_ASSERT(status->tmp_regs[i] >= 0);
-  SLJIT_ASSERT(sljit_get_register_index(status->saved_tmp_regs[i]) < 0 || status->tmp_regs[i] == status->saved_tmp_regs[i]);
+  SLJIT_ASSERT(sljit_get_register_index(SLJIT_GP_REGISTER, status->saved_tmp_regs[i]) < 0 || status->tmp_regs[i] == status->saved_tmp_regs[i]);
 
   status->store_bases[i] = -1;
   }
@@ -2281,7 +2382,7 @@ SLJIT_ASSERT(load_base > 0 && store_base
 if (status->store_bases[next_tmp_reg] == -1)
   {
   /* Preserve virtual registers. */
-  if (sljit_get_register_index(status->saved_tmp_regs[next_tmp_reg]) < 0)
+  if (sljit_get_register_index(SLJIT_GP_REGISTER, status->saved_tmp_regs[next_tmp_reg]) < 0)
     OP1(SLJIT_MOV, status->saved_tmp_regs[next_tmp_reg], 0, tmp_reg, 0);
   }
 else
@@ -2310,7 +2411,7 @@ for (i = 0; i < RECURSE_TMP_REG_COUNT; i
     OP1(SLJIT_MOV, SLJIT_MEM1(status->store_bases[next_tmp_reg]), status->store_offsets[next_tmp_reg], tmp_reg, 0);
 
     /* Restore virtual registers. */
-    if (sljit_get_register_index(saved_tmp_reg) < 0)
+    if (sljit_get_register_index(SLJIT_GP_REGISTER, saved_tmp_reg) < 0)
       OP1(SLJIT_MOV, tmp_reg, 0, saved_tmp_reg, 0);
     }
 
@@ -3047,8 +3148,16 @@ if (*cc == OP_COND || *cc == OP_SCOND)
   has_alternatives = FALSE;
 
 cc = next_opcode(common, cc);
+
 if (has_alternatives)
+  {
+  if (*cc == OP_REVERSE)
+    cc += 1 + IMM2_SIZE;
+  else if (*cc == OP_VREVERSE)
+    cc += 1 + 2 * IMM2_SIZE;
+
   current_offset = common->then_offsets + (cc - common->start);
+  }
 
 while (cc < end)
   {
@@ -3057,7 +3166,18 @@ while (cc < end)
   else
     {
     if (*cc == OP_ALT && has_alternatives)
-      current_offset = common->then_offsets + (cc + 1 + LINK_SIZE - common->start);
+      {
+      cc += 1 + LINK_SIZE;
+
+      if (*cc == OP_REVERSE)
+        cc += 1 + IMM2_SIZE;
+      else if (*cc == OP_VREVERSE)
+        cc += 1 + 2 * IMM2_SIZE;
+
+      current_offset = common->then_offsets + (cc - common->start);
+      continue;
+      }
+
     if (*cc >= OP_THEN && *cc <= OP_THEN_ARG && current_offset != NULL)
       *current_offset = 1;
     cc = next_opcode(common, cc);
@@ -3081,7 +3201,7 @@ return (value & (value - 1)) == 0;
 
 static SLJIT_INLINE void set_jumps(jump_list *list, struct sljit_label *label)
 {
-while (list)
+while (list != NULL)
   {
   /* sljit_set_label is clever enough to do nothing
   if either the jump or the label is NULL. */
@@ -3239,7 +3359,7 @@ if (size == sizeof(sljit_sw))
   return;
   }
 
-if (sljit_get_register_index(TMP3) >= 0 && !sljit_has_cpu_feature(SLJIT_HAS_ZERO_REGISTER))
+if (sljit_get_register_index(SLJIT_GP_REGISTER, TMP3) >= 0 && !sljit_has_cpu_feature(SLJIT_HAS_ZERO_REGISTER))
   {
   OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 0);
   src = TMP3;
@@ -3818,9 +3938,9 @@ if (common->invalid_utf)
     {
     OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
     OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000);
-    CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
+    SELECT(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR, TMP1);
     OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800);
-    CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
+    SELECT(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR, TMP1);
     }
   }
 #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
@@ -4058,9 +4178,9 @@ if (common->utf)
       OP2(SLJIT_ADD, RETURN_ADDR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
     OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP2, 0, SLJIT_IMM, 0x400);
     if (options & READ_CHAR_UPDATE_STR_PTR)
-      CMOV(SLJIT_LESS, STR_PTR, RETURN_ADDR, 0);
+      SELECT(SLJIT_LESS, STR_PTR, RETURN_ADDR, 0, STR_PTR);
     if (max >= 0xd800)
-      CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, 0x10000);
+      SELECT(SLJIT_LESS, TMP1, SLJIT_IMM, 0x10000, TMP1);
     }
   else
     {
@@ -4085,15 +4205,46 @@ if (common->invalid_utf)
     {
     OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
     OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000);
-    CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
+    SELECT(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR, TMP1);
     OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800);
-    CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
+    SELECT(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR, TMP1);
     }
   }
 #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
 #endif /* SUPPORT_UNICODE */
 }
 
+static void skip_valid_char(compiler_common *common)
+{
+DEFINE_COMPILER;
+#if (defined SUPPORT_UNICODE) && (PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16)
+struct sljit_jump *jump;
+#endif
+
+#if (defined SUPPORT_UNICODE) && (PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16)
+  if (common->utf)
+    {
+    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
+    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+#if PCRE2_CODE_UNIT_WIDTH == 8
+    jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0);
+    OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);
+    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+    jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800);
+    OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);
+    OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0xd800);
+    OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL);
+    OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
+    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
+#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
+    JUMPHERE(jump);
+    return;
+    }
+#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == [8|16] */
+  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+}
+
 #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
 
 static BOOL is_char7_bitset(const sljit_u8 *bitset, BOOL nclass)
@@ -4135,6 +4286,7 @@ if (negated)
 
   if (common->invalid_utf)
     {
+    OP1(SLJIT_MOV, TMP1, 0, TMP2, 0);
     add_jump(compiler, &common->utfreadchar_invalid, JUMP(SLJIT_FAST_CALL));
     add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR));
     OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
@@ -4242,7 +4394,7 @@ if (common->utf && negated)
       {
       OP2(SLJIT_ADD, RETURN_ADDR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
       OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP2, 0, SLJIT_IMM, 0x400);
-      CMOV(SLJIT_LESS, STR_PTR, RETURN_ADDR, 0);
+      SELECT(SLJIT_LESS, STR_PTR, RETURN_ADDR, 0, STR_PTR);
       }
     else
       {
@@ -4399,7 +4551,7 @@ of the character (>= 0xc0). Return char
 DEFINE_COMPILER;
 struct sljit_jump *jump;
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
 OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);
 OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);
@@ -4445,7 +4597,7 @@ DEFINE_COMPILER;
 struct sljit_jump *jump;
 struct sljit_jump *compare;
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 
 OP2U(SLJIT_AND | SLJIT_SET_Z, TMP2, 0, SLJIT_IMM, 0x20);
 jump = JUMP(SLJIT_NOT_ZERO);
@@ -4487,7 +4639,7 @@ struct sljit_label *three_byte_entry;
 struct sljit_label *exit_invalid_label;
 struct sljit_jump *exit_invalid[11];
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 
 OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc2);
 
@@ -4522,7 +4674,7 @@ OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0)
 if (has_cmov)
   {
   OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40);
-  CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, 0x20000);
+  SELECT(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, 0x20000, TMP1);
   exit_invalid[2] = NULL;
   }
 else
@@ -4537,7 +4689,7 @@ OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_I
 if (has_cmov)
   {
   OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, SLJIT_IMM, 0x800);
-  CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR - 0xd800);
+  SELECT(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR - 0xd800, TMP1);
   exit_invalid[3] = NULL;
   }
 else
@@ -4548,7 +4700,7 @@ OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, S
 if (has_cmov)
   {
   OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, SLJIT_IMM, 0x800);
-  CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
+  SELECT(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR, TMP1);
   exit_invalid[4] = NULL;
   }
 else
@@ -4565,7 +4717,7 @@ OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0)
 if (has_cmov)
   {
   OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40);
-  CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, 0);
+  SELECT(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, 0, TMP1);
   exit_invalid[5] = NULL;
   }
 else
@@ -4575,7 +4727,7 @@ OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_I
 if (has_cmov)
   {
   OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x100000);
-  CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR - 0x10000);
+  SELECT(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR - 0x10000, TMP1);
   exit_invalid[6] = NULL;
   }
 else
@@ -4612,7 +4764,7 @@ OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0)
 if (has_cmov)
   {
   OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40);
-  CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
+  SELECT(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR, TMP1);
   exit_invalid[10] = NULL;
   }
 else
@@ -4643,7 +4795,7 @@ struct sljit_label *skip_start;
 struct sljit_label *three_byte_exit;
 struct sljit_jump *jump[5];
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 
 if (common->nltype != NLTYPE_ANY)
   {
@@ -4734,7 +4886,7 @@ struct sljit_label *exit_ok_label;
 struct sljit_label *exit_invalid_label;
 struct sljit_jump *exit_invalid[7];
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 
 OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3));
 exit_invalid[0] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xc0);
@@ -4825,7 +4977,7 @@ static void do_utfpeakcharback(compiler_
 DEFINE_COMPILER;
 struct sljit_jump *jump[2];
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 
 OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2));
 OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0);
@@ -4868,7 +5020,7 @@ struct sljit_label *three_byte_entry;
 struct sljit_label *exit_invalid_label;
 struct sljit_jump *exit_invalid[8];
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 
 OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(3));
 exit_invalid[0] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xc0);
@@ -4905,7 +5057,7 @@ OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_I
 if (has_cmov)
   {
   OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, SLJIT_IMM, 0x800);
-  CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, -0xd800);
+  SELECT(SLJIT_LESS, TMP1, SLJIT_IMM, -0xd800, TMP1);
   exit_invalid[2] = NULL;
   }
 else
@@ -4915,7 +5067,7 @@ OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_I
 if (has_cmov)
   {
   OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, SLJIT_IMM, 0x800);
-  CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
+  SELECT(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR, TMP1);
   exit_invalid[3] = NULL;
   }
 else
@@ -4940,7 +5092,7 @@ OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0
 if (has_cmov)
   {
   OP2U(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x100000);
-  CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR - 0x10000);
+  SELECT(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR - 0x10000, TMP1);
   exit_invalid[5] = NULL;
   }
 else
@@ -5000,7 +5152,7 @@ undefined for invalid characters. */
 DEFINE_COMPILER;
 struct sljit_jump *exit_invalid[3];
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 
 /* TMP2 contains the high surrogate. */
 exit_invalid[0] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xdc00);
@@ -5033,7 +5185,7 @@ char value in TMP1. */
 DEFINE_COMPILER;
 struct sljit_jump *exit_invalid[2];
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 
 /* TMP2 contains the high surrogate. */
 exit_invalid[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
@@ -5062,7 +5214,7 @@ static void do_utfmoveback_invalid(compi
 DEFINE_COMPILER;
 struct sljit_jump *exit_invalid[3];
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 
 exit_invalid[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x400);
 exit_invalid[1] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, STR_PTR, 0);
@@ -5091,7 +5243,7 @@ DEFINE_COMPILER;
 struct sljit_jump *jump;
 struct sljit_jump *exit_invalid[3];
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 
 jump = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xe000);
 OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
@@ -5140,7 +5292,7 @@ SLJIT_ASSERT(record->caseset == 0 && rec
 
 SLJIT_ASSERT(UCD_BLOCK_SIZE == 128 && sizeof(ucd_record) == 12);
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 
 #if PCRE2_CODE_UNIT_WIDTH == 32
 if (!common->utf)
@@ -5180,7 +5332,7 @@ SLJIT_ASSERT(record->caseset == 0 && rec
 
 SLJIT_ASSERT(UCD_BLOCK_SIZE == 128 && sizeof(ucd_record) == 12);
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 
 #if PCRE2_CODE_UNIT_WIDTH == 32
 if (!common->utf)
@@ -5379,7 +5531,7 @@ else if (common->utf)
     {
     OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
     OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, SLJIT_IMM, 0x400);
-    CMOV(SLJIT_LESS, STR_PTR, TMP2, 0);
+    SELECT(SLJIT_LESS, STR_PTR, TMP2, 0, STR_PTR);
     }
   else
     {
@@ -5486,6 +5638,8 @@ while (TRUE)
     case OP_CIRCM:
     case OP_DOLL:
     case OP_DOLLM:
+    case OP_NOT_UCP_WORD_BOUNDARY:
+    case OP_UCP_WORD_BOUNDARY:
     /* Zero width assertions. */
     cc++;
     continue;
@@ -5869,6 +6023,7 @@ static BOOL check_fast_forward_char_pair
 {
   sljit_s32 i, j, max_i = 0, max_j = 0;
   sljit_u32 max_pri = 0;
+  sljit_s32 max_offset = max_fast_forward_char_pair_offset();
   PCRE2_UCHAR a1, a2, a_pri, b1, b2, b_pri;
 
   for (i = max - 1; i >= 1; i--)
@@ -5879,7 +6034,7 @@ static BOOL check_fast_forward_char_pair
       a2 = chars[i].chars[1];
       a_pri = chars[i].last_count;
 
-      j = i - max_fast_forward_char_pair_offset();
+      j = i - max_offset;
       if (j < 0)
         j = 0;
 
@@ -5935,7 +6090,7 @@ if (has_match_end)
 
   OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(offset + 1));
   OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_END, 0, TMP1, 0);
-  CMOV(SLJIT_GREATER, STR_END, TMP1, 0);
+  SELECT(SLJIT_GREATER, STR_END, TMP1, 0, STR_END);
   }
 
 #ifdef JIT_HAS_FAST_FORWARD_CHAR_SIMD
@@ -6138,7 +6293,7 @@ if (common->match_end_ptr != 0)
   OP2(SLJIT_SUB | SLJIT_SET_LESS, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max));
   add_jump(compiler, &common->failed_match, JUMP(SLJIT_LESS));
   OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_END, 0, TMP1, 0);
-  CMOV(SLJIT_GREATER, STR_END, TMP1, 0);
+  SELECT(SLJIT_GREATER, STR_END, TMP1, 0, STR_END);
   }
 else
   {
@@ -6368,7 +6523,7 @@ if (JIT_HAS_FAST_FORWARD_CHAR_SIMD && (c
     if (common->mode != PCRE2_JIT_COMPLETE)
       {
       OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_PTR, 0, STR_END, 0);
-      CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0);
+      SELECT(SLJIT_GREATER, STR_PTR, STR_END, 0, STR_PTR);
       }
     }
   }
@@ -6430,7 +6585,7 @@ if (common->match_end_ptr != 0)
   OP1(SLJIT_MOV, RETURN_ADDR, 0, STR_END, 0);
   OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
   OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_END, 0, TMP1, 0);
-  CMOV(SLJIT_GREATER, STR_END, TMP1, 0);
+  SELECT(SLJIT_GREATER, STR_END, TMP1, 0, STR_END);
   }
 
 start = LABEL();
@@ -6567,13 +6722,14 @@ DEFINE_COMPILER;
 struct sljit_jump *jump;
 struct sljit_label *mainloop;
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 GET_LOCAL_BASE(TMP1, 0, 0);
 
 /* Drop frames until we reach STACK_TOP. */
 mainloop = LABEL();
 OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), -SSIZE_OF(sw));
-jump = CMP(SLJIT_SIG_LESS_EQUAL, TMP2, 0, SLJIT_IMM, 0);
+OP2U(SLJIT_SUB | SLJIT_SET_SIG_LESS_EQUAL | SLJIT_SET_Z, TMP2, 0, SLJIT_IMM, 0);
+jump = JUMP(SLJIT_SIG_LESS_EQUAL);
 
 OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
 if (HAS_VIRTUAL_REGISTERS)
@@ -6594,7 +6750,8 @@ else
 JUMPTO(SLJIT_JUMP, mainloop);
 
 JUMPHERE(jump);
-jump = CMP(SLJIT_NOT_ZERO /* SIG_LESS */, TMP2, 0, SLJIT_IMM, 0);
+sljit_set_current_flags(compiler, SLJIT_CURRENT_FLAGS_SUB | SLJIT_CURRENT_FLAGS_COMPARE | SLJIT_SET_SIG_LESS_EQUAL | SLJIT_SET_Z);
+jump = JUMP(SLJIT_NOT_ZERO /* SIG_LESS */);
 /* End of reverting values. */
 OP_SRC(SLJIT_FAST_RETURN, RETURN_ADDR, 0);
 
@@ -6615,7 +6772,17 @@ else
 JUMPTO(SLJIT_JUMP, mainloop);
 }
 
-static void check_wordboundary(compiler_common *common)
+#ifdef SUPPORT_UNICODE
+#define UCPCAT(bit) (1 << (bit))
+#define UCPCAT2(bit1, bit2) (UCPCAT(bit1) | UCPCAT(bit2))
+#define UCPCAT3(bit1, bit2, bit3) (UCPCAT(bit1) | UCPCAT(bit2) | UCPCAT(bit3))
+#define UCPCAT_RANGE(start, end) (((1 << ((end) + 1)) - 1) - ((1 << (start)) - 1))
+#define UCPCAT_L UCPCAT_RANGE(ucp_Ll, ucp_Lu)
+#define UCPCAT_N UCPCAT_RANGE(ucp_Nd, ucp_No)
+#define UCPCAT_ALL ((1 << (ucp_Zs + 1)) - 1)
+#endif
+
+static void check_wordboundary(compiler_common *common, BOOL ucp)
 {
 DEFINE_COMPILER;
 struct sljit_jump *skipread;
@@ -6629,9 +6796,10 @@ jump_list *invalid_utf2 = NULL;
 struct sljit_jump *jump;
 #endif /* PCRE2_CODE_UNIT_WIDTH != 8 || SUPPORT_UNICODE */
 
+SLJIT_UNUSED_ARG(ucp);
 SLJIT_COMPILE_ASSERT(ctype_word == 0x10, ctype_word_must_be_16);
 
-sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, SLJIT_MEM1(SLJIT_SP), LOCALS0);
 /* Get type of the previous char, and put it to TMP3. */
 OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
 OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
@@ -6668,19 +6836,12 @@ else
 
 /* Testing char type. */
 #ifdef SUPPORT_UNICODE
-if (common->ucp)
+if (ucp)
   {
-  OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1);
-  jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE);
   add_jump(compiler, &common->getucdtype, JUMP(SLJIT_FAST_CALL));
-  OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Ll);
-  OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll);
-  OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
-  OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Nd - ucp_Ll);
-  OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, ucp_No - ucp_Nd);
-  OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
-  JUMPHERE(jump);
-  OP1(SLJIT_MOV, TMP3, 0, TMP2, 0);
+  OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP1, 0);
+  OP2U(SLJIT_AND | SLJIT_SET_Z, TMP2, 0, SLJIT_IMM, UCPCAT2(ucp_Mn, ucp_Pc) | UCPCAT_L | UCPCAT_N);
+  OP_FLAGS(SLJIT_MOV, TMP3, 0, SLJIT_NOT_ZERO);
   }
 else
 #endif /* SUPPORT_UNICODE */
@@ -6714,18 +6875,12 @@ peek_char(common, READ_CHAR_MAX, SLJIT_M
 
 valid_utf = LABEL();
 
-if (common->ucp)
+if (ucp)
   {
-  OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1);
-  jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE);
   add_jump(compiler, &common->getucdtype, JUMP(SLJIT_FAST_CALL));
-  OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Ll);
-  OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll);
-  OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
-  OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Nd - ucp_Ll);
-  OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, ucp_No - ucp_Nd);
-  OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
-  JUMPHERE(jump);
+  OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP1, 0);
+  OP2U(SLJIT_AND | SLJIT_SET_Z, TMP2, 0, SLJIT_IMM, UCPCAT2(ucp_Mn, ucp_Pc) | UCPCAT_L | UCPCAT_N);
+  OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_NOT_ZERO);
   }
 else
 #endif /* SUPPORT_UNICODE */
@@ -7003,7 +7158,7 @@ while (i < len)
   else
     {
     OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, char_list[i]);
-    CMOV(SLJIT_ZERO, TMP2, TMP1, 0);
+    SELECT(SLJIT_ZERO, TMP2, TMP1, 0, TMP2);
     }
   i++;
   }
@@ -7017,7 +7172,7 @@ if (j != 0)
       {
       j--;
       OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, char_list[i] & 0xff);
-      CMOV(SLJIT_ZERO, TMP2, TMP1, 0);
+      SELECT(SLJIT_ZERO, TMP2, TMP1, 0, TMP2);
       }
   }
 
@@ -7042,7 +7197,7 @@ static void check_anynewline(compiler_co
 /* Check whether TMP1 contains a newline character. TMP2 destroyed. */
 DEFINE_COMPILER;
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 
 OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x0a);
 OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a);
@@ -7069,7 +7224,7 @@ static void check_hspace(compiler_common
 /* Check whether TMP1 contains a newline character. TMP2 destroyed. */
 DEFINE_COMPILER;
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 
 OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x09);
 OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);
@@ -7108,7 +7263,7 @@ static void check_vspace(compiler_common
 /* Check whether TMP1 contains a newline character. TMP2 destroyed. */
 DEFINE_COMPILER;
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, RETURN_ADDR, 0);
 
 OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x0a);
 OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a);
@@ -7150,7 +7305,7 @@ else
   char2_reg = RETURN_ADDR;
   }
 
-sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, SLJIT_MEM1(SLJIT_SP), LOCALS0);
 OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
 
 if (char1_reg == STR_END)
@@ -7237,7 +7392,7 @@ if (sljit_emit_mem_update(compiler, MOV_
 else if (sljit_emit_mem_update(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)
   opt_type = 2;
 
-sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, SLJIT_MEM1(SLJIT_SP), LOCALS0);
 OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
 
 OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, char1_reg, 0);
@@ -7464,16 +7619,6 @@ return cc;
 
 #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
 
-#define SET_TYPE_OFFSET(value) \
-  if ((value) != typeoffset) \
-    { \
-    if ((value) < typeoffset) \
-      OP2(SLJIT_ADD, typereg, 0, typereg, 0, SLJIT_IMM, typeoffset - (value)); \
-    else \
-      OP2(SLJIT_SUB, typereg, 0, typereg, 0, SLJIT_IMM, (value) - typeoffset); \
-    } \
-  typeoffset = (value);
-
 #define SET_CHAR_OFFSET(value) \
   if ((value) != charoffset) \
     { \
@@ -7498,7 +7643,6 @@ static PCRE2_SPTR compile_char1_matching
 #define XCLASS_SCRIPT_EXTENSION_NOTPROP 0x080
 #define XCLASS_SCRIPT_EXTENSION_RESTORE_RETURN_ADDR 0x100
 #define XCLASS_SCRIPT_EXTENSION_RESTORE_LOCALS0 0x200
-
 #endif /* SUPPORT_UNICODE */
 
 static void compile_xclass_matchingpath(compiler_common *common, PCRE2_SPTR cc, jump_list **backtracks)
@@ -7516,9 +7660,10 @@ BOOL utf = common->utf;
 
 #ifdef SUPPORT_UNICODE
 sljit_u32 unicode_status = 0;
+sljit_u32 category_list = 0;
+sljit_u32 items;
 int typereg = TMP1;
 const sljit_u32 *other_cases;
-sljit_uw typeoffset;
 #endif /* SUPPORT_UNICODE */
 
 /* Scanning the necessary info. */
@@ -7535,6 +7680,7 @@ if (cc[-1] & XCL_MAP)
 while (*cc != XCL_END)
   {
   compares++;
+
   if (*cc == XCL_SINGLE)
     {
     cc ++;
@@ -7561,6 +7707,7 @@ while (*cc != XCL_END)
     {
     SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
     cc++;
+
     if (*cc == PT_CLIST && cc[-1] == XCL_PROP)
       {
       other_cases = PRIV(ucd_caseless_sets) + cc[1];
@@ -7577,24 +7724,36 @@ while (*cc != XCL_END)
       min = 0;
       }
 
+    items = 0;
+
     switch(*cc)
       {
       case PT_ANY:
       /* Any either accepts everything or ignored. */
       if (cc[-1] == XCL_PROP)
-        {
-        compile_char1_matchingpath(common, OP_ALLANY, cc, backtracks, FALSE);
-        if (list == backtracks)
-          add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
-        return;
-        }
+        items = UCPCAT_ALL;
+      else
+        compares--;
       break;
 
       case PT_LAMP:
+      items = UCPCAT3(ucp_Lu, ucp_Ll, ucp_Lt);
+      break;
+
       case PT_GC:
+      items = UCPCAT_RANGE(PRIV(ucp_typerange)[(int)cc[1] * 2], PRIV(ucp_typerange)[(int)cc[1] * 2 + 1]);
+      break;
+
       case PT_PC:
+      items = UCPCAT(cc[1]);
+      break;
+
+      case PT_WORD:
+      items = UCPCAT2(ucp_Mn, ucp_Pc) | UCPCAT_L | UCPCAT_N;
+      break;
+
       case PT_ALNUM:
-      unicode_status |= XCLASS_HAS_TYPE;
+      items = UCPCAT_L | UCPCAT_N;
       break;
 
       case PT_SCX:
@@ -7613,7 +7772,6 @@ while (*cc != XCL_END)
 
       case PT_SPACE:
       case PT_PXSPACE:
-      case PT_WORD:
       case PT_PXGRAPH:
       case PT_PXPRINT:
       case PT_PXPUNCT:
@@ -7622,6 +7780,7 @@ while (*cc != XCL_END)
 
       case PT_CLIST:
       case PT_UCNC:
+      case PT_PXXDIGIT:
       unicode_status |= XCLASS_SAVE_CHAR;
       break;
 
@@ -7637,11 +7796,42 @@ while (*cc != XCL_END)
       SLJIT_UNREACHABLE();
       break;
       }
+
+    if (items > 0)
+      {
+      if (cc[-1] == XCL_NOTPROP)
+        items ^= UCPCAT_ALL;
+      category_list |= items;
+      unicode_status |= XCLASS_HAS_TYPE;
+      compares--;
+      }
+
     cc += 2;
     }
 #endif /* SUPPORT_UNICODE */
   }
+
+#ifdef SUPPORT_UNICODE
+if (category_list == UCPCAT_ALL)
+  {
+  /* All characters are accepted, same as dotall. */
+  compile_char1_matchingpath(common, OP_ALLANY, cc, backtracks, FALSE);
+  if (list == backtracks)
+    add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
+  return;
+  }
+
+if (compares == 0 && category_list == 0)
+  {
+  /* No characters are accepted, same as (*F) or dotall. */
+  compile_char1_matchingpath(common, OP_ALLANY, cc, backtracks, FALSE);
+  if (list != backtracks)
+    add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
+  return;
+  }
+#else /* !SUPPORT_UNICODE */
 SLJIT_ASSERT(compares > 0);
+#endif /* SUPPORT_UNICODE */
 
 /* We are not necessary in utf mode even in 8 bit mode. */
 cc = ccbegin;
@@ -7742,6 +7932,9 @@ if (unicode_status & XCLASS_NEEDS_UCD)
 
   ccbegin = cc;
 
+  if (category_list != 0)
+    compares++;
+
   if (unicode_status & XCLASS_HAS_BIDICL)
     {
     OP1(SLJIT_MOV_U16, TMP1, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, scriptx_bidiclass));
@@ -7946,7 +8139,16 @@ if (unicode_status & XCLASS_NEEDS_UCD)
     if (unicode_status & XCLASS_SAVE_CHAR)
       typereg = RETURN_ADDR;
 
-    OP1(SLJIT_MOV_U8, typereg, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));
+    OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));
+    OP2(SLJIT_SHL, typereg, 0, SLJIT_IMM, 1, TMP2, 0);
+
+    if (category_list > 0)
+      {
+      compares--;
+      invertcmp = (compares == 0 && list != backtracks);
+      OP2U(SLJIT_AND | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, category_list);
+      add_jump(compiler, compares > 0 ? list : backtracks, JUMP(SLJIT_NOT_ZERO ^ invertcmp));
+      }
     }
   }
 #endif /* SUPPORT_UNICODE */
@@ -7954,9 +8156,6 @@ if (unicode_status & XCLASS_NEEDS_UCD)
 /* Generating code. */
 charoffset = 0;
 numberofcmps = 0;
-#ifdef SUPPORT_UNICODE
-typeoffset = 0;
-#endif /* SUPPORT_UNICODE */
 
 while (*cc != XCL_END)
   {
@@ -8024,36 +8223,17 @@ while (*cc != XCL_END)
     switch(*cc)
       {
       case PT_ANY:
-      if (!invertcmp)
-        jump = JUMP(SLJIT_JUMP);
-      break;
-
       case PT_LAMP:
-      OP2U(SLJIT_SUB | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, ucp_Lu - typeoffset);
-      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);
-      OP2U(SLJIT_SUB | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, ucp_Ll - typeoffset);
-      OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
-      OP2U(SLJIT_SUB | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, ucp_Lt - typeoffset);
-      OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);
-      jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
-      break;
-
       case PT_GC:
-      c = PRIV(ucp_typerange)[(int)cc[1] * 2];
-      SET_TYPE_OFFSET(c);
-      jump = CMP(SLJIT_LESS_EQUAL ^ invertcmp, typereg, 0, SLJIT_IMM, PRIV(ucp_typerange)[(int)cc[1] * 2 + 1] - c);
-      break;
-
       case PT_PC:
-      jump = CMP(SLJIT_EQUAL ^ invertcmp, typereg, 0, SLJIT_IMM, (int)cc[1] - typeoffset);
-      break;
-
       case PT_SC:
       case PT_SCX:
       case PT_BOOL:
       case PT_BIDICL:
+      case PT_WORD:
+      case PT_ALNUM:
       compares++;
-      /* Do nothing. */
+      /* Already handled. */
       break;
 
       case PT_SPACE:
@@ -8068,24 +8248,8 @@ while (*cc != XCL_END)
       OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x180e - 0x9);
       OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
 
-      SET_TYPE_OFFSET(ucp_Zl);
-      OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, typereg, 0, SLJIT_IMM, ucp_Zs - ucp_Zl);
-      OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL);
-      jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
-      break;
-
-      case PT_WORD:
-      OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_UNDERSCORE - charoffset));
-      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);
-      /* Fall through. */
-
-      case PT_ALNUM:
-      SET_TYPE_OFFSET(ucp_Ll);
-      OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, typereg, 0, SLJIT_IMM, ucp_Lu - ucp_Ll);
-      OP_FLAGS((*cc == PT_ALNUM) ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
-      SET_TYPE_OFFSET(ucp_Nd);
-      OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, typereg, 0, SLJIT_IMM, ucp_No - ucp_Nd);
-      OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL);
+      OP2U(SLJIT_AND | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, UCPCAT_RANGE(ucp_Zl, ucp_Zs));
+      OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_NOT_ZERO);
       jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
       break;
 
@@ -8160,13 +8324,13 @@ while (*cc != XCL_END)
       break;
 
       case PT_PXGRAPH:
-      /* C and Z groups are the farthest two groups. */
-      SET_TYPE_OFFSET(ucp_Ll);
-      OP2U(SLJIT_SUB | SLJIT_SET_GREATER, typereg, 0, SLJIT_IMM, ucp_So - ucp_Ll);
-      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_GREATER);
+      OP2U(SLJIT_AND | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, UCPCAT_RANGE(ucp_Cc, ucp_Cs) | UCPCAT_RANGE(ucp_Zl, ucp_Zs));
+      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_NOT_ZERO);
 
-      jump = CMP(SLJIT_NOT_EQUAL, typereg, 0, SLJIT_IMM, ucp_Cf - ucp_Ll);
+      OP2U(SLJIT_AND | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, UCPCAT(ucp_Cf));
+      jump = JUMP(SLJIT_ZERO);
 
+      c = charoffset;
       /* In case of ucp_Cf, we overwrite the result. */
       SET_CHAR_OFFSET(0x2066);
       OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, 0x2069 - 0x2066);
@@ -8178,21 +8342,21 @@ while (*cc != XCL_END)
       OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x180e - 0x2066);
       OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
 
+      /* Restore charoffset. */
+      SET_CHAR_OFFSET(c);
+
       JUMPHERE(jump);
       jump = CMP(SLJIT_ZERO ^ invertcmp, TMP2, 0, SLJIT_IMM, 0);
       break;
 
       case PT_PXPRINT:
-      /* C and Z groups are the farthest two groups. */
-      SET_TYPE_OFFSET(ucp_Ll);
-      OP2U(SLJIT_SUB | SLJIT_SET_GREATER, typereg, 0, SLJIT_IMM, ucp_So - ucp_Ll);
-      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_GREATER);
-
-      OP2U(SLJIT_SUB | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, ucp_Zs - ucp_Ll);
-      OP_FLAGS(SLJIT_AND, TMP2, 0, SLJIT_NOT_EQUAL);
+      OP2U(SLJIT_AND | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, UCPCAT_RANGE(ucp_Cc, ucp_Cs) | UCPCAT2(ucp_Zl, ucp_Zp));
+      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_NOT_ZERO);
 
-      jump = CMP(SLJIT_NOT_EQUAL, typereg, 0, SLJIT_IMM, ucp_Cf - ucp_Ll);
+      OP2U(SLJIT_AND | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, UCPCAT(ucp_Cf));
+      jump = JUMP(SLJIT_ZERO);
 
+      c = charoffset;
       /* In case of ucp_Cf, we overwrite the result. */
       SET_CHAR_OFFSET(0x2066);
       OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, 0x2069 - 0x2066);
@@ -8201,22 +8365,54 @@ while (*cc != XCL_END)
       OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0x061c - 0x2066);
       OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);
 
+      /* Restore charoffset. */
+      SET_CHAR_OFFSET(c);
+
       JUMPHERE(jump);
       jump = CMP(SLJIT_ZERO ^ invertcmp, TMP2, 0, SLJIT_IMM, 0);
       break;
 
       case PT_PXPUNCT:
-      SET_TYPE_OFFSET(ucp_Sc);
-      OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, typereg, 0, SLJIT_IMM, ucp_So - ucp_Sc);
-      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
+      OP2U(SLJIT_AND | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, UCPCAT_RANGE(ucp_Sc, ucp_So));
+      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_NOT_ZERO);
 
       SET_CHAR_OFFSET(0);
       OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, 0x7f);
       OP_FLAGS(SLJIT_AND, TMP2, 0, SLJIT_LESS_EQUAL);
 
-      SET_TYPE_OFFSET(ucp_Pc);
-      OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, typereg, 0, SLJIT_IMM, ucp_Ps - ucp_Pc);
-      OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL);
+      OP2U(SLJIT_AND | SLJIT_SET_Z, typereg, 0, SLJIT_IMM, UCPCAT_RANGE(ucp_Pc, ucp_Ps));
+      OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_NOT_ZERO);
+      jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
+      break;
+
+      case PT_PXXDIGIT:
+      SET_CHAR_OFFSET(CHAR_A);
+      OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, ~0x20);
+      OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP2, 0, SLJIT_IMM, CHAR_F - CHAR_A);
+      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
+
+      SET_CHAR_OFFSET(CHAR_0);
+      OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_9 - CHAR_0);
+      OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
+
+      SET_CHAR_OFFSET(0xff10);
+      jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 0xff46 - 0xff10);
+
+      OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, 0xff19 - 0xff10);
+      OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
+
+      SET_CHAR_OFFSET(0xff21);
+      OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, 0xff26 - 0xff21);
+      OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
+
+      SET_CHAR_OFFSET(0xff41);
+      OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, 0xff46 - 0xff41);
+      OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
+
+      SET_CHAR_OFFSET(0xff10);
+
+      JUMPHERE(jump);
+      OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, SLJIT_IMM, 0);
       jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
       break;
 
@@ -8232,6 +8428,7 @@ while (*cc != XCL_END)
     add_jump(compiler, compares > 0 ? list : backtracks, jump);
   }
 
+SLJIT_ASSERT(compares == 0);
 if (found != NULL)
   set_jumps(found, LABEL());
 }
@@ -8244,11 +8441,7 @@ if (found != NULL)
 static PCRE2_SPTR compile_simple_assertion_matchingpath(compiler_common *common, PCRE2_UCHAR type, PCRE2_SPTR cc, jump_list **backtracks)
 {
 DEFINE_COMPILER;
-int length;
 struct sljit_jump *jump[4];
-#ifdef SUPPORT_UNICODE
-struct sljit_label *label;
-#endif /* SUPPORT_UNICODE */
 
 switch(type)
   {
@@ -8276,16 +8469,18 @@ switch(type)
 
   case OP_NOT_WORD_BOUNDARY:
   case OP_WORD_BOUNDARY:
-  add_jump(compiler, &common->wordboundary, JUMP(SLJIT_FAST_CALL));
+  case OP_NOT_UCP_WORD_BOUNDARY:
+  case OP_UCP_WORD_BOUNDARY:
+  add_jump(compiler, (type == OP_NOT_WORD_BOUNDARY || type == OP_WORD_BOUNDARY) ? &common->wordboundary : &common->ucp_wordboundary, JUMP(SLJIT_FAST_CALL));
 #ifdef SUPPORT_UNICODE
   if (common->invalid_utf)
     {
-    add_jump(compiler, backtracks, CMP((type == OP_NOT_WORD_BOUNDARY) ? SLJIT_NOT_EQUAL : SLJIT_SIG_LESS_EQUAL, TMP2, 0, SLJIT_IMM, 0));
+    add_jump(compiler, backtracks, CMP((type == OP_NOT_WORD_BOUNDARY || type == OP_NOT_UCP_WORD_BOUNDARY) ? SLJIT_NOT_EQUAL : SLJIT_SIG_LESS_EQUAL, TMP2, 0, SLJIT_IMM, 0));
     return cc;
     }
 #endif /* SUPPORT_UNICODE */
   sljit_set_current_flags(compiler, SLJIT_SET_Z);
-  add_jump(compiler, backtracks, JUMP(type == OP_NOT_WORD_BOUNDARY ? SLJIT_NOT_ZERO : SLJIT_ZERO));
+  add_jump(compiler, backtracks, JUMP((type == OP_NOT_WORD_BOUNDARY || type == OP_NOT_UCP_WORD_BOUNDARY) ? SLJIT_NOT_ZERO : SLJIT_ZERO));
   return cc;
 
   case OP_EODN:
@@ -8481,36 +8676,6 @@ switch(type)
     }
   JUMPHERE(jump[0]);
   return cc;
-
-  case OP_REVERSE:
-  length = GET(cc, 0);
-  if (length == 0)
-    return cc + LINK_SIZE;
-  if (HAS_VIRTUAL_REGISTERS)
-    {
-    OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
-    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
-    }
-  else
-    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
-#ifdef SUPPORT_UNICODE
-  if (common->utf)
-    {
-    OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, length);
-    label = LABEL();
-    add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0));
-    move_back(common, backtracks, FALSE);
-    OP2(SLJIT_SUB | SLJIT_SET_Z, TMP3, 0, TMP3, 0, SLJIT_IMM, 1);
-    JUMPTO(SLJIT_NOT_ZERO, label);
-    }
-  else
-#endif
-    {
-    OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(length));
-    add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0));
-    }
-  check_start_used_ptr(common);
-  return cc + LINK_SIZE;
   }
 SLJIT_UNREACHABLE();
 return cc;
@@ -8667,7 +8832,7 @@ c = *cc++;
 
 #if PCRE2_CODE_UNIT_WIDTH == 32
 if (c >= 0x110000)
-  return NULL;
+  return cc;
 #endif /* PCRE2_CODE_UNIT_WIDTH == 32 */
 lgb = UCD_GRAPHBREAK(c);
 
@@ -8809,35 +8974,14 @@ switch(type)
   if (check_str_ptr)
     detect_partial_match(common, backtracks);
 #ifdef SUPPORT_UNICODE
-  if (common->utf)
+  if (common->utf && common->invalid_utf)
     {
-    if (common->invalid_utf)
-      {
-      read_char(common, 0, READ_CHAR_MAX, backtracks, READ_CHAR_UPDATE_STR_PTR);
-      return cc;
-      }
-
-#if PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16
-    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
-    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
-#if PCRE2_CODE_UNIT_WIDTH == 8
-    jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0);
-    OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);
-    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
-#elif PCRE2_CODE_UNIT_WIDTH == 16
-    jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800);
-    OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);
-    OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, 0xd800);
-    OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL);
-    OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
-    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
-#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
-    JUMPHERE(jump[0]);
+    read_char(common, 0, READ_CHAR_MAX, backtracks, READ_CHAR_UPDATE_STR_PTR);
     return cc;
-#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16] */
     }
 #endif /* SUPPORT_UNICODE */
-  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+
+  skip_valid_char(common);
   return cc;
 
   case OP_ANYBYTE:
@@ -8928,7 +9072,7 @@ switch(type)
 #else
   sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W), SLJIT_IMM,
     common->invalid_utf ? SLJIT_FUNC_ADDR(do_extuni_utf_invalid) : SLJIT_FUNC_ADDR(do_extuni_no_utf));
-  if (!common->utf || common->invalid_utf)
+  if (common->invalid_utf)
     add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0));
 #endif
 
@@ -8990,7 +9134,7 @@ switch(type)
   if (sljit_has_cpu_feature(SLJIT_HAS_CMOV))
     {
     OP2U(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, SLJIT_IMM, oc);
-    CMOV(SLJIT_EQUAL, TMP1, SLJIT_IMM, c);
+    SELECT(SLJIT_EQUAL, TMP1, SLJIT_IMM, c, TMP1);
     add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, c));
     }
   else
@@ -9509,14 +9653,16 @@ if (!minimize)
     if (ref)
       OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));
     OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
+
     if (ref)
       {
-      add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)));
+      if (!common->unset_backref)
+        add_jump(compiler, &backtrack->own_backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)));
       zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));
       }
     else
       {
-      compile_dnref_search(common, ccbegin, &backtrack->topbacktracks);
+      compile_dnref_search(common, ccbegin, &backtrack->own_backtracks);
       OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0);
       OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, TMP2, 0);
       zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));
@@ -9529,7 +9675,7 @@ if (!minimize)
   label = LABEL();
   if (!ref)
     OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1);
-  compile_ref_matchingpath(common, ccbegin, &backtrack->topbacktracks, FALSE, FALSE);
+  compile_ref_matchingpath(common, ccbegin, &backtrack->own_backtracks, FALSE, FALSE);
 
   if (min > 1 || max > 1)
     {
@@ -9591,12 +9737,13 @@ else
   {
   if (ref)
     {
-    add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)));
+    if (!common->unset_backref)
+      add_jump(compiler, &backtrack->own_backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)));
     zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));
     }
   else
     {
-    compile_dnref_search(common, ccbegin, &backtrack->topbacktracks);
+    compile_dnref_search(common, ccbegin, &backtrack->own_backtracks);
     OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0);
     OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP2, 0);
     zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));
@@ -9605,11 +9752,11 @@ else
 
 BACKTRACK_AS(ref_iterator_backtrack)->matchingpath = LABEL();
 if (max > 0)
-  add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, max));
+  add_jump(compiler, &backtrack->own_backtracks, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, max));
 
 if (!ref)
   OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(2));
-compile_ref_matchingpath(common, ccbegin, &backtrack->topbacktracks, TRUE, TRUE);
+compile_ref_matchingpath(common, ccbegin, &backtrack->own_backtracks, TRUE, TRUE);
 OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
 
 if (min > 1)
@@ -9684,12 +9831,12 @@ if (entry->entry_label == NULL)
 else
   JUMPTO(SLJIT_FAST_CALL, entry->entry_label);
 /* Leave if the match is failed. */
-add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0));
+add_jump(compiler, &backtrack->own_backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0));
 BACKTRACK_AS(recurse_backtrack)->matchingpath = LABEL();
 return cc + 1 + LINK_SIZE;
 }
 
-static sljit_s32 SLJIT_FUNC do_callout_jit(struct jit_arguments *arguments, pcre2_callout_block *callout_block, PCRE2_SPTR *jit_ovector)
+static sljit_s32 SLJIT_FUNC SLJIT_FUNC_ATTRIBUTE do_callout_jit(struct jit_arguments *arguments, pcre2_callout_block *callout_block, PCRE2_SPTR *jit_ovector)
 {
 PCRE2_SPTR begin;
 PCRE2_SIZE *ovector;
@@ -9812,7 +9959,7 @@ free_stack(common, callout_arg_size);
 
 /* Check return value. */
 OP2U(SLJIT_SUB32 | SLJIT_SET_Z | SLJIT_SET_SIG_GREATER, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
-add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER));
+add_jump(compiler, &backtrack->own_backtracks, JUMP(SLJIT_SIG_GREATER));
 if (common->abort_label == NULL)
   add_jump(compiler, &common->abort, JUMP(SLJIT_NOT_EQUAL) /* SIG_LESS */);
 else
@@ -9823,6 +9970,106 @@ return cc + callout_length;
 #undef CALLOUT_ARG_SIZE
 #undef CALLOUT_ARG_OFFSET
 
+static PCRE2_SPTR compile_reverse_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
+{
+DEFINE_COMPILER;
+backtrack_common *backtrack = NULL;
+jump_list **reverse_failed;
+unsigned int lmin, lmax;
+#ifdef SUPPORT_UNICODE
+struct sljit_jump *jump;
+struct sljit_label *label;
+#endif
+
+SLJIT_ASSERT(parent->top == NULL);
+
+if (*cc == OP_REVERSE)
+  {
+  reverse_failed = &parent->own_backtracks;
+  lmin = GET2(cc, 1);
+  lmax = lmin;
+  cc += 1 + IMM2_SIZE;
+
+  SLJIT_ASSERT(lmin > 0);
+  }
+else
+  {
+  SLJIT_ASSERT(*cc == OP_VREVERSE);
+  PUSH_BACKTRACK(sizeof(vreverse_backtrack), cc, NULL);
+
+  reverse_failed = &backtrack->own_backtracks;
+  lmin = GET2(cc, 1);
+  lmax = GET2(cc, 1 + IMM2_SIZE);
+  cc += 1 + 2 * IMM2_SIZE;
+
+  SLJIT_ASSERT(lmin < lmax);
+  }
+
+if (HAS_VIRTUAL_REGISTERS)
+  {
+  OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
+  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
+  }
+else
+  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
+
+#ifdef SUPPORT_UNICODE
+if (common->utf)
+  {
+  if (lmin > 0)
+    {
+    OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, lmin);
+    label = LABEL();
+    add_jump(compiler, reverse_failed, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0));
+    move_back(common, reverse_failed, FALSE);
+    OP2(SLJIT_SUB | SLJIT_SET_Z, TMP3, 0, TMP3, 0, SLJIT_IMM, 1);
+    JUMPTO(SLJIT_NOT_ZERO, label);
+    }
+
+  if (lmin < lmax)
+    {
+    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(3), STR_PTR, 0);
+
+    OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, lmax - lmin);
+    label = LABEL();
+    jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0);
+    move_back(common, reverse_failed, FALSE);
+    OP2(SLJIT_SUB | SLJIT_SET_Z, TMP3, 0, TMP3, 0, SLJIT_IMM, 1);
+    JUMPTO(SLJIT_NOT_ZERO, label);
+
+    JUMPHERE(jump);
+    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), STR_PTR, 0);
+    }
+  }
+else
+#endif
+  {
+  if (lmin > 0)
+    {
+    OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(lmin));
+    add_jump(compiler, reverse_failed, CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0));
+    }
+
+  if (lmin < lmax)
+    {
+    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(3), STR_PTR, 0);
+
+    OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(lmax - lmin));
+    OP2U(SLJIT_SUB | SLJIT_SET_LESS, STR_PTR, 0, TMP2, 0);
+    SELECT(SLJIT_LESS, STR_PTR, TMP2, 0, STR_PTR);
+
+    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), STR_PTR, 0);
+    }
+  }
+
+check_start_used_ptr(common);
+
+if (lmin < lmax)
+  BACKTRACK_AS(vreverse_backtrack)->matchingpath = LABEL();
+
+return cc;
+}
+
 static SLJIT_INLINE BOOL assert_needs_str_ptr_saving(PCRE2_SPTR cc)
 {
 while (TRUE)
@@ -9841,6 +10088,8 @@ while (TRUE)
     case OP_DOLLM:
     case OP_CALLOUT:
     case OP_ALT:
+    case OP_NOT_UCP_WORD_BOUNDARY:
+    case OP_UCP_WORD_BOUNDARY:
     cc += PRIV(OP_lengths)[*cc];
     break;
 
@@ -9860,13 +10109,15 @@ int framesize;
 int extrasize;
 BOOL local_quit_available = FALSE;
 BOOL needs_control_head;
+BOOL end_block_size = 0;
+BOOL has_vreverse;
 int private_data_ptr;
 backtrack_common altbacktrack;
 PCRE2_SPTR ccbegin;
 PCRE2_UCHAR opcode;
 PCRE2_UCHAR bra = OP_BRA;
 jump_list *tmp = NULL;
-jump_list **target = (conditional) ? &backtrack->condfailed : &backtrack->common.topbacktracks;
+jump_list **target = (conditional) ? &backtrack->condfailed : &backtrack->common.own_backtracks;
 jump_list **found;
 /* Saving previous accept variables. */
 BOOL save_local_quit_available = common->local_quit_available;
@@ -9889,6 +10140,7 @@ if (*cc == OP_BRAZERO || *cc == OP_BRAMI
   bra = *cc;
   cc++;
   }
+
 private_data_ptr = PRIVATE_DATA(cc);
 SLJIT_ASSERT(private_data_ptr != 0);
 framesize = get_framesize(common, cc, NULL, FALSE, &needs_control_head);
@@ -9908,12 +10160,17 @@ if (bra == OP_BRAMINZERO)
   brajump = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0);
   }
 
+if ((opcode == OP_ASSERTBACK || opcode == OP_ASSERTBACK_NOT) && find_vreverse(ccbegin))
+  end_block_size = 3;
+
 if (framesize < 0)
   {
   extrasize = 1;
   if (bra == OP_BRA && !assert_needs_str_ptr_saving(ccbegin + 1 + LINK_SIZE))
     extrasize = 0;
 
+  extrasize += end_block_size;
+
   if (needs_control_head)
     extrasize++;
 
@@ -9931,18 +10188,19 @@ if (framesize < 0)
 
   if (needs_control_head)
     {
-    SLJIT_ASSERT(extrasize == 2);
+    SLJIT_ASSERT(extrasize == end_block_size + 2);
     OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);
-    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0);
+    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(end_block_size + 1), TMP1, 0);
     }
   }
 else
   {
-  extrasize = needs_control_head ? 3 : 2;
+  extrasize = (needs_control_head ? 3 : 2) + end_block_size;
+
+  OP1(SLJIT_MOV, TMP2, 0, STACK_TOP, 0);
   allocate_stack(common, framesize + extrasize);
 
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
-  OP2(SLJIT_ADD, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + extrasize) * sizeof(sljit_sw));
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP2, 0);
   if (needs_control_head)
     OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
@@ -9950,16 +10208,22 @@ else
 
   if (needs_control_head)
     {
-    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP1, 0);
-    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0);
+    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(end_block_size + 2), TMP1, 0);
+    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(end_block_size + 1), TMP2, 0);
     OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);
     }
   else
-    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0);
+    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(end_block_size + 1), TMP1, 0);
 
   init_frame(common, ccbegin, NULL, framesize + extrasize - 1, extrasize);
   }
 
+if (end_block_size > 0)
+  {
+  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), STR_END, 0);
+  OP1(SLJIT_MOV, STR_END, 0, STR_PTR, 0);
+  }
+
 memset(&altbacktrack, 0, sizeof(backtrack_common));
 if (conditional || (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT))
   {
@@ -9978,13 +10242,19 @@ while (1)
   common->accept_label = NULL;
   common->accept = NULL;
   altbacktrack.top = NULL;
-  altbacktrack.topbacktracks = NULL;
+  altbacktrack.own_backtracks = NULL;
 
   if (*ccbegin == OP_ALT && extrasize > 0)
     OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
 
   altbacktrack.cc = ccbegin;
-  compile_matchingpath(common, ccbegin + 1 + LINK_SIZE, cc, &altbacktrack);
+  ccbegin += 1 + LINK_SIZE;
+
+  has_vreverse = (*ccbegin == OP_VREVERSE);
+  if (*ccbegin == OP_REVERSE || has_vreverse)
+    ccbegin = compile_reverse_matchingpath(common, ccbegin, &altbacktrack);
+
+  compile_matchingpath(common, ccbegin, cc, &altbacktrack);
   if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
     {
     if (local_quit_available)
@@ -10000,6 +10270,13 @@ while (1)
     common->accept = save_accept;
     return NULL;
     }
+
+  if (has_vreverse)
+    {
+    SLJIT_ASSERT(altbacktrack.top != NULL);
+    add_jump(compiler, &altbacktrack.top->simple_backtracks, CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0));
+    }
+
   common->accept_label = LABEL();
   if (common->accept != NULL)
     set_jumps(common->accept, common->accept_label);
@@ -10012,6 +10289,9 @@ while (1)
     else if (extrasize > 0)
       free_stack(common, extrasize);
 
+    if (end_block_size > 0)
+      OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(STACK_TOP), STACK(-extrasize + 1));
+
     if (needs_control_head)
       OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(-1));
     }
@@ -10021,12 +10301,20 @@ while (1)
       {
       /* We don't need to keep the STR_PTR, only the previous private_data_ptr. */
       OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 1) * sizeof(sljit_sw));
+
+      if (end_block_size > 0)
+        OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(STACK_TOP), STACK(-extrasize + 2));
+
       if (needs_control_head)
         OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(-1));
       }
     else
       {
       OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
+
+      if (end_block_size > 0)
+        OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(STACK_TOP), STACK(-framesize - extrasize + 1));
+
       if (needs_control_head)
         OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 2));
       add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));
@@ -10040,7 +10328,7 @@ while (1)
     if (conditional)
       {
       if (extrasize > 0)
-        OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), needs_control_head ? STACK(-2) : STACK(-1));
+        OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-end_block_size - (needs_control_head ? 2 : 1)));
       }
     else if (bra == OP_BRAZERO)
       {
@@ -10079,7 +10367,7 @@ while (1)
     common->accept = save_accept;
     return NULL;
     }
-  set_jumps(altbacktrack.topbacktracks, LABEL());
+  set_jumps(altbacktrack.own_backtracks, LABEL());
 
   if (*cc != OP_ALT)
     break;
@@ -10112,8 +10400,11 @@ if (common->positive_assertion_quit != N
   JUMPHERE(jump);
   }
 
+if (end_block_size > 0)
+  OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(STACK_TOP), STACK(1));
+
 if (needs_control_head)
-  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(1));
+  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(end_block_size + 1));
 
 if (opcode == OP_ASSERT || opcode == OP_ASSERTBACK)
   {
@@ -10126,8 +10417,8 @@ if (opcode == OP_ASSERT || opcode == OP_
     /* The topmost item should be 0. */
     if (bra == OP_BRAZERO)
       {
-      if (extrasize == 2)
-        free_stack(common, 1);
+      if (extrasize >= 2)
+        free_stack(common, extrasize - 1);
       OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
       }
     else if (extrasize > 0)
@@ -10161,8 +10452,9 @@ if (opcode == OP_ASSERT || opcode == OP_
     /* Keep the STR_PTR on the top of the stack. */
     if (bra == OP_BRAZERO)
       {
+      /* This allocation is always successful. */
       OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw));
-      if (extrasize == 2)
+      if (extrasize >= 2)
         OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
       }
     else if (bra == OP_BRAMINZERO)
@@ -10182,8 +10474,9 @@ if (opcode == OP_ASSERT || opcode == OP_
     else
       {
       /* We don't need to keep the STR_PTR, only the previous private_data_ptr. */
-      OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 2) * sizeof(sljit_sw));
-      if (extrasize == 2)
+      OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + end_block_size + 2) * sizeof(sljit_sw));
+
+      if (extrasize == 2 + end_block_size)
         {
         OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
         if (bra == OP_BRAMINZERO)
@@ -10191,7 +10484,7 @@ if (opcode == OP_ASSERT || opcode == OP_
         }
       else
         {
-        SLJIT_ASSERT(extrasize == 3);
+        SLJIT_ASSERT(extrasize == 3 + end_block_size);
         OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-1));
         OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), bra == OP_BRAZERO ? STR_PTR : SLJIT_IMM, 0);
         }
@@ -10215,7 +10508,7 @@ if (opcode == OP_ASSERT || opcode == OP_
       OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize - 1) * sizeof(sljit_sw));
       OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0);
       }
-    set_jumps(backtrack->common.topbacktracks, LABEL());
+    set_jumps(backtrack->common.own_backtracks, LABEL());
     }
   }
 else
@@ -10228,8 +10521,8 @@ else
 
     if (bra != OP_BRA)
       {
-      if (extrasize == 2)
-        free_stack(common, 1);
+      if (extrasize >= 2)
+        free_stack(common, extrasize - 1);
       OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
       }
     else if (extrasize > 0)
@@ -10260,9 +10553,9 @@ else
 
   if (bra != OP_BRA)
     {
-    SLJIT_ASSERT(found == &backtrack->common.topbacktracks);
-    set_jumps(backtrack->common.topbacktracks, LABEL());
-    backtrack->common.topbacktracks = NULL;
+    SLJIT_ASSERT(found == &backtrack->common.own_backtracks);
+    set_jumps(backtrack->common.own_backtracks, LABEL());
+    backtrack->common.own_backtracks = NULL;
     }
   }
 
@@ -10371,7 +10664,7 @@ static PCRE2_SPTR SLJIT_FUNC do_script_r
 
 #endif /* SUPPORT_UNICODE */
 
-static SLJIT_INLINE void match_script_run_common(compiler_common *common, int private_data_ptr, backtrack_common *parent)
+static void match_script_run_common(compiler_common *common, int private_data_ptr, backtrack_common *parent)
 {
 DEFINE_COMPILER;
 
@@ -10386,7 +10679,7 @@ sljit_emit_icall(compiler, SLJIT_CALL, S
 #endif
 
 OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0);
-add_jump(compiler, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0));
+add_jump(compiler, parent->top != NULL ? &parent->top->simple_backtracks : &parent->own_backtracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0));
 }
 
 /*
@@ -10460,6 +10753,7 @@ PCRE2_UCHAR ket;
 assert_backtrack *assert;
 BOOL has_alternatives;
 BOOL needs_control_head = FALSE;
+BOOL has_vreverse = FALSE;
 struct sljit_jump *jump;
 struct sljit_jump *skip;
 struct sljit_label *rmax_label = NULL;
@@ -10709,6 +11003,21 @@ else if (opcode == OP_CBRA || opcode ==
     OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);
     }
   }
+else if (opcode == OP_ASSERTBACK_NA && PRIVATE_DATA(ccbegin + 1))
+  {
+  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
+  allocate_stack(common, 4);
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr + sizeof(sljit_sw));
+  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STR_PTR, 0);
+  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr + sizeof(sljit_sw), STR_END, 0);
+  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);
+  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0);
+  OP1(SLJIT_MOV, STR_END, 0, STR_PTR, 0);
+
+  has_vreverse = (*matchingpath == OP_VREVERSE);
+  if (*matchingpath == OP_REVERSE || has_vreverse)
+    matchingpath = compile_reverse_matchingpath(common, matchingpath, backtrack);
+  }
 else if (opcode == OP_ASSERT_NA || opcode == OP_ASSERTBACK_NA || opcode == OP_SCRIPT_RUN || opcode == OP_SBRA || opcode == OP_SCOND)
   {
   /* Saving the previous value. */
@@ -10716,6 +11025,9 @@ else if (opcode == OP_ASSERT_NA || opcod
   allocate_stack(common, 1);
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STR_PTR, 0);
   OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);
+
+  if (*matchingpath == OP_REVERSE)
+    matchingpath = compile_reverse_matchingpath(common, matchingpath, backtrack);
   }
 else if (has_alternatives)
   {
@@ -10835,14 +11147,28 @@ compile_matchingpath(common, matchingpat
 if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
   return NULL;
 
-if (opcode == OP_ASSERT_NA || opcode == OP_ASSERTBACK_NA)
-  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
-
-if (opcode == OP_ONCE)
-  match_once_common(common, ket, BACKTRACK_AS(bracket_backtrack)->u.framesize, private_data_ptr, has_alternatives, needs_control_head);
+switch (opcode)
+  {
+  case OP_ASSERTBACK_NA:
+    if (has_vreverse)
+      {
+      SLJIT_ASSERT(backtrack->top != NULL && PRIVATE_DATA(ccbegin + 1));
+      add_jump(compiler, &backtrack->top->simple_backtracks, CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0));
+      }
 
-if (opcode == OP_SCRIPT_RUN)
-  match_script_run_common(common, private_data_ptr, backtrack);
+    if (PRIVATE_DATA(ccbegin + 1))
+      OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr + sizeof(sljit_sw));
+    break;
+  case OP_ASSERT_NA:
+    OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
+    break;
+  case OP_ONCE:
+    match_once_common(common, ket, BACKTRACK_AS(bracket_backtrack)->u.framesize, private_data_ptr, has_alternatives, needs_control_head);
+    break;
+  case OP_SCRIPT_RUN:
+    match_script_run_common(common, private_data_ptr, backtrack);
+    break;
+  }
 
 stacksize = 0;
 if (repeat_type == OP_MINUPTO)
@@ -11041,7 +11367,7 @@ switch(opcode)
   case OP_CBRAPOS:
   case OP_SCBRAPOS:
   offset = GET2(cc, 1 + LINK_SIZE);
-  /* This case cannot be optimized in the same was as
+  /* This case cannot be optimized in the same way as
   normal capturing brackets. */
   SLJIT_ASSERT(common->optimized_cbracket[offset] == 0);
   cbraprivptr = OVECTOR_PRIV(offset);
@@ -11158,7 +11484,7 @@ loop = LABEL();
 while (*cc != OP_KETRPOS)
   {
   backtrack->top = NULL;
-  backtrack->topbacktracks = NULL;
+  backtrack->own_backtracks = NULL;
   cc += GET(cc, 1);
 
   compile_matchingpath(common, ccbegin, cc, backtrack);
@@ -11239,7 +11565,7 @@ while (*cc != OP_KETRPOS)
   compile_backtrackingpath(common, backtrack->top);
   if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
     return NULL;
-  set_jumps(backtrack->topbacktracks, LABEL());
+  set_jumps(backtrack->own_backtracks, LABEL());
 
   if (framesize < 0)
     {
@@ -11271,13 +11597,13 @@ while (*cc != OP_KETRPOS)
 
 /* We don't have to restore the control head in case of a failed match. */
 
-backtrack->topbacktracks = NULL;
+backtrack->own_backtracks = NULL;
 if (!zero)
   {
   if (framesize < 0)
-    add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 0));
+    add_jump(compiler, &backtrack->own_backtracks, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 0));
   else /* TMP2 is set to [private_data_ptr] above. */
-    add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(TMP2), STACK(-stacksize), SLJIT_IMM, 0));
+    add_jump(compiler, &backtrack->own_backtracks, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(TMP2), STACK(-stacksize), SLJIT_IMM, 0));
   }
 
 /* None of them matched. */
@@ -11473,7 +11799,7 @@ SLJIT_ASSERT(common->fast_forward_bc_ptr
   || (early_fail_ptr >= common->early_fail_start_ptr && early_fail_ptr <= common->early_fail_end_ptr));
 
 if (early_fail_type == type_fail)
-  add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr));
+  add_jump(compiler, &backtrack->own_backtracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr));
 
 cc = get_iterator_parameters(common, cc, &opcode, &type, &max, &exact, &end);
 
@@ -11500,10 +11826,10 @@ if (exact > 1)
       && type != OP_ANYNL && type != OP_EXTUNI)
     {
     OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(exact));
-    add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_GREATER, TMP1, 0, STR_END, 0));
+    add_jump(compiler, &backtrack->own_backtracks, CMP(SLJIT_GREATER, TMP1, 0, STR_END, 0));
     OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, exact);
     label = LABEL();
-    compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE);
+    compile_char1_matchingpath(common, type, cc, &backtrack->own_backtracks, FALSE);
     OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
     JUMPTO(SLJIT_NOT_ZERO, label);
     }
@@ -11511,13 +11837,13 @@ if (exact > 1)
     {
     OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, exact);
     label = LABEL();
-    compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, TRUE);
+    compile_char1_matchingpath(common, type, cc, &backtrack->own_backtracks, TRUE);
     OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
     JUMPTO(SLJIT_NOT_ZERO, label);
     }
   }
 else if (exact == 1)
-  compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, TRUE);
+  compile_char1_matchingpath(common, type, cc, &backtrack->own_backtracks, TRUE);
 
 if (early_fail_type == type_fail_range)
   {
@@ -11526,7 +11852,7 @@ if (early_fail_type == type_fail_range)
   OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr + SSIZE_OF(sw));
   OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, TMP2, 0);
   OP2(SLJIT_SUB, TMP2, 0, STR_PTR, 0, TMP2, 0);
-  add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_LESS_EQUAL, TMP2, 0, TMP1, 0));
+  add_jump(compiler, &backtrack->own_backtracks, CMP(SLJIT_LESS_EQUAL, TMP2, 0, TMP1, 0));
 
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr + SSIZE_OF(sw), STR_PTR, 0);
@@ -11606,7 +11932,7 @@ switch(opcode)
       if (common->mode == PCRE2_JIT_COMPLETE)
         {
         OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_PTR, 0, STR_END, 0);
-        CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0);
+        SELECT(SLJIT_GREATER, STR_PTR, STR_END, 0, STR_PTR);
         }
       else
         {
@@ -11674,14 +12000,14 @@ switch(opcode)
     if (opcode == OP_UPTO)
       {
       OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
-      add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_ZERO));
+      add_jump(compiler, &backtrack->own_backtracks, JUMP(SLJIT_ZERO));
       }
-    compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE);
+    compile_char1_matchingpath(common, type, cc, &backtrack->own_backtracks, FALSE);
     if (early_fail_ptr != 0)
       OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
     JUMPHERE(jump);
 
-    detect_partial_match(common, &backtrack->topbacktracks);
+    detect_partial_match(common, &backtrack->own_backtracks);
     OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
     if (charpos_othercasebit != 0)
       OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit);
@@ -11835,7 +12161,7 @@ switch(opcode)
     }
 
 #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
-  if (common->utf)
+  if (type == OP_EXTUNI || common->utf)
     {
     OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
     detect_partial_match(common, &no_match);
@@ -11899,7 +12225,7 @@ switch(opcode)
     if (common->mode == PCRE2_JIT_COMPLETE)
       {
       OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_PTR, 0, STR_END, 0);
-      CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0);
+      SELECT(SLJIT_GREATER, STR_PTR, STR_END, 0, STR_PTR);
       }
     else
       {
@@ -11952,12 +12278,12 @@ PUSH_BACKTRACK(sizeof(backtrack_common),
 
 if (*cc == OP_FAIL)
   {
-  add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_JUMP));
+  add_jump(compiler, &backtrack->own_backtracks, JUMP(SLJIT_JUMP));
   return cc + 1;
   }
 
 if (*cc == OP_ACCEPT && common->currententry == NULL && (common->re->overall_options & PCRE2_ENDANCHORED) != 0)
-  add_jump(compiler, &common->reset_match, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, STR_END, 0));
+  add_jump(compiler, &common->restart_match, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, STR_END, 0));
 
 if (*cc == OP_ASSERT_ACCEPT || common->currententry != NULL || !common->might_be_empty)
   {
@@ -11983,7 +12309,7 @@ else
   OP1(SLJIT_MOV_U32, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options));
 
 OP2U(SLJIT_AND | SLJIT_SET_Z, TMP2, 0, SLJIT_IMM, PCRE2_NOTEMPTY);
-add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_NOT_ZERO));
+add_jump(compiler, &backtrack->own_backtracks, JUMP(SLJIT_NOT_ZERO));
 OP2U(SLJIT_AND | SLJIT_SET_Z, TMP2, 0, SLJIT_IMM, PCRE2_NOTEMPTY_ATSTART);
 if (common->accept_label == NULL)
   add_jump(compiler, &common->accept, JUMP(SLJIT_ZERO));
@@ -11995,7 +12321,7 @@ if (common->accept_label == NULL)
   add_jump(compiler, &common->accept, CMP(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0));
 else
   CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0, common->accept_label);
-add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_JUMP));
+add_jump(compiler, &backtrack->own_backtracks, JUMP(SLJIT_JUMP));
 return cc + 1;
 }
 
@@ -12115,8 +12441,9 @@ while (cc < ccend)
     case OP_DOLLM:
     case OP_CIRC:
     case OP_CIRCM:
-    case OP_REVERSE:
-    cc = compile_simple_assertion_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks);
+    case OP_NOT_UCP_WORD_BOUNDARY:
+    case OP_UCP_WORD_BOUNDARY:
+    cc = compile_simple_assertion_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->simple_backtracks : &parent->own_backtracks);
     break;
 
     case OP_NOT_DIGIT:
@@ -12138,7 +12465,7 @@ while (cc < ccend)
     case OP_EXTUNI:
     case OP_NOT:
     case OP_NOTI:
-    cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);
+    cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->simple_backtracks : &parent->own_backtracks, TRUE);
     break;
 
     case OP_SET_SOM:
@@ -12153,9 +12480,9 @@ while (cc < ccend)
     case OP_CHAR:
     case OP_CHARI:
     if (common->mode == PCRE2_JIT_COMPLETE)
-      cc = compile_charn_matchingpath(common, cc, ccend, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks);
+      cc = compile_charn_matchingpath(common, cc, ccend, parent->top != NULL ? &parent->top->simple_backtracks : &parent->own_backtracks);
     else
-      cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);
+      cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->simple_backtracks : &parent->own_backtracks, TRUE);
     break;
 
     case OP_STAR:
@@ -12231,7 +12558,7 @@ while (cc < ccend)
     if (cc[1 + (32 / sizeof(PCRE2_UCHAR))] >= OP_CRSTAR && cc[1 + (32 / sizeof(PCRE2_UCHAR))] <= OP_CRPOSRANGE)
       cc = compile_iterator_matchingpath(common, cc, parent);
     else
-      cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);
+      cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->simple_backtracks : &parent->own_backtracks, TRUE);
     break;
 
 #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
@@ -12239,7 +12566,7 @@ while (cc < ccend)
     if (*(cc + GET(cc, 1)) >= OP_CRSTAR && *(cc + GET(cc, 1)) <= OP_CRPOSRANGE)
       cc = compile_iterator_matchingpath(common, cc, parent);
     else
-      cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);
+      cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->simple_backtracks : &parent->own_backtracks, TRUE);
     break;
 #endif
 
@@ -12249,7 +12576,7 @@ while (cc < ccend)
       cc = compile_ref_iterator_matchingpath(common, cc, parent);
     else
       {
-      compile_ref_matchingpath(common, cc, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE, FALSE);
+      compile_ref_matchingpath(common, cc, parent->top != NULL ? &parent->top->simple_backtracks : &parent->own_backtracks, TRUE, FALSE);
       cc += 1 + IMM2_SIZE;
       }
     break;
@@ -12260,8 +12587,8 @@ while (cc < ccend)
       cc = compile_ref_iterator_matchingpath(common, cc, parent);
     else
       {
-      compile_dnref_search(common, cc, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks);
-      compile_ref_matchingpath(common, cc, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE, FALSE);
+      compile_dnref_search(common, cc, parent->top != NULL ? &parent->top->simple_backtracks : &parent->own_backtracks);
+      compile_ref_matchingpath(common, cc, parent->top != NULL ? &parent->top->simple_backtracks : &parent->own_backtracks, TRUE, FALSE);
       cc += 1 + 2 * IMM2_SIZE;
       }
     break;
@@ -12539,7 +12866,7 @@ switch(opcode)
   break;
   }
 
-set_jumps(current->topbacktracks, LABEL());
+set_jumps(current->own_backtracks, LABEL());
 }
 
 static SLJIT_INLINE void compile_ref_iterator_backtrackingpath(compiler_common *common, struct backtrack_common *current)
@@ -12554,7 +12881,7 @@ type = cc[ref ? 1 + IMM2_SIZE : 1 + 2 *
 if ((type & 0x1) == 0)
   {
   /* Maximize case. */
-  set_jumps(current->topbacktracks, LABEL());
+  set_jumps(current->own_backtracks, LABEL());
   OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
   free_stack(common, 1);
   CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(ref_iterator_backtrack)->matchingpath);
@@ -12563,7 +12890,7 @@ if ((type & 0x1) == 0)
 
 OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
 CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(ref_iterator_backtrack)->matchingpath);
-set_jumps(current->topbacktracks, LABEL());
+set_jumps(current->own_backtracks, LABEL());
 free_stack(common, ref ? 2 : 3);
 }
 
@@ -12584,7 +12911,7 @@ if (!CURRENT_AS(recurse_backtrack)->inli
 else
   compile_backtrackingpath(common, current->top);
 
-set_jumps(current->topbacktracks, LABEL());
+set_jumps(current->own_backtracks, LABEL());
 }
 
 static void compile_assert_backtrackingpath(compiler_common *common, struct backtrack_common *current)
@@ -12603,13 +12930,13 @@ if (*cc == OP_BRAZERO)
 
 if (bra == OP_BRAZERO)
   {
-  SLJIT_ASSERT(current->topbacktracks == NULL);
+  SLJIT_ASSERT(current->own_backtracks == NULL);
   OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
   }
 
 if (CURRENT_AS(assert_backtrack)->framesize < 0)
   {
-  set_jumps(current->topbacktracks, LABEL());
+  set_jumps(current->own_backtracks, LABEL());
 
   if (bra == OP_BRAZERO)
     {
@@ -12641,10 +12968,10 @@ if (*cc == OP_ASSERT || *cc == OP_ASSERT
   OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (CURRENT_AS(assert_backtrack)->framesize - 1) * sizeof(sljit_sw));
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(assert_backtrack)->private_data_ptr, TMP1, 0);
 
-  set_jumps(current->topbacktracks, LABEL());
+  set_jumps(current->own_backtracks, LABEL());
   }
 else
-  set_jumps(current->topbacktracks, LABEL());
+  set_jumps(current->own_backtracks, LABEL());
 
 if (bra == OP_BRAZERO)
   {
@@ -12671,6 +12998,7 @@ PCRE2_UCHAR ket;
 assert_backtrack *assert;
 BOOL has_alternatives;
 BOOL needs_control_head = FALSE;
+BOOL has_vreverse;
 struct sljit_jump *brazero = NULL;
 struct sljit_jump *next_alt = NULL;
 struct sljit_jump *once = NULL;
@@ -12847,8 +13175,8 @@ else if (has_alternatives)
   }
 
 COMPILE_BACKTRACKINGPATH(current->top);
-if (current->topbacktracks)
-  set_jumps(current->topbacktracks, LABEL());
+if (current->own_backtracks)
+  set_jumps(current->own_backtracks, LABEL());
 
 if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND))
   {
@@ -12884,14 +13212,25 @@ if (has_alternatives)
   do
     {
     current->top = NULL;
-    current->topbacktracks = NULL;
-    current->nextbacktracks = NULL;
+    current->own_backtracks = NULL;
+    current->simple_backtracks = NULL;
     /* Conditional blocks always have an additional alternative, even if it is empty. */
     if (*cc == OP_ALT)
       {
       ccprev = cc + 1 + LINK_SIZE;
       cc += GET(cc, 1);
-      if (opcode != OP_COND && opcode != OP_SCOND)
+
+      has_vreverse = FALSE;
+      if (opcode == OP_ASSERTBACK || opcode == OP_ASSERTBACK_NA)
+        {
+        SLJIT_ASSERT(private_data_ptr != 0);
+        OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
+
+        has_vreverse = (*ccprev == OP_VREVERSE);
+        if (*ccprev == OP_REVERSE || has_vreverse)
+          ccprev = compile_reverse_matchingpath(common, ccprev, current);
+        }
+      else if (opcode != OP_COND && opcode != OP_SCOND)
         {
         if (opcode != OP_ONCE)
           {
@@ -12903,15 +13242,30 @@ if (has_alternatives)
         else
           OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(needs_control_head ? 1 : 0));
         }
+
       compile_matchingpath(common, ccprev, cc, current);
       if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
         return;
 
-      if (opcode == OP_ASSERT_NA || opcode == OP_ASSERTBACK_NA)
-        OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
+      switch (opcode)
+        {
+        case OP_ASSERTBACK_NA:
+          if (has_vreverse)
+            {
+            SLJIT_ASSERT(current->top != NULL && PRIVATE_DATA(ccbegin + 1));
+            add_jump(compiler, &current->top->simple_backtracks, CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0));
+            }
 
-      if (opcode == OP_SCRIPT_RUN)
-        match_script_run_common(common, private_data_ptr, current);
+          if (PRIVATE_DATA(ccbegin + 1))
+            OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr + sizeof(sljit_sw));
+          break;
+        case OP_ASSERT_NA:
+          OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
+          break;
+        case OP_SCRIPT_RUN:
+          match_script_run_common(common, private_data_ptr, current);
+          break;
+        }
       }
 
     /* Instructions after the current alternative is successfully matched. */
@@ -12998,9 +13352,9 @@ if (has_alternatives)
       }
 
     COMPILE_BACKTRACKINGPATH(current->top);
-    if (current->topbacktracks)
-      set_jumps(current->topbacktracks, LABEL());
-    SLJIT_ASSERT(!current->nextbacktracks);
+    if (current->own_backtracks)
+      set_jumps(current->own_backtracks, LABEL());
+    SLJIT_ASSERT(!current->simple_backtracks);
     }
   while (*cc == OP_ALT);
 
@@ -13042,6 +13396,15 @@ if (offset != 0)
     OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0);
     }
   }
+else if (opcode == OP_ASSERTBACK_NA && PRIVATE_DATA(ccbegin + 1))
+  {
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
+  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1));
+  OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr + sizeof(sljit_sw));
+  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0);
+  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr + sizeof(sljit_sw), TMP2, 0);
+  free_stack(common, 4);
+  }
 else if (opcode == OP_ASSERT_NA || opcode == OP_ASSERTBACK_NA || opcode == OP_SCRIPT_RUN || opcode == OP_SBRA || opcode == OP_SCOND)
   {
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(0));
@@ -13128,12 +13491,19 @@ static SLJIT_INLINE void compile_bracket
 DEFINE_COMPILER;
 int offset;
 struct sljit_jump *jump;
+PCRE2_SPTR cc;
 
+/* No retry on backtrack, just drop everything. */
 if (CURRENT_AS(bracketpos_backtrack)->framesize < 0)
   {
-  if (*current->cc == OP_CBRAPOS || *current->cc == OP_SCBRAPOS)
+  cc = current->cc;
+
+  if (*cc == OP_BRAPOSZERO)
+    cc++;
+
+  if (*cc == OP_CBRAPOS || *cc == OP_SCBRAPOS)
     {
-    offset = (GET2(current->cc, 1 + LINK_SIZE)) << 1;
+    offset = (GET2(cc, 1 + LINK_SIZE)) << 1;
     OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
     OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1));
     OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0);
@@ -13143,7 +13513,7 @@ if (CURRENT_AS(bracketpos_backtrack)->fr
     if (common->capture_last_ptr != 0)
       OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, TMP1, 0);
     }
-  set_jumps(current->topbacktracks, LABEL());
+  set_jumps(current->own_backtracks, LABEL());
   free_stack(common, CURRENT_AS(bracketpos_backtrack)->stacksize);
   return;
   }
@@ -13152,10 +13522,10 @@ OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(
 add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));
 OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (CURRENT_AS(bracketpos_backtrack)->framesize - 1) * sizeof(sljit_sw));
 
-if (current->topbacktracks)
+if (current->own_backtracks)
   {
   jump = JUMP(SLJIT_JUMP);
-  set_jumps(current->topbacktracks, LABEL());
+  set_jumps(current->own_backtracks, LABEL());
   /* Drop the stack frame. */
   free_stack(common, CURRENT_AS(bracketpos_backtrack)->stacksize);
   JUMPHERE(jump);
@@ -13168,8 +13538,8 @@ static SLJIT_INLINE void compile_braminz
 assert_backtrack backtrack;
 
 current->top = NULL;
-current->topbacktracks = NULL;
-current->nextbacktracks = NULL;
+current->own_backtracks = NULL;
+current->simple_backtracks = NULL;
 if (current->cc[1] > OP_ASSERTBACK_NOT)
   {
   /* Manual call of compile_bracket_matchingpath and compile_bracket_backtrackingpath. */
@@ -13184,7 +13554,7 @@ else
   /* Manual call of compile_assert_matchingpath. */
   compile_assert_matchingpath(common, current->cc, &backtrack, FALSE);
   }
-SLJIT_ASSERT(!current->nextbacktracks && !current->topbacktracks);
+SLJIT_ASSERT(!current->simple_backtracks && !current->own_backtracks);
 }
 
 static SLJIT_INLINE void compile_control_verb_backtrackingpath(compiler_common *common, struct backtrack_common *current)
@@ -13249,6 +13619,23 @@ else
 add_jump(compiler, &common->reset_match, JUMP(SLJIT_JUMP));
 }
 
+static SLJIT_INLINE void compile_vreverse_backtrackingpath(compiler_common *common, struct backtrack_common *current)
+{
+DEFINE_COMPILER;
+struct sljit_jump *jump;
+struct sljit_label *label;
+
+OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(2));
+jump = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(3));
+skip_valid_char(common);
+OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), STR_PTR, 0);
+JUMPTO(SLJIT_JUMP, CURRENT_AS(vreverse_backtrack)->matchingpath);
+
+label = LABEL();
+sljit_set_label(jump, label);
+set_jumps(current->own_backtracks, label);
+}
+
 static SLJIT_INLINE void compile_then_trap_backtrackingpath(compiler_common *common, struct backtrack_common *current)
 {
 DEFINE_COMPILER;
@@ -13289,8 +13676,8 @@ then_trap_backtrack *save_then_trap = co
 
 while (current)
   {
-  if (current->nextbacktracks != NULL)
-    set_jumps(current->nextbacktracks, LABEL());
+  if (current->simple_backtracks != NULL)
+    set_jumps(current->simple_backtracks, LABEL());
   switch(*current->cc)
     {
     case OP_SET_SOM:
@@ -13456,7 +13843,11 @@ while (current)
     case OP_FAIL:
     case OP_ACCEPT:
     case OP_ASSERT_ACCEPT:
-    set_jumps(current->topbacktracks, LABEL());
+    set_jumps(current->own_backtracks, LABEL());
+    break;
+
+    case OP_VREVERSE:
+    compile_vreverse_backtrackingpath(common, current);
     break;
 
     case OP_THEN_TRAP:
@@ -13502,7 +13893,7 @@ SLJIT_ASSERT(common->currententry->entry
 common->currententry->entry_label = LABEL();
 set_jumps(common->currententry->entry_calls, common->currententry->entry_label);
 
-sljit_emit_fast_enter(compiler, TMP2, 0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, TMP2, 0);
 count_match(common);
 
 local_size = (alt_max > 1) ? 2 : 1;
@@ -13535,7 +13926,7 @@ cc += GET(cc, 1);
 while (1)
   {
   altbacktrack.top = NULL;
-  altbacktrack.topbacktracks = NULL;
+  altbacktrack.own_backtracks = NULL;
 
   if (altbacktrack.cc != ccbegin)
     OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
@@ -13564,7 +13955,7 @@ while (1)
     common->currententry->backtrack_label = LABEL();
     set_jumps(common->currententry->backtrack_calls, common->currententry->backtrack_label);
 
-    sljit_emit_fast_enter(compiler, TMP1, 0);
+    sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, TMP1, 0);
 
     if (recurse_flags & recurse_flag_accept_found)
       accept_exit = CMP(SLJIT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, -1);
@@ -13612,7 +14003,7 @@ while (1)
   compile_backtrackingpath(common, altbacktrack.top);
   if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
     return;
-  set_jumps(altbacktrack.topbacktracks, LABEL());
+  set_jumps(altbacktrack.own_backtracks, LABEL());
 
   if (*cc != OP_ALT)
     break;
@@ -13718,9 +14109,9 @@ jump_list *reqcu_not_found = NULL;
 SLJIT_ASSERT(tables);
 
 #if HAS_VIRTUAL_REGISTERS == 1
-SLJIT_ASSERT(sljit_get_register_index(TMP3) < 0 && sljit_get_register_index(ARGUMENTS) < 0 && sljit_get_register_index(RETURN_ADDR) < 0);
+SLJIT_ASSERT(sljit_get_register_index(SLJIT_GP_REGISTER, TMP3) < 0 && sljit_get_register_index(SLJIT_GP_REGISTER, ARGUMENTS) < 0 && sljit_get_register_index(SLJIT_GP_REGISTER, RETURN_ADDR) < 0);
 #elif HAS_VIRTUAL_REGISTERS == 0
-SLJIT_ASSERT(sljit_get_register_index(TMP3) >= 0 && sljit_get_register_index(ARGUMENTS) >= 0 && sljit_get_register_index(RETURN_ADDR) >= 0);
+SLJIT_ASSERT(sljit_get_register_index(SLJIT_GP_REGISTER, TMP3) >= 0 && sljit_get_register_index(SLJIT_GP_REGISTER, ARGUMENTS) >= 0 && sljit_get_register_index(SLJIT_GP_REGISTER, RETURN_ADDR) >= 0);
 #else
 #error "Invalid value for HAS_VIRTUAL_REGISTERS"
 #endif
@@ -13892,13 +14283,13 @@ memset(common->private_data_ptrs, 0, tot
 private_data_size = common->cbra_ptr + (re->top_bracket + 1) * sizeof(sljit_sw);
 
 if ((re->overall_options & PCRE2_ANCHORED) == 0 && (re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0 && !common->has_skip_in_assert_back)
-  detect_early_fail(common, common->start, &private_data_size, 0, 0, TRUE);
+  detect_early_fail(common, common->start, &private_data_size, 0, 0);
 
 set_private_data_ptrs(common, &private_data_size, ccend);
 
 SLJIT_ASSERT(common->early_fail_start_ptr <= common->early_fail_end_ptr);
 
-if (private_data_size > SLJIT_MAX_LOCAL_SIZE)
+if (private_data_size > 65536)
   {
   SLJIT_FREE(common->private_data_ptrs, allocator_data);
   SLJIT_FREE(common->optimized_cbracket, allocator_data);
@@ -13923,7 +14314,7 @@ common->compiler = compiler;
 
 /* Main pcre2_jit_exec entry. */
 SLJIT_ASSERT((private_data_size & (sizeof(sljit_sw) - 1)) == 0);
-sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, W), 5, 5, 0, 0, private_data_size);
+sljit_emit_enter(compiler, 0, SLJIT_ARGS1(W, W), 5, 5, SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS, 0, private_data_size);
 
 /* Register init. */
 reset_ovector(common, (re->top_bracket + 1) * 2);
@@ -14187,7 +14578,7 @@ common->quit_label = quit_label;
 /* This is a (really) rare case. */
 set_jumps(common->stackalloc, LABEL());
 /* RETURN_ADDR is not a saved register. */
-sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
+sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, SLJIT_MEM1(SLJIT_SP), LOCALS0);
 
 SLJIT_ASSERT(TMP1 == SLJIT_R0 && STR_PTR == SLJIT_R1);
 
@@ -14225,7 +14616,12 @@ if (common->revertframes != NULL)
 if (common->wordboundary != NULL)
   {
   set_jumps(common->wordboundary, LABEL());
-  check_wordboundary(common);
+  check_wordboundary(common, FALSE);
+  }
+if (common->ucp_wordboundary != NULL)
+  {
+  set_jumps(common->ucp_wordboundary, LABEL());
+  check_wordboundary(common, TRUE);
   }
 if (common->anynewline != NULL)
   {
@@ -14252,10 +14648,17 @@ if (common->caselesscmp != NULL)
   set_jumps(common->caselesscmp, LABEL());
   do_caselesscmp(common);
   }
-if (common->reset_match != NULL)
+if (common->reset_match != NULL || common->restart_match != NULL)
   {
+  if (common->restart_match != NULL)
+    {
+    set_jumps(common->restart_match, LABEL());
+    OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);
+    }
+
   set_jumps(common->reset_match, LABEL());
   do_reset_match(common, (re->top_bracket + 1) * 2);
+  /* The value of restart_match is in TMP1. */
   CMPTO(SLJIT_GREATER, STR_PTR, 0, TMP1, 0, continue_match_label);
   OP1(SLJIT_MOV, STR_PTR, 0, TMP1, 0);
   JUMPTO(SLJIT_JUMP, reset_match_label);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_jit_match.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_jit_match.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_jit_match.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_jit_match.c	2024-11-20 13:56:33.000000000 +0000
@@ -7,7 +7,7 @@ and semantics are as close as possible t
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2018 University of Cambridge
+          New API code Copyright (c) 2016-2023 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -42,6 +42,12 @@ POSSIBILITY OF SUCH DAMAGE.
 #error This file must be included from pcre2_jit_compile.c.
 #endif
 
+#if defined(__has_feature)
+#if __has_feature(memory_sanitizer)
+#include <sanitizer/msan_interface.h>
+#endif /* __has_feature(memory_sanitizer) */
+#endif /* defined(__has_feature) */
+
 #ifdef SUPPORT_JIT
 
 static SLJIT_NOINLINE int jit_machine_stack_exec(jit_arguments *arguments, jit_function executable_func)
@@ -171,6 +177,7 @@ if (rc > (int)oveccount)
   rc = 0;
 match_data->code = re;
 match_data->subject = (rc >= 0 || rc == PCRE2_ERROR_PARTIAL)? subject : NULL;
+match_data->subject_length = length;
 match_data->rc = rc;
 match_data->startchar = arguments.startchar_ptr - subject;
 match_data->leftchar = 0;
@@ -178,6 +185,13 @@ match_data->rightchar = 0;
 match_data->mark = arguments.mark_ptr;
 match_data->matchedby = PCRE2_MATCHEDBY_JIT;
 
+#if defined(__has_feature)
+#if __has_feature(memory_sanitizer)
+if (rc > 0)
+  __msan_unpoison(match_data->ovector, 2 * rc * sizeof(match_data->ovector[0]));
+#endif /* __has_feature(memory_sanitizer) */
+#endif /* defined(__has_feature) */
+
 return match_data->rc;
 
 #endif  /* SUPPORT_JIT */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_jit_neon_inc.h 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_jit_neon_inc.h
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_jit_neon_inc.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_jit_neon_inc.h	2024-11-20 13:56:33.000000000 +0000
@@ -82,7 +82,12 @@ POSSIBILITY OF SUCH DAMAGE.
 #  endif
 # endif
 
-static sljit_u8* SLJIT_FUNC FF_FUN(sljit_u8 *str_end, sljit_u8 *str_ptr, sljit_uw offs1, sljit_uw offs2, sljit_uw chars)
+#if (defined(__GNUC__) && __SANITIZE_ADDRESS__) \
+	|| (defined(__clang__) \
+	&& ((__clang_major__ == 3 && __clang_minor__ >= 3) || (__clang_major__ > 3)))
+__attribute__((no_sanitize_address))
+#endif
+static sljit_u8* SLJIT_FUNC FF_FUN(sljit_u8 *str_end, sljit_u8 **str_ptr, sljit_uw offs1, sljit_uw offs2, sljit_uw chars)
 #undef FF_FUN
 {
 quad_word qw;
@@ -171,7 +176,7 @@ else
   }
 # endif
 
-str_ptr += IN_UCHARS(offs1);
+*str_ptr += IN_UCHARS(offs1);
 #endif
 
 #if PCRE2_CODE_UNIT_WIDTH != 8
@@ -183,13 +188,13 @@ restart:;
 #endif
 
 #if defined(FFCPS)
-if (str_ptr >= str_end)
+if (*str_ptr >= str_end)
   return NULL;
-sljit_u8 *p1 = str_ptr - diff;
+sljit_u8 *p1 = *str_ptr - diff;
 #endif
-sljit_s32 align_offset = ((uint64_t)str_ptr & 0xf);
-str_ptr = (sljit_u8 *) ((uint64_t)str_ptr & ~0xf);
-vect_t data = VLD1Q(str_ptr);
+sljit_s32 align_offset = ((uint64_t)*str_ptr & 0xf);
+*str_ptr = (sljit_u8 *) ((uint64_t)*str_ptr & ~0xf);
+vect_t data = VLD1Q(*str_ptr);
 #if PCRE2_CODE_UNIT_WIDTH != 8
 data = VANDQ(data, char_mask);
 #endif
@@ -212,9 +217,9 @@ vect_t prev_data = data;
 # endif
 
 vect_t data2;
-if (p1 < str_ptr)
+if (p1 < *str_ptr)
   {
-  data2 = VLD1Q(str_ptr - diff);
+  data2 = VLD1Q(*str_ptr - diff);
 #if PCRE2_CODE_UNIT_WIDTH != 8
   data2 = VANDQ(data2, char_mask);
 #endif
@@ -242,12 +247,12 @@ if (align_offset < 8)
   qw.dw[0] >>= align_offset * 8;
   if (qw.dw[0])
     {
-    str_ptr += align_offset + __builtin_ctzll(qw.dw[0]) / 8;
+    *str_ptr += align_offset + __builtin_ctzll(qw.dw[0]) / 8;
     goto match;
     }
   if (qw.dw[1])
     {
-    str_ptr += 8 + __builtin_ctzll(qw.dw[1]) / 8;
+    *str_ptr += 8 + __builtin_ctzll(qw.dw[1]) / 8;
     goto match;
     }
   }
@@ -256,15 +261,15 @@ else
   qw.dw[1] >>= (align_offset - 8) * 8;
   if (qw.dw[1])
     {
-    str_ptr += align_offset + __builtin_ctzll(qw.dw[1]) / 8;
+    *str_ptr += align_offset + __builtin_ctzll(qw.dw[1]) / 8;
     goto match;
     }
   }
-str_ptr += 16;
+*str_ptr += 16;
 
-while (str_ptr < str_end)
+while (*str_ptr < str_end)
   {
-  vect_t orig_data = VLD1Q(str_ptr);
+  vect_t orig_data = VLD1Q(*str_ptr);
 #if PCRE2_CODE_UNIT_WIDTH != 8
   orig_data = VANDQ(orig_data, char_mask);
 #endif
@@ -287,7 +292,7 @@ while (str_ptr < str_end)
 # if defined (FFCPS_DIFF1)
   data2 = VEXTQ(prev_data, data, VECTOR_FACTOR - 1);
 # else
-  data2 = VLD1Q(str_ptr - diff);
+  data2 = VLD1Q(*str_ptr - diff);
 #  if PCRE2_CODE_UNIT_WIDTH != 8
   data2 = VANDQ(data2, char_mask);
 #  endif
@@ -312,11 +317,11 @@ while (str_ptr < str_end)
 
   VST1Q(qw.mem, eq);
   if (qw.dw[0])
-    str_ptr += __builtin_ctzll(qw.dw[0]) / 8;
+    *str_ptr += __builtin_ctzll(qw.dw[0]) / 8;
   else if (qw.dw[1])
-    str_ptr += 8 + __builtin_ctzll(qw.dw[1]) / 8;
+    *str_ptr += 8 + __builtin_ctzll(qw.dw[1]) / 8;
   else {
-    str_ptr += 16;
+    *str_ptr += 16;
 #if defined (FFCPS_DIFF1)
     prev_data = orig_data;
 #endif
@@ -324,24 +329,24 @@ while (str_ptr < str_end)
   }
 
 match:;
-  if (str_ptr >= str_end)
+  if (*str_ptr >= str_end)
     /* Failed match. */
     return NULL;
 
 #if defined(FF_UTF)
-  if (utf_continue((PCRE2_SPTR)str_ptr - offs1))
+  if (utf_continue((PCRE2_SPTR)*str_ptr - offs1))
     {
     /* Not a match. */
-    str_ptr += IN_UCHARS(1);
+    *str_ptr += IN_UCHARS(1);
     goto restart;
     }
 #endif
 
   /* Match. */
 #if defined (FFCPS)
-  str_ptr -= IN_UCHARS(offs1);
+  *str_ptr -= IN_UCHARS(offs1);
 #endif
-  return str_ptr;
+  return *str_ptr;
   }
 
 /* Failed match. */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_jit_simd_inc.h 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_jit_simd_inc.h
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_jit_simd_inc.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_jit_simd_inc.h	2024-11-20 13:56:33.000000000 +0000
@@ -42,7 +42,8 @@ POSSIBILITY OF SUCH DAMAGE.
 #if !(defined SUPPORT_VALGRIND)
 
 #if ((defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
-     || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X))
+     || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
+     || (defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64))
 
 typedef enum {
   vector_compare_match1,
@@ -50,18 +51,39 @@ typedef enum {
   vector_compare_match2,
 } vector_compare_type;
 
-static SLJIT_INLINE sljit_u32 max_fast_forward_char_pair_offset(void)
+#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
+static SLJIT_INLINE sljit_s32 max_fast_forward_char_pair_offset(void)
 {
 #if PCRE2_CODE_UNIT_WIDTH == 8
+/* The AVX2 code path is currently disabled. */
+/* return sljit_has_cpu_feature(SLJIT_HAS_AVX2) ? 31 : 15; */
 return 15;
 #elif PCRE2_CODE_UNIT_WIDTH == 16
+/* The AVX2 code path is currently disabled. */
+/* return sljit_has_cpu_feature(SLJIT_HAS_AVX2) ? 15 : 7; */
 return 7;
 #elif PCRE2_CODE_UNIT_WIDTH == 32
+/* The AVX2 code path is currently disabled. */
+/* return sljit_has_cpu_feature(SLJIT_HAS_AVX2) ? 7 : 3; */
 return 3;
 #else
 #error "Unsupported unit width"
 #endif
 }
+#else /* !SLJIT_CONFIG_X86 */
+static SLJIT_INLINE sljit_s32 max_fast_forward_char_pair_offset(void)
+{
+#if PCRE2_CODE_UNIT_WIDTH == 8
+return 15;
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+return 7;
+#elif PCRE2_CODE_UNIT_WIDTH == 32
+return 3;
+#else
+#error "Unsupported unit width"
+#endif
+}
+#endif /* SLJIT_CONFIG_X86 */
 
 #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
 static struct sljit_jump *jump_if_utf_char_start(struct sljit_compiler *compiler, sljit_s32 reg)
@@ -86,49 +108,35 @@ static sljit_s32 character_to_int32(PCRE
 {
 sljit_u32 value = chr;
 #if PCRE2_CODE_UNIT_WIDTH == 8
-#define SSE2_COMPARE_TYPE_INDEX 0
+#define SIMD_COMPARE_TYPE_INDEX 0
 return (sljit_s32)((value << 24) | (value << 16) | (value << 8) | value);
 #elif PCRE2_CODE_UNIT_WIDTH == 16
-#define SSE2_COMPARE_TYPE_INDEX 1
+#define SIMD_COMPARE_TYPE_INDEX 1
 return (sljit_s32)((value << 16) | value);
 #elif PCRE2_CODE_UNIT_WIDTH == 32
-#define SSE2_COMPARE_TYPE_INDEX 2
+#define SIMD_COMPARE_TYPE_INDEX 2
 return (sljit_s32)(value);
 #else
 #error "Unsupported unit width"
 #endif
 }
 
-static void load_from_mem_sse2(struct sljit_compiler *compiler, sljit_s32 dst_xmm_reg, sljit_s32 src_general_reg, sljit_s8 offset)
+static void fast_forward_char_pair_sse2_compare(struct sljit_compiler *compiler, vector_compare_type compare_type,
+  sljit_s32 reg_type, int step, sljit_s32 dst_ind, sljit_s32 cmp1_ind, sljit_s32 cmp2_ind, sljit_s32 tmp_ind)
 {
-sljit_u8 instruction[5];
-
-SLJIT_ASSERT(dst_xmm_reg < 8);
-SLJIT_ASSERT(src_general_reg < 8);
-
-/* MOVDQA xmm1, xmm2/m128 */
-instruction[0] = ((sljit_u8)offset & 0xf) == 0 ? 0x66 : 0xf3;
-instruction[1] = 0x0f;
-instruction[2] = 0x6f;
+sljit_u8 instruction[4];
 
-if (offset == 0)
+if (reg_type == SLJIT_SIMD_REG_128)
   {
-  instruction[3] = (dst_xmm_reg << 3) | src_general_reg;
-  sljit_emit_op_custom(compiler, instruction, 4);
-  return;
+  instruction[0] = 0x66;
+  instruction[1] = 0x0f;
+  }
+else
+  {
+  /* Two byte VEX prefix. */
+  instruction[0] = 0xc5;
+  instruction[1] = 0xfd;
   }
-
-instruction[3] = 0x40 | (dst_xmm_reg << 3) | src_general_reg;
-instruction[4] = (sljit_u8)offset;
-sljit_emit_op_custom(compiler, instruction, 5);
-}
-
-static void fast_forward_char_pair_sse2_compare(struct sljit_compiler *compiler, vector_compare_type compare_type,
-  int step, sljit_s32 dst_ind, sljit_s32 cmp1_ind, sljit_s32 cmp2_ind, sljit_s32 tmp_ind)
-{
-sljit_u8 instruction[4];
-instruction[0] = 0x66;
-instruction[1] = 0x0f;
 
 SLJIT_ASSERT(step >= 0 && step <= 3);
 
@@ -139,8 +147,10 @@ if (compare_type != vector_compare_match
     if (compare_type == vector_compare_match1i)
       {
       /* POR xmm1, xmm2/m128 */
-      /* instruction[0] = 0x66; */
-      /* instruction[1] = 0x0f; */
+      if (reg_type == SLJIT_SIMD_REG_256)
+        instruction[1] ^= (dst_ind << 3);
+
+      /* Prefix is filled. */
       instruction[2] = 0xeb;
       instruction[3] = 0xc0 | (dst_ind << 3) | cmp2_ind;
       sljit_emit_op_custom(compiler, instruction, 4);
@@ -152,20 +162,35 @@ if (compare_type != vector_compare_match
     return;
 
   /* PCMPEQB/W/D xmm1, xmm2/m128 */
-  /* instruction[0] = 0x66; */
-  /* instruction[1] = 0x0f; */
-  instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX;
+  if (reg_type == SLJIT_SIMD_REG_256)
+    instruction[1] ^= (dst_ind << 3);
+
+  /* Prefix is filled. */
+  instruction[2] = 0x74 + SIMD_COMPARE_TYPE_INDEX;
   instruction[3] = 0xc0 | (dst_ind << 3) | cmp1_ind;
   sljit_emit_op_custom(compiler, instruction, 4);
   return;
   }
 
+if (reg_type == SLJIT_SIMD_REG_256)
+  {
+  if (step == 2)
+    return;
+
+  if (step == 0)
+    {
+    step = 2;
+    instruction[1] ^= (dst_ind << 3);
+    }
+  }
+
 switch (step)
   {
   case 0:
+  SLJIT_ASSERT(reg_type == SLJIT_SIMD_REG_128);
+
   /* MOVDQA xmm1, xmm2/m128 */
-  /* instruction[0] = 0x66; */
-  /* instruction[1] = 0x0f; */
+  /* Prefix is filled. */
   instruction[2] = 0x6f;
   instruction[3] = 0xc0 | (tmp_ind << 3) | dst_ind;
   sljit_emit_op_custom(compiler, instruction, 4);
@@ -173,26 +198,29 @@ switch (step)
 
   case 1:
   /* PCMPEQB/W/D xmm1, xmm2/m128 */
-  /* instruction[0] = 0x66; */
-  /* instruction[1] = 0x0f; */
-  instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX;
+  if (reg_type == SLJIT_SIMD_REG_256)
+    instruction[1] ^= (dst_ind << 3);
+
+  /* Prefix is filled. */
+  instruction[2] = 0x74 + SIMD_COMPARE_TYPE_INDEX;
   instruction[3] = 0xc0 | (dst_ind << 3) | cmp1_ind;
   sljit_emit_op_custom(compiler, instruction, 4);
   return;
 
   case 2:
   /* PCMPEQB/W/D xmm1, xmm2/m128 */
-  /* instruction[0] = 0x66; */
-  /* instruction[1] = 0x0f; */
-  instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX;
+  /* Prefix is filled. */
+  instruction[2] = 0x74 + SIMD_COMPARE_TYPE_INDEX;
   instruction[3] = 0xc0 | (tmp_ind << 3) | cmp2_ind;
   sljit_emit_op_custom(compiler, instruction, 4);
   return;
 
   case 3:
   /* POR xmm1, xmm2/m128 */
-  /* instruction[0] = 0x66; */
-  /* instruction[1] = 0x0f; */
+  if (reg_type == SLJIT_SIMD_REG_256)
+    instruction[1] ^= (dst_ind << 3);
+
+  /* Prefix is filled. */
   instruction[2] = 0xeb;
   instruction[3] = 0xc0 | (dst_ind << 3) | tmp_ind;
   sljit_emit_op_custom(compiler, instruction, 4);
@@ -200,12 +228,16 @@ switch (step)
   }
 }
 
-#define JIT_HAS_FAST_FORWARD_CHAR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_SSE2))
+#define JIT_HAS_FAST_FORWARD_CHAR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_SIMD))
 
 static void fast_forward_char_simd(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2, sljit_s32 offset)
 {
 DEFINE_COMPILER;
 sljit_u8 instruction[8];
+/* The AVX2 code path is currently disabled. */
+/* sljit_s32 reg_type = sljit_has_cpu_feature(SLJIT_HAS_AVX2) ? SLJIT_SIMD_REG_256 : SLJIT_SIMD_REG_128; */
+sljit_s32 reg_type = SLJIT_SIMD_REG_128;
+sljit_s32 value;
 struct sljit_label *start;
 #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
 struct sljit_label *restart;
@@ -213,12 +245,11 @@ struct sljit_label *restart;
 struct sljit_jump *quit;
 struct sljit_jump *partial_quit[2];
 vector_compare_type compare_type = vector_compare_match1;
-sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1);
-sljit_s32 str_ptr_reg_ind = sljit_get_register_index(STR_PTR);
-sljit_s32 data_ind = 0;
-sljit_s32 tmp_ind = 1;
-sljit_s32 cmp1_ind = 2;
-sljit_s32 cmp2_ind = 3;
+sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
+sljit_s32 data_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0);
+sljit_s32 cmp1_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR1);
+sljit_s32 cmp2_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR2);
+sljit_s32 tmp_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR3);
 sljit_u32 bit = 0;
 int i;
 
@@ -241,61 +272,34 @@ if (common->mode == PCRE2_JIT_COMPLETE)
   add_jump(compiler, &common->failed_match, partial_quit[0]);
 
 /* First part (unaligned start) */
-
-OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1 | bit));
-
-SLJIT_ASSERT(tmp1_reg_ind < 8);
-
-/* MOVD xmm, r/m32 */
-instruction[0] = 0x66;
-instruction[1] = 0x0f;
-instruction[2] = 0x6e;
-instruction[3] = 0xc0 | (cmp1_ind << 3) | tmp1_reg_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
+value = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_LANE_ZERO;
+sljit_emit_simd_lane_mov(compiler, value, SLJIT_FR1, 0, SLJIT_IMM, character_to_int32(char1 | bit));
 
 if (char1 != char2)
-  {
-  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(bit != 0 ? bit : char2));
-
-  /* MOVD xmm, r/m32 */
-  instruction[3] = 0xc0 | (cmp2_ind << 3) | tmp1_reg_ind;
-  sljit_emit_op_custom(compiler, instruction, 4);
-  }
+  sljit_emit_simd_lane_mov(compiler, value, SLJIT_FR2, 0, SLJIT_IMM, character_to_int32(bit != 0 ? bit : char2));
 
 OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0);
 
-/* PSHUFD xmm1, xmm2/m128, imm8 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0x70;
-instruction[3] = 0xc0 | (cmp1_ind << 3) | cmp1_ind;
-instruction[4] = 0;
-sljit_emit_op_custom(compiler, instruction, 5);
+sljit_emit_simd_lane_replicate(compiler, reg_type | SLJIT_SIMD_ELEM_32, SLJIT_FR1, SLJIT_FR1, 0);
 
 if (char1 != char2)
-  {
-  /* PSHUFD xmm1, xmm2/m128, imm8 */
-  instruction[3] = 0xc0 | (cmp2_ind << 3) | cmp2_ind;
-  sljit_emit_op_custom(compiler, instruction, 5);
-  }
+  sljit_emit_simd_lane_replicate(compiler, reg_type | SLJIT_SIMD_ELEM_32, SLJIT_FR2, SLJIT_FR2, 0);
 
 #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
 restart = LABEL();
 #endif
-OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~0xf);
-OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf);
 
-load_from_mem_sse2(compiler, data_ind, str_ptr_reg_ind, 0);
-for (i = 0; i < 4; i++)
-  fast_forward_char_pair_sse2_compare(compiler, compare_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
+value = (reg_type == SLJIT_SIMD_REG_256) ? 0x1f : 0xf;
+OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~value);
+OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, value);
 
-/* PMOVMSKB reg, xmm */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xd7;
-instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | data_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
+value = (reg_type == SLJIT_SIMD_REG_256) ? SLJIT_SIMD_MEM_ALIGNED_256 : SLJIT_SIMD_MEM_ALIGNED_128;
+sljit_emit_simd_mov(compiler, reg_type | value, SLJIT_FR0, SLJIT_MEM1(STR_PTR), 0);
 
+for (i = 0; i < 4; i++)
+  fast_forward_char_pair_sse2_compare(compiler, compare_type, reg_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
+
+sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | reg_type | SLJIT_SIMD_ELEM_8, SLJIT_FR0, TMP1, 0);
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
 OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, TMP2, 0);
 
@@ -306,27 +310,24 @@ OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, T
 /* Second part (aligned) */
 start = LABEL();
 
-OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16);
+value = (reg_type == SLJIT_SIMD_REG_256) ? 32 : 16;
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, value);
 
 partial_quit[1] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
 if (common->mode == PCRE2_JIT_COMPLETE)
   add_jump(compiler, &common->failed_match, partial_quit[1]);
 
-load_from_mem_sse2(compiler, data_ind, str_ptr_reg_ind, 0);
+value = (reg_type == SLJIT_SIMD_REG_256) ? SLJIT_SIMD_MEM_ALIGNED_256 : SLJIT_SIMD_MEM_ALIGNED_128;
+sljit_emit_simd_mov(compiler, reg_type | value, SLJIT_FR0, SLJIT_MEM1(STR_PTR), 0);
 for (i = 0; i < 4; i++)
-  fast_forward_char_pair_sse2_compare(compiler, compare_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
-
-/* PMOVMSKB reg, xmm */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xd7;
-instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | data_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
+  fast_forward_char_pair_sse2_compare(compiler, compare_type, reg_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
 
+sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | reg_type | SLJIT_SIMD_ELEM_8, SLJIT_FR0, TMP1, 0);
 CMPTO(SLJIT_ZERO, TMP1, 0, SLJIT_IMM, 0, start);
 
 JUMPHERE(quit);
 
+SLJIT_ASSERT(tmp1_reg_ind < 8);
 /* BSF r32, r/m32 */
 instruction[0] = 0x0f;
 instruction[1] = 0xbc;
@@ -340,7 +341,7 @@ if (common->mode != PCRE2_JIT_COMPLETE)
   JUMPHERE(partial_quit[0]);
   JUMPHERE(partial_quit[1]);
   OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_PTR, 0, STR_END, 0);
-  CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0);
+  SELECT(SLJIT_GREATER, STR_PTR, STR_END, 0, STR_PTR);
   }
 else
   add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
@@ -364,22 +365,25 @@ if (common->utf && offset > 0)
 #endif
 }
 
-#define JIT_HAS_FAST_REQUESTED_CHAR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_SSE2))
+#define JIT_HAS_FAST_REQUESTED_CHAR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_SIMD))
 
 static jump_list *fast_requested_char_simd(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2)
 {
 DEFINE_COMPILER;
 sljit_u8 instruction[8];
+/* The AVX2 code path is currently disabled. */
+/* sljit_s32 reg_type = sljit_has_cpu_feature(SLJIT_HAS_AVX2) ? SLJIT_SIMD_REG_256 : SLJIT_SIMD_REG_128; */
+sljit_s32 reg_type = SLJIT_SIMD_REG_128;
+sljit_s32 value;
 struct sljit_label *start;
 struct sljit_jump *quit;
 jump_list *not_found = NULL;
 vector_compare_type compare_type = vector_compare_match1;
-sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1);
-sljit_s32 str_ptr_reg_ind = sljit_get_register_index(STR_PTR);
-sljit_s32 data_ind = 0;
-sljit_s32 tmp_ind = 1;
-sljit_s32 cmp1_ind = 2;
-sljit_s32 cmp2_ind = 3;
+sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
+sljit_s32 data_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0);
+sljit_s32 cmp1_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR1);
+sljit_s32 cmp2_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR2);
+sljit_s32 tmp_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR3);
 sljit_u32 bit = 0;
 int i;
 
@@ -401,57 +405,30 @@ OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0);
 
 /* First part (unaligned start) */
 
-OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1 | bit));
-
-SLJIT_ASSERT(tmp1_reg_ind < 8);
-
-/* MOVD xmm, r/m32 */
-instruction[0] = 0x66;
-instruction[1] = 0x0f;
-instruction[2] = 0x6e;
-instruction[3] = 0xc0 | (cmp1_ind << 3) | tmp1_reg_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
+value = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_LANE_ZERO;
+sljit_emit_simd_lane_mov(compiler, value, SLJIT_FR1, 0, SLJIT_IMM, character_to_int32(char1 | bit));
 
 if (char1 != char2)
-  {
-  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(bit != 0 ? bit : char2));
-
-  /* MOVD xmm, r/m32 */
-  instruction[3] = 0xc0 | (cmp2_ind << 3) | tmp1_reg_ind;
-  sljit_emit_op_custom(compiler, instruction, 4);
-  }
+  sljit_emit_simd_lane_mov(compiler, value, SLJIT_FR2, 0, SLJIT_IMM, character_to_int32(bit != 0 ? bit : char2));
 
 OP1(SLJIT_MOV, STR_PTR, 0, TMP2, 0);
 
-/* PSHUFD xmm1, xmm2/m128, imm8 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0x70;
-instruction[3] = 0xc0 | (cmp1_ind << 3) | cmp1_ind;
-instruction[4] = 0;
-sljit_emit_op_custom(compiler, instruction, 5);
+sljit_emit_simd_lane_replicate(compiler, reg_type | SLJIT_SIMD_ELEM_32, SLJIT_FR1, SLJIT_FR1, 0);
 
 if (char1 != char2)
-  {
-  /* PSHUFD xmm1, xmm2/m128, imm8 */
-  instruction[3] = 0xc0 | (cmp2_ind << 3) | cmp2_ind;
-  sljit_emit_op_custom(compiler, instruction, 5);
-  }
+  sljit_emit_simd_lane_replicate(compiler, reg_type | SLJIT_SIMD_ELEM_32, SLJIT_FR2, SLJIT_FR2, 0);
 
-OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~0xf);
-OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf);
+value = (reg_type == SLJIT_SIMD_REG_256) ? 0x1f : 0xf;
+OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~value);
+OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, value);
 
-load_from_mem_sse2(compiler, data_ind, str_ptr_reg_ind, 0);
-for (i = 0; i < 4; i++)
-  fast_forward_char_pair_sse2_compare(compiler, compare_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
+value = (reg_type == SLJIT_SIMD_REG_256) ? SLJIT_SIMD_MEM_ALIGNED_256 : SLJIT_SIMD_MEM_ALIGNED_128;
+sljit_emit_simd_mov(compiler, reg_type | value, SLJIT_FR0, SLJIT_MEM1(STR_PTR), 0);
 
-/* PMOVMSKB reg, xmm */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xd7;
-instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | data_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
+for (i = 0; i < 4; i++)
+  fast_forward_char_pair_sse2_compare(compiler, compare_type, reg_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
 
+sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | reg_type | SLJIT_SIMD_ELEM_8, SLJIT_FR0, TMP1, 0);
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
 OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, TMP2, 0);
 
@@ -462,25 +439,23 @@ OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, T
 /* Second part (aligned) */
 start = LABEL();
 
-OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16);
+value = (reg_type == SLJIT_SIMD_REG_256) ? 32 : 16;
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, value);
 
 add_jump(compiler, &not_found, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
 
-load_from_mem_sse2(compiler, data_ind, str_ptr_reg_ind, 0);
-for (i = 0; i < 4; i++)
-  fast_forward_char_pair_sse2_compare(compiler, compare_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
+value = (reg_type == SLJIT_SIMD_REG_256) ? SLJIT_SIMD_MEM_ALIGNED_256 : SLJIT_SIMD_MEM_ALIGNED_128;
+sljit_emit_simd_mov(compiler, reg_type | value, SLJIT_FR0, SLJIT_MEM1(STR_PTR), 0);
 
-/* PMOVMSKB reg, xmm */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xd7;
-instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | data_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
+for (i = 0; i < 4; i++)
+  fast_forward_char_pair_sse2_compare(compiler, compare_type, reg_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
 
+sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | reg_type | SLJIT_SIMD_ELEM_8, SLJIT_FR0, TMP1, 0);
 CMPTO(SLJIT_ZERO, TMP1, 0, SLJIT_IMM, 0, start);
 
 JUMPHERE(quit);
 
+SLJIT_ASSERT(tmp1_reg_ind < 8);
 /* BSF r32, r/m32 */
 instruction[0] = 0x0f;
 instruction[1] = 0xbc;
@@ -496,29 +471,31 @@ return not_found;
 
 #ifndef _WIN64
 
-#define JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_SSE2))
+#define JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_SIMD))
 
 static void fast_forward_char_pair_simd(compiler_common *common, sljit_s32 offs1,
   PCRE2_UCHAR char1a, PCRE2_UCHAR char1b, sljit_s32 offs2, PCRE2_UCHAR char2a, PCRE2_UCHAR char2b)
 {
 DEFINE_COMPILER;
 sljit_u8 instruction[8];
+/* The AVX2 code path is currently disabled. */
+/* sljit_s32 reg_type = sljit_has_cpu_feature(SLJIT_HAS_AVX2) ? SLJIT_SIMD_REG_256 : SLJIT_SIMD_REG_128; */
+sljit_s32 reg_type = SLJIT_SIMD_REG_128;
+sljit_s32 value;
 vector_compare_type compare1_type = vector_compare_match1;
 vector_compare_type compare2_type = vector_compare_match1;
 sljit_u32 bit1 = 0;
 sljit_u32 bit2 = 0;
 sljit_u32 diff = IN_UCHARS(offs1 - offs2);
-sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1);
-sljit_s32 tmp2_reg_ind = sljit_get_register_index(TMP2);
-sljit_s32 str_ptr_reg_ind = sljit_get_register_index(STR_PTR);
-sljit_s32 data1_ind = 0;
-sljit_s32 data2_ind = 1;
-sljit_s32 tmp1_ind = 2;
-sljit_s32 tmp2_ind = 3;
-sljit_s32 cmp1a_ind = 4;
-sljit_s32 cmp1b_ind = 5;
-sljit_s32 cmp2a_ind = 6;
-sljit_s32 cmp2b_ind = 7;
+sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
+sljit_s32 data1_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR0);
+sljit_s32 data2_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR1);
+sljit_s32 cmp1a_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR2);
+sljit_s32 cmp2a_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR3);
+sljit_s32 cmp1b_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR4);
+sljit_s32 cmp2b_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR5);
+sljit_s32 tmp1_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_FR6);
+sljit_s32 tmp2_ind = sljit_get_register_index(SLJIT_FLOAT_REGISTER, SLJIT_TMP_FR0);
 struct sljit_label *start;
 #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
 struct sljit_label *restart;
@@ -526,9 +503,8 @@ struct sljit_label *restart;
 struct sljit_jump *jump[2];
 int i;
 
-SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE && offs1 > offs2);
-SLJIT_ASSERT(diff <= IN_UCHARS(max_fast_forward_char_pair_offset()));
-SLJIT_ASSERT(tmp1_reg_ind < 8 && tmp2_reg_ind == 1);
+SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE && offs1 > offs2 && offs2 >= 0);
+SLJIT_ASSERT(diff <= (unsigned)IN_UCHARS(max_fast_forward_char_pair_offset()));
 
 /* Initialize. */
 if (common->match_end_ptr != 0)
@@ -538,17 +514,12 @@ if (common->match_end_ptr != 0)
   OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(offs1 + 1));
 
   OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, STR_END, 0);
-  CMOV(SLJIT_LESS, STR_END, TMP1, 0);
+  SELECT(SLJIT_LESS, STR_END, TMP1, 0, STR_END);
   }
 
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1));
 add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
 
-/* MOVD xmm, r/m32 */
-instruction[0] = 0x66;
-instruction[1] = 0x0f;
-instruction[2] = 0x6e;
-
 if (char1a == char1b)
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1a));
 else
@@ -569,14 +540,11 @@ else
     }
   }
 
-instruction[3] = 0xc0 | (cmp1a_ind << 3) | tmp1_reg_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
+value = SLJIT_SIMD_REG_128 | SLJIT_SIMD_ELEM_32 | SLJIT_SIMD_LANE_ZERO;
+sljit_emit_simd_lane_mov(compiler, value, SLJIT_FR2, 0, TMP1, 0);
 
 if (char1a != char1b)
-  {
-  instruction[3] = 0xc0 | (cmp1b_ind << 3) | tmp2_reg_ind;
-  sljit_emit_op_custom(compiler, instruction, 4);
-  }
+  sljit_emit_simd_lane_mov(compiler, value, SLJIT_FR4, 0, TMP2, 0);
 
 if (char2a == char2b)
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char2a));
@@ -598,38 +566,18 @@ else
     }
   }
 
-instruction[3] = 0xc0 | (cmp2a_ind << 3) | tmp1_reg_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
+sljit_emit_simd_lane_mov(compiler, value, SLJIT_FR3, 0, TMP1, 0);
 
 if (char2a != char2b)
-  {
-  instruction[3] = 0xc0 | (cmp2b_ind << 3) | tmp2_reg_ind;
-  sljit_emit_op_custom(compiler, instruction, 4);
-  }
-
-/* PSHUFD xmm1, xmm2/m128, imm8 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0x70;
-instruction[4] = 0;
-
-instruction[3] = 0xc0 | (cmp1a_ind << 3) | cmp1a_ind;
-sljit_emit_op_custom(compiler, instruction, 5);
+  sljit_emit_simd_lane_mov(compiler, value, SLJIT_FR5, 0, TMP2, 0);
 
+sljit_emit_simd_lane_replicate(compiler, reg_type | SLJIT_SIMD_ELEM_32, SLJIT_FR2, SLJIT_FR2, 0);
 if (char1a != char1b)
-  {
-  instruction[3] = 0xc0 | (cmp1b_ind << 3) | cmp1b_ind;
-  sljit_emit_op_custom(compiler, instruction, 5);
-  }
-
-instruction[3] = 0xc0 | (cmp2a_ind << 3) | cmp2a_ind;
-sljit_emit_op_custom(compiler, instruction, 5);
+  sljit_emit_simd_lane_replicate(compiler, reg_type | SLJIT_SIMD_ELEM_32, SLJIT_FR4, SLJIT_FR4, 0);
 
+sljit_emit_simd_lane_replicate(compiler, reg_type | SLJIT_SIMD_ELEM_32, SLJIT_FR3, SLJIT_FR3, 0);
 if (char2a != char2b)
-  {
-  instruction[3] = 0xc0 | (cmp2b_ind << 3) | cmp2b_ind;
-  sljit_emit_op_custom(compiler, instruction, 5);
-  }
+  sljit_emit_simd_lane_replicate(compiler, reg_type | SLJIT_SIMD_ELEM_32, SLJIT_FR5, SLJIT_FR5, 0);
 
 #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
 restart = LABEL();
@@ -637,55 +585,91 @@ restart = LABEL();
 
 OP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, diff);
 OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0);
-OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~0xf);
+value = (reg_type == SLJIT_SIMD_REG_256) ? ~0x1f : ~0xf;
+OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, value);
 
-load_from_mem_sse2(compiler, data1_ind, str_ptr_reg_ind, 0);
+value = (reg_type == SLJIT_SIMD_REG_256) ? SLJIT_SIMD_MEM_ALIGNED_256 : SLJIT_SIMD_MEM_ALIGNED_128;
+sljit_emit_simd_mov(compiler, reg_type | value, SLJIT_FR0, SLJIT_MEM1(STR_PTR), 0);
 
 jump[0] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_PTR, 0);
 
-load_from_mem_sse2(compiler, data2_ind, str_ptr_reg_ind, -(sljit_s8)diff);
+sljit_emit_simd_mov(compiler, reg_type, SLJIT_FR1, SLJIT_MEM1(STR_PTR), -(sljit_sw)diff);
 jump[1] = JUMP(SLJIT_JUMP);
 
 JUMPHERE(jump[0]);
 
-/* MOVDQA xmm1, xmm2/m128 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0x6f;
-instruction[3] = 0xc0 | (data2_ind << 3) | data1_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-/* PSLLDQ xmm1, imm8 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0x73;
-instruction[3] = 0xc0 | (7 << 3) | data2_ind;
-instruction[4] = diff;
-sljit_emit_op_custom(compiler, instruction, 5);
+if (reg_type == SLJIT_SIMD_REG_256)
+  {
+  if (diff != 16)
+    {
+    /* PSLLDQ ymm1, ymm2, imm8 */
+    instruction[0] = 0xc5;
+    instruction[1] = (sljit_u8)(0xf9 ^ (data2_ind << 3));
+    instruction[2] = 0x73;
+    instruction[3] = 0xc0 | (7 << 3) | data1_ind;
+    instruction[4] = diff & 0xf;
+    sljit_emit_op_custom(compiler, instruction, 5);
+    }
+
+  instruction[0] = 0xc4;
+  instruction[1] = 0xe3;
+  if (diff < 16)
+    {
+    /* VINSERTI128 xmm1, xmm2, xmm3/m128 */
+    /* instruction[0] = 0xc4; */
+    /* instruction[1] = 0xe3; */
+    instruction[2] = (sljit_u8)(0x7d ^ (data2_ind << 3));
+    instruction[3] = 0x38;
+    SLJIT_ASSERT(sljit_get_register_index(SLJIT_GP_REGISTER, STR_PTR) <= 7);
+    instruction[4] = 0x40 | (data2_ind << 3) | sljit_get_register_index(SLJIT_GP_REGISTER, STR_PTR);
+    instruction[5] = (sljit_u8)(16 - diff);
+    instruction[6] = 1;
+    sljit_emit_op_custom(compiler, instruction, 7);
+    }
+  else
+    {
+    /* VPERM2I128 xmm1, xmm2, xmm3/m128 */
+    /* instruction[0] = 0xc4; */
+    /* instruction[1] = 0xe3; */
+    value = (diff == 16) ? data1_ind : data2_ind;
+    instruction[2] = (sljit_u8)(0x7d ^ (value << 3));
+    instruction[3] = 0x46;
+    instruction[4] = 0xc0 | (data2_ind << 3) | value;
+    instruction[5] = 0x08;
+    sljit_emit_op_custom(compiler, instruction, 6);
+    }
+  }
+else
+  {
+  /* MOVDQA xmm1, xmm2/m128 */
+  instruction[0] = 0x66;
+  instruction[1] = 0x0f;
+  instruction[2] = 0x6f;
+  instruction[3] = 0xc0 | (data2_ind << 3) | data1_ind;
+  sljit_emit_op_custom(compiler, instruction, 4);
+
+  /* PSLLDQ xmm1, imm8 */
+  /* instruction[0] = 0x66; */
+  /* instruction[1] = 0x0f; */
+  instruction[2] = 0x73;
+  instruction[3] = 0xc0 | (7 << 3) | data2_ind;
+  instruction[4] = diff;
+  sljit_emit_op_custom(compiler, instruction, 5);
+  }
 
 JUMPHERE(jump[1]);
 
-OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf);
+value = (reg_type == SLJIT_SIMD_REG_256) ? 0x1f : 0xf;
+OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, value);
 
 for (i = 0; i < 4; i++)
   {
-  fast_forward_char_pair_sse2_compare(compiler, compare2_type, i, data2_ind, cmp2a_ind, cmp2b_ind, tmp2_ind);
-  fast_forward_char_pair_sse2_compare(compiler, compare1_type, i, data1_ind, cmp1a_ind, cmp1b_ind, tmp1_ind);
+  fast_forward_char_pair_sse2_compare(compiler, compare2_type, reg_type, i, data2_ind, cmp2a_ind, cmp2b_ind, tmp2_ind);
+  fast_forward_char_pair_sse2_compare(compiler, compare1_type, reg_type, i, data1_ind, cmp1a_ind, cmp1b_ind, tmp1_ind);
   }
 
-/* PAND xmm1, xmm2/m128 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xdb;
-instruction[3] = 0xc0 | (data1_ind << 3) | data2_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-/* PMOVMSKB reg, xmm */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xd7;
-instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | 0;
-sljit_emit_op_custom(compiler, instruction, 4);
+sljit_emit_simd_op2(compiler, SLJIT_SIMD_OP2_AND | reg_type, SLJIT_FR0, SLJIT_FR0, SLJIT_FR1);
+sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | reg_type | SLJIT_SIMD_ELEM_8, SLJIT_FR0, TMP1, 0);
 
 /* Ignore matches before the first STR_PTR. */
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
@@ -698,36 +682,28 @@ OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, T
 /* Main loop. */
 start = LABEL();
 
-OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16);
+value = (reg_type == SLJIT_SIMD_REG_256) ? 32 : 16;
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, value);
 add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
 
-load_from_mem_sse2(compiler, data1_ind, str_ptr_reg_ind, 0);
-load_from_mem_sse2(compiler, data2_ind, str_ptr_reg_ind, -(sljit_s8)diff);
+value = (reg_type == SLJIT_SIMD_REG_256) ? SLJIT_SIMD_MEM_ALIGNED_256 : SLJIT_SIMD_MEM_ALIGNED_128;
+sljit_emit_simd_mov(compiler, reg_type | value, SLJIT_FR0, SLJIT_MEM1(STR_PTR), 0);
+sljit_emit_simd_mov(compiler, reg_type, SLJIT_FR1, SLJIT_MEM1(STR_PTR), -(sljit_sw)diff);
 
 for (i = 0; i < 4; i++)
   {
-  fast_forward_char_pair_sse2_compare(compiler, compare1_type, i, data1_ind, cmp1a_ind, cmp1b_ind, tmp2_ind);
-  fast_forward_char_pair_sse2_compare(compiler, compare2_type, i, data2_ind, cmp2a_ind, cmp2b_ind, tmp1_ind);
+  fast_forward_char_pair_sse2_compare(compiler, compare1_type, reg_type, i, data1_ind, cmp1a_ind, cmp1b_ind, tmp2_ind);
+  fast_forward_char_pair_sse2_compare(compiler, compare2_type, reg_type, i, data2_ind, cmp2a_ind, cmp2b_ind, tmp1_ind);
   }
 
-/* PAND xmm1, xmm2/m128 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xdb;
-instruction[3] = 0xc0 | (data1_ind << 3) | data2_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-/* PMOVMSKB reg, xmm */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xd7;
-instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | 0;
-sljit_emit_op_custom(compiler, instruction, 4);
+sljit_emit_simd_op2(compiler, SLJIT_SIMD_OP2_AND | reg_type, SLJIT_FR0, SLJIT_FR0, SLJIT_FR1);
+sljit_emit_simd_sign(compiler, SLJIT_SIMD_STORE | reg_type | SLJIT_SIMD_ELEM_8, SLJIT_FR0, TMP1, 0);
 
 CMPTO(SLJIT_ZERO, TMP1, 0, SLJIT_IMM, 0, start);
 
 JUMPHERE(jump[0]);
 
+SLJIT_ASSERT(tmp1_reg_ind < 8);
 /* BSF r32, r/m32 */
 instruction[0] = 0x0f;
 instruction[1] = 0xbc;
@@ -762,7 +738,7 @@ if (common->match_end_ptr != 0)
 
 #endif /* !_WIN64 */
 
-#undef SSE2_COMPARE_TYPE_INDEX
+#undef SIMD_COMPARE_TYPE_INDEX
 
 #endif /* SLJIT_CONFIG_X86 */
 
@@ -865,14 +841,14 @@ static void fast_forward_char_simd(compi
 {
 DEFINE_COMPILER;
 int_char ic;
-struct sljit_jump *partial_quit;
+struct sljit_jump *partial_quit, *quit;
 /* Save temporary registers. */
 OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STR_PTR, 0);
 OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP3, 0);
 
 /* Prepare function arguments */
 OP1(SLJIT_MOV, SLJIT_R0, 0, STR_END, 0);
-OP1(SLJIT_MOV, SLJIT_R1, 0, STR_PTR, 0);
+GET_LOCAL_BASE(SLJIT_R1, 0, LOCALS0);
 OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, offset);
 
 if (char1 == char2)
@@ -944,9 +920,14 @@ if (common->mode == PCRE2_JIT_COMPLETE)
 
 /* Fast forward STR_PTR to the result of memchr. */
 OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0);
-
 if (common->mode != PCRE2_JIT_COMPLETE)
+  {
+  quit = CMP(SLJIT_NOT_ZERO, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
   JUMPHERE(partial_quit);
+  OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_PTR, 0, STR_END, 0);
+  SELECT(SLJIT_GREATER, STR_PTR, STR_END, 0, STR_PTR);
+  JUMPHERE(quit);
+  }
 }
 
 typedef enum {
@@ -1068,10 +1049,10 @@ else
   OP2(SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, IN_UCHARS(offs1 + 1));
 
   OP2U(SLJIT_SUB | SLJIT_SET_LESS, STR_END, 0, SLJIT_R0, 0);
-  CMOV(SLJIT_LESS, SLJIT_R0, STR_END, 0);
+  SELECT(SLJIT_LESS, SLJIT_R0, STR_END, 0, SLJIT_R0);
   }
 
-OP1(SLJIT_MOV, SLJIT_R1, 0, STR_PTR, 0); 
+GET_LOCAL_BASE(SLJIT_R1, 0, LOCALS0);
 OP1(SLJIT_MOV_S32, SLJIT_R2, 0, SLJIT_IMM, offs1);
 OP1(SLJIT_MOV_S32, SLJIT_R3, 0, SLJIT_IMM, offs2);
 ic.c.c1 = char1a;
@@ -1177,7 +1158,7 @@ if (step == 0)
   OP1(SLJIT_MOV, tmp_general_reg, 0, SLJIT_IMM, chr);
 
   /* VLVG */
-  instruction[0] = (sljit_u16)(0xe700 | (dst_vreg << 4) | sljit_get_register_index(tmp_general_reg));
+  instruction[0] = (sljit_u16)(0xe700 | (dst_vreg << 4) | sljit_get_register_index(SLJIT_GP_REGISTER, tmp_general_reg));
   instruction[1] = 0;
   instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0x8 << 8) | 0x22);
   sljit_emit_op_custom(compiler, instruction, 6);
@@ -1256,8 +1237,8 @@ struct sljit_label *restart;
 struct sljit_jump *quit;
 struct sljit_jump *partial_quit[2];
 vector_compare_type compare_type = vector_compare_match1;
-sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1);
-sljit_s32 str_ptr_reg_ind = sljit_get_register_index(STR_PTR);
+sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
+sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, STR_PTR);
 sljit_s32 data_ind = 0;
 sljit_s32 tmp_ind = 1;
 sljit_s32 cmp1_ind = 2;
@@ -1419,7 +1400,7 @@ if (common->mode != PCRE2_JIT_COMPLETE)
   JUMPHERE(partial_quit[0]);
   JUMPHERE(partial_quit[1]);
   OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_PTR, 0, STR_END, 0);
-  CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0);
+  SELECT(SLJIT_GREATER, STR_PTR, STR_END, 0, STR_PTR);
   }
 else
   add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
@@ -1454,8 +1435,8 @@ struct sljit_label *start;
 struct sljit_jump *quit;
 jump_list *not_found = NULL;
 vector_compare_type compare_type = vector_compare_match1;
-sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1);
-sljit_s32 tmp3_reg_ind = sljit_get_register_index(TMP3);
+sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
+sljit_s32 tmp3_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP3);
 sljit_s32 data_ind = 0;
 sljit_s32 tmp_ind = 1;
 sljit_s32 cmp1_ind = 2;
@@ -1624,9 +1605,9 @@ vector_compare_type compare2_type = vect
 sljit_u32 bit1 = 0;
 sljit_u32 bit2 = 0;
 sljit_s32 diff = IN_UCHARS(offs2 - offs1);
-sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1);
-sljit_s32 tmp2_reg_ind = sljit_get_register_index(TMP2);
-sljit_s32 str_ptr_reg_ind = sljit_get_register_index(STR_PTR);
+sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
+sljit_s32 tmp2_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP2);
+sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, STR_PTR);
 sljit_s32 data1_ind = 0;
 sljit_s32 data2_ind = 1;
 sljit_s32 tmp1_ind = 2;
@@ -1674,7 +1655,7 @@ if (common->match_end_ptr != 0)
   OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(offs1 + 1));
 
   OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, STR_END, 0);
-  CMOV(SLJIT_LESS, STR_END, TMP1, 0);
+  SELECT(SLJIT_LESS, STR_END, TMP1, 0, STR_END);
   }
 
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1));
@@ -1855,4 +1836,520 @@ if (common->match_end_ptr != 0)
 
 #endif /* SLJIT_CONFIG_S390X */
 
+#if (defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64)
+
+#ifdef __linux__
+/* Using getauxval(AT_HWCAP) under Linux for detecting whether LSX is available */
+#include <sys/auxv.h>
+#define LOONGARCH_HWCAP_LSX  (1 << 4)
+#define HAS_LSX_SUPPORT ((getauxval(AT_HWCAP) & LOONGARCH_HWCAP_LSX) != 0)
+#else
+#define HAS_LSX_SUPPORT 0
+#endif
+
+typedef sljit_ins sljit_u32;
+
+#define SI12_IMM_MASK   0x003ffc00
+#define UI5_IMM_MASK    0x00007c00
+#define UI2_IMM_MASK    0x00000c00
+
+#define VD(vd)      ((sljit_ins)vd << 0)
+#define VJ(vj)      ((sljit_ins)vj << 5)
+#define VK(vk)      ((sljit_ins)vk << 10)
+#define RD_V(rd)    ((sljit_ins)rd << 0)
+#define RJ_V(rj)    ((sljit_ins)rj << 5)
+
+#define IMM_SI12(imm)   (((sljit_ins)(imm) << 10) & SI12_IMM_MASK)
+#define IMM_UI5(imm)    (((sljit_ins)(imm) << 10) & UI5_IMM_MASK)
+#define IMM_UI2(imm)    (((sljit_ins)(imm) << 10) & UI2_IMM_MASK)
+
+// LSX OPCODES:
+#define VLD           0x2c000000
+#define VOR_V         0x71268000
+#define VAND_V        0x71260000
+#define VBSLL_V       0x728e0000
+#define VMSKLTZ_B     0x729c4000
+#define VPICKVE2GR_WU 0x72f3e000
+
+#if PCRE2_CODE_UNIT_WIDTH == 8
+#define VREPLGR2VR  0x729f0000
+#define VSEQ        0x70000000
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+#define VREPLGR2VR  0x729f0400
+#define VSEQ        0x70008000
+#else
+#define VREPLGR2VR  0x729f0800
+#define VSEQ        0x70010000
+#endif
+
+static void fast_forward_char_pair_lsx_compare(struct sljit_compiler *compiler, vector_compare_type compare_type,
+  sljit_s32 dst_ind, sljit_s32 cmp1_ind, sljit_s32 cmp2_ind, sljit_s32 tmp_ind)
+{
+if (compare_type != vector_compare_match2)
+  {
+  if (compare_type == vector_compare_match1i)
+    {
+    /* VOR.V vd, vj, vk */
+    push_inst(compiler, VOR_V | VD(dst_ind) | VJ(cmp2_ind) | VK(dst_ind));
+    }
+
+  /* VSEQ.B/H/W vd, vj, vk */
+  push_inst(compiler, VSEQ | VD(dst_ind) | VJ(dst_ind) | VK(cmp1_ind));
+  return;
+  }
+
+/* VBSLL.V vd, vj, ui5 */
+push_inst(compiler, VBSLL_V | VD(tmp_ind) | VJ(dst_ind) | IMM_UI5(0));
+
+/* VSEQ.B/H/W vd, vj, vk */
+push_inst(compiler, VSEQ | VD(dst_ind) | VJ(dst_ind) | VK(cmp1_ind));
+
+/* VSEQ.B/H/W vd, vj, vk */
+push_inst(compiler, VSEQ | VD(tmp_ind) | VJ(tmp_ind) | VK(cmp2_ind));
+
+/* VOR vd, vj, vk */
+push_inst(compiler, VOR_V | VD(dst_ind) | VJ(tmp_ind) | VK(dst_ind));
+return;
+}
+
+#define JIT_HAS_FAST_FORWARD_CHAR_SIMD HAS_LSX_SUPPORT
+
+static void fast_forward_char_simd(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2, sljit_s32 offset)
+{
+DEFINE_COMPILER;
+struct sljit_label *start;
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+struct sljit_label *restart;
+#endif
+struct sljit_jump *quit;
+struct sljit_jump *partial_quit[2];
+vector_compare_type compare_type = vector_compare_match1;
+sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
+sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, STR_PTR);
+sljit_s32 data_ind = 0;
+sljit_s32 tmp_ind = 1;
+sljit_s32 cmp1_ind = 2;
+sljit_s32 cmp2_ind = 3;
+sljit_u32 bit = 0;
+
+SLJIT_UNUSED_ARG(offset);
+
+if (char1 != char2)
+  {
+  bit = char1 ^ char2;
+  compare_type = vector_compare_match1i;
+
+  if (!is_powerof2(bit))
+    {
+    bit = 0;
+    compare_type = vector_compare_match2;
+    }
+  }
+
+partial_quit[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
+if (common->mode == PCRE2_JIT_COMPLETE)
+  add_jump(compiler, &common->failed_match, partial_quit[0]);
+
+/* First part (unaligned start) */
+
+OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, char1 | bit);
+
+/* VREPLGR2VR.B/H/W vd, rj */
+push_inst(compiler, VREPLGR2VR | VD(cmp1_ind) | RJ_V(tmp1_reg_ind));
+
+if (char1 != char2)
+  {
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, bit != 0 ? bit : char2);
+
+  /* VREPLGR2VR.B/H/W vd, rj */
+  push_inst(compiler, VREPLGR2VR | VD(cmp2_ind) | RJ_V(tmp1_reg_ind));
+  }
+
+OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0);
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+restart = LABEL();
+#endif
+
+OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf);
+OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
+
+/* VLD vd, rj, si12 */
+push_inst(compiler, VLD | VD(data_ind) | RJ_V(str_ptr_reg_ind) | IMM_SI12(0));
+fast_forward_char_pair_lsx_compare(compiler, compare_type, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
+
+/* VMSKLTZ.B vd, vj */
+push_inst(compiler, VMSKLTZ_B | VD(tmp_ind) | VJ(data_ind));
+
+/* VPICKVE2GR.WU rd, vj, ui2 */
+push_inst(compiler, VPICKVE2GR_WU | RD_V(tmp1_reg_ind) | VJ(tmp_ind) | IMM_UI2(0));
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
+OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, TMP2, 0);
+
+quit = CMP(SLJIT_NOT_ZERO, TMP1, 0, SLJIT_IMM, 0);
+
+OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
+
+/* Second part (aligned) */
+start = LABEL();
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16);
+
+partial_quit[1] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
+if (common->mode == PCRE2_JIT_COMPLETE)
+  add_jump(compiler, &common->failed_match, partial_quit[1]);
+
+/* VLD vd, rj, si12 */
+push_inst(compiler, VLD | VD(data_ind) | RJ_V(str_ptr_reg_ind) | IMM_SI12(0));
+fast_forward_char_pair_lsx_compare(compiler, compare_type, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
+
+/* VMSKLTZ.B vd, vj */
+push_inst(compiler, VMSKLTZ_B | VD(tmp_ind) | VJ(data_ind));
+
+/* VPICKVE2GR.WU rd, vj, ui2 */
+push_inst(compiler, VPICKVE2GR_WU | RD_V(tmp1_reg_ind) | VJ(tmp_ind) | IMM_UI2(0));
+
+CMPTO(SLJIT_ZERO, TMP1, 0, SLJIT_IMM, 0, start);
+
+JUMPHERE(quit);
+
+/* CTZ.W rd, rj */
+push_inst(compiler, CTZ_W | RD_V(tmp1_reg_ind) | RJ_V(tmp1_reg_ind));
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
+
+if (common->mode != PCRE2_JIT_COMPLETE)
+  {
+  JUMPHERE(partial_quit[0]);
+  JUMPHERE(partial_quit[1]);
+  OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_PTR, 0, STR_END, 0);
+  SELECT(SLJIT_GREATER, STR_PTR, STR_END, 0, STR_PTR);
+  }
+else
+  add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+if (common->utf && offset > 0)
+  {
+  SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE);
+
+  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offset));
+
+  quit = jump_if_utf_char_start(compiler, TMP1);
+
+  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+  add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+  OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0);
+  JUMPTO(SLJIT_JUMP, restart);
+
+  JUMPHERE(quit);
+  }
+#endif
+}
+
+#define JIT_HAS_FAST_REQUESTED_CHAR_SIMD HAS_LSX_SUPPORT
+
+static jump_list *fast_requested_char_simd(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2)
+{
+DEFINE_COMPILER;
+struct sljit_label *start;
+struct sljit_jump *quit;
+jump_list *not_found = NULL;
+vector_compare_type compare_type = vector_compare_match1;
+sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
+sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, STR_PTR);
+sljit_s32 data_ind = 0;
+sljit_s32 tmp_ind = 1;
+sljit_s32 cmp1_ind = 2;
+sljit_s32 cmp2_ind = 3;
+sljit_u32 bit = 0;
+
+if (char1 != char2)
+  {
+  bit = char1 ^ char2;
+  compare_type = vector_compare_match1i;
+
+  if (!is_powerof2(bit))
+    {
+    bit = 0;
+    compare_type = vector_compare_match2;
+    }
+  }
+
+add_jump(compiler, &not_found, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_END, 0));
+OP1(SLJIT_MOV, TMP2, 0, TMP1, 0);
+OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0);
+
+/* First part (unaligned start) */
+
+OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, char1 | bit);
+
+/* VREPLGR2VR vd, rj */
+push_inst(compiler, VREPLGR2VR | VD(cmp1_ind) | RJ_V(tmp1_reg_ind));
+
+if (char1 != char2)
+  {
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, bit != 0 ? bit : char2);
+  /* VREPLGR2VR vd, rj */
+  push_inst(compiler, VREPLGR2VR | VD(cmp2_ind) | RJ_V(tmp1_reg_ind));
+  }
+
+OP1(SLJIT_MOV, STR_PTR, 0, TMP2, 0);
+OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf);
+OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
+
+/* VLD vd, rj, si12 */
+push_inst(compiler, VLD | VD(data_ind) | RJ_V(str_ptr_reg_ind) | IMM_SI12(0));
+fast_forward_char_pair_lsx_compare(compiler, compare_type, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
+
+/* VMSKLTZ.B vd, vj */
+push_inst(compiler, VMSKLTZ_B | VD(tmp_ind) | VJ(data_ind));
+
+/* VPICKVE2GR.WU rd, vj, ui2 */
+push_inst(compiler, VPICKVE2GR_WU | RD_V(tmp1_reg_ind) | VJ(tmp_ind) | IMM_UI2(0));
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
+OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, TMP2, 0);
+
+quit = CMP(SLJIT_NOT_ZERO, TMP1, 0, SLJIT_IMM, 0);
+
+OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
+
+/* Second part (aligned) */
+start = LABEL();
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16);
+
+add_jump(compiler, &not_found, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+
+/* VLD vd, rj, si12 */
+push_inst(compiler, VLD | VD(data_ind) | RJ_V(str_ptr_reg_ind) | IMM_SI12(0));
+fast_forward_char_pair_lsx_compare(compiler, compare_type, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
+
+/* VMSKLTZ.B vd, vj */
+push_inst(compiler, VMSKLTZ_B | VD(tmp_ind) | VJ(data_ind));
+
+/* VPICKVE2GR.WU rd, vj, ui2 */
+push_inst(compiler, VPICKVE2GR_WU | RD_V(tmp1_reg_ind) | VJ(tmp_ind) | IMM_UI2(0));
+
+CMPTO(SLJIT_ZERO, TMP1, 0, SLJIT_IMM, 0, start);
+
+JUMPHERE(quit);
+
+/* CTZ.W rd, rj */
+push_inst(compiler, CTZ_W | RD_V(tmp1_reg_ind) | RJ_V(tmp1_reg_ind));
+
+OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, STR_PTR, 0);
+add_jump(compiler, &not_found, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_END, 0));
+
+OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0);
+return not_found;
+}
+
+#define JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD HAS_LSX_SUPPORT
+
+static void fast_forward_char_pair_simd(compiler_common *common, sljit_s32 offs1,
+  PCRE2_UCHAR char1a, PCRE2_UCHAR char1b, sljit_s32 offs2, PCRE2_UCHAR char2a, PCRE2_UCHAR char2b)
+{
+DEFINE_COMPILER;
+vector_compare_type compare1_type = vector_compare_match1;
+vector_compare_type compare2_type = vector_compare_match1;
+sljit_u32 bit1 = 0;
+sljit_u32 bit2 = 0;
+sljit_u32 diff = IN_UCHARS(offs1 - offs2);
+sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
+sljit_s32 tmp2_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP2);
+sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, STR_PTR);
+sljit_s32 data1_ind = 0;
+sljit_s32 data2_ind = 1;
+sljit_s32 tmp1_ind = 2;
+sljit_s32 tmp2_ind = 3;
+sljit_s32 cmp1a_ind = 4;
+sljit_s32 cmp1b_ind = 5;
+sljit_s32 cmp2a_ind = 6;
+sljit_s32 cmp2b_ind = 7;
+struct sljit_label *start;
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+struct sljit_label *restart;
+#endif
+struct sljit_jump *jump[2];
+
+SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE && offs1 > offs2);
+SLJIT_ASSERT(diff <= IN_UCHARS(max_fast_forward_char_pair_offset()));
+
+/* Initialize. */
+if (common->match_end_ptr != 0)
+  {
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
+  OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(offs1 + 1));
+  OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);
+
+  OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, STR_END, 0);
+  SELECT(SLJIT_LESS, STR_END, TMP1, 0, STR_END);
+  }
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1));
+add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+
+if (char1a == char1b)
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, char1a);
+else
+  {
+  bit1 = char1a ^ char1b;
+  if (is_powerof2(bit1))
+    {
+    compare1_type = vector_compare_match1i;
+    OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, char1a | bit1);
+    OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, bit1);
+    }
+  else
+    {
+    compare1_type = vector_compare_match2;
+    bit1 = 0;
+    OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, char1a);
+    OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, char1b);
+    }
+  }
+
+/* VREPLGR2VR vd, rj */
+push_inst(compiler, VREPLGR2VR | VD(cmp1a_ind) | RJ_V(tmp1_reg_ind));
+
+if (char1a != char1b)
+  {
+  /* VREPLGR2VR vd, rj */
+  push_inst(compiler, VREPLGR2VR | VD(cmp1b_ind) | RJ_V(tmp2_reg_ind));
+  }
+
+if (char2a == char2b)
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, char2a);
+else
+  {
+  bit2 = char2a ^ char2b;
+  if (is_powerof2(bit2))
+    {
+    compare2_type = vector_compare_match1i;
+    OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, char2a | bit2);
+    OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, bit2);
+    }
+  else
+    {
+    compare2_type = vector_compare_match2;
+    bit2 = 0;
+    OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, char2a);
+    OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, char2b);
+    }
+  }
+
+/* VREPLGR2VR vd, rj */
+push_inst(compiler, VREPLGR2VR | VD(cmp2a_ind) | RJ_V(tmp1_reg_ind));
+
+if (char2a != char2b)
+  {
+  /* VREPLGR2VR vd, rj */
+  push_inst(compiler, VREPLGR2VR | VD(cmp2b_ind) | RJ_V(tmp2_reg_ind));
+  }
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+restart = LABEL();
+#endif
+
+OP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, diff);
+OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0);
+OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf);
+OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
+
+/* VLD vd, rj, si12 */
+push_inst(compiler, VLD | VD(data1_ind) | RJ_V(str_ptr_reg_ind) | IMM_SI12(0));
+
+jump[0] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_PTR, 0);
+
+/* VLD vd, rj, si12 */
+push_inst(compiler, VLD | VD(data2_ind) | RJ_V(str_ptr_reg_ind) | IMM_SI12(-(sljit_s8)diff));
+jump[1] = JUMP(SLJIT_JUMP);
+
+JUMPHERE(jump[0]);
+
+/* VBSLL.V vd, vj, ui5 */
+push_inst(compiler, VBSLL_V | VD(data2_ind) | VJ(data1_ind) | IMM_UI5(diff));
+
+JUMPHERE(jump[1]);
+
+fast_forward_char_pair_lsx_compare(compiler, compare2_type, data2_ind, cmp2a_ind, cmp2b_ind, tmp2_ind);
+fast_forward_char_pair_lsx_compare(compiler, compare1_type, data1_ind, cmp1a_ind, cmp1b_ind, tmp1_ind);
+
+/* VAND vd, vj, vk */
+push_inst(compiler, VOR_V | VD(data1_ind) | VJ(data1_ind) | VK(data2_ind));
+
+/* VMSKLTZ.B vd, vj */
+push_inst(compiler, VMSKLTZ_B | VD(tmp1_ind) | VJ(data1_ind));
+
+/* VPICKVE2GR.WU rd, vj, ui2 */
+push_inst(compiler, VPICKVE2GR_WU | RD_V(tmp1_reg_ind) | VJ(tmp1_ind) | IMM_UI2(0));
+
+/* Ignore matches before the first STR_PTR. */
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
+OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, TMP2, 0);
+
+jump[0] = CMP(SLJIT_NOT_ZERO, TMP1, 0, SLJIT_IMM, 0);
+
+OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
+
+/* Main loop. */
+start = LABEL();
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16);
+add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+
+/* VLD vd, rj, si12 */
+push_inst(compiler, VLD | VD(data1_ind) | RJ_V(str_ptr_reg_ind) | IMM_SI12(0));
+push_inst(compiler, VLD | VD(data2_ind) | RJ_V(str_ptr_reg_ind) | IMM_SI12(-(sljit_s8)diff));
+
+fast_forward_char_pair_lsx_compare(compiler, compare1_type, data1_ind, cmp1a_ind, cmp1b_ind, tmp2_ind);
+fast_forward_char_pair_lsx_compare(compiler, compare2_type, data2_ind, cmp2a_ind, cmp2b_ind, tmp1_ind);
+
+/* VAND.V vd, vj, vk */
+push_inst(compiler, VAND_V | VD(data1_ind) | VJ(data1_ind) | VK(data2_ind));
+
+/* VMSKLTZ.B vd, vj */
+push_inst(compiler, VMSKLTZ_B | VD(tmp1_ind) | VJ(data1_ind));
+
+/* VPICKVE2GR.WU rd, vj, ui2 */
+push_inst(compiler, VPICKVE2GR_WU | RD_V(tmp1_reg_ind) | VJ(tmp1_ind) | IMM_UI2(0));
+
+CMPTO(SLJIT_ZERO, TMP1, 0, SLJIT_IMM, 0, start);
+
+JUMPHERE(jump[0]);
+
+/* CTZ.W rd, rj */
+push_inst(compiler, CTZ_W | RD_V(tmp1_reg_ind) | RJ_V(tmp1_reg_ind));
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
+
+add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+if (common->utf)
+  {
+  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offs1));
+
+  jump[0] = jump_if_utf_char_start(compiler, TMP1);
+
+  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+  CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, restart);
+
+  add_jump(compiler, &common->failed_match, JUMP(SLJIT_JUMP));
+
+  JUMPHERE(jump[0]);
+  }
+#endif
+
+OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1));
+
+if (common->match_end_ptr != 0)
+  OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
+}
+
+#endif /* SLJIT_CONFIG_LOONGARCH_64 */
+
 #endif /* !SUPPORT_VALGRIND */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_maketables.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_maketables.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_maketables.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_maketables.c	2024-11-20 13:56:33.000000000 +0000
@@ -52,8 +52,6 @@ PCRE2_DFTABLES is defined. */
 #  include "pcre2_internal.h"
 #endif
 
-
-
 /*************************************************
 *           Create PCRE2 character tables        *
 *************************************************/
@@ -98,7 +96,11 @@ for (i = 0; i < 256; i++) *p++ = tolower
 
 /* Next the case-flipping table */
 
-for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i);
+for (i = 0; i < 256; i++)
+  {
+  int c = islower(i)? toupper(i) : tolower(i);
+  *p++ = (c < 256)? c : i;
+  }
 
 /* Then the character class tables. Don't try to be clever and save effort on
 exclusive ones - in some locales things may be different.
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_match.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_match.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_match.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_match.c	2024-11-20 13:56:33.000000000 +0000
@@ -7,7 +7,7 @@ and semantics are as close as possible t
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2015-2022 University of Cambridge
+          New API code Copyright (c) 2015-2024 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -43,6 +43,8 @@ POSSIBILITY OF SUCH DAMAGE.
 #include "config.h"
 #endif
 
+#include "pcre2_internal.h"
+
 /* These defines enable debugging code */
 
 /* #define DEBUG_FRAMES_DISPLAY */
@@ -53,6 +55,10 @@ POSSIBILITY OF SUCH DAMAGE.
 #include <stdarg.h>
 #endif
 
+#ifdef DEBUG_SHOW_OPS
+static const char *OP_names[] = { OP_NAME_LIST };
+#endif
+
 /* These defines identify the name of the block containing "static"
 information, and fields within it. */
 
@@ -60,8 +66,6 @@ information, and fields within it. */
 #define PSSTART start_subject   /* Field containing processed string start */
 #define PSEND   end_subject     /* Field containing processed string end */
 
-#include "pcre2_internal.h"
-
 #define RECURSE_UNSET 0xffffffffu  /* Bigger than max group number */
 
 /* Masks for identifying the public options that are permitted at match time. */
@@ -69,7 +73,8 @@ information, and fields within it. */
 #define PUBLIC_MATCH_OPTIONS \
   (PCRE2_ANCHORED|PCRE2_ENDANCHORED|PCRE2_NOTBOL|PCRE2_NOTEOL|PCRE2_NOTEMPTY| \
    PCRE2_NOTEMPTY_ATSTART|PCRE2_NO_UTF_CHECK|PCRE2_PARTIAL_HARD| \
-   PCRE2_PARTIAL_SOFT|PCRE2_NO_JIT|PCRE2_COPY_MATCHED_SUBJECT)
+   PCRE2_PARTIAL_SOFT|PCRE2_NO_JIT|PCRE2_COPY_MATCHED_SUBJECT| \
+   PCRE2_DISABLE_RECURSELOOP_CHECK)
 
 #define PUBLIC_JIT_MATCH_OPTIONS \
    (PCRE2_NO_UTF_CHECK|PCRE2_NOTBOL|PCRE2_NOTEOL|PCRE2_NOTEMPTY|\
@@ -150,7 +155,7 @@ changed, the code at RETURN_SWITCH below
 enum { RM1=1, RM2,  RM3,  RM4,  RM5,  RM6,  RM7,  RM8,  RM9,  RM10,
        RM11,  RM12, RM13, RM14, RM15, RM16, RM17, RM18, RM19, RM20,
        RM21,  RM22, RM23, RM24, RM25, RM26, RM27, RM28, RM29, RM30,
-       RM31,  RM32, RM33, RM34, RM35, RM36 };
+       RM31,  RM32, RM33, RM34, RM35, RM36, RM37 };
 
 #ifdef SUPPORT_WIDE_CHARS
 enum { RM100=100, RM101 };
@@ -597,11 +602,12 @@ heapframe *P = NULL;
 
 heapframe *frames_top;  /* End of frames vector */
 heapframe *assert_accept_frame = NULL;  /* For passing back a frame with captures */
-PCRE2_SIZE heapframes_size;   /* Usable size of frames vector */
 PCRE2_SIZE frame_copy_size;   /* Amount to copy when creating a new frame */
 
 /* Local variables that do not need to be preserved over calls to RRMATCH(). */
 
+PCRE2_SPTR branch_end = NULL;
+PCRE2_SPTR branch_start;
 PCRE2_SPTR bracode;     /* Temp pointer to start of group */
 PCRE2_SIZE offset;      /* Used for group offsets */
 PCRE2_SIZE length;      /* Used for various length calculations */
@@ -635,13 +641,10 @@ copied when a new frame is created. */
 
 frame_copy_size = frame_size - offsetof(heapframe, eptr);
 
-/* Set up the first frame and the end of the frames vector. We set the local
-heapframes_size to the usuable amount of the vector, that is, a whole number of
-frames. */
+/* Set up the first frame and the end of the frames vector. */
 
 F = match_data->heapframes;
-heapframes_size = (match_data->heapframes_size / frame_size) * frame_size;
-frames_top = (heapframe *)((char *)F + heapframes_size);
+frames_top = (heapframe *)((char *)F + match_data->heapframes_size);
 
 Frdepth = 0;                        /* "Recursion" depth */
 Fcapture_last = 0;                  /* Number of most recent capture */
@@ -662,35 +665,54 @@ MATCH_RECURSE:
 doubling the size, but constrained by the heap limit (which is in KiB). */
 
 N = (heapframe *)((char *)F + frame_size);
-if (N >= frames_top)
+if ((heapframe *)((char *)N + frame_size) >= frames_top)
   {
   heapframe *new;
-  PCRE2_SIZE newsize = match_data->heapframes_size * 2;
+  PCRE2_SIZE newsize;
+  PCRE2_SIZE usedsize = (char *)N - (char *)(match_data->heapframes);
 
-  if (newsize > mb->heap_limit)
+  if (match_data->heapframes_size >= PCRE2_SIZE_MAX / 2)
     {
-    PCRE2_SIZE maxsize = (mb->heap_limit/frame_size) * frame_size;
-    if (match_data->heapframes_size >= maxsize) return PCRE2_ERROR_HEAPLIMIT;
-    newsize = maxsize;
+    if (match_data->heapframes_size == PCRE2_SIZE_MAX - 1)
+      return PCRE2_ERROR_NOMEMORY;
+    newsize = PCRE2_SIZE_MAX - 1;
     }
+  else
+    newsize = match_data->heapframes_size * 2;
 
+  if (newsize / 1024 >= mb->heap_limit)
+    {
+    PCRE2_SIZE old_size = match_data->heapframes_size / 1024;
+    if (mb->heap_limit <= old_size)
+      return PCRE2_ERROR_HEAPLIMIT;
+    else
+      {
+      PCRE2_SIZE max_delta = 1024 * (mb->heap_limit - old_size);
+      int over_bytes = match_data->heapframes_size % 1024;
+      if (over_bytes) max_delta -= (1024 - over_bytes);
+      newsize = match_data->heapframes_size + max_delta;
+      }
+    }
+
+  /* With a heap limit set, the permitted additional size may not be enough for
+  another frame, so do a final check. */
+
+  if (newsize - usedsize < frame_size) return PCRE2_ERROR_HEAPLIMIT;
   new = match_data->memctl.malloc(newsize, match_data->memctl.memory_data);
   if (new == NULL) return PCRE2_ERROR_NOMEMORY;
-  memcpy(new, match_data->heapframes, heapframes_size);
+  memcpy(new, match_data->heapframes, usedsize);
 
-  F = (heapframe *)((char *)new + ((char *)F - (char *)match_data->heapframes));
-  N = (heapframe *)((char *)F + frame_size);
+  N = (heapframe *)((char *)new + usedsize);
+  F = (heapframe *)((char *)N - frame_size);
 
   match_data->memctl.free(match_data->heapframes, match_data->memctl.memory_data);
   match_data->heapframes = new;
   match_data->heapframes_size = newsize;
-
-  heapframes_size = (newsize / frame_size) * frame_size;
-  frames_top = (heapframe *)((char *)new + heapframes_size);
+  frames_top = (heapframe *)((char *)new + newsize);
   }
 
 #ifdef DEBUG_SHOW_RMATCH
-fprintf(stderr, "++ RMATCH %2d frame=%d", Freturn_id, Frdepth + 1);
+fprintf(stderr, "++ RMATCH %d frame=%d", Freturn_id, Frdepth + 1);
 if (group_frame_type != 0)
   {
   fprintf(stderr, " type=%x ", group_frame_type);
@@ -760,10 +782,16 @@ opcodes. */
 if (mb->match_call_count++ >= mb->match_limit) return PCRE2_ERROR_MATCHLIMIT;
 if (Frdepth >= mb->match_limit_depth) return PCRE2_ERROR_DEPTHLIMIT;
 
+#ifdef DEBUG_SHOW_OPS
+fprintf(stderr, "\n++ New frame: type=0x%x subject offset %ld\n",
+  GF_IDMASK(Fgroup_frame_type), Feptr - mb->start_subject);
+#endif
+
 for (;;)
   {
 #ifdef DEBUG_SHOW_OPS
-fprintf(stderr, "++ op=%d\n", *Fecode);
+fprintf(stderr, "++ %2ld op=%3d %s\n", Fecode - mb->start_code, *Fecode,
+  OP_names[*Fecode]);
 #endif
 
   Fop = (uint8_t)(*Fecode);  /* Cast needed for 16-bit and 32-bit modes */
@@ -811,15 +839,16 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
     assert_accept_frame = F;
     RRETURN(MATCH_ACCEPT);
 
-    /* If recursing, we have to find the most recent recursion. */
+    /* For ACCEPT within a recursion, we have to find the most recent
+    recursion. If not in a recursion, fall through to code that is common with
+    OP_END. */
 
     case OP_ACCEPT:
-    case OP_END:
-
-    /* Handle end of a recursion. */
-
     if (Fcurrent_recurse != RECURSE_UNSET)
       {
+#ifdef DEBUG_SHOW_OPS
+      fprintf(stderr, "++ Accept within recursion\n");
+#endif
       offset = Flast_group_offset;
       for(;;)
         {
@@ -842,27 +871,49 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
       Fecode += 1 + LINK_SIZE;
       continue;
       }
+    /* Fall through */
+
+    /* OP_END itself can never be reached within a recursion because that is
+    picked up when the OP_KET that always precedes OP_END is reached. */
+
+    case OP_END:
 
-    /* Not a recursion. Fail for an empty string match if either PCRE2_NOTEMPTY
-    is set, or if PCRE2_NOTEMPTY_ATSTART is set and we have matched at the
-    start of the subject. In both cases, backtracking will then try other
-    alternatives, if any. */
+    /* Fail for an empty string match if either PCRE2_NOTEMPTY is set, or if
+    PCRE2_NOTEMPTY_ATSTART is set and we have matched at the start of the
+    subject. In both cases, backtracking will then try other alternatives, if
+    any. */
 
     if (Feptr == Fstart_match &&
          ((mb->moptions & PCRE2_NOTEMPTY) != 0 ||
            ((mb->moptions & PCRE2_NOTEMPTY_ATSTART) != 0 &&
              Fstart_match == mb->start_subject + mb->start_offset)))
+      {
+#ifdef DEBUG_SHOW_OPS
+      fprintf(stderr, "++ Backtrack because empty string\n");
+#endif
       RRETURN(MATCH_NOMATCH);
+      }
 
-    /* Also fail if PCRE2_ENDANCHORED is set and the end of the match is not
+    /* Fail if PCRE2_ENDANCHORED is set and the end of the match is not
     the end of the subject. After (*ACCEPT) we fail the entire match (at this
-    position) but backtrack on reaching the end of the pattern. */
+    position) but backtrack if we've reached the end of the pattern. This
+    applies whether or not we are in a recursion. */
 
     if (Feptr < mb->end_subject &&
         ((mb->moptions | mb->poptions) & PCRE2_ENDANCHORED) != 0)
       {
-      if (Fop == OP_END) RRETURN(MATCH_NOMATCH);
-      return MATCH_NOMATCH;
+      if (Fop == OP_END)
+        {
+#ifdef DEBUG_SHOW_OPS
+        fprintf(stderr, "++ Backtrack because not at end (endanchored set)\n");
+#endif
+        RRETURN(MATCH_NOMATCH);
+        }
+
+#ifdef DEBUG_SHOW_OPS
+      fprintf(stderr, "++ Failed ACCEPT not at end (endanchnored set)\n");
+#endif
+      return MATCH_NOMATCH;   /* (*ACCEPT) */
       }
 
     /* We have a successful match of the whole pattern. Record the result and
@@ -2435,6 +2486,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
     GETCHARINCTEST(fc, Feptr);
       {
       const uint32_t *cp;
+      uint32_t chartype;
       const ucd_record *prop = GET_UCD(fc);
       BOOL notmatch = Fop == OP_NOTPROP;
 
@@ -2445,9 +2497,10 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
         break;
 
         case PT_LAMP:
-        if ((prop->chartype == ucp_Lu ||
-             prop->chartype == ucp_Ll ||
-             prop->chartype == ucp_Lt) == notmatch)
+        chartype = prop->chartype;
+        if ((chartype == ucp_Lu ||
+             chartype == ucp_Ll ||
+             chartype == ucp_Lt) == notmatch)
           RRETURN(MATCH_NOMATCH);
         break;
 
@@ -2477,8 +2530,9 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
         /* These are specials */
 
         case PT_ALNUM:
-        if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
-             PRIV(ucp_gentype)[prop->chartype] == ucp_N) == notmatch)
+        chartype = prop->chartype;
+        if ((PRIV(ucp_gentype)[chartype] == ucp_L ||
+             PRIV(ucp_gentype)[chartype] == ucp_N) == notmatch)
           RRETURN(MATCH_NOMATCH);
         break;
 
@@ -2503,13 +2557,22 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
         break;
 
         case PT_WORD:
-        if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
-             PRIV(ucp_gentype)[prop->chartype] == ucp_N ||
-             fc == CHAR_UNDERSCORE) == notmatch)
+        chartype = prop->chartype;
+        if ((PRIV(ucp_gentype)[chartype] == ucp_L ||
+             PRIV(ucp_gentype)[chartype] == ucp_N ||
+             chartype == ucp_Mn ||
+             chartype == ucp_Pc) == notmatch)
           RRETURN(MATCH_NOMATCH);
         break;
 
         case PT_CLIST:
+#if PCRE2_CODE_UNIT_WIDTH == 32
+            if (fc > MAX_UTF_CODE_POINT)
+              {
+              if (notmatch) break;;
+              RRETURN(MATCH_NOMATCH);
+              }
+#endif
         cp = PRIV(ucd_caseless_sets) + Fecode[2];
         for (;;)
           {
@@ -2805,16 +2868,17 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
           case PT_WORD:
           for (i = 1; i <= Lmin; i++)
             {
-            int category;
+            int chartype, category;
             if (Feptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
               }
             GETCHARINCTEST(fc, Feptr);
-            category = UCD_CATEGORY(fc);
+            chartype = UCD_CHARTYPE(fc);
+            category = PRIV(ucp_gentype)[chartype];
             if ((category == ucp_L || category == ucp_N ||
-                fc == CHAR_UNDERSCORE) == notmatch)
+                 chartype == ucp_Mn || chartype == ucp_Pc) == notmatch)
               RRETURN(MATCH_NOMATCH);
             }
           break;
@@ -2829,6 +2893,13 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
               RRETURN(MATCH_NOMATCH);
               }
             GETCHARINCTEST(fc, Feptr);
+#if PCRE2_CODE_UNIT_WIDTH == 32
+            if (fc > MAX_UTF_CODE_POINT)
+              {
+              if (notmatch) continue;
+              RRETURN(MATCH_NOMATCH);
+              }
+#endif
             cp = PRIV(ucd_caseless_sets) + Lpropvalue;
             for (;;)
               {
@@ -3609,7 +3680,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
           case PT_WORD:
           for (;;)
             {
-            int category;
+            int chartype, category;
             RMATCH(Fecode, RM215);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (Lmin++ >= Lmax) RRETURN(MATCH_NOMATCH);
@@ -3619,10 +3690,12 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
               RRETURN(MATCH_NOMATCH);
               }
             GETCHARINCTEST(fc, Feptr);
-            category = UCD_CATEGORY(fc);
+            chartype = UCD_CHARTYPE(fc);
+            category = PRIV(ucp_gentype)[chartype];
             if ((category == ucp_L ||
                  category == ucp_N ||
-                 fc == CHAR_UNDERSCORE) == (Lctype == OP_NOTPROP))
+                 chartype == ucp_Mn ||
+                 chartype == ucp_Pc) == (Lctype == OP_NOTPROP))
               RRETURN(MATCH_NOMATCH);
             }
           /* Control never gets here */
@@ -3640,6 +3713,13 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
               RRETURN(MATCH_NOMATCH);
               }
             GETCHARINCTEST(fc, Feptr);
+#if PCRE2_CODE_UNIT_WIDTH == 32
+            if (fc > MAX_UTF_CODE_POINT)
+              {
+              if (Lctype == OP_NOTPROP) continue;
+              RRETURN(MATCH_NOMATCH);
+              }
+#endif
             cp = PRIV(ucd_caseless_sets) + Lpropvalue;
             for (;;)
               {
@@ -4190,7 +4270,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
           case PT_WORD:
           for (i = Lmin; i < Lmax; i++)
             {
-            int category;
+            int chartype, category;
             int len = 1;
             if (Feptr >= mb->end_subject)
               {
@@ -4198,9 +4278,12 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
               break;
               }
             GETCHARLENTEST(fc, Feptr, len);
-            category = UCD_CATEGORY(fc);
-            if ((category == ucp_L || category == ucp_N ||
-                 fc == CHAR_UNDERSCORE) == notmatch)
+            chartype = UCD_CHARTYPE(fc);
+            category = PRIV(ucp_gentype)[chartype];
+            if ((category == ucp_L ||
+                 category == ucp_N ||
+                 chartype == ucp_Mn ||
+                 chartype == ucp_Pc) == notmatch)
               break;
             Feptr+= len;
             }
@@ -4217,14 +4300,24 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
               break;
               }
             GETCHARLENTEST(fc, Feptr, len);
-            cp = PRIV(ucd_caseless_sets) + Lpropvalue;
-            for (;;)
+#if PCRE2_CODE_UNIT_WIDTH == 32
+            if (fc > MAX_UTF_CODE_POINT)
               {
-              if (fc < *cp)
-                { if (notmatch) break; else goto GOT_MAX; }
-              if (fc == *cp++)
-                { if (notmatch) goto GOT_MAX; else break; }
+              if (!notmatch) goto GOT_MAX;
+              }
+            else
+#endif
+              {
+              cp = PRIV(ucd_caseless_sets) + Lpropvalue;
+              for (;;)
+                {
+                if (fc < *cp)
+                  { if (notmatch) break; else goto GOT_MAX; }
+                if (fc == *cp++)
+                  { if (notmatch) goto GOT_MAX; else break; }
+                }
               }
+
             Feptr += len;
             }
           GOT_MAX:
@@ -5322,9 +5415,11 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
 
 
     /* ===================================================================== */
-    /* Recursion either matches the current regex, or some subexpression. The
-    offset data is the offset to the starting bracket from the start of the
-    whole pattern. (This is so that it works from duplicated subpatterns.) */
+    /* Pattern recursion either matches the current regex, or some
+    subexpression. The offset data is the offset to the starting bracket from
+    the start of the whole pattern. This is so that it works from duplicated
+    subpatterns. For a whole-pattern recursion, we have to infer the number
+    zero. */
 
 #define Lframe_type F->temp_32[0]
 #define Lstart_branch F->temp_sptr[0]
@@ -5333,9 +5428,12 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
     bracode = mb->start_code + GET(Fecode, 1);
     number = (bracode == mb->start_code)? 0 : GET2(bracode, 1 + LINK_SIZE);
 
-    /* If we are already in a recursion, check for repeating the same one
-    without advancing the subject pointer. This should catch convoluted mutual
-    recursions. (Some simple cases are caught at compile time.) */
+    /* If we are already in a pattern recursion, check for repeating the same
+    one without changing the subject pointer or the last referenced character
+    in the subject. This should catch convoluted mutual recursions; some
+    simple cases are caught at compile time. However, there are rare cases when
+    this check needs to be turned off. In this case, actual recursion loops
+    will be caught by the match or heap limits. */
 
     if (Fcurrent_recurse != RECURSE_UNSET)
       {
@@ -5346,15 +5444,19 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
         P = (heapframe *)((char *)N - frame_size);
         if (N->group_frame_type == (GF_RECURSE | number))
           {
-          if (Feptr == P->eptr) return PCRE2_ERROR_RECURSELOOP;
+          if (Feptr == P->eptr && mb->last_used_ptr == P->recurse_last_used &&
+               (mb->moptions & PCRE2_DISABLE_RECURSELOOP_CHECK) == 0)
+            return PCRE2_ERROR_RECURSELOOP;
           break;
           }
         offset = P->last_group_offset;
         }
       }
 
-    /* Now run the recursion, branch by branch. */
+    /* Remember the current last referenced character and then run the
+    recursion branch by branch. */
 
+    F->recurse_last_used = mb->last_used_ptr;
     Lstart_branch = bracode;
     Lframe_type = GF_RECURSE | number;
 
@@ -5683,13 +5785,13 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
 
 
     /* ===================================================================== */
-    /* Move the subject pointer back. This occurs only at the start of each
-    branch of a lookbehind assertion. If we are too close to the start to move
-    back, fail. When working with UTF-8 we move back a number of characters,
-    not bytes. */
+    /* Move the subject pointer back by one fixed amount. This occurs at the
+    start of each branch that has a fixed length in a lookbehind assertion. If
+    we are too close to the start to move back, fail. When working with UTF-8
+    we move back a number of characters, not bytes. */
 
     case OP_REVERSE:
-    number = GET(Fecode, 1);
+    number = GET2(Fecode, 1);
 #ifdef SUPPORT_UNICODE
     if (utf)
       {
@@ -5703,7 +5805,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
     else
 #endif
 
-    /* No UTF-8 support, or not in UTF-8 mode: count is code unit count */
+    /* No UTF support, or not in UTF mode: count is code unit count */
 
       {
       if ((ptrdiff_t)number > Feptr - mb->start_subject) RRETURN(MATCH_NOMATCH);
@@ -5713,15 +5815,84 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
     /* Save the earliest consulted character, then skip to next opcode */
 
     if (Feptr < mb->start_used_ptr) mb->start_used_ptr = Feptr;
-    Fecode += 1 + LINK_SIZE;
+    Fecode += 1 + IMM2_SIZE;
     break;
 
 
     /* ===================================================================== */
+    /* Move the subject pointer back by a variable amount. This occurs at the
+    start of each branch of a lookbehind assertion when the branch has a
+    variable, but limited, length. A loop is needed to try matching the branch
+    after moving back different numbers of characters. If we are too close to
+    the start to move back even the minimum amount, fail. When working with
+    UTF-8 we move back a number of characters, not bytes. */
+
+#define Lmin F->temp_32[0]
+#define Lmax F->temp_32[1]
+#define Leptr F->temp_sptr[0]
+
+    case OP_VREVERSE:
+    Lmin = GET2(Fecode, 1);
+    Lmax = GET2(Fecode, 1 + IMM2_SIZE);
+    Leptr = Feptr;
+
+    /* Move back by the maximum branch length and then work forwards. This
+    ensures that items such as \d{3,5} get the maximum length, which is
+    relevant for captures, and makes for Perl compatibility. */
+
+#ifdef SUPPORT_UNICODE
+    if (utf)
+      {
+      for (i = 0; i < Lmax; i++)
+        {
+        if (Feptr == mb->start_subject)
+          {
+          if (i < Lmin) RRETURN(MATCH_NOMATCH);
+          Lmax = i;
+          break;
+          }
+        Feptr--;
+        BACKCHAR(Feptr);
+        }
+      }
+    else
+#endif
+
+    /* No UTF support or not in UTF mode */
+
+      {
+      ptrdiff_t diff = Feptr - mb->start_subject;
+      uint32_t available = (diff > 65535)? 65535 : ((diff > 0)? diff : 0);
+      if (Lmin > available) RRETURN(MATCH_NOMATCH);
+      if (Lmax > available) Lmax = available;
+      Feptr -= Lmax;
+      }
+
+    /* Now try matching, moving forward one character on failure, until we
+    reach the mimimum back length. */
+
+    for (;;)
+      {
+      RMATCH(Fecode + 1 + 2 * IMM2_SIZE, RM37);
+      if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+      if (Lmax-- <= Lmin) RRETURN(MATCH_NOMATCH);
+      Feptr++;
+#ifdef SUPPORT_UNICODE
+      if (utf) { FORWARDCHARTEST(Feptr, mb->end_subject); }
+#endif
+      }
+    /* Control never reaches here */
+
+#undef Lmin
+#undef Lmax
+#undef Leptr
+
+    /* ===================================================================== */
     /* An alternation is the end of a branch; scan along to find the end of the
     bracketed group. */
 
     case OP_ALT:
+    branch_end = Fecode;
     do Fecode += GET(Fecode,1); while (*Fecode == OP_ALT);
     break;
 
@@ -5729,7 +5900,8 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
     /* ===================================================================== */
     /* The end of a parenthesized group. For all but OP_BRA and OP_COND, the
     starting frame was added to the chained frames in order to remember the
-    starting subject position for the group. */
+    starting subject position for the group. (Not true for OP_BRA when it's a
+    whole pattern recursion, but that is handled separately below.)*/
 
     case OP_KET:
     case OP_KETRMIN:
@@ -5738,8 +5910,14 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
 
     bracode = Fecode - GET(Fecode, 1);
 
-    /* Point N to the frame at the start of the most recent group.
-    Remember the subject pointer at the start of the group. */
+    if (branch_end == NULL) branch_end = Fecode;
+    branch_start = bracode;
+    while (branch_start + GET(branch_start, 1) != branch_end)
+      branch_start += GET(branch_start, 1);
+    branch_end = NULL;
+
+    /* Point N to the frame at the start of the most recent group, and P to its
+    predecessor. Remember the subject pointer at the start of the group. */
 
     if (*bracode != OP_BRA && *bracode != OP_COND)
       {
@@ -5775,27 +5953,64 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
 
     switch (*bracode)
       {
-      case OP_BRA:    /* No need to do anything for these */
-      case OP_COND:
+      /* Whole pattern recursion is handled as a recursion into group 0, but
+      the entire pattern is wrapped in OP_BRA/OP_KET rather than a capturing
+      group - a design mistake: it should perhaps have been capture group 0.
+      Anyway, that means the end of such recursion must be handled here. It is
+      detected by checking for an immediately following OP_END when we are
+      recursing in group 0. If this is not the end of a whole-pattern
+      recursion, there is nothing to be done. */
+
+      case OP_BRA:
+      if (Fcurrent_recurse != 0 || Fecode[1+LINK_SIZE] != OP_END) break;
+
+      /* It is the end of whole-pattern recursion. */
+
+      offset = Flast_group_offset;
+      if (offset == PCRE2_UNSET) return PCRE2_ERROR_INTERNAL;
+      N = (heapframe *)((char *)match_data->heapframes + offset);
+      P = (heapframe *)((char *)N - frame_size);
+      Flast_group_offset = P->last_group_offset;
+
+      /* Reinstate the previous set of captures and then carry on after the
+      recursion call. */
+
+      memcpy((char *)F + offsetof(heapframe, ovector), P->ovector,
+        Foffset_top * sizeof(PCRE2_SIZE));
+      Foffset_top = P->offset_top;
+      Fcapture_last = P->capture_last;
+      Fcurrent_recurse = P->current_recurse;
+      Fecode = P->ecode + 1 + LINK_SIZE;
+      continue;  /* With next opcode */
+
+      case OP_COND:     /* No need to do anything for these */
       case OP_SCOND:
       break;
 
       /* Non-atomic positive assertions are like OP_BRA, except that the
       subject pointer must be put back to where it was at the start of the
-      assertion. */
+      assertion. For a variable lookbehind, check its end point. */
 
-      case OP_ASSERT_NA:
       case OP_ASSERTBACK_NA:
+      if (branch_start[1 + LINK_SIZE] == OP_VREVERSE && Feptr != P->eptr)
+        RRETURN(MATCH_NOMATCH);
+      /* Fall through */
+
+      case OP_ASSERT_NA:
       if (Feptr > mb->last_used_ptr) mb->last_used_ptr = Feptr;
       Feptr = P->eptr;
       break;
 
       /* Atomic positive assertions are like OP_ONCE, except that in addition
       the subject pointer must be put back to where it was at the start of the
-      assertion. */
+      assertion. For a variable lookbehind, check its end point. */
 
-      case OP_ASSERT:
       case OP_ASSERTBACK:
+      if (branch_start[1 + LINK_SIZE] == OP_VREVERSE && Feptr != P->eptr)
+        RRETURN(MATCH_NOMATCH);
+      /* Fall through */
+
+      case OP_ASSERT:
       if (Feptr > mb->last_used_ptr) mb->last_used_ptr = Feptr;
       Feptr = P->eptr;
       /* Fall through */
@@ -5816,10 +6031,15 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
       break;
 
       /* A matching negative assertion returns MATCH, which is turned into
-      NOMATCH at the assertion level. */
+      NOMATCH at the assertion level. For a variable lookbehind, check its end
+      point. */
 
-      case OP_ASSERT_NOT:
       case OP_ASSERTBACK_NOT:
+      if (branch_start[1 + LINK_SIZE] == OP_VREVERSE && Feptr != P->eptr)
+        RRETURN(MATCH_NOMATCH);
+      /* Fall through */
+
+      case OP_ASSERT_NOT:
       RRETURN(MATCH_MATCH);
 
       /* At the end of a script run, apply the script-checking rules. This code
@@ -5830,9 +6050,8 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
       if (!PRIV(script_run)(P->eptr, Feptr, utf)) RRETURN(MATCH_NOMATCH);
       break;
 
-      /* Whole-pattern recursion is coded as a recurse into group 0, so it
-      won't be picked up here. Instead, we catch it when the OP_END is reached.
-      Other recursion is handled here. */
+      /* Whole-pattern recursion is coded as a recurse into group 0, and is
+      handled with OP_BRA above. Other recursion is handled here. */
 
       case OP_CBRA:
       case OP_CBRAPOS:
@@ -5847,7 +6066,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
         {
         P = (heapframe *)((char *)N - frame_size);
         memcpy((char *)F + offsetof(heapframe, ovector), P->ovector,
-          P->offset_top * sizeof(PCRE2_SIZE));
+          Foffset_top * sizeof(PCRE2_SIZE));
         Foffset_top = P->offset_top;
         Fcapture_last = P->capture_last;
         Fcurrent_recurse = P->current_recurse;
@@ -5930,10 +6149,10 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
     if ((mb->poptions & PCRE2_DOLLAR_ENDONLY) == 0) goto ASSERT_NL_OR_EOS;
 
     /* Fall through */
-    /* Unconditional end of subject assertion (\z) */
+    /* Unconditional end of subject assertion (\z). */
 
     case OP_EOD:
-    if (Feptr < mb->end_subject) RRETURN(MATCH_NOMATCH);
+    if (Feptr < mb->true_end_subject) RRETURN(MATCH_NOMATCH);
     if (mb->partial != 0)
       {
       mb->hitend = TRUE;
@@ -6045,6 +6264,8 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
 
     case OP_NOT_WORD_BOUNDARY:
     case OP_WORD_BOUNDARY:
+    case OP_NOT_UCP_WORD_BOUNDARY:
+    case OP_UCP_WORD_BOUNDARY:
     if (Feptr == mb->check_subject) prev_is_word = FALSE; else
       {
       PCRE2_SPTR lastptr = Feptr - 1;
@@ -6059,13 +6280,12 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
       fc = *lastptr;
       if (lastptr < mb->start_used_ptr) mb->start_used_ptr = lastptr;
 #ifdef SUPPORT_UNICODE
-      if ((mb->poptions & PCRE2_UCP) != 0)
+      if (Fop == OP_UCP_WORD_BOUNDARY || Fop == OP_NOT_UCP_WORD_BOUNDARY)
         {
-        if (fc == '_') prev_is_word = TRUE; else
-          {
-          int cat = UCD_CATEGORY(fc);
-          prev_is_word = (cat == ucp_L || cat == ucp_N);
-          }
+        int chartype = UCD_CHARTYPE(fc);
+        int category = PRIV(ucp_gentype)[chartype];
+        prev_is_word = (category == ucp_L || category == ucp_N ||
+          chartype == ucp_Mn || chartype == ucp_Pc);
         }
       else
 #endif  /* SUPPORT_UNICODE */
@@ -6093,13 +6313,12 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
       fc = *Feptr;
       if (nextptr > mb->last_used_ptr) mb->last_used_ptr = nextptr;
 #ifdef SUPPORT_UNICODE
-      if ((mb->poptions & PCRE2_UCP) != 0)
+      if (Fop == OP_UCP_WORD_BOUNDARY || Fop == OP_NOT_UCP_WORD_BOUNDARY)
         {
-        if (fc == '_') cur_is_word = TRUE; else
-          {
-          int cat = UCD_CATEGORY(fc);
-          cur_is_word = (cat == ucp_L || cat == ucp_N);
-          }
+        int chartype = UCD_CHARTYPE(fc);
+        int category = PRIV(ucp_gentype)[chartype];
+        cur_is_word = (category == ucp_L || category == ucp_N ||
+          chartype == ucp_Mn || chartype == ucp_Pc);
         }
       else
 #endif  /* SUPPORT_UNICODE */
@@ -6108,7 +6327,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
 
     /* Now see if the situation is what we want */
 
-    if ((*Fecode++ == OP_WORD_BOUNDARY)?
+    if ((*Fecode++ == OP_WORD_BOUNDARY || Fop == OP_UCP_WORD_BOUNDARY)?
          cur_is_word == prev_is_word : cur_is_word != prev_is_word)
       RRETURN(MATCH_NOMATCH);
     break;
@@ -6254,7 +6473,7 @@ F = (heapframe *)((char *)F - Fback_fram
 mb->cb->callout_flags |= PCRE2_CALLOUT_BACKTRACK; /* Note for callouts */
 
 #ifdef DEBUG_SHOW_RMATCH
-fprintf(stderr, "++ RETURN %d to %d\n", rrc, Freturn_id);
+fprintf(stderr, "++ RETURN %d to RM%d\n", rrc, Freturn_id);
 #endif
 
 switch (Freturn_id)
@@ -6263,7 +6482,7 @@ switch (Freturn_id)
   LBL( 9) LBL(10) LBL(11) LBL(12) LBL(13) LBL(14) LBL(15) LBL(16)
   LBL(17) LBL(18) LBL(19) LBL(20) LBL(21) LBL(22) LBL(23) LBL(24)
   LBL(25) LBL(26) LBL(27) LBL(28) LBL(29) LBL(30) LBL(31) LBL(32)
-  LBL(33) LBL(34) LBL(35) LBL(36)
+  LBL(33) LBL(34) LBL(35) LBL(36) LBL(37)
 
 #ifdef SUPPORT_WIDE_CHARS
   LBL(100) LBL(101)
@@ -6551,6 +6770,7 @@ if (use_jit)
     match_data, mcontext);
   if (rc != PCRE2_ERROR_JIT_BADOPTION)
     {
+    match_data->subject_length = length;
     if (rc >= 0 && (options & PCRE2_COPY_MATCHED_SUBJECT) != 0)
       {
       length = CU2BYTES(length + was_zero_terminated);
@@ -6719,7 +6939,7 @@ if (mcontext == NULL)
 else mb->memctl = mcontext->memctl;
 
 anchored = ((re->overall_options | options) & PCRE2_ANCHORED) != 0;
-firstline = (re->overall_options & PCRE2_FIRSTLINE) != 0;
+firstline = !anchored && (re->overall_options & PCRE2_FIRSTLINE) != 0;
 startline = (re->flags & PCRE2_STARTLINE) != 0;
 bumpalong_limit = (mcontext->offset_limit == PCRE2_UNSET)?
   true_end_subject : subject + mcontext->offset_limit;
@@ -6742,6 +6962,7 @@ mb->callout_data = mcontext->callout_dat
 mb->start_subject = subject;
 mb->start_offset = start_offset;
 mb->end_subject = end_subject;
+mb->true_end_subject = true_end_subject;
 mb->hasthen = (re->flags & PCRE2_HASTHEN) != 0;
 mb->allowemptypartial = (re->max_lookbehind > 0) ||
     (re->flags & PCRE2_MATCH_EMPTY) != 0;
@@ -6801,7 +7022,7 @@ the pattern. It is not used at all if th
 
   frame_size                   is the total size of each frame
   match_data->heapframes       is the pointer to the frames vector
-  match_data->heapframes_size  is the total size of the vector
+  match_data->heapframes_size  is the allocated size of the vector
 
 We must pad the frame_size for alignment to ensure subsequent frames are as
 aligned as heapframe. Whilst ovector is word-aligned due to being a PCRE2_SIZE
@@ -6816,7 +7037,7 @@ frame_size = (offsetof(heapframe, ovecto
 smaller. */
 
 mb->heap_limit = ((mcontext->heap_limit < re->limit_heap)?
-  mcontext->heap_limit : re->limit_heap) * 1024;
+  mcontext->heap_limit : re->limit_heap);
 
 mb->match_limit = (mcontext->match_limit < re->limit_match)?
   mcontext->match_limit : re->limit_match;
@@ -6827,19 +7048,19 @@ mb->match_limit_depth = (mcontext->depth
 /* If a pattern has very many capturing parentheses, the frame size may be very
 large. Set the initial frame vector size to ensure that there are at least 10
 available frames, but enforce a minimum of START_FRAMES_SIZE. If this is
-greater than the heap limit, get as large a vector as possible. Always round
-the size to a multiple of the frame size. */
+greater than the heap limit, get as large a vector as possible. */
 
 heapframes_size = frame_size * 10;
 if (heapframes_size < START_FRAMES_SIZE) heapframes_size = START_FRAMES_SIZE;
-if (heapframes_size > mb->heap_limit)
+if (heapframes_size / 1024 > mb->heap_limit)
   {
-  if (frame_size > mb->heap_limit ) return PCRE2_ERROR_HEAPLIMIT;
-  heapframes_size = mb->heap_limit;
+  PCRE2_SIZE max_size = 1024 * mb->heap_limit;
+  if (max_size < frame_size) return PCRE2_ERROR_HEAPLIMIT;
+  heapframes_size = max_size;
   }
 
 /* If an existing frame vector in the match_data block is large enough, we can
-use it.Otherwise, free any pre-existing vector and get a new one. */
+use it. Otherwise, free any pre-existing vector and get a new one. */
 
 if (match_data->heapframes_size < heapframes_size)
   {
@@ -7286,9 +7507,17 @@ for(;;)
   mb->end_offset_top = 0;
   mb->skip_arg_count = 0;
 
+#ifdef DEBUG_SHOW_OPS
+  fprintf(stderr, "++ Calling match()\n");
+#endif
+
   rc = match(start_match, mb->start_code, re->top_bracket, frame_size,
     match_data, mb);
 
+#ifdef DEBUG_SHOW_OPS
+  fprintf(stderr, "++ match() returned %d\n\n", rc);
+#endif
+
   if (mb->hitend && start_partial == NULL)
     {
     start_partial = mb->start_used_ptr;
@@ -7436,6 +7665,7 @@ if (utf && end_subject != true_end_subje
     if (start_match >= true_end_subject)
       {
       rc = MATCH_NOMATCH;  /* In case it was partial */
+      match_partial = NULL;
       break;
       }
 
@@ -7485,6 +7715,7 @@ if (rc == MATCH_MATCH)
   {
   match_data->rc = ((int)mb->end_offset_top >= 2 * match_data->oveccount)?
     0 : (int)mb->end_offset_top/2 + 1;
+  match_data->subject_length = length;
   match_data->startchar = start_match - subject;
   match_data->leftchar = mb->start_used_ptr - subject;
   match_data->rightchar = ((mb->last_used_ptr > mb->end_match_ptr)?
@@ -7499,6 +7730,7 @@ if (rc == MATCH_MATCH)
     match_data->flags |= PCRE2_MD_COPIED_SUBJECT;
     }
   else match_data->subject = subject;
+
   return match_data->rc;
   }
 
@@ -7520,6 +7752,7 @@ PCRE2_ERROR_PARTIAL. */
 else if (match_partial != NULL)
   {
   match_data->subject = subject;
+  match_data->subject_length = length;
   match_data->ovector[0] = match_partial - subject;
   match_data->ovector[1] = end_subject - subject;
   match_data->startchar = match_partial - subject;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_match_data.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_match_data.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_match_data.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_match_data.c	2024-11-20 13:56:33.000000000 +0000
@@ -170,4 +170,16 @@ return offsetof(pcre2_match_data, ovecto
   2 * (match_data->oveccount) * sizeof(PCRE2_SIZE);
 }
 
+
+
+/*************************************************
+*             Get heapframes size                *
+*************************************************/
+
+PCRE2_EXP_DEFN PCRE2_SIZE PCRE2_CALL_CONVENTION
+pcre2_get_match_data_heapframes_size(pcre2_match_data *match_data)
+{
+return match_data->heapframes_size;
+}
+
 /* End of pcre2_match_data.c */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_study.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_study.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_study.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_study.c	2024-11-20 13:56:33.000000000 +0000
@@ -7,7 +7,7 @@ and semantics are as close as possible t
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2021 University of Cambridge
+          New API code Copyright (c) 2016-2023 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -256,6 +256,7 @@ for (;;)
     /* Skip over things that don't match chars */
 
     case OP_REVERSE:
+    case OP_VREVERSE:
     case OP_CREF:
     case OP_DNCREF:
     case OP_RREF:
@@ -273,6 +274,8 @@ for (;;)
     case OP_DOLLM:
     case OP_NOT_WORD_BOUNDARY:
     case OP_WORD_BOUNDARY:
+    case OP_NOT_UCP_WORD_BOUNDARY:
+    case OP_UCP_WORD_BOUNDARY:
     cc += PRIV(OP_lengths)[*cc];
     break;
 
@@ -976,6 +979,7 @@ do
   while (try_next)    /* Loop for items in this branch */
     {
     int rc;
+    PCRE2_SPTR ncode;
     uint8_t *classmap = NULL;
 #ifdef SUPPORT_WIDE_CHARS
     PCRE2_UCHAR xclassflags;
@@ -1054,6 +1058,7 @@ do
       case OP_REF:
       case OP_REFI:
       case OP_REVERSE:
+      case OP_VREVERSE:
       case OP_RREF:
       case OP_SCOND:
       case OP_SET_SOM:
@@ -1101,13 +1106,100 @@ do
 
       case OP_WORD_BOUNDARY:
       case OP_NOT_WORD_BOUNDARY:
+      case OP_UCP_WORD_BOUNDARY:
+      case OP_NOT_UCP_WORD_BOUNDARY:
       tcode++;
       break;
 
-      /* If we hit a bracket or a positive lookahead assertion, recurse to set
-      bits from within the subpattern. If it can't find anything, we have to
-      give up. If it finds some mandatory character(s), we are done for this
-      branch. Otherwise, carry on scanning after the subpattern. */
+      /* For a positive lookahead assertion, inspect what immediately follows,
+      ignoring intermediate assertions and callouts. If the next item is one
+      that sets a mandatory character, skip this assertion. Otherwise, treat it
+      the same as other bracket groups. */
+
+      case OP_ASSERT:
+      case OP_ASSERT_NA:
+      ncode = tcode + GET(tcode, 1);
+      while (*ncode == OP_ALT) ncode += GET(ncode, 1);
+      ncode += 1 + LINK_SIZE;
+
+      /* Skip irrelevant items */
+
+      for (BOOL done = FALSE; !done;)
+        {
+        switch (*ncode)
+          {
+          case OP_ASSERT:
+          case OP_ASSERT_NOT:
+          case OP_ASSERTBACK:
+          case OP_ASSERTBACK_NOT:
+          case OP_ASSERT_NA:
+          case OP_ASSERTBACK_NA:
+          ncode += GET(ncode, 1);
+          while (*ncode == OP_ALT) ncode += GET(ncode, 1);
+          ncode += 1 + LINK_SIZE;
+          break;
+
+          case OP_WORD_BOUNDARY:
+          case OP_NOT_WORD_BOUNDARY:
+          case OP_UCP_WORD_BOUNDARY:
+          case OP_NOT_UCP_WORD_BOUNDARY:
+          ncode++;
+          break;
+
+          case OP_CALLOUT:
+          ncode += PRIV(OP_lengths)[OP_CALLOUT];
+          break;
+
+          case OP_CALLOUT_STR:
+          ncode += GET(ncode, 1 + 2*LINK_SIZE);
+          break;
+
+          default:
+          done = TRUE;
+          break;
+          }
+        }
+
+      /* Now check the next significant item. */
+
+      switch(*ncode)
+        {
+        default:
+        break;
+
+        case OP_PROP:
+        if (ncode[1] != PT_CLIST) break;
+        /* Fall through */
+        case OP_ANYNL:
+        case OP_CHAR:
+        case OP_CHARI:
+        case OP_EXACT:
+        case OP_EXACTI:
+        case OP_HSPACE:
+        case OP_MINPLUS:
+        case OP_MINPLUSI:
+        case OP_PLUS:
+        case OP_PLUSI:
+        case OP_POSPLUS:
+        case OP_POSPLUSI:
+        case OP_VSPACE:
+        /* Note that these types will only be present in non-UCP mode. */
+        case OP_DIGIT:
+        case OP_NOT_DIGIT:
+        case OP_WORDCHAR:
+        case OP_NOT_WORDCHAR:
+        case OP_WHITESPACE:
+        case OP_NOT_WHITESPACE:
+        tcode = ncode;
+        continue;   /* With the following significant opcode */
+        }
+      /* Fall through */
+
+      /* For a group bracket or a positive assertion without an immediately
+      following mandatory setting, recurse to set bits from within the
+      subpattern. If it can't find anything, we have to give up. If it finds
+      some mandatory character(s), we are done for this branch. Otherwise,
+      carry on scanning after the subpattern. */
 
       case OP_BRA:
       case OP_SBRA:
@@ -1119,8 +1211,6 @@ do
       case OP_SCBRAPOS:
       case OP_ONCE:
       case OP_SCRIPT_RUN:
-      case OP_ASSERT:
-      case OP_ASSERT_NA:
       rc = set_start_bits(re, tcode, utf, ucp, depthptr);
       if (rc == SSB_DONE)
         {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_substring.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_substring.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_substring.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_substring.c	2024-11-20 13:56:33.000000000 +0000
@@ -7,7 +7,7 @@ and semantics are as close as possible t
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2018 University of Cambridge
+          New API code Copyright (c) 2016-2023 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -309,6 +309,7 @@ Returns:         if successful: 0
                    PCRE2_ERROR_NOSUBSTRING: no such substring
                    PCRE2_ERROR_UNAVAILABLE: ovector is too small
                    PCRE2_ERROR_UNSET: substring is not set
+                   PCRE2_ERROR_INVALIDOFFSET: internal error, should not occur
 */
 
 PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
@@ -341,6 +342,8 @@ else  /* Matched using pcre2_dfa_match()
 
 left = match_data->ovector[stringnumber*2];
 right = match_data->ovector[stringnumber*2+1];
+if (left > match_data->subject_length || right > match_data->subject_length)
+  return PCRE2_ERROR_INVALIDOFFSET;
 if (sizeptr != NULL) *sizeptr = (left > right)? 0 : right - left;
 return 0;
 }
@@ -442,7 +445,7 @@ Returns:      nothing
 */
 
 PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
-pcre2_substring_list_free(PCRE2_SPTR *list)
+pcre2_substring_list_free(PCRE2_UCHAR **list)
 {
 if (list != NULL)
   {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_ucd.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_ucd.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_ucd.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_ucd.c	2024-11-20 13:56:33.000000000 +0000
@@ -68,15 +68,15 @@ the tables when not needed. But don't le
 compilers barf at that. Instead, just supply some small dummy tables. */
 
 #ifndef SUPPORT_UNICODE
-const ucd_record PRIV(ucd_records)[] = {{0,0,0,0,0,0,0 }};
+const ucd_record PRIV(ucd_records)[] = {{0,0,0,0,0,0,0}};
 const uint16_t PRIV(ucd_stage1)[] = {0};
 const uint16_t PRIV(ucd_stage2)[] = {0};
 const uint32_t PRIV(ucd_caseless_sets)[] = {0};
 #else
 
-/* Total size: 111116 bytes, block size: 128. */
+/* Total size: 112564 bytes, block size: 128. */
 
-const char *PRIV(unicode_version) = "14.0.0";
+const char *PRIV(unicode_version) = "15.0.0";
 
 /* When recompiling tables with a new Unicode version, please check the types
 in this structure definition with those in pcre2_internal.h (the actual field
@@ -152,16 +152,16 @@ decimal digits. It is used to ensure tha
 from the same set. */
 
 const uint32_t PRIV(ucd_digit_sets)[] = {
-  66,  /* Number of subsequent values */
+  68,  /* Number of subsequent values */
   0x00039, 0x00669, 0x006f9, 0x007c9, 0x0096f, 0x009ef, 0x00a6f, 0x00aef,
   0x00b6f, 0x00bef, 0x00c6f, 0x00cef, 0x00d6f, 0x00def, 0x00e59, 0x00ed9,
   0x00f29, 0x01049, 0x01099, 0x017e9, 0x01819, 0x0194f, 0x019d9, 0x01a89,
   0x01a99, 0x01b59, 0x01bb9, 0x01c49, 0x01c59, 0x0a629, 0x0a8d9, 0x0a909,
   0x0a9d9, 0x0a9f9, 0x0aa59, 0x0abf9, 0x0ff19, 0x104a9, 0x10d39, 0x1106f,
   0x110f9, 0x1113f, 0x111d9, 0x112f9, 0x11459, 0x114d9, 0x11659, 0x116c9,
-  0x11739, 0x118e9, 0x11959, 0x11c59, 0x11d59, 0x11da9, 0x16a69, 0x16ac9,
-  0x16b59, 0x1d7d7, 0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e149, 0x1e2f9,
-  0x1e959, 0x1fbf9,
+  0x11739, 0x118e9, 0x11959, 0x11c59, 0x11d59, 0x11da9, 0x11f59, 0x16a69,
+  0x16ac9, 0x16b59, 0x1d7d7, 0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e149,
+  0x1e2f9, 0x1e4f9, 0x1e959, 0x1fbf9,
 };
 
 /* This vector is a list of script bitsets for the Script Extension property.
@@ -323,6 +323,7 @@ const uint32_t PRIV(ucd_boolprop_sets)[]
  0x21004024u, 0x00040000u,
  0x20808004u, 0x00040000u,
  0x60800944u, 0x000c0004u,
+ 0x60800064u, 0x000c0004u,
  0x60802004u, 0x000c0000u,
  0x60800344u, 0x000c8000u,
  0x22808000u, 0x00040000u,
@@ -334,7 +335,6 @@ const uint32_t PRIV(ucd_boolprop_sets)[]
  0x01008020u, 0x00000000u,
  0x21408024u, 0x00040000u,
  0x00808000u, 0x00000000u,
- 0x60800064u, 0x000c0004u,
  0x60800044u, 0x000c1004u,
  0x60800064u, 0x000c1004u,
  0x01002020u, 0x00000001u,
@@ -424,7 +424,7 @@ offset to multichar other cases or zero
 (32 bits, signed), bidi class (5 bits) and script extension (11 bits) packed
 into a 16-bit field, and offset in binary properties table (16 bits). */
 
-const ucd_record PRIV(ucd_records)[] = { /* 16908 bytes, record size 12 */
+const ucd_record PRIV(ucd_records)[] = { /* 17076 bytes, record size 12 */
   {    69,      0,      2,      0,      0,   6144,      2, }, /*   0 */
   {    69,      0,      2,      0,      0,  43008,      4, }, /*   1 */
   {    69,      0,      1,      0,      0,   4096,      4, }, /*   2 */
@@ -498,7 +498,7 @@ const ucd_record PRIV(ucd_records)[] = {
   {     0,      5,     12,      0,      0,  18432,     60, }, /*  70 */
   {     0,      5,     12,      0,      0,  18432,     80, }, /*  71 */
   {     0,      9,     12,      0,   -121,  18432,     74, }, /*  72 */
-  {     0,      5,     12,      1,   -268,  18432,     70, }, /*  73 */
+  {     0,      5,     12,      1,      0,  18432,     70, }, /*  73 */
   {     0,      5,     12,      0,    195,  18432,     76, }, /*  74 */
   {     0,      9,     12,      0,    210,  18432,     74, }, /*  75 */
   {     0,      9,     12,      0,    206,  18432,     74, }, /*  76 */
@@ -819,57 +819,57 @@ const ucd_record PRIV(ucd_records)[] = {
   {    11,     23,     12,      0,      0,  14336,     68, }, /* 391 */
   {    12,     12,      3,      0,      0,  26624,    130, }, /* 392 */
   {    12,     10,      5,      0,      0,  18432,    144, }, /* 393 */
-  {    12,     12,      3,      0,      0,  26624,    102, }, /* 394 */
-  {    12,      7,     12,      0,      0,  18432,     82, }, /* 395 */
-  {    12,     12,      3,      0,      0,  26624,     96, }, /* 396 */
-  {    12,     12,      3,      0,      0,  26624,    146, }, /* 397 */
-  {    12,     13,     12,      0,      0,  18432,    138, }, /* 398 */
-  {    12,     21,     12,      0,      0,  18432,     68, }, /* 399 */
-  {    12,     15,     12,      0,      0,  28672,     68, }, /* 400 */
-  {    12,     26,     12,      0,      0,  18432,     68, }, /* 401 */
-  {    13,      7,     12,      0,      0,  18432,     82, }, /* 402 */
-  {    13,     12,      3,      0,      0,  26624,    130, }, /* 403 */
-  {    13,     10,      5,      0,      0,  18432,    144, }, /* 404 */
-  {    13,     21,     12,      0,      0,  18432,     68, }, /* 405 */
-  {    13,     12,      3,      0,      0,  26624,     96, }, /* 406 */
-  {    13,     12,      3,      0,      0,  18432,    130, }, /* 407 */
-  {    13,     10,      3,      0,      0,  18432,    148, }, /* 408 */
-  {    13,     12,      3,      0,      0,  26624,    146, }, /* 409 */
-  {    13,     13,     12,      0,      0,  18528,    138, }, /* 410 */
-  {    14,     12,      3,      0,      0,  26624,    130, }, /* 411 */
-  {    14,     10,      5,      0,      0,  18432,    144, }, /* 412 */
-  {    14,      7,     12,      0,      0,  18432,     82, }, /* 413 */
-  {    14,     12,      3,      0,      0,  26624,    146, }, /* 414 */
-  {    14,     10,      3,      0,      0,  18432,    148, }, /* 415 */
-  {    14,      7,      4,      0,      0,  18432,     82, }, /* 416 */
-  {    14,     26,     12,      0,      0,  18432,     68, }, /* 417 */
-  {    14,     15,     12,      0,      0,  18432,     68, }, /* 418 */
-  {    14,     13,     12,      0,      0,  18432,    138, }, /* 419 */
-  {    15,     12,      3,      0,      0,  26624,    130, }, /* 420 */
-  {    15,     10,      5,      0,      0,  18432,    144, }, /* 421 */
-  {    15,      7,     12,      0,      0,  18432,     82, }, /* 422 */
-  {    15,     12,      3,      0,      0,  26624,    146, }, /* 423 */
-  {    15,     10,      3,      0,      0,  18432,    148, }, /* 424 */
-  {    15,     13,     12,      0,      0,  18432,    138, }, /* 425 */
-  {    15,     21,     12,      0,      0,  18432,     68, }, /* 426 */
-  {    72,      7,     12,      0,      0,  18432,     82, }, /* 427 */
-  {    72,     12,      3,      0,      0,  26624,    130, }, /* 428 */
-  {    72,      7,      5,      0,      0,  18432,    152, }, /* 429 */
-  {    72,     12,      3,      0,      0,  26624,    154, }, /* 430 */
-  {    69,     23,     12,      0,      0,  14336,     68, }, /* 431 */
-  {    72,      7,     12,      0,      0,  18432,    156, }, /* 432 */
-  {    72,      6,     12,      0,      0,  18432,    136, }, /* 433 */
-  {    72,     12,      3,      0,      0,  26624,     96, }, /* 434 */
-  {    72,     21,     12,      0,      0,  18432,     68, }, /* 435 */
-  {    72,     13,     12,      0,      0,  18432,    138, }, /* 436 */
-  {    72,     21,     12,      0,      0,  18432,    106, }, /* 437 */
-  {    73,      7,     12,      0,      0,  18432,     82, }, /* 438 */
-  {    73,     12,      3,      0,      0,  26624,    130, }, /* 439 */
-  {    73,      7,      5,      0,      0,  18432,    152, }, /* 440 */
-  {    73,     12,      3,      0,      0,  26624,    146, }, /* 441 */
-  {    73,      7,     12,      0,      0,  18432,    156, }, /* 442 */
-  {    73,      6,     12,      0,      0,  18432,    136, }, /* 443 */
-  {    73,     12,      3,      0,      0,  26624,     96, }, /* 444 */
+  {    12,      7,     12,      0,      0,  18432,     82, }, /* 394 */
+  {    12,     12,      3,      0,      0,  26624,     96, }, /* 395 */
+  {    12,     12,      3,      0,      0,  26624,    146, }, /* 396 */
+  {    12,     13,     12,      0,      0,  18432,    138, }, /* 397 */
+  {    12,     21,     12,      0,      0,  18432,     68, }, /* 398 */
+  {    12,     15,     12,      0,      0,  28672,     68, }, /* 399 */
+  {    12,     26,     12,      0,      0,  18432,     68, }, /* 400 */
+  {    13,      7,     12,      0,      0,  18432,     82, }, /* 401 */
+  {    13,     12,      3,      0,      0,  26624,    130, }, /* 402 */
+  {    13,     10,      5,      0,      0,  18432,    144, }, /* 403 */
+  {    13,     21,     12,      0,      0,  18432,     68, }, /* 404 */
+  {    13,     12,      3,      0,      0,  26624,     96, }, /* 405 */
+  {    13,     12,      3,      0,      0,  18432,    130, }, /* 406 */
+  {    13,     10,      3,      0,      0,  18432,    148, }, /* 407 */
+  {    13,     12,      3,      0,      0,  26624,    146, }, /* 408 */
+  {    13,     13,     12,      0,      0,  18528,    138, }, /* 409 */
+  {    14,     12,      3,      0,      0,  26624,    130, }, /* 410 */
+  {    14,     10,      5,      0,      0,  18432,    144, }, /* 411 */
+  {    14,      7,     12,      0,      0,  18432,     82, }, /* 412 */
+  {    14,     12,      3,      0,      0,  26624,    146, }, /* 413 */
+  {    14,     10,      3,      0,      0,  18432,    148, }, /* 414 */
+  {    14,      7,      4,      0,      0,  18432,     82, }, /* 415 */
+  {    14,     26,     12,      0,      0,  18432,     68, }, /* 416 */
+  {    14,     15,     12,      0,      0,  18432,     68, }, /* 417 */
+  {    14,     13,     12,      0,      0,  18432,    138, }, /* 418 */
+  {    15,     12,      3,      0,      0,  26624,    130, }, /* 419 */
+  {    15,     10,      5,      0,      0,  18432,    144, }, /* 420 */
+  {    15,      7,     12,      0,      0,  18432,     82, }, /* 421 */
+  {    15,     12,      3,      0,      0,  26624,    146, }, /* 422 */
+  {    15,     10,      3,      0,      0,  18432,    148, }, /* 423 */
+  {    15,     13,     12,      0,      0,  18432,    138, }, /* 424 */
+  {    15,     21,     12,      0,      0,  18432,     68, }, /* 425 */
+  {    72,      7,     12,      0,      0,  18432,     82, }, /* 426 */
+  {    72,     12,      3,      0,      0,  26624,    130, }, /* 427 */
+  {    72,      7,      5,      0,      0,  18432,    152, }, /* 428 */
+  {    72,     12,      3,      0,      0,  26624,    154, }, /* 429 */
+  {    69,     23,     12,      0,      0,  14336,     68, }, /* 430 */
+  {    72,      7,     12,      0,      0,  18432,    156, }, /* 431 */
+  {    72,      6,     12,      0,      0,  18432,    136, }, /* 432 */
+  {    72,     12,      3,      0,      0,  26624,     96, }, /* 433 */
+  {    72,     21,     12,      0,      0,  18432,     68, }, /* 434 */
+  {    72,     13,     12,      0,      0,  18432,    138, }, /* 435 */
+  {    72,     21,     12,      0,      0,  18432,    106, }, /* 436 */
+  {    73,      7,     12,      0,      0,  18432,     82, }, /* 437 */
+  {    73,     12,      3,      0,      0,  26624,    130, }, /* 438 */
+  {    73,      7,      5,      0,      0,  18432,    152, }, /* 439 */
+  {    73,     12,      3,      0,      0,  26624,    146, }, /* 440 */
+  {    73,      7,     12,      0,      0,  18432,    156, }, /* 441 */
+  {    73,      6,     12,      0,      0,  18432,    136, }, /* 442 */
+  {    73,     12,      3,      0,      0,  26624,     96, }, /* 443 */
+  {    73,     12,      3,      0,      0,  26624,    102, }, /* 444 */
   {    73,     13,     12,      0,      0,  18432,    138, }, /* 445 */
   {    74,      7,     12,      0,      0,  18432,     82, }, /* 446 */
   {    74,     26,     12,      0,      0,  18432,     68, }, /* 447 */
@@ -884,431 +884,431 @@ const ucd_record PRIV(ucd_records)[] = {
   {    74,     12,      3,      0,      0,  26624,    130, }, /* 456 */
   {    74,     12,      3,      0,      0,  26624,    162, }, /* 457 */
   {    74,     10,      5,      0,      0,  18432,    144, }, /* 458 */
-  {    74,     12,      3,      0,      0,  26624,    146, }, /* 459 */
-  {    69,     26,     12,      0,      0,  18432,     68, }, /* 460 */
-  {    16,      7,     12,      0,      0,  18432,     82, }, /* 461 */
-  {    16,     10,     12,      0,      0,  18432,    144, }, /* 462 */
-  {    16,     12,      3,      0,      0,  26624,    130, }, /* 463 */
-  {    16,     10,      5,      0,      0,  18432,    144, }, /* 464 */
-  {    16,     12,      3,      0,      0,  26624,     96, }, /* 465 */
-  {    16,     12,      3,      0,      0,  26624,    146, }, /* 466 */
-  {    16,     13,     12,      0,      0,  18549,    138, }, /* 467 */
-  {    16,     21,     12,      0,      0,  18432,    124, }, /* 468 */
-  {    16,     21,     12,      0,      0,  18432,     68, }, /* 469 */
-  {    16,     10,     12,      0,      0,  18432,    164, }, /* 470 */
-  {    16,     12,      3,      0,      0,  26624,    128, }, /* 471 */
-  {    16,     13,     12,      0,      0,  18432,    138, }, /* 472 */
-  {    16,     26,     12,      0,      0,  18432,     68, }, /* 473 */
-  {    17,      9,     12,      0,   7264,  18432,     74, }, /* 474 */
-  {    17,      5,     12,      0,   3008,  18432,    166, }, /* 475 */
-  {    69,     21,     12,      0,      0,  18510,     68, }, /* 476 */
-  {    17,      6,     12,      0,      0,  18432,    142, }, /* 477 */
-  {    18,      7,      6,      0,      0,  18432,     82, }, /* 478 */
-  {    18,      7,      6,      0,      0,  18432,    168, }, /* 479 */
-  {    18,      7,      7,      0,      0,  18432,    168, }, /* 480 */
-  {    18,      7,      7,      0,      0,  18432,     82, }, /* 481 */
-  {    18,      7,      8,      0,      0,  18432,     82, }, /* 482 */
-  {    75,      7,     12,      0,      0,  18432,     82, }, /* 483 */
-  {    75,     12,      3,      0,      0,  26624,     96, }, /* 484 */
-  {    75,     21,     12,      0,      0,  18432,     68, }, /* 485 */
-  {    75,     21,     12,      0,      0,  18432,    106, }, /* 486 */
-  {    75,     21,     12,      0,      0,  18432,    124, }, /* 487 */
-  {    75,     15,     12,      0,      0,  18432,    138, }, /* 488 */
-  {    75,     15,     12,      0,      0,  18432,     68, }, /* 489 */
-  {    75,     26,     12,      0,      0,  28672,     68, }, /* 490 */
-  {    76,      9,     12,      0,  38864,  18432,    170, }, /* 491 */
-  {    76,      9,     12,      0,      8,  18432,    170, }, /* 492 */
-  {    76,      5,     12,      0,     -8,  18432,     70, }, /* 493 */
-  {    77,     17,     12,      0,      0,  28672,    126, }, /* 494 */
-  {    77,      7,     12,      0,      0,  18432,     82, }, /* 495 */
-  {    77,     26,     12,      0,      0,  18432,     68, }, /* 496 */
-  {    77,     21,     12,      0,      0,  18432,    124, }, /* 497 */
-  {    78,     29,     12,      0,      0,  45056,     52, }, /* 498 */
-  {    78,      7,     12,      0,      0,  18432,     82, }, /* 499 */
-  {    78,     22,     12,      0,      0,  28672,    158, }, /* 500 */
-  {    78,     18,     12,      0,      0,  28672,    158, }, /* 501 */
-  {    79,      7,     12,      0,      0,  18432,     82, }, /* 502 */
-  {    69,     21,     12,      0,      0,  18432,    106, }, /* 503 */
-  {    79,     14,     12,      0,      0,  18432,     82, }, /* 504 */
-  {    25,      7,     12,      0,      0,  18432,     82, }, /* 505 */
-  {    25,     12,      3,      0,      0,  26624,    130, }, /* 506 */
-  {    25,     12,      3,      0,      0,  26624,    146, }, /* 507 */
-  {    25,     10,      5,      0,      0,  18432,    172, }, /* 508 */
-  {    26,      7,     12,      0,      0,  18432,     82, }, /* 509 */
-  {    26,     12,      3,      0,      0,  26624,    130, }, /* 510 */
-  {    26,     10,      5,      0,      0,  18432,    174, }, /* 511 */
-  {    69,     21,     12,      0,      0,  18573,    124, }, /* 512 */
-  {    27,      7,     12,      0,      0,  18432,     82, }, /* 513 */
-  {    27,     12,      3,      0,      0,  26624,    130, }, /* 514 */
-  {    28,      7,     12,      0,      0,  18432,     82, }, /* 515 */
-  {    28,     12,      3,      0,      0,  26624,    130, }, /* 516 */
-  {    80,      7,     12,      0,      0,  18432,     82, }, /* 517 */
-  {    80,      7,     12,      0,      0,  18432,    140, }, /* 518 */
-  {    80,     12,      3,      0,      0,  26624,    100, }, /* 519 */
-  {    80,     10,      5,      0,      0,  18432,    144, }, /* 520 */
-  {    80,     12,      3,      0,      0,  26624,    130, }, /* 521 */
-  {    80,     12,      3,      0,      0,  26624,     96, }, /* 522 */
-  {    80,     12,      3,      0,      0,  26624,    146, }, /* 523 */
-  {    80,     21,     12,      0,      0,  18432,    106, }, /* 524 */
-  {    80,      6,     12,      0,      0,  18432,    142, }, /* 525 */
-  {    80,     21,     12,      0,      0,  18432,     68, }, /* 526 */
-  {    80,     23,     12,      0,      0,  14336,     68, }, /* 527 */
-  {    80,     13,     12,      0,      0,  18432,    138, }, /* 528 */
-  {    80,     15,     12,      0,      0,  28672,     68, }, /* 529 */
-  {    19,     21,     12,      0,      0,  28672,     68, }, /* 530 */
-  {    69,     21,     12,      0,      0,  28777,    106, }, /* 531 */
-  {    69,     21,     12,      0,      0,  28777,    124, }, /* 532 */
-  {    19,     21,     12,      0,      0,  28672,    106, }, /* 533 */
-  {    19,     17,     12,      0,      0,  28672,    126, }, /* 534 */
-  {    19,     21,     12,      0,      0,  28672,    124, }, /* 535 */
-  {    19,     21,     12,      0,      0,  28672,    176, }, /* 536 */
-  {    19,     12,      3,      0,      0,  26624,    178, }, /* 537 */
-  {    19,      1,      2,      0,      0,   6144,     66, }, /* 538 */
-  {    19,     13,     12,      0,      0,  18432,    138, }, /* 539 */
-  {    19,      7,     12,      0,      0,  18432,     82, }, /* 540 */
-  {    19,      6,     12,      0,      0,  18432,    136, }, /* 541 */
-  {    19,     12,      3,      0,      0,  26624,    180, }, /* 542 */
-  {    19,     12,      3,      0,      0,  26624,    130, }, /* 543 */
-  {    29,      7,     12,      0,      0,  18432,     82, }, /* 544 */
-  {    29,     12,      3,      0,      0,  26624,    130, }, /* 545 */
-  {    29,     10,      5,      0,      0,  18432,    144, }, /* 546 */
-  {    29,     12,      3,      0,      0,  26624,     96, }, /* 547 */
-  {    29,     26,     12,      0,      0,  28672,     68, }, /* 548 */
-  {    29,     21,     12,      0,      0,  28672,    124, }, /* 549 */
-  {    29,     13,     12,      0,      0,  18432,    138, }, /* 550 */
-  {    30,      7,     12,      0,      0,  18432,     82, }, /* 551 */
-  {    89,      7,     12,      0,      0,  18432,     82, }, /* 552 */
-  {    89,      7,     12,      0,      0,  18432,    156, }, /* 553 */
-  {    89,     13,     12,      0,      0,  18432,    138, }, /* 554 */
-  {    89,     15,     12,      0,      0,  18432,    138, }, /* 555 */
-  {    89,     26,     12,      0,      0,  28672,     68, }, /* 556 */
-  {    80,     26,     12,      0,      0,  28672,     68, }, /* 557 */
-  {    33,      7,     12,      0,      0,  18432,     82, }, /* 558 */
-  {    33,     12,      3,      0,      0,  26624,    130, }, /* 559 */
-  {    33,     10,      5,      0,      0,  18432,    144, }, /* 560 */
-  {    33,     21,     12,      0,      0,  18432,     68, }, /* 561 */
-  {   106,      7,     12,      0,      0,  18432,     82, }, /* 562 */
-  {   106,     10,      5,      0,      0,  18432,    144, }, /* 563 */
-  {   106,     12,      3,      0,      0,  26624,    130, }, /* 564 */
-  {   106,     12,      3,      0,      0,  26624,    182, }, /* 565 */
-  {   106,     10,     12,      0,      0,  18432,    144, }, /* 566 */
-  {   106,     12,      3,      0,      0,  26624,     96, }, /* 567 */
-  {   106,     13,     12,      0,      0,  18432,    138, }, /* 568 */
-  {   106,     21,     12,      0,      0,  18432,     68, }, /* 569 */
-  {   106,      6,     12,      0,      0,  18432,    136, }, /* 570 */
-  {   106,     21,     12,      0,      0,  18432,    124, }, /* 571 */
-  {    84,     11,      3,      0,      0,  26624,    184, }, /* 572 */
-  {    84,     12,      3,      0,      0,  26624,    130, }, /* 573 */
-  {    93,     12,      3,      0,      0,  26624,    130, }, /* 574 */
-  {    93,     10,      5,      0,      0,  18432,    144, }, /* 575 */
-  {    93,      7,     12,      0,      0,  18432,     82, }, /* 576 */
-  {    93,     12,      3,      0,      0,  26624,     96, }, /* 577 */
-  {    93,     10,      3,      0,      0,  18432,    148, }, /* 578 */
-  {    93,     10,      5,      0,      0,  18432,    172, }, /* 579 */
-  {    93,     13,     12,      0,      0,  18432,    138, }, /* 580 */
-  {    93,     21,     12,      0,      0,  18432,    124, }, /* 581 */
-  {    93,     21,     12,      0,      0,  18432,     68, }, /* 582 */
-  {    93,     21,     12,      0,      0,  18432,    106, }, /* 583 */
-  {    93,     26,     12,      0,      0,  18432,     68, }, /* 584 */
-  {    96,     12,      3,      0,      0,  26624,    130, }, /* 585 */
-  {    96,     10,      5,      0,      0,  18432,    144, }, /* 586 */
-  {    96,      7,     12,      0,      0,  18432,     82, }, /* 587 */
-  {    96,     10,      5,      0,      0,  18432,    172, }, /* 588 */
-  {    96,     12,      3,      0,      0,  26624,    146, }, /* 589 */
-  {    96,     13,     12,      0,      0,  18432,    138, }, /* 590 */
-  {   119,      7,     12,      0,      0,  18432,     82, }, /* 591 */
-  {   119,     12,      3,      0,      0,  26624,    102, }, /* 592 */
-  {   119,     10,      5,      0,      0,  18432,    144, }, /* 593 */
-  {   119,     12,      3,      0,      0,  26624,    130, }, /* 594 */
-  {   119,     10,      5,      0,      0,  18432,    174, }, /* 595 */
-  {   119,     21,     12,      0,      0,  18432,     68, }, /* 596 */
-  {    97,      7,     12,      0,      0,  18432,     82, }, /* 597 */
-  {    97,     10,      5,      0,      0,  18432,    144, }, /* 598 */
-  {    97,     12,      3,      0,      0,  26624,    130, }, /* 599 */
-  {    97,     12,      3,      0,      0,  26624,    186, }, /* 600 */
-  {    97,     12,      3,      0,      0,  26624,     96, }, /* 601 */
-  {    97,     21,     12,      0,      0,  18432,    124, }, /* 602 */
-  {    97,     21,     12,      0,      0,  18432,    106, }, /* 603 */
-  {    97,     13,     12,      0,      0,  18432,    138, }, /* 604 */
-  {    98,     13,     12,      0,      0,  18432,    138, }, /* 605 */
-  {    98,      7,     12,      0,      0,  18432,     82, }, /* 606 */
-  {    98,      6,     12,      0,      0,  18432,     92, }, /* 607 */
-  {    98,      6,     12,      0,      0,  18432,     94, }, /* 608 */
-  {    98,     21,     12,      0,      0,  18432,    124, }, /* 609 */
-  {     2,      5,     12,     63,  -6222,  18432,     70, }, /* 610 */
-  {     2,      5,     12,     67,  -6221,  18432,     70, }, /* 611 */
-  {     2,      5,     12,     71,  -6212,  18432,     70, }, /* 612 */
-  {     2,      5,     12,     75,  -6210,  18432,     70, }, /* 613 */
-  {     2,      5,     12,     79,  -6210,  18432,     70, }, /* 614 */
-  {     2,      5,     12,     79,  -6211,  18432,     70, }, /* 615 */
-  {     2,      5,     12,     84,  -6204,  18432,     70, }, /* 616 */
-  {     2,      5,     12,     88,  -6180,  18432,     70, }, /* 617 */
-  {     2,      5,     12,    108,  35267,  18432,     70, }, /* 618 */
-  {    17,      9,     12,      0,  -3008,  18432,     74, }, /* 619 */
-  {    96,     21,     12,      0,      0,  18432,     68, }, /* 620 */
-  {    84,     12,      3,      0,      0,  26762,     96, }, /* 621 */
-  {    84,     12,      3,      0,      0,  26630,     96, }, /* 622 */
-  {    69,     21,     12,      0,      0,  18498,    188, }, /* 623 */
-  {    84,     12,      3,      0,      0,  26666,     96, }, /* 624 */
-  {    84,     12,      3,      0,      0,  26696,     96, }, /* 625 */
-  {    84,     12,      3,      0,      0,  26780,     96, }, /* 626 */
-  {    69,     10,      5,      0,      0,  18474,    160, }, /* 627 */
-  {    69,      7,     12,      0,      0,  18501,     82, }, /* 628 */
-  {    69,      7,     12,      0,      0,  18474,     82, }, /* 629 */
-  {    69,      7,     12,      0,      0,  18438,     82, }, /* 630 */
-  {    69,      7,     12,      0,      0,  18594,     82, }, /* 631 */
-  {    69,      7,     12,      0,      0,  18498,     82, }, /* 632 */
-  {    84,     12,      3,      0,      0,  26750,     96, }, /* 633 */
-  {    69,     10,      5,      0,      0,  18435,    160, }, /* 634 */
-  {    84,     12,      3,      0,      0,  26690,     96, }, /* 635 */
-  {    69,      7,     12,      0,      0,  18453,     82, }, /* 636 */
-  {     2,      5,     12,      0,      0,  18432,     60, }, /* 637 */
-  {     1,      6,     12,      0,      0,  18432,     88, }, /* 638 */
-  {     2,      6,     12,      0,      0,  18432,    190, }, /* 639 */
-  {     0,      5,     12,      0,  35332,  18432,     76, }, /* 640 */
-  {     0,      5,     12,      0,   3814,  18432,     76, }, /* 641 */
-  {     0,      5,     12,      0,  35384,  18432,     76, }, /* 642 */
-  {     0,      5,     12,      0,      0,  18432,    192, }, /* 643 */
-  {     0,      6,     12,      0,      0,  18432,    190, }, /* 644 */
-  {     0,      6,     12,      0,      0,  18432,    194, }, /* 645 */
-  {     1,      6,     12,      0,      0,  18432,    190, }, /* 646 */
-  {    84,     12,      3,      0,      0,  26636,    102, }, /* 647 */
-  {    84,     12,      3,      0,      0,  26687,     96, }, /* 648 */
-  {    84,     12,      3,      0,      0,  26648,     96, }, /* 649 */
-  {     0,      9,     12,     92,      1,  18432,     74, }, /* 650 */
-  {     0,      5,     12,     92,     -1,  18432,     76, }, /* 651 */
-  {     0,      5,     12,      0,      0,  18432,     70, }, /* 652 */
-  {     0,      5,     12,     92,    -58,  18432,     70, }, /* 653 */
-  {     0,      9,     12,      0,  -7615,  18432,     74, }, /* 654 */
-  {     1,      5,     12,      0,      8,  18432,     76, }, /* 655 */
-  {     1,      9,     12,      0,     -8,  18432,     74, }, /* 656 */
-  {     1,      5,     12,      0,     74,  18432,     76, }, /* 657 */
-  {     1,      5,     12,      0,     86,  18432,     76, }, /* 658 */
-  {     1,      5,     12,      0,    100,  18432,     76, }, /* 659 */
-  {     1,      5,     12,      0,    128,  18432,     76, }, /* 660 */
-  {     1,      5,     12,      0,    112,  18432,     76, }, /* 661 */
-  {     1,      5,     12,      0,    126,  18432,     76, }, /* 662 */
-  {     1,      5,     12,      0,      8,  18432,     70, }, /* 663 */
-  {     1,      8,     12,      0,     -8,  18432,     86, }, /* 664 */
-  {     1,      5,     12,      0,      0,  18432,     70, }, /* 665 */
-  {     1,      5,     12,      0,      9,  18432,     70, }, /* 666 */
-  {     1,      9,     12,      0,    -74,  18432,     74, }, /* 667 */
-  {     1,      8,     12,      0,     -9,  18432,     86, }, /* 668 */
-  {     1,      5,     12,     21,  -7173,  18432,     76, }, /* 669 */
-  {     1,      9,     12,      0,    -86,  18432,     74, }, /* 670 */
-  {     1,      9,     12,      0,   -100,  18432,     74, }, /* 671 */
-  {     1,      9,     12,      0,   -112,  18432,     74, }, /* 672 */
-  {     1,      9,     12,      0,   -128,  18432,     74, }, /* 673 */
-  {     1,      9,     12,      0,   -126,  18432,     74, }, /* 674 */
-  {    69,     29,     12,      0,      0,  45056,     52, }, /* 675 */
-  {    84,      1,      3,      0,      0,   6144,    196, }, /* 676 */
-  {    84,      1,     13,      0,      0,   6144,    198, }, /* 677 */
-  {    69,      1,      2,      0,      0,  18432,    200, }, /* 678 */
-  {    69,      1,      2,      0,      0,  34816,    200, }, /* 679 */
-  {    69,     17,     12,      0,      0,  28672,    202, }, /* 680 */
-  {    69,     21,     12,      0,      0,  28672,     64, }, /* 681 */
-  {    69,     20,     12,      0,      0,  28672,    204, }, /* 682 */
-  {    69,     19,     12,      0,      0,  28672,    204, }, /* 683 */
-  {    69,     22,     12,      0,      0,  28672,    206, }, /* 684 */
-  {    69,     20,     12,      0,      0,  28672,    206, }, /* 685 */
-  {    69,     19,     12,      0,      0,  28672,    206, }, /* 686 */
-  {    69,     21,     12,      0,      0,  28672,    208, }, /* 687 */
-  {    69,     27,      2,      0,      0,  45056,     50, }, /* 688 */
-  {    69,     28,      2,      0,      0,   4096,     50, }, /* 689 */
-  {    69,      1,      2,      0,      0,  20480,    134, }, /* 690 */
-  {    69,      1,      2,      0,      0,  36864,    134, }, /* 691 */
-  {    69,      1,      2,      0,      0,  30720,    134, }, /* 692 */
-  {    69,      1,      2,      0,      0,  24576,    134, }, /* 693 */
-  {    69,      1,      2,      0,      0,  40960,    134, }, /* 694 */
-  {    69,     29,     12,      0,      0,   8291,     52, }, /* 695 */
-  {    69,     21,     12,      0,      0,  14336,     54, }, /* 696 */
-  {    69,     21,     12,      0,      0,  14336,     64, }, /* 697 */
-  {    69,     21,     14,      0,      0,  28672,    210, }, /* 698 */
-  {    69,     21,     12,      0,      0,  28672,    212, }, /* 699 */
-  {    69,     16,     12,      0,      0,  28672,    138, }, /* 700 */
-  {    69,     16,     12,      0,      0,  28672,    214, }, /* 701 */
-  {    69,     25,     12,      0,      0,   8192,     64, }, /* 702 */
-  {    69,     22,     12,      0,      0,  28672,    216, }, /* 703 */
-  {    69,     18,     12,      0,      0,  28672,    216, }, /* 704 */
-  {    69,     21,     12,      0,      0,  28672,    202, }, /* 705 */
-  {    69,      1,      2,      0,      0,   6144,    218, }, /* 706 */
-  {    68,      2,      2,      0,      0,   6144,    220, }, /* 707 */
-  {    69,      1,      2,      0,      0,  22528,    134, }, /* 708 */
-  {    69,      1,      2,      0,      0,  38912,    134, }, /* 709 */
-  {    69,      1,      2,      0,      0,  16384,    134, }, /* 710 */
-  {    69,      1,      2,      0,      0,  32768,    134, }, /* 711 */
-  {    69,      1,      2,      0,      0,   6144,    222, }, /* 712 */
-  {    69,     25,     12,      0,      0,  12288,    118, }, /* 713 */
-  {    69,     25,     12,      0,      0,  12288,    224, }, /* 714 */
-  {    69,     25,     12,      0,      0,  28672,    118, }, /* 715 */
-  {    69,     22,     12,      0,      0,  28672,    226, }, /* 716 */
-  {    69,     18,     12,      0,      0,  28672,    226, }, /* 717 */
-  {    68,      2,     12,      0,      0,  14336,      0, }, /* 718 */
-  {    84,     12,      3,      0,      0,  26624,    228, }, /* 719 */
-  {    84,     11,      3,      0,      0,  26624,    120, }, /* 720 */
-  {    84,     11,      3,      0,      0,  26624,    230, }, /* 721 */
-  {    84,     12,      3,      0,      0,  26753,    102, }, /* 722 */
-  {    69,     26,     12,      0,      0,  28672,     68, }, /* 723 */
-  {    69,      9,     12,      0,      0,  18432,    112, }, /* 724 */
-  {    69,      5,     12,      0,      0,  18432,    232, }, /* 725 */
-  {    69,     25,     12,      0,      0,  28672,    234, }, /* 726 */
-  {    69,     26,     14,      0,      0,  28672,    236, }, /* 727 */
-  {     1,      9,     12,     96,  -7517,  18432,     74, }, /* 728 */
-  {    69,     26,     12,      0,      0,  28672,    118, }, /* 729 */
-  {     0,      9,     12,    100,  -8383,  18432,     74, }, /* 730 */
-  {     0,      9,     12,    104,  -8262,  18432,     74, }, /* 731 */
-  {    69,     26,     12,      0,      0,  14336,    238, }, /* 732 */
-  {     0,      9,     12,      0,     28,  18432,     74, }, /* 733 */
-  {    69,      7,     12,      0,      0,  18432,    240, }, /* 734 */
-  {    69,      5,     14,      0,      0,  18432,    242, }, /* 735 */
-  {    69,      5,     12,      0,      0,  18432,    244, }, /* 736 */
-  {     0,      5,     12,      0,    -28,  18432,     76, }, /* 737 */
-  {     0,     14,     12,      0,     16,  18432,     74, }, /* 738 */
-  {     0,     14,     12,      0,    -16,  18432,     76, }, /* 739 */
-  {     0,     14,     12,      0,      0,  18432,     82, }, /* 740 */
-  {    69,     25,     14,      0,      0,  28672,    246, }, /* 741 */
-  {    69,     26,     14,      0,      0,  28672,    246, }, /* 742 */
-  {    69,     26,     12,      0,      0,  28672,     64, }, /* 743 */
-  {    69,     25,     12,      0,      0,  28672,    248, }, /* 744 */
-  {    69,     25,     12,      0,      0,  12288,    250, }, /* 745 */
-  {    69,     22,     12,      0,      0,  28672,    248, }, /* 746 */
-  {    69,     18,     12,      0,      0,  28672,    248, }, /* 747 */
-  {    69,     26,     14,      0,      0,  28672,    252, }, /* 748 */
-  {    69,     22,     12,      0,      0,  28672,    254, }, /* 749 */
-  {    69,     18,     12,      0,      0,  28672,    254, }, /* 750 */
-  {    69,     26,     12,      0,      0,  18432,     54, }, /* 751 */
-  {    69,     26,     14,      0,      0,  28672,    256, }, /* 752 */
-  {    68,      2,     12,      0,      0,  18432,    258, }, /* 753 */
-  {    69,     26,     12,      0,     26,  18432,    260, }, /* 754 */
-  {    69,     26,     14,      0,     26,  18432,    262, }, /* 755 */
-  {    69,     26,     12,      0,    -26,  18432,    264, }, /* 756 */
-  {    69,     25,     14,      0,      0,  28672,    266, }, /* 757 */
-  {    69,     26,     14,      0,      0,  28672,    268, }, /* 758 */
-  {    69,     26,     14,      0,      0,  28672,    270, }, /* 759 */
-  {    69,     25,     14,      0,      0,  28672,    268, }, /* 760 */
-  {    69,     26,     14,      0,      0,  18432,    256, }, /* 761 */
-  {    69,     26,     14,      0,      0,  28672,    272, }, /* 762 */
-  {    88,     26,     12,      0,      0,  18432,     54, }, /* 763 */
-  {    69,     26,     12,      0,      0,  28672,    216, }, /* 764 */
-  {    35,      9,     12,      0,     48,  18432,     74, }, /* 765 */
-  {    35,      5,     12,      0,    -48,  18432,     76, }, /* 766 */
-  {     0,      9,     12,      0, -10743,  18432,     74, }, /* 767 */
-  {     0,      9,     12,      0,  -3814,  18432,     74, }, /* 768 */
-  {     0,      9,     12,      0, -10727,  18432,     74, }, /* 769 */
-  {     0,      5,     12,      0, -10795,  18432,     76, }, /* 770 */
-  {     0,      5,     12,      0, -10792,  18432,     76, }, /* 771 */
-  {     0,      9,     12,      0, -10780,  18432,     74, }, /* 772 */
-  {     0,      9,     12,      0, -10749,  18432,     74, }, /* 773 */
-  {     0,      9,     12,      0, -10783,  18432,     74, }, /* 774 */
-  {     0,      9,     12,      0, -10782,  18432,     74, }, /* 775 */
-  {     0,      9,     12,      0, -10815,  18432,     74, }, /* 776 */
-  {    34,      5,     12,      0,      0,  18432,     60, }, /* 777 */
-  {    34,     26,     12,      0,      0,  28672,     68, }, /* 778 */
-  {    34,     12,      3,      0,      0,  26624,     96, }, /* 779 */
-  {    34,     21,     12,      0,      0,  28672,     68, }, /* 780 */
-  {    34,     15,     12,      0,      0,  28672,     68, }, /* 781 */
-  {    17,      5,     12,      0,  -7264,  18432,     76, }, /* 782 */
-  {    90,      7,     12,      0,      0,  18432,     82, }, /* 783 */
-  {    90,      6,     12,      0,      0,  18432,    142, }, /* 784 */
-  {    90,     21,     12,      0,      0,  18432,     68, }, /* 785 */
-  {    90,     12,      3,      0,      0,  26624,    182, }, /* 786 */
-  {     2,     12,      3,      0,      0,  26624,    130, }, /* 787 */
-  {    69,     20,     12,      0,      0,  28672,    216, }, /* 788 */
-  {    69,     19,     12,      0,      0,  28672,    216, }, /* 789 */
-  {    69,      6,     12,      0,      0,  28672,    274, }, /* 790 */
-  {    69,     21,     12,      0,      0,  28672,    276, }, /* 791 */
-  {    69,     21,     12,      0,      0,  28726,     54, }, /* 792 */
-  {    23,     26,     12,      0,      0,  28672,    278, }, /* 793 */
-  {    69,     26,     12,      0,      0,  28672,    280, }, /* 794 */
-  {    69,     26,     12,      0,      0,  28672,    282, }, /* 795 */
-  {    69,     21,     12,      0,      0,  28825,    276, }, /* 796 */
-  {    69,     21,     12,      0,      0,  28825,    212, }, /* 797 */
-  {    69,     21,     12,      0,      0,  28819,     54, }, /* 798 */
-  {    23,      6,     12,      0,      0,  18432,    136, }, /* 799 */
-  {    69,      7,     12,      0,      0,  18447,    284, }, /* 800 */
-  {    23,     14,     12,      0,      0,  18432,    284, }, /* 801 */
-  {    69,     22,     12,      0,      0,  28825,    216, }, /* 802 */
-  {    69,     18,     12,      0,      0,  28825,    216, }, /* 803 */
-  {    69,     22,     12,      0,      0,  28825,     62, }, /* 804 */
-  {    69,     18,     12,      0,      0,  28825,     62, }, /* 805 */
-  {    69,     26,     12,      0,      0,  28819,     54, }, /* 806 */
-  {    69,     17,     12,      0,      0,  28819,    202, }, /* 807 */
-  {    69,     22,     12,      0,      0,  28819,    206, }, /* 808 */
-  {    69,     18,     12,      0,      0,  28819,    206, }, /* 809 */
-  {    84,     12,      3,      0,      0,  26669,     96, }, /* 810 */
-  {    18,     10,      3,      0,      0,  18432,    286, }, /* 811 */
-  {    69,     17,     14,      0,      0,  28819,    288, }, /* 812 */
-  {    69,      6,     12,      0,      0,  18525,    136, }, /* 813 */
-  {    69,     26,     12,      0,      0,  28819,     68, }, /* 814 */
-  {    23,      6,     12,      0,      0,  18432,    142, }, /* 815 */
-  {    69,      7,     12,      0,      0,  18564,     82, }, /* 816 */
-  {    69,     21,     14,      0,      0,  28804,    236, }, /* 817 */
-  {    69,     26,     12,      0,      0,  28687,     68, }, /* 818 */
-  {    20,      7,     12,      0,      0,  18432,     82, }, /* 819 */
-  {    84,     12,      3,      0,      0,  26717,     96, }, /* 820 */
-  {    69,     24,     12,      0,      0,  28765,    290, }, /* 821 */
-  {    20,      6,     12,      0,      0,  18432,    136, }, /* 822 */
-  {    69,     17,     12,      0,      0,  28765,    126, }, /* 823 */
-  {    21,      7,     12,      0,      0,  18432,     82, }, /* 824 */
-  {    69,     21,     12,      0,      0,  28825,     68, }, /* 825 */
-  {    69,      6,     12,      0,      0,  18525,     94, }, /* 826 */
-  {    21,      6,     12,      0,      0,  18432,    136, }, /* 827 */
-  {    22,      7,     12,      0,      0,  18432,     82, }, /* 828 */
-  {    18,      7,     12,      0,      0,  18432,     82, }, /* 829 */
-  {    18,      7,     12,      0,      0,  18432,    168, }, /* 830 */
-  {    69,     26,     12,      0,      0,  18447,     68, }, /* 831 */
-  {    69,     15,     12,      0,      0,  18447,     68, }, /* 832 */
-  {    18,     26,     12,      0,      0,  18432,     68, }, /* 833 */
-  {    18,     26,     12,      0,      0,  28672,     68, }, /* 834 */
-  {    69,     15,     12,      0,      0,  18432,     68, }, /* 835 */
-  {    69,     26,     14,      0,      0,  18447,    236, }, /* 836 */
-  {    21,     26,     12,      0,      0,  18432,     68, }, /* 837 */
-  {    23,      7,     12,      0,      0,  18432,    292, }, /* 838 */
-  {    24,      7,     12,      0,      0,  18432,     82, }, /* 839 */
-  {    24,      6,     12,      0,      0,  18432,    136, }, /* 840 */
-  {    24,     26,     12,      0,      0,  28672,     68, }, /* 841 */
-  {   111,      7,     12,      0,      0,  18432,     82, }, /* 842 */
-  {   111,      6,     12,      0,      0,  18432,    142, }, /* 843 */
-  {   111,     21,     12,      0,      0,  18432,    106, }, /* 844 */
-  {   111,     21,     12,      0,      0,  18432,    124, }, /* 845 */
-  {    99,      7,     12,      0,      0,  18432,     82, }, /* 846 */
-  {    99,      6,     12,      0,      0,  18432,    136, }, /* 847 */
-  {    99,     21,     12,      0,      0,  28672,    106, }, /* 848 */
-  {    99,     21,     12,      0,      0,  28672,    124, }, /* 849 */
-  {    99,     13,     12,      0,      0,  18432,    138, }, /* 850 */
-  {     2,      9,     12,    108,      1,  18432,     74, }, /* 851 */
-  {     2,      5,     12,    108, -35267,  18432,     76, }, /* 852 */
-  {     2,      7,     12,      0,      0,  18432,     82, }, /* 853 */
-  {     2,     21,     12,      0,      0,  28672,     68, }, /* 854 */
-  {     2,     12,      3,      0,      0,  26624,     96, }, /* 855 */
-  {     2,      6,     12,      0,      0,  28672,     92, }, /* 856 */
-  {     2,      6,     12,      0,      0,  18432,     88, }, /* 857 */
-  {   112,      7,     12,      0,      0,  18432,     82, }, /* 858 */
-  {   112,     14,     12,      0,      0,  18432,     82, }, /* 859 */
-  {   112,     12,      3,      0,      0,  26624,     96, }, /* 860 */
-  {   112,     21,     12,      0,      0,  18432,     68, }, /* 861 */
-  {   112,     21,     12,      0,      0,  18432,    124, }, /* 862 */
-  {   112,     21,     12,      0,      0,  18432,    106, }, /* 863 */
-  {    69,     24,     12,      0,      0,  28762,     56, }, /* 864 */
-  {     0,      9,     12,      0, -35332,  18432,     74, }, /* 865 */
-  {    69,     24,     12,      0,      0,  18432,     56, }, /* 866 */
-  {     0,      9,     12,      0, -42280,  18432,     74, }, /* 867 */
-  {     0,      5,     12,      0,     48,  18432,     76, }, /* 868 */
-  {     0,      9,     12,      0, -42308,  18432,     74, }, /* 869 */
-  {     0,      9,     12,      0, -42319,  18432,     74, }, /* 870 */
-  {     0,      9,     12,      0, -42315,  18432,     74, }, /* 871 */
-  {     0,      9,     12,      0, -42305,  18432,     74, }, /* 872 */
-  {     0,      9,     12,      0, -42258,  18432,     74, }, /* 873 */
-  {     0,      9,     12,      0, -42282,  18432,     74, }, /* 874 */
-  {     0,      9,     12,      0, -42261,  18432,     74, }, /* 875 */
-  {     0,      9,     12,      0,    928,  18432,     74, }, /* 876 */
-  {     0,      9,     12,      0,    -48,  18432,     74, }, /* 877 */
-  {     0,      9,     12,      0, -42307,  18432,     74, }, /* 878 */
-  {     0,      9,     12,      0, -35384,  18432,     74, }, /* 879 */
-  {     0,      6,     12,      0,      0,  18432,    142, }, /* 880 */
+  {    74,     12,      3,      0,      0,  26624,    128, }, /* 459 */
+  {    74,     12,      3,      0,      0,  26624,    146, }, /* 460 */
+  {    69,     26,     12,      0,      0,  18432,     68, }, /* 461 */
+  {    16,      7,     12,      0,      0,  18432,     82, }, /* 462 */
+  {    16,     10,     12,      0,      0,  18432,    144, }, /* 463 */
+  {    16,     12,      3,      0,      0,  26624,    130, }, /* 464 */
+  {    16,     10,      5,      0,      0,  18432,    144, }, /* 465 */
+  {    16,     12,      3,      0,      0,  26624,     96, }, /* 466 */
+  {    16,     12,      3,      0,      0,  26624,    146, }, /* 467 */
+  {    16,     13,     12,      0,      0,  18549,    138, }, /* 468 */
+  {    16,     21,     12,      0,      0,  18432,    124, }, /* 469 */
+  {    16,     21,     12,      0,      0,  18432,     68, }, /* 470 */
+  {    16,     10,     12,      0,      0,  18432,    164, }, /* 471 */
+  {    16,     12,      3,      0,      0,  26624,    128, }, /* 472 */
+  {    16,     13,     12,      0,      0,  18432,    138, }, /* 473 */
+  {    16,     26,     12,      0,      0,  18432,     68, }, /* 474 */
+  {    17,      9,     12,      0,   7264,  18432,     74, }, /* 475 */
+  {    17,      5,     12,      0,   3008,  18432,    166, }, /* 476 */
+  {    69,     21,     12,      0,      0,  18510,     68, }, /* 477 */
+  {    17,      6,     12,      0,      0,  18432,    168, }, /* 478 */
+  {    18,      7,      6,      0,      0,  18432,     82, }, /* 479 */
+  {    18,      7,      6,      0,      0,  18432,    170, }, /* 480 */
+  {    18,      7,      7,      0,      0,  18432,    170, }, /* 481 */
+  {    18,      7,      7,      0,      0,  18432,     82, }, /* 482 */
+  {    18,      7,      8,      0,      0,  18432,     82, }, /* 483 */
+  {    75,      7,     12,      0,      0,  18432,     82, }, /* 484 */
+  {    75,     12,      3,      0,      0,  26624,     96, }, /* 485 */
+  {    75,     21,     12,      0,      0,  18432,     68, }, /* 486 */
+  {    75,     21,     12,      0,      0,  18432,    106, }, /* 487 */
+  {    75,     21,     12,      0,      0,  18432,    124, }, /* 488 */
+  {    75,     15,     12,      0,      0,  18432,    138, }, /* 489 */
+  {    75,     15,     12,      0,      0,  18432,     68, }, /* 490 */
+  {    75,     26,     12,      0,      0,  28672,     68, }, /* 491 */
+  {    76,      9,     12,      0,  38864,  18432,    172, }, /* 492 */
+  {    76,      9,     12,      0,      8,  18432,    172, }, /* 493 */
+  {    76,      5,     12,      0,     -8,  18432,     70, }, /* 494 */
+  {    77,     17,     12,      0,      0,  28672,    126, }, /* 495 */
+  {    77,      7,     12,      0,      0,  18432,     82, }, /* 496 */
+  {    77,     26,     12,      0,      0,  18432,     68, }, /* 497 */
+  {    77,     21,     12,      0,      0,  18432,    124, }, /* 498 */
+  {    78,     29,     12,      0,      0,  45056,     52, }, /* 499 */
+  {    78,      7,     12,      0,      0,  18432,     82, }, /* 500 */
+  {    78,     22,     12,      0,      0,  28672,    158, }, /* 501 */
+  {    78,     18,     12,      0,      0,  28672,    158, }, /* 502 */
+  {    79,      7,     12,      0,      0,  18432,     82, }, /* 503 */
+  {    69,     21,     12,      0,      0,  18432,    106, }, /* 504 */
+  {    79,     14,     12,      0,      0,  18432,     82, }, /* 505 */
+  {    25,      7,     12,      0,      0,  18432,     82, }, /* 506 */
+  {    25,     12,      3,      0,      0,  26624,    130, }, /* 507 */
+  {    25,     12,      3,      0,      0,  26624,    146, }, /* 508 */
+  {    25,     10,      5,      0,      0,  18432,    174, }, /* 509 */
+  {    26,      7,     12,      0,      0,  18432,     82, }, /* 510 */
+  {    26,     12,      3,      0,      0,  26624,    130, }, /* 511 */
+  {    26,     10,      5,      0,      0,  18432,    176, }, /* 512 */
+  {    69,     21,     12,      0,      0,  18573,    124, }, /* 513 */
+  {    27,      7,     12,      0,      0,  18432,     82, }, /* 514 */
+  {    27,     12,      3,      0,      0,  26624,    130, }, /* 515 */
+  {    28,      7,     12,      0,      0,  18432,     82, }, /* 516 */
+  {    28,     12,      3,      0,      0,  26624,    130, }, /* 517 */
+  {    80,      7,     12,      0,      0,  18432,     82, }, /* 518 */
+  {    80,      7,     12,      0,      0,  18432,    140, }, /* 519 */
+  {    80,     12,      3,      0,      0,  26624,    100, }, /* 520 */
+  {    80,     10,      5,      0,      0,  18432,    144, }, /* 521 */
+  {    80,     12,      3,      0,      0,  26624,    130, }, /* 522 */
+  {    80,     12,      3,      0,      0,  26624,     96, }, /* 523 */
+  {    80,     12,      3,      0,      0,  26624,    146, }, /* 524 */
+  {    80,     21,     12,      0,      0,  18432,    106, }, /* 525 */
+  {    80,      6,     12,      0,      0,  18432,    142, }, /* 526 */
+  {    80,     21,     12,      0,      0,  18432,     68, }, /* 527 */
+  {    80,     23,     12,      0,      0,  14336,     68, }, /* 528 */
+  {    80,     13,     12,      0,      0,  18432,    138, }, /* 529 */
+  {    80,     15,     12,      0,      0,  28672,     68, }, /* 530 */
+  {    19,     21,     12,      0,      0,  28672,     68, }, /* 531 */
+  {    69,     21,     12,      0,      0,  28777,    106, }, /* 532 */
+  {    69,     21,     12,      0,      0,  28777,    124, }, /* 533 */
+  {    19,     21,     12,      0,      0,  28672,    106, }, /* 534 */
+  {    19,     17,     12,      0,      0,  28672,    126, }, /* 535 */
+  {    19,     21,     12,      0,      0,  28672,    124, }, /* 536 */
+  {    19,     21,     12,      0,      0,  28672,    178, }, /* 537 */
+  {    19,     12,      3,      0,      0,  26624,    180, }, /* 538 */
+  {    19,      1,      2,      0,      0,   6144,     66, }, /* 539 */
+  {    19,     13,     12,      0,      0,  18432,    138, }, /* 540 */
+  {    19,      7,     12,      0,      0,  18432,     82, }, /* 541 */
+  {    19,      6,     12,      0,      0,  18432,    136, }, /* 542 */
+  {    19,     12,      3,      0,      0,  26624,    182, }, /* 543 */
+  {    19,     12,      3,      0,      0,  26624,    130, }, /* 544 */
+  {    29,      7,     12,      0,      0,  18432,     82, }, /* 545 */
+  {    29,     12,      3,      0,      0,  26624,    130, }, /* 546 */
+  {    29,     10,      5,      0,      0,  18432,    144, }, /* 547 */
+  {    29,     12,      3,      0,      0,  26624,     96, }, /* 548 */
+  {    29,     26,     12,      0,      0,  28672,     68, }, /* 549 */
+  {    29,     21,     12,      0,      0,  28672,    124, }, /* 550 */
+  {    29,     13,     12,      0,      0,  18432,    138, }, /* 551 */
+  {    30,      7,     12,      0,      0,  18432,     82, }, /* 552 */
+  {    89,      7,     12,      0,      0,  18432,     82, }, /* 553 */
+  {    89,      7,     12,      0,      0,  18432,    156, }, /* 554 */
+  {    89,     13,     12,      0,      0,  18432,    138, }, /* 555 */
+  {    89,     15,     12,      0,      0,  18432,    138, }, /* 556 */
+  {    89,     26,     12,      0,      0,  28672,     68, }, /* 557 */
+  {    80,     26,     12,      0,      0,  28672,     68, }, /* 558 */
+  {    33,      7,     12,      0,      0,  18432,     82, }, /* 559 */
+  {    33,     12,      3,      0,      0,  26624,    130, }, /* 560 */
+  {    33,     10,      5,      0,      0,  18432,    144, }, /* 561 */
+  {    33,     21,     12,      0,      0,  18432,     68, }, /* 562 */
+  {   106,      7,     12,      0,      0,  18432,     82, }, /* 563 */
+  {   106,     10,      5,      0,      0,  18432,    144, }, /* 564 */
+  {   106,     12,      3,      0,      0,  26624,    130, }, /* 565 */
+  {   106,     12,      3,      0,      0,  26624,    184, }, /* 566 */
+  {   106,     10,     12,      0,      0,  18432,    144, }, /* 567 */
+  {   106,     12,      3,      0,      0,  26624,     96, }, /* 568 */
+  {   106,     13,     12,      0,      0,  18432,    138, }, /* 569 */
+  {   106,     21,     12,      0,      0,  18432,     68, }, /* 570 */
+  {   106,      6,     12,      0,      0,  18432,    136, }, /* 571 */
+  {   106,     21,     12,      0,      0,  18432,    124, }, /* 572 */
+  {    84,     11,      3,      0,      0,  26624,    186, }, /* 573 */
+  {    84,     12,      3,      0,      0,  26624,    130, }, /* 574 */
+  {    93,     12,      3,      0,      0,  26624,    130, }, /* 575 */
+  {    93,     10,      5,      0,      0,  18432,    144, }, /* 576 */
+  {    93,      7,     12,      0,      0,  18432,     82, }, /* 577 */
+  {    93,     12,      3,      0,      0,  26624,     96, }, /* 578 */
+  {    93,     10,      3,      0,      0,  18432,    148, }, /* 579 */
+  {    93,     10,      5,      0,      0,  18432,    174, }, /* 580 */
+  {    93,     13,     12,      0,      0,  18432,    138, }, /* 581 */
+  {    93,     21,     12,      0,      0,  18432,    124, }, /* 582 */
+  {    93,     21,     12,      0,      0,  18432,     68, }, /* 583 */
+  {    93,     21,     12,      0,      0,  18432,    106, }, /* 584 */
+  {    93,     26,     12,      0,      0,  18432,     68, }, /* 585 */
+  {    96,     12,      3,      0,      0,  26624,    130, }, /* 586 */
+  {    96,     10,      5,      0,      0,  18432,    144, }, /* 587 */
+  {    96,      7,     12,      0,      0,  18432,     82, }, /* 588 */
+  {    96,     10,      5,      0,      0,  18432,    174, }, /* 589 */
+  {    96,     12,      3,      0,      0,  26624,    146, }, /* 590 */
+  {    96,     13,     12,      0,      0,  18432,    138, }, /* 591 */
+  {   119,      7,     12,      0,      0,  18432,     82, }, /* 592 */
+  {   119,     12,      3,      0,      0,  26624,    102, }, /* 593 */
+  {   119,     10,      5,      0,      0,  18432,    144, }, /* 594 */
+  {   119,     12,      3,      0,      0,  26624,    130, }, /* 595 */
+  {   119,     10,      5,      0,      0,  18432,    176, }, /* 596 */
+  {   119,     21,     12,      0,      0,  18432,     68, }, /* 597 */
+  {    97,      7,     12,      0,      0,  18432,     82, }, /* 598 */
+  {    97,     10,      5,      0,      0,  18432,    144, }, /* 599 */
+  {    97,     12,      3,      0,      0,  26624,    130, }, /* 600 */
+  {    97,     12,      3,      0,      0,  26624,    188, }, /* 601 */
+  {    97,     12,      3,      0,      0,  26624,     96, }, /* 602 */
+  {    97,     21,     12,      0,      0,  18432,    124, }, /* 603 */
+  {    97,     21,     12,      0,      0,  18432,    106, }, /* 604 */
+  {    97,     13,     12,      0,      0,  18432,    138, }, /* 605 */
+  {    98,     13,     12,      0,      0,  18432,    138, }, /* 606 */
+  {    98,      7,     12,      0,      0,  18432,     82, }, /* 607 */
+  {    98,      6,     12,      0,      0,  18432,     92, }, /* 608 */
+  {    98,      6,     12,      0,      0,  18432,     94, }, /* 609 */
+  {    98,     21,     12,      0,      0,  18432,    124, }, /* 610 */
+  {     2,      5,     12,     63,  -6222,  18432,     70, }, /* 611 */
+  {     2,      5,     12,     67,  -6221,  18432,     70, }, /* 612 */
+  {     2,      5,     12,     71,  -6212,  18432,     70, }, /* 613 */
+  {     2,      5,     12,     75,  -6210,  18432,     70, }, /* 614 */
+  {     2,      5,     12,     79,  -6210,  18432,     70, }, /* 615 */
+  {     2,      5,     12,     79,  -6211,  18432,     70, }, /* 616 */
+  {     2,      5,     12,     84,  -6204,  18432,     70, }, /* 617 */
+  {     2,      5,     12,     88,  -6180,  18432,     70, }, /* 618 */
+  {     2,      5,     12,    108,  35267,  18432,     70, }, /* 619 */
+  {    17,      9,     12,      0,  -3008,  18432,     74, }, /* 620 */
+  {    96,     21,     12,      0,      0,  18432,     68, }, /* 621 */
+  {    84,     12,      3,      0,      0,  26762,     96, }, /* 622 */
+  {    84,     12,      3,      0,      0,  26630,     96, }, /* 623 */
+  {    69,     21,     12,      0,      0,  18498,    190, }, /* 624 */
+  {    84,     12,      3,      0,      0,  26666,     96, }, /* 625 */
+  {    84,     12,      3,      0,      0,  26696,     96, }, /* 626 */
+  {    84,     12,      3,      0,      0,  26780,     96, }, /* 627 */
+  {    69,     10,      5,      0,      0,  18474,    160, }, /* 628 */
+  {    69,      7,     12,      0,      0,  18501,     82, }, /* 629 */
+  {    69,      7,     12,      0,      0,  18474,     82, }, /* 630 */
+  {    69,      7,     12,      0,      0,  18438,     82, }, /* 631 */
+  {    69,      7,     12,      0,      0,  18594,     82, }, /* 632 */
+  {    69,      7,     12,      0,      0,  18498,     82, }, /* 633 */
+  {    84,     12,      3,      0,      0,  26750,     96, }, /* 634 */
+  {    69,     10,      5,      0,      0,  18435,    160, }, /* 635 */
+  {    84,     12,      3,      0,      0,  26690,     96, }, /* 636 */
+  {    69,      7,     12,      0,      0,  18453,     82, }, /* 637 */
+  {     2,      5,     12,      0,      0,  18432,     60, }, /* 638 */
+  {     1,      6,     12,      0,      0,  18432,     88, }, /* 639 */
+  {     2,      6,     12,      0,      0,  18432,    168, }, /* 640 */
+  {     0,      5,     12,      0,  35332,  18432,     76, }, /* 641 */
+  {     0,      5,     12,      0,   3814,  18432,     76, }, /* 642 */
+  {     0,      5,     12,      0,  35384,  18432,     76, }, /* 643 */
+  {     0,      5,     12,      0,      0,  18432,    192, }, /* 644 */
+  {     0,      6,     12,      0,      0,  18432,    168, }, /* 645 */
+  {     0,      6,     12,      0,      0,  18432,    194, }, /* 646 */
+  {     1,      6,     12,      0,      0,  18432,    168, }, /* 647 */
+  {    84,     12,      3,      0,      0,  26636,    102, }, /* 648 */
+  {    84,     12,      3,      0,      0,  26687,     96, }, /* 649 */
+  {    84,     12,      3,      0,      0,  26648,     96, }, /* 650 */
+  {     0,      9,     12,     92,      1,  18432,     74, }, /* 651 */
+  {     0,      5,     12,     92,     -1,  18432,     76, }, /* 652 */
+  {     0,      5,     12,      0,      0,  18432,     70, }, /* 653 */
+  {     0,      5,     12,     92,    -58,  18432,     70, }, /* 654 */
+  {     0,      9,     12,      0,  -7615,  18432,     74, }, /* 655 */
+  {     1,      5,     12,      0,      8,  18432,     76, }, /* 656 */
+  {     1,      9,     12,      0,     -8,  18432,     74, }, /* 657 */
+  {     1,      5,     12,      0,     74,  18432,     76, }, /* 658 */
+  {     1,      5,     12,      0,     86,  18432,     76, }, /* 659 */
+  {     1,      5,     12,      0,    100,  18432,     76, }, /* 660 */
+  {     1,      5,     12,      0,    128,  18432,     76, }, /* 661 */
+  {     1,      5,     12,      0,    112,  18432,     76, }, /* 662 */
+  {     1,      5,     12,      0,    126,  18432,     76, }, /* 663 */
+  {     1,      5,     12,      0,      8,  18432,     70, }, /* 664 */
+  {     1,      8,     12,      0,     -8,  18432,     86, }, /* 665 */
+  {     1,      5,     12,      0,      0,  18432,     70, }, /* 666 */
+  {     1,      5,     12,      0,      9,  18432,     70, }, /* 667 */
+  {     1,      9,     12,      0,    -74,  18432,     74, }, /* 668 */
+  {     1,      8,     12,      0,     -9,  18432,     86, }, /* 669 */
+  {     1,      5,     12,     21,  -7173,  18432,     76, }, /* 670 */
+  {     1,      9,     12,      0,    -86,  18432,     74, }, /* 671 */
+  {     1,      9,     12,      0,   -100,  18432,     74, }, /* 672 */
+  {     1,      9,     12,      0,   -112,  18432,     74, }, /* 673 */
+  {     1,      9,     12,      0,   -128,  18432,     74, }, /* 674 */
+  {     1,      9,     12,      0,   -126,  18432,     74, }, /* 675 */
+  {    69,     29,     12,      0,      0,  45056,     52, }, /* 676 */
+  {    84,      1,      3,      0,      0,   6144,    196, }, /* 677 */
+  {    84,      1,     13,      0,      0,   6144,    198, }, /* 678 */
+  {    69,      1,      2,      0,      0,  18432,    200, }, /* 679 */
+  {    69,      1,      2,      0,      0,  34816,    200, }, /* 680 */
+  {    69,     17,     12,      0,      0,  28672,    202, }, /* 681 */
+  {    69,     21,     12,      0,      0,  28672,     64, }, /* 682 */
+  {    69,     20,     12,      0,      0,  28672,    204, }, /* 683 */
+  {    69,     19,     12,      0,      0,  28672,    204, }, /* 684 */
+  {    69,     22,     12,      0,      0,  28672,    206, }, /* 685 */
+  {    69,     20,     12,      0,      0,  28672,    206, }, /* 686 */
+  {    69,     19,     12,      0,      0,  28672,    206, }, /* 687 */
+  {    69,     21,     12,      0,      0,  28672,    208, }, /* 688 */
+  {    69,     27,      2,      0,      0,  45056,     50, }, /* 689 */
+  {    69,     28,      2,      0,      0,   4096,     50, }, /* 690 */
+  {    69,      1,      2,      0,      0,  20480,    134, }, /* 691 */
+  {    69,      1,      2,      0,      0,  36864,    134, }, /* 692 */
+  {    69,      1,      2,      0,      0,  30720,    134, }, /* 693 */
+  {    69,      1,      2,      0,      0,  24576,    134, }, /* 694 */
+  {    69,      1,      2,      0,      0,  40960,    134, }, /* 695 */
+  {    69,     29,     12,      0,      0,   8291,     52, }, /* 696 */
+  {    69,     21,     12,      0,      0,  14336,     54, }, /* 697 */
+  {    69,     21,     12,      0,      0,  14336,     64, }, /* 698 */
+  {    69,     21,     14,      0,      0,  28672,    210, }, /* 699 */
+  {    69,     21,     12,      0,      0,  28672,    212, }, /* 700 */
+  {    69,     16,     12,      0,      0,  28672,    138, }, /* 701 */
+  {    69,     16,     12,      0,      0,  28672,    214, }, /* 702 */
+  {    69,     25,     12,      0,      0,   8192,     64, }, /* 703 */
+  {    69,     22,     12,      0,      0,  28672,    216, }, /* 704 */
+  {    69,     18,     12,      0,      0,  28672,    216, }, /* 705 */
+  {    69,     21,     12,      0,      0,  28672,    202, }, /* 706 */
+  {    69,      1,      2,      0,      0,   6144,    218, }, /* 707 */
+  {    68,      2,      2,      0,      0,   6144,    220, }, /* 708 */
+  {    69,      1,      2,      0,      0,  22528,    134, }, /* 709 */
+  {    69,      1,      2,      0,      0,  38912,    134, }, /* 710 */
+  {    69,      1,      2,      0,      0,  16384,    134, }, /* 711 */
+  {    69,      1,      2,      0,      0,  32768,    134, }, /* 712 */
+  {    69,      1,      2,      0,      0,   6144,    222, }, /* 713 */
+  {    69,     25,     12,      0,      0,  12288,    118, }, /* 714 */
+  {    69,     25,     12,      0,      0,  12288,    224, }, /* 715 */
+  {    69,     25,     12,      0,      0,  28672,    118, }, /* 716 */
+  {    69,     22,     12,      0,      0,  28672,    226, }, /* 717 */
+  {    69,     18,     12,      0,      0,  28672,    226, }, /* 718 */
+  {    68,      2,     12,      0,      0,  14336,      0, }, /* 719 */
+  {    84,     12,      3,      0,      0,  26624,    228, }, /* 720 */
+  {    84,     11,      3,      0,      0,  26624,    120, }, /* 721 */
+  {    84,     11,      3,      0,      0,  26624,    230, }, /* 722 */
+  {    84,     12,      3,      0,      0,  26753,    102, }, /* 723 */
+  {    69,     26,     12,      0,      0,  28672,     68, }, /* 724 */
+  {    69,      9,     12,      0,      0,  18432,    112, }, /* 725 */
+  {    69,      5,     12,      0,      0,  18432,    232, }, /* 726 */
+  {    69,     25,     12,      0,      0,  28672,    234, }, /* 727 */
+  {    69,     26,     14,      0,      0,  28672,    236, }, /* 728 */
+  {     1,      9,     12,     96,  -7517,  18432,     74, }, /* 729 */
+  {    69,     26,     12,      0,      0,  28672,    118, }, /* 730 */
+  {     0,      9,     12,    100,      0,  18432,     74, }, /* 731 */
+  {     0,      9,     12,    104,  -8262,  18432,     74, }, /* 732 */
+  {    69,     26,     12,      0,      0,  14336,    238, }, /* 733 */
+  {     0,      9,     12,      0,     28,  18432,     74, }, /* 734 */
+  {    69,      7,     12,      0,      0,  18432,    240, }, /* 735 */
+  {    69,      5,     14,      0,      0,  18432,    242, }, /* 736 */
+  {    69,      5,     12,      0,      0,  18432,    244, }, /* 737 */
+  {     0,      5,     12,      0,    -28,  18432,     76, }, /* 738 */
+  {     0,     14,     12,      0,     16,  18432,     74, }, /* 739 */
+  {     0,     14,     12,      0,    -16,  18432,     76, }, /* 740 */
+  {     0,     14,     12,      0,      0,  18432,     82, }, /* 741 */
+  {    69,     25,     14,      0,      0,  28672,    246, }, /* 742 */
+  {    69,     26,     14,      0,      0,  28672,    246, }, /* 743 */
+  {    69,     26,     12,      0,      0,  28672,     64, }, /* 744 */
+  {    69,     25,     12,      0,      0,  28672,    248, }, /* 745 */
+  {    69,     25,     12,      0,      0,  12288,    250, }, /* 746 */
+  {    69,     22,     12,      0,      0,  28672,    248, }, /* 747 */
+  {    69,     18,     12,      0,      0,  28672,    248, }, /* 748 */
+  {    69,     26,     14,      0,      0,  28672,    252, }, /* 749 */
+  {    69,     22,     12,      0,      0,  28672,    254, }, /* 750 */
+  {    69,     18,     12,      0,      0,  28672,    254, }, /* 751 */
+  {    69,     26,     12,      0,      0,  18432,     54, }, /* 752 */
+  {    69,     26,     14,      0,      0,  28672,    256, }, /* 753 */
+  {    68,      2,     12,      0,      0,  18432,    258, }, /* 754 */
+  {    69,     26,     12,      0,     26,  18432,    260, }, /* 755 */
+  {    69,     26,     14,      0,     26,  18432,    262, }, /* 756 */
+  {    69,     26,     12,      0,    -26,  18432,    264, }, /* 757 */
+  {    69,     25,     14,      0,      0,  28672,    266, }, /* 758 */
+  {    69,     26,     14,      0,      0,  28672,    268, }, /* 759 */
+  {    69,     26,     14,      0,      0,  28672,    270, }, /* 760 */
+  {    69,     25,     14,      0,      0,  28672,    268, }, /* 761 */
+  {    69,     26,     14,      0,      0,  18432,    256, }, /* 762 */
+  {    69,     26,     14,      0,      0,  28672,    272, }, /* 763 */
+  {    88,     26,     12,      0,      0,  18432,     54, }, /* 764 */
+  {    69,     26,     12,      0,      0,  28672,    216, }, /* 765 */
+  {    35,      9,     12,      0,     48,  18432,     74, }, /* 766 */
+  {    35,      5,     12,      0,    -48,  18432,     76, }, /* 767 */
+  {     0,      9,     12,      0, -10743,  18432,     74, }, /* 768 */
+  {     0,      9,     12,      0,  -3814,  18432,     74, }, /* 769 */
+  {     0,      9,     12,      0, -10727,  18432,     74, }, /* 770 */
+  {     0,      5,     12,      0, -10795,  18432,     76, }, /* 771 */
+  {     0,      5,     12,      0, -10792,  18432,     76, }, /* 772 */
+  {     0,      9,     12,      0, -10780,  18432,     74, }, /* 773 */
+  {     0,      9,     12,      0, -10749,  18432,     74, }, /* 774 */
+  {     0,      9,     12,      0, -10783,  18432,     74, }, /* 775 */
+  {     0,      9,     12,      0, -10782,  18432,     74, }, /* 776 */
+  {     0,      9,     12,      0, -10815,  18432,     74, }, /* 777 */
+  {    34,      5,     12,      0,      0,  18432,     60, }, /* 778 */
+  {    34,     26,     12,      0,      0,  28672,     68, }, /* 779 */
+  {    34,     12,      3,      0,      0,  26624,     96, }, /* 780 */
+  {    34,     21,     12,      0,      0,  28672,     68, }, /* 781 */
+  {    34,     15,     12,      0,      0,  28672,     68, }, /* 782 */
+  {    17,      5,     12,      0,  -7264,  18432,     76, }, /* 783 */
+  {    90,      7,     12,      0,      0,  18432,     82, }, /* 784 */
+  {    90,      6,     12,      0,      0,  18432,    142, }, /* 785 */
+  {    90,     21,     12,      0,      0,  18432,     68, }, /* 786 */
+  {    90,     12,      3,      0,      0,  26624,    184, }, /* 787 */
+  {     2,     12,      3,      0,      0,  26624,    130, }, /* 788 */
+  {    69,     20,     12,      0,      0,  28672,    216, }, /* 789 */
+  {    69,     19,     12,      0,      0,  28672,    216, }, /* 790 */
+  {    69,      6,     12,      0,      0,  28672,    274, }, /* 791 */
+  {    69,     21,     12,      0,      0,  28672,    276, }, /* 792 */
+  {    69,     21,     12,      0,      0,  28726,     54, }, /* 793 */
+  {    23,     26,     12,      0,      0,  28672,    278, }, /* 794 */
+  {    69,     26,     12,      0,      0,  28672,    280, }, /* 795 */
+  {    69,     26,     12,      0,      0,  28672,    282, }, /* 796 */
+  {    69,     21,     12,      0,      0,  28825,    276, }, /* 797 */
+  {    69,     21,     12,      0,      0,  28825,    212, }, /* 798 */
+  {    69,     21,     12,      0,      0,  28819,     54, }, /* 799 */
+  {    23,      6,     12,      0,      0,  18432,    136, }, /* 800 */
+  {    69,      7,     12,      0,      0,  18447,    284, }, /* 801 */
+  {    23,     14,     12,      0,      0,  18432,    284, }, /* 802 */
+  {    69,     22,     12,      0,      0,  28825,    216, }, /* 803 */
+  {    69,     18,     12,      0,      0,  28825,    216, }, /* 804 */
+  {    69,     22,     12,      0,      0,  28825,     62, }, /* 805 */
+  {    69,     18,     12,      0,      0,  28825,     62, }, /* 806 */
+  {    69,     26,     12,      0,      0,  28819,     54, }, /* 807 */
+  {    69,     17,     12,      0,      0,  28819,    202, }, /* 808 */
+  {    69,     22,     12,      0,      0,  28819,    206, }, /* 809 */
+  {    69,     18,     12,      0,      0,  28819,    206, }, /* 810 */
+  {    84,     12,      3,      0,      0,  26669,     96, }, /* 811 */
+  {    18,     10,      3,      0,      0,  18432,    286, }, /* 812 */
+  {    69,     17,     14,      0,      0,  28819,    288, }, /* 813 */
+  {    69,      6,     12,      0,      0,  18525,    136, }, /* 814 */
+  {    69,     26,     12,      0,      0,  28819,     68, }, /* 815 */
+  {    23,      6,     12,      0,      0,  18432,    142, }, /* 816 */
+  {    69,      7,     12,      0,      0,  18564,     82, }, /* 817 */
+  {    69,     21,     14,      0,      0,  28804,    236, }, /* 818 */
+  {    69,     26,     12,      0,      0,  28687,     68, }, /* 819 */
+  {    20,      7,     12,      0,      0,  18432,     82, }, /* 820 */
+  {    84,     12,      3,      0,      0,  26717,     96, }, /* 821 */
+  {    69,     24,     12,      0,      0,  28765,    290, }, /* 822 */
+  {    20,      6,     12,      0,      0,  18432,    136, }, /* 823 */
+  {    69,     17,     12,      0,      0,  28765,    126, }, /* 824 */
+  {    21,      7,     12,      0,      0,  18432,     82, }, /* 825 */
+  {    69,     21,     12,      0,      0,  28825,     68, }, /* 826 */
+  {    69,      6,     12,      0,      0,  18525,     94, }, /* 827 */
+  {    21,      6,     12,      0,      0,  18432,    136, }, /* 828 */
+  {    22,      7,     12,      0,      0,  18432,     82, }, /* 829 */
+  {    18,      7,     12,      0,      0,  18432,     82, }, /* 830 */
+  {    18,      7,     12,      0,      0,  18432,    170, }, /* 831 */
+  {    69,     26,     12,      0,      0,  18447,     68, }, /* 832 */
+  {    69,     15,     12,      0,      0,  18447,     68, }, /* 833 */
+  {    18,     26,     12,      0,      0,  18432,     68, }, /* 834 */
+  {    18,     26,     12,      0,      0,  28672,     68, }, /* 835 */
+  {    69,     15,     12,      0,      0,  18432,     68, }, /* 836 */
+  {    69,     26,     14,      0,      0,  18447,    236, }, /* 837 */
+  {    21,     26,     12,      0,      0,  18432,     68, }, /* 838 */
+  {    23,      7,     12,      0,      0,  18432,    292, }, /* 839 */
+  {    24,      7,     12,      0,      0,  18432,     82, }, /* 840 */
+  {    24,      6,     12,      0,      0,  18432,    136, }, /* 841 */
+  {    24,     26,     12,      0,      0,  28672,     68, }, /* 842 */
+  {   111,      7,     12,      0,      0,  18432,     82, }, /* 843 */
+  {   111,      6,     12,      0,      0,  18432,    142, }, /* 844 */
+  {   111,     21,     12,      0,      0,  18432,    106, }, /* 845 */
+  {   111,     21,     12,      0,      0,  18432,    124, }, /* 846 */
+  {    99,      7,     12,      0,      0,  18432,     82, }, /* 847 */
+  {    99,      6,     12,      0,      0,  18432,    136, }, /* 848 */
+  {    99,     21,     12,      0,      0,  28672,    106, }, /* 849 */
+  {    99,     21,     12,      0,      0,  28672,    124, }, /* 850 */
+  {    99,     13,     12,      0,      0,  18432,    138, }, /* 851 */
+  {     2,      9,     12,    108,      1,  18432,     74, }, /* 852 */
+  {     2,      5,     12,    108, -35267,  18432,     76, }, /* 853 */
+  {     2,      7,     12,      0,      0,  18432,     82, }, /* 854 */
+  {     2,     21,     12,      0,      0,  28672,     68, }, /* 855 */
+  {     2,     12,      3,      0,      0,  26624,     96, }, /* 856 */
+  {     2,      6,     12,      0,      0,  28672,     92, }, /* 857 */
+  {     2,      6,     12,      0,      0,  18432,     88, }, /* 858 */
+  {   112,      7,     12,      0,      0,  18432,     82, }, /* 859 */
+  {   112,     14,     12,      0,      0,  18432,     82, }, /* 860 */
+  {   112,     12,      3,      0,      0,  26624,     96, }, /* 861 */
+  {   112,     21,     12,      0,      0,  18432,     68, }, /* 862 */
+  {   112,     21,     12,      0,      0,  18432,    124, }, /* 863 */
+  {   112,     21,     12,      0,      0,  18432,    106, }, /* 864 */
+  {    69,     24,     12,      0,      0,  28762,     56, }, /* 865 */
+  {     0,      9,     12,      0, -35332,  18432,     74, }, /* 866 */
+  {    69,     24,     12,      0,      0,  18432,     56, }, /* 867 */
+  {     0,      9,     12,      0, -42280,  18432,     74, }, /* 868 */
+  {     0,      5,     12,      0,     48,  18432,     76, }, /* 869 */
+  {     0,      9,     12,      0, -42308,  18432,     74, }, /* 870 */
+  {     0,      9,     12,      0, -42319,  18432,     74, }, /* 871 */
+  {     0,      9,     12,      0, -42315,  18432,     74, }, /* 872 */
+  {     0,      9,     12,      0, -42305,  18432,     74, }, /* 873 */
+  {     0,      9,     12,      0, -42258,  18432,     74, }, /* 874 */
+  {     0,      9,     12,      0, -42282,  18432,     74, }, /* 875 */
+  {     0,      9,     12,      0, -42261,  18432,     74, }, /* 876 */
+  {     0,      9,     12,      0,    928,  18432,     74, }, /* 877 */
+  {     0,      9,     12,      0,    -48,  18432,     74, }, /* 878 */
+  {     0,      9,     12,      0, -42307,  18432,     74, }, /* 879 */
+  {     0,      9,     12,      0, -35384,  18432,     74, }, /* 880 */
   {    36,      7,     12,      0,      0,  18432,     82, }, /* 881 */
   {    36,     12,      3,      0,      0,  26624,    130, }, /* 882 */
-  {    36,     12,      3,      0,      0,  26624,    182, }, /* 883 */
+  {    36,     12,      3,      0,      0,  26624,    184, }, /* 883 */
   {    36,     10,      5,      0,      0,  18432,    144, }, /* 884 */
   {    36,     26,     12,      0,      0,  28672,     68, }, /* 885 */
   {    69,     15,     12,      0,      0,  18612,     68, }, /* 886 */
@@ -1331,18 +1331,18 @@ const ucd_record PRIV(ucd_records)[] = {
   {    39,      7,     12,      0,      0,  18432,     82, }, /* 903 */
   {    39,     12,      3,      0,      0,  26624,    130, }, /* 904 */
   {    39,     12,      3,      0,      0,  26624,     96, }, /* 905 */
-  {    69,     21,     12,      0,      0,  18567,    188, }, /* 906 */
+  {    69,     21,     12,      0,      0,  18567,    190, }, /* 906 */
   {    39,     21,     12,      0,      0,  18432,    124, }, /* 907 */
   {   101,      7,     12,      0,      0,  18432,     82, }, /* 908 */
   {   101,     12,      3,      0,      0,  26624,    130, }, /* 909 */
   {   101,     10,      5,      0,      0,  18432,    144, }, /* 910 */
-  {   101,     10,      5,      0,      0,  18432,    172, }, /* 911 */
+  {   101,     10,      5,      0,      0,  18432,    174, }, /* 911 */
   {   101,     21,     12,      0,      0,  18432,     68, }, /* 912 */
   {    40,     12,      3,      0,      0,  26624,    130, }, /* 913 */
   {    40,     10,      5,      0,      0,  18432,    144, }, /* 914 */
   {    40,      7,     12,      0,      0,  18432,     82, }, /* 915 */
   {    40,     12,      3,      0,      0,  26624,     96, }, /* 916 */
-  {    40,     10,      5,      0,      0,  18432,    172, }, /* 917 */
+  {    40,     10,      5,      0,      0,  18432,    174, }, /* 917 */
   {    40,     21,     12,      0,      0,  18432,     68, }, /* 918 */
   {    40,     21,     12,      0,      0,  18432,    106, }, /* 919 */
   {    40,     21,     12,      0,      0,  18432,    124, }, /* 920 */
@@ -1370,470 +1370,484 @@ const ucd_record PRIV(ucd_records)[] = {
   {   113,      6,     12,      0,      0,  18432,    136, }, /* 942 */
   {   113,     12,      3,      0,      0,  26624,    146, }, /* 943 */
   {     0,      5,     12,      0,   -928,  18432,     76, }, /* 944 */
-  {     0,      6,     12,      0,      0,  18432,     92, }, /* 945 */
-  {    76,      5,     12,      0, -38864,  18432,     70, }, /* 946 */
-  {   113,     10,      5,      0,      0,  18432,    160, }, /* 947 */
-  {   113,     13,     12,      0,      0,  18432,    138, }, /* 948 */
-  {    18,      7,      9,      0,      0,  18432,     82, }, /* 949 */
-  {    18,      7,     10,      0,      0,  18432,     82, }, /* 950 */
-  {    68,      4,     12,      0,      0,  18432,      0, }, /* 951 */
-  {    68,      3,     12,      0,      0,  18432,      0, }, /* 952 */
-  {    23,      7,     12,      0,      0,  18432,    284, }, /* 953 */
-  {    71,     25,     12,      0,      0,  12288,    118, }, /* 954 */
-  {     3,      7,     12,      0,      0,      0,    296, }, /* 955 */
-  {    69,     18,     12,      0,      0,  28705,     54, }, /* 956 */
-  {    69,     22,     12,      0,      0,  28705,     54, }, /* 957 */
-  {    68,      2,     12,      0,      0,   6144,    298, }, /* 958 */
-  {     3,      7,     12,      0,      0,     39,     82, }, /* 959 */
-  {     3,     26,     12,      0,      0,  28711,     68, }, /* 960 */
-  {    84,     12,      3,      0,      0,  26624,    178, }, /* 961 */
-  {    84,     12,      3,      0,      0,  26624,    300, }, /* 962 */
-  {    69,     21,     12,      0,      0,  28672,     68, }, /* 963 */
-  {    69,     21,     12,      0,      0,  28672,    122, }, /* 964 */
-  {    69,     22,     12,      0,      0,  28672,     68, }, /* 965 */
-  {    69,     18,     12,      0,      0,  28672,     68, }, /* 966 */
-  {    69,     17,     12,      0,      0,  28672,    126, }, /* 967 */
-  {    69,     22,     12,      0,      0,  28672,    302, }, /* 968 */
-  {    69,     18,     12,      0,      0,  28672,    302, }, /* 969 */
-  {    69,     21,     12,      0,      0,   8192,    106, }, /* 970 */
-  {    69,     21,     12,      0,      0,   8192,    304, }, /* 971 */
-  {    69,     21,     12,      0,      0,   8192,    306, }, /* 972 */
-  {    69,     21,     12,      0,      0,  28672,    124, }, /* 973 */
-  {    69,     22,     12,      0,      0,  28672,    158, }, /* 974 */
-  {    69,     18,     12,      0,      0,  28672,    158, }, /* 975 */
-  {    69,     21,     12,      0,      0,  14336,     68, }, /* 976 */
-  {    69,     21,     12,      0,      0,  28672,    118, }, /* 977 */
-  {    69,     17,     12,      0,      0,  12288,    224, }, /* 978 */
-  {    69,     25,     12,      0,      0,  28672,    226, }, /* 979 */
-  {    69,     21,     12,      0,      0,  28672,    302, }, /* 980 */
-  {    69,     21,     12,      0,      0,  28672,    308, }, /* 981 */
-  {    69,     17,     12,      0,      0,  12288,    126, }, /* 982 */
-  {    69,     21,     12,      0,      0,   8192,     68, }, /* 983 */
-  {    69,     13,     12,      0,      0,  10240,    310, }, /* 984 */
-  {     0,      9,     12,      0,     32,  18432,    312, }, /* 985 */
-  {    69,     24,     12,      0,      0,  28672,    314, }, /* 986 */
-  {     0,      5,     12,      0,    -32,  18432,    316, }, /* 987 */
-  {    69,     21,     12,      0,      0,  28825,    124, }, /* 988 */
-  {    69,     22,     12,      0,      0,  28825,    318, }, /* 989 */
-  {    69,     18,     12,      0,      0,  28825,    318, }, /* 990 */
-  {    69,     21,     12,      0,      0,  28825,    106, }, /* 991 */
-  {    69,      6,      3,      0,      0,  18525,    320, }, /* 992 */
-  {    69,      1,      2,      0,      0,  28672,    322, }, /* 993 */
-  {    31,      7,     12,      0,      0,  18432,     82, }, /* 994 */
-  {    69,     21,     12,      0,      0,  18552,     68, }, /* 995 */
-  {    69,     21,     12,      0,      0,  28792,     68, }, /* 996 */
-  {    69,     21,     12,      0,      0,  18483,     68, }, /* 997 */
-  {    69,     15,     12,      0,      0,  18555,     68, }, /* 998 */
-  {    69,     26,     12,      0,      0,  18483,     68, }, /* 999 */
-  {     1,     14,     12,      0,      0,  28672,     82, }, /* 1000 */
-  {     1,     15,     12,      0,      0,  28672,     68, }, /* 1001 */
-  {     1,     26,     12,      0,      0,  28672,     68, }, /* 1002 */
-  {     1,     26,     12,      0,      0,  18432,     68, }, /* 1003 */
-  {   102,      7,     12,      0,      0,  18432,     82, }, /* 1004 */
-  {   103,      7,     12,      0,      0,  18432,     82, }, /* 1005 */
-  {    84,     12,      3,      0,      0,  26651,     96, }, /* 1006 */
-  {    69,     15,     12,      0,      0,  10267,     68, }, /* 1007 */
-  {    81,      7,     12,      0,      0,  18432,     82, }, /* 1008 */
-  {    81,     15,     12,      0,      0,  18432,     68, }, /* 1009 */
-  {    82,      7,     12,      0,      0,  18432,     82, }, /* 1010 */
-  {    82,     14,     12,      0,      0,  18432,     82, }, /* 1011 */
-  {    53,      7,     12,      0,      0,  18432,     82, }, /* 1012 */
-  {    53,     12,      3,      0,      0,  26624,    130, }, /* 1013 */
-  {    85,      7,     12,      0,      0,  18432,     82, }, /* 1014 */
-  {    85,     21,     12,      0,      0,  18432,    106, }, /* 1015 */
-  {    91,      7,     12,      0,      0,  18432,     82, }, /* 1016 */
-  {    91,     21,     12,      0,      0,  18432,    106, }, /* 1017 */
-  {    91,     14,     12,      0,      0,  18432,     82, }, /* 1018 */
-  {    83,      9,     12,      0,     40,  18432,     74, }, /* 1019 */
-  {    83,      5,     12,      0,    -40,  18432,     76, }, /* 1020 */
-  {    86,      7,     12,      0,      0,  18432,     82, }, /* 1021 */
-  {    87,      7,     12,      0,      0,  18432,     82, }, /* 1022 */
-  {    87,     13,     12,      0,      0,  18432,    138, }, /* 1023 */
-  {   145,      9,     12,      0,     40,  18432,     74, }, /* 1024 */
-  {   145,      5,     12,      0,    -40,  18432,     76, }, /* 1025 */
-  {   127,      7,     12,      0,      0,  18432,     82, }, /* 1026 */
-  {   125,      7,     12,      0,      0,  18432,     82, }, /* 1027 */
-  {   125,     21,     12,      0,      0,  18432,     68, }, /* 1028 */
-  {   161,      9,     12,      0,     39,  18432,     74, }, /* 1029 */
-  {   161,      5,     12,      0,    -39,  18432,     76, }, /* 1030 */
-  {    49,      7,     12,      0,      0,  18432,     82, }, /* 1031 */
-  {     0,      6,     12,      0,      0,  18432,     94, }, /* 1032 */
-  {    32,      7,     12,      0,      0,  34816,     82, }, /* 1033 */
-  {   114,      7,     12,      0,      0,  34816,     82, }, /* 1034 */
-  {   114,     21,     12,      0,      0,  34816,    106, }, /* 1035 */
-  {   114,     15,     12,      0,      0,  34816,     68, }, /* 1036 */
-  {   133,      7,     12,      0,      0,  34816,     82, }, /* 1037 */
-  {   133,     26,     12,      0,      0,  34816,     68, }, /* 1038 */
-  {   133,     15,     12,      0,      0,  34816,     68, }, /* 1039 */
-  {   132,      7,     12,      0,      0,  34816,     82, }, /* 1040 */
-  {   132,     15,     12,      0,      0,  34816,     68, }, /* 1041 */
-  {   139,      7,     12,      0,      0,  34816,     82, }, /* 1042 */
-  {   139,     15,     12,      0,      0,  34816,     68, }, /* 1043 */
-  {    95,      7,     12,      0,      0,  34816,     82, }, /* 1044 */
-  {    95,     15,     12,      0,      0,  34816,     68, }, /* 1045 */
-  {    95,     21,     12,      0,      0,  28672,    106, }, /* 1046 */
-  {   104,      7,     12,      0,      0,  34816,     82, }, /* 1047 */
-  {   104,     21,     12,      0,      0,  34816,     68, }, /* 1048 */
-  {   122,      7,     12,      0,      0,  34816,     82, }, /* 1049 */
-  {   121,      7,     12,      0,      0,  34816,     82, }, /* 1050 */
-  {   121,     15,     12,      0,      0,  34816,     68, }, /* 1051 */
-  {    92,      7,     12,      0,      0,  34816,     82, }, /* 1052 */
-  {    92,     12,      3,      0,      0,  26624,    130, }, /* 1053 */
-  {    92,     12,      3,      0,      0,  26624,    102, }, /* 1054 */
-  {    92,     12,      3,      0,      0,  26624,    182, }, /* 1055 */
-  {    92,     15,     12,      0,      0,  34816,     68, }, /* 1056 */
-  {    92,     21,     12,      0,      0,  34816,     68, }, /* 1057 */
-  {    92,     21,     12,      0,      0,  34816,    124, }, /* 1058 */
-  {   115,      7,     12,      0,      0,  34816,     82, }, /* 1059 */
-  {   115,     15,     12,      0,      0,  34816,     68, }, /* 1060 */
-  {   115,     21,     12,      0,      0,  34816,     68, }, /* 1061 */
-  {   131,      7,     12,      0,      0,  34816,     82, }, /* 1062 */
-  {   131,     15,     12,      0,      0,  34816,     68, }, /* 1063 */
-  {    51,      7,     12,      0,      0,  34816,     82, }, /* 1064 */
-  {    51,     26,     12,      0,      0,  34816,     68, }, /* 1065 */
-  {    51,     12,      3,      0,      0,  26624,     96, }, /* 1066 */
-  {    51,     15,     12,      0,      0,  34816,     68, }, /* 1067 */
-  {    51,     21,     12,      0,      0,  34816,    106, }, /* 1068 */
-  {    51,     21,     12,      0,      0,  34918,    106, }, /* 1069 */
-  {    51,     21,     12,      0,      0,  34816,     68, }, /* 1070 */
-  {   108,      7,     12,      0,      0,  34816,     82, }, /* 1071 */
-  {   108,     21,     12,      0,      0,  28672,     68, }, /* 1072 */
-  {   108,     21,     12,      0,      0,  28672,    106, }, /* 1073 */
-  {   116,      7,     12,      0,      0,  34816,     82, }, /* 1074 */
-  {   116,     15,     12,      0,      0,  34816,     68, }, /* 1075 */
-  {   117,      7,     12,      0,      0,  34816,     82, }, /* 1076 */
-  {   117,     15,     12,      0,      0,  34816,     68, }, /* 1077 */
-  {    54,      7,     12,      0,      0,  34816,     82, }, /* 1078 */
-  {    54,     21,     12,      0,      0,  34816,    106, }, /* 1079 */
-  {    54,     15,     12,      0,      0,  34816,     68, }, /* 1080 */
-  {   118,      7,     12,      0,      0,  34816,     82, }, /* 1081 */
-  {   140,      9,     12,      0,     64,  34816,     74, }, /* 1082 */
-  {   140,      5,     12,      0,    -64,  34816,     76, }, /* 1083 */
-  {   140,     15,     12,      0,      0,  34816,     68, }, /* 1084 */
-  {    62,      7,     12,      0,      0,      0,     82, }, /* 1085 */
-  {    62,      7,     12,      0,      0,      0,    294, }, /* 1086 */
-  {    62,     12,      3,      0,      0,  26624,    128, }, /* 1087 */
-  {    62,     13,     12,      0,      0,   2048,    138, }, /* 1088 */
-  {     3,     15,     12,      0,      0,   2048,     68, }, /* 1089 */
-  {    65,      7,     12,      0,      0,  34816,     82, }, /* 1090 */
-  {    65,     12,      3,      0,      0,  26624,    130, }, /* 1091 */
-  {    65,     17,     12,      0,      0,  34816,    126, }, /* 1092 */
-  {   152,      7,     12,      0,      0,  34816,     82, }, /* 1093 */
-  {   152,     15,     12,      0,      0,  34816,     68, }, /* 1094 */
-  {    63,      7,     12,      0,      0,      0,     82, }, /* 1095 */
-  {    63,     12,      3,      0,      0,  26624,     96, }, /* 1096 */
-  {    63,     15,     12,      0,      0,      0,     68, }, /* 1097 */
-  {    63,     21,     12,      0,      0,      0,    124, }, /* 1098 */
-  {    67,      7,     12,      0,      0,  34816,     82, }, /* 1099 */
-  {    67,     12,      3,      0,      0,  26624,     96, }, /* 1100 */
-  {    67,     21,     12,      0,      0,  34816,    124, }, /* 1101 */
-  {   156,      7,     12,      0,      0,  34816,     82, }, /* 1102 */
-  {   156,     15,     12,      0,      0,  34816,     68, }, /* 1103 */
-  {   153,      7,     12,      0,      0,  34816,     82, }, /* 1104 */
-  {   120,     10,      5,      0,      0,  18432,    144, }, /* 1105 */
-  {   120,     12,      3,      0,      0,  26624,    130, }, /* 1106 */
-  {   120,      7,     12,      0,      0,  18432,     82, }, /* 1107 */
-  {   120,     12,      3,      0,      0,  26624,    146, }, /* 1108 */
-  {   120,     21,     12,      0,      0,  18432,    124, }, /* 1109 */
-  {   120,     21,     12,      0,      0,  18432,    106, }, /* 1110 */
-  {   120,     15,     12,      0,      0,  28672,     68, }, /* 1111 */
-  {   120,     13,     12,      0,      0,  18432,    138, }, /* 1112 */
-  {   120,     12,      3,      0,      0,  26624,    182, }, /* 1113 */
-  {    41,     12,      3,      0,      0,  26624,    102, }, /* 1114 */
-  {    41,     10,      5,      0,      0,  18432,    144, }, /* 1115 */
-  {    41,      7,     12,      0,      0,  18432,     82, }, /* 1116 */
-  {    41,     12,      3,      0,      0,  26624,    130, }, /* 1117 */
-  {    41,     12,      3,      0,      0,  26624,    146, }, /* 1118 */
-  {    41,     12,      3,      0,      0,  26624,     96, }, /* 1119 */
-  {    41,     21,     12,      0,      0,  18432,     68, }, /* 1120 */
-  {    41,      1,      4,      0,      0,  18432,    132, }, /* 1121 */
-  {    41,     21,     12,      0,      0,  18432,    124, }, /* 1122 */
-  {   124,      7,     12,      0,      0,  18432,     82, }, /* 1123 */
-  {   124,     13,     12,      0,      0,  18432,    138, }, /* 1124 */
-  {    43,     12,      3,      0,      0,  26624,    130, }, /* 1125 */
-  {    43,      7,     12,      0,      0,  18432,     82, }, /* 1126 */
-  {    43,     10,      5,      0,      0,  18432,    144, }, /* 1127 */
-  {    43,     12,      3,      0,      0,  26624,    146, }, /* 1128 */
-  {    43,     13,     12,      0,      0,  18432,    138, }, /* 1129 */
-  {    43,     21,     12,      0,      0,  18432,     68, }, /* 1130 */
-  {    43,     21,     12,      0,      0,  18432,    124, }, /* 1131 */
-  {    50,      7,     12,      0,      0,  18432,     82, }, /* 1132 */
-  {    50,     12,      3,      0,      0,  26624,     96, }, /* 1133 */
-  {    50,     21,     12,      0,      0,  18432,     68, }, /* 1134 */
-  {    44,     12,      3,      0,      0,  26624,    130, }, /* 1135 */
-  {    44,     10,      5,      0,      0,  18432,    144, }, /* 1136 */
-  {    44,      7,     12,      0,      0,  18432,     82, }, /* 1137 */
-  {    44,     10,      5,      0,      0,  18432,    172, }, /* 1138 */
-  {    44,      7,      4,      0,      0,  18432,     82, }, /* 1139 */
-  {    44,     21,     12,      0,      0,  18432,    124, }, /* 1140 */
-  {    44,     21,     12,      0,      0,  18432,     68, }, /* 1141 */
-  {    44,     12,      3,      0,      0,  26624,    102, }, /* 1142 */
-  {    44,     12,      3,      0,      0,  26624,     96, }, /* 1143 */
-  {    44,     13,     12,      0,      0,  18432,    138, }, /* 1144 */
-  {    15,     15,     12,      0,      0,  18432,     68, }, /* 1145 */
-  {    48,      7,     12,      0,      0,  18432,     82, }, /* 1146 */
-  {    48,     10,      5,      0,      0,  18432,    144, }, /* 1147 */
-  {    48,     12,      3,      0,      0,  26624,    130, }, /* 1148 */
-  {    48,     10,      5,      0,      0,  18432,    172, }, /* 1149 */
-  {    48,     12,      3,      0,      0,  26624,     96, }, /* 1150 */
-  {    48,     21,     12,      0,      0,  18432,    124, }, /* 1151 */
-  {    48,     21,     12,      0,      0,  18432,    106, }, /* 1152 */
-  {    48,     21,     12,      0,      0,  18432,     68, }, /* 1153 */
-  {    57,      7,     12,      0,      0,  18432,     82, }, /* 1154 */
-  {    57,     21,     12,      0,      0,  18432,    124, }, /* 1155 */
-  {    55,      7,     12,      0,      0,  18432,     82, }, /* 1156 */
-  {    55,     12,      3,      0,      0,  26624,    130, }, /* 1157 */
-  {    55,     10,      5,      0,      0,  18432,    144, }, /* 1158 */
-  {    55,     12,      3,      0,      0,  26624,     96, }, /* 1159 */
-  {    55,     12,      3,      0,      0,  26624,    146, }, /* 1160 */
-  {    55,     13,     12,      0,      0,  18432,    138, }, /* 1161 */
-  {    47,     12,      3,      0,      0,  26624,    130, }, /* 1162 */
-  {    47,     12,      3,      0,      0,  26705,    130, }, /* 1163 */
-  {    47,     10,      5,      0,      0,  18432,    144, }, /* 1164 */
-  {    47,     10,      5,      0,      0,  18513,    144, }, /* 1165 */
-  {    47,      7,     12,      0,      0,  18432,     82, }, /* 1166 */
-  {    84,     12,      3,      0,      0,  26705,    102, }, /* 1167 */
-  {    47,     12,      3,      0,      0,  26705,     96, }, /* 1168 */
-  {    47,     10,      3,      0,      0,  18432,    148, }, /* 1169 */
-  {    47,     10,      5,      0,      0,  18432,    172, }, /* 1170 */
-  {    47,      7,     12,      0,      0,  18432,    324, }, /* 1171 */
-  {    47,     12,      3,      0,      0,  26624,     96, }, /* 1172 */
-  {   144,      7,     12,      0,      0,  18432,     82, }, /* 1173 */
-  {   144,     10,      5,      0,      0,  18432,    144, }, /* 1174 */
-  {   144,     12,      3,      0,      0,  26624,    130, }, /* 1175 */
-  {   144,     12,      3,      0,      0,  26624,    146, }, /* 1176 */
-  {   144,     12,      3,      0,      0,  26624,     96, }, /* 1177 */
-  {   144,     21,     12,      0,      0,  18432,    124, }, /* 1178 */
-  {   144,     21,     12,      0,      0,  18432,    106, }, /* 1179 */
-  {   144,     21,     12,      0,      0,  18432,     68, }, /* 1180 */
-  {   144,     13,     12,      0,      0,  18432,    138, }, /* 1181 */
-  {   144,     12,      3,      0,      0,  26624,    102, }, /* 1182 */
-  {    56,      7,     12,      0,      0,  18432,     82, }, /* 1183 */
-  {    56,     10,      3,      0,      0,  18432,    148, }, /* 1184 */
-  {    56,     10,      5,      0,      0,  18432,    144, }, /* 1185 */
-  {    56,     12,      3,      0,      0,  26624,    130, }, /* 1186 */
-  {    56,     12,      3,      0,      0,  26624,    146, }, /* 1187 */
-  {    56,     12,      3,      0,      0,  26624,     96, }, /* 1188 */
-  {    56,     21,     12,      0,      0,  18432,     68, }, /* 1189 */
-  {    56,     13,     12,      0,      0,  18432,    138, }, /* 1190 */
-  {   135,      7,     12,      0,      0,  18432,     82, }, /* 1191 */
-  {   135,     10,      3,      0,      0,  18432,    148, }, /* 1192 */
-  {   135,     10,      5,      0,      0,  18432,    144, }, /* 1193 */
-  {   135,     12,      3,      0,      0,  26624,    130, }, /* 1194 */
-  {   135,     12,      3,      0,      0,  26624,    146, }, /* 1195 */
-  {   135,     12,      3,      0,      0,  26624,     96, }, /* 1196 */
-  {   135,     21,     12,      0,      0,  18432,     68, }, /* 1197 */
-  {   135,     21,     12,      0,      0,  18432,    124, }, /* 1198 */
-  {   135,     21,     12,      0,      0,  18432,    106, }, /* 1199 */
-  {   135,     21,     12,      0,      0,  18432,    176, }, /* 1200 */
-  {    52,      7,     12,      0,      0,  18432,     82, }, /* 1201 */
-  {    52,     10,      5,      0,      0,  18432,    144, }, /* 1202 */
-  {    52,     12,      3,      0,      0,  26624,    130, }, /* 1203 */
-  {    52,     12,      3,      0,      0,  26624,    146, }, /* 1204 */
-  {    52,     21,     12,      0,      0,  18432,    124, }, /* 1205 */
-  {    52,     21,     12,      0,      0,  18432,     68, }, /* 1206 */
-  {    52,     13,     12,      0,      0,  18432,    138, }, /* 1207 */
-  {    45,      7,     12,      0,      0,  18432,     82, }, /* 1208 */
-  {    45,     12,      3,      0,      0,  26624,    130, }, /* 1209 */
-  {    45,     10,      5,      0,      0,  18432,    144, }, /* 1210 */
-  {    45,     10,      5,      0,      0,  18432,    172, }, /* 1211 */
-  {    45,     12,      3,      0,      0,  26624,     96, }, /* 1212 */
-  {    45,     21,     12,      0,      0,  18432,     68, }, /* 1213 */
-  {    45,     13,     12,      0,      0,  18432,    138, }, /* 1214 */
-  {   137,      7,     12,      0,      0,  18432,     82, }, /* 1215 */
-  {   137,     12,      3,      0,      0,  26624,    130, }, /* 1216 */
-  {   137,     10,     12,      0,      0,  18432,    144, }, /* 1217 */
-  {   137,     10,      5,      0,      0,  18432,    144, }, /* 1218 */
-  {   137,     12,      3,      0,      0,  26624,    146, }, /* 1219 */
-  {   137,     13,     12,      0,      0,  18432,    138, }, /* 1220 */
-  {   137,     15,     12,      0,      0,  18432,     68, }, /* 1221 */
-  {   137,     21,     12,      0,      0,  18432,    124, }, /* 1222 */
-  {   137,     26,     12,      0,      0,  18432,     68, }, /* 1223 */
-  {    60,      7,     12,      0,      0,  18432,     82, }, /* 1224 */
-  {    60,     10,      5,      0,      0,  18432,    144, }, /* 1225 */
-  {    60,     12,      3,      0,      0,  26624,    130, }, /* 1226 */
-  {    60,     12,      3,      0,      0,  26624,    146, }, /* 1227 */
-  {    60,     12,      3,      0,      0,  26624,     96, }, /* 1228 */
-  {    60,     21,     12,      0,      0,  18432,     68, }, /* 1229 */
-  {   136,      9,     12,      0,     32,  18432,     74, }, /* 1230 */
-  {   136,      5,     12,      0,    -32,  18432,     76, }, /* 1231 */
-  {   136,     13,     12,      0,      0,  18432,    138, }, /* 1232 */
-  {   136,     15,     12,      0,      0,  18432,     68, }, /* 1233 */
-  {   136,      7,     12,      0,      0,  18432,     82, }, /* 1234 */
-  {   157,      7,     12,      0,      0,  18432,     82, }, /* 1235 */
-  {   157,     10,      3,      0,      0,  18432,    148, }, /* 1236 */
-  {   157,     10,      5,      0,      0,  18432,    144, }, /* 1237 */
-  {   157,     12,      3,      0,      0,  26624,    130, }, /* 1238 */
-  {   157,     10,      5,      0,      0,  18432,    172, }, /* 1239 */
-  {   157,     12,      3,      0,      0,  26624,    146, }, /* 1240 */
-  {   157,      7,      4,      0,      0,  18432,     82, }, /* 1241 */
-  {   157,     12,      3,      0,      0,  26624,     96, }, /* 1242 */
-  {   157,     21,     12,      0,      0,  18432,    124, }, /* 1243 */
-  {   157,     21,     12,      0,      0,  18432,     68, }, /* 1244 */
-  {   157,     13,     12,      0,      0,  18432,    138, }, /* 1245 */
-  {    64,      7,     12,      0,      0,  18432,     82, }, /* 1246 */
-  {    64,     10,      5,      0,      0,  18432,    144, }, /* 1247 */
-  {    64,     12,      3,      0,      0,  26624,    130, }, /* 1248 */
-  {    64,     12,      3,      0,      0,  26624,    146, }, /* 1249 */
-  {    64,     21,     12,      0,      0,  18432,     68, }, /* 1250 */
-  {   149,      7,     12,      0,      0,  18432,     82, }, /* 1251 */
-  {   149,     12,      3,      0,      0,  26624,    130, }, /* 1252 */
-  {   149,     12,      3,      0,      0,  18432,    130, }, /* 1253 */
-  {   149,     12,      3,      0,      0,  26624,    102, }, /* 1254 */
-  {   149,     12,      3,      0,      0,  26624,    146, }, /* 1255 */
-  {   149,     10,      5,      0,      0,  18432,    144, }, /* 1256 */
-  {   149,      7,      4,      0,      0,  18432,     82, }, /* 1257 */
-  {   149,     21,     12,      0,      0,  18432,     68, }, /* 1258 */
-  {   149,     21,     12,      0,      0,  18432,    124, }, /* 1259 */
-  {   148,      7,     12,      0,      0,  18432,     82, }, /* 1260 */
-  {   148,     12,      3,      0,      0,  26624,    130, }, /* 1261 */
-  {   148,     10,      5,      0,      0,  18432,    144, }, /* 1262 */
-  {   148,      7,      4,      0,      0,  18432,     82, }, /* 1263 */
-  {   148,     12,      3,      0,      0,  26624,    326, }, /* 1264 */
-  {   148,     12,      3,      0,      0,  26624,    146, }, /* 1265 */
-  {   148,     21,     12,      0,      0,  18432,     68, }, /* 1266 */
-  {   148,     21,     12,      0,      0,  18432,    124, }, /* 1267 */
-  {   148,     21,     12,      0,      0,  18432,    106, }, /* 1268 */
-  {   134,      7,     12,      0,      0,  18432,     82, }, /* 1269 */
-  {   142,      7,     12,      0,      0,  18432,     82, }, /* 1270 */
-  {   142,     10,      5,      0,      0,  18432,    144, }, /* 1271 */
-  {   142,     12,      3,      0,      0,  26624,    130, }, /* 1272 */
-  {   142,     12,      3,      0,      0,  18432,    146, }, /* 1273 */
-  {   142,     21,     12,      0,      0,  18432,    124, }, /* 1274 */
-  {   142,     21,     12,      0,      0,  18432,    106, }, /* 1275 */
-  {   142,     21,     12,      0,      0,  18432,     68, }, /* 1276 */
-  {   142,     13,     12,      0,      0,  18432,    138, }, /* 1277 */
-  {   142,     15,     12,      0,      0,  18432,     68, }, /* 1278 */
-  {   143,     21,     12,      0,      0,  18432,     68, }, /* 1279 */
-  {   143,     21,     12,      0,      0,  18432,    106, }, /* 1280 */
-  {   143,      7,     12,      0,      0,  18432,     82, }, /* 1281 */
-  {   143,     12,      3,      0,      0,  26624,    130, }, /* 1282 */
-  {   143,     10,      5,      0,      0,  18432,    144, }, /* 1283 */
-  {    59,      7,     12,      0,      0,  18432,     82, }, /* 1284 */
-  {    59,     12,      3,      0,      0,  26624,    130, }, /* 1285 */
-  {    59,     12,      3,      0,      0,  26624,     96, }, /* 1286 */
-  {    59,     12,      3,      0,      0,  26624,    146, }, /* 1287 */
-  {    59,      7,      4,      0,      0,  18432,     82, }, /* 1288 */
-  {    59,     13,     12,      0,      0,  18432,    138, }, /* 1289 */
-  {    61,      7,     12,      0,      0,  18432,     82, }, /* 1290 */
-  {    61,     10,      5,      0,      0,  18432,    144, }, /* 1291 */
-  {    61,     12,      3,      0,      0,  26624,    130, }, /* 1292 */
-  {    61,     12,      3,      0,      0,  26624,    146, }, /* 1293 */
-  {    61,     13,     12,      0,      0,  18432,    138, }, /* 1294 */
-  {   150,      7,     12,      0,      0,  18432,     82, }, /* 1295 */
-  {   150,     12,      3,      0,      0,  26624,    130, }, /* 1296 */
-  {   150,     10,      5,      0,      0,  18432,    144, }, /* 1297 */
-  {   150,     21,     12,      0,      0,  18432,    124, }, /* 1298 */
-  {    11,     15,     12,      0,      0,  18432,     68, }, /* 1299 */
-  {    11,     21,     12,      0,      0,  18432,     68, }, /* 1300 */
-  {    94,      7,     12,      0,      0,  18432,     82, }, /* 1301 */
-  {    94,     14,     12,      0,      0,  18432,     82, }, /* 1302 */
-  {    94,     21,     12,      0,      0,  18432,    106, }, /* 1303 */
-  {    66,      7,     12,      0,      0,  18432,     82, }, /* 1304 */
-  {    66,     21,     12,      0,      0,  18432,     68, }, /* 1305 */
-  {   109,      7,     12,      0,      0,  18432,     82, }, /* 1306 */
-  {   109,      1,      2,      0,      0,  18432,    322, }, /* 1307 */
-  {   138,      7,     12,      0,      0,  18432,     82, }, /* 1308 */
-  {   130,      7,     12,      0,      0,  18432,     82, }, /* 1309 */
-  {   130,     13,     12,      0,      0,  18432,    138, }, /* 1310 */
-  {   130,     21,     12,      0,      0,  18432,    124, }, /* 1311 */
-  {   159,      7,     12,      0,      0,  18432,     82, }, /* 1312 */
-  {   159,     13,     12,      0,      0,  18432,    138, }, /* 1313 */
-  {   126,      7,     12,      0,      0,  18432,     82, }, /* 1314 */
-  {   126,     12,      3,      0,      0,  26624,     96, }, /* 1315 */
-  {   126,     21,     12,      0,      0,  18432,    124, }, /* 1316 */
-  {   128,      7,     12,      0,      0,  18432,     82, }, /* 1317 */
-  {   128,     12,      3,      0,      0,  26624,     96, }, /* 1318 */
-  {   128,     21,     12,      0,      0,  18432,    124, }, /* 1319 */
-  {   128,     21,     12,      0,      0,  18432,    106, }, /* 1320 */
-  {   128,     21,     12,      0,      0,  18432,     68, }, /* 1321 */
-  {   128,     26,     12,      0,      0,  18432,     68, }, /* 1322 */
-  {   128,      6,     12,      0,      0,  18432,    142, }, /* 1323 */
-  {   128,      6,     12,      0,      0,  18432,    136, }, /* 1324 */
-  {   128,     13,     12,      0,      0,  18432,    138, }, /* 1325 */
-  {   128,     15,     12,      0,      0,  18432,     68, }, /* 1326 */
-  {   151,      9,     12,      0,     32,  18432,     74, }, /* 1327 */
-  {   151,      5,     12,      0,    -32,  18432,     76, }, /* 1328 */
-  {   151,     15,     12,      0,      0,  18432,     68, }, /* 1329 */
-  {   151,     21,     12,      0,      0,  18432,    106, }, /* 1330 */
-  {   151,     21,     12,      0,      0,  18432,    124, }, /* 1331 */
-  {   151,     21,     12,      0,      0,  18432,     68, }, /* 1332 */
-  {   123,      7,     12,      0,      0,  18432,     82, }, /* 1333 */
-  {   123,     12,      3,      0,      0,  26624,    130, }, /* 1334 */
-  {   123,     10,      5,      0,      0,  18432,    144, }, /* 1335 */
-  {   123,     12,      3,      0,      0,  26624,    128, }, /* 1336 */
-  {   123,      6,     12,      0,      0,  18432,     92, }, /* 1337 */
-  {   146,      6,     12,      0,      0,  18432,    136, }, /* 1338 */
-  {   147,      6,     12,      0,      0,  18432,    136, }, /* 1339 */
-  {    23,     21,     12,      0,      0,  28672,     68, }, /* 1340 */
-  {   158,     12,      3,      0,      0,  26624,    328, }, /* 1341 */
-  {    23,     10,      5,      0,      0,  18432,    164, }, /* 1342 */
-  {   146,      7,     12,      0,      0,  18432,    284, }, /* 1343 */
-  {   158,      7,     12,      0,      0,  18432,    284, }, /* 1344 */
-  {    21,      6,     12,      0,      0,  18432,     92, }, /* 1345 */
-  {   147,      7,     12,      0,      0,  18432,    284, }, /* 1346 */
-  {    46,      7,     12,      0,      0,  18432,     82, }, /* 1347 */
-  {    46,     26,     12,      0,      0,  18432,     68, }, /* 1348 */
-  {    46,     12,      3,      0,      0,  26624,    102, }, /* 1349 */
-  {    46,     12,      3,      0,      0,  26624,    130, }, /* 1350 */
-  {    46,     21,     12,      0,      0,  18432,    124, }, /* 1351 */
-  {    69,      1,      2,      0,      0,   6153,     66, }, /* 1352 */
-  {    69,     10,      3,      0,      0,  18432,    330, }, /* 1353 */
-  {    69,     10,      5,      0,      0,  18432,    138, }, /* 1354 */
-  {    69,     10,      5,      0,      0,  18432,    160, }, /* 1355 */
-  {    69,     10,      3,      0,      0,  18432,    286, }, /* 1356 */
-  {     1,     12,      3,      0,      0,  26624,    102, }, /* 1357 */
-  {    69,     25,     12,      0,      0,  18432,    118, }, /* 1358 */
-  {    69,     13,     12,      0,      0,  10240,    214, }, /* 1359 */
-  {   141,     26,     12,      0,      0,  18432,     68, }, /* 1360 */
-  {   141,     12,      3,      0,      0,  26624,    102, }, /* 1361 */
-  {   141,     21,     12,      0,      0,  18432,    106, }, /* 1362 */
-  {   141,     21,     12,      0,      0,  18432,    124, }, /* 1363 */
-  {   141,     21,     12,      0,      0,  18432,     68, }, /* 1364 */
-  {    35,     12,      3,      0,      0,  26624,    130, }, /* 1365 */
-  {   154,      7,     12,      0,      0,  18432,     82, }, /* 1366 */
-  {   154,     12,      3,      0,      0,  26624,     96, }, /* 1367 */
-  {   154,      6,     12,      0,      0,  18432,    142, }, /* 1368 */
-  {   154,      6,     12,      0,      0,  18432,    136, }, /* 1369 */
-  {   154,     13,     12,      0,      0,  18432,    138, }, /* 1370 */
-  {   154,     26,     12,      0,      0,  18432,     68, }, /* 1371 */
-  {   160,      7,     12,      0,      0,  18432,     82, }, /* 1372 */
-  {   160,     12,      3,      0,      0,  26624,     96, }, /* 1373 */
-  {   155,      7,     12,      0,      0,  18432,     82, }, /* 1374 */
-  {   155,     12,      3,      0,      0,  26624,     96, }, /* 1375 */
-  {   155,     13,     12,      0,      0,  18432,    138, }, /* 1376 */
-  {   155,     23,     12,      0,      0,  14336,     68, }, /* 1377 */
-  {   129,      7,     12,      0,      0,  34816,     82, }, /* 1378 */
-  {   129,     15,     12,      0,      0,  34816,     68, }, /* 1379 */
-  {   129,     12,      3,      0,      0,  26624,     96, }, /* 1380 */
-  {    58,      9,     12,      0,     34,  34816,     74, }, /* 1381 */
-  {    58,      5,     12,      0,    -34,  34816,     76, }, /* 1382 */
-  {    58,     12,      3,      0,      0,  26624,    150, }, /* 1383 */
-  {    58,     12,      3,      0,      0,  26624,    130, }, /* 1384 */
-  {    58,     12,      3,      0,      0,  26624,     96, }, /* 1385 */
-  {    58,      6,     12,      0,      0,  34816,    142, }, /* 1386 */
-  {    58,     13,     12,      0,      0,  34816,    138, }, /* 1387 */
-  {    58,     21,     12,      0,      0,  34816,     68, }, /* 1388 */
-  {    69,     15,     12,      0,      0,      0,     68, }, /* 1389 */
-  {    69,     26,     12,      0,      0,      0,     68, }, /* 1390 */
-  {    69,     23,     12,      0,      0,      0,     68, }, /* 1391 */
-  {     3,      7,     12,      0,      0,      0,    240, }, /* 1392 */
-  {    69,     26,     14,      0,      0,  28672,    332, }, /* 1393 */
-  {    69,     26,     14,      0,      0,  28672,    334, }, /* 1394 */
-  {    68,      2,     14,      0,      0,  18432,    336, }, /* 1395 */
-  {    69,     26,     12,      0,      0,  18432,    338, }, /* 1396 */
-  {    69,     26,     14,      0,      0,  18432,    340, }, /* 1397 */
-  {    69,     26,     14,      0,      0,  18432,    334, }, /* 1398 */
-  {    69,     26,     11,      0,      0,  18432,    342, }, /* 1399 */
-  {    20,     26,     12,      0,      0,  18432,     68, }, /* 1400 */
-  {    69,     26,     14,      0,      0,  18432,    236, }, /* 1401 */
-  {    69,     26,     14,      0,      0,  18447,    334, }, /* 1402 */
-  {    69,     26,     14,      0,      0,  28672,    344, }, /* 1403 */
-  {    69,     26,     14,      0,      0,  28672,    346, }, /* 1404 */
-  {    69,     24,      3,      0,      0,  28672,    348, }, /* 1405 */
-  {    69,     26,     14,      0,      0,  28672,    350, }, /* 1406 */
-  {    69,     13,     12,      0,      0,  10240,    138, }, /* 1407 */
-  {    69,      1,      3,      0,      0,   6144,    352, }, /* 1408 */
+  {    76,      5,     12,      0, -38864,  18432,     70, }, /* 945 */
+  {   113,     10,      5,      0,      0,  18432,    160, }, /* 946 */
+  {   113,     13,     12,      0,      0,  18432,    138, }, /* 947 */
+  {    18,      7,      9,      0,      0,  18432,     82, }, /* 948 */
+  {    18,      7,     10,      0,      0,  18432,     82, }, /* 949 */
+  {    68,      4,     12,      0,      0,  18432,      0, }, /* 950 */
+  {    68,      3,     12,      0,      0,  18432,      0, }, /* 951 */
+  {    23,      7,     12,      0,      0,  18432,    284, }, /* 952 */
+  {    71,     25,     12,      0,      0,  12288,    118, }, /* 953 */
+  {     3,      7,     12,      0,      0,      0,    296, }, /* 954 */
+  {    69,     18,     12,      0,      0,  28705,     54, }, /* 955 */
+  {    69,     22,     12,      0,      0,  28705,     54, }, /* 956 */
+  {    68,      2,     12,      0,      0,   6144,    298, }, /* 957 */
+  {     3,      7,     12,      0,      0,     39,     82, }, /* 958 */
+  {     3,     26,     12,      0,      0,  28711,     68, }, /* 959 */
+  {    84,     12,      3,      0,      0,  26624,    180, }, /* 960 */
+  {    84,     12,      3,      0,      0,  26624,    300, }, /* 961 */
+  {    69,     21,     12,      0,      0,  28672,     68, }, /* 962 */
+  {    69,     21,     12,      0,      0,  28672,    122, }, /* 963 */
+  {    69,     22,     12,      0,      0,  28672,     68, }, /* 964 */
+  {    69,     18,     12,      0,      0,  28672,     68, }, /* 965 */
+  {    69,     17,     12,      0,      0,  28672,    126, }, /* 966 */
+  {    69,     22,     12,      0,      0,  28672,    302, }, /* 967 */
+  {    69,     18,     12,      0,      0,  28672,    302, }, /* 968 */
+  {    69,     21,     12,      0,      0,   8192,    106, }, /* 969 */
+  {    69,     21,     12,      0,      0,   8192,    304, }, /* 970 */
+  {    69,     21,     12,      0,      0,   8192,    306, }, /* 971 */
+  {    69,     21,     12,      0,      0,  28672,    124, }, /* 972 */
+  {    69,     22,     12,      0,      0,  28672,    158, }, /* 973 */
+  {    69,     18,     12,      0,      0,  28672,    158, }, /* 974 */
+  {    69,     21,     12,      0,      0,  14336,     68, }, /* 975 */
+  {    69,     21,     12,      0,      0,  28672,    118, }, /* 976 */
+  {    69,     17,     12,      0,      0,  12288,    224, }, /* 977 */
+  {    69,     25,     12,      0,      0,  28672,    226, }, /* 978 */
+  {    69,     21,     12,      0,      0,  28672,    302, }, /* 979 */
+  {    69,     21,     12,      0,      0,  28672,    308, }, /* 980 */
+  {    69,     17,     12,      0,      0,  12288,    126, }, /* 981 */
+  {    69,     21,     12,      0,      0,   8192,     68, }, /* 982 */
+  {    69,     13,     12,      0,      0,  10240,    310, }, /* 983 */
+  {     0,      9,     12,      0,     32,  18432,    312, }, /* 984 */
+  {    69,     24,     12,      0,      0,  28672,    314, }, /* 985 */
+  {     0,      5,     12,      0,    -32,  18432,    316, }, /* 986 */
+  {    69,     21,     12,      0,      0,  28825,    124, }, /* 987 */
+  {    69,     22,     12,      0,      0,  28825,    318, }, /* 988 */
+  {    69,     18,     12,      0,      0,  28825,    318, }, /* 989 */
+  {    69,     21,     12,      0,      0,  28825,    106, }, /* 990 */
+  {    69,      6,      3,      0,      0,  18525,    320, }, /* 991 */
+  {    69,      1,      2,      0,      0,  28672,    322, }, /* 992 */
+  {    31,      7,     12,      0,      0,  18432,     82, }, /* 993 */
+  {    69,     21,     12,      0,      0,  18552,     68, }, /* 994 */
+  {    69,     21,     12,      0,      0,  28792,     68, }, /* 995 */
+  {    69,     21,     12,      0,      0,  18483,     68, }, /* 996 */
+  {    69,     15,     12,      0,      0,  18555,     68, }, /* 997 */
+  {    69,     26,     12,      0,      0,  18483,     68, }, /* 998 */
+  {     1,     14,     12,      0,      0,  28672,     82, }, /* 999 */
+  {     1,     15,     12,      0,      0,  28672,     68, }, /* 1000 */
+  {     1,     26,     12,      0,      0,  28672,     68, }, /* 1001 */
+  {     1,     26,     12,      0,      0,  18432,     68, }, /* 1002 */
+  {   102,      7,     12,      0,      0,  18432,     82, }, /* 1003 */
+  {   103,      7,     12,      0,      0,  18432,     82, }, /* 1004 */
+  {    84,     12,      3,      0,      0,  26651,     96, }, /* 1005 */
+  {    69,     15,     12,      0,      0,  10267,     68, }, /* 1006 */
+  {    81,      7,     12,      0,      0,  18432,     82, }, /* 1007 */
+  {    81,     15,     12,      0,      0,  18432,     68, }, /* 1008 */
+  {    82,      7,     12,      0,      0,  18432,     82, }, /* 1009 */
+  {    82,     14,     12,      0,      0,  18432,     82, }, /* 1010 */
+  {    53,      7,     12,      0,      0,  18432,     82, }, /* 1011 */
+  {    53,     12,      3,      0,      0,  26624,    130, }, /* 1012 */
+  {    85,      7,     12,      0,      0,  18432,     82, }, /* 1013 */
+  {    85,     21,     12,      0,      0,  18432,    106, }, /* 1014 */
+  {    91,      7,     12,      0,      0,  18432,     82, }, /* 1015 */
+  {    91,     21,     12,      0,      0,  18432,    106, }, /* 1016 */
+  {    91,     14,     12,      0,      0,  18432,     82, }, /* 1017 */
+  {    83,      9,     12,      0,     40,  18432,     74, }, /* 1018 */
+  {    83,      5,     12,      0,    -40,  18432,     76, }, /* 1019 */
+  {    86,      7,     12,      0,      0,  18432,     82, }, /* 1020 */
+  {    87,      7,     12,      0,      0,  18432,     82, }, /* 1021 */
+  {    87,     13,     12,      0,      0,  18432,    138, }, /* 1022 */
+  {   145,      9,     12,      0,     40,  18432,     74, }, /* 1023 */
+  {   145,      5,     12,      0,    -40,  18432,     76, }, /* 1024 */
+  {   127,      7,     12,      0,      0,  18432,     82, }, /* 1025 */
+  {   125,      7,     12,      0,      0,  18432,     82, }, /* 1026 */
+  {   125,     21,     12,      0,      0,  18432,     68, }, /* 1027 */
+  {   161,      9,     12,      0,     39,  18432,     74, }, /* 1028 */
+  {   161,      5,     12,      0,    -39,  18432,     76, }, /* 1029 */
+  {    49,      7,     12,      0,      0,  18432,     82, }, /* 1030 */
+  {     0,      6,     12,      0,      0,  18432,     94, }, /* 1031 */
+  {    32,      7,     12,      0,      0,  34816,     82, }, /* 1032 */
+  {   114,      7,     12,      0,      0,  34816,     82, }, /* 1033 */
+  {   114,     21,     12,      0,      0,  34816,    106, }, /* 1034 */
+  {   114,     15,     12,      0,      0,  34816,     68, }, /* 1035 */
+  {   133,      7,     12,      0,      0,  34816,     82, }, /* 1036 */
+  {   133,     26,     12,      0,      0,  34816,     68, }, /* 1037 */
+  {   133,     15,     12,      0,      0,  34816,     68, }, /* 1038 */
+  {   132,      7,     12,      0,      0,  34816,     82, }, /* 1039 */
+  {   132,     15,     12,      0,      0,  34816,     68, }, /* 1040 */
+  {   139,      7,     12,      0,      0,  34816,     82, }, /* 1041 */
+  {   139,     15,     12,      0,      0,  34816,     68, }, /* 1042 */
+  {    95,      7,     12,      0,      0,  34816,     82, }, /* 1043 */
+  {    95,     15,     12,      0,      0,  34816,     68, }, /* 1044 */
+  {    95,     21,     12,      0,      0,  28672,    106, }, /* 1045 */
+  {   104,      7,     12,      0,      0,  34816,     82, }, /* 1046 */
+  {   104,     21,     12,      0,      0,  34816,     68, }, /* 1047 */
+  {   122,      7,     12,      0,      0,  34816,     82, }, /* 1048 */
+  {   121,      7,     12,      0,      0,  34816,     82, }, /* 1049 */
+  {   121,     15,     12,      0,      0,  34816,     68, }, /* 1050 */
+  {    92,      7,     12,      0,      0,  34816,     82, }, /* 1051 */
+  {    92,     12,      3,      0,      0,  26624,    130, }, /* 1052 */
+  {    92,     12,      3,      0,      0,  26624,    102, }, /* 1053 */
+  {    92,     12,      3,      0,      0,  26624,    184, }, /* 1054 */
+  {    92,     15,     12,      0,      0,  34816,     68, }, /* 1055 */
+  {    92,     21,     12,      0,      0,  34816,     68, }, /* 1056 */
+  {    92,     21,     12,      0,      0,  34816,    124, }, /* 1057 */
+  {   115,      7,     12,      0,      0,  34816,     82, }, /* 1058 */
+  {   115,     15,     12,      0,      0,  34816,     68, }, /* 1059 */
+  {   115,     21,     12,      0,      0,  34816,     68, }, /* 1060 */
+  {   131,      7,     12,      0,      0,  34816,     82, }, /* 1061 */
+  {   131,     15,     12,      0,      0,  34816,     68, }, /* 1062 */
+  {    51,      7,     12,      0,      0,  34816,     82, }, /* 1063 */
+  {    51,     26,     12,      0,      0,  34816,     68, }, /* 1064 */
+  {    51,     12,      3,      0,      0,  26624,     96, }, /* 1065 */
+  {    51,     15,     12,      0,      0,  34816,     68, }, /* 1066 */
+  {    51,     21,     12,      0,      0,  34816,    106, }, /* 1067 */
+  {    51,     21,     12,      0,      0,  34918,    106, }, /* 1068 */
+  {    51,     21,     12,      0,      0,  34816,     68, }, /* 1069 */
+  {   108,      7,     12,      0,      0,  34816,     82, }, /* 1070 */
+  {   108,     21,     12,      0,      0,  28672,     68, }, /* 1071 */
+  {   108,     21,     12,      0,      0,  28672,    106, }, /* 1072 */
+  {   116,      7,     12,      0,      0,  34816,     82, }, /* 1073 */
+  {   116,     15,     12,      0,      0,  34816,     68, }, /* 1074 */
+  {   117,      7,     12,      0,      0,  34816,     82, }, /* 1075 */
+  {   117,     15,     12,      0,      0,  34816,     68, }, /* 1076 */
+  {    54,      7,     12,      0,      0,  34816,     82, }, /* 1077 */
+  {    54,     21,     12,      0,      0,  34816,    106, }, /* 1078 */
+  {    54,     15,     12,      0,      0,  34816,     68, }, /* 1079 */
+  {   118,      7,     12,      0,      0,  34816,     82, }, /* 1080 */
+  {   140,      9,     12,      0,     64,  34816,     74, }, /* 1081 */
+  {   140,      5,     12,      0,    -64,  34816,     76, }, /* 1082 */
+  {   140,     15,     12,      0,      0,  34816,     68, }, /* 1083 */
+  {    62,      7,     12,      0,      0,      0,     82, }, /* 1084 */
+  {    62,      7,     12,      0,      0,      0,    294, }, /* 1085 */
+  {    62,     12,      3,      0,      0,  26624,    128, }, /* 1086 */
+  {    62,     13,     12,      0,      0,   2048,    138, }, /* 1087 */
+  {     3,     15,     12,      0,      0,   2048,     68, }, /* 1088 */
+  {    65,      7,     12,      0,      0,  34816,     82, }, /* 1089 */
+  {    65,     12,      3,      0,      0,  26624,    130, }, /* 1090 */
+  {    65,     17,     12,      0,      0,  34816,    126, }, /* 1091 */
+  {   152,      7,     12,      0,      0,  34816,     82, }, /* 1092 */
+  {   152,     15,     12,      0,      0,  34816,     68, }, /* 1093 */
+  {    63,      7,     12,      0,      0,      0,     82, }, /* 1094 */
+  {    63,     12,      3,      0,      0,  26624,     96, }, /* 1095 */
+  {    63,     15,     12,      0,      0,      0,     68, }, /* 1096 */
+  {    63,     21,     12,      0,      0,      0,    124, }, /* 1097 */
+  {    67,      7,     12,      0,      0,  34816,     82, }, /* 1098 */
+  {    67,     12,      3,      0,      0,  26624,     96, }, /* 1099 */
+  {    67,     21,     12,      0,      0,  34816,    124, }, /* 1100 */
+  {   156,      7,     12,      0,      0,  34816,     82, }, /* 1101 */
+  {   156,     15,     12,      0,      0,  34816,     68, }, /* 1102 */
+  {   153,      7,     12,      0,      0,  34816,     82, }, /* 1103 */
+  {   120,     10,      5,      0,      0,  18432,    144, }, /* 1104 */
+  {   120,     12,      3,      0,      0,  26624,    130, }, /* 1105 */
+  {   120,      7,     12,      0,      0,  18432,     82, }, /* 1106 */
+  {   120,     12,      3,      0,      0,  26624,    146, }, /* 1107 */
+  {   120,     21,     12,      0,      0,  18432,    124, }, /* 1108 */
+  {   120,     21,     12,      0,      0,  18432,    106, }, /* 1109 */
+  {   120,     15,     12,      0,      0,  28672,     68, }, /* 1110 */
+  {   120,     13,     12,      0,      0,  18432,    138, }, /* 1111 */
+  {   120,     12,      3,      0,      0,  26624,    184, }, /* 1112 */
+  {    41,     12,      3,      0,      0,  26624,    130, }, /* 1113 */
+  {    41,     10,      5,      0,      0,  18432,    144, }, /* 1114 */
+  {    41,      7,     12,      0,      0,  18432,     82, }, /* 1115 */
+  {    41,     12,      3,      0,      0,  26624,    146, }, /* 1116 */
+  {    41,     12,      3,      0,      0,  26624,     96, }, /* 1117 */
+  {    41,     21,     12,      0,      0,  18432,     68, }, /* 1118 */
+  {    41,      1,      4,      0,      0,  18432,    132, }, /* 1119 */
+  {    41,     21,     12,      0,      0,  18432,    124, }, /* 1120 */
+  {   124,      7,     12,      0,      0,  18432,     82, }, /* 1121 */
+  {   124,     13,     12,      0,      0,  18432,    138, }, /* 1122 */
+  {    43,     12,      3,      0,      0,  26624,    130, }, /* 1123 */
+  {    43,      7,     12,      0,      0,  18432,     82, }, /* 1124 */
+  {    43,     10,      5,      0,      0,  18432,    144, }, /* 1125 */
+  {    43,     12,      3,      0,      0,  26624,    146, }, /* 1126 */
+  {    43,     13,     12,      0,      0,  18432,    138, }, /* 1127 */
+  {    43,     21,     12,      0,      0,  18432,     68, }, /* 1128 */
+  {    43,     21,     12,      0,      0,  18432,    124, }, /* 1129 */
+  {    50,      7,     12,      0,      0,  18432,     82, }, /* 1130 */
+  {    50,     12,      3,      0,      0,  26624,     96, }, /* 1131 */
+  {    50,     21,     12,      0,      0,  18432,     68, }, /* 1132 */
+  {    44,     12,      3,      0,      0,  26624,    130, }, /* 1133 */
+  {    44,     10,      5,      0,      0,  18432,    144, }, /* 1134 */
+  {    44,      7,     12,      0,      0,  18432,     82, }, /* 1135 */
+  {    44,     10,      5,      0,      0,  18432,    174, }, /* 1136 */
+  {    44,      7,      4,      0,      0,  18432,     82, }, /* 1137 */
+  {    44,     21,     12,      0,      0,  18432,    124, }, /* 1138 */
+  {    44,     21,     12,      0,      0,  18432,     68, }, /* 1139 */
+  {    44,     12,      3,      0,      0,  26624,    102, }, /* 1140 */
+  {    44,     12,      3,      0,      0,  26624,     96, }, /* 1141 */
+  {    44,     13,     12,      0,      0,  18432,    138, }, /* 1142 */
+  {    15,     15,     12,      0,      0,  18432,     68, }, /* 1143 */
+  {    48,      7,     12,      0,      0,  18432,     82, }, /* 1144 */
+  {    48,     10,      5,      0,      0,  18432,    144, }, /* 1145 */
+  {    48,     12,      3,      0,      0,  26624,    130, }, /* 1146 */
+  {    48,     10,      5,      0,      0,  18432,    174, }, /* 1147 */
+  {    48,     12,      3,      0,      0,  26624,     96, }, /* 1148 */
+  {    48,     21,     12,      0,      0,  18432,    124, }, /* 1149 */
+  {    48,     21,     12,      0,      0,  18432,    106, }, /* 1150 */
+  {    48,     21,     12,      0,      0,  18432,     68, }, /* 1151 */
+  {    57,      7,     12,      0,      0,  18432,     82, }, /* 1152 */
+  {    57,     21,     12,      0,      0,  18432,    124, }, /* 1153 */
+  {    55,      7,     12,      0,      0,  18432,     82, }, /* 1154 */
+  {    55,     12,      3,      0,      0,  26624,    130, }, /* 1155 */
+  {    55,     10,      5,      0,      0,  18432,    144, }, /* 1156 */
+  {    55,     12,      3,      0,      0,  26624,     96, }, /* 1157 */
+  {    55,     12,      3,      0,      0,  26624,    146, }, /* 1158 */
+  {    55,     13,     12,      0,      0,  18432,    138, }, /* 1159 */
+  {    47,     12,      3,      0,      0,  26624,    130, }, /* 1160 */
+  {    47,     12,      3,      0,      0,  26705,    130, }, /* 1161 */
+  {    47,     10,      5,      0,      0,  18432,    144, }, /* 1162 */
+  {    47,     10,      5,      0,      0,  18513,    144, }, /* 1163 */
+  {    47,      7,     12,      0,      0,  18432,     82, }, /* 1164 */
+  {    84,     12,      3,      0,      0,  26705,    102, }, /* 1165 */
+  {    47,     12,      3,      0,      0,  26705,     96, }, /* 1166 */
+  {    47,     10,      3,      0,      0,  18432,    148, }, /* 1167 */
+  {    47,     10,      5,      0,      0,  18432,    174, }, /* 1168 */
+  {    47,      7,     12,      0,      0,  18432,    324, }, /* 1169 */
+  {    47,     12,      3,      0,      0,  26624,     96, }, /* 1170 */
+  {   144,      7,     12,      0,      0,  18432,     82, }, /* 1171 */
+  {   144,     10,      5,      0,      0,  18432,    144, }, /* 1172 */
+  {   144,     12,      3,      0,      0,  26624,    130, }, /* 1173 */
+  {   144,     12,      3,      0,      0,  26624,    146, }, /* 1174 */
+  {   144,     12,      3,      0,      0,  26624,     96, }, /* 1175 */
+  {   144,     21,     12,      0,      0,  18432,    124, }, /* 1176 */
+  {   144,     21,     12,      0,      0,  18432,    106, }, /* 1177 */
+  {   144,     21,     12,      0,      0,  18432,     68, }, /* 1178 */
+  {   144,     13,     12,      0,      0,  18432,    138, }, /* 1179 */
+  {   144,     12,      3,      0,      0,  26624,    102, }, /* 1180 */
+  {    56,      7,     12,      0,      0,  18432,     82, }, /* 1181 */
+  {    56,     10,      3,      0,      0,  18432,    148, }, /* 1182 */
+  {    56,     10,      5,      0,      0,  18432,    144, }, /* 1183 */
+  {    56,     12,      3,      0,      0,  26624,    130, }, /* 1184 */
+  {    56,     12,      3,      0,      0,  26624,    146, }, /* 1185 */
+  {    56,     12,      3,      0,      0,  26624,     96, }, /* 1186 */
+  {    56,     21,     12,      0,      0,  18432,     68, }, /* 1187 */
+  {    56,     13,     12,      0,      0,  18432,    138, }, /* 1188 */
+  {   135,      7,     12,      0,      0,  18432,     82, }, /* 1189 */
+  {   135,     10,      3,      0,      0,  18432,    148, }, /* 1190 */
+  {   135,     10,      5,      0,      0,  18432,    144, }, /* 1191 */
+  {   135,     12,      3,      0,      0,  26624,    130, }, /* 1192 */
+  {   135,     12,      3,      0,      0,  26624,    146, }, /* 1193 */
+  {   135,     12,      3,      0,      0,  26624,     96, }, /* 1194 */
+  {   135,     21,     12,      0,      0,  18432,     68, }, /* 1195 */
+  {   135,     21,     12,      0,      0,  18432,    124, }, /* 1196 */
+  {   135,     21,     12,      0,      0,  18432,    106, }, /* 1197 */
+  {   135,     21,     12,      0,      0,  18432,    178, }, /* 1198 */
+  {    52,      7,     12,      0,      0,  18432,     82, }, /* 1199 */
+  {    52,     10,      5,      0,      0,  18432,    144, }, /* 1200 */
+  {    52,     12,      3,      0,      0,  26624,    130, }, /* 1201 */
+  {    52,     12,      3,      0,      0,  26624,    146, }, /* 1202 */
+  {    52,     21,     12,      0,      0,  18432,    124, }, /* 1203 */
+  {    52,     21,     12,      0,      0,  18432,     68, }, /* 1204 */
+  {    52,     13,     12,      0,      0,  18432,    138, }, /* 1205 */
+  {    45,      7,     12,      0,      0,  18432,     82, }, /* 1206 */
+  {    45,     12,      3,      0,      0,  26624,    130, }, /* 1207 */
+  {    45,     10,      5,      0,      0,  18432,    144, }, /* 1208 */
+  {    45,     10,      5,      0,      0,  18432,    174, }, /* 1209 */
+  {    45,     12,      3,      0,      0,  26624,     96, }, /* 1210 */
+  {    45,     21,     12,      0,      0,  18432,     68, }, /* 1211 */
+  {    45,     13,     12,      0,      0,  18432,    138, }, /* 1212 */
+  {   137,      7,     12,      0,      0,  18432,     82, }, /* 1213 */
+  {   137,     12,      3,      0,      0,  26624,    130, }, /* 1214 */
+  {   137,     10,     12,      0,      0,  18432,    144, }, /* 1215 */
+  {   137,     10,      5,      0,      0,  18432,    144, }, /* 1216 */
+  {   137,     12,      3,      0,      0,  26624,    146, }, /* 1217 */
+  {   137,     13,     12,      0,      0,  18432,    138, }, /* 1218 */
+  {   137,     15,     12,      0,      0,  18432,     68, }, /* 1219 */
+  {   137,     21,     12,      0,      0,  18432,    124, }, /* 1220 */
+  {   137,     26,     12,      0,      0,  18432,     68, }, /* 1221 */
+  {    60,      7,     12,      0,      0,  18432,     82, }, /* 1222 */
+  {    60,     10,      5,      0,      0,  18432,    144, }, /* 1223 */
+  {    60,     12,      3,      0,      0,  26624,    130, }, /* 1224 */
+  {    60,     12,      3,      0,      0,  26624,    146, }, /* 1225 */
+  {    60,     12,      3,      0,      0,  26624,     96, }, /* 1226 */
+  {    60,     21,     12,      0,      0,  18432,     68, }, /* 1227 */
+  {   136,      9,     12,      0,     32,  18432,     74, }, /* 1228 */
+  {   136,      5,     12,      0,    -32,  18432,     76, }, /* 1229 */
+  {   136,     13,     12,      0,      0,  18432,    138, }, /* 1230 */
+  {   136,     15,     12,      0,      0,  18432,     68, }, /* 1231 */
+  {   136,      7,     12,      0,      0,  18432,     82, }, /* 1232 */
+  {   157,      7,     12,      0,      0,  18432,     82, }, /* 1233 */
+  {   157,     10,      3,      0,      0,  18432,    148, }, /* 1234 */
+  {   157,     10,      5,      0,      0,  18432,    144, }, /* 1235 */
+  {   157,     12,      3,      0,      0,  26624,    130, }, /* 1236 */
+  {   157,     10,      5,      0,      0,  18432,    174, }, /* 1237 */
+  {   157,     12,      3,      0,      0,  26624,    146, }, /* 1238 */
+  {   157,      7,      4,      0,      0,  18432,     82, }, /* 1239 */
+  {   157,     12,      3,      0,      0,  26624,     96, }, /* 1240 */
+  {   157,     21,     12,      0,      0,  18432,    124, }, /* 1241 */
+  {   157,     21,     12,      0,      0,  18432,     68, }, /* 1242 */
+  {   157,     13,     12,      0,      0,  18432,    138, }, /* 1243 */
+  {    64,      7,     12,      0,      0,  18432,     82, }, /* 1244 */
+  {    64,     10,      5,      0,      0,  18432,    144, }, /* 1245 */
+  {    64,     12,      3,      0,      0,  26624,    130, }, /* 1246 */
+  {    64,     12,      3,      0,      0,  26624,    146, }, /* 1247 */
+  {    64,     21,     12,      0,      0,  18432,     68, }, /* 1248 */
+  {   149,      7,     12,      0,      0,  18432,     82, }, /* 1249 */
+  {   149,     12,      3,      0,      0,  26624,    130, }, /* 1250 */
+  {   149,     12,      3,      0,      0,  18432,    130, }, /* 1251 */
+  {   149,     12,      3,      0,      0,  26624,    102, }, /* 1252 */
+  {   149,     12,      3,      0,      0,  26624,    146, }, /* 1253 */
+  {   149,     10,      5,      0,      0,  18432,    144, }, /* 1254 */
+  {   149,      7,      4,      0,      0,  18432,     82, }, /* 1255 */
+  {   149,     21,     12,      0,      0,  18432,     68, }, /* 1256 */
+  {   149,     21,     12,      0,      0,  18432,    124, }, /* 1257 */
+  {   148,      7,     12,      0,      0,  18432,     82, }, /* 1258 */
+  {   148,     12,      3,      0,      0,  26624,    130, }, /* 1259 */
+  {   148,     10,      5,      0,      0,  18432,    144, }, /* 1260 */
+  {   148,      7,      4,      0,      0,  18432,     82, }, /* 1261 */
+  {   148,     12,      3,      0,      0,  26624,    326, }, /* 1262 */
+  {   148,     12,      3,      0,      0,  26624,    146, }, /* 1263 */
+  {   148,     21,     12,      0,      0,  18432,     68, }, /* 1264 */
+  {   148,     21,     12,      0,      0,  18432,    124, }, /* 1265 */
+  {   148,     21,     12,      0,      0,  18432,    106, }, /* 1266 */
+  {   134,      7,     12,      0,      0,  18432,     82, }, /* 1267 */
+  {   142,      7,     12,      0,      0,  18432,     82, }, /* 1268 */
+  {   142,     10,      5,      0,      0,  18432,    144, }, /* 1269 */
+  {   142,     12,      3,      0,      0,  26624,    130, }, /* 1270 */
+  {   142,     12,      3,      0,      0,  18432,    146, }, /* 1271 */
+  {   142,     21,     12,      0,      0,  18432,    124, }, /* 1272 */
+  {   142,     21,     12,      0,      0,  18432,    106, }, /* 1273 */
+  {   142,     21,     12,      0,      0,  18432,     68, }, /* 1274 */
+  {   142,     13,     12,      0,      0,  18432,    138, }, /* 1275 */
+  {   142,     15,     12,      0,      0,  18432,     68, }, /* 1276 */
+  {   143,     21,     12,      0,      0,  18432,     68, }, /* 1277 */
+  {   143,     21,     12,      0,      0,  18432,    106, }, /* 1278 */
+  {   143,      7,     12,      0,      0,  18432,     82, }, /* 1279 */
+  {   143,     12,      3,      0,      0,  26624,    130, }, /* 1280 */
+  {   143,     10,      5,      0,      0,  18432,    144, }, /* 1281 */
+  {    59,      7,     12,      0,      0,  18432,     82, }, /* 1282 */
+  {    59,     12,      3,      0,      0,  26624,    130, }, /* 1283 */
+  {    59,     12,      3,      0,      0,  26624,     96, }, /* 1284 */
+  {    59,     12,      3,      0,      0,  26624,    146, }, /* 1285 */
+  {    59,      7,      4,      0,      0,  18432,     82, }, /* 1286 */
+  {    59,     13,     12,      0,      0,  18432,    138, }, /* 1287 */
+  {    61,      7,     12,      0,      0,  18432,     82, }, /* 1288 */
+  {    61,     10,      5,      0,      0,  18432,    144, }, /* 1289 */
+  {    61,     12,      3,      0,      0,  26624,    130, }, /* 1290 */
+  {    61,     12,      3,      0,      0,  26624,    146, }, /* 1291 */
+  {    61,     13,     12,      0,      0,  18432,    138, }, /* 1292 */
+  {   150,      7,     12,      0,      0,  18432,     82, }, /* 1293 */
+  {   150,     12,      3,      0,      0,  26624,    130, }, /* 1294 */
+  {   150,     10,      5,      0,      0,  18432,    144, }, /* 1295 */
+  {   150,     21,     12,      0,      0,  18432,    124, }, /* 1296 */
+  {   162,     12,      3,      0,      0,  26624,    130, }, /* 1297 */
+  {   162,      7,      4,      0,      0,  18432,     82, }, /* 1298 */
+  {   162,     10,      5,      0,      0,  18432,    144, }, /* 1299 */
+  {   162,      7,     12,      0,      0,  18432,     82, }, /* 1300 */
+  {   162,     10,      5,      0,      0,  18432,    176, }, /* 1301 */
+  {   162,     12,      3,      0,      0,  26624,    184, }, /* 1302 */
+  {   162,     21,     12,      0,      0,  18432,    124, }, /* 1303 */
+  {   162,     21,     12,      0,      0,  18432,     68, }, /* 1304 */
+  {   162,     13,     12,      0,      0,  18432,    138, }, /* 1305 */
+  {    11,     15,     12,      0,      0,  18432,     68, }, /* 1306 */
+  {    11,     21,     12,      0,      0,  18432,     68, }, /* 1307 */
+  {    94,      7,     12,      0,      0,  18432,     82, }, /* 1308 */
+  {    94,     14,     12,      0,      0,  18432,     82, }, /* 1309 */
+  {    94,     21,     12,      0,      0,  18432,    106, }, /* 1310 */
+  {    66,      7,     12,      0,      0,  18432,     82, }, /* 1311 */
+  {    66,     21,     12,      0,      0,  18432,     68, }, /* 1312 */
+  {   109,      7,     12,      0,      0,  18432,     82, }, /* 1313 */
+  {   109,      1,      2,      0,      0,  18432,    322, }, /* 1314 */
+  {   109,     12,      3,      0,      0,  26624,    102, }, /* 1315 */
+  {   109,     12,      3,      0,      0,  26624,     96, }, /* 1316 */
+  {   138,      7,     12,      0,      0,  18432,     82, }, /* 1317 */
+  {   130,      7,     12,      0,      0,  18432,     82, }, /* 1318 */
+  {   130,     13,     12,      0,      0,  18432,    138, }, /* 1319 */
+  {   130,     21,     12,      0,      0,  18432,    124, }, /* 1320 */
+  {   159,      7,     12,      0,      0,  18432,     82, }, /* 1321 */
+  {   159,     13,     12,      0,      0,  18432,    138, }, /* 1322 */
+  {   126,      7,     12,      0,      0,  18432,     82, }, /* 1323 */
+  {   126,     12,      3,      0,      0,  26624,     96, }, /* 1324 */
+  {   126,     21,     12,      0,      0,  18432,    124, }, /* 1325 */
+  {   128,      7,     12,      0,      0,  18432,     82, }, /* 1326 */
+  {   128,     12,      3,      0,      0,  26624,     96, }, /* 1327 */
+  {   128,     21,     12,      0,      0,  18432,    124, }, /* 1328 */
+  {   128,     21,     12,      0,      0,  18432,    106, }, /* 1329 */
+  {   128,     21,     12,      0,      0,  18432,     68, }, /* 1330 */
+  {   128,     26,     12,      0,      0,  18432,     68, }, /* 1331 */
+  {   128,      6,     12,      0,      0,  18432,    142, }, /* 1332 */
+  {   128,      6,     12,      0,      0,  18432,    136, }, /* 1333 */
+  {   128,     13,     12,      0,      0,  18432,    138, }, /* 1334 */
+  {   128,     15,     12,      0,      0,  18432,     68, }, /* 1335 */
+  {   151,      9,     12,      0,     32,  18432,     74, }, /* 1336 */
+  {   151,      5,     12,      0,    -32,  18432,     76, }, /* 1337 */
+  {   151,     15,     12,      0,      0,  18432,     68, }, /* 1338 */
+  {   151,     21,     12,      0,      0,  18432,    106, }, /* 1339 */
+  {   151,     21,     12,      0,      0,  18432,    124, }, /* 1340 */
+  {   151,     21,     12,      0,      0,  18432,     68, }, /* 1341 */
+  {   123,      7,     12,      0,      0,  18432,     82, }, /* 1342 */
+  {   123,     12,      3,      0,      0,  26624,    130, }, /* 1343 */
+  {   123,     10,      5,      0,      0,  18432,    144, }, /* 1344 */
+  {   123,     12,      3,      0,      0,  26624,    128, }, /* 1345 */
+  {   123,      6,     12,      0,      0,  18432,     92, }, /* 1346 */
+  {   146,      6,     12,      0,      0,  18432,    136, }, /* 1347 */
+  {   147,      6,     12,      0,      0,  18432,    136, }, /* 1348 */
+  {    23,     21,     12,      0,      0,  28672,     68, }, /* 1349 */
+  {   158,     12,      3,      0,      0,  26624,    328, }, /* 1350 */
+  {    23,     10,      5,      0,      0,  18432,    164, }, /* 1351 */
+  {   146,      7,     12,      0,      0,  18432,    284, }, /* 1352 */
+  {   158,      7,     12,      0,      0,  18432,    284, }, /* 1353 */
+  {    21,      6,     12,      0,      0,  18432,     92, }, /* 1354 */
+  {   147,      7,     12,      0,      0,  18432,    284, }, /* 1355 */
+  {    46,      7,     12,      0,      0,  18432,     82, }, /* 1356 */
+  {    46,     26,     12,      0,      0,  18432,     68, }, /* 1357 */
+  {    46,     12,      3,      0,      0,  26624,    102, }, /* 1358 */
+  {    46,     12,      3,      0,      0,  26624,    130, }, /* 1359 */
+  {    46,     21,     12,      0,      0,  18432,    124, }, /* 1360 */
+  {    69,      1,      2,      0,      0,   6153,     66, }, /* 1361 */
+  {    69,     10,      3,      0,      0,  18432,    330, }, /* 1362 */
+  {    69,     10,      5,      0,      0,  18432,    138, }, /* 1363 */
+  {    69,     10,      5,      0,      0,  18432,    160, }, /* 1364 */
+  {    69,     10,      3,      0,      0,  18432,    286, }, /* 1365 */
+  {     1,     12,      3,      0,      0,  26624,    102, }, /* 1366 */
+  {    69,     25,     12,      0,      0,  18432,    118, }, /* 1367 */
+  {    69,     13,     12,      0,      0,  10240,    214, }, /* 1368 */
+  {   141,     26,     12,      0,      0,  18432,     68, }, /* 1369 */
+  {   141,     12,      3,      0,      0,  26624,    102, }, /* 1370 */
+  {   141,     21,     12,      0,      0,  18432,    106, }, /* 1371 */
+  {   141,     21,     12,      0,      0,  18432,    124, }, /* 1372 */
+  {   141,     21,     12,      0,      0,  18432,     68, }, /* 1373 */
+  {    35,     12,      3,      0,      0,  26624,    130, }, /* 1374 */
+  {     2,      6,     12,      0,      0,  18432,     90, }, /* 1375 */
+  {   154,      7,     12,      0,      0,  18432,     82, }, /* 1376 */
+  {   154,     12,      3,      0,      0,  26624,     96, }, /* 1377 */
+  {   154,      6,     12,      0,      0,  18432,    142, }, /* 1378 */
+  {   154,      6,     12,      0,      0,  18432,    136, }, /* 1379 */
+  {   154,     13,     12,      0,      0,  18432,    138, }, /* 1380 */
+  {   154,     26,     12,      0,      0,  18432,     68, }, /* 1381 */
+  {   160,      7,     12,      0,      0,  18432,     82, }, /* 1382 */
+  {   160,     12,      3,      0,      0,  26624,     96, }, /* 1383 */
+  {   155,      7,     12,      0,      0,  18432,     82, }, /* 1384 */
+  {   155,     12,      3,      0,      0,  26624,     96, }, /* 1385 */
+  {   155,     13,     12,      0,      0,  18432,    138, }, /* 1386 */
+  {   155,     23,     12,      0,      0,  14336,     68, }, /* 1387 */
+  {   163,      7,     12,      0,      0,  18432,     82, }, /* 1388 */
+  {   163,      6,     12,      0,      0,  18432,    142, }, /* 1389 */
+  {   163,     12,      3,      0,      0,  26624,    102, }, /* 1390 */
+  {   163,     13,     12,      0,      0,  18432,    138, }, /* 1391 */
+  {   129,      7,     12,      0,      0,  34816,     82, }, /* 1392 */
+  {   129,     15,     12,      0,      0,  34816,     68, }, /* 1393 */
+  {   129,     12,      3,      0,      0,  26624,     96, }, /* 1394 */
+  {    58,      9,     12,      0,     34,  34816,     74, }, /* 1395 */
+  {    58,      5,     12,      0,    -34,  34816,     76, }, /* 1396 */
+  {    58,     12,      3,      0,      0,  26624,    150, }, /* 1397 */
+  {    58,     12,      3,      0,      0,  26624,    130, }, /* 1398 */
+  {    58,     12,      3,      0,      0,  26624,     96, }, /* 1399 */
+  {    58,      6,     12,      0,      0,  34816,    142, }, /* 1400 */
+  {    58,     13,     12,      0,      0,  34816,    138, }, /* 1401 */
+  {    58,     21,     12,      0,      0,  34816,     68, }, /* 1402 */
+  {    69,     15,     12,      0,      0,      0,     68, }, /* 1403 */
+  {    69,     26,     12,      0,      0,      0,     68, }, /* 1404 */
+  {    69,     23,     12,      0,      0,      0,     68, }, /* 1405 */
+  {     3,      7,     12,      0,      0,      0,    240, }, /* 1406 */
+  {    69,     26,     14,      0,      0,  28672,    332, }, /* 1407 */
+  {    69,     26,     14,      0,      0,  28672,    334, }, /* 1408 */
+  {    68,      2,     14,      0,      0,  18432,    336, }, /* 1409 */
+  {    69,     26,     12,      0,      0,  18432,    338, }, /* 1410 */
+  {    69,     26,     14,      0,      0,  18432,    340, }, /* 1411 */
+  {    69,     26,     14,      0,      0,  18432,    334, }, /* 1412 */
+  {    69,     26,     11,      0,      0,  18432,    342, }, /* 1413 */
+  {    20,     26,     12,      0,      0,  18432,     68, }, /* 1414 */
+  {    69,     26,     14,      0,      0,  18432,    236, }, /* 1415 */
+  {    69,     26,     14,      0,      0,  18447,    334, }, /* 1416 */
+  {    69,     26,     14,      0,      0,  28672,    344, }, /* 1417 */
+  {    69,     26,     14,      0,      0,  28672,    346, }, /* 1418 */
+  {    69,     24,      3,      0,      0,  28672,    348, }, /* 1419 */
+  {    69,     26,     14,      0,      0,  28672,    350, }, /* 1420 */
+  {    69,     13,     12,      0,      0,  10240,    138, }, /* 1421 */
+  {    69,      1,      3,      0,      0,   6144,    352, }, /* 1422 */
 };
 
 const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */
@@ -1872,35 +1886,35 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 142,143,144,145,146,147,148,149,150,151,152,153,154,154,155,156, /* U+10000 */
 157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172, /* U+10800 */
 173,174,175,176,177,178,179,146,180,181,146,182,183,184,185,146, /* U+11000 */
-186,187,188,189,190,191,146,146,192,193,194,195,146,196,146,197, /* U+11800 */
-198,198,198,198,198,198,198,199,200,198,201,146,146,146,146,146, /* U+12000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,202, /* U+12800 */
-203,203,203,203,203,203,203,203,204,146,146,146,146,146,146,146, /* U+13000 */
+186,187,188,189,190,191,192,146,193,194,195,196,146,197,198,199, /* U+11800 */
+200,200,200,200,200,200,200,201,202,200,203,146,146,146,146,146, /* U+12000 */
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,204, /* U+12800 */
+205,205,205,205,205,205,205,205,206,146,146,146,146,146,146,146, /* U+13000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+13800 */
-146,146,146,146,146,146,146,146,205,205,205,205,206,146,146,146, /* U+14000 */
+146,146,146,146,146,146,146,146,207,207,207,207,208,146,146,146, /* U+14000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+14800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+15000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+15800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+16000 */
-207,207,207,207,208,209,210,211,146,146,146,146,212,213,214,215, /* U+16800 */
-216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216, /* U+17000 */
-216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216, /* U+17800 */
-216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,217, /* U+18000 */
-216,216,216,216,216,216,218,218,218,219,220,146,146,146,146,146, /* U+18800 */
+209,209,209,209,210,211,212,213,146,146,146,146,214,215,216,217, /* U+16800 */
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218, /* U+17000 */
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218, /* U+17800 */
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,219, /* U+18000 */
+218,218,218,218,218,218,220,220,220,221,222,146,146,146,146,146, /* U+18800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+19000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+19800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+1A000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,221, /* U+1A800 */
-222,223,224,225,225,226,146,146,146,146,146,146,146,146,146,146, /* U+1B000 */
-146,146,146,146,146,146,146,146,227,228,146,146,146,146,146,146, /* U+1B800 */
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,223, /* U+1A800 */
+224,225,226,227,227,228,146,146,146,146,146,146,146,146,146,146, /* U+1B000 */
+146,146,146,146,146,146,146,146,229,230,146,146,146,146,146,146, /* U+1B800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+1C000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,229,230, /* U+1C800 */
-231,232,233,234,235,236,237,146,238,239,240,241,242,243,244,245, /* U+1D000 */
-246,246,246,246,247,248,146,146,146,146,146,146,146,146,249,146, /* U+1D800 */
-250,146,251,146,146,252,146,146,146,146,146,146,146,146,146,253, /* U+1E000 */
-254,255,256,168,168,168,168,168,257,258,259,168,260,261,168,168, /* U+1E800 */
-262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277, /* U+1F000 */
-278,279,280,281,282,283,284,285,267,267,267,267,267,267,267,286, /* U+1F800 */
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,231,232, /* U+1C800 */
+233,234,235,236,237,238,239,146,240,241,242,243,244,245,246,247, /* U+1D000 */
+248,248,248,248,249,250,146,146,146,146,146,146,146,146,251,146, /* U+1D800 */
+252,253,254,146,146,255,146,146,146,256,146,146,146,146,146,257, /* U+1E000 */
+258,259,260,168,168,168,168,168,261,262,263,168,264,265,168,168, /* U+1E800 */
+266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281, /* U+1F000 */
+282,283,284,285,286,287,288,289,271,271,271,271,271,271,271,290, /* U+1F800 */
 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+20000 */
 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+20800 */
 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+21000 */
@@ -1921,23 +1935,23 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+28800 */
 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+29000 */
 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+29800 */
-101,101,101,101,101,101,101,101,101,101,101,101,101,287,101,101, /* U+2A000 */
+101,101,101,101,101,101,101,101,101,101,101,101,101,291,101,101, /* U+2A000 */
 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+2A800 */
-101,101,101,101,101,101,101,101,101,101,101,101,101,101,288,101, /* U+2B000 */
-289,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+2B800 */
+101,101,101,101,101,101,101,101,101,101,101,101,101,101,292,101, /* U+2B000 */
+293,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+2B800 */
 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+2C000 */
-101,101,101,101,101,101,101,101,101,101,101,101,101,290,101,101, /* U+2C800 */
+101,101,101,101,101,101,101,101,101,101,101,101,101,294,101,101, /* U+2C800 */
 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+2D000 */
 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+2D800 */
 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+2E000 */
-101,101,101,101,101,101,101,291,146,146,146,146,146,146,146,146, /* U+2E800 */
+101,101,101,101,101,101,101,295,146,146,146,146,146,146,146,146, /* U+2E800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+2F000 */
-129,129,129,129,292,146,146,146,146,146,146,146,146,146,146,293, /* U+2F800 */
+129,129,129,129,296,146,146,146,146,146,146,146,146,146,146,297, /* U+2F800 */
 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+30000 */
 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+30800 */
-101,101,101,101,101,101,294,146,146,146,146,146,146,146,146,146, /* U+31000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+31800 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+32000 */
+101,101,101,101,101,101,298,101,101,101,101,101,101,101,101,101, /* U+31000 */
+101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, /* U+31800 */
+101,101,101,101,101,101,101,299,146,146,146,146,146,146,146,146, /* U+32000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+32800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+33000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+33800 */
@@ -1964,7 +1978,7 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+3E000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+3E800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+3F000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,293, /* U+3F800 */
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,297, /* U+3F800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+40000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+40800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+41000 */
@@ -1996,7 +2010,7 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+4E000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+4E800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+4F000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,293, /* U+4F800 */
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,297, /* U+4F800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+50000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+50800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+51000 */
@@ -2028,7 +2042,7 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+5E000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+5E800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+5F000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,293, /* U+5F800 */
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,297, /* U+5F800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+60000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+60800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+61000 */
@@ -2060,7 +2074,7 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+6E000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+6E800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+6F000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,293, /* U+6F800 */
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,297, /* U+6F800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+70000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+70800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+71000 */
@@ -2092,7 +2106,7 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+7E000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+7E800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+7F000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,293, /* U+7F800 */
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,297, /* U+7F800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+80000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+80800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+81000 */
@@ -2124,7 +2138,7 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+8E000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+8E800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+8F000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,293, /* U+8F800 */
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,297, /* U+8F800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+90000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+90800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+91000 */
@@ -2156,7 +2170,7 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+9E000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+9E800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+9F000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,293, /* U+9F800 */
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,297, /* U+9F800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+A0000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+A0800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+A1000 */
@@ -2188,7 +2202,7 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+AE000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+AE800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+AF000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,293, /* U+AF800 */
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,297, /* U+AF800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+B0000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+B0800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+B1000 */
@@ -2220,7 +2234,7 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+BE000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+BE800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+BF000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,293, /* U+BF800 */
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,297, /* U+BF800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+C0000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+C0800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+C1000 */
@@ -2252,7 +2266,7 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+CE000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+CE800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+CF000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,293, /* U+CF800 */
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,297, /* U+CF800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+D0000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+D0800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+D1000 */
@@ -2284,9 +2298,9 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+DE000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+DE800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+DF000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,293, /* U+DF800 */
-295,296,297,298,296,296,296,296,296,296,296,296,296,296,296,296, /* U+E0000 */
-296,296,296,296,296,296,296,296,296,296,296,296,296,296,296,296, /* U+E0800 */
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,297, /* U+DF800 */
+300,301,302,303,301,301,301,301,301,301,301,301,301,301,301,301, /* U+E0000 */
+301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,301, /* U+E0800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+E1000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+E1800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+E2000 */
@@ -2316,7 +2330,7 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+EE000 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+EE800 */
 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, /* U+EF000 */
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,293, /* U+EF800 */
+146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,297, /* U+EF800 */
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, /* U+F0000 */
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, /* U+F0800 */
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, /* U+F1000 */
@@ -2348,7 +2362,7 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, /* U+FE000 */
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, /* U+FE800 */
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, /* U+FF000 */
-128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,299, /* U+FF800 */
+128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,304, /* U+FF800 */
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, /* U+100000 */
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, /* U+100800 */
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, /* U+101000 */
@@ -2380,10 +2394,10 @@ const uint16_t PRIV(ucd_stage1)[] = { /*
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, /* U+10E000 */
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, /* U+10E800 */
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, /* U+10F000 */
-128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,299, /* U+10F800 */
+128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,304, /* U+10F800 */
 };
 
-const uint16_t PRIV(ucd_stage2)[] = { /* 76800 bytes, block = 128 */
+const uint16_t PRIV(ucd_stage2)[] = { /* 78080 bytes, block = 128 */
 
 /* block 0 */
   0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  1,  3,  4,  0,  0,
@@ -2626,62 +2640,62 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 388,388,388,389,390,390,390,390,390,391,390,163,163,163,163,163,
 
 /* block 24 */
-392,393,393,393,394,395,395,395,395,395,395,395,395,163,395,395,
-395,163,395,395,395,395,395,395,395,395,395,395,395,395,395,395,
-395,395,395,395,395,395,395,395,395,163,395,395,395,395,395,395,
-395,395,395,395,395,395,395,395,395,395,163,163,396,395,392,392,
-392,393,393,393,393,163,392,392,392,163,392,392,392,397,163,163,
-163,163,163,163,163,392,392,163,395,395,395,163,163,395,163,163,
-395,395,392,392,163,163,398,398,398,398,398,398,398,398,398,398,
-163,163,163,163,163,163,163,399,400,400,400,400,400,400,400,401,
+392,393,393,393,392,394,394,394,394,394,394,394,394,163,394,394,
+394,163,394,394,394,394,394,394,394,394,394,394,394,394,394,394,
+394,394,394,394,394,394,394,394,394,163,394,394,394,394,394,394,
+394,394,394,394,394,394,394,394,394,394,163,163,395,394,392,392,
+392,393,393,393,393,163,392,392,392,163,392,392,392,396,163,163,
+163,163,163,163,163,392,392,163,394,394,394,163,163,394,163,163,
+394,394,392,392,163,163,397,397,397,397,397,397,397,397,397,397,
+163,163,163,163,163,163,163,398,399,399,399,399,399,399,399,400,
 
 /* block 25 */
-402,403,404,404,405,402,402,402,402,402,402,402,402,163,402,402,
-402,163,402,402,402,402,402,402,402,402,402,402,402,402,402,402,
-402,402,402,402,402,402,402,402,402,163,402,402,402,402,402,402,
-402,402,402,402,163,402,402,402,402,402,163,163,406,402,404,407,
-404,404,408,404,404,163,407,404,404,163,404,404,403,409,163,163,
-163,163,163,163,163,408,408,163,163,163,163,163,163,402,402,163,
-402,402,403,403,163,163,410,410,410,410,410,410,410,410,410,410,
-163,402,402,163,163,163,163,163,163,163,163,163,163,163,163,163,
+401,402,403,403,404,401,401,401,401,401,401,401,401,163,401,401,
+401,163,401,401,401,401,401,401,401,401,401,401,401,401,401,401,
+401,401,401,401,401,401,401,401,401,163,401,401,401,401,401,401,
+401,401,401,401,163,401,401,401,401,401,163,163,405,401,403,406,
+403,403,407,403,403,163,406,403,403,163,403,403,402,408,163,163,
+163,163,163,163,163,407,407,163,163,163,163,163,163,401,401,163,
+401,401,402,402,163,163,409,409,409,409,409,409,409,409,409,409,
+163,401,401,403,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 26 */
-411,411,412,412,413,413,413,413,413,413,413,413,413,163,413,413,
-413,163,413,413,413,413,413,413,413,413,413,413,413,413,413,413,
-413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,
-413,413,413,413,413,413,413,413,413,413,413,414,414,413,415,412,
-412,411,411,411,411,163,412,412,412,163,412,412,412,414,416,417,
-163,163,163,163,413,413,413,415,418,418,418,418,418,418,418,413,
-413,413,411,411,163,163,419,419,419,419,419,419,419,419,419,419,
-418,418,418,418,418,418,418,418,418,417,413,413,413,413,413,413,
+410,410,411,411,412,412,412,412,412,412,412,412,412,163,412,412,
+412,163,412,412,412,412,412,412,412,412,412,412,412,412,412,412,
+412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,
+412,412,412,412,412,412,412,412,412,412,412,413,413,412,414,411,
+411,410,410,410,410,163,411,411,411,163,411,411,411,413,415,416,
+163,163,163,163,412,412,412,414,417,417,417,417,417,417,417,412,
+412,412,410,410,163,163,418,418,418,418,418,418,418,418,418,418,
+417,417,417,417,417,417,417,417,417,416,412,412,412,412,412,412,
 
 /* block 27 */
-163,420,421,421,163,422,422,422,422,422,422,422,422,422,422,422,
-422,422,422,422,422,422,422,163,163,163,422,422,422,422,422,422,
-422,422,422,422,422,422,422,422,422,422,422,422,422,422,422,422,
-422,422,163,422,422,422,422,422,422,422,422,422,163,422,163,163,
-422,422,422,422,422,422,422,163,163,163,423,163,163,163,163,424,
-421,421,420,420,420,163,420,163,421,421,421,421,421,421,421,424,
-163,163,163,163,163,163,425,425,425,425,425,425,425,425,425,425,
-163,163,421,421,426,163,163,163,163,163,163,163,163,163,163,163,
+163,419,420,420,163,421,421,421,421,421,421,421,421,421,421,421,
+421,421,421,421,421,421,421,163,163,163,421,421,421,421,421,421,
+421,421,421,421,421,421,421,421,421,421,421,421,421,421,421,421,
+421,421,163,421,421,421,421,421,421,421,421,421,163,421,163,163,
+421,421,421,421,421,421,421,163,163,163,422,163,163,163,163,423,
+420,420,419,419,419,163,419,163,420,420,420,420,420,420,420,423,
+163,163,163,163,163,163,424,424,424,424,424,424,424,424,424,424,
+163,163,420,420,425,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 28 */
-163,427,427,427,427,427,427,427,427,427,427,427,427,427,427,427,
-427,427,427,427,427,427,427,427,427,427,427,427,427,427,427,427,
-427,427,427,427,427,427,427,427,427,427,427,427,427,427,427,427,
-427,428,427,429,428,428,428,428,428,428,430,163,163,163,163,431,
-432,432,432,432,432,427,433,434,434,434,434,434,434,428,434,435,
-436,436,436,436,436,436,436,436,436,436,437,437,163,163,163,163,
+163,426,426,426,426,426,426,426,426,426,426,426,426,426,426,426,
+426,426,426,426,426,426,426,426,426,426,426,426,426,426,426,426,
+426,426,426,426,426,426,426,426,426,426,426,426,426,426,426,426,
+426,427,426,428,427,427,427,427,427,427,429,163,163,163,163,430,
+431,431,431,431,431,426,432,433,433,433,433,433,433,427,433,434,
+435,435,435,435,435,435,435,435,435,435,436,436,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 29 */
-163,438,438,163,438,163,438,438,438,438,438,163,438,438,438,438,
-438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-438,438,438,438,163,438,163,438,438,438,438,438,438,438,438,438,
-438,439,438,440,439,439,439,439,439,439,441,439,439,438,163,163,
-442,442,442,442,442,163,443,163,444,444,444,444,444,439,163,163,
-445,445,445,445,445,445,445,445,445,445,163,163,438,438,438,438,
+163,437,437,163,437,163,437,437,437,437,437,163,437,437,437,437,
+437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
+437,437,437,437,163,437,163,437,437,437,437,437,437,437,437,437,
+437,438,437,439,438,438,438,438,438,438,440,438,438,437,163,163,
+441,441,441,441,441,163,442,163,443,443,443,443,443,438,444,163,
+445,445,445,445,445,445,445,445,445,445,163,163,437,437,437,437,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
@@ -2696,274 +2710,274 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 163,456,456,456,456,456,456,457,456,457,456,456,456,456,456,458,
 
 /* block 31 */
-456,456,450,450,459,448,450,450,446,446,446,446,446,456,456,456,
+456,456,459,459,460,448,450,450,446,446,446,446,446,456,456,456,
 456,456,456,456,456,456,456,456,163,456,456,456,456,456,456,456,
 456,456,456,456,456,456,456,456,456,456,456,456,456,456,456,456,
 456,456,456,456,456,456,456,456,456,456,456,456,456,163,447,447,
 447,447,447,447,447,447,450,447,447,447,447,447,447,163,447,447,
-448,448,448,448,448,460,460,460,460,448,448,163,163,163,163,163,
+448,448,448,448,448,461,461,461,461,448,448,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 32 */
-461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
-461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
-461,461,461,461,461,461,461,461,461,461,461,462,462,463,463,463,
-463,464,463,463,463,463,463,465,462,466,466,464,464,463,463,461,
-467,467,467,467,467,467,467,467,467,467,468,468,469,469,469,469,
-461,461,461,461,461,461,464,464,463,463,461,461,461,461,463,463,
-463,461,462,470,470,461,461,462,462,470,470,470,470,470,461,461,
-461,463,463,463,463,461,461,461,461,461,461,461,461,461,461,461,
+462,462,462,462,462,462,462,462,462,462,462,462,462,462,462,462,
+462,462,462,462,462,462,462,462,462,462,462,462,462,462,462,462,
+462,462,462,462,462,462,462,462,462,462,462,463,463,464,464,464,
+464,465,464,464,464,464,464,466,463,467,467,465,465,464,464,462,
+468,468,468,468,468,468,468,468,468,468,469,469,470,470,470,470,
+462,462,462,462,462,462,465,465,464,464,462,462,462,462,464,464,
+464,462,463,471,471,462,462,463,463,471,471,471,471,471,462,462,
+462,464,464,464,464,462,462,462,462,462,462,462,462,462,462,462,
 
 /* block 33 */
-461,461,463,462,464,463,463,470,470,470,470,470,470,471,461,470,
-472,472,472,472,472,472,472,472,472,472,470,470,462,463,473,473,
-474,474,474,474,474,474,474,474,474,474,474,474,474,474,474,474,
-474,474,474,474,474,474,474,474,474,474,474,474,474,474,474,474,
-474,474,474,474,474,474,163,474,163,163,163,163,163,474,163,163,
+462,462,464,463,465,464,464,471,471,471,471,471,471,472,462,471,
+473,473,473,473,473,473,473,473,473,473,471,471,463,464,474,474,
 475,475,475,475,475,475,475,475,475,475,475,475,475,475,475,475,
 475,475,475,475,475,475,475,475,475,475,475,475,475,475,475,475,
-475,475,475,475,475,475,475,475,475,475,475,476,477,475,475,475,
+475,475,475,475,475,475,163,475,163,163,163,163,163,475,163,163,
+476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,
+476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,
+476,476,476,476,476,476,476,476,476,476,476,477,478,476,476,476,
 
 /* block 34 */
-478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,
-478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,
-478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,
-478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,
-478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,
-478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,479,
-480,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,
-481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,
+479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,
+479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,
+479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,
+479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,
+479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,
+479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,480,
+481,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
+482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
 
 /* block 35 */
-481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,
-481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,
-481,481,481,481,481,481,481,481,482,482,482,482,482,482,482,482,
-482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
 482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
 482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
-482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
-482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
-
-/* block 36 */
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
+482,482,482,482,482,482,482,482,483,483,483,483,483,483,483,483,
 483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
 483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
 483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,483,483,163,483,483,483,483,163,163,
-483,483,483,483,483,483,483,163,483,163,483,483,483,483,163,163,
 483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
 483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
 
+/* block 36 */
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,163,484,484,484,484,163,163,
+484,484,484,484,484,484,484,163,484,163,484,484,484,484,163,163,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+
 /* block 37 */
-483,483,483,483,483,483,483,483,483,163,483,483,483,483,163,163,
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,163,483,483,483,483,163,163,483,483,483,483,483,483,483,163,
-483,163,483,483,483,483,163,163,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,163,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
+484,484,484,484,484,484,484,484,484,163,484,484,484,484,163,163,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,163,484,484,484,484,163,163,484,484,484,484,484,484,484,163,
+484,163,484,484,484,484,163,163,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,163,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
 
 /* block 38 */
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,163,483,483,483,483,163,163,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,483,483,483,483,163,163,484,484,484,
-485,486,487,486,486,486,486,487,487,488,488,488,488,488,488,488,
-488,488,489,489,489,489,489,489,489,489,489,489,489,163,163,163,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,163,484,484,484,484,163,163,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,163,163,485,485,485,
+486,487,488,487,487,487,487,488,488,489,489,489,489,489,489,489,
+489,489,490,490,490,490,490,490,490,490,490,490,490,163,163,163,
 
 /* block 39 */
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-490,490,490,490,490,490,490,490,490,490,163,163,163,163,163,163,
-491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,
-491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,
-491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,
-491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,
-491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,
-492,492,492,492,492,492,163,163,493,493,493,493,493,493,163,163,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+491,491,491,491,491,491,491,491,491,491,163,163,163,163,163,163,
+492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,
+492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,
+492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,
+492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,
+492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,
+493,493,493,493,493,493,163,163,494,494,494,494,494,494,163,163,
 
 /* block 40 */
-494,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
+495,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
 
 /* block 41 */
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
 
 /* block 42 */
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,496,497,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,497,498,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
 
 /* block 43 */
-498,499,499,499,499,499,499,499,499,499,499,499,499,499,499,499,
-499,499,499,499,499,499,499,499,499,499,499,500,501,163,163,163,
-502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,
-502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,
-502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,
-502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,
-502,502,502,502,502,502,502,502,502,502,502,503,503,503,504,504,
-504,502,502,502,502,502,502,502,502,163,163,163,163,163,163,163,
+499,500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,
+500,500,500,500,500,500,500,500,500,500,500,501,502,163,163,163,
+503,503,503,503,503,503,503,503,503,503,503,503,503,503,503,503,
+503,503,503,503,503,503,503,503,503,503,503,503,503,503,503,503,
+503,503,503,503,503,503,503,503,503,503,503,503,503,503,503,503,
+503,503,503,503,503,503,503,503,503,503,503,503,503,503,503,503,
+503,503,503,503,503,503,503,503,503,503,503,504,504,504,505,505,
+505,503,503,503,503,503,503,503,503,163,163,163,163,163,163,163,
 
 /* block 44 */
-505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
-505,505,506,506,507,508,163,163,163,163,163,163,163,163,163,505,
-509,509,509,509,509,509,509,509,509,509,509,509,509,509,509,509,
-509,509,510,510,511,512,512,163,163,163,163,163,163,163,163,163,
-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
-513,513,514,514,163,163,163,163,163,163,163,163,163,163,163,163,
-515,515,515,515,515,515,515,515,515,515,515,515,515,163,515,515,
-515,163,516,516,163,163,163,163,163,163,163,163,163,163,163,163,
+506,506,506,506,506,506,506,506,506,506,506,506,506,506,506,506,
+506,506,507,507,508,509,163,163,163,163,163,163,163,163,163,506,
+510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,
+510,510,511,511,512,513,513,163,163,163,163,163,163,163,163,163,
+514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
+514,514,515,515,163,163,163,163,163,163,163,163,163,163,163,163,
+516,516,516,516,516,516,516,516,516,516,516,516,516,163,516,516,
+516,163,517,517,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 45 */
-517,517,517,517,517,517,517,517,517,517,517,517,517,517,517,517,
-517,517,517,517,517,517,517,517,517,517,517,517,517,517,517,517,
-517,517,517,518,518,517,517,517,517,517,517,517,517,517,517,517,
-517,517,517,517,519,519,520,521,521,521,521,521,521,521,520,520,
-520,520,520,520,520,520,521,520,520,522,522,522,522,522,522,522,
-522,522,523,522,524,524,524,525,526,526,524,527,517,522,163,163,
-528,528,528,528,528,528,528,528,528,528,163,163,163,163,163,163,
+518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,
+518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,
+518,518,518,519,519,518,518,518,518,518,518,518,518,518,518,518,
+518,518,518,518,520,520,521,522,522,522,522,522,522,522,521,521,
+521,521,521,521,521,521,522,521,521,523,523,523,523,523,523,523,
+523,523,524,523,525,525,525,526,527,527,525,528,518,523,163,163,
 529,529,529,529,529,529,529,529,529,529,163,163,163,163,163,163,
+530,530,530,530,530,530,530,530,530,530,163,163,163,163,163,163,
 
 /* block 46 */
-530,530,531,532,533,531,534,530,533,535,536,537,537,537,538,537,
-539,539,539,539,539,539,539,539,539,539,163,163,163,163,163,163,
-540,540,540,540,540,540,540,540,540,540,540,540,540,540,540,540,
-540,540,540,540,540,540,540,540,540,540,540,540,540,540,540,540,
-540,540,540,541,540,540,540,540,540,540,540,540,540,540,540,540,
-540,540,540,540,540,540,540,540,540,540,540,540,540,540,540,540,
-540,540,540,540,540,540,540,540,540,540,540,540,540,540,540,540,
-540,540,540,540,540,540,540,540,540,163,163,163,163,163,163,163,
+531,531,532,533,534,532,535,531,534,536,537,538,538,538,539,538,
+540,540,540,540,540,540,540,540,540,540,163,163,163,163,163,163,
+541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,
+541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,
+541,541,541,542,541,541,541,541,541,541,541,541,541,541,541,541,
+541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,
+541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,
+541,541,541,541,541,541,541,541,541,163,163,163,163,163,163,163,
 
 /* block 47 */
-540,540,540,540,540,542,542,540,540,540,540,540,540,540,540,540,
-540,540,540,540,540,540,540,540,540,540,540,540,540,540,540,540,
-540,540,540,540,540,540,540,540,540,543,540,163,163,163,163,163,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-495,495,495,495,495,495,163,163,163,163,163,163,163,163,163,163,
+541,541,541,541,541,543,543,541,541,541,541,541,541,541,541,541,
+541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,
+541,541,541,541,541,541,541,541,541,544,541,163,163,163,163,163,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+496,496,496,496,496,496,163,163,163,163,163,163,163,163,163,163,
 
 /* block 48 */
-544,544,544,544,544,544,544,544,544,544,544,544,544,544,544,544,
-544,544,544,544,544,544,544,544,544,544,544,544,544,544,544,163,
-545,545,545,546,546,546,546,545,545,546,546,546,163,163,163,163,
-546,546,545,546,546,546,546,546,546,547,547,547,163,163,163,163,
-548,163,163,163,549,549,550,550,550,550,550,550,550,550,550,550,
-551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,
-551,551,551,551,551,551,551,551,551,551,551,551,551,551,163,163,
-551,551,551,551,551,163,163,163,163,163,163,163,163,163,163,163,
+545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
+545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,163,
+546,546,546,547,547,547,547,546,546,547,547,547,163,163,163,163,
+547,547,546,547,547,547,547,547,547,548,548,548,163,163,163,163,
+549,163,163,163,550,550,551,551,551,551,551,551,551,551,551,551,
+552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
+552,552,552,552,552,552,552,552,552,552,552,552,552,552,163,163,
+552,552,552,552,552,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 49 */
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,163,163,163,163,
-552,552,552,552,552,553,553,553,552,552,553,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,163,163,163,163,163,163,
-554,554,554,554,554,554,554,554,554,554,555,163,163,163,556,556,
-557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
-557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,
+553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,
+553,553,553,553,553,553,553,553,553,553,553,553,163,163,163,163,
+553,553,553,553,553,554,554,554,553,553,554,553,553,553,553,553,
+553,553,553,553,553,553,553,553,553,553,163,163,163,163,163,163,
+555,555,555,555,555,555,555,555,555,555,556,163,163,163,557,557,
+558,558,558,558,558,558,558,558,558,558,558,558,558,558,558,558,
+558,558,558,558,558,558,558,558,558,558,558,558,558,558,558,558,
 
 /* block 50 */
-558,558,558,558,558,558,558,558,558,558,558,558,558,558,558,558,
-558,558,558,558,558,558,558,559,559,560,560,559,163,163,561,561,
-562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,
-562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,
-562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,
-562,562,562,562,562,563,564,563,564,564,564,564,564,564,564,163,
-565,566,564,566,566,564,564,564,564,564,564,564,564,563,563,563,
-563,563,563,564,564,567,567,567,567,567,567,567,567,163,163,567,
+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,
+559,559,559,559,559,559,559,560,560,561,561,560,163,163,562,562,
+563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,
+563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,
+563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,
+563,563,563,563,563,564,565,564,565,565,565,565,565,565,565,163,
+566,567,565,567,567,565,565,565,565,565,565,565,565,564,564,564,
+564,564,564,565,565,568,568,568,568,568,568,568,568,163,163,568,
 
 /* block 51 */
-568,568,568,568,568,568,568,568,568,568,163,163,163,163,163,163,
-568,568,568,568,568,568,568,568,568,568,163,163,163,163,163,163,
-569,569,569,569,569,569,569,570,571,571,571,571,569,569,163,163,
-154,154,154,154,154,154,154,154,154,154,154,154,154,154,572,573,
-573,154,154,154,154,154,154,154,154,154,154,154,573,573,573,163,
+569,569,569,569,569,569,569,569,569,569,163,163,163,163,163,163,
+569,569,569,569,569,569,569,569,569,569,163,163,163,163,163,163,
+570,570,570,570,570,570,570,571,572,572,572,572,570,570,163,163,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,573,574,
+574,154,154,154,154,154,154,154,154,154,154,154,574,574,574,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 52 */
-574,574,574,574,575,576,576,576,576,576,576,576,576,576,576,576,
-576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,
-576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,
-576,576,576,576,577,578,574,574,574,574,574,575,574,575,575,575,
-575,575,574,575,579,576,576,576,576,576,576,576,576,163,163,163,
-580,580,580,580,580,580,580,580,580,580,581,581,582,583,581,581,
-582,584,584,584,584,584,584,584,584,584,584,577,577,577,577,577,
-577,577,577,577,584,584,584,584,584,584,584,584,584,581,581,163,
+575,575,575,575,576,577,577,577,577,577,577,577,577,577,577,577,
+577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
+577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
+577,577,577,577,578,579,575,575,575,575,575,576,575,576,576,576,
+576,576,575,576,580,577,577,577,577,577,577,577,577,163,163,163,
+581,581,581,581,581,581,581,581,581,581,582,582,583,584,582,582,
+583,585,585,585,585,585,585,585,585,585,585,578,578,578,578,578,
+578,578,578,578,585,585,585,585,585,585,585,585,585,582,582,163,
 
 /* block 53 */
-585,585,586,587,587,587,587,587,587,587,587,587,587,587,587,587,
-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
-587,586,585,585,585,585,586,586,585,585,588,589,585,585,587,587,
-590,590,590,590,590,590,590,590,590,590,587,587,587,587,587,587,
-591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,
-591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,
-591,591,591,591,591,591,592,593,594,594,593,593,593,594,593,594,
-594,594,595,595,163,163,163,163,163,163,163,163,596,596,596,596,
+586,586,587,588,588,588,588,588,588,588,588,588,588,588,588,588,
+588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,
+588,587,586,586,586,586,587,587,586,586,589,590,586,586,588,588,
+591,591,591,591,591,591,591,591,591,591,588,588,588,588,588,588,
+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
+592,592,592,592,592,592,593,594,595,595,594,594,594,595,594,595,
+595,595,596,596,163,163,163,163,163,163,163,163,597,597,597,597,
 
 /* block 54 */
-597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,
-597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,
-597,597,597,597,598,598,598,598,598,598,598,598,599,599,599,599,
-599,599,599,599,598,598,600,601,163,163,163,602,602,603,603,603,
-604,604,604,604,604,604,604,604,604,604,163,163,163,597,597,597,
-605,605,605,605,605,605,605,605,605,605,606,606,606,606,606,606,
-606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,
-606,606,606,606,606,606,606,606,607,607,607,608,607,607,609,609,
+598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,
+598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,
+598,598,598,598,599,599,599,599,599,599,599,599,600,600,600,600,
+600,600,600,600,599,599,601,602,163,163,163,603,603,604,604,604,
+605,605,605,605,605,605,605,605,605,605,163,163,163,598,598,598,
+606,606,606,606,606,606,606,606,606,606,607,607,607,607,607,607,
+607,607,607,607,607,607,607,607,607,607,607,607,607,607,607,607,
+607,607,607,607,607,607,607,607,608,608,608,609,608,608,610,610,
 
 /* block 55 */
-610,611,612,613,614,615,616,617,618,163,163,163,163,163,163,163,
-619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,
-619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,
-619,619,619,619,619,619,619,619,619,619,619,163,163,619,619,619,
-620,620,620,620,620,620,620,620,163,163,163,163,163,163,163,163,
-621,622,621,623,622,624,624,625,624,625,626,622,625,625,622,622,
-625,627,622,622,622,622,622,622,622,628,629,630,630,624,630,630,
-630,630,631,632,633,629,629,634,635,635,636,163,163,163,163,163,
+611,612,613,614,615,616,617,618,619,163,163,163,163,163,163,163,
+620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,
+620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,
+620,620,620,620,620,620,620,620,620,620,620,163,163,620,620,620,
+621,621,621,621,621,621,621,621,163,163,163,163,163,163,163,163,
+622,623,622,624,623,625,625,626,625,626,627,623,626,626,623,623,
+626,628,623,623,623,623,623,623,623,629,630,631,631,625,631,631,
+631,631,632,633,634,630,630,635,636,636,637,163,163,163,163,163,
 
 /* block 56 */
  70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
  70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70,221,221,221,221,221,637,147,147,147,147,
+ 70, 70, 70, 70, 70, 70,221,221,221,221,221,638,147,147,147,147,
 147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
 147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
-147,147,147,147,147,147,147,147,147,147,147,147,147,638,638,638,
-638,638,148,147,147,147,638,638,638,638,638, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70,639,640, 70, 70, 70,641, 70, 70,
+147,147,147,147,147,147,147,147,147,147,147,147,147,639,639,639,
+639,639,148,147,147,147,639,639,639,639,639, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,640,641, 70, 70, 70,642, 70, 70,
 
 /* block 57 */
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,642, 70,
- 70, 70, 70, 70, 70, 70,643, 70, 70, 70, 70,644,644,644,644,644,
-644,644,644,644,645,644,644,644,645,644,644,644,644,644,644,644,
-644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,646,
-647,647,158,158,154,154,154,154,154,154,154,154,154,154,154,154,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,643, 70,
+ 70, 70, 70, 70, 70, 70,644, 70, 70, 70, 70,645,645,645,645,645,
+645,645,645,645,646,645,645,645,646,645,645,645,645,645,645,645,
+645,645,645,645,645,645,645,645,645,645,645,645,645,645,645,647,
+648,648,158,158,154,154,154,154,154,154,154,154,154,154,154,154,
 158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
-158,158,158,158,158,158,158,573,573,573,573,573,573,573,573,573,
-573,573,573,573,573,154,154,154,648,154,649,154,154,154,154,154,
+158,158,158,158,158,158,158,574,574,574,574,574,574,574,574,574,
+574,574,574,574,574,154,154,154,649,154,650,154,154,154,154,154,
 
 /* block 58 */
  65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
@@ -2972,12 +2986,12 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
  65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
  65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
  65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
-650,651, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
+651,652, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
  65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
 
 /* block 59 */
  65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
- 65, 66, 65, 66, 65, 66, 69, 69, 69, 69,652,653, 70, 70,654, 70,
+ 65, 66, 65, 66, 65, 66, 69, 69, 69, 69,653,654, 70, 70,655, 70,
  65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
  65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
  65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 67, 65, 66, 65, 66,
@@ -2986,123 +3000,123 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
  65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
 
 /* block 60 */
-655,655,655,655,655,655,655,655,656,656,656,656,656,656,656,656,
-655,655,655,655,655,655,163,163,656,656,656,656,656,656,163,163,
-655,655,655,655,655,655,655,655,656,656,656,656,656,656,656,656,
-655,655,655,655,655,655,655,655,656,656,656,656,656,656,656,656,
-655,655,655,655,655,655,163,163,656,656,656,656,656,656,163,163,
-173,655,173,655,173,655,173,655,163,656,163,656,163,656,163,656,
-655,655,655,655,655,655,655,655,656,656,656,656,656,656,656,656,
-657,657,658,658,658,658,659,659,660,660,661,661,662,662,163,163,
+656,656,656,656,656,656,656,656,657,657,657,657,657,657,657,657,
+656,656,656,656,656,656,163,163,657,657,657,657,657,657,163,163,
+656,656,656,656,656,656,656,656,657,657,657,657,657,657,657,657,
+656,656,656,656,656,656,656,656,657,657,657,657,657,657,657,657,
+656,656,656,656,656,656,163,163,657,657,657,657,657,657,163,163,
+173,656,173,656,173,656,173,656,163,657,163,657,163,657,163,657,
+656,656,656,656,656,656,656,656,657,657,657,657,657,657,657,657,
+658,658,659,659,659,659,660,660,661,661,662,662,663,663,163,163,
 
 /* block 61 */
-663,663,663,663,663,663,663,663,664,664,664,664,664,664,664,664,
-663,663,663,663,663,663,663,663,664,664,664,664,664,664,664,664,
-663,663,663,663,663,663,663,663,664,664,664,664,664,664,664,664,
-655,655,665,666,665,163,173,665,656,656,667,667,668,162,669,162,
-162,162,665,666,665,163,173,665,670,670,670,670,668,162,162,162,
-655,655,173,173,163,163,173,173,656,656,671,671,163,162,162,162,
-655,655,173,173,173,215,173,173,656,656,672,672,220,162,162,162,
-163,163,665,666,665,163,173,665,673,673,674,674,668,162,162,163,
+664,664,664,664,664,664,664,664,665,665,665,665,665,665,665,665,
+664,664,664,664,664,664,664,664,665,665,665,665,665,665,665,665,
+664,664,664,664,664,664,664,664,665,665,665,665,665,665,665,665,
+656,656,666,667,666,163,173,666,657,657,668,668,669,162,670,162,
+162,162,666,667,666,163,173,666,671,671,671,671,669,162,162,162,
+656,656,173,173,163,163,173,173,657,657,672,672,163,162,162,162,
+656,656,173,173,173,215,173,173,657,657,673,673,220,162,162,162,
+163,163,666,667,666,163,173,666,674,674,675,675,669,162,162,163,
 
 /* block 62 */
-675,675,675,675,675,675,675,675,675,675,675, 51,676,677,678,679,
-680,680,680,680,680,680,681, 43,682,683,684,685,685,686,684,685,
- 43, 43, 43, 43,687, 43, 43,687,688,689,690,691,692,693,694,695,
-696,696,697,697,697, 43, 43, 43, 43, 49, 57, 43,698,699, 43,700,
-701, 43, 43, 43,702,703,704,699,699,698, 43, 43, 43, 43, 43, 43,
- 43, 43, 50,705,700, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,675,
- 51,706,706,706,706,707,708,709,710,711,712,712,712,712,712,712,
- 54,645,163,163, 54, 54, 54, 54, 54, 54,713,714,715,716,717,644,
+676,676,676,676,676,676,676,676,676,676,676, 51,677,678,679,680,
+681,681,681,681,681,681,682, 43,683,684,685,686,686,687,685,686,
+ 43, 43, 43, 43,688, 43, 43,688,689,690,691,692,693,694,695,696,
+697,697,698,698,698, 43, 43, 43, 43, 49, 57, 43,699,700, 43,701,
+702, 43, 43, 43,703,704,705,700,700,699, 43, 43, 43, 43, 43, 43,
+ 43, 43, 50,706,701, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,676,
+ 51,707,707,707,707,708,709,710,711,712,713,713,713,713,713,713,
+ 54,646,163,163, 54, 54, 54, 54, 54, 54,714,715,716,717,718,645,
 
 /* block 63 */
- 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,713,714,715,716,717,163,
-644,644,644,644,644,644,644,644,644,644,644,644,644,163,163,163,
-431,431,431,431,431,431,431,431,431,431,431,431,431,431,431,431,
-431,431,431,431,431,431,431,431,431,431,431,431,431,431,431,431,
-431,718,718,718,718,718,718,718,718,718,718,718,718,718,718,718,
-719,719,719,719,719,719,719,719,719,719,719,719,719,720,720,720,
-720,719,720,721,720,719,719,158,158,158,158,719,719,719,719,719,
-722,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,714,715,716,717,718,163,
+645,645,645,645,645,645,645,645,645,645,645,645,645,163,163,163,
+430,430,430,430,430,430,430,430,430,430,430,430,430,430,430,430,
+430,430,430,430,430,430,430,430,430,430,430,430,430,430,430,430,
+430,719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,
+720,720,720,720,720,720,720,720,720,720,720,720,720,721,721,721,
+721,720,721,722,721,720,720,158,158,158,158,720,720,720,720,720,
+723,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 64 */
-723,723,724,723,723,723,723,724,723,723,725,724,724,724,725,725,
-724,724,724,725,723,724,723,723,726,724,724,724,724,724,723,723,
-723,723,727,723,724,723,728,723,724,729,730,731,724,724,732,725,
-724,724,733,724,725,734,734,734,734,735,723,723,725,725,724,724,
-715,715,715,715,715,724,725,725,736,736,723,715,723,723,737,460,
+724,724,725,724,724,724,724,725,724,724,726,725,725,725,726,726,
+725,725,725,726,724,725,724,724,727,725,725,725,725,725,724,724,
+724,724,728,724,725,724,729,724,725,730,731,732,725,725,733,726,
+725,725,734,725,726,735,735,735,735,736,724,724,726,726,725,725,
+716,716,716,716,716,725,726,726,737,737,724,716,724,724,738,461,
  58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
-738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,
 739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,
+740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,
 
 /* block 65 */
-740,740,740, 65, 66,740,740,740,740, 58,723,723,163,163,163,163,
- 50, 50, 50, 50,741,742,742,742,742,742, 50, 50,743,743,743,743,
- 50,743,743, 50,743,743, 50,743, 45,742,742,743,743,743, 50, 45,
-743,743, 45, 45, 45, 45,743,743, 45, 45, 45, 45,743,743,743,743,
-743,743,743,743,743,743,743,743,743,743,743,743,743,743, 50, 50,
-743,743, 50,743, 50,743,743,743,743,743,743,743, 45,743, 45, 45,
- 45, 45, 45, 45,743,743, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+741,741,741, 65, 66,741,741,741,741, 58,724,724,163,163,163,163,
+ 50, 50, 50, 50,742,743,743,743,743,743, 50, 50,744,744,744,744,
+ 50,744,744, 50,744,744, 50,744, 45,743,743,744,744,744, 50, 45,
+744,744, 45, 45, 45, 45,744,744, 45, 45, 45, 45,744,744,744,744,
+744,744,744,744,744,744,744,744,744,744,744,744,744,744, 50, 50,
+744,744, 50,744, 50,744,744,744,744,744,744,744, 45,744, 45, 45,
+ 45, 45, 45, 45,744,744, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
  45, 45, 45, 45, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
 
 /* block 66 */
- 50, 50, 50, 50, 50, 50, 50, 50,744,744,744,744,744,744, 50, 50,
- 50, 50,745, 53, 50,744, 50, 50, 50, 50, 50, 50, 50, 50, 50,744,
-744,744,744, 50,744, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,744,744, 50, 50,
- 50, 50, 50,744, 50,744, 50, 50, 50, 50, 50, 50,744, 50, 50, 50,
- 50, 50,744,744,744,744, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50,744,744,744,744,744,744,744,744, 50, 50,744,744,
-744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,
+ 50, 50, 50, 50, 50, 50, 50, 50,745,745,745,745,745,745, 50, 50,
+ 50, 50,746, 53, 50,745, 50, 50, 50, 50, 50, 50, 50, 50, 50,745,
+745,745,745, 50,745, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,745,745, 50, 50,
+ 50, 50, 50,745, 50,745, 50, 50, 50, 50, 50, 50,745, 50, 50, 50,
+ 50, 50,745,745,745,745, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50,745,745,745,745,745,745,745,745, 50, 50,745,745,
+745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,
 
 /* block 67 */
-744,744,744,744,744,744,744,744,744,744,744,744, 50, 50, 50,744,
-744,744,744, 50, 50, 50, 50, 50,744, 50, 50, 50, 50, 50, 50, 50,
- 50, 50,744,744, 50, 50,744, 50,744,744, 50,744, 50, 50, 50, 50,
-744,744,744,744,744,744,744,744,744, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50,744,744,744,744,744, 50, 50,
-744,744, 50, 50, 50, 50,744,744,744,744,744,744,744,744,744,744,
-744,744,744,744,744,744,744,744,744,744,744,744,744,744, 50, 50,
-744,744,744,744,744, 50,744,744, 50, 50,744,744,744,744,744, 50,
+745,745,745,745,745,745,745,745,745,745,745,745, 50, 50, 50,745,
+745,745,745, 50, 50, 50, 50, 50,745, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50,745,745, 50, 50,745, 50,745,745, 50,745, 50, 50, 50, 50,
+745,745,745,745,745,745,745,745,745, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50,745,745,745,745,745, 50, 50,
+745,745, 50, 50, 50, 50,745,745,745,745,745,745,745,745,745,745,
+745,745,745,745,745,745,745,745,745,745,745,745,745,745, 50, 50,
+745,745,745,745,745, 50,745,745, 50, 50,745,745,745,745,745, 50,
 
 /* block 68 */
- 45, 45, 45, 45, 45, 45, 45, 45,746,747,746,747, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,748,748, 45, 45, 45, 45,
- 50, 50, 45, 45, 45, 45, 45, 45, 47,749,750, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45,751,751,751,751,751,751,751,751,751,751,
-751,751,751,751,751,751,751,751,751,751,751,751,751,751,751,751,
-751,751,751,751,751,751,751,751,751,751,751,751,751,751,751,751,
-751,751,751,751,751,751,751,751,751,751,751,751,751,751,751,751,
-751,751,751,751,751,751,751,751,751,751,751, 45, 50, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,747,748,747,748, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,749,749, 45, 45, 45, 45,
+ 50, 50, 45, 45, 45, 45, 45, 45, 47,750,751, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45,752,752,752,752,752,752,752,752,752,752,
+752,752,752,752,752,752,752,752,752,752,752,752,752,752,752,752,
+752,752,752,752,752,752,752,752,752,752,752,752,752,752,752,752,
+752,752,752,752,752,752,752,752,752,752,752,752,752,752,752,752,
+752,752,752,752,752,752,752,752,752,752,752, 45, 50, 45, 45, 45,
 
 /* block 69 */
- 45, 45, 45, 45, 45, 45, 45, 45,752, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45,751, 45, 45, 45, 45, 45, 50, 50, 50, 50, 50,
+ 45, 45, 45, 45, 45, 45, 45, 45,753, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45,752, 45, 45, 45, 45, 45, 50, 50, 50, 50, 50,
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50,743,743, 45,743, 45, 45, 45, 45, 45, 45, 45, 45,
+ 50, 50, 50, 50,744,744, 45,744, 45, 45, 45, 45, 45, 45, 45, 45,
  45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 47,
-743, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 50, 50, 50, 50,
- 50, 50,743, 45, 45, 45, 45, 45, 45,748,748,748,748, 47, 47, 47,
-748, 47, 47,748, 45, 45, 45, 45, 47, 47, 47, 45, 45, 45, 45, 45,
+744, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 50, 50, 50, 50,
+ 50, 50,744, 45, 45, 45, 45, 45, 45,749,749,749,749, 47, 47, 47,
+749, 47, 47,749, 45, 45, 45, 45, 47, 47, 47, 45, 45, 45, 45, 45,
 
 /* block 70 */
  45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
  45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45,753,753,753,753,753,753,753,753,753,
-753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,
- 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,753,753,753,753,753,
-753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,
+ 45, 45, 45, 45, 45, 45, 45,754,754,754,754,754,754,754,754,754,
+754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,754,754,754,754,754,
+754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,
  58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
  58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
 
 /* block 71 */
  58, 58, 58, 58, 58, 58, 58, 58, 54, 54, 54, 54, 54, 54, 54, 54,
- 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,754,754,754,754,754,754,754,754,754,754,
-754,754,755,754,754,754,754,754,754,754,754,754,754,754,754,754,
-756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,
-756,756,756,756,756,756,756,756,756,756, 58, 58, 58, 58, 58, 58,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,755,755,755,755,755,755,755,755,755,755,
+755,755,756,755,755,755,755,755,755,755,755,755,755,755,755,755,
+757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,
+757,757,757,757,757,757,757,757,757,757, 58, 58, 58, 58, 58, 58,
  58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
 
 /* block 72 */
@@ -3118,132 +3132,132 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 /* block 73 */
  45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
  45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-743,743, 45, 45, 45, 45, 45, 45, 45, 45, 47, 47, 45, 45,743,743,
-743,743,743,743,743,743,742, 50, 45, 45, 45, 45,743,743,743,743,
-742, 50, 45, 45, 45, 45,743,743, 45, 45,743,743, 45, 45, 45,743,
-743,743,743,743, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45,743, 45,743, 45, 45,743,743,743,743,743,743, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 45, 50, 50, 50,741,741,757,757, 50,
+744,744, 45, 45, 45, 45, 45, 45, 45, 45, 47, 47, 45, 45,744,744,
+744,744,744,744,744,744,743, 50, 45, 45, 45, 45,744,744,744,744,
+743, 50, 45, 45, 45, 45,744,744, 45, 45,744,744, 45, 45, 45,744,
+744,744,744,744, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45,744, 45,744, 45, 45,744,744,744,744,744,744, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 50, 50, 50,742,742,758,758, 50,
 
 /* block 74 */
- 47, 47, 47, 47, 47,758,743,752,752,752,752,752,752,752, 47,752,
-752, 47,752, 45,748,748,752,752, 47,752,752,752,752,759,752,752,
- 47,752, 47, 47,752,752, 47,752,752,752, 47,752,752,752, 47, 47,
-752,752,752,752,752,752,752,752, 47, 47, 47,752,752,752,752,752,
-742,752,742,752,752,752,752,752,748,748,748,748,748,748,748,748,
-748,748,748,748,752,752,752,752,752,752,752,752,752,752,752, 47,
-742,758,758,742,752, 47, 47,752, 47,752,752,752,752,758,758,760,
-752,752,752,752,752,752,752,752,752,752,752, 47,752,752, 47,748,
+ 47, 47, 47, 47, 47,759,744,753,753,753,753,753,753,753, 47,753,
+753, 47,753, 45,749,749,753,753, 47,753,753,753,753,760,753,753,
+ 47,753, 47, 47,753,753, 47,753,753,753, 47,753,753,753, 47, 47,
+753,753,753,753,753,753,753,753, 47, 47, 47,753,753,753,753,753,
+743,753,743,753,753,753,753,753,749,749,749,749,749,749,749,749,
+749,749,749,749,753,753,753,753,753,753,753,753,753,753,753, 47,
+743,759,759,743,753, 47, 47,753, 47,753,753,753,753,759,759,761,
+753,753,753,753,753,753,753,753,753,753,753, 47,753,753, 47,749,
 
 /* block 75 */
-752,752,752,752,752,752, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-752,752, 47,748, 47, 47, 47, 47,752, 47,752, 47, 47,752,752,752,
- 47,748,752,752,752,752,752, 47,752,752,748,748,761,752,752,752,
- 47, 47,752,752,752,752,752,752,752,752,752,752,752,748,748,752,
-752,752,752,752,748,748,752,752, 47,752,752,752,752,752,748, 47,
-752, 47,752, 47,748,752,752,752,752,752,752,752,752,752,752,752,
-752,752,752,752,752,752,752,752,752, 47,748,752,752,752,752,752,
- 47, 47,748,748, 47,748,752, 47, 47,759,748,752,752,748,752,752,
+753,753,753,753,753,753, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+753,753, 47,749, 47, 47, 47, 47,753, 47,753, 47, 47,753,753,753,
+ 47,749,753,753,753,753,753, 47,753,753,749,749,762,753,753,753,
+ 47, 47,753,753,753,753,753,753,753,753,753,753,753,749,749,753,
+753,753,753,753,749,749,753,753, 47,753,753,753,753,753,749, 47,
+753, 47,753, 47,749,753,753,753,753,753,753,753,753,753,753,753,
+753,753,753,753,753,753,753,753,753, 47,749,753,753,753,753,753,
+ 47, 47,749,749, 47,749,753, 47, 47,760,749,753,753,749,753,753,
 
 /* block 76 */
-752,752, 47,752,752,748, 45, 45, 47, 47,762,762,759,759,752, 47,
-752,752, 47, 45, 47, 45, 47, 45, 45, 45, 45, 45, 45, 47, 45, 45,
- 45, 47, 45, 45, 45, 45, 45, 45,748, 45, 45, 45, 45, 45, 45, 45,
+753,753, 47,753,753,749, 45, 45, 47, 47,763,763,760,760,753, 47,
+753,753, 47, 45, 47, 45, 47, 45, 45, 45, 45, 45, 45, 47, 45, 45,
+ 45, 47, 45, 45, 45, 45, 45, 45,749, 45, 45, 45, 45, 45, 45, 45,
  45, 45, 45, 47, 47, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 47, 45, 45, 47, 45, 45, 45, 45,748, 45,748, 45,
- 45, 45, 45,748,748,748, 45,748, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 47, 47,752,752,752,703,704,703,704,703,704,703,704,
-703,704,703,704,703,704, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 45, 45, 45, 45, 47, 45, 45, 47, 45, 45, 45, 45,749, 45,749, 45,
+ 45, 45, 45,749,749,749, 45,749, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 47, 47,753,753,753,704,705,704,705,704,705,704,705,
+704,705,704,705,704,705, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
 
 /* block 77 */
  58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
- 58, 58, 58, 58, 45,748,748,748, 45, 45, 45, 45, 45, 45, 45, 45,
+ 58, 58, 58, 58, 45,749,749,749, 45, 45, 45, 45, 45, 45, 45, 45,
  45, 47, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-748, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,748,
- 50, 50, 50,744,744,746,747, 50,744,744, 50,744, 50,744, 50, 50,
- 50, 50, 50, 50, 50,744,744, 50, 50, 50, 50, 50,744,744,744, 50,
- 50, 50,744,744,744,744,746,747,746,747,746,747,746,747,746,747,
+749, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,749,
+ 50, 50, 50,745,745,747,748, 50,745,745, 50,745, 50,745, 50, 50,
+ 50, 50, 50, 50, 50,745,745, 50, 50, 50, 50, 50,745,745,745, 50,
+ 50, 50,745,745,745,745,747,748,747,748,747,748,747,748,747,748,
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
 
 /* block 78 */
-763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,
-763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,
-763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,
-763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,
-763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,
-763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,
-763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,
-763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,
+764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,
+764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,
+764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,
+764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,
+764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,
+764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,
+764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,
+764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,
 
 /* block 79 */
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50,741,741, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50,742,742, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
 
 /* block 80 */
- 50, 50, 50,746,747,746,747,746,747,746,747,746,747,746,747,746,
-747,746,747,746,747,746,747,746,747, 50, 50,744, 50, 50, 50, 50,
-744, 50, 50,744,744,744, 50, 50,744,744,744,744,744,744,744,744,
- 50, 50, 50, 50, 50, 50, 50, 50,744, 50, 50, 50, 50, 50, 50, 50,
-744,744, 50, 50,744,744, 50, 50, 50, 50, 50, 50, 50, 50, 50,744,
-744,744,744, 50,744,744, 50, 50,746,747,746,747, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50,744,744, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50,744, 50, 50,744,744, 50, 50,746,747, 50, 50,
+ 50, 50, 50,747,748,747,748,747,748,747,748,747,748,747,748,747,
+748,747,748,747,748,747,748,747,748, 50, 50,745, 50, 50, 50, 50,
+745, 50, 50,745,745,745, 50, 50,745,745,745,745,745,745,745,745,
+ 50, 50, 50, 50, 50, 50, 50, 50,745, 50, 50, 50, 50, 50, 50, 50,
+745,745, 50, 50,745,745, 50, 50, 50, 50, 50, 50, 50, 50, 50,745,
+745,745,745, 50,745,745, 50, 50,747,748,747,748, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50,745,745, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50,745, 50, 50,745,745, 50, 50,747,748, 50, 50,
 
 /* block 81 */
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,744,744,744,744, 50,
- 50, 50, 50, 50,744,744, 50, 50, 50, 50, 50, 50,744,744, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,745,745,745,745, 50,
+ 50, 50, 50, 50,745,745, 50, 50, 50, 50, 50, 50,745,745, 50, 50,
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50,744,744, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50,744,744,744,744,744,744,744,
+ 50, 50, 50, 50,745,745, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50,745,745,745,745,745,745,745,
 
 /* block 82 */
-744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,
-744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,
-744,744,744, 50, 50, 50,744,744,744,744,744,744,744,744, 50,744,
-744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,
-744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,
-744,744,744,744,744,744,744, 50, 50, 50, 50, 50, 50, 50,744, 50,
- 50, 50, 50,744,744,744, 50, 50, 50, 50, 50, 50,744,744,744, 50,
- 50, 50, 50, 50, 50, 50, 50,744,744,744,744, 50, 50, 50, 50, 50,
+745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,
+745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,
+745,745,745, 50, 50, 50,745,745,745,745,745,745,745,745, 50,745,
+745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,
+745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,
+745,745,745,745,745,745,745, 50, 50, 50, 50, 50, 50, 50,745, 50,
+ 50, 50, 50,745,745,745, 50, 50, 50, 50, 50, 50,745,745,745, 50,
+ 50, 50, 50, 50, 50, 50, 50,745,745,745,745, 50, 50, 50, 50, 50,
 
 /* block 83 */
  45, 45, 45, 45, 45, 47, 47, 47, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,748,748, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,749,749, 45, 45, 45,
  45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
  50, 50, 50, 50, 50, 45, 45, 50, 50, 50, 50, 50, 50, 45, 45, 45,
-748, 45, 45, 45, 45,748, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+749, 45, 45, 45, 45,749, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
  45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45,753,753, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45,754,754, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
 
 /* block 84 */
  45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45,753, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45,754, 45, 45, 45, 45, 45, 45, 45, 45, 45,
  45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
  45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
  45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
  45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
  45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,764, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,765, 45,
 
 /* block 85 */
-765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,
-765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,
-765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,
 766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,
 766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,
 766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,
- 65, 66,767,768,769,770,771, 65, 66, 65, 66, 65, 66,772,773,774,
-775, 70, 65, 66, 70, 65, 66, 70, 70, 70, 70, 70,645,644,776,776,
+767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,
+767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,
+767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,
+ 65, 66,768,769,770,771,772, 65, 66, 65, 66, 65, 66,773,774,775,
+776, 70, 65, 66, 70, 65, 66, 70, 70, 70, 70, 70,646,645,777,777,
 
 /* block 86 */
 211,212,211,212,211,212,211,212,211,212,211,212,211,212,211,212,
@@ -3252,248 +3266,248 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 211,212,211,212,211,212,211,212,211,212,211,212,211,212,211,212,
 211,212,211,212,211,212,211,212,211,212,211,212,211,212,211,212,
 211,212,211,212,211,212,211,212,211,212,211,212,211,212,211,212,
-211,212,211,212,777,778,778,778,778,778,778,211,212,211,212,779,
-779,779,211,212,163,163,163,163,163,780,780,780,780,781,780,780,
+211,212,211,212,778,779,779,779,779,779,779,211,212,211,212,780,
+780,780,211,212,163,163,163,163,163,781,781,781,781,782,781,781,
 
 /* block 87 */
-782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,
-782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,
-782,782,782,782,782,782,163,782,163,163,163,163,163,782,163,163,
-783,783,783,783,783,783,783,783,783,783,783,783,783,783,783,783,
 783,783,783,783,783,783,783,783,783,783,783,783,783,783,783,783,
 783,783,783,783,783,783,783,783,783,783,783,783,783,783,783,783,
-783,783,783,783,783,783,783,783,163,163,163,163,163,163,163,784,
-785,163,163,163,163,163,163,163,163,163,163,163,163,163,163,786,
+783,783,783,783,783,783,163,783,163,163,163,163,163,783,163,163,
+784,784,784,784,784,784,784,784,784,784,784,784,784,784,784,784,
+784,784,784,784,784,784,784,784,784,784,784,784,784,784,784,784,
+784,784,784,784,784,784,784,784,784,784,784,784,784,784,784,784,
+784,784,784,784,784,784,784,784,163,163,163,163,163,163,163,785,
+786,163,163,163,163,163,163,163,163,163,163,163,163,163,163,787,
 
 /* block 88 */
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,163,163,163,163,163,163,163,163,163,
-483,483,483,483,483,483,483,163,483,483,483,483,483,483,483,163,
-483,483,483,483,483,483,483,163,483,483,483,483,483,483,483,163,
-483,483,483,483,483,483,483,163,483,483,483,483,483,483,483,163,
-483,483,483,483,483,483,483,163,483,483,483,483,483,483,483,163,
-787,787,787,787,787,787,787,787,787,787,787,787,787,787,787,787,
-787,787,787,787,787,787,787,787,787,787,787,787,787,787,787,787,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,163,163,163,163,163,163,163,163,163,
+484,484,484,484,484,484,484,163,484,484,484,484,484,484,484,163,
+484,484,484,484,484,484,484,163,484,484,484,484,484,484,484,163,
+484,484,484,484,484,484,484,163,484,484,484,484,484,484,484,163,
+484,484,484,484,484,484,484,163,484,484,484,484,484,484,484,163,
+788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,
+788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,
 
 /* block 89 */
- 43, 43,788,789,788,789, 43, 43, 43,788,789, 43,788,789, 43, 43,
- 43, 43, 43, 43, 43, 43, 43,680, 43, 43,680, 43,788,789, 43, 43,
-788,789,703,704,703,704,703,704,703,704, 43, 43, 43, 43,699,790,
- 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,680,680,699, 43, 43, 43,
-680,791,684,792, 43, 43, 43, 43, 43, 43, 43, 43,791, 43,791,791,
- 45, 45, 43,699,699,703,704,703,704,703,704,703,704,680,753,753,
-753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,
-753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,
+ 43, 43,789,790,789,790, 43, 43, 43,789,790, 43,789,790, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43,681, 43, 43,681, 43,789,790, 43, 43,
+789,790,704,705,704,705,704,705,704,705, 43, 43, 43, 43,700,791,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,681,681,700, 43, 43, 43,
+681,792,685,793, 43, 43, 43, 43, 43, 43, 43, 43,792, 43,792,792,
+ 45, 45, 43,700,700,704,705,704,705,704,705,704,705,681,754,754,
+754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,
+754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,
 
 /* block 90 */
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,163,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,163,163,163,163,163,163,163,163,163,163,163,163,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,163,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 91 */
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
 
 /* block 92 */
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,
-793,793,793,793,793,793,163,163,163,163,163,163,163,163,163,163,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,794,
+794,794,794,794,794,794,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-794,794,795,795,794,794,794,794,794,794,794,794,163,163,163,163,
+795,795,796,796,795,795,795,795,795,795,795,795,163,163,163,163,
 
 /* block 93 */
-675,796,797,798,723,799,800,801,802,803,802,803,804,805,804,805,
-802,803, 45,806,802,803,802,803,802,803,802,803,807,808,809,809,
- 45,801,801,801,801,801,801,801,801,801,810,810,810,810,811,811,
-812,813,813,813,813,813,723,814,801,801,801,815,816,817,818,818,
-163,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
+676,797,798,799,724,800,801,802,803,804,803,804,805,806,805,806,
+803,804, 45,807,803,804,803,804,803,804,803,804,808,809,810,810,
+ 45,802,802,802,802,802,802,802,802,802,811,811,811,811,812,812,
+813,814,814,814,814,814,724,815,802,802,802,816,817,818,819,819,
+163,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
 
 /* block 94 */
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,163,163,820,820,821,821,822,822,819,
-823,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,
-824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,
-824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,
-824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,
-824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,
-824,824,824,824,824,824,824,824,824,824,824,825,826,827,827,824,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,163,163,821,821,822,822,823,823,820,
+824,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,
+825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,
+825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,
+825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,
+825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,
+825,825,825,825,825,825,825,825,825,825,825,826,827,828,828,825,
 
 /* block 95 */
-163,163,163,163,163,828,828,828,828,828,828,828,828,828,828,828,
-828,828,828,828,828,828,828,828,828,828,828,828,828,828,828,828,
-828,828,828,828,828,828,828,828,828,828,828,828,828,828,828,828,
-163,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,
+163,163,163,163,163,829,829,829,829,829,829,829,829,829,829,829,
 829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,
 829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,
-829,829,829,829,830,829,829,829,829,829,829,829,829,829,829,829,
-829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,
+163,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,
+830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,
+830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,
+830,830,830,830,831,830,830,830,830,830,830,830,830,830,830,830,
+830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,
 
 /* block 96 */
-829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,163,
-831,831,832,832,832,832,831,831,831,831,831,831,831,831,831,831,
-828,828,828,828,828,828,828,828,828,828,828,828,828,828,828,828,
-828,828,828,828,828,828,828,828,828,828,828,828,828,828,828,828,
-818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,
-818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,
-818,818,818,818,163,163,163,163,163,163,163,163,163,163,163,163,
-824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,
+830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,163,
+832,832,833,833,833,833,832,832,832,832,832,832,832,832,832,832,
+829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,
+829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,
+819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
+819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
+819,819,819,819,163,163,163,163,163,163,163,163,163,163,163,163,
+825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,
 
 /* block 97 */
-833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,
-833,833,833,833,833,833,833,833,833,833,833,833,833,834,834,163,
-832,832,832,832,832,832,832,832,832,832,831,831,831,831,831,831,
-831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,
-831,831,831,831,831,831,831,831,835,835,835,835,835,835,835,835,
-723, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
-833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,
-833,833,833,833,833,833,833,833,833,833,833,833,834,834,834,460,
+834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,
+834,834,834,834,834,834,834,834,834,834,834,834,834,835,835,163,
+833,833,833,833,833,833,833,833,833,833,832,832,832,832,832,832,
+832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,
+832,832,832,832,832,832,832,832,836,836,836,836,836,836,836,836,
+724, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,
+834,834,834,834,834,834,834,834,834,834,834,834,835,835,835,461,
 
 /* block 98 */
-832,832,832,832,832,832,832,832,832,832,831,831,831,831,831,831,
-831,831,831,831,831,831,831,836,831,836,831,831,831,831,831,831,
-831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,
-831, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
-831,831,831,831,831,831,831,831,831,831,831,831,723,723,723,723,
-837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,
-837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,
-837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,831,
-
-/* block 99 */
-837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,
-837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,
-837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,
-837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,
-837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,
-837,837,837,837,837,837,837,837,831,831,831,831,831,831,831,831,
-831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,
-831,460,460,460,460,460,460,723,723,723,723,831,831,831,831,831,
-
-/* block 100 */
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,723,723,
-831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,
-831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,723,
-
-/* block 101 */
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
+833,833,833,833,833,833,833,833,833,833,832,832,832,832,832,832,
+832,832,832,832,832,832,832,837,832,837,832,832,832,832,832,832,
+832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,
+832, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+832,832,832,832,832,832,832,832,832,832,832,832,724,724,724,724,
 838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
 838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
+838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,832,
+
+/* block 99 */
 838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
 838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
 838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
 838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
 838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
+838,838,838,838,838,838,838,838,832,832,832,832,832,832,832,832,
+832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,
+832,461,461,461,461,461,461,724,724,724,724,832,832,832,832,832,
 
-/* block 102 */
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
+/* block 100 */
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,724,724,
+832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,
+832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,724,
 
-/* block 103 */
-839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
-839,839,839,839,839,840,839,839,839,839,839,839,839,839,839,839,
-839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+/* block 101 */
 839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
 839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
 839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
 839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
 839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
-
-/* block 104 */
-839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
 839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
 839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
 839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+
+/* block 102 */
 839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
 839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
 839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
 839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+
+/* block 103 */
+840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
+840,840,840,840,840,841,840,840,840,840,840,840,840,840,840,840,
+840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
+840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
+840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
+840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
+840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
+840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
+
+/* block 104 */
+840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
+840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
+840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
+840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
+840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
+840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
+840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
+840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
 
 /* block 105 */
-839,839,839,839,839,839,839,839,839,839,839,839,839,163,163,163,
-841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,
-841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,
-841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,
-841,841,841,841,841,841,841,163,163,163,163,163,163,163,163,163,
+840,840,840,840,840,840,840,840,840,840,840,840,840,163,163,163,
 842,842,842,842,842,842,842,842,842,842,842,842,842,842,842,842,
 842,842,842,842,842,842,842,842,842,842,842,842,842,842,842,842,
-842,842,842,842,842,842,842,842,843,843,843,843,843,843,844,845,
+842,842,842,842,842,842,842,842,842,842,842,842,842,842,842,842,
+842,842,842,842,842,842,842,163,163,163,163,163,163,163,163,163,
+843,843,843,843,843,843,843,843,843,843,843,843,843,843,843,843,
+843,843,843,843,843,843,843,843,843,843,843,843,843,843,843,843,
+843,843,843,843,843,843,843,843,844,844,844,844,844,844,845,846,
 
 /* block 106 */
-846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,
-846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,
-846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,
-846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,
-846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,
-846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,
-846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,
-846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,
+847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,
+847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,
+847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,
+847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,
+847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,
+847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,
+847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,
+847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,
 
 /* block 107 */
-846,846,846,846,846,846,846,846,846,846,846,846,847,848,849,849,
-846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,846,
-850,850,850,850,850,850,850,850,850,850,846,846,163,163,163,163,
+847,847,847,847,847,847,847,847,847,847,847,847,848,849,850,850,
+847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,
+851,851,851,851,851,851,851,851,851,851,847,847,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-240,241,240,241,240,241,240,241,240,241,851,852,240,241,240,241,
+240,241,240,241,240,241,240,241,240,241,852,853,240,241,240,241,
 240,241,240,241,240,241,240,241,240,241,240,241,240,241,240,241,
-240,241,240,241,240,241,240,241,240,241,240,241,240,241,853,246,
-248,248,248,854,787,787,787,787,787,787,787,787,855,855,854,856,
+240,241,240,241,240,241,240,241,240,241,240,241,240,241,854,246,
+248,248,248,855,788,788,788,788,788,788,788,788,856,856,855,857,
 
 /* block 108 */
 240,241,240,241,240,241,240,241,240,241,240,241,240,241,240,241,
-240,241,240,241,240,241,240,241,240,241,240,241,857,857,787,787,
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
-858,858,858,858,858,858,859,859,859,859,859,859,859,859,859,859,
-860,860,861,862,863,863,863,862,163,163,163,163,163,163,163,163,
+240,241,240,241,240,241,240,241,240,241,240,241,858,858,788,788,
+859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
+859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
+859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
+859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
+859,859,859,859,859,859,860,860,860,860,860,860,860,860,860,860,
+861,861,862,863,864,864,864,863,163,163,163,163,163,163,163,163,
 
 /* block 109 */
-864,864,864,864,864,864,864,864, 46, 46, 46, 46, 46, 46, 46, 46,
+865,865,865,865,865,865,865,865, 46, 46, 46, 46, 46, 46, 46, 46,
  46, 46, 46, 46, 46, 46, 46,149,149,149,149,149,149,149,149,149,
  46, 46, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
  70, 70, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
  65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
  65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
  65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
-644, 70, 70, 70, 70, 70, 70, 70, 70, 65, 66, 65, 66,865, 65, 66,
+645, 70, 70, 70, 70, 70, 70, 70, 70, 65, 66, 65, 66,866, 65, 66,
 
 /* block 110 */
- 65, 66, 65, 66, 65, 66, 65, 66,149,866,866, 65, 66,867, 70, 92,
- 65, 66, 65, 66,868, 70, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
- 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,869,870,871,872,869, 70,
-873,874,875,876, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
- 65, 66, 65, 66,877,878,879, 65, 66, 65, 66,163,163,163,163,163,
+ 65, 66, 65, 66, 65, 66, 65, 66,149,867,867, 65, 66,868, 70, 92,
+ 65, 66, 65, 66,869, 70, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
+ 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,870,871,872,873,870, 70,
+874,875,876,877, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66,
+ 65, 66, 65, 66,878,879,880, 65, 66, 65, 66,163,163,163,163,163,
  65, 66,163, 70,163, 70, 65, 66, 65, 66,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-163,163,880,880,880, 65, 66, 92,147,147, 70, 92, 92, 92, 92, 92,
+163,163,645,645,645, 65, 66, 92,147,147, 70, 92, 92, 92, 92, 92,
 
 /* block 111 */
 881,881,882,881,881,881,883,881,881,881,881,882,881,881,881,881,
@@ -3522,8 +3536,8 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 908,908,908,908,908,908,908,908,908,908,908,908,908,908,908,908,
 908,908,908,908,908,908,908,909,909,909,909,909,909,909,909,909,
 909,909,910,911,163,163,163,163,163,163,163,163,163,163,163,912,
-478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,
-478,478,478,478,478,478,478,478,478,478,478,478,478,163,163,163,
+479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,
+479,479,479,479,479,479,479,479,479,479,479,479,479,163,163,163,
 
 /* block 114 */
 913,913,913,914,915,915,915,915,915,915,915,915,915,915,915,915,
@@ -3532,8 +3546,8 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 915,915,915,916,914,914,913,913,913,913,914,914,913,913,914,914,
 917,918,918,918,918,918,918,919,920,920,918,918,918,918,163,921,
 922,922,922,922,922,922,922,922,922,922,163,163,163,163,918,918,
-461,461,461,461,461,471,923,461,461,461,461,461,461,461,461,461,
-472,472,472,472,472,472,472,472,472,472,461,461,461,461,461,163,
+462,462,462,462,462,472,923,462,462,462,462,462,462,462,462,462,
+473,473,473,473,473,473,473,473,473,473,462,462,462,462,462,163,
 
 /* block 115 */
 924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,
@@ -3542,8 +3556,8 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 926,925,925,926,926,925,925,163,163,163,163,163,163,163,163,163,
 924,924,924,925,924,924,924,924,924,924,924,924,925,926,163,163,
 927,927,927,927,927,927,927,927,927,927,163,163,928,929,929,929,
-461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
-923,461,461,461,461,461,461,473,473,473,461,470,471,470,461,461,
+462,462,462,462,462,462,462,462,462,462,462,462,462,462,462,462,
+923,462,462,462,462,462,462,474,474,474,462,471,472,471,462,462,
 
 /* block 116 */
 930,930,930,930,930,930,930,930,930,930,930,930,930,930,930,930,
@@ -3556,106 +3570,116 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 941,941,938,942,942,939,943,163,163,163,163,163,163,163,163,163,
 
 /* block 117 */
-163,483,483,483,483,483,483,163,163,483,483,483,483,483,483,163,
-163,483,483,483,483,483,483,163,163,163,163,163,163,163,163,163,
-483,483,483,483,483,483,483,163,483,483,483,483,483,483,483,163,
+163,484,484,484,484,484,484,163,163,484,484,484,484,484,484,163,
+163,484,484,484,484,484,484,163,163,163,163,163,163,163,163,163,
+484,484,484,484,484,484,484,163,484,484,484,484,484,484,484,163,
  70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
  70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70,944, 70, 70, 70, 70, 70, 70, 70,866,147,147,147,147,
- 70, 70, 70, 70, 70,221, 70, 70, 70,945, 46, 46,163,163,163,163,
-946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,
+ 70, 70, 70,944, 70, 70, 70, 70, 70, 70, 70,867,147,147,147,147,
+ 70, 70, 70, 70, 70,221, 70, 70, 70,147, 46, 46,163,163,163,163,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
 
 /* block 118 */
-946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,
-946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,
-946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,
-946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
 938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,
 938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,
-938,938,938,939,939,940,939,939,940,939,939,941,947,943,163,163,
-948,948,948,948,948,948,948,948,948,948,163,163,163,163,163,163,
+938,938,938,939,939,940,939,939,940,939,939,941,946,943,163,163,
+947,947,947,947,947,947,947,947,947,947,163,163,163,163,163,163,
 
 /* block 119 */
-949,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,949,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,949,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,949,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-949,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
+948,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,948,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,948,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,948,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+948,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
 
 /* block 120 */
-950,950,950,950,950,950,950,950,950,950,950,950,949,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,949,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,949,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-949,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,949,950,950,950,
+949,949,949,949,949,949,949,949,949,949,949,949,948,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,948,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,948,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+948,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,948,949,949,949,
 
 /* block 121 */
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,949,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,949,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-949,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,949,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,948,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,948,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+948,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,948,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
 
 /* block 122 */
-950,950,950,950,950,950,950,950,949,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,949,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-949,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,949,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,949,950,950,950,950,950,950,950,
+949,949,949,949,949,949,949,949,948,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,948,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+948,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,948,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,948,949,949,949,949,949,949,949,
 
 /* block 123 */
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,949,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-949,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,949,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,949,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,948,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+948,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,948,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,948,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
 
 /* block 124 */
-950,950,950,950,949,950,950,950,950,950,950,950,950,950,950,950,
+949,949,949,949,948,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+948,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,948,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,948,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,948,949,949,949,949,949,949,949,949,949,949,949,
+
+/* block 125 */
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+948,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,948,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,948,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,948,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+
+/* block 126 */
+949,949,949,949,949,949,949,949,948,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,163,163,163,163,163,163,163,163,163,163,163,163,
+482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
+482,482,482,482,482,482,482,163,163,163,163,483,483,483,483,483,
+483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
+483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
+483,483,483,483,483,483,483,483,483,483,483,483,163,163,163,163,
+
+/* block 127 */
 950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-949,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,949,950,950,950,
 950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,949,950,950,950,950,950,950,950,
 950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,949,950,950,950,950,950,950,950,950,950,950,950,
-
-/* block 125 */
 950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-949,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,950,950,950,950,949,950,950,950,
 950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,950,950,950,950,949,950,950,950,950,950,950,950,
 950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,949,950,950,950,950,950,950,950,950,950,950,950,
 950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-
-/* block 126 */
-950,950,950,950,950,950,950,950,949,950,950,950,950,950,950,950,
 950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,
-950,950,950,950,163,163,163,163,163,163,163,163,163,163,163,163,
-481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,
-481,481,481,481,481,481,481,163,163,163,163,482,482,482,482,482,
-482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
-482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
-482,482,482,482,482,482,482,482,482,482,482,482,163,163,163,163,
 
-/* block 127 */
+/* block 128 */
 951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,
 951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,
 951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,
@@ -3665,7 +3689,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,
 951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,
 
-/* block 128 */
+/* block 129 */
 952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
 952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
 952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
@@ -3675,40 +3699,30 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
 952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
 
-/* block 129 */
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-
 /* block 130 */
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,838,838,
-953,838,953,838,838,953,953,953,953,953,953,953,953,953,953,838,
-953,838,953,838,838,953,953,838,838,838,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,163,163,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
+952,952,952,952,952,952,952,952,952,952,952,952,952,952,839,839,
+952,839,952,839,839,952,952,952,952,952,952,952,952,952,952,839,
+952,839,952,839,839,952,952,839,839,839,952,952,952,952,952,952,
+952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
+952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
+952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
+952,952,952,952,952,952,952,952,952,952,952,952,952,952,163,163,
+952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
 
 /* block 131 */
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,163,163,163,163,163,163,
+952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
+952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
+952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
+952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
+952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
+952,952,952,952,952,952,952,952,952,952,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 132 */
-652,652,652,652,652,652,652,163,163,163,163,163,163,163,163,163,
+653,653,653,653,653,653,653,163,163,163,163,163,163,163,163,163,
 163,163,163,257,257,257,257,257,163,163,163,163,163,270,265,270,
-270,270,270,270,270,270,270,270,270,954,270,270,270,270,270,270,
+270,270,270,270,270,270,270,270,270,953,270,270,270,270,270,270,
 270,270,270,270,270,270,270,262,270,270,270,270,270,262,270,262,
 270,270,262,270,270,262,270,270,270,270,270,270,270,270,270,270,
 286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,
@@ -3731,8 +3745,8 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,
 286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,
 286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,
-286,286,286,286,286,286,286,286,286,286,286,286,286,286,955,955,
-955,955,955,955,286,286,286,286,286,286,286,286,286,286,286,286,
+286,286,286,286,286,286,286,286,286,286,286,286,286,286,954,954,
+954,954,954,954,286,286,286,286,286,286,286,286,286,286,286,286,
 286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,
 
 /* block 135 */
@@ -3749,7 +3763,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,
 286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,
 286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,
-286,286,286,286,286,286,286,286,286,286,286,286,286,286,956,957,
+286,286,286,286,286,286,286,286,286,286,286,286,286,286,955,956,
 280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,
 286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,
 286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,
@@ -3761,19 +3775,19 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,
 286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,
 286,286,286,286,286,286,286,286,302,302,302,302,302,302,302,280,
-958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,
-958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,
-286,286,959,286,286,286,286,286,286,286,955,955,277,960,280,280,
+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,
+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,
+286,286,958,286,286,286,286,286,286,286,954,954,277,959,280,280,
 
 /* block 138 */
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,962,
-963,963,963,964,963,963,963,965,966,963,163,163,163,163,163,163,
-154,154,154,154,154,154,154,154,154,154,154,154,154,154,855,855,
-963,967,967,700,700,965,966,965,966,965,966,965,966,965,966,965,
-966,968,969,968,969,798,798,965,966,963,963,963,963,700,700,700,
-970,166,971,163,166,972,973,973,967,974,975,974,975,974,975,976,
-963,977,713,978,979,979,715,163,977,431,976,963,163,163,163,163,
-955,286,955,286,955,302,955,286,955,286,955,286,955,286,955,286,
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,961,
+962,962,962,963,962,962,962,964,965,962,163,163,163,163,163,163,
+154,154,154,154,154,154,154,154,154,154,154,154,154,154,856,856,
+962,966,966,701,701,964,965,964,965,964,965,964,965,964,965,964,
+965,967,968,967,968,799,799,964,965,962,962,962,962,701,701,701,
+969,166,970,163,166,971,972,972,966,973,974,973,974,973,974,975,
+962,976,714,977,978,978,716,163,976,430,975,962,163,163,163,163,
+954,286,954,286,954,302,954,286,954,286,954,286,954,286,954,286,
 
 /* block 139 */
 286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,286,
@@ -3786,64 +3800,64 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 286,286,286,286,286,286,286,286,286,286,286,286,286,302,302, 51,
 
 /* block 140 */
-163,973,980,976,431,976,963,981,974,975,963,713,970,982,971,983,
-984,984,984,984,984,984,984,984,984,984,972,166,979,715,979,973,
-963,985,985,985,985,985,985, 59, 59, 59, 59, 59, 59, 59, 59, 59,
- 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,974,977,975,986,700,
- 46,987,987,987,987,987,987, 62, 62, 62, 62, 62, 62, 62, 62, 62,
- 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,974,715,975,715,974,
-975,988,989,990,991,825,824,824,824,824,824,824,824,824,824,824,
-826,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,
+163,972,979,975,430,975,962,980,973,974,962,714,969,981,970,982,
+983,983,983,983,983,983,983,983,983,983,971,166,978,716,978,972,
+962,984,984,984,984,984,984, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,973,976,974,985,701,
+ 46,986,986,986,986,986,986, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,973,716,974,716,973,
+974,987,988,989,990,826,825,825,825,825,825,825,825,825,825,825,
+827,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,
 
 /* block 141 */
-824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,
-824,824,824,824,824,824,824,824,824,824,824,824,824,824,992,992,
-830,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,
-829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,163,
-163,163,829,829,829,829,829,829,163,163,829,829,829,829,829,829,
-163,163,829,829,829,829,829,829,163,163,829,829,829,163,163,163,
-431,431,715, 46,723,431,431,163,723,715,715,715,715,723,723,163,
-707,707,707,707,707,707,707,707,707,993,993,993,723,723,958,958,
+825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,
+825,825,825,825,825,825,825,825,825,825,825,825,825,825,991,991,
+831,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,
+830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,163,
+163,163,830,830,830,830,830,830,163,163,830,830,830,830,830,830,
+163,163,830,830,830,830,830,830,163,163,830,830,830,163,163,163,
+430,430,716, 46,724,430,430,163,724,716,716,716,716,724,724,163,
+708,708,708,708,708,708,708,708,708,992,992,992,724,724,957,957,
 
 /* block 142 */
-994,994,994,994,994,994,994,994,994,994,994,994,163,994,994,994,
-994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,
-994,994,994,994,994,994,994,163,994,994,994,994,994,994,994,994,
-994,994,994,994,994,994,994,994,994,994,994,163,994,994,163,994,
-994,994,994,994,994,994,994,994,994,994,994,994,994,994,163,163,
-994,994,994,994,994,994,994,994,994,994,994,994,994,994,163,163,
+993,993,993,993,993,993,993,993,993,993,993,993,163,993,993,993,
+993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,
+993,993,993,993,993,993,993,163,993,993,993,993,993,993,993,993,
+993,993,993,993,993,993,993,993,993,993,993,163,993,993,163,993,
+993,993,993,993,993,993,993,993,993,993,993,993,993,993,163,163,
+993,993,993,993,993,993,993,993,993,993,993,993,993,993,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 143 */
-994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,
-994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,
-994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,
-994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,
-994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,
-994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,
-994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,
-994,994,994,994,994,994,994,994,994,994,994,163,163,163,163,163,
+993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,
+993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,
+993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,
+993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,
+993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,
+993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,
+993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,
+993,993,993,993,993,993,993,993,993,993,993,163,163,163,163,163,
 
 /* block 144 */
-995,996,997,163,163,163,163,998,998,998,998,998,998,998,998,998,
-998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,
-998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,
-998,998,998,998,163,163,163,999,999,999,999,999,999,999,999,999,
-1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,
-1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,
-1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,
-1000,1000,1000,1000,1000,1001,1001,1001,1001,1002,1002,1002,1002,1002,1002,1002,
+994,995,996,163,163,163,163,997,997,997,997,997,997,997,997,997,
+997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,
+997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,
+997,997,997,997,163,163,163,998,998,998,998,998,998,998,998,998,
+999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,
+999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,
+999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,
+999,999,999,999,999,1000,1000,1000,1000,1001,1001,1001,1001,1001,1001,1001,
 
 /* block 145 */
-1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1001,1001,1002,1003,1003,163,
-723,723,723,723,723,723,723,723,723,723,723,723,723,163,163,163,
-1002,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1000,1000,1001,1002,1002,163,
+724,724,724,724,724,724,724,724,724,724,724,724,724,163,163,163,
+1001,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,158,163,163,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,158,163,163,
 
 /* block 146 */
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
@@ -3856,97 +3870,97 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 147 */
+1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,
+1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,163,163,163,
+1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,
 1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,
-1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,163,163,163,
-1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,
-1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,
-1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,
-1005,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-1006,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,
-1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,163,163,163,163,
+1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,
+1004,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+1005,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,
+1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,163,163,163,163,
 
 /* block 148 */
-1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,
-1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,
-1009,1009,1009,1009,163,163,163,163,163,163,163,163,163,1008,1008,1008,
-1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,
-1010,1011,1010,1010,1010,1010,1010,1010,1010,1010,1011,163,163,163,163,163,
-1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,
-1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,
-1012,1012,1012,1012,1012,1012,1013,1013,1013,1013,1013,163,163,163,163,163,
+1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,
+1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,
+1008,1008,1008,1008,163,163,163,163,163,163,163,163,163,1007,1007,1007,
+1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,
+1009,1010,1009,1009,1009,1009,1009,1009,1009,1009,1010,163,163,163,163,163,
+1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,
+1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,
+1011,1011,1011,1011,1011,1011,1012,1012,1012,1012,1012,163,163,163,163,163,
 
 /* block 149 */
-1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,
-1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,163,1015,
-1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,
-1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,
-1016,1016,1016,1016,163,163,163,163,1016,1016,1016,1016,1016,1016,1016,1016,
-1017,1018,1018,1018,1018,1018,163,163,163,163,163,163,163,163,163,163,
+1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,
+1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,163,1014,
+1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,
+1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,
+1015,1015,1015,1015,163,163,163,163,1015,1015,1015,1015,1015,1015,1015,1015,
+1016,1017,1017,1017,1017,1017,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 150 */
+1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,
+1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,
+1018,1018,1018,1018,1018,1018,1018,1018,1019,1019,1019,1019,1019,1019,1019,1019,
 1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,
 1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,
-1019,1019,1019,1019,1019,1019,1019,1019,1020,1020,1020,1020,1020,1020,1020,1020,
 1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,
 1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,
-1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,
-1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,
-1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,
+1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,
 
 /* block 151 */
-1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,
-1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,163,163,
-1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,163,163,163,163,163,163,
-1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,
+1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,
+1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,163,163,
+1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,163,163,163,163,163,163,
+1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,
+1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,
+1023,1023,1023,1023,163,163,163,163,1024,1024,1024,1024,1024,1024,1024,1024,
 1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,
-1024,1024,1024,1024,163,163,163,163,1025,1025,1025,1025,1025,1025,1025,1025,
-1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,
-1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,163,163,163,163,
+1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,163,163,163,163,
 
 /* block 152 */
+1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,
+1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,
+1025,1025,1025,1025,1025,1025,1025,1025,163,163,163,163,163,163,163,163,
+1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,
 1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,
 1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,
-1026,1026,1026,1026,1026,1026,1026,1026,163,163,163,163,163,163,163,163,
-1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,
-1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,
-1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,
-1027,1027,1027,1027,163,163,163,163,163,163,163,163,163,163,163,1028,
-1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,163,1029,1029,1029,1029,
+1026,1026,1026,1026,163,163,163,163,163,163,163,163,163,163,163,1027,
+1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,163,1028,1028,1028,1028,
 
 /* block 153 */
-1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,163,1029,1029,1029,1029,
-1029,1029,1029,163,1029,1029,163,1030,1030,1030,1030,1030,1030,1030,1030,1030,
-1030,1030,163,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,
-1030,1030,163,1030,1030,1030,1030,1030,1030,1030,163,1030,1030,163,163,163,
+1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,163,1028,1028,1028,1028,
+1028,1028,1028,163,1028,1028,163,1029,1029,1029,1029,1029,1029,1029,1029,1029,
+1029,1029,163,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,
+1029,1029,163,1029,1029,1029,1029,1029,1029,1029,163,1029,1029,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 154 */
-1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,
-1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,
-1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,
-1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,
-1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,
-1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,
-1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,
-1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,
+1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,
+1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,
+1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,
+1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,
+1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,
+1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,
+1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,
+1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,
 
 /* block 155 */
-1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,
-1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,
-1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,
-1031,1031,1031,1031,1031,1031,1031,163,163,163,163,163,163,163,163,163,
-1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,
-1031,1031,1031,1031,1031,1031,163,163,163,163,163,163,163,163,163,163,
-1031,1031,1031,1031,1031,1031,1031,1031,163,163,163,163,163,163,163,163,
+1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,
+1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,
+1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,
+1030,1030,1030,1030,1030,1030,1030,163,163,163,163,163,163,163,163,163,
+1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,
+1030,1030,1030,1030,1030,1030,163,163,163,163,163,163,163,163,163,163,
+1030,1030,1030,1030,1030,1030,1030,1030,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 156 */
-147,1032,1032,147,147,147,163,147,147,147,147,147,147,147,147,147,
+147,1031,1031,147,147,147,163,147,147,147,147,147,147,147,147,147,
 147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
 147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,
 147,163,147,147,147,147,147,147,147,147,147,163,163,163,163,163,
@@ -3956,79 +3970,79 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 157 */
-1033,1033,1033,1033,1033,1033,262,262,1033,262,1033,1033,1033,1033,1033,1033,
-1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,
+1032,1032,1032,1032,1032,1032,262,262,1032,262,1032,1032,1032,1032,1032,1032,
+1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,
+1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,
+1032,1032,1032,1032,1032,1032,262,1032,1032,262,262,262,1032,262,262,1032,
 1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,
-1033,1033,1033,1033,1033,1033,262,1033,1033,262,262,262,1033,262,262,1033,
-1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,
-1034,1034,1034,1034,1034,1034,262,1035,1036,1036,1036,1036,1036,1036,1036,1036,
-1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,
-1037,1037,1037,1037,1037,1037,1037,1038,1038,1039,1039,1039,1039,1039,1039,1039,
+1033,1033,1033,1033,1033,1033,262,1034,1035,1035,1035,1035,1035,1035,1035,1035,
+1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,
+1036,1036,1036,1036,1036,1036,1036,1037,1037,1038,1038,1038,1038,1038,1038,1038,
 
 /* block 158 */
-1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,
-1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,262,
-262,262,262,262,262,262,262,1041,1041,1041,1041,1041,1041,1041,1041,1041,
+1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,
+1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,262,
+262,262,262,262,262,262,262,1040,1040,1040,1040,1040,1040,1040,1040,1040,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
-1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,
-1042,1042,1042,262,1042,1042,262,262,262,262,262,1043,1043,1043,1043,1043,
+1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,
+1041,1041,1041,262,1041,1041,262,262,262,262,262,1042,1042,1042,1042,1042,
 
 /* block 159 */
-1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,
-1044,1044,1044,1044,1044,1044,1045,1045,1045,1045,1045,1045,262,262,262,1046,
-1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,
-1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,262,262,262,262,262,1048,
+1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,
+1043,1043,1043,1043,1043,1043,1044,1044,1044,1044,1044,1044,262,262,262,1045,
+1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,
+1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,262,262,262,262,262,1047,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 
 /* block 160 */
+1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,
+1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,
 1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,
-1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,
+1049,1049,1049,1049,1049,1049,1049,1049,262,262,262,262,1050,1050,1049,1049,
+1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,
+262,262,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,
+1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,
 1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,
-1050,1050,1050,1050,1050,1050,1050,1050,262,262,262,262,1051,1051,1050,1050,
-1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,
-262,262,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,
-1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,
-1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,
 
 /* block 161 */
-1052,1053,1053,1053,262,1053,1053,262,262,262,262,262,1053,1053,1053,1053,
-1052,1052,1052,1052,262,1052,1052,1052,262,1052,1052,1052,1052,1052,1052,1052,
-1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,
-1052,1052,1052,1052,1052,1052,262,262,1054,1054,1054,262,262,262,262,1055,
-1056,1056,1056,1056,1056,1056,1056,1056,1056,262,262,262,262,262,262,262,
-1057,1057,1057,1057,1057,1057,1058,1058,1057,262,262,262,262,262,262,262,
-1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,
-1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1060,1060,1061,
+1051,1052,1052,1052,262,1052,1052,262,262,262,262,262,1052,1052,1052,1052,
+1051,1051,1051,1051,262,1051,1051,1051,262,1051,1051,1051,1051,1051,1051,1051,
+1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,
+1051,1051,1051,1051,1051,1051,262,262,1053,1053,1053,262,262,262,262,1054,
+1055,1055,1055,1055,1055,1055,1055,1055,1055,262,262,262,262,262,262,262,
+1056,1056,1056,1056,1056,1056,1057,1057,1056,262,262,262,262,262,262,262,
+1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,
+1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1059,1059,1060,
 
 /* block 162 */
-1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,
-1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1063,1063,1063,
+1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,
+1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1062,1062,1062,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
-1064,1064,1064,1064,1064,1064,1064,1064,1065,1064,1064,1064,1064,1064,1064,1064,
-1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,
-1064,1064,1064,1064,1064,1066,1066,262,262,262,262,1067,1067,1067,1067,1067,
-1068,1068,1069,1068,1068,1068,1070,262,262,262,262,262,262,262,262,262,
+1063,1063,1063,1063,1063,1063,1063,1063,1064,1063,1063,1063,1063,1063,1063,1063,
+1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,
+1063,1063,1063,1063,1063,1065,1065,262,262,262,262,1066,1066,1066,1066,1066,
+1067,1067,1068,1067,1067,1067,1069,262,262,262,262,262,262,262,262,262,
 
 /* block 163 */
-1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,
-1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,
-1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,
-1071,1071,1071,1071,1071,1071,262,262,262,1072,1073,1073,1073,1073,1073,1073,
-1074,1074,1074,1074,1074,1074,1074,1074,1074,1074,1074,1074,1074,1074,1074,1074,
-1074,1074,1074,1074,1074,1074,262,262,1075,1075,1075,1075,1075,1075,1075,1075,
-1076,1076,1076,1076,1076,1076,1076,1076,1076,1076,1076,1076,1076,1076,1076,1076,
-1076,1076,1076,262,262,262,262,262,1077,1077,1077,1077,1077,1077,1077,1077,
+1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,
+1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,
+1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,
+1070,1070,1070,1070,1070,1070,262,262,262,1071,1072,1072,1072,1072,1072,1072,
+1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,
+1073,1073,1073,1073,1073,1073,262,262,1074,1074,1074,1074,1074,1074,1074,1074,
+1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,
+1075,1075,1075,262,262,262,262,262,1076,1076,1076,1076,1076,1076,1076,1076,
 
 /* block 164 */
-1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,
-1078,1078,262,262,262,262,262,262,262,1079,1079,1079,1079,262,262,262,
-262,262,262,262,262,262,262,262,262,1080,1080,1080,1080,1080,1080,1080,
+1077,1077,1077,1077,1077,1077,1077,1077,1077,1077,1077,1077,1077,1077,1077,1077,
+1077,1077,262,262,262,262,262,262,262,1078,1078,1078,1078,262,262,262,
+262,262,262,262,262,262,262,262,262,1079,1079,1079,1079,1079,1079,1079,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
@@ -4036,30 +4050,30 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 
 /* block 165 */
-1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,
-1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,
-1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,
-1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,
-1081,1081,1081,1081,1081,1081,1081,1081,1081,262,262,262,262,262,262,262,
+1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,
+1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,
+1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,
+1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,
+1080,1080,1080,1080,1080,1080,1080,1080,1080,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 
 /* block 166 */
+1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,
+1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,
+1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,
+1081,1081,1081,262,262,262,262,262,262,262,262,262,262,262,262,262,
 1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,
 1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,
 1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,
-1082,1082,1082,262,262,262,262,262,262,262,262,262,262,262,262,262,
-1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,
-1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,
-1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,
-1083,1083,1083,262,262,262,262,262,262,262,1084,1084,1084,1084,1084,1084,
+1082,1082,1082,262,262,262,262,262,262,262,1083,1083,1083,1083,1083,1083,
 
 /* block 167 */
-1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,
-1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,
-1085,1085,1086,1086,1087,1087,1087,1087,302,302,302,302,302,302,302,302,
-1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,302,302,302,302,302,302,
+1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,
+1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,
+1084,1084,1085,1085,1086,1086,1086,1086,302,302,302,302,302,302,302,302,
+1087,1087,1087,1087,1087,1087,1087,1087,1087,1087,302,302,302,302,302,302,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
@@ -4082,174 +4096,174 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
-1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,
-1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,262,
+1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,
+1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,262,
 
 /* block 170 */
-1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,
-1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,
-1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,262,1091,1091,1092,262,262,
-1090,1090,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
-262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
-262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
-262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
-262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
+1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,
+1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,
+1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,262,1090,1090,1091,262,262,
+1089,1089,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
+302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,
+302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,
+302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,
+302,302,302,302,302,302,302,302,302,302,302,302,302,291,291,291,
 
 /* block 171 */
-1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,
-1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1094,1094,1094,
-1094,1094,1094,1094,1094,1094,1094,1093,262,262,262,262,262,262,262,262,
-1095,1095,1095,1095,1095,1095,1095,1095,1095,1095,1095,1095,1095,1095,1095,1095,
-1095,1095,1095,1095,1095,1095,1096,1096,1096,1096,1096,1096,1096,1096,1096,1096,
-1096,1097,1097,1097,1097,1098,1098,1098,1098,1098,302,302,302,302,302,302,
+1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,
+1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1093,1093,1093,
+1093,1093,1093,1093,1093,1093,1093,1092,262,262,262,262,262,262,262,262,
+1094,1094,1094,1094,1094,1094,1094,1094,1094,1094,1094,1094,1094,1094,1094,1094,
+1094,1094,1094,1094,1094,1094,1095,1095,1095,1095,1095,1095,1095,1095,1095,1095,
+1095,1096,1096,1096,1096,1097,1097,1097,1097,1097,302,302,302,302,302,302,
 302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,
-1099,1099,1099,1099,1099,1099,1099,1099,1099,1099,1099,1099,1099,1099,1099,1099,
+1098,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098,
 
 /* block 172 */
-1099,1099,1100,1100,1100,1100,1101,1101,1101,1101,262,262,262,262,262,262,
+1098,1098,1099,1099,1099,1099,1100,1100,1100,1100,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
-1102,1102,1102,1102,1102,1102,1102,1102,1102,1102,1102,1102,1102,1102,1102,1102,
-1102,1102,1102,1102,1102,1103,1103,1103,1103,1103,1103,1103,262,262,262,262,
+1101,1101,1101,1101,1101,1101,1101,1101,1101,1101,1101,1101,1101,1101,1101,1101,
+1101,1101,1101,1101,1101,1102,1102,1102,1102,1102,1102,1102,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
-1104,1104,1104,1104,1104,1104,1104,1104,1104,1104,1104,1104,1104,1104,1104,1104,
-1104,1104,1104,1104,1104,1104,1104,262,262,262,262,262,262,262,262,262,
+1103,1103,1103,1103,1103,1103,1103,1103,1103,1103,1103,1103,1103,1103,1103,1103,
+1103,1103,1103,1103,1103,1103,1103,262,262,262,262,262,262,262,262,262,
 
 /* block 173 */
-1105,1106,1105,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,
-1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,
-1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,
-1107,1107,1107,1107,1107,1107,1107,1107,1106,1106,1106,1106,1106,1106,1106,1106,
-1106,1106,1106,1106,1106,1106,1108,1109,1109,1110,1110,1110,1110,1110,163,163,
-163,163,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,
-1111,1111,1111,1111,1111,1111,1112,1112,1112,1112,1112,1112,1112,1112,1112,1112,
-1108,1107,1107,1106,1106,1107,163,163,163,163,163,163,163,163,163,1113,
+1104,1105,1104,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,
+1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,
+1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,
+1106,1106,1106,1106,1106,1106,1106,1106,1105,1105,1105,1105,1105,1105,1105,1105,
+1105,1105,1105,1105,1105,1105,1107,1108,1108,1109,1109,1109,1109,1109,163,163,
+163,163,1110,1110,1110,1110,1110,1110,1110,1110,1110,1110,1110,1110,1110,1110,
+1110,1110,1110,1110,1110,1110,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,
+1107,1106,1106,1105,1105,1106,163,163,163,163,163,163,163,163,163,1112,
 
 /* block 174 */
-1114,1114,1115,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,
-1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,
-1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,
-1115,1115,1115,1117,1117,1117,1117,1115,1115,1118,1119,1120,1120,1121,1122,1122,
-1122,1122,1117,163,163,163,163,163,163,163,163,163,163,1121,163,163,
-1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,
-1123,1123,1123,1123,1123,1123,1123,1123,1123,163,163,163,163,163,163,163,
-1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,163,163,163,163,163,163,
+1113,1113,1114,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,
+1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,
+1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,
+1114,1114,1114,1113,1113,1113,1113,1114,1114,1116,1117,1118,1118,1119,1120,1120,
+1120,1120,1113,163,163,163,163,163,163,163,163,163,163,1119,163,163,
+1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,
+1121,1121,1121,1121,1121,1121,1121,1121,1121,163,163,163,163,163,163,163,
+1122,1122,1122,1122,1122,1122,1122,1122,1122,1122,163,163,163,163,163,163,
 
 /* block 175 */
-1125,1125,1125,1126,1126,1126,1126,1126,1126,1126,1126,1126,1126,1126,1126,1126,
-1126,1126,1126,1126,1126,1126,1126,1126,1126,1126,1126,1126,1126,1126,1126,1126,
-1126,1126,1126,1126,1126,1126,1126,1125,1125,1125,1125,1125,1127,1125,1125,1125,
-1125,1125,1125,1128,1128,163,1129,1129,1129,1129,1129,1129,1129,1129,1129,1129,
-1130,1131,1131,1131,1126,1127,1127,1126,163,163,163,163,163,163,163,163,
-1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,
-1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,
-1132,1132,1132,1133,1134,1134,1132,163,163,163,163,163,163,163,163,163,
+1123,1123,1123,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,
+1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,
+1124,1124,1124,1124,1124,1124,1124,1123,1123,1123,1123,1123,1125,1123,1123,1123,
+1123,1123,1123,1126,1126,163,1127,1127,1127,1127,1127,1127,1127,1127,1127,1127,
+1128,1129,1129,1129,1124,1125,1125,1124,163,163,163,163,163,163,163,163,
+1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,
+1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,
+1130,1130,1130,1131,1132,1132,1130,163,163,163,163,163,163,163,163,163,
 
 /* block 176 */
-1135,1135,1136,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,
-1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,
-1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,1137,
-1137,1137,1137,1136,1136,1136,1135,1135,1135,1135,1135,1135,1135,1135,1135,1136,
-1138,1137,1139,1139,1137,1140,1140,1141,1141,1142,1143,1143,1143,1140,1136,1135,
-1144,1144,1144,1144,1144,1144,1144,1144,1144,1144,1137,1141,1137,1141,1140,1140,
-163,1145,1145,1145,1145,1145,1145,1145,1145,1145,1145,1145,1145,1145,1145,1145,
-1145,1145,1145,1145,1145,163,163,163,163,163,163,163,163,163,163,163,
+1133,1133,1134,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,
+1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,
+1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,
+1135,1135,1135,1134,1134,1134,1133,1133,1133,1133,1133,1133,1133,1133,1133,1134,
+1136,1135,1137,1137,1135,1138,1138,1139,1139,1140,1141,1141,1141,1138,1134,1133,
+1142,1142,1142,1142,1142,1142,1142,1142,1142,1142,1135,1139,1135,1139,1138,1138,
+163,1143,1143,1143,1143,1143,1143,1143,1143,1143,1143,1143,1143,1143,1143,1143,
+1143,1143,1143,1143,1143,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 177 */
-1146,1146,1146,1146,1146,1146,1146,1146,1146,1146,1146,1146,1146,1146,1146,1146,
-1146,1146,163,1146,1146,1146,1146,1146,1146,1146,1146,1146,1146,1146,1146,1146,
-1146,1146,1146,1146,1146,1146,1146,1146,1146,1146,1146,1146,1147,1147,1147,1148,
-1148,1148,1147,1147,1148,1149,1150,1148,1151,1151,1152,1151,1151,1153,1148,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+1144,1144,1144,1144,1144,1144,1144,1144,1144,1144,1144,1144,1144,1144,1144,1144,
+1144,1144,163,1144,1144,1144,1144,1144,1144,1144,1144,1144,1144,1144,1144,1144,
+1144,1144,1144,1144,1144,1144,1144,1144,1144,1144,1144,1144,1145,1145,1145,1146,
+1146,1146,1145,1145,1146,1147,1148,1146,1149,1149,1150,1149,1149,1151,1146,1144,
+1144,1146,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 178 */
-1154,1154,1154,1154,1154,1154,1154,163,1154,163,1154,1154,1154,1154,163,1154,
-1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,163,1154,
-1154,1154,1154,1154,1154,1154,1154,1154,1154,1155,163,163,163,163,163,163,
-1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,
-1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,
-1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1156,1157,
-1158,1158,1158,1157,1157,1157,1157,1157,1157,1159,1160,163,163,163,163,163,
-1161,1161,1161,1161,1161,1161,1161,1161,1161,1161,163,163,163,163,163,163,
+1152,1152,1152,1152,1152,1152,1152,163,1152,163,1152,1152,1152,1152,163,1152,
+1152,1152,1152,1152,1152,1152,1152,1152,1152,1152,1152,1152,1152,1152,163,1152,
+1152,1152,1152,1152,1152,1152,1152,1152,1152,1153,163,163,163,163,163,163,
+1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,
+1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,
+1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1155,
+1156,1156,1156,1155,1155,1155,1155,1155,1155,1157,1158,163,163,163,163,163,
+1159,1159,1159,1159,1159,1159,1159,1159,1159,1159,163,163,163,163,163,163,
 
 /* block 179 */
-1162,1163,1164,1165,163,1166,1166,1166,1166,1166,1166,1166,1166,163,163,1166,
-1166,163,163,1166,1166,1166,1166,1166,1166,1166,1166,1166,1166,1166,1166,1166,
-1166,1166,1166,1166,1166,1166,1166,1166,1166,163,1166,1166,1166,1166,1166,1166,
-1166,163,1166,1166,163,1166,1166,1166,1166,1166,163,1167,1168,1166,1169,1164,
-1162,1164,1164,1164,1164,163,163,1164,1164,163,163,1164,1164,1170,163,163,
-1166,163,163,163,163,163,163,1169,163,163,163,163,163,1171,1166,1166,
-1166,1166,1164,1164,163,163,1172,1172,1172,1172,1172,1172,1172,163,163,163,
-1172,1172,1172,1172,1172,163,163,163,163,163,163,163,163,163,163,163,
+1160,1161,1162,1163,163,1164,1164,1164,1164,1164,1164,1164,1164,163,163,1164,
+1164,163,163,1164,1164,1164,1164,1164,1164,1164,1164,1164,1164,1164,1164,1164,
+1164,1164,1164,1164,1164,1164,1164,1164,1164,163,1164,1164,1164,1164,1164,1164,
+1164,163,1164,1164,163,1164,1164,1164,1164,1164,163,1165,1166,1164,1167,1162,
+1160,1162,1162,1162,1162,163,163,1162,1162,163,163,1162,1162,1168,163,163,
+1164,163,163,163,163,163,163,1167,163,163,163,163,163,1169,1164,1164,
+1164,1164,1162,1162,163,163,1170,1170,1170,1170,1170,1170,1170,163,163,163,
+1170,1170,1170,1170,1170,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 180 */
-1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,
-1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,
-1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,
-1173,1173,1173,1173,1173,1174,1174,1174,1175,1175,1175,1175,1175,1175,1175,1175,
-1174,1174,1176,1175,1175,1174,1177,1173,1173,1173,1173,1178,1178,1179,1180,1180,
-1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1179,1179,163,1180,1182,1173,
-1173,1173,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,
+1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,
+1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171,
+1171,1171,1171,1171,1171,1172,1172,1172,1173,1173,1173,1173,1173,1173,1173,1173,
+1172,1172,1174,1173,1173,1172,1175,1171,1171,1171,1171,1176,1176,1177,1178,1178,
+1179,1179,1179,1179,1179,1179,1179,1179,1179,1179,1177,1177,163,1178,1180,1171,
+1171,1171,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 181 */
-1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,
-1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,
-1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,
-1184,1185,1185,1186,1186,1186,1186,1186,1186,1185,1186,1185,1185,1184,1185,1186,
-1186,1185,1187,1188,1183,1183,1189,1183,163,163,163,163,163,163,163,163,
-1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,163,163,163,163,163,163,
+1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,
+1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,
+1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,
+1182,1183,1183,1184,1184,1184,1184,1184,1184,1183,1184,1183,1183,1182,1183,1184,
+1184,1183,1185,1186,1181,1181,1187,1181,163,163,163,163,163,163,163,163,
+1188,1188,1188,1188,1188,1188,1188,1188,1188,1188,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 182 */
-1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,
-1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,
-1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1192,
-1193,1193,1194,1194,1194,1194,163,163,1193,1193,1193,1193,1194,1194,1193,1195,
-1196,1197,1198,1198,1199,1199,1200,1200,1200,1198,1198,1198,1198,1198,1198,1198,
-1198,1198,1198,1198,1198,1198,1198,1198,1191,1191,1191,1191,1194,1194,163,163,
+1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,
+1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,
+1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1189,1190,
+1191,1191,1192,1192,1192,1192,163,163,1191,1191,1191,1191,1192,1192,1191,1193,
+1194,1195,1196,1196,1197,1197,1198,1198,1198,1196,1196,1196,1196,1196,1196,1196,
+1196,1196,1196,1196,1196,1196,1196,1196,1189,1189,1189,1189,1192,1192,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 183 */
-1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,
-1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,
-1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,1201,
-1202,1202,1202,1203,1203,1203,1203,1203,1203,1203,1203,1202,1202,1203,1202,1204,
-1203,1205,1205,1206,1201,163,163,163,163,163,163,163,163,163,163,163,
-1207,1207,1207,1207,1207,1207,1207,1207,1207,1207,163,163,163,163,163,163,
-530,530,530,530,530,530,530,530,530,530,530,530,530,163,163,163,
+1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,
+1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,
+1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,1199,
+1200,1200,1200,1201,1201,1201,1201,1201,1201,1201,1201,1200,1200,1201,1200,1202,
+1201,1203,1203,1204,1199,163,163,163,163,163,163,163,163,163,163,163,
+1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,163,163,163,163,163,163,
+531,531,531,531,531,531,531,531,531,531,531,531,531,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 184 */
-1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,
-1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,
-1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1209,1210,1209,1210,1210,
-1209,1209,1209,1209,1209,1209,1211,1212,1208,1213,163,163,163,163,163,163,
-1214,1214,1214,1214,1214,1214,1214,1214,1214,1214,163,163,163,163,163,163,
+1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,
+1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,
+1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,1206,1207,1208,1207,1208,1208,
+1207,1207,1207,1207,1207,1207,1209,1210,1206,1211,163,163,163,163,163,163,
+1212,1212,1212,1212,1212,1212,1212,1212,1212,1212,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 185 */
-1215,1215,1215,1215,1215,1215,1215,1215,1215,1215,1215,1215,1215,1215,1215,1215,
-1215,1215,1215,1215,1215,1215,1215,1215,1215,1215,1215,163,163,1216,1216,1216,
-1217,1217,1216,1216,1216,1216,1218,1216,1216,1216,1216,1219,163,163,163,163,
-1220,1220,1220,1220,1220,1220,1220,1220,1220,1220,1221,1221,1222,1222,1222,1223,
-1215,1215,1215,1215,1215,1215,1215,163,163,163,163,163,163,163,163,163,
+1213,1213,1213,1213,1213,1213,1213,1213,1213,1213,1213,1213,1213,1213,1213,1213,
+1213,1213,1213,1213,1213,1213,1213,1213,1213,1213,1213,163,163,1214,1214,1214,
+1215,1215,1214,1214,1214,1214,1216,1214,1214,1214,1214,1217,163,163,163,163,
+1218,1218,1218,1218,1218,1218,1218,1218,1218,1218,1219,1219,1220,1220,1220,1221,
+1213,1213,1213,1213,1213,1213,1213,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 186 */
-1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,
-1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,
-1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,1224,1225,1225,1225,1226,
-1226,1226,1226,1226,1226,1226,1226,1226,1225,1227,1228,1229,163,163,163,163,
+1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,
+1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,
+1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,1222,1223,1223,1223,1224,
+1224,1224,1224,1224,1224,1224,1224,1224,1223,1225,1226,1227,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
@@ -4258,245 +4272,265 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 /* block 187 */
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-1230,1230,1230,1230,1230,1230,1230,1230,1230,1230,1230,1230,1230,1230,1230,1230,
-1230,1230,1230,1230,1230,1230,1230,1230,1230,1230,1230,1230,1230,1230,1230,1230,
-1231,1231,1231,1231,1231,1231,1231,1231,1231,1231,1231,1231,1231,1231,1231,1231,
-1231,1231,1231,1231,1231,1231,1231,1231,1231,1231,1231,1231,1231,1231,1231,1231,
-1232,1232,1232,1232,1232,1232,1232,1232,1232,1232,1233,1233,1233,1233,1233,1233,
-1233,1233,1233,163,163,163,163,163,163,163,163,163,163,163,163,1234,
+1228,1228,1228,1228,1228,1228,1228,1228,1228,1228,1228,1228,1228,1228,1228,1228,
+1228,1228,1228,1228,1228,1228,1228,1228,1228,1228,1228,1228,1228,1228,1228,1228,
+1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,
+1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,
+1230,1230,1230,1230,1230,1230,1230,1230,1230,1230,1231,1231,1231,1231,1231,1231,
+1231,1231,1231,163,163,163,163,163,163,163,163,163,163,163,163,1232,
 
 /* block 188 */
-1235,1235,1235,1235,1235,1235,1235,163,163,1235,163,163,1235,1235,1235,1235,
-1235,1235,1235,1235,163,1235,1235,163,1235,1235,1235,1235,1235,1235,1235,1235,
-1235,1235,1235,1235,1235,1235,1235,1235,1235,1235,1235,1235,1235,1235,1235,1235,
-1236,1237,1237,1237,1237,1237,163,1237,1237,163,163,1238,1238,1239,1240,1241,
-1237,1241,1237,1242,1243,1244,1243,163,163,163,163,163,163,163,163,163,
-1245,1245,1245,1245,1245,1245,1245,1245,1245,1245,163,163,163,163,163,163,
+1233,1233,1233,1233,1233,1233,1233,163,163,1233,163,163,1233,1233,1233,1233,
+1233,1233,1233,1233,163,1233,1233,163,1233,1233,1233,1233,1233,1233,1233,1233,
+1233,1233,1233,1233,1233,1233,1233,1233,1233,1233,1233,1233,1233,1233,1233,1233,
+1234,1235,1235,1235,1235,1235,163,1235,1235,163,163,1236,1236,1237,1238,1239,
+1235,1239,1235,1240,1241,1242,1241,163,163,163,163,163,163,163,163,163,
+1243,1243,1243,1243,1243,1243,1243,1243,1243,1243,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 189 */
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-1246,1246,1246,1246,1246,1246,1246,1246,163,163,1246,1246,1246,1246,1246,1246,
-1246,1246,1246,1246,1246,1246,1246,1246,1246,1246,1246,1246,1246,1246,1246,1246,
-1246,1246,1246,1246,1246,1246,1246,1246,1246,1246,1246,1246,1246,1246,1246,1246,
-1246,1247,1247,1247,1248,1248,1248,1248,163,163,1248,1248,1247,1247,1247,1247,
-1249,1246,1250,1246,1247,163,163,163,163,163,163,163,163,163,163,163,
+1244,1244,1244,1244,1244,1244,1244,1244,163,163,1244,1244,1244,1244,1244,1244,
+1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,
+1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,
+1244,1245,1245,1245,1246,1246,1246,1246,163,163,1246,1246,1245,1245,1245,1245,
+1247,1244,1248,1244,1245,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 190 */
-1251,1252,1252,1252,1252,1252,1252,1253,1253,1252,1252,1251,1251,1251,1251,1251,
-1251,1251,1251,1251,1251,1251,1251,1251,1251,1251,1251,1251,1251,1251,1251,1251,
-1251,1251,1251,1251,1251,1251,1251,1251,1251,1251,1251,1251,1251,1251,1251,1251,
-1251,1251,1251,1254,1255,1252,1252,1252,1252,1256,1257,1252,1252,1252,1252,1258,
-1258,1258,1259,1259,1258,1258,1258,1255,163,163,163,163,163,163,163,163,
-1260,1261,1261,1261,1261,1261,1261,1262,1262,1261,1261,1261,1260,1260,1260,1260,
-1260,1260,1260,1260,1260,1260,1260,1260,1260,1260,1260,1260,1260,1260,1260,1260,
-1260,1260,1260,1260,1260,1260,1260,1260,1260,1260,1260,1260,1260,1260,1260,1260,
+1249,1250,1250,1250,1250,1250,1250,1251,1251,1250,1250,1249,1249,1249,1249,1249,
+1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,
+1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,
+1249,1249,1249,1252,1253,1250,1250,1250,1250,1254,1255,1250,1250,1250,1250,1256,
+1256,1256,1257,1257,1256,1256,1256,1253,163,163,163,163,163,163,163,163,
+1258,1259,1259,1259,1259,1259,1259,1260,1260,1259,1259,1259,1258,1258,1258,1258,
+1258,1258,1258,1258,1258,1258,1258,1258,1258,1258,1258,1258,1258,1258,1258,1258,
+1258,1258,1258,1258,1258,1258,1258,1258,1258,1258,1258,1258,1258,1258,1258,1258,
 
 /* block 191 */
-1260,1260,1260,1260,1263,1263,1263,1263,1263,1263,1261,1261,1261,1261,1261,1261,
-1261,1261,1261,1261,1261,1261,1261,1262,1264,1265,1266,1267,1267,1260,1266,1266,
-1266,1268,1268,163,163,163,163,163,163,163,163,163,163,163,163,163,
-495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,495,
-1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,
-1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,
-1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,1269,
-1269,1269,1269,1269,1269,1269,1269,1269,1269,163,163,163,163,163,163,163,
+1258,1258,1258,1258,1261,1261,1261,1261,1261,1261,1259,1259,1259,1259,1259,1259,
+1259,1259,1259,1259,1259,1259,1259,1260,1262,1263,1264,1265,1265,1258,1264,1264,
+1264,1266,1266,163,163,163,163,163,163,163,163,163,163,163,163,163,
+496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,496,
+1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,
+1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,
+1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,
+1267,1267,1267,1267,1267,1267,1267,1267,1267,163,163,163,163,163,163,163,
 
 /* block 192 */
-1270,1270,1270,1270,1270,1270,1270,1270,1270,163,1270,1270,1270,1270,1270,1270,
-1270,1270,1270,1270,1270,1270,1270,1270,1270,1270,1270,1270,1270,1270,1270,1270,
-1270,1270,1270,1270,1270,1270,1270,1270,1270,1270,1270,1270,1270,1270,1270,1271,
-1272,1272,1272,1272,1272,1272,1272,163,1272,1272,1272,1272,1272,1272,1271,1273,
-1270,1274,1274,1275,1276,1276,163,163,163,163,163,163,163,163,163,163,
-1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1278,1278,1278,1278,1278,1278,
-1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,1278,163,163,163,
-1279,1280,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,
-
-/* block 193 */
-1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,
-163,163,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,
-1282,1282,1282,1282,1282,1282,1282,1282,163,1283,1282,1282,1282,1282,1282,1282,
-1282,1283,1282,1282,1283,1282,1282,163,163,163,163,163,163,163,163,163,
+343,343,343,343,343,343,343,343,343,343,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
-/* block 194 */
-1284,1284,1284,1284,1284,1284,1284,163,1284,1284,163,1284,1284,1284,1284,1284,
-1284,1284,1284,1284,1284,1284,1284,1284,1284,1284,1284,1284,1284,1284,1284,1284,
-1284,1284,1284,1284,1284,1284,1284,1284,1284,1284,1284,1284,1284,1284,1284,1284,
-1284,1285,1285,1285,1285,1285,1285,163,163,163,1285,163,1285,1285,163,1285,
-1285,1285,1286,1285,1287,1287,1288,1285,163,163,163,163,163,163,163,163,
-1289,1289,1289,1289,1289,1289,1289,1289,1289,1289,163,163,163,163,163,163,
-1290,1290,1290,1290,1290,1290,163,1290,1290,163,1290,1290,1290,1290,1290,1290,
-1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,
+/* block 193 */
+1268,1268,1268,1268,1268,1268,1268,1268,1268,163,1268,1268,1268,1268,1268,1268,
+1268,1268,1268,1268,1268,1268,1268,1268,1268,1268,1268,1268,1268,1268,1268,1268,
+1268,1268,1268,1268,1268,1268,1268,1268,1268,1268,1268,1268,1268,1268,1268,1269,
+1270,1270,1270,1270,1270,1270,1270,163,1270,1270,1270,1270,1270,1270,1269,1271,
+1268,1272,1272,1273,1274,1274,163,163,163,163,163,163,163,163,163,163,
+1275,1275,1275,1275,1275,1275,1275,1275,1275,1275,1276,1276,1276,1276,1276,1276,
+1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,1276,163,163,163,
+1277,1278,1279,1279,1279,1279,1279,1279,1279,1279,1279,1279,1279,1279,1279,1279,
 
-/* block 195 */
-1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1291,1291,1291,1291,1291,163,
-1292,1292,163,1291,1291,1292,1291,1293,1290,163,163,163,163,163,163,163,
-1294,1294,1294,1294,1294,1294,1294,1294,1294,1294,163,163,163,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+/* block 194 */
+1279,1279,1279,1279,1279,1279,1279,1279,1279,1279,1279,1279,1279,1279,1279,1279,
+163,163,1280,1280,1280,1280,1280,1280,1280,1280,1280,1280,1280,1280,1280,1280,
+1280,1280,1280,1280,1280,1280,1280,1280,163,1281,1280,1280,1280,1280,1280,1280,
+1280,1281,1280,1280,1281,1280,1280,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
+/* block 195 */
+1282,1282,1282,1282,1282,1282,1282,163,1282,1282,163,1282,1282,1282,1282,1282,
+1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,
+1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,1282,
+1282,1283,1283,1283,1283,1283,1283,163,163,163,1283,163,1283,1283,163,1283,
+1283,1283,1284,1283,1285,1285,1286,1283,163,163,163,163,163,163,163,163,
+1287,1287,1287,1287,1287,1287,1287,1287,1287,1287,163,163,163,163,163,163,
+1288,1288,1288,1288,1288,1288,163,1288,1288,163,1288,1288,1288,1288,1288,1288,
+1288,1288,1288,1288,1288,1288,1288,1288,1288,1288,1288,1288,1288,1288,1288,1288,
+
 /* block 196 */
+1288,1288,1288,1288,1288,1288,1288,1288,1288,1288,1289,1289,1289,1289,1289,163,
+1290,1290,163,1289,1289,1290,1289,1291,1288,163,163,163,163,163,163,163,
+1292,1292,1292,1292,1292,1292,1292,1292,1292,1292,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-1295,1295,1295,1295,1295,1295,1295,1295,1295,1295,1295,1295,1295,1295,1295,1295,
-1295,1295,1295,1296,1296,1297,1297,1298,1298,163,163,163,163,163,163,163,
 
 /* block 197 */
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-842,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-1299,1299,1299,1299,1299,1299,1299,1299,1299,1299,1299,1299,1299,1299,1299,1299,
-388,388,1299,388,1299,390,390,390,390,390,390,390,390,391,391,391,
-391,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,
-390,390,163,163,163,163,163,163,163,163,163,163,163,163,163,1300,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+1293,1293,1293,1293,1293,1293,1293,1293,1293,1293,1293,1293,1293,1293,1293,1293,
+1293,1293,1293,1294,1294,1295,1295,1296,1296,163,163,163,163,163,163,163,
 
 /* block 198 */
-1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,
-1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,
-1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,
-1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,
-1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,
-1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,
-1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,
-1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,
-
-/* block 199 */
-1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,
-1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,163,163,163,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+1297,1297,1298,1299,1300,1300,1300,1300,1300,1300,1300,1300,1300,1300,1300,1300,
+1300,163,1300,1300,1300,1300,1300,1300,1300,1300,1300,1300,1300,1300,1300,1300,
+1300,1300,1300,1300,1300,1300,1300,1300,1300,1300,1300,1300,1300,1300,1300,1300,
+1300,1300,1300,1300,1299,1299,1297,1297,1297,1297,1297,163,163,163,1299,1299,
+1297,1301,1302,1303,1303,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,
+1305,1305,1305,1305,1305,1305,1305,1305,1305,1305,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+
+/* block 199 */
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+843,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,
+388,388,1306,388,1306,390,390,390,390,390,390,390,390,391,391,391,
+391,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,
+390,390,163,163,163,163,163,163,163,163,163,163,163,163,163,1307,
 
 /* block 200 */
-1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,
-1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,
-1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,
-1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,
-1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,
-1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,
-1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,163,
-1303,1303,1303,1303,1303,163,163,163,163,163,163,163,163,163,163,163,
+1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
+1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
+1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
+1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
+1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
+1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
+1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
+1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
 
 /* block 201 */
-1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,
-1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,
-1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,
-1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,1301,
-1301,1301,1301,1301,163,163,163,163,163,163,163,163,163,163,163,163,
+1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
+1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 202 */
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,
-1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,
-1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,
-1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,
-1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,
-1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,1304,
-1304,1305,1305,163,163,163,163,163,163,163,163,163,163,163,163,163,
+1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,
+1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,
+1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,
+1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,
+1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,
+1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,
+1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,163,
+1310,1310,1310,1310,1310,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 203 */
-1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,
-1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,
-1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,
-1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,
-1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,
-1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,
-1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,
-1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,
-
-/* block 204 */
-1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,
-1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,
-1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,1306,163,
-1307,1307,1307,1307,1307,1307,1307,1307,1307,163,163,163,163,163,163,163,
+1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
+1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
+1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
+1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
+1308,1308,1308,1308,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+
+/* block 204 */
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,
+1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,
+1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,
+1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,
+1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,
+1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,1311,
+1311,1312,1312,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 205 */
-1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
-1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
-1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
-1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
-1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
-1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
-1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
-1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
+1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,
+1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,
+1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,
+1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,
+1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,
+1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,
+1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,
+1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,
 
 /* block 206 */
-1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
-1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
-1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
-1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,1308,
-1308,1308,1308,1308,1308,1308,1308,163,163,163,163,163,163,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,
+1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,
+1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,
+1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,
+1315,1313,1313,1313,1313,1313,1313,1316,1316,1316,1316,1316,1316,1316,1316,1316,
+1316,1316,1316,1316,1316,1316,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 207 */
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
+1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
+1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
+1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
+1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
+1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
+1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
+1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
+1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
 
 /* block 208 */
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
-858,858,858,858,858,858,858,858,858,163,163,163,163,163,163,163,
-1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,
-1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,1309,163,
-1310,1310,1310,1310,1310,1310,1310,1310,1310,1310,163,163,163,163,1311,1311,
-1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,
+1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
+1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
+1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
+1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
+1317,1317,1317,1317,1317,1317,1317,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 209 */
-1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,
-1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,
-1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,
-1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,1312,163,
-1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,163,163,163,163,163,163,
-1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,
-1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,1314,163,163,
-1315,1315,1315,1315,1315,1316,163,163,163,163,163,163,163,163,163,163,
+859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
+859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
+859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
+859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
+859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
+859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
+859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
+859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
 
 /* block 210 */
-1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
-1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
-1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
-1318,1318,1318,1318,1318,1318,1318,1319,1319,1320,1321,1321,1322,1322,1322,1322,
-1323,1323,1324,1324,1319,1322,163,163,163,163,163,163,163,163,163,163,
-1325,1325,1325,1325,1325,1325,1325,1325,1325,1325,163,1326,1326,1326,1326,1326,
-1326,1326,163,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
-1317,1317,1317,1317,1317,1317,1317,1317,163,163,163,163,163,1317,1317,1317,
+859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
+859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
+859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
+859,859,859,859,859,859,859,859,859,163,163,163,163,163,163,163,
+1318,1318,1318,1318,1318,1318,1318,1318,1318,1318,1318,1318,1318,1318,1318,1318,
+1318,1318,1318,1318,1318,1318,1318,1318,1318,1318,1318,1318,1318,1318,1318,163,
+1319,1319,1319,1319,1319,1319,1319,1319,1319,1319,163,163,163,163,1320,1320,
+1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,
 
 /* block 211 */
-1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,1317,
+1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,
+1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,
+1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,
+1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,163,
+1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,163,163,163,163,163,163,
+1323,1323,1323,1323,1323,1323,1323,1323,1323,1323,1323,1323,1323,1323,1323,1323,
+1323,1323,1323,1323,1323,1323,1323,1323,1323,1323,1323,1323,1323,1323,163,163,
+1324,1324,1324,1324,1324,1325,163,163,163,163,163,163,163,163,163,163,
+
+/* block 212 */
+1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,
+1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,
+1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,
+1327,1327,1327,1327,1327,1327,1327,1328,1328,1329,1330,1330,1331,1331,1331,1331,
+1332,1332,1333,1333,1328,1331,163,163,163,163,163,163,163,163,163,163,
+1334,1334,1334,1334,1334,1334,1334,1334,1334,1334,163,1335,1335,1335,1335,1335,
+1335,1335,163,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,
+1326,1326,1326,1326,1326,1326,1326,1326,163,163,163,163,163,1326,1326,1326,
+
+/* block 213 */
+1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,1326,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
@@ -4505,19 +4539,19 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
-/* block 212 */
+/* block 214 */
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-1327,1327,1327,1327,1327,1327,1327,1327,1327,1327,1327,1327,1327,1327,1327,1327,
-1327,1327,1327,1327,1327,1327,1327,1327,1327,1327,1327,1327,1327,1327,1327,1327,
-1328,1328,1328,1328,1328,1328,1328,1328,1328,1328,1328,1328,1328,1328,1328,1328,
-1328,1328,1328,1328,1328,1328,1328,1328,1328,1328,1328,1328,1328,1328,1328,1328,
+1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,
+1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,
+1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,
+1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,
 
-/* block 213 */
-1329,1329,1329,1329,1329,1329,1329,1329,1329,1329,1329,1329,1329,1329,1329,1329,
-1329,1329,1329,1329,1329,1329,1329,1330,1331,1332,1332,163,163,163,163,163,
+/* block 215 */
+1338,1338,1338,1338,1338,1338,1338,1338,1338,1338,1338,1338,1338,1338,1338,1338,
+1338,1338,1338,1338,1338,1338,1338,1339,1340,1341,1341,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
@@ -4525,68 +4559,68 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
-/* block 214 */
-1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,
-1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,
-1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,
-1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,
-1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,1333,163,163,163,163,1334,
-1333,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,
-1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,
-1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,
+/* block 216 */
+1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,
+1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,
+1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,
+1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,
+1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,1342,163,163,163,163,1343,
+1342,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
+1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
+1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
 
-/* block 215 */
-1335,1335,1335,1335,1335,1335,1335,1335,163,163,163,163,163,163,163,1336,
-1336,1336,1336,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,1337,
+/* block 217 */
+1344,1344,1344,1344,1344,1344,1344,1344,163,163,163,163,163,163,163,1345,
+1345,1345,1345,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-1338,1339,1340,799,1341,163,163,163,163,163,163,163,163,163,163,163,
-1342,1342,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-
-/* block 216 */
-1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,
-1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,
-1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,
-1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,
-1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,
-1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,
-1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,
-1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,
-
-/* block 217 */
-1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,
-1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,
-1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,
-1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,
-1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,
-1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,
-1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,1343,
-1343,1343,1343,1343,1343,1343,1343,1343,163,163,163,163,163,163,163,163,
+1347,1348,1349,800,1350,163,163,163,163,163,163,163,163,163,163,163,
+1351,1351,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 218 */
-1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
-1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
-1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
-1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
-1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
-1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
-1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
-1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
+1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,
+1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,
+1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,
+1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,
+1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,
+1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,
+1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,
+1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,
 
 /* block 219 */
-1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
-1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
-1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
-1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
-1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,1344,
-1344,1344,1344,1344,1344,1344,163,163,163,163,163,163,163,163,163,163,
+1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,
+1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,
+1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,
+1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,
+1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,
+1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,
+1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,1352,
+1352,1352,1352,1352,1352,1352,1352,1352,163,163,163,163,163,163,163,163,
+
+/* block 220 */
+1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,
+1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,
+1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,
+1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,
+1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,
+1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,
+1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,
+1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,
+
+/* block 221 */
+1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,
+1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,
+1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,
+1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,
+1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,
+1353,1353,1353,1353,1353,1353,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
-/* block 220 */
-1343,1343,1343,1343,1343,1343,1343,1343,1343,163,163,163,163,163,163,163,
+/* block 222 */
+1352,1352,1352,1352,1352,1352,1352,1352,1352,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
@@ -4595,7 +4629,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
-/* block 221 */
+/* block 223 */
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
@@ -4603,359 +4637,379 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-1345,1345,1345,1345,163,1345,1345,1345,1345,1345,1345,1345,163,1345,1345,163,
-
-/* block 222 */
-824,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-
-/* block 223 */
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
+1354,1354,1354,1354,163,1354,1354,1354,1354,1354,1354,1354,163,1354,1354,163,
 
 /* block 224 */
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,
-824,824,824,163,163,163,163,163,163,163,163,163,163,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-819,819,819,163,163,163,163,163,163,163,163,163,163,163,163,163,
-163,163,163,163,824,824,824,824,163,163,163,163,163,163,163,163,
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
+825,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
 
 /* block 225 */
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
 
 /* block 226 */
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,
-1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,1346,163,163,163,163,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
+825,825,825,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,820,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+820,820,820,163,163,825,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,825,825,825,825,163,163,163,163,163,163,163,163,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
 
 /* block 227 */
-1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,
-1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,
-1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,
-1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,
-1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,
-1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,
-1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,163,163,163,163,163,
-1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,163,163,163,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
 
 /* block 228 */
-1347,1347,1347,1347,1347,1347,1347,1347,1347,163,163,163,163,163,163,163,
-1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,163,163,1348,1349,1350,1351,
-1352,1352,1352,1352,163,163,163,163,163,163,163,163,163,163,163,163,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,
+1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,1355,163,163,163,163,
+
+/* block 229 */
+1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,
+1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,
+1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,
+1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,
+1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,
+1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,
+1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,163,163,163,163,163,
+1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,163,163,163,
+
+/* block 230 */
+1356,1356,1356,1356,1356,1356,1356,1356,1356,163,163,163,163,163,163,163,
+1356,1356,1356,1356,1356,1356,1356,1356,1356,1356,163,163,1357,1358,1359,1360,
+1361,1361,1361,1361,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
-/* block 229 */
+/* block 231 */
 154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
 154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
 154,154,154,154,154,154,154,154,154,154,154,154,154,154,163,163,
 154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
 154,154,154,154,154,154,154,163,163,163,163,163,163,163,163,163,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
 
-/* block 230 */
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,163,163,163,163,163,163,163,163,163,163,163,163,
+/* block 232 */
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
-/* block 231 */
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-
-/* block 232 */
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,163,163,163,163,163,163,163,163,163,163,
-
 /* block 233 */
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,163,163,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,1353,1354,154,154,154,460,460,460,1355,1356,1356,
-1356,1356,1356, 51, 51, 51, 51, 51, 51, 51, 51,154,154,154,154,154,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
 
 /* block 234 */
-154,154,154,460,460,154,154,154,154,154,154,154,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,154,154,154,154,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,723,723,163,163,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,163,163,163,163,163,163,163,163,163,163,
 
 /* block 235 */
-1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,
-1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,
-1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,
-1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,
-1002,1002,1357,1357,1357,1002,163,163,163,163,163,163,163,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,163,163,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,1362,1363,154,154,154,461,461,461,1364,1365,1365,
+1365,1365,1365, 51, 51, 51, 51, 51, 51, 51, 51,154,154,154,154,154,
 
 /* block 236 */
+154,154,154,461,461,154,154,154,154,154,154,154,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,154,154,154,154,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,724,724,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+
+/* block 237 */
+1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,
+1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,
+1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,
+1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,
+1001,1001,1366,1366,1366,1001,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+
+/* block 238 */
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,
-835,835,835,835,163,163,163,163,163,163,163,163,163,163,163,163,
-
-/* block 237 */
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,163,163,163,163,163,163,163,163,163,
-832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,
-832,832,835,835,835,835,835,835,835,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+836,836,836,836,836,836,836,836,836,836,836,836,836,836,836,836,
+836,836,836,836,163,163,163,163,163,163,163,163,163,163,163,163,
+836,836,836,836,836,836,836,836,836,836,836,836,836,836,836,836,
+836,836,836,836,163,163,163,163,163,163,163,163,163,163,163,163,
 
-/* block 238 */
+/* block 239 */
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
 724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
-724,724,724,724,724,724,724,724,724,724,725,725,725,725,725,725,
-725,725,736,736,725,725,725,725,725,725,725,725,725,725,725,725,
-725,725,725,725,724,724,724,724,724,724,724,724,724,724,724,724,
-724,724,724,724,724,724,724,724,724,724,724,724,724,724,725,725,
-725,725,725,725,725,163,736,736,725,725,725,725,725,725,725,725,
-725,725,725,725,725,725,725,725,724,724,724,724,724,724,724,724,
 724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
-
-/* block 239 */
-724,724,725,725,725,725,725,725,725,725,736,736,725,725,725,725,
-725,725,725,725,725,725,725,725,725,725,725,725,724,163,724,724,
-163,163,724,163,163,724,724,163,163,724,724,724,724,163,724,724,
-724,724,724,724,724,724,725,725,725,725,163,725,163,725,736,736,
-725,725,725,725,163,725,725,725,725,725,725,725,725,725,725,725,
 724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
-724,724,724,724,724,724,724,724,724,724,725,725,725,725,725,725,
-725,725,736,736,725,725,725,725,725,725,725,725,725,725,725,725,
+724,724,724,724,724,724,724,163,163,163,163,163,163,163,163,163,
+833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,
+833,833,836,836,836,836,836,836,836,163,163,163,163,163,163,163,
 
 /* block 240 */
-725,725,725,725,724,724,163,724,724,724,724,163,163,724,724,724,
-724,724,724,724,724,163,724,724,724,724,724,724,724,163,725,725,
-725,725,725,725,725,725,736,736,725,725,725,725,725,725,725,725,
-725,725,725,725,725,725,725,725,724,724,163,724,724,724,724,163,
-724,724,724,724,724,163,724,163,163,163,724,724,724,724,724,724,
-724,163,725,725,725,725,725,725,725,725,736,736,725,725,725,725,
-725,725,725,725,725,725,725,725,725,725,725,725,724,724,724,724,
-724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,
+725,725,725,725,725,725,725,725,725,725,726,726,726,726,726,726,
+726,726,737,737,726,726,726,726,726,726,726,726,726,726,726,726,
+726,726,726,726,725,725,725,725,725,725,725,725,725,725,725,725,
+725,725,725,725,725,725,725,725,725,725,725,725,725,725,726,726,
+726,726,726,726,726,163,737,737,726,726,726,726,726,726,726,726,
+726,726,726,726,726,726,726,726,725,725,725,725,725,725,725,725,
+725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,
 
 /* block 241 */
-724,724,724,724,724,724,725,725,725,725,725,725,725,725,736,736,
+725,725,726,726,726,726,726,726,726,726,737,737,726,726,726,726,
+726,726,726,726,726,726,726,726,726,726,726,726,725,163,725,725,
+163,163,725,163,163,725,725,163,163,725,725,725,725,163,725,725,
+725,725,725,725,725,725,726,726,726,726,163,726,163,726,737,737,
+726,726,726,726,163,726,726,726,726,726,726,726,726,726,726,726,
 725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,
-724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
-724,724,724,724,724,724,724,724,724,724,725,725,725,725,725,725,
-725,725,736,736,725,725,725,725,725,725,725,725,725,725,725,725,
-725,725,725,725,724,724,724,724,724,724,724,724,724,724,724,724,
-724,724,724,724,724,724,724,724,724,724,724,724,724,724,725,725,
-725,725,725,725,725,725,736,736,725,725,725,725,725,725,725,725,
+725,725,725,725,725,725,725,725,725,725,726,726,726,726,726,726,
+726,726,737,737,726,726,726,726,726,726,726,726,726,726,726,726,
 
 /* block 242 */
-725,725,725,725,725,725,725,725,724,724,724,724,724,724,724,724,
-724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
-724,724,725,725,725,725,725,725,725,725,736,736,725,725,725,725,
-725,725,725,725,725,725,725,725,725,725,725,725,724,724,724,724,
-724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
-724,724,724,724,724,724,725,725,725,725,725,725,725,725,736,736,
+726,726,726,726,725,725,163,725,725,725,725,163,163,725,725,725,
+725,725,725,725,725,163,725,725,725,725,725,725,725,163,726,726,
+726,726,726,726,726,726,737,737,726,726,726,726,726,726,726,726,
+726,726,726,726,726,726,726,726,725,725,163,725,725,725,725,163,
+725,725,725,725,725,163,725,163,163,163,725,725,725,725,725,725,
+725,163,726,726,726,726,726,726,726,726,737,737,726,726,726,726,
+726,726,726,726,726,726,726,726,726,726,726,726,725,725,725,725,
 725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,
-724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
 
 /* block 243 */
-724,724,724,724,724,724,724,724,724,724,725,725,725,725,725,725,
-725,725,736,736,725,725,725,725,725,725,725,725,725,725,725,725,
-725,725,725,725,725,725,163,163,724,724,724,724,724,724,724,724,
-724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
-724,1358,725,725,725,725,725,725,725,725,725,725,725,725,725,725,
-725,725,725,725,725,725,725,725,725,725,725,715,725,725,725,725,
-725,725,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
-724,724,724,724,724,724,724,724,724,724,724,1358,725,725,725,725,
+725,725,725,725,725,725,726,726,726,726,726,726,726,726,737,737,
+726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,
+725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,
+725,725,725,725,725,725,725,725,725,725,726,726,726,726,726,726,
+726,726,737,737,726,726,726,726,726,726,726,726,726,726,726,726,
+726,726,726,726,725,725,725,725,725,725,725,725,725,725,725,725,
+725,725,725,725,725,725,725,725,725,725,725,725,725,725,726,726,
+726,726,726,726,726,726,737,737,726,726,726,726,726,726,726,726,
 
 /* block 244 */
+726,726,726,726,726,726,726,726,725,725,725,725,725,725,725,725,
 725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,
-725,725,725,725,725,715,725,725,725,725,725,725,724,724,724,724,
-724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
-724,724,724,724,724,1358,725,725,725,725,725,725,725,725,725,725,
-725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,715,
-725,725,725,725,725,725,724,724,724,724,724,724,724,724,724,724,
-724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,1358,
+725,725,726,726,726,726,726,726,726,726,737,737,726,726,726,726,
+726,726,726,726,726,726,726,726,726,726,726,726,725,725,725,725,
+725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,
+725,725,725,725,725,725,726,726,726,726,726,726,726,726,737,737,
+726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,
 725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,
 
 /* block 245 */
-725,725,725,725,725,725,725,725,725,715,725,725,725,725,725,725,
-724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
-724,724,724,724,724,724,724,724,724,1358,725,725,725,725,725,725,
+725,725,725,725,725,725,725,725,725,725,726,726,726,726,726,726,
+726,726,737,737,726,726,726,726,726,726,726,726,726,726,726,726,
+726,726,726,726,726,726,163,163,725,725,725,725,725,725,725,725,
 725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,
-725,725,725,715,725,725,725,725,725,725,724,725,163,163,1359,1359,
-1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,
-1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,
-1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,1359,
+725,1367,726,726,726,726,726,726,726,726,726,726,726,726,726,726,
+726,726,726,726,726,726,726,726,726,726,726,716,726,726,726,726,
+726,726,725,725,725,725,725,725,725,725,725,725,725,725,725,725,
+725,725,725,725,725,725,725,725,725,725,725,1367,726,726,726,726,
 
 /* block 246 */
-1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,
-1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,
-1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,
-1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,
-1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,
-1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,
-1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,
-1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,
+726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,
+726,726,726,726,726,716,726,726,726,726,726,726,725,725,725,725,
+725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,
+725,725,725,725,725,1367,726,726,726,726,726,726,726,726,726,726,
+726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,716,
+726,726,726,726,726,726,725,725,725,725,725,725,725,725,725,725,
+725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,1367,
+726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,
 
 /* block 247 */
-1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,
-1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,
-1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,
-1361,1361,1361,1361,1361,1361,1361,1360,1360,1360,1360,1361,1361,1361,1361,1361,
-1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,
-1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,
-1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1360,1360,1360,
-1360,1360,1360,1360,1360,1361,1360,1360,1360,1360,1360,1360,1360,1360,1360,1360,
+726,726,726,726,726,726,726,726,726,716,726,726,726,726,726,726,
+725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,
+725,725,725,725,725,725,725,725,725,1367,726,726,726,726,726,726,
+726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,
+726,726,726,716,726,726,726,726,726,726,725,726,163,163,1368,1368,
+1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,
+1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,
+1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,1368,
 
 /* block 248 */
-1360,1360,1360,1360,1361,1360,1360,1362,1363,1362,1362,1364,163,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,1361,1361,1361,1361,1361,
-163,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,1361,
+1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,
+1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,
+1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,
+1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,
+1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,
+1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,
+1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,
+1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,
+
+/* block 249 */
+1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,
+1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,
+1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,
+1370,1370,1370,1370,1370,1370,1370,1369,1369,1369,1369,1370,1370,1370,1370,1370,
+1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,
+1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,
+1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1369,1369,1369,
+1369,1369,1369,1369,1369,1370,1369,1369,1369,1369,1369,1369,1369,1369,1369,1369,
+
+/* block 250 */
+1369,1369,1369,1369,1370,1369,1369,1371,1372,1371,1371,1373,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,1370,1370,1370,1370,1370,
+163,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
-/* block 249 */
+/* block 251 */
  70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 92, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,643, 70, 70, 70, 70,163,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,644, 70, 70, 70, 70,163,
+163,163,163,163,163, 70, 70, 70, 70, 70, 70,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+
+/* block 252 */
+1374,1374,1374,1374,1374,1374,1374,163,1374,1374,1374,1374,1374,1374,1374,1374,
+1374,1374,1374,1374,1374,1374,1374,1374,1374,163,163,1374,1374,1374,1374,1374,
+1374,1374,163,1374,1374,163,1374,1374,1374,1374,1374,163,163,163,163,163,
+858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
+858,858,858,858,858,858,858,858,858,858,858,858,1375,1375,858,858,
+858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
+858,858,858,858,858,858,858,858,1375,858,858,858,858,858,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
-/* block 250 */
-1365,1365,1365,1365,1365,1365,1365,163,1365,1365,1365,1365,1365,1365,1365,1365,
-1365,1365,1365,1365,1365,1365,1365,1365,1365,163,163,1365,1365,1365,1365,1365,
-1365,1365,163,1365,1365,163,1365,1365,1365,1365,1365,163,163,163,163,163,
+/* block 253 */
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,788,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
-/* block 251 */
-1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,
-1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,
-1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,1366,163,163,163,
-1367,1367,1367,1367,1367,1367,1367,1368,1368,1368,1368,1368,1369,1369,163,163,
-1370,1370,1370,1370,1370,1370,1370,1370,1370,1370,163,163,163,163,1366,1371,
+/* block 254 */
+1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,
+1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,
+1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,163,163,163,
+1377,1377,1377,1377,1377,1377,1377,1378,1378,1378,1378,1378,1379,1379,163,163,
+1380,1380,1380,1380,1380,1380,1380,1380,1380,1380,163,163,163,163,1376,1381,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
-/* block 252 */
+/* block 255 */
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-1372,1372,1372,1372,1372,1372,1372,1372,1372,1372,1372,1372,1372,1372,1372,1372,
-1372,1372,1372,1372,1372,1372,1372,1372,1372,1372,1372,1372,1372,1372,1373,163,
+1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,
+1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1383,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,
-1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,
-1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,1374,1375,1375,1375,1375,
-1376,1376,1376,1376,1376,1376,1376,1376,1376,1376,163,163,163,163,163,1377,
+1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,
+1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,
+1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,1384,1385,1385,1385,1385,
+1386,1386,1386,1386,1386,1386,1386,1386,1386,1386,163,163,163,163,163,1387,
 
-/* block 253 */
+/* block 256 */
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+1388,1388,1388,1388,1388,1388,1388,1388,1388,1388,1388,1388,1388,1388,1388,1388,
+1388,1388,1388,1388,1388,1388,1388,1388,1388,1388,1388,1389,1390,1390,1390,1390,
+1391,1391,1391,1391,1391,1391,1391,1391,1391,1391,163,163,163,163,163,163,
+
+/* block 257 */
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-483,483,483,483,483,483,483,163,483,483,483,483,163,483,483,163,
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,163,
+484,484,484,484,484,484,484,163,484,484,484,484,163,484,484,163,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,163,
 
-/* block 254 */
-1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,
-1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,
-1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,
-1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,
-1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,
-1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,
-1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,
-1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,
+/* block 258 */
+1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,
+1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,
+1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,
+1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,
+1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,
+1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,
+1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,
+1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,
 
-/* block 255 */
-1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,
-1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,
-1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,
-1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,1378,
-1378,1378,1378,1378,1378,262,262,1379,1379,1379,1379,1379,1379,1379,1379,1379,
-1380,1380,1380,1380,1380,1380,1380,262,262,262,262,262,262,262,262,262,
+/* block 259 */
+1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,
+1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,
+1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,
+1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,
+1392,1392,1392,1392,1392,262,262,1393,1393,1393,1393,1393,1393,1393,1393,1393,
+1394,1394,1394,1394,1394,1394,1394,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 
-/* block 256 */
-1381,1381,1381,1381,1381,1381,1381,1381,1381,1381,1381,1381,1381,1381,1381,1381,
-1381,1381,1381,1381,1381,1381,1381,1381,1381,1381,1381,1381,1381,1381,1381,1381,
-1381,1381,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,
-1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,1382,
-1382,1382,1382,1382,1383,1383,1383,1384,1385,1385,1385,1386,262,262,262,262,
-1387,1387,1387,1387,1387,1387,1387,1387,1387,1387,262,262,262,262,1388,1388,
+/* block 260 */
+1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
+1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
+1395,1395,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,
+1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,
+1396,1396,1396,1396,1397,1397,1397,1398,1399,1399,1399,1400,262,262,262,262,
+1401,1401,1401,1401,1401,1401,1401,1401,1401,1401,262,262,262,262,1402,1402,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 
-/* block 257 */
+/* block 261 */
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
@@ -4963,351 +5017,351 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
-302,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,
+302,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,
 
-/* block 258 */
-1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,
-1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,
-1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1390,1389,1389,1389,
-1391,1389,1389,1389,1389,302,302,302,302,302,302,302,302,302,302,302,
+/* block 262 */
+1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,
+1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,
+1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1404,1403,1403,1403,
+1405,1403,1403,1403,1403,302,302,302,302,302,302,302,302,302,302,302,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 
-/* block 259 */
-302,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,
-1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,
-1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1390,1389,
-1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,1389,302,302,
+/* block 263 */
+302,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,
+1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,
+1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1404,1403,
+1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,302,302,
 302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
 
-/* block 260 */
-1392,1392,1392,1392,302,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,
-1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,
-302,1392,1392,302,1392,302,302,1392,302,1392,1392,1392,1392,1392,1392,1392,
-1392,1392,1392,302,1392,1392,1392,1392,302,1392,302,1392,302,302,302,302,
-302,302,1392,302,302,302,302,1392,302,1392,302,1392,302,1392,1392,1392,
-302,1392,1392,302,1392,302,302,1392,302,1392,302,1392,302,1392,302,1392,
-302,1392,1392,302,1392,302,302,1392,1392,1392,1392,302,1392,1392,1392,1392,
-1392,1392,1392,302,1392,1392,1392,1392,302,1392,1392,1392,1392,302,1392,302,
+/* block 264 */
+1406,1406,1406,1406,302,1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,
+1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,
+302,1406,1406,302,1406,302,302,1406,302,1406,1406,1406,1406,1406,1406,1406,
+1406,1406,1406,302,1406,1406,1406,1406,302,1406,302,1406,302,302,302,302,
+302,302,1406,302,302,302,302,1406,302,1406,302,1406,302,1406,1406,1406,
+302,1406,1406,302,1406,302,302,1406,302,1406,302,1406,302,1406,302,1406,
+302,1406,1406,302,1406,302,302,1406,1406,1406,1406,302,1406,1406,1406,1406,
+1406,1406,1406,302,1406,1406,1406,1406,302,1406,1406,1406,1406,302,1406,302,
 
-/* block 261 */
-1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,302,1392,1392,1392,1392,1392,
-1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,302,302,302,302,
-302,1392,1392,1392,302,1392,1392,1392,1392,1392,302,1392,1392,1392,1392,1392,
-1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,1392,302,302,302,302,
+/* block 265 */
+1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,302,1406,1406,1406,1406,1406,
+1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,302,302,302,302,
+302,1406,1406,1406,302,1406,1406,1406,1406,1406,302,1406,1406,1406,1406,1406,
+1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,1406,302,302,302,302,
 302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,
 302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,
 302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,
 274,274,302,302,302,302,302,302,302,302,302,302,302,302,302,302,
 
-/* block 262 */
-1393,1393,1393,1393,1394,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1395,1395,1395,1395,
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-
-/* block 263 */
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,1393,1393,1393,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1395,
-1395,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1395,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1394,
-1395,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,1393,1393,1393,1393,1393,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-
-/* block 264 */
- 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 58, 58,1393,1393,1393,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1393,
-1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,
-1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,460,460,460,460,460,460,
-1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,
-1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,723,723,1393,1393,1393,1393,
-1397,1397,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,1397,1397,
-
-/* block 265 */
-1396,1396,1396,1396,1396,1396,1396,1396,1396,1396,460,460,460,460,1398,460,
-460,1398,1398,1398,1398,1398,1398,1398,1398,1398,1398,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,1393,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1399,1399,1399,1399,1399,1399,1399,1399,1399,1399,
-1399,1399,1399,1399,1399,1399,1399,1399,1399,1399,1399,1399,1399,1399,1399,1399,
-
 /* block 266 */
-1400,1398,1401,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-460,460,460,460,460,460,460,460,460,460,1398,460,460,460,460,460,
-460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1398,
-460,460,1398,1398,1398,1398,1398,1401,1398,1398,1398,460,1395,1395,1395,1395,
-460,460,460,460,460,460,460,460,460,1395,1395,1395,1395,1395,1395,1395,
-1402,1402,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1393,1393,1393,1393,1393,1393,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
+1407,1407,1407,1407,1408,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1409,1409,1409,1409,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
 
 /* block 267 */
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,1407,1407,1407,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1409,
+1409,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1409,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1408,
+1409,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,1407,1407,1407,1407,1407,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
 
 /* block 268 */
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,727,1393,1393,727,727,727,727,727,727,727,727,727,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,727,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,727,1394,1394,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 58, 58,1407,1407,1407,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,1407,
+1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,
+1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,461,461,461,461,461,461,
+1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,
+1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,724,724,1407,1407,1407,1407,
+1411,1411,1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,1411,1411,
 
 /* block 269 */
-1394,1394,1394,1394,1394,1403,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1393,1393,727,727,1393,727,727,727,1393,1393,727,727,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1403,1403,1403,1394,1394,1403,1394,1394,1403,1404,1404,727,727,1394,
-1394,1394,1394,1394,727,727,727,727,727,727,727,727,727,727,727,727,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1393,1393,727,1394,727,1393,727,1394,1394,1394,1405,1405,1405,1405,1405,
+1410,1410,1410,1410,1410,1410,1410,1410,1410,1410,461,461,461,461,1412,461,
+461,1412,1412,1412,1412,1412,1412,1412,1412,1412,1412,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,1407,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1413,1413,1413,1413,1413,1413,1413,1413,1413,1413,
+1413,1413,1413,1413,1413,1413,1413,1413,1413,1413,1413,1413,1413,1413,1413,1413,
 
 /* block 270 */
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,727,
-1394,727,1403,1403,1394,1394,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,
-1403,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,
-1403,1403,1403,1403,1403,1403,1403,1403,1403,1394,1394,1394,1403,1394,1394,1394,
+1414,1412,1415,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+461,461,461,461,461,461,461,461,461,461,1412,461,461,461,461,461,
+461,461,461,461,461,461,461,461,461,461,461,461,461,461,461,1412,
+461,461,1412,1412,1412,1412,1412,1415,1412,1412,1412,461,1409,1409,1409,1409,
+461,461,461,461,461,461,461,461,461,1409,1409,1409,1409,1409,1409,1409,
+1416,1416,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1407,1407,1407,1407,1407,1407,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
 
 /* block 271 */
-1394,1403,1403,1403,1394,1403,1403,1403,1394,1394,1394,1394,1394,1394,1394,1403,
-1394,1403,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1403,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,727,1393,1394,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
 
 /* block 272 */
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,723,723,
-723,723,723,723,723,723,1393,1393,1393,727,727,1394,1394,1394,1394,1393,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1393,1393,1393,1393,1393,1393,1393,727,
-727,1393,1393,727,1404,1404,727,727,727,727,1403,1393,1393,1393,1393,1393,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,728,1407,1407,728,728,728,728,728,728,728,728,728,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,728,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,728,1408,1408,
 
 /* block 273 */
-1393,1393,1393,1393,1393,1393,1393,727,1393,1393,727,727,727,727,1393,1393,
-1404,1393,1393,1393,1393,1403,1403,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,1393,1393,1393,1394,727,1393,1393,727,1393,1393,1393,1393,1393,1393,1393,
-1393,727,727,1393,1393,1393,1393,1393,1393,1393,1393,1393,727,1393,1393,1393,
-1393,1393,727,727,727,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,727,727,727,1393,1393,1393,1393,1393,1393,1393,1393,727,727,727,1393,
-1393,727,1393,727,1393,1393,1393,1393,727,1393,1393,1393,1393,1393,1393,727,
-1393,1393,1393,727,1393,1393,1393,1393,1393,1393,727,1394,1394,1394,1394,1394,
+1408,1408,1408,1408,1408,1417,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1407,1407,728,728,1407,728,728,728,1407,1407,728,728,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1417,1417,1417,1408,1408,1417,1408,1408,1417,1418,1418,728,728,1408,
+1408,1408,1408,1408,728,728,728,728,728,728,728,728,728,728,728,728,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1407,1407,728,1408,728,1407,728,1408,1408,1408,1419,1419,1419,1419,1419,
 
 /* block 274 */
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1403,1403,1403,1394,1394,1394,1403,1403,1403,1403,1403,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,728,
+1408,728,1417,1417,1408,1408,1417,1417,1417,1417,1417,1417,1417,1417,1417,1417,
+1417,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1417,1417,1417,1417,1417,1417,1417,1417,1417,1417,
+1417,1417,1417,1417,1417,1417,1417,1417,1417,1408,1408,1408,1417,1408,1408,1408,
 
 /* block 275 */
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1403,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1403,1403,1403,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1403,1394,1394,1394,1394,1394,1393,1393,1393,1393,1393,727,1403,727,727,727,
-1394,1394,1394,1393,1393,1394,1394,1394,1395,1395,1395,1395,1395,1394,1394,1394,
-727,727,727,727,727,727,1393,1393,1393,727,1393,1394,1394,1395,1395,1395,
-727,1393,1393,727,1394,1394,1394,1394,1394,1394,1394,1394,1394,1395,1395,1395,
+1408,1417,1417,1417,1408,1417,1417,1417,1408,1408,1408,1408,1408,1408,1408,1417,
+1408,1417,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1417,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,728,1407,1408,
 
 /* block 276 */
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,724,724,
+724,724,724,724,724,724,1407,1407,1407,728,728,1408,1408,1408,1408,1407,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1407,1407,1407,1407,1407,1407,1407,728,
+728,1407,1407,728,1418,1418,728,728,728,728,1417,1407,1407,1407,1407,1407,
 
 /* block 277 */
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,1393,1393,1393,1393,1395,1395,1395,1395,1395,1395,1395,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1395,1395,1395,1395,
-1394,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
+1407,1407,1407,1407,1407,1407,1407,728,1407,1407,728,728,728,728,1407,1407,
+1418,1407,1407,1407,1407,1417,1417,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,1407,1407,1407,1408,728,1407,1407,728,1407,1407,1407,1407,1407,1407,1407,
+1407,728,728,1407,1407,1407,1407,1407,1407,1407,1407,1407,728,1407,1407,1407,
+1407,1407,728,728,728,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,728,728,728,1407,1407,1407,1407,1407,1407,1407,1407,728,728,728,1407,
+1407,728,1407,728,1407,1407,1407,1407,728,1407,1407,1407,1407,1407,1407,728,
+1407,1407,1407,728,1407,1407,1407,1407,1407,1407,728,1408,1408,1408,1408,1408,
 
 /* block 278 */
-723,723,723,723,723,723,723,723,723,723,723,723,1395,1395,1395,1395,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,1395,1395,1395,1395,1395,1395,1395,1395,
-723,723,723,723,723,723,723,723,723,723,1395,1395,1395,1395,1395,1395,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1417,1417,1417,1408,1408,1408,1417,1417,1417,1417,1417,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
 
 /* block 279 */
-723,723,723,723,723,723,723,723,1395,1395,1395,1395,1395,1395,1395,1395,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,1395,1395,
-1393,1393,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1417,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1417,1417,1417,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1417,1408,1408,1408,1408,1408,1407,1407,1407,1407,1407,728,1417,728,728,728,
+1408,1408,1408,1407,1407,1408,1408,1408,1409,1409,1409,1409,1408,1408,1408,1408,
+728,728,728,728,728,728,1407,1407,1407,728,1407,1408,1408,1409,1409,1409,
+728,1407,1407,728,1408,1408,1408,1408,1408,1408,1408,1408,1408,1409,1409,1409,
 
 /* block 280 */
-723,723,723,723,723,723,723,723,723,723,723,723,1403,1394,1394,1403,
-1394,1394,1394,1394,1394,1394,1394,1394,1403,1403,1403,1403,1403,1403,1403,1403,
-1394,1394,1394,1394,1394,1394,1403,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1394,723,1403,1403,1403,1394,
-1394,1394,1394,1394,1394,1394,723,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1403,1394,1394,1394,1394,1394,1394,1394,1394,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,1407,1407,1407,1409,1409,1409,1409,1407,1407,1407,1407,1407,
 
 /* block 281 */
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1406,1406,1406,1406,1394,1403,1403,1394,1403,1403,1394,1403,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1403,1403,1403,
-1394,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1403,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,1407,1407,1407,1407,1407,1409,1409,1409,1409,1409,1409,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1409,1409,1409,1409,
+1408,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
 
 /* block 282 */
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,
-1393,1393,1393,1393,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1393,1395,1395,
-1394,1394,1394,1394,1394,1395,1395,1395,1394,1394,1394,1394,1394,1395,1395,1395,
+724,724,724,724,724,724,724,724,724,724,724,724,1409,1409,1409,1409,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,1409,1409,1409,1409,1409,1409,1409,1409,
+724,724,724,724,724,724,724,724,724,724,1409,1409,1409,1409,1409,1409,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
 
 /* block 283 */
-1394,1394,1394,1394,1394,1394,1394,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1395,1395,1395,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1395,1395,1395,1395,1395,
-1394,1394,1394,1403,1403,1403,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1394,1394,1394,1394,1394,1394,1394,1394,1394,1394,1395,1395,1395,1395,1395,1395,
-1394,1394,1394,1394,1394,1394,1394,1394,1395,1395,1395,1395,1395,1395,1395,1395,
-1403,1403,1403,1403,1403,1403,1403,1395,1395,1395,1395,1395,1395,1395,1395,1395,
+724,724,724,724,724,724,724,724,1409,1409,1409,1409,1409,1409,1409,1409,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,1409,1409,
+1407,1407,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
 
 /* block 284 */
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
+724,724,724,724,724,724,724,724,724,724,724,724,1417,1408,1408,1417,
+1408,1408,1408,1408,1408,1408,1408,1408,1417,1417,1417,1417,1417,1417,1417,1417,
+1408,1408,1408,1408,1408,1408,1417,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1417,1417,1417,1417,1417,1417,1417,1417,1417,1417,1408,724,1417,1417,1417,1408,
+1408,1408,1408,1408,1408,1408,724,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1417,1408,1408,1408,1408,1408,1408,1408,1408,
 
 /* block 285 */
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,163,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,
-723,723,723,723,723,723,723,723,723,723,723,163,163,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,163,163,163,163,163,163,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1420,1420,1420,1420,1408,1417,1417,1408,1417,1417,1408,1417,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1417,1417,1417,
+1408,1417,1417,1417,1417,1417,1417,1417,1417,1417,1417,1417,1417,1417,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
 
 /* block 286 */
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,
-1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,1395,958,958,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,
+1407,1407,1407,1407,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1407,1409,1409,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1409,1409,1409,
 
 /* block 287 */
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1409,1409,1409,1409,1409,1409,1409,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1409,1408,
+1408,1408,1408,1417,1417,1417,1409,1409,1409,1409,1409,1409,1409,1409,1408,1408,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1409,1409,1409,1409,
+1408,1408,1408,1408,1408,1408,1408,1408,1408,1409,1409,1409,1409,1409,1409,1409,
+1417,1417,1417,1417,1417,1417,1417,1417,1417,1409,1409,1409,1409,1409,1409,1409,
 
 /* block 288 */
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,163,163,163,163,163,163,163,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
 
 /* block 289 */
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,163,163,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,163,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
+724,724,724,724,724,724,724,724,724,724,724,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+1421,1421,1421,1421,1421,1421,1421,1421,1421,1421,163,163,163,163,163,163,
 
 /* block 290 */
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,
+1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,957,957,
 
 /* block 291 */
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
 /* block 292 */
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,
-953,953,953,953,953,953,953,953,953,953,953,953,953,953,163,163,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,163,163,163,163,163,163,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+
+/* block 293 */
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,163,163,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+
+/* block 294 */
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+
+/* block 295 */
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+
+/* block 296 */
+952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
+952,952,952,952,952,952,952,952,952,952,952,952,952,952,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
@@ -5315,7 +5369,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
-/* block 293 */
+/* block 297 */
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
@@ -5323,67 +5377,77 @@ const uint16_t PRIV(ucd_stage2)[] = { /*
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,958,958,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,957,957,
 
-/* block 294 */
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
-838,838,838,838,838,838,838,838,838,838,838,163,163,163,163,163,
+/* block 298 */
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,163,163,163,163,163,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+
+/* block 299 */
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,839,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
 
-/* block 295 */
-707,712,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
-707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
-1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
-1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
-1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
-1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
-1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
-1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,1408,
-
-/* block 296 */
-707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
-707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
-707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
-707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
-707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
-707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
-707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
-707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
-
-/* block 297 */
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
+/* block 300 */
+708,713,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,
+1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,
+1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,
+1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,
+1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,
+1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,1422,
+
+/* block 301 */
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+
+/* block 302 */
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,
+
+/* block 303 */
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,
+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
 
-/* block 298 */
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,
-707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
-
-/* block 299 */
-952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
-952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
-952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
-952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
-952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
-952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
-952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,
-952,952,952,952,952,952,952,952,952,952,952,952,952,952,958,958,
+/* block 304 */
+951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,
+951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,
+951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,
+951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,
+951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,
+951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,
+951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,
+951,951,951,951,951,951,951,951,951,951,951,951,951,951,957,957,
 };
 
 #if UCD_BLOCK_SIZE != 128
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_ucp.h 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_ucp.h
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_ucp.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_ucp.h	2024-11-20 13:56:33.000000000 +0000
@@ -166,29 +166,29 @@ enum {
 /* These are the bidi class values. */
 
 enum {
-  ucp_bidiAL,   /* Arabic letter */
-  ucp_bidiAN,   /* Arabic number */
-  ucp_bidiB,    /* Paragraph separator */
-  ucp_bidiBN,   /* Boundary neutral */
-  ucp_bidiCS,   /* Common separator */
-  ucp_bidiEN,   /* European number */
-  ucp_bidiES,   /* European separator */
-  ucp_bidiET,   /* European terminator */
-  ucp_bidiFSI,  /* First strong isolate */
-  ucp_bidiL,    /* Left to right */
-  ucp_bidiLRE,  /* Left to right embedding */
-  ucp_bidiLRI,  /* Left to right isolate */
-  ucp_bidiLRO,  /* Left to right override */
-  ucp_bidiNSM,  /* Non-spacing mark */
-  ucp_bidiON,   /* Other neutral */
-  ucp_bidiPDF,  /* Pop directional format */
-  ucp_bidiPDI,  /* Pop directional isolate */
-  ucp_bidiR,    /* Right to left */
-  ucp_bidiRLE,  /* Right to left embedding */
-  ucp_bidiRLI,  /* Right to left isolate */
-  ucp_bidiRLO,  /* Right to left override */
-  ucp_bidiS,    /* Segment separator */
-  ucp_bidiWS,   /* White space */
+  ucp_bidiAL,   /* Arabic_Letter */
+  ucp_bidiAN,   /* Arabic_Number */
+  ucp_bidiB,    /* Paragraph_Separator */
+  ucp_bidiBN,   /* Boundary_Neutral */
+  ucp_bidiCS,   /* Common_Separator */
+  ucp_bidiEN,   /* European_Number */
+  ucp_bidiES,   /* European_Separator */
+  ucp_bidiET,   /* European_Terminator */
+  ucp_bidiFSI,  /* First_Strong_Isolate */
+  ucp_bidiL,    /* Left_To_Right */
+  ucp_bidiLRE,  /* Left_To_Right_Embedding */
+  ucp_bidiLRI,  /* Left_To_Right_Isolate */
+  ucp_bidiLRO,  /* Left_To_Right_Override */
+  ucp_bidiNSM,  /* Nonspacing_Mark */
+  ucp_bidiON,   /* Other_Neutral */
+  ucp_bidiPDF,  /* Pop_Directional_Format */
+  ucp_bidiPDI,  /* Pop_Directional_Isolate */
+  ucp_bidiR,    /* Right_To_Left */
+  ucp_bidiRLE,  /* Right_To_Left_Embedding */
+  ucp_bidiRLI,  /* Right_To_Left_Isolate */
+  ucp_bidiRLO,  /* Right_To_Left_Override */
+  ucp_bidiS,    /* Segment_Separator */
+  ucp_bidiWS,   /* White_Space */
 };
 
 /* These are grapheme break properties. The Extended Pictographic property
@@ -380,6 +380,8 @@ enum {
   ucp_Tangsa,
   ucp_Toto,
   ucp_Vithkuqi,
+  ucp_Kawi,
+  ucp_Nag_Mundari,
 
   /* This must be last */
   ucp_Script_Count
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_ucptables.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_ucptables.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_ucptables.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_ucptables.c	2024-11-20 13:56:33.000000000 +0000
@@ -265,6 +265,7 @@ the "loose matching" rules that Unicode
 #define STRING_kana0 STR_k STR_a STR_n STR_a "\0"
 #define STRING_kannada0 STR_k STR_a STR_n STR_n STR_a STR_d STR_a "\0"
 #define STRING_katakana0 STR_k STR_a STR_t STR_a STR_k STR_a STR_n STR_a "\0"
+#define STRING_kawi0 STR_k STR_a STR_w STR_i "\0"
 #define STRING_kayahli0 STR_k STR_a STR_y STR_a STR_h STR_l STR_i "\0"
 #define STRING_khar0 STR_k STR_h STR_a STR_r "\0"
 #define STRING_kharoshthi0 STR_k STR_h STR_a STR_r STR_o STR_s STR_h STR_t STR_h STR_i "\0"
@@ -347,6 +348,8 @@ the "loose matching" rules that Unicode
 #define STRING_mymr0 STR_m STR_y STR_m STR_r "\0"
 #define STRING_n0 STR_n "\0"
 #define STRING_nabataean0 STR_n STR_a STR_b STR_a STR_t STR_a STR_e STR_a STR_n "\0"
+#define STRING_nagm0 STR_n STR_a STR_g STR_m "\0"
+#define STRING_nagmundari0 STR_n STR_a STR_g STR_m STR_u STR_n STR_d STR_a STR_r STR_i "\0"
 #define STRING_nand0 STR_n STR_a STR_n STR_d "\0"
 #define STRING_nandinagari0 STR_n STR_a STR_n STR_d STR_i STR_n STR_a STR_g STR_a STR_r STR_i "\0"
 #define STRING_narb0 STR_n STR_a STR_r STR_b "\0"
@@ -753,6 +756,7 @@ const char PRIV(utt_names)[] =
   STRING_kana0
   STRING_kannada0
   STRING_katakana0
+  STRING_kawi0
   STRING_kayahli0
   STRING_khar0
   STRING_kharoshthi0
@@ -835,6 +839,8 @@ const char PRIV(utt_names)[] =
   STRING_mymr0
   STRING_n0
   STRING_nabataean0
+  STRING_nagm0
+  STRING_nagmundari0
   STRING_nand0
   STRING_nandinagari0
   STRING_narb0
@@ -1241,280 +1247,283 @@ const ucp_type_table PRIV(utt)[] = {
   { 1665, PT_SCX, ucp_Katakana },
   { 1670, PT_SCX, ucp_Kannada },
   { 1678, PT_SCX, ucp_Katakana },
-  { 1687, PT_SCX, ucp_Kayah_Li },
-  { 1695, PT_SC, ucp_Kharoshthi },
+  { 1687, PT_SC, ucp_Kawi },
+  { 1692, PT_SCX, ucp_Kayah_Li },
   { 1700, PT_SC, ucp_Kharoshthi },
-  { 1711, PT_SC, ucp_Khitan_Small_Script },
-  { 1729, PT_SC, ucp_Khmer },
-  { 1735, PT_SC, ucp_Khmer },
-  { 1740, PT_SCX, ucp_Khojki },
+  { 1705, PT_SC, ucp_Kharoshthi },
+  { 1716, PT_SC, ucp_Khitan_Small_Script },
+  { 1734, PT_SC, ucp_Khmer },
+  { 1740, PT_SC, ucp_Khmer },
   { 1745, PT_SCX, ucp_Khojki },
-  { 1752, PT_SCX, ucp_Khudawadi },
-  { 1762, PT_SC, ucp_Khitan_Small_Script },
-  { 1767, PT_SCX, ucp_Kannada },
-  { 1772, PT_SCX, ucp_Kaithi },
-  { 1777, PT_GC, ucp_L },
-  { 1779, PT_LAMP, 0 },
-  { 1782, PT_SC, ucp_Tai_Tham },
-  { 1787, PT_SC, ucp_Lao },
-  { 1791, PT_SC, ucp_Lao },
-  { 1796, PT_SCX, ucp_Latin },
-  { 1802, PT_SCX, ucp_Latin },
-  { 1807, PT_LAMP, 0 },
-  { 1810, PT_SC, ucp_Lepcha },
+  { 1750, PT_SCX, ucp_Khojki },
+  { 1757, PT_SCX, ucp_Khudawadi },
+  { 1767, PT_SC, ucp_Khitan_Small_Script },
+  { 1772, PT_SCX, ucp_Kannada },
+  { 1777, PT_SCX, ucp_Kaithi },
+  { 1782, PT_GC, ucp_L },
+  { 1784, PT_LAMP, 0 },
+  { 1787, PT_SC, ucp_Tai_Tham },
+  { 1792, PT_SC, ucp_Lao },
+  { 1796, PT_SC, ucp_Lao },
+  { 1801, PT_SCX, ucp_Latin },
+  { 1807, PT_SCX, ucp_Latin },
+  { 1812, PT_LAMP, 0 },
   { 1815, PT_SC, ucp_Lepcha },
-  { 1822, PT_SCX, ucp_Limbu },
+  { 1820, PT_SC, ucp_Lepcha },
   { 1827, PT_SCX, ucp_Limbu },
-  { 1833, PT_SCX, ucp_Linear_A },
-  { 1838, PT_SCX, ucp_Linear_B },
-  { 1843, PT_SCX, ucp_Linear_A },
-  { 1851, PT_SCX, ucp_Linear_B },
-  { 1859, PT_SC, ucp_Lisu },
-  { 1864, PT_PC, ucp_Ll },
-  { 1867, PT_PC, ucp_Lm },
-  { 1870, PT_PC, ucp_Lo },
-  { 1873, PT_BOOL, ucp_Logical_Order_Exception },
-  { 1877, PT_BOOL, ucp_Logical_Order_Exception },
-  { 1899, PT_BOOL, ucp_Lowercase },
-  { 1905, PT_BOOL, ucp_Lowercase },
-  { 1915, PT_PC, ucp_Lt },
-  { 1918, PT_PC, ucp_Lu },
-  { 1921, PT_SC, ucp_Lycian },
+  { 1832, PT_SCX, ucp_Limbu },
+  { 1838, PT_SCX, ucp_Linear_A },
+  { 1843, PT_SCX, ucp_Linear_B },
+  { 1848, PT_SCX, ucp_Linear_A },
+  { 1856, PT_SCX, ucp_Linear_B },
+  { 1864, PT_SC, ucp_Lisu },
+  { 1869, PT_PC, ucp_Ll },
+  { 1872, PT_PC, ucp_Lm },
+  { 1875, PT_PC, ucp_Lo },
+  { 1878, PT_BOOL, ucp_Logical_Order_Exception },
+  { 1882, PT_BOOL, ucp_Logical_Order_Exception },
+  { 1904, PT_BOOL, ucp_Lowercase },
+  { 1910, PT_BOOL, ucp_Lowercase },
+  { 1920, PT_PC, ucp_Lt },
+  { 1923, PT_PC, ucp_Lu },
   { 1926, PT_SC, ucp_Lycian },
-  { 1933, PT_SC, ucp_Lydian },
+  { 1931, PT_SC, ucp_Lycian },
   { 1938, PT_SC, ucp_Lydian },
-  { 1945, PT_GC, ucp_M },
-  { 1947, PT_SCX, ucp_Mahajani },
-  { 1956, PT_SCX, ucp_Mahajani },
-  { 1961, PT_SC, ucp_Makasar },
+  { 1943, PT_SC, ucp_Lydian },
+  { 1950, PT_GC, ucp_M },
+  { 1952, PT_SCX, ucp_Mahajani },
+  { 1961, PT_SCX, ucp_Mahajani },
   { 1966, PT_SC, ucp_Makasar },
-  { 1974, PT_SCX, ucp_Malayalam },
-  { 1984, PT_SCX, ucp_Mandaic },
+  { 1971, PT_SC, ucp_Makasar },
+  { 1979, PT_SCX, ucp_Malayalam },
   { 1989, PT_SCX, ucp_Mandaic },
-  { 1997, PT_SCX, ucp_Manichaean },
+  { 1994, PT_SCX, ucp_Mandaic },
   { 2002, PT_SCX, ucp_Manichaean },
-  { 2013, PT_SC, ucp_Marchen },
+  { 2007, PT_SCX, ucp_Manichaean },
   { 2018, PT_SC, ucp_Marchen },
-  { 2026, PT_SCX, ucp_Masaram_Gondi },
-  { 2039, PT_BOOL, ucp_Math },
-  { 2044, PT_PC, ucp_Mc },
-  { 2047, PT_PC, ucp_Me },
-  { 2050, PT_SC, ucp_Medefaidrin },
-  { 2062, PT_SC, ucp_Medefaidrin },
-  { 2067, PT_SC, ucp_Meetei_Mayek },
-  { 2079, PT_SC, ucp_Mende_Kikakui },
+  { 2023, PT_SC, ucp_Marchen },
+  { 2031, PT_SCX, ucp_Masaram_Gondi },
+  { 2044, PT_BOOL, ucp_Math },
+  { 2049, PT_PC, ucp_Mc },
+  { 2052, PT_PC, ucp_Me },
+  { 2055, PT_SC, ucp_Medefaidrin },
+  { 2067, PT_SC, ucp_Medefaidrin },
+  { 2072, PT_SC, ucp_Meetei_Mayek },
   { 2084, PT_SC, ucp_Mende_Kikakui },
-  { 2097, PT_SC, ucp_Meroitic_Cursive },
-  { 2102, PT_SC, ucp_Meroitic_Hieroglyphs },
-  { 2107, PT_SC, ucp_Meroitic_Cursive },
-  { 2123, PT_SC, ucp_Meroitic_Hieroglyphs },
-  { 2143, PT_SC, ucp_Miao },
-  { 2148, PT_SCX, ucp_Malayalam },
-  { 2153, PT_PC, ucp_Mn },
-  { 2156, PT_SCX, ucp_Modi },
-  { 2161, PT_SCX, ucp_Mongolian },
+  { 2089, PT_SC, ucp_Mende_Kikakui },
+  { 2102, PT_SC, ucp_Meroitic_Cursive },
+  { 2107, PT_SC, ucp_Meroitic_Hieroglyphs },
+  { 2112, PT_SC, ucp_Meroitic_Cursive },
+  { 2128, PT_SC, ucp_Meroitic_Hieroglyphs },
+  { 2148, PT_SC, ucp_Miao },
+  { 2153, PT_SCX, ucp_Malayalam },
+  { 2158, PT_PC, ucp_Mn },
+  { 2161, PT_SCX, ucp_Modi },
   { 2166, PT_SCX, ucp_Mongolian },
-  { 2176, PT_SC, ucp_Mro },
-  { 2180, PT_SC, ucp_Mro },
-  { 2185, PT_SC, ucp_Meetei_Mayek },
-  { 2190, PT_SCX, ucp_Multani },
+  { 2171, PT_SCX, ucp_Mongolian },
+  { 2181, PT_SC, ucp_Mro },
+  { 2185, PT_SC, ucp_Mro },
+  { 2190, PT_SC, ucp_Meetei_Mayek },
   { 2195, PT_SCX, ucp_Multani },
-  { 2203, PT_SCX, ucp_Myanmar },
-  { 2211, PT_SCX, ucp_Myanmar },
-  { 2216, PT_GC, ucp_N },
-  { 2218, PT_SC, ucp_Nabataean },
-  { 2228, PT_SCX, ucp_Nandinagari },
-  { 2233, PT_SCX, ucp_Nandinagari },
-  { 2245, PT_SC, ucp_Old_North_Arabian },
-  { 2250, PT_SC, ucp_Nabataean },
-  { 2255, PT_BOOL, ucp_Noncharacter_Code_Point },
-  { 2261, PT_PC, ucp_Nd },
-  { 2264, PT_SC, ucp_Newa },
-  { 2269, PT_SC, ucp_New_Tai_Lue },
-  { 2279, PT_SCX, ucp_Nko },
-  { 2283, PT_SCX, ucp_Nko },
-  { 2288, PT_PC, ucp_Nl },
-  { 2291, PT_PC, ucp_No },
-  { 2294, PT_BOOL, ucp_Noncharacter_Code_Point },
-  { 2316, PT_SC, ucp_Nushu },
-  { 2321, PT_SC, ucp_Nushu },
-  { 2327, PT_SC, ucp_Nyiakeng_Puachue_Hmong },
-  { 2348, PT_SC, ucp_Ogham },
-  { 2353, PT_SC, ucp_Ogham },
-  { 2359, PT_SC, ucp_Ol_Chiki },
-  { 2367, PT_SC, ucp_Ol_Chiki },
-  { 2372, PT_SC, ucp_Old_Hungarian },
-  { 2385, PT_SC, ucp_Old_Italic },
-  { 2395, PT_SC, ucp_Old_North_Arabian },
-  { 2411, PT_SCX, ucp_Old_Permic },
-  { 2421, PT_SC, ucp_Old_Persian },
-  { 2432, PT_SC, ucp_Old_Sogdian },
-  { 2443, PT_SC, ucp_Old_South_Arabian },
-  { 2459, PT_SC, ucp_Old_Turkic },
-  { 2469, PT_SCX, ucp_Old_Uyghur },
-  { 2479, PT_SCX, ucp_Oriya },
-  { 2485, PT_SC, ucp_Old_Turkic },
-  { 2490, PT_SCX, ucp_Oriya },
-  { 2495, PT_SC, ucp_Osage },
-  { 2501, PT_SC, ucp_Osage },
-  { 2506, PT_SC, ucp_Osmanya },
-  { 2511, PT_SC, ucp_Osmanya },
-  { 2519, PT_SCX, ucp_Old_Uyghur },
-  { 2524, PT_GC, ucp_P },
-  { 2526, PT_SC, ucp_Pahawh_Hmong },
-  { 2538, PT_SC, ucp_Palmyrene },
-  { 2543, PT_SC, ucp_Palmyrene },
-  { 2553, PT_BOOL, ucp_Pattern_Syntax },
-  { 2560, PT_BOOL, ucp_Pattern_Syntax },
-  { 2574, PT_BOOL, ucp_Pattern_White_Space },
-  { 2592, PT_BOOL, ucp_Pattern_White_Space },
-  { 2598, PT_SC, ucp_Pau_Cin_Hau },
-  { 2603, PT_SC, ucp_Pau_Cin_Hau },
-  { 2613, PT_PC, ucp_Pc },
-  { 2616, PT_BOOL, ucp_Prepended_Concatenation_Mark },
-  { 2620, PT_PC, ucp_Pd },
-  { 2623, PT_PC, ucp_Pe },
-  { 2626, PT_SCX, ucp_Old_Permic },
-  { 2631, PT_PC, ucp_Pf },
-  { 2634, PT_SCX, ucp_Phags_Pa },
-  { 2639, PT_SCX, ucp_Phags_Pa },
-  { 2647, PT_SC, ucp_Inscriptional_Pahlavi },
-  { 2652, PT_SCX, ucp_Psalter_Pahlavi },
-  { 2657, PT_SC, ucp_Phoenician },
-  { 2662, PT_SC, ucp_Phoenician },
-  { 2673, PT_PC, ucp_Pi },
-  { 2676, PT_SC, ucp_Miao },
-  { 2681, PT_PC, ucp_Po },
-  { 2684, PT_BOOL, ucp_Prepended_Concatenation_Mark },
-  { 2711, PT_SC, ucp_Inscriptional_Parthian },
-  { 2716, PT_PC, ucp_Ps },
-  { 2719, PT_SCX, ucp_Psalter_Pahlavi },
-  { 2734, PT_SCX, ucp_Coptic },
-  { 2739, PT_SC, ucp_Inherited },
-  { 2744, PT_BOOL, ucp_Quotation_Mark },
-  { 2750, PT_BOOL, ucp_Quotation_Mark },
-  { 2764, PT_BOOL, ucp_Radical },
-  { 2772, PT_BOOL, ucp_Regional_Indicator },
-  { 2790, PT_SC, ucp_Rejang },
-  { 2797, PT_BOOL, ucp_Regional_Indicator },
-  { 2800, PT_SC, ucp_Rejang },
-  { 2805, PT_SCX, ucp_Hanifi_Rohingya },
-  { 2810, PT_SC, ucp_Runic },
-  { 2816, PT_SC, ucp_Runic },
-  { 2821, PT_GC, ucp_S },
-  { 2823, PT_SC, ucp_Samaritan },
-  { 2833, PT_SC, ucp_Samaritan },
-  { 2838, PT_SC, ucp_Old_South_Arabian },
-  { 2843, PT_SC, ucp_Saurashtra },
-  { 2848, PT_SC, ucp_Saurashtra },
-  { 2859, PT_PC, ucp_Sc },
-  { 2862, PT_BOOL, ucp_Soft_Dotted },
-  { 2865, PT_BOOL, ucp_Sentence_Terminal },
-  { 2882, PT_SC, ucp_SignWriting },
-  { 2887, PT_SCX, ucp_Sharada },
-  { 2895, PT_SC, ucp_Shavian },
-  { 2903, PT_SC, ucp_Shavian },
+  { 2200, PT_SCX, ucp_Multani },
+  { 2208, PT_SCX, ucp_Myanmar },
+  { 2216, PT_SCX, ucp_Myanmar },
+  { 2221, PT_GC, ucp_N },
+  { 2223, PT_SC, ucp_Nabataean },
+  { 2233, PT_SC, ucp_Nag_Mundari },
+  { 2238, PT_SC, ucp_Nag_Mundari },
+  { 2249, PT_SCX, ucp_Nandinagari },
+  { 2254, PT_SCX, ucp_Nandinagari },
+  { 2266, PT_SC, ucp_Old_North_Arabian },
+  { 2271, PT_SC, ucp_Nabataean },
+  { 2276, PT_BOOL, ucp_Noncharacter_Code_Point },
+  { 2282, PT_PC, ucp_Nd },
+  { 2285, PT_SC, ucp_Newa },
+  { 2290, PT_SC, ucp_New_Tai_Lue },
+  { 2300, PT_SCX, ucp_Nko },
+  { 2304, PT_SCX, ucp_Nko },
+  { 2309, PT_PC, ucp_Nl },
+  { 2312, PT_PC, ucp_No },
+  { 2315, PT_BOOL, ucp_Noncharacter_Code_Point },
+  { 2337, PT_SC, ucp_Nushu },
+  { 2342, PT_SC, ucp_Nushu },
+  { 2348, PT_SC, ucp_Nyiakeng_Puachue_Hmong },
+  { 2369, PT_SC, ucp_Ogham },
+  { 2374, PT_SC, ucp_Ogham },
+  { 2380, PT_SC, ucp_Ol_Chiki },
+  { 2388, PT_SC, ucp_Ol_Chiki },
+  { 2393, PT_SC, ucp_Old_Hungarian },
+  { 2406, PT_SC, ucp_Old_Italic },
+  { 2416, PT_SC, ucp_Old_North_Arabian },
+  { 2432, PT_SCX, ucp_Old_Permic },
+  { 2442, PT_SC, ucp_Old_Persian },
+  { 2453, PT_SC, ucp_Old_Sogdian },
+  { 2464, PT_SC, ucp_Old_South_Arabian },
+  { 2480, PT_SC, ucp_Old_Turkic },
+  { 2490, PT_SCX, ucp_Old_Uyghur },
+  { 2500, PT_SCX, ucp_Oriya },
+  { 2506, PT_SC, ucp_Old_Turkic },
+  { 2511, PT_SCX, ucp_Oriya },
+  { 2516, PT_SC, ucp_Osage },
+  { 2522, PT_SC, ucp_Osage },
+  { 2527, PT_SC, ucp_Osmanya },
+  { 2532, PT_SC, ucp_Osmanya },
+  { 2540, PT_SCX, ucp_Old_Uyghur },
+  { 2545, PT_GC, ucp_P },
+  { 2547, PT_SC, ucp_Pahawh_Hmong },
+  { 2559, PT_SC, ucp_Palmyrene },
+  { 2564, PT_SC, ucp_Palmyrene },
+  { 2574, PT_BOOL, ucp_Pattern_Syntax },
+  { 2581, PT_BOOL, ucp_Pattern_Syntax },
+  { 2595, PT_BOOL, ucp_Pattern_White_Space },
+  { 2613, PT_BOOL, ucp_Pattern_White_Space },
+  { 2619, PT_SC, ucp_Pau_Cin_Hau },
+  { 2624, PT_SC, ucp_Pau_Cin_Hau },
+  { 2634, PT_PC, ucp_Pc },
+  { 2637, PT_BOOL, ucp_Prepended_Concatenation_Mark },
+  { 2641, PT_PC, ucp_Pd },
+  { 2644, PT_PC, ucp_Pe },
+  { 2647, PT_SCX, ucp_Old_Permic },
+  { 2652, PT_PC, ucp_Pf },
+  { 2655, PT_SCX, ucp_Phags_Pa },
+  { 2660, PT_SCX, ucp_Phags_Pa },
+  { 2668, PT_SC, ucp_Inscriptional_Pahlavi },
+  { 2673, PT_SCX, ucp_Psalter_Pahlavi },
+  { 2678, PT_SC, ucp_Phoenician },
+  { 2683, PT_SC, ucp_Phoenician },
+  { 2694, PT_PC, ucp_Pi },
+  { 2697, PT_SC, ucp_Miao },
+  { 2702, PT_PC, ucp_Po },
+  { 2705, PT_BOOL, ucp_Prepended_Concatenation_Mark },
+  { 2732, PT_SC, ucp_Inscriptional_Parthian },
+  { 2737, PT_PC, ucp_Ps },
+  { 2740, PT_SCX, ucp_Psalter_Pahlavi },
+  { 2755, PT_SCX, ucp_Coptic },
+  { 2760, PT_SC, ucp_Inherited },
+  { 2765, PT_BOOL, ucp_Quotation_Mark },
+  { 2771, PT_BOOL, ucp_Quotation_Mark },
+  { 2785, PT_BOOL, ucp_Radical },
+  { 2793, PT_BOOL, ucp_Regional_Indicator },
+  { 2811, PT_SC, ucp_Rejang },
+  { 2818, PT_BOOL, ucp_Regional_Indicator },
+  { 2821, PT_SC, ucp_Rejang },
+  { 2826, PT_SCX, ucp_Hanifi_Rohingya },
+  { 2831, PT_SC, ucp_Runic },
+  { 2837, PT_SC, ucp_Runic },
+  { 2842, PT_GC, ucp_S },
+  { 2844, PT_SC, ucp_Samaritan },
+  { 2854, PT_SC, ucp_Samaritan },
+  { 2859, PT_SC, ucp_Old_South_Arabian },
+  { 2864, PT_SC, ucp_Saurashtra },
+  { 2869, PT_SC, ucp_Saurashtra },
+  { 2880, PT_PC, ucp_Sc },
+  { 2883, PT_BOOL, ucp_Soft_Dotted },
+  { 2886, PT_BOOL, ucp_Sentence_Terminal },
+  { 2903, PT_SC, ucp_SignWriting },
   { 2908, PT_SCX, ucp_Sharada },
-  { 2913, PT_SC, ucp_Siddham },
-  { 2918, PT_SC, ucp_Siddham },
-  { 2926, PT_SC, ucp_SignWriting },
-  { 2938, PT_SCX, ucp_Khudawadi },
-  { 2943, PT_SCX, ucp_Sinhala },
-  { 2948, PT_SCX, ucp_Sinhala },
-  { 2956, PT_PC, ucp_Sk },
-  { 2959, PT_PC, ucp_Sm },
-  { 2962, PT_PC, ucp_So },
-  { 2965, PT_BOOL, ucp_Soft_Dotted },
-  { 2976, PT_SCX, ucp_Sogdian },
-  { 2981, PT_SCX, ucp_Sogdian },
-  { 2989, PT_SC, ucp_Old_Sogdian },
-  { 2994, PT_SC, ucp_Sora_Sompeng },
-  { 2999, PT_SC, ucp_Sora_Sompeng },
-  { 3011, PT_SC, ucp_Soyombo },
-  { 3016, PT_SC, ucp_Soyombo },
-  { 3024, PT_BOOL, ucp_White_Space },
-  { 3030, PT_BOOL, ucp_Sentence_Terminal },
-  { 3036, PT_SC, ucp_Sundanese },
-  { 3041, PT_SC, ucp_Sundanese },
-  { 3051, PT_SCX, ucp_Syloti_Nagri },
-  { 3056, PT_SCX, ucp_Syloti_Nagri },
-  { 3068, PT_SCX, ucp_Syriac },
-  { 3073, PT_SCX, ucp_Syriac },
-  { 3080, PT_SCX, ucp_Tagalog },
-  { 3088, PT_SCX, ucp_Tagbanwa },
-  { 3093, PT_SCX, ucp_Tagbanwa },
-  { 3102, PT_SCX, ucp_Tai_Le },
-  { 3108, PT_SC, ucp_Tai_Tham },
-  { 3116, PT_SC, ucp_Tai_Viet },
-  { 3124, PT_SCX, ucp_Takri },
-  { 3129, PT_SCX, ucp_Takri },
-  { 3135, PT_SCX, ucp_Tai_Le },
-  { 3140, PT_SC, ucp_New_Tai_Lue },
-  { 3145, PT_SCX, ucp_Tamil },
-  { 3151, PT_SCX, ucp_Tamil },
-  { 3156, PT_SC, ucp_Tangut },
-  { 3161, PT_SC, ucp_Tangsa },
-  { 3168, PT_SC, ucp_Tangut },
-  { 3175, PT_SC, ucp_Tai_Viet },
-  { 3180, PT_SCX, ucp_Telugu },
-  { 3185, PT_SCX, ucp_Telugu },
-  { 3192, PT_BOOL, ucp_Terminal_Punctuation },
-  { 3197, PT_BOOL, ucp_Terminal_Punctuation },
-  { 3217, PT_SC, ucp_Tifinagh },
-  { 3222, PT_SCX, ucp_Tagalog },
-  { 3227, PT_SCX, ucp_Thaana },
-  { 3232, PT_SCX, ucp_Thaana },
-  { 3239, PT_SC, ucp_Thai },
-  { 3244, PT_SC, ucp_Tibetan },
-  { 3252, PT_SC, ucp_Tibetan },
-  { 3257, PT_SC, ucp_Tifinagh },
-  { 3266, PT_SCX, ucp_Tirhuta },
-  { 3271, PT_SCX, ucp_Tirhuta },
-  { 3279, PT_SC, ucp_Tangsa },
-  { 3284, PT_SC, ucp_Toto },
-  { 3289, PT_SC, ucp_Ugaritic },
-  { 3294, PT_SC, ucp_Ugaritic },
-  { 3303, PT_BOOL, ucp_Unified_Ideograph },
-  { 3309, PT_BOOL, ucp_Unified_Ideograph },
-  { 3326, PT_SC, ucp_Unknown },
-  { 3334, PT_BOOL, ucp_Uppercase },
-  { 3340, PT_BOOL, ucp_Uppercase },
-  { 3350, PT_SC, ucp_Vai },
-  { 3354, PT_SC, ucp_Vai },
-  { 3359, PT_BOOL, ucp_Variation_Selector },
-  { 3377, PT_SC, ucp_Vithkuqi },
-  { 3382, PT_SC, ucp_Vithkuqi },
-  { 3391, PT_BOOL, ucp_Variation_Selector },
-  { 3394, PT_SC, ucp_Wancho },
-  { 3401, PT_SC, ucp_Warang_Citi },
-  { 3406, PT_SC, ucp_Warang_Citi },
-  { 3417, PT_SC, ucp_Wancho },
-  { 3422, PT_BOOL, ucp_White_Space },
-  { 3433, PT_BOOL, ucp_White_Space },
-  { 3440, PT_ALNUM, 0 },
-  { 3444, PT_BOOL, ucp_XID_Continue },
-  { 3449, PT_BOOL, ucp_XID_Continue },
-  { 3461, PT_BOOL, ucp_XID_Start },
-  { 3466, PT_BOOL, ucp_XID_Start },
-  { 3475, PT_SC, ucp_Old_Persian },
-  { 3480, PT_PXSPACE, 0 },
-  { 3484, PT_SPACE, 0 },
-  { 3488, PT_SC, ucp_Cuneiform },
-  { 3493, PT_UCNC, 0 },
-  { 3497, PT_WORD, 0 },
-  { 3501, PT_SCX, ucp_Yezidi },
-  { 3506, PT_SCX, ucp_Yezidi },
-  { 3513, PT_SCX, ucp_Yi },
-  { 3516, PT_SCX, ucp_Yi },
-  { 3521, PT_GC, ucp_Z },
-  { 3523, PT_SC, ucp_Zanabazar_Square },
-  { 3539, PT_SC, ucp_Zanabazar_Square },
-  { 3544, PT_SC, ucp_Inherited },
-  { 3549, PT_PC, ucp_Zl },
-  { 3552, PT_PC, ucp_Zp },
-  { 3555, PT_PC, ucp_Zs },
-  { 3558, PT_SC, ucp_Common },
-  { 3563, PT_SC, ucp_Unknown }
+  { 2916, PT_SC, ucp_Shavian },
+  { 2924, PT_SC, ucp_Shavian },
+  { 2929, PT_SCX, ucp_Sharada },
+  { 2934, PT_SC, ucp_Siddham },
+  { 2939, PT_SC, ucp_Siddham },
+  { 2947, PT_SC, ucp_SignWriting },
+  { 2959, PT_SCX, ucp_Khudawadi },
+  { 2964, PT_SCX, ucp_Sinhala },
+  { 2969, PT_SCX, ucp_Sinhala },
+  { 2977, PT_PC, ucp_Sk },
+  { 2980, PT_PC, ucp_Sm },
+  { 2983, PT_PC, ucp_So },
+  { 2986, PT_BOOL, ucp_Soft_Dotted },
+  { 2997, PT_SCX, ucp_Sogdian },
+  { 3002, PT_SCX, ucp_Sogdian },
+  { 3010, PT_SC, ucp_Old_Sogdian },
+  { 3015, PT_SC, ucp_Sora_Sompeng },
+  { 3020, PT_SC, ucp_Sora_Sompeng },
+  { 3032, PT_SC, ucp_Soyombo },
+  { 3037, PT_SC, ucp_Soyombo },
+  { 3045, PT_BOOL, ucp_White_Space },
+  { 3051, PT_BOOL, ucp_Sentence_Terminal },
+  { 3057, PT_SC, ucp_Sundanese },
+  { 3062, PT_SC, ucp_Sundanese },
+  { 3072, PT_SCX, ucp_Syloti_Nagri },
+  { 3077, PT_SCX, ucp_Syloti_Nagri },
+  { 3089, PT_SCX, ucp_Syriac },
+  { 3094, PT_SCX, ucp_Syriac },
+  { 3101, PT_SCX, ucp_Tagalog },
+  { 3109, PT_SCX, ucp_Tagbanwa },
+  { 3114, PT_SCX, ucp_Tagbanwa },
+  { 3123, PT_SCX, ucp_Tai_Le },
+  { 3129, PT_SC, ucp_Tai_Tham },
+  { 3137, PT_SC, ucp_Tai_Viet },
+  { 3145, PT_SCX, ucp_Takri },
+  { 3150, PT_SCX, ucp_Takri },
+  { 3156, PT_SCX, ucp_Tai_Le },
+  { 3161, PT_SC, ucp_New_Tai_Lue },
+  { 3166, PT_SCX, ucp_Tamil },
+  { 3172, PT_SCX, ucp_Tamil },
+  { 3177, PT_SC, ucp_Tangut },
+  { 3182, PT_SC, ucp_Tangsa },
+  { 3189, PT_SC, ucp_Tangut },
+  { 3196, PT_SC, ucp_Tai_Viet },
+  { 3201, PT_SCX, ucp_Telugu },
+  { 3206, PT_SCX, ucp_Telugu },
+  { 3213, PT_BOOL, ucp_Terminal_Punctuation },
+  { 3218, PT_BOOL, ucp_Terminal_Punctuation },
+  { 3238, PT_SC, ucp_Tifinagh },
+  { 3243, PT_SCX, ucp_Tagalog },
+  { 3248, PT_SCX, ucp_Thaana },
+  { 3253, PT_SCX, ucp_Thaana },
+  { 3260, PT_SC, ucp_Thai },
+  { 3265, PT_SC, ucp_Tibetan },
+  { 3273, PT_SC, ucp_Tibetan },
+  { 3278, PT_SC, ucp_Tifinagh },
+  { 3287, PT_SCX, ucp_Tirhuta },
+  { 3292, PT_SCX, ucp_Tirhuta },
+  { 3300, PT_SC, ucp_Tangsa },
+  { 3305, PT_SC, ucp_Toto },
+  { 3310, PT_SC, ucp_Ugaritic },
+  { 3315, PT_SC, ucp_Ugaritic },
+  { 3324, PT_BOOL, ucp_Unified_Ideograph },
+  { 3330, PT_BOOL, ucp_Unified_Ideograph },
+  { 3347, PT_SC, ucp_Unknown },
+  { 3355, PT_BOOL, ucp_Uppercase },
+  { 3361, PT_BOOL, ucp_Uppercase },
+  { 3371, PT_SC, ucp_Vai },
+  { 3375, PT_SC, ucp_Vai },
+  { 3380, PT_BOOL, ucp_Variation_Selector },
+  { 3398, PT_SC, ucp_Vithkuqi },
+  { 3403, PT_SC, ucp_Vithkuqi },
+  { 3412, PT_BOOL, ucp_Variation_Selector },
+  { 3415, PT_SC, ucp_Wancho },
+  { 3422, PT_SC, ucp_Warang_Citi },
+  { 3427, PT_SC, ucp_Warang_Citi },
+  { 3438, PT_SC, ucp_Wancho },
+  { 3443, PT_BOOL, ucp_White_Space },
+  { 3454, PT_BOOL, ucp_White_Space },
+  { 3461, PT_ALNUM, 0 },
+  { 3465, PT_BOOL, ucp_XID_Continue },
+  { 3470, PT_BOOL, ucp_XID_Continue },
+  { 3482, PT_BOOL, ucp_XID_Start },
+  { 3487, PT_BOOL, ucp_XID_Start },
+  { 3496, PT_SC, ucp_Old_Persian },
+  { 3501, PT_PXSPACE, 0 },
+  { 3505, PT_SPACE, 0 },
+  { 3509, PT_SC, ucp_Cuneiform },
+  { 3514, PT_UCNC, 0 },
+  { 3518, PT_WORD, 0 },
+  { 3522, PT_SCX, ucp_Yezidi },
+  { 3527, PT_SCX, ucp_Yezidi },
+  { 3534, PT_SCX, ucp_Yi },
+  { 3537, PT_SCX, ucp_Yi },
+  { 3542, PT_GC, ucp_Z },
+  { 3544, PT_SC, ucp_Zanabazar_Square },
+  { 3560, PT_SC, ucp_Zanabazar_Square },
+  { 3565, PT_SC, ucp_Inherited },
+  { 3570, PT_PC, ucp_Zl },
+  { 3573, PT_PC, ucp_Zp },
+  { 3576, PT_PC, ucp_Zs },
+  { 3579, PT_SC, ucp_Common },
+  { 3584, PT_SC, ucp_Unknown }
 };
 
 const size_t PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_valid_utf.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_valid_utf.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_valid_utf.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_valid_utf.c	2024-11-20 13:56:33.000000000 +0000
@@ -171,7 +171,7 @@ for (p = string; length > 0; p++)
 
   if (((d = *(++p)) & 0xc0) != 0x80)
     {
-    *erroroffset = (int)(p - string) - 1;
+    *erroroffset = (PCRE2_SIZE)(p - string) - 1;
     return PCRE2_ERROR_UTF8_ERR6;
     }
 
@@ -186,7 +186,7 @@ for (p = string; length > 0; p++)
 
     case 1: if ((c & 0x3e) == 0)
       {
-      *erroroffset = (int)(p - string) - 1;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 1;
       return PCRE2_ERROR_UTF8_ERR15;
       }
     break;
@@ -198,17 +198,17 @@ for (p = string; length > 0; p++)
     case 2:
     if ((*(++p) & 0xc0) != 0x80)     /* Third byte */
       {
-      *erroroffset = (int)(p - string) - 2;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 2;
       return PCRE2_ERROR_UTF8_ERR7;
       }
     if (c == 0xe0 && (d & 0x20) == 0)
       {
-      *erroroffset = (int)(p - string) - 2;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 2;
       return PCRE2_ERROR_UTF8_ERR16;
       }
     if (c == 0xed && d >= 0xa0)
       {
-      *erroroffset = (int)(p - string) - 2;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 2;
       return PCRE2_ERROR_UTF8_ERR14;
       }
     break;
@@ -220,22 +220,22 @@ for (p = string; length > 0; p++)
     case 3:
     if ((*(++p) & 0xc0) != 0x80)     /* Third byte */
       {
-      *erroroffset = (int)(p - string) - 2;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 2;
       return PCRE2_ERROR_UTF8_ERR7;
       }
     if ((*(++p) & 0xc0) != 0x80)     /* Fourth byte */
       {
-      *erroroffset = (int)(p - string) - 3;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 3;
       return PCRE2_ERROR_UTF8_ERR8;
       }
     if (c == 0xf0 && (d & 0x30) == 0)
       {
-      *erroroffset = (int)(p - string) - 3;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 3;
       return PCRE2_ERROR_UTF8_ERR17;
       }
     if (c > 0xf4 || (c == 0xf4 && d > 0x8f))
       {
-      *erroroffset = (int)(p - string) - 3;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 3;
       return PCRE2_ERROR_UTF8_ERR13;
       }
     break;
@@ -251,22 +251,22 @@ for (p = string; length > 0; p++)
     case 4:
     if ((*(++p) & 0xc0) != 0x80)     /* Third byte */
       {
-      *erroroffset = (int)(p - string) - 2;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 2;
       return PCRE2_ERROR_UTF8_ERR7;
       }
     if ((*(++p) & 0xc0) != 0x80)     /* Fourth byte */
       {
-      *erroroffset = (int)(p - string) - 3;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 3;
       return PCRE2_ERROR_UTF8_ERR8;
       }
     if ((*(++p) & 0xc0) != 0x80)     /* Fifth byte */
       {
-      *erroroffset = (int)(p - string) - 4;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 4;
       return PCRE2_ERROR_UTF8_ERR9;
       }
     if (c == 0xf8 && (d & 0x38) == 0)
       {
-      *erroroffset = (int)(p - string) - 4;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 4;
       return PCRE2_ERROR_UTF8_ERR18;
       }
     break;
@@ -277,27 +277,27 @@ for (p = string; length > 0; p++)
     case 5:
     if ((*(++p) & 0xc0) != 0x80)     /* Third byte */
       {
-      *erroroffset = (int)(p - string) - 2;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 2;
       return PCRE2_ERROR_UTF8_ERR7;
       }
     if ((*(++p) & 0xc0) != 0x80)     /* Fourth byte */
       {
-      *erroroffset = (int)(p - string) - 3;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 3;
       return PCRE2_ERROR_UTF8_ERR8;
       }
     if ((*(++p) & 0xc0) != 0x80)     /* Fifth byte */
       {
-      *erroroffset = (int)(p - string) - 4;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 4;
       return PCRE2_ERROR_UTF8_ERR9;
       }
     if ((*(++p) & 0xc0) != 0x80)     /* Sixth byte */
       {
-      *erroroffset = (int)(p - string) - 5;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 5;
       return PCRE2_ERROR_UTF8_ERR10;
       }
     if (c == 0xfc && (d & 0x3c) == 0)
       {
-      *erroroffset = (int)(p - string) - 5;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 5;
       return PCRE2_ERROR_UTF8_ERR19;
       }
     break;
@@ -309,7 +309,7 @@ for (p = string; length > 0; p++)
 
   if (ab > 3)
     {
-    *erroroffset = (int)(p - string) - ab;
+    *erroroffset = (PCRE2_SIZE)(p - string) - ab;
     return (ab == 4)? PCRE2_ERROR_UTF8_ERR11 : PCRE2_ERROR_UTF8_ERR12;
     }
   }
@@ -340,21 +340,21 @@ for (p = string; length > 0; p++)
     /* High surrogate. Must be a followed by a low surrogate. */
     if (length == 0)
       {
-      *erroroffset = p - string;
+      *erroroffset = (PCRE2_SIZE)(p - string);
       return PCRE2_ERROR_UTF16_ERR1;
       }
     p++;
     length--;
     if ((*p & 0xfc00) != 0xdc00)
       {
-      *erroroffset = p - string - 1;
+      *erroroffset = (PCRE2_SIZE)(p - string) - 1;
       return PCRE2_ERROR_UTF16_ERR2;
       }
     }
   else
     {
     /* Isolated low surrogate. Always an error. */
-    *erroroffset = p - string;
+    *erroroffset = (PCRE2_SIZE)(p - string);
     return PCRE2_ERROR_UTF16_ERR3;
     }
   }
@@ -379,14 +379,14 @@ for (p = string; length > 0; length--, p
     /* Normal UTF-32 code point. Neither high nor low surrogate. */
     if (c > 0x10ffffu)
       {
-      *erroroffset = p - string;
+      *erroroffset = (PCRE2_SIZE)(p - string);
       return PCRE2_ERROR_UTF32_ERR2;
       }
     }
   else
     {
     /* A surrogate */
-    *erroroffset = p - string;
+    *erroroffset = (PCRE2_SIZE)(p - string);
     return PCRE2_ERROR_UTF32_ERR1;
     }
   }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_xclass.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_xclass.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/pcre2_xclass.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/pcre2_xclass.c	2024-11-20 13:56:33.000000000 +0000
@@ -7,7 +7,7 @@ and semantics are as close as possible t
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2022 University of Cambridge
+          New API code Copyright (c) 2016-2023 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -133,6 +133,7 @@ while ((t = *data++) != XCL_END)
 #ifdef SUPPORT_UNICODE
   else  /* XCL_PROP & XCL_NOTPROP */
     {
+    int chartype;
     const ucd_record *prop = GET_UCD(c);
     BOOL isprop = t == XCL_PROP;
     BOOL ok;
@@ -144,8 +145,9 @@ while ((t = *data++) != XCL_END)
       break;
 
       case PT_LAMP:
-      if ((prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||
-           prop->chartype == ucp_Lt) == isprop) return !negated;
+      chartype = prop->chartype;
+      if ((chartype == ucp_Lu || chartype == ucp_Ll ||
+           chartype == ucp_Lt) == isprop) return !negated;
       break;
 
       case PT_GC:
@@ -168,8 +170,9 @@ while ((t = *data++) != XCL_END)
       break;
 
       case PT_ALNUM:
-      if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
-           PRIV(ucp_gentype)[prop->chartype] == ucp_N) == isprop)
+      chartype = prop->chartype;
+      if ((PRIV(ucp_gentype)[chartype] == ucp_L ||
+           PRIV(ucp_gentype)[chartype] == ucp_N) == isprop)
         return !negated;
       break;
 
@@ -194,9 +197,10 @@ while ((t = *data++) != XCL_END)
       break;
 
       case PT_WORD:
-      if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
-           PRIV(ucp_gentype)[prop->chartype] == ucp_N || c == CHAR_UNDERSCORE)
-             == isprop)
+      chartype = prop->chartype;
+      if ((PRIV(ucp_gentype)[chartype] == ucp_L ||
+           PRIV(ucp_gentype)[chartype] == ucp_N ||
+           chartype == ucp_Mn || chartype == ucp_Pc) == isprop)
         return !negated;
       break;
 
@@ -238,9 +242,10 @@ while ((t = *data++) != XCL_END)
       */
 
       case PT_PXGRAPH:
-      if ((PRIV(ucp_gentype)[prop->chartype] != ucp_Z &&
-            (PRIV(ucp_gentype)[prop->chartype] != ucp_C ||
-              (prop->chartype == ucp_Cf &&
+      chartype = prop->chartype;
+      if ((PRIV(ucp_gentype)[chartype] != ucp_Z &&
+            (PRIV(ucp_gentype)[chartype] != ucp_C ||
+              (chartype == ucp_Cf &&
                 c != 0x061c && c != 0x180e && (c < 0x2066 || c > 0x2069))
          )) == isprop)
         return !negated;
@@ -250,10 +255,11 @@ while ((t = *data++) != XCL_END)
       not Zl and not Zp, and U+180E. */
 
       case PT_PXPRINT:
-      if ((prop->chartype != ucp_Zl &&
-           prop->chartype != ucp_Zp &&
-            (PRIV(ucp_gentype)[prop->chartype] != ucp_C ||
-              (prop->chartype == ucp_Cf &&
+      chartype = prop->chartype;
+      if ((chartype != ucp_Zl &&
+           chartype != ucp_Zp &&
+            (PRIV(ucp_gentype)[chartype] != ucp_C ||
+              (chartype == ucp_Cf &&
                 c != 0x061c && (c < 0x2066 || c > 0x2069))
          )) == isprop)
         return !negated;
@@ -264,8 +270,21 @@ while ((t = *data++) != XCL_END)
       compatibility (these are $+<=>^`|~). */
 
       case PT_PXPUNCT:
-      if ((PRIV(ucp_gentype)[prop->chartype] == ucp_P ||
-            (c < 128 && PRIV(ucp_gentype)[prop->chartype] == ucp_S)) == isprop)
+      chartype = prop->chartype;
+      if ((PRIV(ucp_gentype)[chartype] == ucp_P ||
+            (c < 128 && PRIV(ucp_gentype)[chartype] == ucp_S)) == isprop)
+        return !negated;
+      break;
+
+      /* Perl has two sets of hex digits */
+
+      case PT_PXXDIGIT:
+      if (((c >= CHAR_0 && c <= CHAR_9) ||
+           (c >= CHAR_A && c <= CHAR_F) ||
+           (c >= CHAR_a && c <= CHAR_f) ||
+           (c >= 0xff10 && c <= 0xff19) ||  /* Fullwidth digits */
+           (c >= 0xff21 && c <= 0xff26) ||  /* Fullwidth letters */
+           (c >= 0xff41 && c <= 0xff46)) == isprop)
         return !negated;
       break;
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorApple.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorApple.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorApple.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorApple.c	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,133 @@
+/*
+ *    Stack-less Just-In-Time compiler
+ *
+ *    Copyright Zoltan Herczeg (hzmester@freemail.hu). 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 HOLDER(S) 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(S) 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.
+ */
+
+#include <sys/types.h>
+#include <sys/mman.h>
+/*
+   On macOS systems, returns MAP_JIT if it is defined _and_ we're running on a
+   version where it's OK to have more than one JIT block or where MAP_JIT is
+   required.
+   On non-macOS systems, returns MAP_JIT if it is defined.
+*/
+#include <TargetConditionals.h>
+
+#if (defined(TARGET_OS_OSX) && TARGET_OS_OSX) || (TARGET_OS_MAC && !TARGET_OS_IPHONE)
+
+#if defined(SLJIT_CONFIG_X86) && SLJIT_CONFIG_X86
+
+#include <sys/utsname.h>
+#include <stdlib.h>
+
+#define SLJIT_MAP_JIT	(get_map_jit_flag())
+#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec)
+
+static SLJIT_INLINE int get_map_jit_flag(void)
+{
+	size_t page_size;
+	void *ptr;
+	struct utsname name;
+	static int map_jit_flag = -1;
+
+	if (map_jit_flag < 0) {
+		map_jit_flag = 0;
+		uname(&name);
+
+		/* Kernel version for 10.14.0 (Mojave) or later */
+		if (atoi(name.release) >= 18) {
+			page_size = get_page_alignment() + 1;
+			/* Only use MAP_JIT if a hardened runtime is used */
+			ptr = mmap(NULL, page_size, PROT_WRITE | PROT_EXEC,
+					MAP_PRIVATE | MAP_ANON, -1, 0);
+
+			if (ptr != MAP_FAILED)
+				munmap(ptr, page_size);
+			else
+				map_jit_flag = MAP_JIT;
+		}
+	}
+	return map_jit_flag;
+}
+
+#elif defined(SLJIT_CONFIG_ARM) && SLJIT_CONFIG_ARM
+
+#include <AvailabilityMacros.h>
+#include <pthread.h>
+
+#define SLJIT_MAP_JIT	(MAP_JIT)
+#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec) \
+		apple_update_wx_flags(enable_exec)
+
+static SLJIT_INLINE void apple_update_wx_flags(sljit_s32 enable_exec)
+{
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 110000
+	if (__builtin_available(macos 11, *))
+#endif /* BigSur */
+	pthread_jit_write_protect_np(enable_exec);
+}
+
+#elif defined(SLJIT_CONFIG_PPC) && SLJIT_CONFIG_PPC
+
+#define SLJIT_MAP_JIT	(0)
+#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec)
+
+#else
+#error "Unsupported architecture"
+#endif /* SLJIT_CONFIG */
+
+#else /* !TARGET_OS_OSX */
+
+#ifdef MAP_JIT
+#define SLJIT_MAP_JIT	(MAP_JIT)
+#else
+#define SLJIT_MAP_JIT	(0)
+#endif
+
+#endif /* TARGET_OS_OSX */
+
+static SLJIT_INLINE void* alloc_chunk(sljit_uw size)
+{
+	void *retval;
+	int prot = PROT_READ | PROT_WRITE | PROT_EXEC;
+	int flags = MAP_PRIVATE;
+	int fd = -1;
+
+	flags |= MAP_ANON | SLJIT_MAP_JIT;
+
+	retval = mmap(NULL, size, prot, flags, fd, 0);
+	if (retval == MAP_FAILED)
+		return NULL;
+
+	SLJIT_UPDATE_WX_FLAGS(retval, (uint8_t *)retval + size, 0);
+
+	return retval;
+}
+
+static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size)
+{
+	munmap(chunk, size);
+}
+
+#include "sljitExecAllocatorCore.c"
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorCore.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorCore.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorCore.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorCore.c	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,330 @@
+/*
+ *    Stack-less Just-In-Time compiler
+ *
+ *    Copyright Zoltan Herczeg (hzmester@freemail.hu). 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 HOLDER(S) 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(S) 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.
+ */
+
+/*
+   This file contains a simple executable memory allocator
+
+   It is assumed, that executable code blocks are usually medium (or sometimes
+   large) memory blocks, and the allocator is not too frequently called (less
+   optimized than other allocators). Thus, using it as a generic allocator is
+   not suggested.
+
+   How does it work:
+     Memory is allocated in continuous memory areas called chunks by alloc_chunk()
+     Chunk format:
+     [ block ][ block ] ... [ block ][ block terminator ]
+
+   All blocks and the block terminator is started with block_header. The block
+   header contains the size of the previous and the next block. These sizes
+   can also contain special values.
+     Block size:
+       0 - The block is a free_block, with a different size member.
+       1 - The block is a block terminator.
+       n - The block is used at the moment, and the value contains its size.
+     Previous block size:
+       0 - This is the first block of the memory chunk.
+       n - The size of the previous block.
+
+   Using these size values we can go forward or backward on the block chain.
+   The unused blocks are stored in a chain list pointed by free_blocks. This
+   list is useful if we need to find a suitable memory area when the allocator
+   is called.
+
+   When a block is freed, the new free block is connected to its adjacent free
+   blocks if possible.
+
+     [ free block ][ used block ][ free block ]
+   and "used block" is freed, the three blocks are connected together:
+     [           one big free block           ]
+*/
+
+/* Expected functions:
+     alloc_chunk / free_chunk :
+       * allocate executable system memory chunks
+       * the size is always divisible by CHUNK_SIZE
+     SLJIT_ALLOCATOR_LOCK / SLJIT_ALLOCATOR_UNLOCK :
+       * provided as part of sljitUtils
+       * only the allocator requires this lock, sljit is fully thread safe
+         as it only uses local variables
+
+   Supported defines:
+     SLJIT_HAS_CHUNK_HEADER - (optional) sljit_chunk_header is defined
+     SLJIT_HAS_EXECUTABLE_OFFSET - (optional) has executable offset data
+     SLJIT_UPDATE_WX_FLAGS - (optional) update WX flags
+*/
+
+#ifdef SLJIT_HAS_CHUNK_HEADER
+#define CHUNK_HEADER_SIZE (sizeof(struct sljit_chunk_header))
+#else /* !SLJIT_HAS_CHUNK_HEADER */
+#define CHUNK_HEADER_SIZE 0
+#endif /* SLJIT_HAS_CHUNK_HEADER */
+
+#ifndef SLJIT_UPDATE_WX_FLAGS
+#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec)
+#endif /* SLJIT_UPDATE_WX_FLAGS */
+
+#ifndef CHUNK_SIZE
+/* 64 KByte if not specified. */
+#define CHUNK_SIZE	(sljit_uw)0x10000
+#endif /* CHUNK_SIZE */
+
+struct block_header {
+	sljit_uw size;
+	sljit_uw prev_size;
+#ifdef SLJIT_HAS_EXECUTABLE_OFFSET
+	sljit_sw executable_offset;
+#endif /* SLJIT_HAS_EXECUTABLE_OFFSET */
+};
+
+struct free_block {
+	struct block_header header;
+	struct free_block *next;
+	struct free_block *prev;
+	sljit_uw size;
+};
+
+#define AS_BLOCK_HEADER(base, offset) \
+	((struct block_header*)(((sljit_u8*)base) + offset))
+#define AS_FREE_BLOCK(base, offset) \
+	((struct free_block*)(((sljit_u8*)base) + offset))
+#define MEM_START(base)		((void*)((base) + 1))
+#define CHUNK_MASK		(~(CHUNK_SIZE - 1))
+#define ALIGN_SIZE(size)	(((size) + sizeof(struct block_header) + 7u) & ~(sljit_uw)7)
+#define CHUNK_EXTRA_SIZE	(sizeof(struct block_header) + CHUNK_HEADER_SIZE)
+
+static struct free_block* free_blocks;
+static sljit_uw allocated_size;
+static sljit_uw total_size;
+
+static SLJIT_INLINE void sljit_insert_free_block(struct free_block *free_block, sljit_uw size)
+{
+	free_block->header.size = 0;
+	free_block->size = size;
+
+	free_block->next = free_blocks;
+	free_block->prev = NULL;
+	if (free_blocks)
+		free_blocks->prev = free_block;
+	free_blocks = free_block;
+}
+
+static SLJIT_INLINE void sljit_remove_free_block(struct free_block *free_block)
+{
+	if (free_block->next)
+		free_block->next->prev = free_block->prev;
+
+	if (free_block->prev)
+		free_block->prev->next = free_block->next;
+	else {
+		SLJIT_ASSERT(free_blocks == free_block);
+		free_blocks = free_block->next;
+	}
+}
+
+SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size)
+{
+	struct block_header *header;
+	struct block_header *next_header;
+	struct free_block *free_block;
+	sljit_uw chunk_size;
+
+#ifdef SLJIT_HAS_CHUNK_HEADER
+	struct sljit_chunk_header *chunk_header;
+#else /* !SLJIT_HAS_CHUNK_HEADER */
+	void *chunk_header;
+#endif /* SLJIT_HAS_CHUNK_HEADER */
+
+#ifdef SLJIT_HAS_EXECUTABLE_OFFSET
+	sljit_sw executable_offset;
+#endif /* SLJIT_HAS_EXECUTABLE_OFFSET */
+
+	if (size < (64 - sizeof(struct block_header)))
+		size = (64 - sizeof(struct block_header));
+	size = ALIGN_SIZE(size);
+
+	SLJIT_ALLOCATOR_LOCK();
+	free_block = free_blocks;
+	while (free_block) {
+		if (free_block->size >= size) {
+			chunk_size = free_block->size;
+			SLJIT_UPDATE_WX_FLAGS(NULL, NULL, 0);
+			if (chunk_size > size + 64) {
+				/* We just cut a block from the end of the free block. */
+				chunk_size -= size;
+				free_block->size = chunk_size;
+				header = AS_BLOCK_HEADER(free_block, chunk_size);
+				header->prev_size = chunk_size;
+#ifdef SLJIT_HAS_EXECUTABLE_OFFSET
+				header->executable_offset = free_block->header.executable_offset;
+#endif /* SLJIT_HAS_EXECUTABLE_OFFSET */
+				AS_BLOCK_HEADER(header, size)->prev_size = size;
+			}
+			else {
+				sljit_remove_free_block(free_block);
+				header = (struct block_header*)free_block;
+				size = chunk_size;
+			}
+			allocated_size += size;
+			header->size = size;
+			SLJIT_ALLOCATOR_UNLOCK();
+			return MEM_START(header);
+		}
+		free_block = free_block->next;
+	}
+
+	chunk_size = (size + CHUNK_EXTRA_SIZE + CHUNK_SIZE - 1) & CHUNK_MASK;
+
+	chunk_header = alloc_chunk(chunk_size);
+	if (!chunk_header) {
+		SLJIT_ALLOCATOR_UNLOCK();
+		return NULL;
+	}
+
+#ifdef SLJIT_HAS_EXECUTABLE_OFFSET
+	executable_offset = (sljit_sw)((sljit_u8*)chunk_header->executable - (sljit_u8*)chunk_header);
+#endif /* SLJIT_HAS_EXECUTABLE_OFFSET */
+
+	chunk_size -= CHUNK_EXTRA_SIZE;
+	total_size += chunk_size;
+
+	header = (struct block_header*)(((sljit_u8*)chunk_header) + CHUNK_HEADER_SIZE);
+
+	header->prev_size = 0;
+#ifdef SLJIT_HAS_EXECUTABLE_OFFSET
+	header->executable_offset = executable_offset;
+#endif /* SLJIT_HAS_EXECUTABLE_OFFSET */
+
+	if (chunk_size > size + 64) {
+		/* Cut the allocated space into a free and a used block. */
+		allocated_size += size;
+		header->size = size;
+		chunk_size -= size;
+
+		free_block = AS_FREE_BLOCK(header, size);
+		free_block->header.prev_size = size;
+#ifdef SLJIT_HAS_EXECUTABLE_OFFSET
+		free_block->header.executable_offset = executable_offset;
+#endif /* SLJIT_HAS_EXECUTABLE_OFFSET */
+		sljit_insert_free_block(free_block, chunk_size);
+		next_header = AS_BLOCK_HEADER(free_block, chunk_size);
+	}
+	else {
+		/* All space belongs to this allocation. */
+		allocated_size += chunk_size;
+		header->size = chunk_size;
+		next_header = AS_BLOCK_HEADER(header, chunk_size);
+	}
+	SLJIT_ALLOCATOR_UNLOCK();
+	next_header->size = 1;
+	next_header->prev_size = chunk_size;
+#ifdef SLJIT_HAS_EXECUTABLE_OFFSET
+	next_header->executable_offset = executable_offset;
+#endif /* SLJIT_HAS_EXECUTABLE_OFFSET */
+	return MEM_START(header);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr)
+{
+	struct block_header *header;
+	struct free_block* free_block;
+
+	SLJIT_ALLOCATOR_LOCK();
+	header = AS_BLOCK_HEADER(ptr, -(sljit_sw)sizeof(struct block_header));
+#ifdef SLJIT_HAS_EXECUTABLE_OFFSET
+	header = AS_BLOCK_HEADER(header, -header->executable_offset);
+#endif /* SLJIT_HAS_EXECUTABLE_OFFSET */
+	allocated_size -= header->size;
+
+	SLJIT_UPDATE_WX_FLAGS(NULL, NULL, 0);
+
+	/* Connecting free blocks together if possible. */
+
+	/* If header->prev_size == 0, free_block will equal to header.
+	   In this case, free_block->header.size will be > 0. */
+	free_block = AS_FREE_BLOCK(header, -(sljit_sw)header->prev_size);
+	if (SLJIT_UNLIKELY(!free_block->header.size)) {
+		free_block->size += header->size;
+		header = AS_BLOCK_HEADER(free_block, free_block->size);
+		header->prev_size = free_block->size;
+	}
+	else {
+		free_block = (struct free_block*)header;
+		sljit_insert_free_block(free_block, header->size);
+	}
+
+	header = AS_BLOCK_HEADER(free_block, free_block->size);
+	if (SLJIT_UNLIKELY(!header->size)) {
+		free_block->size += ((struct free_block*)header)->size;
+		sljit_remove_free_block((struct free_block*)header);
+		header = AS_BLOCK_HEADER(free_block, free_block->size);
+		header->prev_size = free_block->size;
+	}
+
+	/* The whole chunk is free. */
+	if (SLJIT_UNLIKELY(!free_block->header.prev_size && header->size == 1)) {
+		/* If this block is freed, we still have (allocated_size / 2) free space. */
+		if (total_size - free_block->size > (allocated_size * 3 / 2)) {
+			total_size -= free_block->size;
+			sljit_remove_free_block(free_block);
+			free_chunk(free_block, free_block->size + CHUNK_EXTRA_SIZE);
+		}
+	}
+
+	SLJIT_UPDATE_WX_FLAGS(NULL, NULL, 1);
+	SLJIT_ALLOCATOR_UNLOCK();
+}
+
+SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void)
+{
+	struct free_block* free_block;
+	struct free_block* next_free_block;
+
+	SLJIT_ALLOCATOR_LOCK();
+	SLJIT_UPDATE_WX_FLAGS(NULL, NULL, 0);
+
+	free_block = free_blocks;
+	while (free_block) {
+		next_free_block = free_block->next;
+		if (!free_block->header.prev_size && 
+				AS_BLOCK_HEADER(free_block, free_block->size)->size == 1) {
+			total_size -= free_block->size;
+			sljit_remove_free_block(free_block);
+			free_chunk(free_block, free_block->size + CHUNK_EXTRA_SIZE);
+		}
+		free_block = next_free_block;
+	}
+
+	SLJIT_ASSERT((total_size && free_blocks) || (!total_size && !free_blocks));
+	SLJIT_UPDATE_WX_FLAGS(NULL, NULL, 1);
+	SLJIT_ALLOCATOR_UNLOCK();
+}
+
+#ifdef SLJIT_HAS_EXECUTABLE_OFFSET
+SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr)
+{
+	return ((struct block_header *)(ptr))[-1].executable_offset;
+}
+#endif /* SLJIT_HAS_EXECUTABLE_OFFSET */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorFreeBSD.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorFreeBSD.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorFreeBSD.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorFreeBSD.c	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,89 @@
+/*
+ *    Stack-less Just-In-Time compiler
+ *
+ *    Copyright Zoltan Herczeg (hzmester@freemail.hu). 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 HOLDER(S) 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(S) 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.
+ */
+
+#include <sys/mman.h>
+#include <sys/procctl.h>
+
+#ifdef PROC_WXMAP_CTL
+static SLJIT_INLINE int sljit_is_wx_block(void)
+{
+	static int wx_block = -1;
+	if (wx_block < 0) {
+		int sljit_wx_enable = PROC_WX_MAPPINGS_PERMIT;
+		wx_block = !!procctl(P_PID, 0, PROC_WXMAP_CTL, &sljit_wx_enable);
+	}
+	return wx_block;
+}
+
+#define SLJIT_IS_WX_BLOCK sljit_is_wx_block()
+#else /* !PROC_WXMAP_CTL */
+#define SLJIT_IS_WX_BLOCK (1)
+#endif /* PROC_WXMAP_CTL */
+
+static SLJIT_INLINE void* alloc_chunk(sljit_uw size)
+{
+	void *retval;
+	int prot = PROT_READ | PROT_WRITE | PROT_EXEC;
+	int flags = MAP_PRIVATE;
+	int fd = -1;
+
+#ifdef PROT_MAX
+	prot |= PROT_MAX(prot);
+#endif
+
+#ifdef MAP_ANON
+	flags |= MAP_ANON;
+#else /* !MAP_ANON */
+	if (SLJIT_UNLIKELY((dev_zero < 0) && open_dev_zero()))
+		return NULL;
+
+	fd = dev_zero;
+#endif /* MAP_ANON */
+
+retry:
+	retval = mmap(NULL, size, prot, flags, fd, 0);
+	if (retval == MAP_FAILED) {
+		if (!SLJIT_IS_WX_BLOCK)
+			goto retry;
+
+		return NULL;
+	}
+
+	/* HardenedBSD's mmap lies, so check permissions again. */
+	if (mprotect(retval, size, PROT_READ | PROT_WRITE | PROT_EXEC) < 0) {
+		munmap(retval, size);
+		return NULL;
+	}
+
+	return retval;
+}
+
+static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size)
+{
+	munmap(chunk, size);
+}
+
+#include "sljitExecAllocatorCore.c"
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorPosix.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorPosix.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorPosix.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorPosix.c	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,62 @@
+/*
+ *    Stack-less Just-In-Time compiler
+ *
+ *    Copyright Zoltan Herczeg (hzmester@freemail.hu). 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 HOLDER(S) 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(S) 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.
+ */
+
+#include <sys/types.h>
+#include <sys/mman.h>
+
+static SLJIT_INLINE void* alloc_chunk(sljit_uw size)
+{
+	void *retval;
+	int prot = PROT_READ | PROT_WRITE | PROT_EXEC;
+	int flags = MAP_PRIVATE;
+	int fd = -1;
+
+#ifdef PROT_MAX
+	prot |= PROT_MAX(prot);
+#endif
+
+#ifdef MAP_ANON
+	flags |= MAP_ANON;
+#else /* !MAP_ANON */
+	if (SLJIT_UNLIKELY((dev_zero < 0) && open_dev_zero()))
+		return NULL;
+
+	fd = dev_zero;
+#endif /* MAP_ANON */
+
+	retval = mmap(NULL, size, prot, flags, fd, 0);
+	if (retval == MAP_FAILED)
+		return NULL;
+
+	return retval;
+}
+
+static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size)
+{
+	munmap(chunk, size);
+}
+
+#include "sljitExecAllocatorCore.c"
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorWindows.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorWindows.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorWindows.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitExecAllocatorWindows.c	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,40 @@
+/*
+ *    Stack-less Just-In-Time compiler
+ *
+ *    Copyright Zoltan Herczeg (hzmester@freemail.hu). 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 HOLDER(S) 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(S) 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.
+ */
+
+#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec)
+
+static SLJIT_INLINE void* alloc_chunk(sljit_uw size)
+{
+	return VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
+}
+
+static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size)
+{
+	SLJIT_UNUSED_ARG(size);
+	VirtualFree(chunk, 0, MEM_RELEASE);
+}
+
+#include "sljitExecAllocatorCore.c"
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorNetBSD.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorNetBSD.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorNetBSD.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorNetBSD.c	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,72 @@
+/*
+ *    Stack-less Just-In-Time compiler
+ *
+ *    Copyright Zoltan Herczeg (hzmester@freemail.hu). 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 HOLDER(S) 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(S) 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.
+ */
+
+#define SLJIT_HAS_CHUNK_HEADER
+#define SLJIT_HAS_EXECUTABLE_OFFSET
+
+struct sljit_chunk_header {
+	void *executable;
+};
+
+/*
+ * MAP_REMAPDUP is a NetBSD extension available sinde 8.0, make sure to
+ * adjust your feature macros (ex: -D_NETBSD_SOURCE) as needed
+ */
+static SLJIT_INLINE struct sljit_chunk_header* alloc_chunk(sljit_uw size)
+{
+	struct sljit_chunk_header *retval;
+
+	retval = (struct sljit_chunk_header *)mmap(NULL, size,
+			PROT_READ | PROT_WRITE | PROT_MPROTECT(PROT_EXEC),
+			MAP_ANON | MAP_SHARED, -1, 0);
+
+	if (retval == MAP_FAILED)
+		return NULL;
+
+	retval->executable = mremap(retval, size, NULL, size, MAP_REMAPDUP);
+	if (retval->executable == MAP_FAILED) {
+		munmap((void *)retval, size);
+		return NULL;
+	}
+
+	if (mprotect(retval->executable, size, PROT_READ | PROT_EXEC) == -1) {
+		munmap(retval->executable, size);
+		munmap((void *)retval, size);
+		return NULL;
+	}
+
+	return retval;
+}
+
+static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size)
+{
+	struct sljit_chunk_header *header = ((struct sljit_chunk_header *)chunk) - 1;
+
+	munmap(header->executable, size);
+	munmap((void *)header, size);
+}
+
+#include "sljitExecAllocatorCore.c"
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorPosix.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorPosix.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorPosix.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorPosix.c	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,172 @@
+/*
+ *    Stack-less Just-In-Time compiler
+ *
+ *    Copyright Zoltan Herczeg (hzmester@freemail.hu). 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 HOLDER(S) 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(S) 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.
+ */
+
+#define SLJIT_HAS_CHUNK_HEADER
+#define SLJIT_HAS_EXECUTABLE_OFFSET
+
+struct sljit_chunk_header {
+	void *executable;
+};
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifndef O_NOATIME
+#define O_NOATIME 0
+#endif
+
+/* this is a linux extension available since kernel 3.11 */
+#ifndef O_TMPFILE
+#define O_TMPFILE 0x404000
+#endif
+
+#ifndef _GNU_SOURCE
+char *secure_getenv(const char *name);
+int mkostemp(char *template, int flags);
+#endif
+
+static SLJIT_INLINE int create_tempfile(void)
+{
+	int fd;
+	char tmp_name[256];
+	size_t tmp_name_len = 0;
+	char *dir;
+	struct stat st;
+#if defined(SLJIT_SINGLE_THREADED) && SLJIT_SINGLE_THREADED
+	mode_t mode;
+#endif
+
+#ifdef HAVE_MEMFD_CREATE
+	/* this is a GNU extension, make sure to use -D_GNU_SOURCE */
+	fd = memfd_create("sljit", MFD_CLOEXEC);
+	if (fd != -1) {
+		fchmod(fd, 0);
+		return fd;
+	}
+#endif
+
+	dir = secure_getenv("TMPDIR");
+
+	if (dir) {
+		size_t len = strlen(dir);
+		if (len > 0 && len < sizeof(tmp_name)) {
+			if ((stat(dir, &st) == 0) && S_ISDIR(st.st_mode)) {
+				memcpy(tmp_name, dir, len + 1);
+				tmp_name_len = len;
+			}
+		}
+	}
+
+#ifdef P_tmpdir
+	if (!tmp_name_len) {
+		tmp_name_len = strlen(P_tmpdir);
+		if (tmp_name_len > 0 && tmp_name_len < sizeof(tmp_name))
+			strcpy(tmp_name, P_tmpdir);
+	}
+#endif
+	if (!tmp_name_len) {
+		strcpy(tmp_name, "/tmp");
+		tmp_name_len = 4;
+	}
+
+	SLJIT_ASSERT(tmp_name_len > 0 && tmp_name_len < sizeof(tmp_name));
+
+	if (tmp_name_len > 1 && tmp_name[tmp_name_len - 1] == '/')
+		tmp_name[--tmp_name_len] = '\0';
+
+	fd = open(tmp_name, O_TMPFILE | O_EXCL | O_RDWR | O_NOATIME | O_CLOEXEC, 0);
+	if (fd != -1)
+		return fd;
+
+	if (tmp_name_len >= sizeof(tmp_name) - 7)
+		return -1;
+
+	strcpy(tmp_name + tmp_name_len, "/XXXXXX");
+#if defined(SLJIT_SINGLE_THREADED) && SLJIT_SINGLE_THREADED
+	mode = umask(0777);
+#endif
+	fd = mkostemp(tmp_name, O_CLOEXEC | O_NOATIME);
+#if defined(SLJIT_SINGLE_THREADED) && SLJIT_SINGLE_THREADED
+	umask(mode);
+#else
+	fchmod(fd, 0);
+#endif
+
+	if (fd == -1)
+		return -1;
+
+	if (unlink(tmp_name)) {
+		close(fd);
+		return -1;
+	}
+
+	return fd;
+}
+
+static SLJIT_INLINE struct sljit_chunk_header* alloc_chunk(sljit_uw size)
+{
+	struct sljit_chunk_header *retval;
+	int fd;
+
+	fd = create_tempfile();
+	if (fd == -1)
+		return NULL;
+
+	if (ftruncate(fd, (off_t)size)) {
+		close(fd);
+		return NULL;
+	}
+
+	retval = (struct sljit_chunk_header *)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+
+	if (retval == MAP_FAILED) {
+		close(fd);
+		return NULL;
+	}
+
+	retval->executable = mmap(NULL, size, PROT_READ | PROT_EXEC, MAP_SHARED, fd, 0);
+
+	if (retval->executable == MAP_FAILED) {
+		munmap((void *)retval, size);
+		close(fd);
+		return NULL;
+	}
+
+	close(fd);
+	return retval;
+}
+
+static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size)
+{
+	struct sljit_chunk_header *header = ((struct sljit_chunk_header *)chunk) - 1;
+
+	munmap(header->executable, size);
+	munmap((void *)header, size);
+}
+
+#include "sljitExecAllocatorCore.c"
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorPosix.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorPosix.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorPosix.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorPosix.c	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,141 @@
+/*
+ *    Stack-less Just-In-Time compiler
+ *
+ *    Copyright Zoltan Herczeg (hzmester@freemail.hu). 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 HOLDER(S) 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(S) 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.
+ */
+
+/*
+   This file contains a simple W^X executable memory allocator
+
+   In *NIX, MAP_ANON is required (that is considered a feature) so make
+   sure to set the right availability macros for your system or the code
+   will fail to build.
+
+   If your system doesn't support mapping of anonymous pages (ex: IRIX) it
+   is also likely that it doesn't need this allocator and should be using
+   the standard one instead.
+
+   It allocates a separate map for each code block and may waste a lot of
+   memory, because whatever was requested, will be rounded up to the page
+   size (minimum 4KB, but could be even bigger).
+
+   It changes the page permissions (RW <-> RX) as needed and therefore, if you
+   will be updating the code after it has been generated, need to make sure to
+   block any concurrent execution, or could result in a SIGBUS, that could
+   even manifest itself at a different address than the one that was being
+   modified.
+
+   Only use if you are unable to use the regular allocator because of security
+   restrictions and adding exceptions to your application or the system are
+   not possible.
+*/
+
+#include <sys/types.h>
+#include <sys/mman.h>
+
+#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec) \
+	sljit_update_wx_flags((from), (to), (enable_exec))
+
+#if !(defined SLJIT_SINGLE_THREADED && SLJIT_SINGLE_THREADED)
+#include <pthread.h>
+#define SLJIT_SE_LOCK()		pthread_mutex_lock(&se_lock)
+#define SLJIT_SE_UNLOCK()	pthread_mutex_unlock(&se_lock)
+#else
+#define SLJIT_SE_LOCK()
+#define SLJIT_SE_UNLOCK()
+#endif /* !SLJIT_SINGLE_THREADED */
+
+#define SLJIT_WX_IS_BLOCK(ptr, size) generic_check_is_wx_block(ptr, size)
+
+static SLJIT_INLINE int generic_check_is_wx_block(void *ptr, sljit_uw size)
+{
+	if (SLJIT_LIKELY(!mprotect(ptr, size, PROT_EXEC)))
+		return !!mprotect(ptr, size, PROT_READ | PROT_WRITE);
+
+	return 1;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size)
+{
+#if !(defined SLJIT_SINGLE_THREADED && SLJIT_SINGLE_THREADED)
+	static pthread_mutex_t se_lock = PTHREAD_MUTEX_INITIALIZER;
+#endif
+	static int wx_block = -1;
+	int prot = PROT_READ | PROT_WRITE;
+	sljit_uw* ptr;
+
+	if (SLJIT_UNLIKELY(wx_block > 0))
+		return NULL;
+
+#ifdef PROT_MAX
+	prot |= PROT_MAX(PROT_READ | PROT_WRITE | PROT_EXEC);
+#endif
+
+	size += sizeof(sljit_uw);
+	ptr = (sljit_uw*)mmap(NULL, size, prot, MAP_PRIVATE | MAP_ANON, -1, 0);
+
+	if (ptr == MAP_FAILED)
+		return NULL;
+
+	if (SLJIT_UNLIKELY(wx_block < 0)) {
+		SLJIT_SE_LOCK();
+		wx_block = SLJIT_WX_IS_BLOCK(ptr, size);
+		SLJIT_SE_UNLOCK();
+		if (SLJIT_UNLIKELY(wx_block)) {
+			munmap((void *)ptr, size);
+			return NULL;
+		}
+	}
+
+	*ptr++ = size;
+	return ptr;
+}
+
+#undef SLJIT_SE_UNLOCK
+#undef SLJIT_SE_LOCK
+
+SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr)
+{
+	sljit_uw *start_ptr = ((sljit_uw*)ptr) - 1;
+	munmap((void*)start_ptr, *start_ptr);
+}
+
+static void sljit_update_wx_flags(void *from, void *to, int enable_exec)
+{
+	sljit_uw page_mask = (sljit_uw)get_page_alignment();
+	sljit_uw start = (sljit_uw)from;
+	sljit_uw end = (sljit_uw)to;
+	int prot = PROT_READ | (enable_exec ? PROT_EXEC : PROT_WRITE);
+
+	SLJIT_ASSERT(start < end);
+
+	start &= ~page_mask;
+	end = (end + page_mask) & ~page_mask;
+
+	mprotect((void*)start, end - start, prot);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void)
+{
+	/* This allocator does not keep unused memory for future allocations. */
+}
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorWindows.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorWindows.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorWindows.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorWindows.c	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,102 @@
+/*
+ *    Stack-less Just-In-Time compiler
+ *
+ *    Copyright Zoltan Herczeg (hzmester@freemail.hu). 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 HOLDER(S) 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(S) 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.
+ */
+
+/*
+   This file contains a simple W^X executable memory allocator
+
+   In *NIX, MAP_ANON is required (that is considered a feature) so make
+   sure to set the right availability macros for your system or the code
+   will fail to build.
+
+   If your system doesn't support mapping of anonymous pages (ex: IRIX) it
+   is also likely that it doesn't need this allocator and should be using
+   the standard one instead.
+
+   It allocates a separate map for each code block and may waste a lot of
+   memory, because whatever was requested, will be rounded up to the page
+   size (minimum 4KB, but could be even bigger).
+
+   It changes the page permissions (RW <-> RX) as needed and therefore, if you
+   will be updating the code after it has been generated, need to make sure to
+   block any concurrent execution, or could result in a SIGBUS, that could
+   even manifest itself at a different address than the one that was being
+   modified.
+
+   Only use if you are unable to use the regular allocator because of security
+   restrictions and adding exceptions to your application or the system are
+   not possible.
+*/
+
+#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec) \
+	sljit_update_wx_flags((from), (to), (enable_exec))
+
+SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size)
+{
+	sljit_uw *ptr;
+
+	size += sizeof(sljit_uw);
+	ptr = (sljit_uw*)VirtualAlloc(NULL, size,
+				MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
+
+	if (!ptr)
+		return NULL;
+
+	*ptr++ = size;
+
+	return ptr;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr)
+{
+	sljit_uw start = (sljit_uw)ptr - sizeof(sljit_uw);
+#if defined(SLJIT_DEBUG) && SLJIT_DEBUG
+	sljit_uw page_mask = (sljit_uw)get_page_alignment();
+
+	SLJIT_ASSERT(!(start & page_mask));
+#endif
+	VirtualFree((void*)start, 0, MEM_RELEASE);
+}
+
+static void sljit_update_wx_flags(void *from, void *to, sljit_s32 enable_exec)
+{
+	DWORD oldprot;
+	sljit_uw page_mask = (sljit_uw)get_page_alignment();
+	sljit_uw start = (sljit_uw)from;
+	sljit_uw end = (sljit_uw)to;
+	DWORD prot = enable_exec ? PAGE_EXECUTE : PAGE_READWRITE;
+
+	SLJIT_ASSERT(start < end);
+
+	start &= ~page_mask;
+	end = (end + page_mask) & ~page_mask;
+
+	VirtualProtect((void*)start, end - start, prot, &oldprot);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void)
+{
+	/* This allocator does not keep unused memory for future allocations. */
+}
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitConfig.h 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitConfig.h
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitConfig.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitConfig.h	2024-11-20 13:56:33.000000000 +0000
@@ -39,28 +39,6 @@ extern "C" {
 */
 
 /* --------------------------------------------------------------------- */
-/*  Architecture                                                         */
-/* --------------------------------------------------------------------- */
-
-/* Architecture selection. */
-/* #define SLJIT_CONFIG_X86_32 1 */
-/* #define SLJIT_CONFIG_X86_64 1 */
-/* #define SLJIT_CONFIG_ARM_V5 1 */
-/* #define SLJIT_CONFIG_ARM_V7 1 */
-/* #define SLJIT_CONFIG_ARM_THUMB2 1 */
-/* #define SLJIT_CONFIG_ARM_64 1 */
-/* #define SLJIT_CONFIG_PPC_32 1 */
-/* #define SLJIT_CONFIG_PPC_64 1 */
-/* #define SLJIT_CONFIG_MIPS_32 1 */
-/* #define SLJIT_CONFIG_MIPS_64 1 */
-/* #define SLJIT_CONFIG_RISCV_32 1 */
-/* #define SLJIT_CONFIG_RISCV_64 1 */
-/* #define SLJIT_CONFIG_S390X 1 */
-
-/* #define SLJIT_CONFIG_AUTO 1 */
-/* #define SLJIT_CONFIG_UNSUPPORTED 1 */
-
-/* --------------------------------------------------------------------- */
 /*  Utilities                                                            */
 /* --------------------------------------------------------------------- */
 
@@ -96,7 +74,9 @@ extern "C" {
 
 /* Executable code allocation:
    If SLJIT_EXECUTABLE_ALLOCATOR is not defined, the application should
-   define SLJIT_MALLOC_EXEC, SLJIT_FREE_EXEC, and SLJIT_EXEC_OFFSET. */
+   define SLJIT_MALLOC_EXEC and SLJIT_FREE_EXEC.
+   Optionally, depending on the implementation used for the allocator,
+   SLJIT_EXEC_OFFSET and SLJIT_UPDATE_WX_FLAGS might also be needed. */
 #ifndef SLJIT_EXECUTABLE_ALLOCATOR
 /* Enabled by default. */
 #define SLJIT_EXECUTABLE_ALLOCATOR 1
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitConfigCPU.h 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitConfigCPU.h
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitConfigCPU.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitConfigCPU.h	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,188 @@
+/*
+ *    Stack-less Just-In-Time compiler
+ *
+ *    Copyright Zoltan Herczeg (hzmester@freemail.hu). 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 HOLDER(S) 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(S) 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.
+ */
+
+#ifndef SLJIT_CONFIG_CPU_H_
+#define SLJIT_CONFIG_CPU_H_
+
+/* --------------------------------------------------------------------- */
+/*  Architecture                                                         */
+/* --------------------------------------------------------------------- */
+
+/* Architecture selection. */
+/* #define SLJIT_CONFIG_X86_32 1 */
+/* #define SLJIT_CONFIG_X86_64 1 */
+/* #define SLJIT_CONFIG_ARM_V6 1 */
+/* #define SLJIT_CONFIG_ARM_V7 1 */
+/* #define SLJIT_CONFIG_ARM_THUMB2 1 */
+/* #define SLJIT_CONFIG_ARM_64 1 */
+/* #define SLJIT_CONFIG_PPC_32 1 */
+/* #define SLJIT_CONFIG_PPC_64 1 */
+/* #define SLJIT_CONFIG_MIPS_32 1 */
+/* #define SLJIT_CONFIG_MIPS_64 1 */
+/* #define SLJIT_CONFIG_RISCV_32 1 */
+/* #define SLJIT_CONFIG_RISCV_64 1 */
+/* #define SLJIT_CONFIG_S390X 1 */
+/* #define SLJIT_CONFIG_LOONGARCH_64 */
+
+/* #define SLJIT_CONFIG_AUTO 1 */
+/* #define SLJIT_CONFIG_UNSUPPORTED 1 */
+
+/*****************/
+/* Sanity check. */
+/*****************/
+
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
+	+ (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
+	+ (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) \
+	+ (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
+	+ (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
+	+ (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
+	+ (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
+	+ (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
+	+ (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
+	+ (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \
+	+ (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) \
+	+ (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \
+	+ (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
+	+ (defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64) \
+	+ (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \
+	+ (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) >= 2
+#error "Multiple architectures are selected"
+#endif
+
+#if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
+	&& !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
+	&& !(defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) \
+	&& !(defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
+	&& !(defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
+	&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
+	&& !(defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
+	&& !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
+	&& !(defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
+	&& !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \
+	&& !(defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) \
+	&& !(defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \
+	&& !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
+	&& !(defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64) \
+	&& !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) \
+	&& !(defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO)
+#if defined SLJIT_CONFIG_AUTO && !SLJIT_CONFIG_AUTO
+#error "An architecture must be selected"
+#else /* SLJIT_CONFIG_AUTO */
+#define SLJIT_CONFIG_AUTO 1
+#endif /* !SLJIT_CONFIG_AUTO */
+#endif /* !SLJIT_CONFIG */
+
+/********************************************************/
+/* Automatic CPU detection (requires compiler support). */
+/********************************************************/
+
+#if (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO)
+#ifndef _WIN32
+
+#if defined(__i386__) || defined(__i386)
+#define SLJIT_CONFIG_X86_32 1
+#elif defined(__x86_64__)
+#define SLJIT_CONFIG_X86_64 1
+#elif defined(__aarch64__)
+#define SLJIT_CONFIG_ARM_64 1
+#elif defined(__thumb2__)
+#define SLJIT_CONFIG_ARM_THUMB2 1
+#elif (defined(__ARM_ARCH) && __ARM_ARCH >= 7) || \
+	((defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7S__)) \
+	 || (defined(__ARM_ARCH_8A__) || defined(__ARM_ARCH_8R__)) \
+	 || (defined(__ARM_ARCH_9A__)))
+#define SLJIT_CONFIG_ARM_V7 1
+#elif defined(__arm__) || defined (__ARM__)
+#define SLJIT_CONFIG_ARM_V6 1
+#elif defined(__ppc64__) || defined(__powerpc64__) || (defined(_ARCH_PPC64) && defined(__64BIT__)) || (defined(_POWER) && defined(__64BIT__))
+#define SLJIT_CONFIG_PPC_64 1
+#elif defined(__ppc__) || defined(__powerpc__) || defined(_ARCH_PPC) || defined(_ARCH_PWR) || defined(_ARCH_PWR2) || defined(_POWER)
+#define SLJIT_CONFIG_PPC_32 1
+#elif defined(__mips__) && !defined(_LP64)
+#define SLJIT_CONFIG_MIPS_32 1
+#elif defined(__mips64)
+#define SLJIT_CONFIG_MIPS_64 1
+#elif defined (__riscv_xlen) && (__riscv_xlen == 32)
+#define SLJIT_CONFIG_RISCV_32 1
+#elif defined (__riscv_xlen) && (__riscv_xlen == 64)
+#define SLJIT_CONFIG_RISCV_64 1
+#elif defined (__loongarch_lp64)
+#define SLJIT_CONFIG_LOONGARCH_64 1
+#elif defined(__s390x__)
+#define SLJIT_CONFIG_S390X 1
+#else
+/* Unsupported architecture */
+#define SLJIT_CONFIG_UNSUPPORTED 1
+#endif
+
+#else /* _WIN32 */
+
+#if defined(_M_X64) || defined(__x86_64__)
+#define SLJIT_CONFIG_X86_64 1
+#elif (defined(_M_ARM) && _M_ARM >= 7 && defined(_M_ARMT)) || defined(__thumb2__)
+#define SLJIT_CONFIG_ARM_THUMB2 1
+#elif (defined(_M_ARM) && _M_ARM >= 7)
+#define SLJIT_CONFIG_ARM_V7 1
+#elif defined(_ARM_)
+#define SLJIT_CONFIG_ARM_V6 1
+#elif defined(_M_ARM64) || defined(__aarch64__)
+#define SLJIT_CONFIG_ARM_64 1
+#else
+#define SLJIT_CONFIG_X86_32 1
+#endif
+
+#endif /* !_WIN32 */
+#endif /* SLJIT_CONFIG_AUTO */
+
+#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
+#undef SLJIT_EXECUTABLE_ALLOCATOR
+#endif /* SLJIT_CONFIG_UNSUPPORTED */
+
+/******************************/
+/* CPU family type detection. */
+/******************************/
+
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
+	|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
+#define SLJIT_CONFIG_ARM_32 1
+#endif
+
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+#define SLJIT_CONFIG_X86 1
+#elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
+#define SLJIT_CONFIG_ARM 1
+#elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
+#define SLJIT_CONFIG_PPC 1
+#elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
+#define SLJIT_CONFIG_MIPS 1
+#elif (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) || (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
+#define SLJIT_CONFIG_RISCV 1
+#elif (defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64)
+#define SLJIT_CONFIG_LOONGARCH 1
+#endif
+
+#endif /* SLJIT_CONFIG_CPU_H_ */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitConfigInternal.h 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitConfigInternal.h
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitConfigInternal.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitConfigInternal.h	2024-11-20 13:56:33.000000000 +0000
@@ -61,6 +61,8 @@ extern "C" {
      SLJIT_BIG_ENDIAN : big endian architecture
      SLJIT_UNALIGNED : unaligned memory accesses for non-fpu operations are supported
      SLJIT_FPU_UNALIGNED : unaligned memory accesses for fpu operations are supported
+     SLJIT_MASKED_SHIFT : all word shifts are always masked
+     SLJIT_MASKED_SHIFT32 : all 32 bit shifts are always masked
      SLJIT_INDIRECT_CALL : see SLJIT_FUNC_ADDR() for more information
 
    Constants:
@@ -70,6 +72,8 @@ extern "C" {
      SLJIT_NUMBER_OF_FLOAT_REGISTERS : number of available floating point registers
      SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS : number of available floating point scratch registers
      SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS : number of available floating point saved registers
+     SLJIT_NUMBER_OF_TEMPORARY_REGISTERS : number of available temporary registers
+     SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS : number of available temporary floating point registers
      SLJIT_WORD_SHIFT : the shift required to apply when accessing a sljit_sw/sljit_uw array by index
      SLJIT_F32_SHIFT : the shift required to apply when accessing
                        a single precision floating point array by index
@@ -79,141 +83,27 @@ extern "C" {
                             the scratch register index of ecx is stored in this variable
      SLJIT_LOCALS_OFFSET : local space starting offset (SLJIT_SP + SLJIT_LOCALS_OFFSET)
      SLJIT_RETURN_ADDRESS_OFFSET : a return instruction always adds this offset to the return address
+     SLJIT_CONV_MAX_FLOAT : result when a floating point value is converted to integer
+                            and the floating point value is higher than the maximum integer value
+                            (possible values: SLJIT_CONV_RESULT_MAX_INT or SLJIT_CONV_RESULT_MIN_INT)
+     SLJIT_CONV_MIN_FLOAT : result when a floating point value is converted to integer
+                            and the floating point value is lower than the minimum integer value
+                            (possible values: SLJIT_CONV_RESULT_MAX_INT or SLJIT_CONV_RESULT_MIN_INT)
+     SLJIT_CONV_NAN_FLOAT : result when a NaN floating point value is converted to integer
+                            (possible values: SLJIT_CONV_RESULT_MAX_INT, SLJIT_CONV_RESULT_MIN_INT,
+                            or SLJIT_CONV_RESULT_ZERO)
 
    Other macros:
+     SLJIT_TMP_R0 .. R9 : accessing temporary registers
+     SLJIT_TMP_R(i) : accessing temporary registers
+     SLJIT_TMP_FR0 .. FR9 : accessing temporary floating point registers
+     SLJIT_TMP_FR(i) : accessing temporary floating point registers
      SLJIT_FUNC : calling convention attribute for both calling JIT from C and C calling back from JIT
      SLJIT_W(number) : defining 64 bit constants on 64 bit architectures (platform independent helper)
+     SLJIT_F64_SECOND(reg) : provides the register index of the second 32 bit part of a 64 bit
+                             floating point register when SLJIT_HAS_F64_AS_F32_PAIR returns non-zero
 */
 
-/*****************/
-/* Sanity check. */
-/*****************/
-
-#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
-	+ (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
-	+ (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \
-	+ (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
-	+ (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
-	+ (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
-	+ (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
-	+ (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
-	+ (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
-	+ (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \
-	+ (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) \
-	+ (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \
-	+ (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
-	+ (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \
-	+ (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) >= 2
-#error "Multiple architectures are selected"
-#endif
-
-#if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
-	&& !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
-	&& !(defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \
-	&& !(defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
-	&& !(defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
-	&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
-	&& !(defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
-	&& !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
-	&& !(defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
-	&& !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \
-	&& !(defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) \
-	&& !(defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \
-	&& !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
-	&& !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) \
-	&& !(defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO)
-#if defined SLJIT_CONFIG_AUTO && !SLJIT_CONFIG_AUTO
-#error "An architecture must be selected"
-#else /* SLJIT_CONFIG_AUTO */
-#define SLJIT_CONFIG_AUTO 1
-#endif /* !SLJIT_CONFIG_AUTO */
-#endif /* !SLJIT_CONFIG */
-
-/********************************************************/
-/* Automatic CPU detection (requires compiler support). */
-/********************************************************/
-
-#if (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO)
-
-#ifndef _WIN32
-
-#if defined(__i386__) || defined(__i386)
-#define SLJIT_CONFIG_X86_32 1
-#elif defined(__x86_64__)
-#define SLJIT_CONFIG_X86_64 1
-#elif defined(__arm__) || defined(__ARM__)
-#ifdef __thumb2__
-#define SLJIT_CONFIG_ARM_THUMB2 1
-#elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__)
-#define SLJIT_CONFIG_ARM_V7 1
-#else
-#define SLJIT_CONFIG_ARM_V5 1
-#endif
-#elif defined (__aarch64__)
-#define SLJIT_CONFIG_ARM_64 1
-#elif defined(__ppc64__) || defined(__powerpc64__) || (defined(_ARCH_PPC64) && defined(__64BIT__)) || (defined(_POWER) && defined(__64BIT__))
-#define SLJIT_CONFIG_PPC_64 1
-#elif defined(__ppc__) || defined(__powerpc__) || defined(_ARCH_PPC) || defined(_ARCH_PWR) || defined(_ARCH_PWR2) || defined(_POWER)
-#define SLJIT_CONFIG_PPC_32 1
-#elif defined(__mips__) && !defined(_LP64)
-#define SLJIT_CONFIG_MIPS_32 1
-#elif defined(__mips64)
-#define SLJIT_CONFIG_MIPS_64 1
-#elif defined (__riscv_xlen) && (__riscv_xlen == 32)
-#define SLJIT_CONFIG_RISCV_32 1
-#elif defined (__riscv_xlen) && (__riscv_xlen == 64)
-#define SLJIT_CONFIG_RISCV_64 1
-#elif defined(__s390x__)
-#define SLJIT_CONFIG_S390X 1
-#else
-/* Unsupported architecture */
-#define SLJIT_CONFIG_UNSUPPORTED 1
-#endif
-
-#else /* _WIN32 */
-
-#if defined(_M_X64) || defined(__x86_64__)
-#define SLJIT_CONFIG_X86_64 1
-#elif (defined(_M_ARM) && _M_ARM >= 7 && defined(_M_ARMT)) || defined(__thumb2__)
-#define SLJIT_CONFIG_ARM_THUMB2 1
-#elif (defined(_M_ARM) && _M_ARM >= 7)
-#define SLJIT_CONFIG_ARM_V7 1
-#elif defined(_ARM_)
-#define SLJIT_CONFIG_ARM_V5 1
-#elif defined(_M_ARM64) || defined(__aarch64__)
-#define SLJIT_CONFIG_ARM_64 1
-#else
-#define SLJIT_CONFIG_X86_32 1
-#endif
-
-#endif /* !_WIN32 */
-#endif /* SLJIT_CONFIG_AUTO */
-
-#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
-#undef SLJIT_EXECUTABLE_ALLOCATOR
-#endif
-
-/******************************/
-/* CPU family type detection. */
-/******************************/
-
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
-	|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
-#define SLJIT_CONFIG_ARM_32 1
-#endif
-
-#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-#define SLJIT_CONFIG_X86 1
-#elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
-#define SLJIT_CONFIG_ARM 1
-#elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
-#define SLJIT_CONFIG_PPC 1
-#elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
-#define SLJIT_CONFIG_MIPS 1
-#elif (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) || (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
-#define SLJIT_CONFIG_RISCV 1
-#endif
-
 /***********************************************************/
 /* Intel Control-flow Enforcement Technology (CET) spport. */
 /***********************************************************/
@@ -328,6 +218,10 @@ extern "C" {
 /* Instruction cache flush. */
 /****************************/
 
+#ifdef __APPLE__
+#include <AvailabilityMacros.h>
+#endif
+
 /*
  * TODO:
  *
@@ -368,7 +262,7 @@ extern "C" {
 /* Not required to implement on archs with unified caches. */
 #define SLJIT_CACHE_FLUSH(from, to)
 
-#elif defined __APPLE__
+#elif defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
 
 /* Supported by all macs since Mac OS 10.5.
    However, it does not work on non-jailbroken iOS devices,
@@ -433,14 +327,15 @@ typedef signed int sljit_s32;
 #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
 /* Just to have something. */
 #define SLJIT_WORD_SHIFT 0
-typedef unsigned long int sljit_uw;
-typedef long int sljit_sw;
+typedef unsigned int sljit_uw;
+typedef int sljit_sw;
 #elif !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
 	&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
 	&& !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
 	&& !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \
 	&& !(defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \
-	&& !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
+	&& !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
+	&& !(defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64)
 #define SLJIT_32BIT_ARCHITECTURE 1
 #define SLJIT_WORD_SHIFT 2
 typedef unsigned int sljit_uw;
@@ -476,12 +371,42 @@ typedef double sljit_f64;
 #define SLJIT_F32_SHIFT 2
 #define SLJIT_F64_SHIFT 3
 
+#define SLJIT_CONV_RESULT_MAX_INT 0
+#define SLJIT_CONV_RESULT_MIN_INT 1
+#define SLJIT_CONV_RESULT_ZERO 2
+
+#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
+#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MIN_INT
+#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT
+#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MIN_INT
+#elif (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
+#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT
+#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT
+#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_ZERO
+#elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
+#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT
+#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MAX_INT
+#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MAX_INT
+#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
+#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT
+#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT
+#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MIN_INT
+#elif (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV)
+#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT
+#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT
+#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MAX_INT
+#elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
+#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT
+#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT
+#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MIN_INT
+#else
+#error "Result for float to integer conversion is not defined"
+#endif
+
 #ifndef SLJIT_W
 
 /* Defining long constants. */
-#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
-#define SLJIT_W(w)	(w##l)
-#elif (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
+#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
 #ifdef _WIN64
 #define SLJIT_W(w)	(w##ll)
 #else /* !windows */
@@ -521,9 +446,10 @@ typedef double sljit_f64;
 /* Auto detecting mips revision. */
 #if (defined __mips_isa_rev) && (__mips_isa_rev >= 6)
 #define SLJIT_MIPS_REV 6
-#elif (defined __mips_isa_rev && __mips_isa_rev >= 1) \
-	|| (defined __clang__ && defined _MIPS_ARCH_OCTEON) \
-	|| (defined __clang__ && defined _MIPS_ARCH_P5600)
+#elif defined(__mips_isa_rev) && __mips_isa_rev >= 1
+#define SLJIT_MIPS_REV __mips_isa_rev
+#elif defined(__clang__) \
+	&& (defined(_MIPS_ARCH_OCTEON) || defined(_MIPS_ARCH_P5600))
 /* clang either forgets to define (clang-7) __mips_isa_rev at all
  * or sets it to zero (clang-8,-9) for -march=octeon (MIPS64 R2+)
  * and -march=p5600 (MIPS32 R5).
@@ -562,7 +488,8 @@ typedef double sljit_f64;
 	|| (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
 	|| (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \
 	|| (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \
-	|| (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
+	|| (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
+	|| (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
 #define SLJIT_UNALIGNED 1
 #endif
 
@@ -574,7 +501,8 @@ typedef double sljit_f64;
 	|| (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
 	|| (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \
 	|| (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \
-	|| (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
+	|| (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
+	|| (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
 #define SLJIT_FPU_UNALIGNED 1
 #endif
 
@@ -594,6 +522,19 @@ typedef double sljit_f64;
 #define SLJIT_FUNC
 #endif /* !SLJIT_FUNC */
 
+/* Disable instrumentation for these functions as they may not be sound */
+#ifndef SLJIT_FUNC_ATTRIBUTE
+#if defined(__has_feature)
+#if __has_feature(memory_sanitizer)
+#define SLJIT_FUNC_ATTRIBUTE __attribute__((no_sanitize("memory")))
+#endif /* __has_feature(memory_sanitizer) */
+#endif /* defined(__has_feature) */
+#endif
+
+#ifndef SLJIT_FUNC_ATTRIBUTE
+#define SLJIT_FUNC_ATTRIBUTE
+#endif
+
 #ifndef SLJIT_INDIRECT_CALL
 #if ((defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) && (!defined _CALL_ELF || _CALL_ELF == 1)) \
 	|| ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && defined _AIX)
@@ -631,12 +572,14 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free
 #if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)
 SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);
 #define SLJIT_EXEC_OFFSET(ptr) sljit_exec_offset(ptr)
-#else
-#define SLJIT_EXEC_OFFSET(ptr) 0
 #endif
 
 #endif /* SLJIT_EXECUTABLE_ALLOCATOR */
 
+#ifndef SLJIT_EXEC_OFFSET
+#define SLJIT_EXEC_OFFSET(ptr) 0
+#endif
+
 /**********************************************/
 /* Registers and locals offset determination. */
 /**********************************************/
@@ -645,15 +588,21 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_
 
 #define SLJIT_NUMBER_OF_REGISTERS 12
 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 7
+#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 1
 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 7
 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0
+#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 1
 #define SLJIT_LOCALS_OFFSET_BASE (8 * SSIZE_OF(sw))
 #define SLJIT_PREF_SHIFT_REG SLJIT_R2
+#define SLJIT_MASKED_SHIFT 1
+#define SLJIT_MASKED_SHIFT32 1
 
 #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 
 #define SLJIT_NUMBER_OF_REGISTERS 13
+#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 2
 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 15
+#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 1
 #ifndef _WIN64
 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 6
 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0
@@ -664,37 +613,39 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_
 #define SLJIT_LOCALS_OFFSET_BASE (4 * SSIZE_OF(sw))
 #endif /* !_WIN64 */
 #define SLJIT_PREF_SHIFT_REG SLJIT_R3
+#define SLJIT_MASKED_SHIFT 1
+#define SLJIT_MASKED_SHIFT32 1
 
-#elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
-
-#define SLJIT_NUMBER_OF_REGISTERS 12
-#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
-#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 14
-#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8
-#define SLJIT_LOCALS_OFFSET_BASE 0
-
-#elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
+#elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32)
 
 #define SLJIT_NUMBER_OF_REGISTERS 12
 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
+#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 2
 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 14
 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8
+#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2
 #define SLJIT_LOCALS_OFFSET_BASE 0
 
 #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
 
 #define SLJIT_NUMBER_OF_REGISTERS 26
 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 10
+#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 3
 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30
 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8
+#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2
 #define SLJIT_LOCALS_OFFSET_BASE (2 * (sljit_s32)sizeof(sljit_sw))
+#define SLJIT_MASKED_SHIFT 1
+#define SLJIT_MASKED_SHIFT32 1
 
 #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
 
 #define SLJIT_NUMBER_OF_REGISTERS 23
 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 17
+#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 3
 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30
 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 18
+#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2
 #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) || (defined _AIX)
 #define SLJIT_LOCALS_OFFSET_BASE ((6 + 8) * (sljit_s32)sizeof(sljit_sw))
 #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
@@ -717,14 +668,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_
 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 29
 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8
 #endif
+#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 5
+#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 3
+#define SLJIT_MASKED_SHIFT 1
+#define SLJIT_MASKED_SHIFT32 1
 
 #elif (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV)
 
 #define SLJIT_NUMBER_OF_REGISTERS 23
 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 12
-#define SLJIT_LOCALS_OFFSET_BASE 0
+#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 5
 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30
 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 12
+#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2
+#define SLJIT_LOCALS_OFFSET_BASE 0
+#define SLJIT_MASKED_SHIFT 1
+#define SLJIT_MASKED_SHIFT32 1
 
 #elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
 
@@ -751,16 +710,34 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_
 
 #define SLJIT_NUMBER_OF_REGISTERS 12
 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
+#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 3
 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 15
 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8
+#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 1
 #define SLJIT_LOCALS_OFFSET_BASE SLJIT_S390X_DEFAULT_STACK_FRAME_SIZE
+#define SLJIT_MASKED_SHIFT 1
+
+#elif (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
+
+#define SLJIT_NUMBER_OF_REGISTERS 23
+#define SLJIT_NUMBER_OF_SAVED_REGISTERS 10
+#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 5
+#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30
+#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 12
+#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2
+#define SLJIT_LOCALS_OFFSET_BASE 0
+#define SLJIT_MASKED_SHIFT 1
+#define SLJIT_MASKED_SHIFT32 1
 
 #elif (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
 
+/* Just to have something. */
 #define SLJIT_NUMBER_OF_REGISTERS 0
 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 0
+#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 0
 #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 0
 #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0
+#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 0
 #define SLJIT_LOCALS_OFFSET_BASE 0
 
 #endif
@@ -773,6 +750,45 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_
 #define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \
 	(SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS)
 
+/**********************************/
+/* Temporary register management. */
+/**********************************/
+
+#define SLJIT_TMP_REGISTER_BASE (SLJIT_NUMBER_OF_REGISTERS + 2)
+#define SLJIT_TMP_FREGISTER_BASE (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)
+
+/* WARNING: Accessing temporary registers is not recommended, because they
+   are also used by the JIT compiler for various computations. Using them
+   might have any side effects including incorrect operations and crashes,
+   so use them at your own risk. The machine registers themselves might have
+   limitations, e.g. the r0 register on s390x / ppc cannot be used as
+   base address for memory operations. */
+
+/* Temporary registers */
+#define SLJIT_TMP_R0		(SLJIT_TMP_REGISTER_BASE + 0)
+#define SLJIT_TMP_R1		(SLJIT_TMP_REGISTER_BASE + 1)
+#define SLJIT_TMP_R2		(SLJIT_TMP_REGISTER_BASE + 2)
+#define SLJIT_TMP_R3		(SLJIT_TMP_REGISTER_BASE + 3)
+#define SLJIT_TMP_R4		(SLJIT_TMP_REGISTER_BASE + 4)
+#define SLJIT_TMP_R5		(SLJIT_TMP_REGISTER_BASE + 5)
+#define SLJIT_TMP_R6		(SLJIT_TMP_REGISTER_BASE + 6)
+#define SLJIT_TMP_R7		(SLJIT_TMP_REGISTER_BASE + 7)
+#define SLJIT_TMP_R8		(SLJIT_TMP_REGISTER_BASE + 8)
+#define SLJIT_TMP_R9		(SLJIT_TMP_REGISTER_BASE + 9)
+#define SLJIT_TMP_R(i)		(SLJIT_TMP_REGISTER_BASE + (i))
+
+#define SLJIT_TMP_FR0		(SLJIT_TMP_FREGISTER_BASE + 0)
+#define SLJIT_TMP_FR1		(SLJIT_TMP_FREGISTER_BASE + 1)
+#define SLJIT_TMP_FR2		(SLJIT_TMP_FREGISTER_BASE + 2)
+#define SLJIT_TMP_FR3		(SLJIT_TMP_FREGISTER_BASE + 3)
+#define SLJIT_TMP_FR4		(SLJIT_TMP_FREGISTER_BASE + 4)
+#define SLJIT_TMP_FR5		(SLJIT_TMP_FREGISTER_BASE + 5)
+#define SLJIT_TMP_FR6		(SLJIT_TMP_FREGISTER_BASE + 6)
+#define SLJIT_TMP_FR7		(SLJIT_TMP_FREGISTER_BASE + 7)
+#define SLJIT_TMP_FR8		(SLJIT_TMP_FREGISTER_BASE + 8)
+#define SLJIT_TMP_FR9		(SLJIT_TMP_FREGISTER_BASE + 9)
+#define SLJIT_TMP_FR(i)		(SLJIT_TMP_FREGISTER_BASE + (i))
+
 /********************************/
 /* CPU status flags management. */
 /********************************/
@@ -781,10 +797,24 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_
 	|| (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \
 	|| (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) \
 	|| (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \
-	|| (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
+	|| (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
+	|| (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
 #define SLJIT_HAS_STATUS_FLAGS_STATE 1
 #endif
 
+/***************************************/
+/* Floating point register management. */
+/***************************************/
+
+#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \
+	|| (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
+#define SLJIT_F64_SECOND(reg) \
+	((reg) + SLJIT_FS0 + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS)
+#else /* !SLJIT_CONFIG_ARM_32 && !SLJIT_CONFIG_MIPS_32 */
+#define SLJIT_F64_SECOND(reg) \
+	(reg)
+#endif /* SLJIT_CONFIG_ARM_32 || SLJIT_CONFIG_MIPS_32 */
+
 /*************************************/
 /* Debug and verbose related macros. */
 /*************************************/
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitLir.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitLir.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitLir.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitLir.c	2024-11-20 13:56:33.000000000 +0000
@@ -93,7 +93,8 @@
 #define SSIZE_OF(type) ((sljit_s32)sizeof(sljit_ ## type))
 
 #define VARIABLE_FLAG_SHIFT (10)
-#define VARIABLE_FLAG_MASK (0x3f << VARIABLE_FLAG_SHIFT)
+/* All variable flags are even. */
+#define VARIABLE_FLAG_MASK (0x3e << VARIABLE_FLAG_SHIFT)
 #define GET_FLAG_TYPE(op) ((op) >> VARIABLE_FLAG_SHIFT)
 
 #define GET_OPCODE(op) \
@@ -122,25 +123,34 @@
 #endif
 
 /* Parameter parsing. */
-#define REG_MASK		0x3f
+#define REG_MASK		0x7f
 #define OFFS_REG(reg)		(((reg) >> 8) & REG_MASK)
 #define OFFS_REG_MASK		(REG_MASK << 8)
 #define TO_OFFS_REG(reg)	((reg) << 8)
-/* When reg cannot be unused. */
-#define FAST_IS_REG(reg)	((reg) <= REG_MASK)
+#define FAST_IS_REG(reg)	((reg) < REG_MASK)
 
 /* Mask for argument types. */
 #define SLJIT_ARG_MASK		0x7
 #define SLJIT_ARG_FULL_MASK	(SLJIT_ARG_MASK | SLJIT_ARG_TYPE_SCRATCH_REG)
 
-/* Mask for sljit_emit_mem. */
-#define REG_PAIR_MASK		0xff00
-#define REG_PAIR_FIRST(reg)	((reg) & 0xff)
+/* Mask for register pairs. */
+#define REG_PAIR_MASK		0x7f00
+#define REG_PAIR_FIRST(reg)	((reg) & 0x7f)
 #define REG_PAIR_SECOND(reg)	((reg) >> 8)
 
 /* Mask for sljit_emit_enter. */
 #define SLJIT_KEPT_SAVEDS_COUNT(options) ((options) & 0x3)
 
+/* Getters for simd operations, which returns with log2(size). */
+#define SLJIT_SIMD_GET_OPCODE(type)		((type) & 0xff)
+#define SLJIT_SIMD_GET_REG_SIZE(type)		(((type) >> 12) & 0x3f)
+#define SLJIT_SIMD_GET_ELEM_SIZE(type)		(((type) >> 18) & 0x3f)
+#define SLJIT_SIMD_GET_ELEM2_SIZE(type)		(((type) >> 24) & 0x3f)
+
+#define SLJIT_SIMD_CHECK_REG(type) (((type) & 0x3f000) >= SLJIT_SIMD_REG_64 && ((type) & 0x3f000) <= SLJIT_SIMD_REG_512)
+#define SLJIT_SIMD_TYPE_MASK(m) ((sljit_s32)0xff000fff & ~(SLJIT_SIMD_FLOAT | SLJIT_SIMD_TEST | (m)))
+#define SLJIT_SIMD_TYPE_MASK2(m) ((sljit_s32)0xc0000fff & ~(SLJIT_SIMD_FLOAT | SLJIT_SIMD_TEST | (m)))
+
 /* Jump flags. */
 #define JUMP_LABEL	0x1
 #define JUMP_ADDR	0x2
@@ -155,14 +165,14 @@
 #	define TYPE_SHIFT	13
 #endif /* SLJIT_CONFIG_X86 */
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
 #	define IS_BL		0x4
 #	define PATCH_B		0x8
-#endif /* SLJIT_CONFIG_ARM_V5 || SLJIT_CONFIG_ARM_V7 */
+#endif /* SLJIT_CONFIG_ARM_V6 || SLJIT_CONFIG_ARM_V6 */
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 #	define CPOOL_SIZE	512
-#endif /* SLJIT_CONFIG_ARM_V5 */
+#endif /* SLJIT_CONFIG_ARM_V6 */
 
 #if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
 #	define IS_COND		0x04
@@ -248,15 +258,27 @@
 #endif /* SLJIT_CONFIG_RISCV_64 */
 #endif /* SLJIT_CONFIG_RISCV */
 
+#if (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
+#	define IS_COND		0x004
+#	define IS_CALL		0x008
+
+#	define PATCH_B		0x010
+#	define PATCH_J		0x020
+
+#	define PATCH_REL32	0x040
+#	define PATCH_ABS32	0x080
+#	define PATCH_ABS52	0x100
+
+#endif /* SLJIT_CONFIG_LOONGARCH */
 /* Stack management. */
 
 #define GET_SAVED_REGISTERS_SIZE(scratches, saveds, extra) \
 	(((scratches < SLJIT_NUMBER_OF_SCRATCH_REGISTERS ? 0 : (scratches - SLJIT_NUMBER_OF_SCRATCH_REGISTERS)) + \
 		(saveds) + (sljit_s32)(extra)) * (sljit_s32)sizeof(sljit_sw))
 
-#define GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, size) \
+#define GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, type) \
 	(((fscratches < SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS ? 0 : (fscratches - SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS)) + \
-		(fsaveds)) * (sljit_s32)(size))
+		(fsaveds)) * SSIZE_OF(type))
 
 #define ADJUST_LOCAL_OFFSET(p, i) \
 	if ((p) == (SLJIT_MEM1(SLJIT_SP))) \
@@ -272,25 +294,49 @@
 #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
 
 #if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)
-#include "sljitProtExecAllocator.c"
-#elif (defined SLJIT_WX_EXECUTABLE_ALLOCATOR && SLJIT_WX_EXECUTABLE_ALLOCATOR)
-#include "sljitWXExecAllocator.c"
+
+#if defined(__NetBSD__)
+#include "allocator_src/sljitProtExecAllocatorNetBSD.c"
 #else
-#include "sljitExecAllocator.c"
+#include "allocator_src/sljitProtExecAllocatorPosix.c"
 #endif
 
+#elif (defined SLJIT_WX_EXECUTABLE_ALLOCATOR && SLJIT_WX_EXECUTABLE_ALLOCATOR)
+
+#if defined(_WIN32)
+#include "allocator_src/sljitWXExecAllocatorWindows.c"
+#else
+#include "allocator_src/sljitWXExecAllocatorPosix.c"
 #endif
 
-#if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)
-#define SLJIT_ADD_EXEC_OFFSET(ptr, exec_offset) ((sljit_u8 *)(ptr) + (exec_offset))
 #else
-#define SLJIT_ADD_EXEC_OFFSET(ptr, exec_offset) ((sljit_u8 *)(ptr))
+
+#if defined(_WIN32)
+#include "allocator_src/sljitExecAllocatorWindows.c"
+#elif defined(__APPLE__)
+#include "allocator_src/sljitExecAllocatorApple.c"
+#elif defined(__FreeBSD__)
+#include "allocator_src/sljitExecAllocatorFreeBSD.c"
+#else
+#include "allocator_src/sljitExecAllocatorPosix.c"
 #endif
 
+#endif
+
+#else /* !SLJIT_EXECUTABLE_ALLOCATOR */
+
 #ifndef SLJIT_UPDATE_WX_FLAGS
 #define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec)
 #endif
 
+#endif /* SLJIT_EXECUTABLE_ALLOCATOR */
+
+#if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)
+#define SLJIT_ADD_EXEC_OFFSET(ptr, exec_offset) ((sljit_u8 *)(ptr) + (exec_offset))
+#else
+#define SLJIT_ADD_EXEC_OFFSET(ptr, exec_offset) ((sljit_u8 *)(ptr))
+#endif
+
 /* Argument checking features. */
 
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
@@ -422,9 +468,9 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_co
 
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
 	compiler->args_size = -1;
-#endif
+#endif /* SLJIT_CONFIG_X86_32 */
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 	compiler->cpool = (sljit_uw*)SLJIT_MALLOC(CPOOL_SIZE * sizeof(sljit_uw)
 		+ CPOOL_SIZE * sizeof(sljit_u8), allocator_data);
 	if (!compiler->cpool) {
@@ -435,18 +481,18 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_co
 	}
 	compiler->cpool_unique = (sljit_u8*)(compiler->cpool + CPOOL_SIZE);
 	compiler->cpool_diff = 0xffffffff;
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 
 #if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
 	compiler->delay_slot = UNMOVABLE_INS;
-#endif
+#endif /* SLJIT_CONFIG_MIPS */
 
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \
 		|| (defined SLJIT_DEBUG && SLJIT_DEBUG)
 	compiler->last_flags = 0;
 	compiler->last_return = -1;
 	compiler->logical_local_size = 0;
-#endif
+#endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_DEBUG */
 
 #if (defined SLJIT_NEEDS_COMPILER_INIT && SLJIT_NEEDS_COMPILER_INIT)
 	if (!compiler_initialized) {
@@ -479,7 +525,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free
 		SLJIT_FREE(curr, allocator_data);
 	}
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 	SLJIT_FREE(compiler->cpool, allocator_data);
 #endif
 	SLJIT_FREE(compiler, allocator_data);
@@ -802,11 +848,8 @@ static sljit_s32 function_check_argument
 
 #define FUNCTION_CHECK_IS_REG(r) \
 	(((r) >= SLJIT_R0 && (r) < (SLJIT_R0 + compiler->scratches)) \
-	|| ((r) > (SLJIT_S0 - compiler->saveds) && (r) <= SLJIT_S0))
-
-#define FUNCTION_CHECK_IS_FREG(fr) \
-	(((fr) >= SLJIT_FR0 && (fr) < (SLJIT_FR0 + compiler->fscratches)) \
-	|| ((fr) > (SLJIT_FS0 - compiler->fsaveds) && (fr) <= SLJIT_FS0))
+	|| ((r) > (SLJIT_S0 - compiler->saveds) && (r) <= SLJIT_S0) \
+	|| ((r) >= SLJIT_TMP_REGISTER_BASE && (r) < (SLJIT_TMP_REGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_REGISTERS)))
 
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
 #define CHECK_IF_VIRTUAL_REGISTER(p) ((p) <= SLJIT_S3 && (p) >= SLJIT_S8)
@@ -816,7 +859,7 @@ static sljit_s32 function_check_argument
 
 static sljit_s32 function_check_src_mem(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
 {
-	if (compiler->scratches == -1 || compiler->saveds == -1)
+	if (compiler->scratches == -1)
 		return 0;
 
 	if (!(p & SLJIT_MEM))
@@ -853,7 +896,7 @@ static sljit_s32 function_check_src_mem(
 
 static sljit_s32 function_check_src(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
 {
-	if (compiler->scratches == -1 || compiler->saveds == -1)
+	if (compiler->scratches == -1)
 		return 0;
 
 	if (FUNCTION_CHECK_IS_REG(p))
@@ -870,7 +913,7 @@ static sljit_s32 function_check_src(stru
 
 static sljit_s32 function_check_dst(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
 {
-	if (compiler->scratches == -1 || compiler->saveds == -1)
+	if (compiler->scratches == -1)
 		return 0;
 
 	if (FUNCTION_CHECK_IS_REG(p))
@@ -882,19 +925,59 @@ static sljit_s32 function_check_dst(stru
 #define FUNCTION_CHECK_DST(p, i) \
 	CHECK_ARGUMENT(function_check_dst(compiler, p, i));
 
+#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \
+	|| (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
+
+#define FUNCTION_CHECK_IS_FREG(fr, is_32) \
+	function_check_is_freg(compiler, (fr), (is_32))
+
+static sljit_s32 function_check_is_freg(struct sljit_compiler *compiler, sljit_s32 fr, sljit_s32 is_32);
+
+#define FUNCTION_FCHECK(p, i, is_32) \
+	CHECK_ARGUMENT(function_fcheck(compiler, (p), (i), (is_32)));
+
+static sljit_s32 function_fcheck(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i, sljit_s32 is_32)
+{
+	if (compiler->scratches == -1)
+		return 0;
+
+	if (FUNCTION_CHECK_IS_FREG(p, is_32))
+		return (i == 0);
+
+	return function_check_src_mem(compiler, p, i);
+}
+
+#else /* !SLJIT_CONFIG_ARM_32 && !SLJIT_CONFIG_MIPS_32 */
+#define FUNCTION_CHECK_IS_FREG(fr, is_32) \
+	function_check_is_freg(compiler, (fr))
+
+static sljit_s32 function_check_is_freg(struct sljit_compiler *compiler, sljit_s32 fr)
+{
+	if (compiler->scratches == -1)
+		return 0;
+
+	return (fr >= SLJIT_FR0 && fr < (SLJIT_FR0 + compiler->fscratches))
+		|| (fr > (SLJIT_FS0 - compiler->fsaveds) && fr <= SLJIT_FS0)
+		|| (fr >= SLJIT_TMP_FREGISTER_BASE && fr < (SLJIT_TMP_FREGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS));
+}
+
+#define FUNCTION_FCHECK(p, i, is_32) \
+	CHECK_ARGUMENT(function_fcheck(compiler, (p), (i)));
+
 static sljit_s32 function_fcheck(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
 {
-	if (compiler->scratches == -1 || compiler->saveds == -1)
+	if (compiler->scratches == -1)
 		return 0;
 
-	if (FUNCTION_CHECK_IS_FREG(p))
+	if ((p >= SLJIT_FR0 && p < (SLJIT_FR0 + compiler->fscratches))
+			|| (p > (SLJIT_FS0 - compiler->fsaveds) && p <= SLJIT_FS0)
+			|| (p >= SLJIT_TMP_FREGISTER_BASE && p < (SLJIT_TMP_FREGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS)))
 		return (i == 0);
 
 	return function_check_src_mem(compiler, p, i);
 }
 
-#define FUNCTION_FCHECK(p, i) \
-	CHECK_ARGUMENT(function_fcheck(compiler, p, i));
+#endif /* SLJIT_CONFIG_ARM_32 || SLJIT_CONFIG_MIPS_32 */
 
 #endif /* SLJIT_ARGUMENT_CHECKS */
 
@@ -923,23 +1006,35 @@ static void sljit_verbose_reg(struct slj
 {
 	if (r < (SLJIT_R0 + compiler->scratches))
 		fprintf(compiler->verbose, "r%d", r - SLJIT_R0);
-	else if (r != SLJIT_SP)
+	else if (r < SLJIT_SP)
 		fprintf(compiler->verbose, "s%d", SLJIT_NUMBER_OF_REGISTERS - r);
-	else
+	else if (r == SLJIT_SP)
 		fprintf(compiler->verbose, "sp");
+	else
+		fprintf(compiler->verbose, "t%d", r - SLJIT_TMP_REGISTER_BASE);
 }
 
 static void sljit_verbose_freg(struct sljit_compiler *compiler, sljit_s32 r)
 {
+#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \
+		|| (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
+	if (r >= SLJIT_F64_SECOND(SLJIT_FR0)) {
+		fprintf(compiler->verbose, "^");
+		r -= SLJIT_F64_SECOND(0);
+	}
+#endif /* SLJIT_CONFIG_ARM_32 || SLJIT_CONFIG_MIPS_32 */
+
 	if (r < (SLJIT_FR0 + compiler->fscratches))
 		fprintf(compiler->verbose, "fr%d", r - SLJIT_FR0);
-	else
+	else if (r < SLJIT_TMP_FREGISTER_BASE)
 		fprintf(compiler->verbose, "fs%d", SLJIT_NUMBER_OF_FLOAT_REGISTERS - r);
+	else
+		fprintf(compiler->verbose, "ft%d", r - SLJIT_TMP_FREGISTER_BASE);
 }
 
 static void sljit_verbose_param(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
 {
-	if ((p) & SLJIT_IMM)
+	if ((p) == SLJIT_IMM)
 		fprintf(compiler->verbose, "#%" SLJIT_PRINT_D "d", (i));
 	else if ((p) & SLJIT_MEM) {
 		if ((p) & REG_MASK) {
@@ -991,9 +1086,17 @@ static const char* op0_names[] = {
 };
 
 static const char* op1_names[] = {
+	"mov", "mov", "mov", "mov",
+	"mov", "mov", "mov", "mov",
+	"mov", "clz", "ctz", "rev",
+	"rev", "rev", "rev", "rev"
+};
+
+static const char* op1_types[] = {
 	"", ".u8", ".s8", ".u16",
 	".s16", ".u32", ".s32", "32",
-	".p", "not", "clz", "ctz"
+	".p", "", "", "",
+	".u16", ".s16", ".u32", ".s32"
 };
 
 static const char* op2_names[] = {
@@ -1003,22 +1106,36 @@ static const char* op2_names[] = {
 	"ashr", "mashr", "rotl", "rotr"
 };
 
-static const char* op_src_names[] = {
+static const char* op_src_dst_names[] = {
 	"fast_return", "skip_frames_before_fast_return",
 	"prefetch_l1", "prefetch_l2",
 	"prefetch_l3", "prefetch_once",
+	"fast_enter", "get_return_address"
 };
 
 static const char* fop1_names[] = {
 	"mov", "conv", "conv", "conv",
-	"conv", "conv", "cmp", "neg",
-	"abs",
+	"conv", "conv", "conv", "conv",
+	"cmp", "neg", "abs",
+};
+
+static const char* fop1_conv_types[] = {
+	"sw", "s32", "sw", "s32",
+	"uw", "u32"
 };
 
 static const char* fop2_names[] = {
 	"add", "sub", "mul", "div"
 };
 
+static const char* fop2r_names[] = {
+	"copysign"
+};
+
+static const char* simd_op2_names[] = {
+	"and", "or", "xor"
+};
+
 static const char* jump_names[] = {
 	"equal", "not_equal",
 	"less", "greater_equal",
@@ -1026,7 +1143,8 @@ static const char* jump_names[] = {
 	"sig_less", "sig_greater_equal",
 	"sig_greater", "sig_less_equal",
 	"overflow", "not_overflow",
-	"carry", "",
+	"carry", "not_carry",
+	"atomic_stored", "atomic_not_stored",
 	"f_equal", "f_not_equal",
 	"f_less", "f_greater_equal",
 	"f_greater", "f_less_equal",
@@ -1126,7 +1244,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 				fprintf(compiler->verbose, " keep:%d,", SLJIT_KEPT_SAVEDS_COUNT(options));
 		}
 
-		fprintf(compiler->verbose, "scratches:%d, saveds:%d, fscratches:%d, fsaveds:%d, local_size:%d\n",
+		fprintf(compiler->verbose, " scratches:%d, saveds:%d, fscratches:%d, fsaveds:%d, local_size:%d\n",
 			scratches, saveds, fscratches, fsaveds, local_size);
 	}
 #endif
@@ -1198,7 +1316,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	}
 
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
-	CHECK_ARGUMENT(compiler->last_return == SLJIT_ARG_TYPE_VOID);
+	CHECK_ARGUMENT(compiler->last_return == SLJIT_ARG_TYPE_RET_VOID);
 #endif
 
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
@@ -1241,7 +1359,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	if (GET_OPCODE(op) < SLJIT_MOV_F64) {
 		FUNCTION_CHECK_SRC(src, srcw);
 	} else {
-		FUNCTION_FCHECK(src, srcw);
+		FUNCTION_FCHECK(src, srcw, op & SLJIT_32);
 	}
 	compiler->last_flags = 0;
 #endif
@@ -1249,7 +1367,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
 		if (GET_OPCODE(op) < SLJIT_MOV_F64) {
 			fprintf(compiler->verbose, "  return%s%s ", !(op & SLJIT_32) ? "" : "32",
-				op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE]);
+				op1_types[GET_OPCODE(op) - SLJIT_OP1_BASE]);
 			sljit_verbose_param(compiler, src, srcw);
 		} else {
 			fprintf(compiler->verbose, "  return%s ", !(op & SLJIT_32) ? ".f64" : ".f32");
@@ -1277,22 +1395,6 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	CHECK_RETURN_OK;
 }
 
-static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
-{
-#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
-	FUNCTION_CHECK_DST(dst, dstw);
-	compiler->last_flags = 0;
-#endif
-#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
-	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
-		fprintf(compiler->verbose, "  fast_enter ");
-		sljit_verbose_param(compiler, dst, dstw);
-		fprintf(compiler->verbose, "\n");
-	}
-#endif
-	CHECK_RETURN_OK;
-}
-
 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
 {
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
@@ -1326,16 +1428,16 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	}
 
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
-	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_CTZ);
+	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_REV_S32);
 
 	switch (GET_OPCODE(op)) {
-	case SLJIT_NOT:
-		/* Only SLJIT_32 and SLJIT_SET_Z are allowed. */
-		CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK));
-		break;
 	case SLJIT_MOV:
 	case SLJIT_MOV_U32:
+	case SLJIT_MOV_S32:
+	case SLJIT_MOV32:
 	case SLJIT_MOV_P:
+	case SLJIT_REV_U32:
+	case SLJIT_REV_S32:
 		/* Nothing allowed */
 		CHECK_ARGUMENT(!(op & (SLJIT_32 | SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
 		break;
@@ -1347,25 +1449,11 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 
 	FUNCTION_CHECK_DST(dst, dstw);
 	FUNCTION_CHECK_SRC(src, srcw);
-
-	if (GET_OPCODE(op) >= SLJIT_NOT) {
-		CHECK_ARGUMENT(src != SLJIT_IMM);
-		compiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_32 | SLJIT_SET_Z));
-	}
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
-		if (GET_OPCODE(op) <= SLJIT_MOV_P)
-		{
-			fprintf(compiler->verbose, "  mov%s%s ", !(op & SLJIT_32) ? "" : "32",
-				op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE]);
-		}
-		else
-		{
-			fprintf(compiler->verbose, "  %s%s%s%s%s ", op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE], !(op & SLJIT_32) ? "" : "32",
-				!(op & SLJIT_SET_Z) ? "" : ".z", !(op & VARIABLE_FLAG_MASK) ? "" : ".",
-				!(op & VARIABLE_FLAG_MASK) ? "" : jump_names[GET_FLAG_TYPE(op)]);
-		}
+		fprintf(compiler->verbose, "  %s%s%s ", op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE],
+			!(op & SLJIT_32) ? "" : "32", op1_types[GET_OPCODE(op) - SLJIT_OP1_BASE]);
 
 		sljit_verbose_param(compiler, dst, dstw);
 		fprintf(compiler->verbose, ", ");
@@ -1376,6 +1464,94 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	CHECK_RETURN_OK;
 }
 
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst_reg,
+	sljit_s32 mem_reg)
+{
+	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
+		compiler->skip_checks = 0;
+		CHECK_RETURN_OK;
+	}
+
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_ATOMIC));
+	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_MOV_P);
+	CHECK_ARGUMENT(GET_OPCODE(op) != SLJIT_MOV_S8 && GET_OPCODE(op) != SLJIT_MOV_S16 && GET_OPCODE(op) != SLJIT_MOV_S32);
+
+	/* All arguments must be valid registers. */
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(mem_reg) && !CHECK_IF_VIRTUAL_REGISTER(mem_reg));
+
+	if (op == SLJIT_MOV32_U8 || op == SLJIT_MOV32_U16) {
+		/* Only SLJIT_32 is allowed. */
+		CHECK_ARGUMENT(!(op & (VARIABLE_FLAG_MASK | SLJIT_SET_Z)));
+	} else {
+		/* Nothing allowed. */
+		CHECK_ARGUMENT(!(op & (SLJIT_32 | SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
+	}
+
+	compiler->last_flags = 0;
+#endif /* SLJIT_ARGUMENT_CHECKS */
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+		fprintf(compiler->verbose, "  atomic_load%s%s ", !(op & SLJIT_32) ? "" : "32",
+				op1_types[GET_OPCODE(op) - SLJIT_OP1_BASE]);
+		sljit_verbose_reg(compiler, dst_reg);
+		fprintf(compiler->verbose, ", [");
+		sljit_verbose_reg(compiler, mem_reg);
+		fprintf(compiler->verbose, "]\n");
+	}
+#endif /* SLJIT_VERBOSE */
+	CHECK_RETURN_OK;
+}
+
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 src_reg,
+	sljit_s32 mem_reg,
+	sljit_s32 temp_reg)
+{
+	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
+		compiler->skip_checks = 0;
+		CHECK_RETURN_OK;
+	}
+
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_ATOMIC));
+	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_MOV_P);
+	CHECK_ARGUMENT(GET_OPCODE(op) != SLJIT_MOV_S8 && GET_OPCODE(op) != SLJIT_MOV_S16 && GET_OPCODE(op) != SLJIT_MOV_S32);
+
+	/* All arguments must be valid registers. */
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src_reg));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(mem_reg) && !CHECK_IF_VIRTUAL_REGISTER(mem_reg));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(temp_reg) && src_reg != temp_reg);
+
+	CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK) || GET_FLAG_TYPE(op) == SLJIT_ATOMIC_STORED);
+
+	if (GET_OPCODE(op) == SLJIT_MOV_U8 || GET_OPCODE(op) == SLJIT_MOV_U16) {
+		/* Only SLJIT_32, SLJIT_ATOMIC_STORED are allowed. */
+		CHECK_ARGUMENT(!(op & SLJIT_SET_Z));
+	} else {
+		/* Only SLJIT_ATOMIC_STORED is allowed. */
+		CHECK_ARGUMENT(!(op & (SLJIT_32 | SLJIT_SET_Z)));
+	}
+
+	compiler->last_flags = GET_FLAG_TYPE(op) | (op & SLJIT_32);
+#endif /* SLJIT_ARGUMENT_CHECKS */
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+		fprintf(compiler->verbose, "  atomic_store%s%s%s ", !(op & SLJIT_32) ? "" : "32",
+				op1_types[GET_OPCODE(op) - SLJIT_OP1_BASE], !(op & VARIABLE_FLAG_MASK) ? "" : ".stored");
+		sljit_verbose_reg(compiler, src_reg);
+		fprintf(compiler->verbose, ", [");
+		sljit_verbose_reg(compiler, mem_reg);
+		fprintf(compiler->verbose, "], ");
+		sljit_verbose_reg(compiler, temp_reg);
+		fprintf(compiler->verbose, "\n");
+	}
+#endif /* SLJIT_VERBOSE */
+	CHECK_RETURN_OK;
+}
+
 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 unset,
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 src1, sljit_sw src1w,
@@ -1461,28 +1637,33 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 }
 
 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 src_dst,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w)
+	sljit_s32 dst_reg,
+	sljit_s32 src1_reg,
+	sljit_s32 src2_reg,
+	sljit_s32 src3, sljit_sw src3w)
 {
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
 	CHECK_ARGUMENT(GET_OPCODE(op) == SLJIT_SHL || GET_OPCODE(op) == SLJIT_LSHR
 		|| GET_OPCODE(op) == SLJIT_MSHL || GET_OPCODE(op) == SLJIT_MLSHR);
 	CHECK_ARGUMENT((op & ~(0xff | SLJIT_32 | SLJIT_SHIFT_INTO_NON_ZERO)) == 0);
-	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src_dst));
-	FUNCTION_CHECK_SRC(src1, src1w);
-	FUNCTION_CHECK_SRC(src2, src2w);
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src1_reg));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src2_reg));
+	FUNCTION_CHECK_SRC(src3, src3w);
+	CHECK_ARGUMENT(dst_reg != src2_reg);
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
 		fprintf(compiler->verbose, "  %s%s.into%s ", op2_names[GET_OPCODE(op) - SLJIT_OP2_BASE], !(op & SLJIT_32) ? "" : "32",
 			(op & SLJIT_SHIFT_INTO_NON_ZERO) ? ".nz" : "");
 
-		sljit_verbose_reg(compiler, src_dst);
+		sljit_verbose_reg(compiler, dst_reg);
 		fprintf(compiler->verbose, ", ");
-		sljit_verbose_param(compiler, src1, src1w);
+		sljit_verbose_reg(compiler, src1_reg);
 		fprintf(compiler->verbose, ", ");
-		sljit_verbose_param(compiler, src2, src2w);
+		sljit_verbose_reg(compiler, src2_reg);
+		fprintf(compiler->verbose, ", ");
+		sljit_verbose_param(compiler, src3, src3w);
 		fprintf(compiler->verbose, "\n");
 	}
 #endif
@@ -1496,19 +1677,16 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	CHECK_ARGUMENT(op >= SLJIT_FAST_RETURN && op <= SLJIT_PREFETCH_ONCE);
 	FUNCTION_CHECK_SRC(src, srcw);
 
-	if (op == SLJIT_FAST_RETURN || op == SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN)
-	{
+	if (op == SLJIT_FAST_RETURN || op == SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN) {
 		CHECK_ARGUMENT(src != SLJIT_IMM);
 		compiler->last_flags = 0;
-	}
-	else if (op >= SLJIT_PREFETCH_L1 && op <= SLJIT_PREFETCH_ONCE)
-	{
+	} else if (op >= SLJIT_PREFETCH_L1 && op <= SLJIT_PREFETCH_ONCE) {
 		CHECK_ARGUMENT(src & SLJIT_MEM);
 	}
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
-		fprintf(compiler->verbose, "  %s ", op_src_names[op - SLJIT_OP_SRC_BASE]);
+		fprintf(compiler->verbose, "  %s ", op_src_dst_names[op - SLJIT_OP_SRC_DST_BASE]);
 		sljit_verbose_param(compiler, src, srcw);
 		fprintf(compiler->verbose, "\n");
 	}
@@ -1516,20 +1694,39 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	CHECK_RETURN_OK;
 }
 
-static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_register_index(sljit_s32 reg)
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_dst(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw)
 {
-	SLJIT_UNUSED_ARG(reg);
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
-	CHECK_ARGUMENT(reg > 0 && reg <= SLJIT_NUMBER_OF_REGISTERS);
+	CHECK_ARGUMENT(op >= SLJIT_FAST_ENTER && op <= SLJIT_GET_RETURN_ADDRESS);
+	FUNCTION_CHECK_DST(dst, dstw);
+
+	if (op == SLJIT_FAST_ENTER)
+		compiler->last_flags = 0;
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+		fprintf(compiler->verbose, "  %s ", op_src_dst_names[op - SLJIT_OP_SRC_DST_BASE]);
+		sljit_verbose_param(compiler, dst, dstw);
+		fprintf(compiler->verbose, "\n");
+	}
 #endif
 	CHECK_RETURN_OK;
 }
 
-static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_float_register_index(sljit_s32 reg)
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_register_index(sljit_s32 type, sljit_s32 reg)
 {
+	SLJIT_UNUSED_ARG(type);
 	SLJIT_UNUSED_ARG(reg);
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
-	CHECK_ARGUMENT(reg > 0 && reg <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
+	if (type == SLJIT_GP_REGISTER) {
+		CHECK_ARGUMENT((reg > 0 && reg <= SLJIT_NUMBER_OF_REGISTERS)
+			|| (reg >= SLJIT_TMP_REGISTER_BASE && reg <= (SLJIT_TMP_REGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_REGISTERS)));
+	} else {
+		CHECK_ARGUMENT(type == SLJIT_FLOAT_REGISTER || ((type >> 12) == 0 || ((type >> 12) >= 3 && (type >> 12) <= 6)));
+		CHECK_ARGUMENT((reg > 0 && reg <= SLJIT_NUMBER_OF_FLOAT_REGISTERS)
+			|| (reg >= SLJIT_TMP_FREGISTER_BASE && reg <= (SLJIT_TMP_FREGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS)));
+	}
 #endif
 	CHECK_RETURN_OK;
 }
@@ -1583,8 +1780,8 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
 	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV_F64 && GET_OPCODE(op) <= SLJIT_ABS_F64);
 	CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
-	FUNCTION_FCHECK(src, srcw);
-	FUNCTION_FCHECK(dst, dstw);
+	FUNCTION_FCHECK(src, srcw, op & SLJIT_32);
+	FUNCTION_FCHECK(dst, dstw, op & SLJIT_32);
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
@@ -1623,8 +1820,8 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	CHECK_ARGUMENT(!(op & SLJIT_SET_Z));
 	CHECK_ARGUMENT((op & VARIABLE_FLAG_MASK)
 		|| (GET_FLAG_TYPE(op) >= SLJIT_F_EQUAL && GET_FLAG_TYPE(op) <= SLJIT_ORDERED_LESS_EQUAL));
-	FUNCTION_FCHECK(src1, src1w);
-	FUNCTION_FCHECK(src2, src2w);
+	FUNCTION_FCHECK(src1, src1w, op & SLJIT_32);
+	FUNCTION_FCHECK(src2, src2w, op & SLJIT_32);
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
@@ -1653,15 +1850,14 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
-	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_CONV_SW_FROM_F64 && GET_OPCODE(op) <= SLJIT_CONV_S32_FROM_F64);
 	CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
-	FUNCTION_FCHECK(src, srcw);
+	FUNCTION_FCHECK(src, srcw, op & SLJIT_32);
 	FUNCTION_CHECK_DST(dst, dstw);
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
 		fprintf(compiler->verbose, "  %s%s.from%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE],
-			(GET_OPCODE(op) == SLJIT_CONV_S32_FROM_F64) ? ".s32" : ".sw",
+			fop1_conv_types[GET_OPCODE(op) - SLJIT_CONV_SW_FROM_F64],
 			(op & SLJIT_32) ? ".f32" : ".f64");
 		sljit_verbose_param(compiler, dst, dstw);
 		fprintf(compiler->verbose, ", ");
@@ -1672,7 +1868,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	CHECK_RETURN_OK;
 }
 
-static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_conv_f64_from_w(struct sljit_compiler *compiler, sljit_s32 op,
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 src, sljit_sw srcw)
 {
@@ -1683,16 +1879,15 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
-	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_CONV_F64_FROM_SW && GET_OPCODE(op) <= SLJIT_CONV_F64_FROM_S32);
 	CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
 	FUNCTION_CHECK_SRC(src, srcw);
-	FUNCTION_FCHECK(dst, dstw);
+	FUNCTION_FCHECK(dst, dstw, op & SLJIT_32);
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
-		fprintf(compiler->verbose, "  %s%s.from%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE],
+		fprintf(compiler->verbose, "  %s%s.from.%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE],
 			(op & SLJIT_32) ? ".f32" : ".f64",
-			(GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) ? ".s32" : ".sw");
+			fop1_conv_types[GET_OPCODE(op) - SLJIT_CONV_SW_FROM_F64]);
 		sljit_verbose_fparam(compiler, dst, dstw);
 		fprintf(compiler->verbose, ", ");
 		sljit_verbose_param(compiler, src, srcw);
@@ -1707,13 +1902,18 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	sljit_s32 src1, sljit_sw src1w,
 	sljit_s32 src2, sljit_sw src2w)
 {
+	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
+		compiler->skip_checks = 0;
+		CHECK_RETURN_OK;
+	}
+
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
 	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_ADD_F64 && GET_OPCODE(op) <= SLJIT_DIV_F64);
 	CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
-	FUNCTION_FCHECK(src1, src1w);
-	FUNCTION_FCHECK(src2, src2w);
-	FUNCTION_FCHECK(dst, dstw);
+	FUNCTION_FCHECK(src1, src1w, op & SLJIT_32);
+	FUNCTION_FCHECK(src2, src2w, op & SLJIT_32);
+	FUNCTION_FCHECK(dst, dstw, op & SLJIT_32);
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
@@ -1729,6 +1929,138 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	CHECK_RETURN_OK;
 }
 
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop2r(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst_freg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2, sljit_sw src2w)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
+	CHECK_ARGUMENT(GET_OPCODE(op) == SLJIT_COPYSIGN_F64);
+	FUNCTION_FCHECK(src1, src1w, op & SLJIT_32);
+	FUNCTION_FCHECK(src2, src2w, op & SLJIT_32);
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(dst_freg, op & SLJIT_32));
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+		fprintf(compiler->verbose, "  %s%s ", fop2r_names[GET_OPCODE(op) - SLJIT_FOP2R_BASE], (op & SLJIT_32) ? ".f32" : ".f64");
+		sljit_verbose_freg(compiler, dst_freg);
+		fprintf(compiler->verbose, ", ");
+		sljit_verbose_fparam(compiler, src1, src1w);
+		fprintf(compiler->verbose, ", ");
+		sljit_verbose_fparam(compiler, src2, src2w);
+		fprintf(compiler->verbose, "\n");
+	}
+#endif
+	CHECK_RETURN_OK;
+}
+
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fset32(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f32 value)
+{
+	SLJIT_UNUSED_ARG(value);
+
+	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
+		compiler->skip_checks = 0;
+		CHECK_RETURN_OK;
+	}
+
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 1));
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+		fprintf(compiler->verbose, "  fset32 ");
+		sljit_verbose_freg(compiler, freg);
+		fprintf(compiler->verbose, ", %f\n", value);
+	}
+#endif
+	CHECK_RETURN_OK;
+}
+
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fset64(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f64 value)
+{
+	SLJIT_UNUSED_ARG(value);
+
+	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
+		compiler->skip_checks = 0;
+		CHECK_RETURN_OK;
+	}
+
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+		fprintf(compiler->verbose, "  fset64 ");
+		sljit_verbose_freg(compiler, freg);
+		fprintf(compiler->verbose, ", %f\n", value);
+	}
+#endif
+	CHECK_RETURN_OK;
+}
+
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 freg, sljit_s32 reg)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
+	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_COPY_TO_F64 && GET_OPCODE(op) <= SLJIT_COPY_FROM_F64);
+	CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, op & SLJIT_32));
+
+#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg));
+#else /* !SLJIT_64BIT_ARCHITECTURE */
+	switch (op) {
+	case SLJIT_COPY32_TO_F32:
+	case SLJIT_COPY32_FROM_F32:
+		CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg));
+		break;
+	case SLJIT_COPY_TO_F64:
+	case SLJIT_COPY_FROM_F64:
+		if (reg & REG_PAIR_MASK) {
+			CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(REG_PAIR_FIRST(reg)));
+			CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(REG_PAIR_SECOND(reg)));
+
+			if (op == SLJIT_COPY_TO_F64)
+				break;
+
+			CHECK_ARGUMENT(REG_PAIR_FIRST(reg) != REG_PAIR_SECOND(reg));
+			break;
+		}
+
+		CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg));
+		break;
+	}
+#endif /* SLJIT_64BIT_ARCHITECTURE */
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+		fprintf(compiler->verbose, "  copy%s_%s_f%s ", (op & SLJIT_32) ? "32" : "",
+			GET_OPCODE(op) == SLJIT_COPY_TO_F64 ? "to" : "from", (op & SLJIT_32) ? "32" : "64");
+
+		sljit_verbose_freg(compiler, freg);
+
+		if (reg & REG_PAIR_MASK) {
+			fprintf(compiler->verbose, ", {");
+			sljit_verbose_reg(compiler, REG_PAIR_FIRST(reg));
+			fprintf(compiler->verbose, ", ");
+			sljit_verbose_reg(compiler, REG_PAIR_SECOND(reg));
+			fprintf(compiler->verbose, "}\n");
+		} else {
+			fprintf(compiler->verbose, ", ");
+			sljit_verbose_reg(compiler, reg);
+			fprintf(compiler->verbose, "\n");
+		}
+	}
+#endif
+	CHECK_RETURN_OK;
+}
+
 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_label(struct sljit_compiler *compiler)
 {
 	SLJIT_UNUSED_ARG(compiler);
@@ -1753,7 +2085,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
 	|| (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
 #define CHECK_UNORDERED(type, last_flags) \
-	((((type) & 0xff) == SLJIT_UNORDERED || ((type) & 0xff) == SLJIT_ORDERED) && \
+	((((type) & 0xfe) == SLJIT_ORDERED) && \
 		((last_flags) & 0xff) >= SLJIT_UNORDERED && ((last_flags) & 0xff) <= SLJIT_ORDERED_LESS_EQUAL)
 #else
 #define CHECK_UNORDERED(type, last_flags) 0
@@ -1775,11 +2107,10 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 		if ((type & 0xff) <= SLJIT_NOT_ZERO)
 			CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z);
 		else if ((compiler->last_flags & 0xff) == SLJIT_CARRY) {
-			CHECK_ARGUMENT((type & 0xff) == SLJIT_CARRY || (type & 0xff) == SLJIT_NOT_CARRY);
+			CHECK_ARGUMENT((type & 0xfe) == SLJIT_CARRY);
 			compiler->last_flags = 0;
 		} else
-			CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff)
-				|| ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)
+			CHECK_ARGUMENT((type & 0xfe) == (compiler->last_flags & 0xff)
 				|| CHECK_UNORDERED(type, compiler->last_flags));
 	}
 #endif
@@ -1863,10 +2194,9 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
 	CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_32)));
-	CHECK_ARGUMENT((type & 0xff) >= SLJIT_F_EQUAL && (type & 0xff) <= SLJIT_ORDERED_LESS_EQUAL
-				&& ((type & 0xff) <= SLJIT_ORDERED || sljit_cmp_info(type & 0xff)));
-	FUNCTION_FCHECK(src1, src1w);
-	FUNCTION_FCHECK(src2, src2w);
+	CHECK_ARGUMENT((type & 0xff) >= SLJIT_F_EQUAL && (type & 0xff) <= SLJIT_ORDERED_LESS_EQUAL);
+	FUNCTION_FCHECK(src1, src1w, type & SLJIT_32);
+	FUNCTION_FCHECK(src2, src2w, type & SLJIT_32);
 	compiler->last_flags = 0;
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
@@ -1961,9 +2291,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	if (type <= SLJIT_NOT_ZERO)
 		CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z);
 	else
-		CHECK_ARGUMENT(type == (compiler->last_flags & 0xff)
-			|| (type == SLJIT_NOT_CARRY && (compiler->last_flags & 0xff) == SLJIT_CARRY)
-			|| (type == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)
+		CHECK_ARGUMENT((type & 0xfe) == (compiler->last_flags & 0xff)
 			|| CHECK_UNORDERED(type, compiler->last_flags));
 
 	FUNCTION_CHECK_DST(dst, dstw);
@@ -1975,7 +2303,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
 		fprintf(compiler->verbose, "  flags.%s%s%s ",
 			GET_OPCODE(op) < SLJIT_OP2_BASE ? "mov" : op2_names[GET_OPCODE(op) - SLJIT_OP2_BASE],
-			GET_OPCODE(op) < SLJIT_OP2_BASE ? op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE] : ((op & SLJIT_32) ? "32" : ""),
+			GET_OPCODE(op) < SLJIT_OP2_BASE ? op1_types[GET_OPCODE(op) - SLJIT_OP1_BASE] : ((op & SLJIT_32) ? "32" : ""),
 			!(op & SLJIT_SET_Z) ? "" : ".z");
 		sljit_verbose_param(compiler, dst, dstw);
 		fprintf(compiler->verbose, ", %s\n", jump_names[type]);
@@ -1984,9 +2312,10 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	CHECK_RETURN_OK;
 }
 
-static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 dst_reg,
-	sljit_s32 src, sljit_sw srcw)
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_reg)
 {
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
 	sljit_s32 cond = type & ~SLJIT_32;
@@ -1995,27 +2324,68 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 
 	CHECK_ARGUMENT(compiler->scratches != -1 && compiler->saveds != -1);
 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg));
-	if (src != SLJIT_IMM) {
-		CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src));
-		CHECK_ARGUMENT(srcw == 0);
-	}
+	FUNCTION_CHECK_SRC(src1, src1w);
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src2_reg));
 
 	if (cond <= SLJIT_NOT_ZERO)
 		CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z);
-	else
-		CHECK_ARGUMENT(cond == (compiler->last_flags & 0xff)
-			|| (cond == SLJIT_NOT_CARRY && (compiler->last_flags & 0xff) == SLJIT_CARRY)
-			|| (cond == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)
+	else if ((compiler->last_flags & 0xff) == SLJIT_CARRY) {
+		CHECK_ARGUMENT((type & 0xfe) == SLJIT_CARRY);
+		compiler->last_flags = 0;
+	} else
+		CHECK_ARGUMENT((cond & 0xfe) == (compiler->last_flags & 0xff)
 			|| CHECK_UNORDERED(cond, compiler->last_flags));
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
-		fprintf(compiler->verbose, "  cmov%s %s, ",
+		fprintf(compiler->verbose, "  select%s %s, ",
 			!(type & SLJIT_32) ? "" : "32",
 			jump_names[type & ~SLJIT_32]);
 		sljit_verbose_reg(compiler, dst_reg);
 		fprintf(compiler->verbose, ", ");
-		sljit_verbose_param(compiler, src, srcw);
+		sljit_verbose_param(compiler, src1, src1w);
+		fprintf(compiler->verbose, ", ");
+		sljit_verbose_reg(compiler, src2_reg);
+		fprintf(compiler->verbose, "\n");
+	}
+#endif
+	CHECK_RETURN_OK;
+}
+
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_freg)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	sljit_s32 cond = type & ~SLJIT_32;
+
+	CHECK_ARGUMENT(cond >= SLJIT_EQUAL && cond <= SLJIT_ORDERED_LESS_EQUAL);
+
+	CHECK_ARGUMENT(compiler->fscratches != -1 && compiler->fsaveds != -1);
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(dst_freg, type & SLJIT_32));
+	FUNCTION_FCHECK(src1, src1w, type & SLJIT_32);
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src2_freg, type & SLJIT_32));
+
+	if (cond <= SLJIT_NOT_ZERO)
+		CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z);
+	else if ((compiler->last_flags & 0xff) == SLJIT_CARRY) {
+		CHECK_ARGUMENT((type & 0xfe) == SLJIT_CARRY);
+		compiler->last_flags = 0;
+	} else
+		CHECK_ARGUMENT((cond & 0xfe) == (compiler->last_flags & 0xff)
+			|| CHECK_UNORDERED(cond, compiler->last_flags));
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+		fprintf(compiler->verbose, "  fselect%s %s, ",
+			!(type & SLJIT_32) ? "" : "32",
+			jump_names[type & ~SLJIT_32]);
+		sljit_verbose_freg(compiler, dst_freg);
+		fprintf(compiler->verbose, ", ");
+		sljit_verbose_fparam(compiler, src1, src1w);
+		fprintf(compiler->verbose, ", ");
+		sljit_verbose_freg(compiler, src2_freg);
 		fprintf(compiler->verbose, "\n");
 	}
 #endif
@@ -2026,33 +2396,35 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	sljit_s32 reg,
 	sljit_s32 mem, sljit_sw memw)
 {
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	sljit_s32 allowed_flags;
+#endif /* SLJIT_ARGUMENT_CHECKS */
+
 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
 		compiler->skip_checks = 0;
 		CHECK_RETURN_OK;
 	}
 
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
-	sljit_s32 allowed_flags;
-
 	if (type & SLJIT_MEM_UNALIGNED) {
-		CHECK_ARGUMENT(!(type & (SLJIT_MEM_UNALIGNED_16 | SLJIT_MEM_UNALIGNED_32)));
-	} else if (type & SLJIT_MEM_UNALIGNED_16) {
-		CHECK_ARGUMENT(!(type & SLJIT_MEM_UNALIGNED_32));
+		CHECK_ARGUMENT(!(type & (SLJIT_MEM_ALIGNED_16 | SLJIT_MEM_ALIGNED_32)));
+	} else if (type & SLJIT_MEM_ALIGNED_16) {
+		CHECK_ARGUMENT(!(type & SLJIT_MEM_ALIGNED_32));
 	} else {
-		CHECK_ARGUMENT((reg & REG_PAIR_MASK) || (type & SLJIT_MEM_UNALIGNED_32));
+		CHECK_ARGUMENT((reg & REG_PAIR_MASK) || (type & SLJIT_MEM_ALIGNED_32));
 	}
 
 	allowed_flags = SLJIT_MEM_UNALIGNED;
 
 	switch (type & 0xff) {
+	case SLJIT_MOV_P:
+	case SLJIT_MOV:
+		allowed_flags |= SLJIT_MEM_ALIGNED_32;
+		/* fallthrough */
 	case SLJIT_MOV_U32:
 	case SLJIT_MOV_S32:
 	case SLJIT_MOV32:
-		allowed_flags = SLJIT_MEM_UNALIGNED | SLJIT_MEM_UNALIGNED_16;
-		break;
-	case SLJIT_MOV:
-	case SLJIT_MOV_P:
-		allowed_flags = SLJIT_MEM_UNALIGNED | SLJIT_MEM_UNALIGNED_16 | SLJIT_MEM_UNALIGNED_32;
+		allowed_flags |= SLJIT_MEM_ALIGNED_16;
 		break;
 	}
 
@@ -2079,15 +2451,14 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 		else
 			fprintf(compiler->verbose, "  %s%s%s",
 				(type & SLJIT_MEM_STORE) ? "store" : "load",
-				!(type & SLJIT_32) ? "" : "32",
-				op1_names[(type & 0xff) - SLJIT_OP1_BASE]);
+				!(type & SLJIT_32) ? "" : "32", op1_types[(type & 0xff) - SLJIT_OP1_BASE]);
 
 		if (type & SLJIT_MEM_UNALIGNED)
-			printf(".un");
-		else if (type & SLJIT_MEM_UNALIGNED_16)
-			printf(".un16");
-		else if (type & SLJIT_MEM_UNALIGNED_32)
-			printf(".un32");
+			printf(".unal");
+		else if (type & SLJIT_MEM_ALIGNED_16)
+			printf(".al16");
+		else if (type & SLJIT_MEM_ALIGNED_32)
+			printf(".al32");
 
 		if (reg & REG_PAIR_MASK) {
 			fprintf(compiler->verbose, " {");
@@ -2140,7 +2511,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 			fprintf(compiler->verbose, "  %s%s%s.%s ",
 				(type & SLJIT_MEM_STORE) ? "store" : "load",
 				!(type & SLJIT_32) ? "" : "32",
-				op1_names[(type & 0xff) - SLJIT_OP1_BASE],
+				op1_types[(type & 0xff) - SLJIT_OP1_BASE],
 				(type & SLJIT_MEM_POST) ? "post" : "pre");
 
 		sljit_verbose_reg(compiler, reg);
@@ -2157,19 +2528,20 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	sljit_s32 mem, sljit_sw memw)
 {
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
 	CHECK_ARGUMENT((type & 0xff) == SLJIT_MOV_F64);
 
 	if (type & SLJIT_MEM_UNALIGNED) {
-		CHECK_ARGUMENT(!(type & (SLJIT_MEM_UNALIGNED_16 | SLJIT_MEM_UNALIGNED_32)));
-	} else if (type & SLJIT_MEM_UNALIGNED_16) {
-		CHECK_ARGUMENT(!(type & SLJIT_MEM_UNALIGNED_32));
+		CHECK_ARGUMENT(!(type & (SLJIT_MEM_ALIGNED_16 | SLJIT_MEM_ALIGNED_32)));
+	} else if (type & SLJIT_MEM_ALIGNED_16) {
+		CHECK_ARGUMENT(!(type & SLJIT_MEM_ALIGNED_32));
 	} else {
-		CHECK_ARGUMENT(type & SLJIT_MEM_UNALIGNED_32);
+		CHECK_ARGUMENT(type & SLJIT_MEM_ALIGNED_32);
 		CHECK_ARGUMENT(!(type & SLJIT_32));
 	}
 
-	CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_32 | SLJIT_MEM_STORE | SLJIT_MEM_UNALIGNED | SLJIT_MEM_UNALIGNED_16 | SLJIT_MEM_UNALIGNED_32)));
-	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg));
+	CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_32 | SLJIT_MEM_STORE | SLJIT_MEM_UNALIGNED | SLJIT_MEM_ALIGNED_16 | SLJIT_MEM_ALIGNED_32)));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, type & SLJIT_32));
 	FUNCTION_CHECK_SRC_MEM(mem, memw);
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
@@ -2179,11 +2551,11 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 			!(type & SLJIT_32) ? "f64" : "f32");
 
 		if (type & SLJIT_MEM_UNALIGNED)
-			printf(".un");
-		else if (type & SLJIT_MEM_UNALIGNED_16)
-			printf(".un16");
-		else if (type & SLJIT_MEM_UNALIGNED_32)
-			printf(".un32");
+			printf(".unal");
+		else if (type & SLJIT_MEM_ALIGNED_16)
+			printf(".al16");
+		else if (type & SLJIT_MEM_ALIGNED_32)
+			printf(".al32");
 
 		fprintf(compiler->verbose, " ");
 		sljit_verbose_freg(compiler, freg);
@@ -2200,10 +2572,11 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	sljit_s32 mem, sljit_sw memw)
 {
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
 	CHECK_ARGUMENT((type & 0xff) == SLJIT_MOV_F64);
 	CHECK_ARGUMENT((type & ~(0xff | SLJIT_32 | SLJIT_MEM_STORE | SLJIT_MEM_SUPP | SLJIT_MEM_POST)) == 0);
 	FUNCTION_CHECK_SRC_MEM(mem, memw);
-	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, type & SLJIT_32));
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
@@ -2226,7 +2599,297 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 	}
 #endif
 	CHECK_RETURN_OK;
+}
+
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 srcdst, sljit_sw srcdstw)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD));
+	CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK2(SLJIT_SIMD_STORE)) == 0);
+	CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type));
+	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) <= SLJIT_SIMD_GET_REG_SIZE(type));
+	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM2_SIZE(type) <= (srcdst & SLJIT_MEM) ? SLJIT_SIMD_GET_REG_SIZE(type) : 0);
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
+	FUNCTION_FCHECK(srcdst, srcdstw, 0);
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+		if (type & SLJIT_SIMD_TEST)
+			CHECK_RETURN_OK;
+		if (sljit_emit_simd_mov(compiler, type | SLJIT_SIMD_TEST, freg, srcdst, srcdstw) == SLJIT_ERR_UNSUPPORTED) {
+			fprintf(compiler->verbose, "    # simd_mem: unsupported form, no instructions are emitted\n");
+			CHECK_RETURN_OK;
+		}
+
+		fprintf(compiler->verbose, "  simd_%s.%d.%s%d",
+			(type & SLJIT_SIMD_STORE) ? "store" : "load",
+			(8 << SLJIT_SIMD_GET_REG_SIZE(type)),
+			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
+			(8 << SLJIT_SIMD_GET_ELEM_SIZE(type)));
+
+		if ((type & 0x3f000000) == SLJIT_SIMD_MEM_UNALIGNED)
+			fprintf(compiler->verbose, ".unal ");
+		else
+			fprintf(compiler->verbose, ".al%d ", (8 << SLJIT_SIMD_GET_ELEM2_SIZE(type)));
+
+		sljit_verbose_freg(compiler, freg);
+		fprintf(compiler->verbose, ", ");
+		sljit_verbose_fparam(compiler, srcdst, srcdstw);
+		fprintf(compiler->verbose, "\n");
+	}
+#endif
+	CHECK_RETURN_OK;
+}
+
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_sw srcw)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD));
+	CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK(0)) == 0);
+	CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type));
+	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) < SLJIT_SIMD_GET_REG_SIZE(type));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		if (src == SLJIT_IMM) {
+			CHECK_ARGUMENT(srcw == 0);
+		} else {
+			FUNCTION_FCHECK(src, srcw, SLJIT_SIMD_GET_ELEM_SIZE(type) == 2);
+		}
+	} else if (src != SLJIT_IMM) {
+		FUNCTION_CHECK_DST(src, srcw);
+	}
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+		if (type & SLJIT_SIMD_TEST)
+			CHECK_RETURN_OK;
+		if (sljit_emit_simd_replicate(compiler, type | SLJIT_SIMD_TEST, freg, src, srcw) == SLJIT_ERR_UNSUPPORTED) {
+			fprintf(compiler->verbose, "    # simd_dup: unsupported form, no instructions are emitted\n");
+			CHECK_RETURN_OK;
+		}
+
+		fprintf(compiler->verbose, "  simd_replicate.%d.%s%d ",
+			(8 << SLJIT_SIMD_GET_REG_SIZE(type)),
+			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
+			(8 << SLJIT_SIMD_GET_ELEM_SIZE(type)));
+
+		sljit_verbose_freg(compiler, freg);
+		fprintf(compiler->verbose, ", ");
+		if (type & SLJIT_SIMD_FLOAT)
+			sljit_verbose_fparam(compiler, src, srcw);
+		else
+			sljit_verbose_param(compiler, src, srcw);
+		fprintf(compiler->verbose, "\n");
+	}
+#endif
+	CHECK_RETURN_OK;
+}
+
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg, sljit_s32 lane_index,
+	sljit_s32 srcdst, sljit_sw srcdstw)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD));
+	CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK(SLJIT_SIMD_STORE | SLJIT_SIMD_LANE_ZERO | SLJIT_SIMD_LANE_SIGNED | SLJIT_32)) == 0);
+	CHECK_ARGUMENT((type & (SLJIT_SIMD_STORE | SLJIT_SIMD_LANE_ZERO)) != (SLJIT_SIMD_STORE | SLJIT_SIMD_LANE_ZERO));
+	CHECK_ARGUMENT((type & (SLJIT_SIMD_STORE | SLJIT_SIMD_LANE_SIGNED)) != SLJIT_SIMD_LANE_SIGNED);
+	CHECK_ARGUMENT(!(type & SLJIT_SIMD_FLOAT) || !(type & (SLJIT_SIMD_LANE_SIGNED | SLJIT_32)));
+	CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type));
+	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) < SLJIT_SIMD_GET_REG_SIZE(type));
+	CHECK_ARGUMENT(!(type & SLJIT_32) || SLJIT_SIMD_GET_ELEM_SIZE(type) <= 2);
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
+	CHECK_ARGUMENT(lane_index >= 0 && lane_index < (1 << (SLJIT_SIMD_GET_REG_SIZE(type) - SLJIT_SIMD_GET_ELEM_SIZE(type))));
 
+	if (type & SLJIT_SIMD_FLOAT) {
+		FUNCTION_FCHECK(srcdst, srcdstw, SLJIT_SIMD_GET_ELEM_SIZE(type) == 2);
+	} else if ((type & SLJIT_SIMD_STORE) || srcdst != SLJIT_IMM) {
+		FUNCTION_CHECK_DST(srcdst, srcdstw);
+	}
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+		if (type & SLJIT_SIMD_TEST)
+			CHECK_RETURN_OK;
+		if (sljit_emit_simd_lane_mov(compiler, type | SLJIT_SIMD_TEST, freg, lane_index, srcdst, srcdstw) == SLJIT_ERR_UNSUPPORTED) {
+			fprintf(compiler->verbose, "    # simd_move_lane: unsupported form, no instructions are emitted\n");
+			CHECK_RETURN_OK;
+		}
+
+		fprintf(compiler->verbose, "  simd_%s_lane%s%s%s.%d.%s%d ",
+			(type & SLJIT_SIMD_STORE) ? "store" : "load",
+			(type & SLJIT_32) ? "32" : "",
+			(type & SLJIT_SIMD_LANE_ZERO) ? "_z" : "",
+			(type & SLJIT_SIMD_LANE_SIGNED) ? "_s" : "",
+			(8 << SLJIT_SIMD_GET_REG_SIZE(type)),
+			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
+			(8 << SLJIT_SIMD_GET_ELEM_SIZE(type)));
+
+		sljit_verbose_freg(compiler, freg);
+		fprintf(compiler->verbose, "[%d], ", lane_index);
+		if (type & SLJIT_SIMD_FLOAT)
+			sljit_verbose_fparam(compiler, srcdst, srcdstw);
+		else
+			sljit_verbose_param(compiler, srcdst, srcdstw);
+		fprintf(compiler->verbose, "\n");
+	}
+#endif
+	CHECK_RETURN_OK;
+}
+
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_s32 src_lane_index)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD));
+	CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK(0)) == 0);
+	CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type));
+	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) < SLJIT_SIMD_GET_REG_SIZE(type));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src, 0));
+	CHECK_ARGUMENT(src_lane_index >= 0 && src_lane_index < (1 << (SLJIT_SIMD_GET_REG_SIZE(type) - SLJIT_SIMD_GET_ELEM_SIZE(type))));
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+		if (type & SLJIT_SIMD_TEST)
+			CHECK_RETURN_OK;
+		if (sljit_emit_simd_lane_replicate(compiler, type | SLJIT_SIMD_TEST, freg, src, src_lane_index) == SLJIT_ERR_UNSUPPORTED) {
+			fprintf(compiler->verbose, "    # simd_lane_replicate: unsupported form, no instructions are emitted\n");
+			CHECK_RETURN_OK;
+		}
+
+		fprintf(compiler->verbose, "  simd_lane_replicate.%d.%s%d ",
+			(8 << SLJIT_SIMD_GET_REG_SIZE(type)),
+			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
+			(8 << SLJIT_SIMD_GET_ELEM_SIZE(type)));
+
+		sljit_verbose_freg(compiler, freg);
+		fprintf(compiler->verbose, ", ");
+		sljit_verbose_freg(compiler, src);
+		fprintf(compiler->verbose, "[%d]\n", src_lane_index);
+	}
+#endif
+	CHECK_RETURN_OK;
+}
+
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_sw srcw)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD));
+	CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK2(SLJIT_SIMD_EXTEND_SIGNED)) == 0);
+	CHECK_ARGUMENT((type & (SLJIT_SIMD_EXTEND_SIGNED | SLJIT_SIMD_FLOAT)) != (SLJIT_SIMD_EXTEND_SIGNED | SLJIT_SIMD_FLOAT));
+	CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type));
+	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM2_SIZE(type) < SLJIT_SIMD_GET_REG_SIZE(type));
+	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) < SLJIT_SIMD_GET_ELEM2_SIZE(type));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
+	FUNCTION_FCHECK(src, srcw, SLJIT_SIMD_GET_ELEM_SIZE(type) == 2);
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+		if (type & SLJIT_SIMD_TEST)
+			CHECK_RETURN_OK;
+		if (sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_TEST, freg, src, srcw) == SLJIT_ERR_UNSUPPORTED) {
+			fprintf(compiler->verbose, "    # simd_extend: unsupported form, no instructions are emitted\n");
+			CHECK_RETURN_OK;
+		}
+
+		fprintf(compiler->verbose, "  simd_load_extend%s.%d.%s%d.%s%d ",
+			(type & SLJIT_SIMD_EXTEND_SIGNED) ? "_s" : "",
+			(8 << SLJIT_SIMD_GET_REG_SIZE(type)),
+			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
+			(8 << SLJIT_SIMD_GET_ELEM2_SIZE(type)),
+			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
+			(8 << SLJIT_SIMD_GET_ELEM_SIZE(type)));
+
+		sljit_verbose_freg(compiler, freg);
+		fprintf(compiler->verbose, ", ");
+		sljit_verbose_fparam(compiler, src, srcw);
+		fprintf(compiler->verbose, "\n");
+	}
+#endif
+	CHECK_RETURN_OK;
+}
+
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 dst, sljit_sw dstw)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD));
+	CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK(SLJIT_32)) == SLJIT_SIMD_STORE);
+	CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type));
+	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) < SLJIT_SIMD_GET_REG_SIZE(type));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
+	FUNCTION_CHECK_DST(dst, dstw);
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+		if (type & SLJIT_SIMD_TEST)
+			CHECK_RETURN_OK;
+		if (sljit_emit_simd_sign(compiler, type | SLJIT_SIMD_TEST, freg, dst, dstw) == SLJIT_ERR_UNSUPPORTED) {
+			fprintf(compiler->verbose, "    # simd_sign: unsupported form, no instructions are emitted\n");
+			CHECK_RETURN_OK;
+		}
+
+		fprintf(compiler->verbose, "  simd_store_sign%s.%d.%s%d ",
+			(type & SLJIT_32) ? "32" : "",
+			(8 << SLJIT_SIMD_GET_REG_SIZE(type)),
+			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
+			(8 << SLJIT_SIMD_GET_ELEM_SIZE(type)));
+
+		sljit_verbose_freg(compiler, freg);
+		fprintf(compiler->verbose, ", ");
+		sljit_verbose_param(compiler, dst, dstw);
+		fprintf(compiler->verbose, "\n");
+	}
+#endif
+	CHECK_RETURN_OK;
+}
+
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD));
+	CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK(0)) >= SLJIT_SIMD_OP2_AND && (type & SLJIT_SIMD_TYPE_MASK(0)) <= SLJIT_SIMD_OP2_XOR);
+	CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type));
+	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) <= SLJIT_SIMD_GET_REG_SIZE(type));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(dst_freg, 0));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src1_freg, 0));
+	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src2_freg, 0));
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+		if (type & SLJIT_SIMD_TEST)
+			CHECK_RETURN_OK;
+		if (sljit_emit_simd_op2(compiler, type | SLJIT_SIMD_TEST, dst_freg, src1_freg, src2_freg) == SLJIT_ERR_UNSUPPORTED) {
+			fprintf(compiler->verbose, "    # simd_op2: unsupported form, no instructions are emitted\n");
+			CHECK_RETURN_OK;
+		}
+
+		fprintf(compiler->verbose, "  simd_%s.%d.%s%d ",
+			simd_op2_names[SLJIT_SIMD_GET_OPCODE(type) - 1],
+			(8 << SLJIT_SIMD_GET_REG_SIZE(type)),
+			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
+			(8 << SLJIT_SIMD_GET_ELEM_SIZE(type)));
+
+		sljit_verbose_freg(compiler, dst_freg);
+		fprintf(compiler->verbose, ", ");
+		sljit_verbose_freg(compiler, src1_freg);
+		fprintf(compiler->verbose, ", ");
+		sljit_verbose_freg(compiler, src2_freg);
+		fprintf(compiler->verbose, "\n");
+	}
+#endif
+	CHECK_RETURN_OK;
 }
 
 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)
@@ -2286,7 +2949,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 #endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_VERBOSE */
 
 #define SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw) \
-	SLJIT_COMPILE_ASSERT(!(SLJIT_CONV_SW_FROM_F64 & 0x1) && !(SLJIT_CONV_F64_FROM_SW & 0x1), \
+	SLJIT_COMPILE_ASSERT(!(SLJIT_CONV_SW_FROM_F64 & 0x1) && !(SLJIT_CONV_F64_FROM_SW & 0x1) && !(SLJIT_CONV_F64_FROM_UW & 0x1), \
 		invalid_float_opcodes); \
 	if (GET_OPCODE(op) >= SLJIT_CONV_SW_FROM_F64 && GET_OPCODE(op) <= SLJIT_CMP_F64) { \
 		if (GET_OPCODE(op) == SLJIT_CMP_F64) { \
@@ -2301,48 +2964,22 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 			ADJUST_LOCAL_OFFSET(src, srcw); \
 			return sljit_emit_fop1_conv_sw_from_f64(compiler, op, dst, dstw, src, srcw); \
 		} \
-		CHECK(check_sljit_emit_fop1_conv_f64_from_sw(compiler, op, dst, dstw, src, srcw)); \
+		if ((GET_OPCODE(op) | 0x1) == SLJIT_CONV_F64_FROM_S32) { \
+			CHECK(check_sljit_emit_fop1_conv_f64_from_w(compiler, op, dst, dstw, src, srcw)); \
+			ADJUST_LOCAL_OFFSET(dst, dstw); \
+			ADJUST_LOCAL_OFFSET(src, srcw); \
+			return sljit_emit_fop1_conv_f64_from_sw(compiler, op, dst, dstw, src, srcw); \
+		} \
+		CHECK(check_sljit_emit_fop1_conv_f64_from_w(compiler, op, dst, dstw, src, srcw)); \
 		ADJUST_LOCAL_OFFSET(dst, dstw); \
 		ADJUST_LOCAL_OFFSET(src, srcw); \
-		return sljit_emit_fop1_conv_f64_from_sw(compiler, op, dst, dstw, src, srcw); \
+		return sljit_emit_fop1_conv_f64_from_uw(compiler, op, dst, dstw, src, srcw); \
 	} \
 	CHECK(check_sljit_emit_fop1(compiler, op, dst, dstw, src, srcw)); \
 	ADJUST_LOCAL_OFFSET(dst, dstw); \
 	ADJUST_LOCAL_OFFSET(src, srcw);
 
-#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
-		|| (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \
-		|| ((defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) && !(defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6)) \
-		|| (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \
-		|| (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
-
-static SLJIT_INLINE sljit_s32 sljit_emit_cmov_generic(struct sljit_compiler *compiler, sljit_s32 type,
-	sljit_s32 dst_reg,
-	sljit_s32 src, sljit_sw srcw)
-{
-	struct sljit_label *label;
-	struct sljit_jump *jump;
-	sljit_s32 op = (type & SLJIT_32) ? SLJIT_MOV32 : SLJIT_MOV;
-
-	SLJIT_SKIP_CHECKS(compiler);
-	jump = sljit_emit_jump(compiler, (type & ~SLJIT_32) ^ 0x1);
-	FAIL_IF(!jump);
-
-	SLJIT_SKIP_CHECKS(compiler);
-	FAIL_IF(sljit_emit_op1(compiler, op, dst_reg, 0, src, srcw));
-
-	SLJIT_SKIP_CHECKS(compiler);
-	label = sljit_emit_label(compiler);
-	FAIL_IF(!label);
-
-	sljit_set_label(jump, label);
-	return SLJIT_SUCCESS;
-}
-
-#endif
-
-#if (!(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) || (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)) \
-	&& !(defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (!(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) || (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6))
 
 static sljit_s32 sljit_emit_mem_unaligned(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 reg,
@@ -2355,7 +2992,7 @@ static sljit_s32 sljit_emit_mem_unaligne
 	return sljit_emit_op1(compiler, type & (0xff | SLJIT_32), reg, 0, mem, memw);
 }
 
-#endif /* (!SLJIT_CONFIG_MIPS || SLJIT_MIPS_REV >= 6) && !SLJIT_CONFIG_ARM_V5 */
+#endif /* (!SLJIT_CONFIG_MIPS || SLJIT_MIPS_REV >= 6) */
 
 #if (!(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) || (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)) \
 	&& !(defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32)
@@ -2401,7 +3038,7 @@ static sljit_s32 sljit_emit_fmem_unalign
 
 #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
 #	include "sljitNativeX86_common.c"
-#elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#elif (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 #	include "sljitNativeARM_32.c"
 #elif (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
 #	include "sljitNativeARM_32.c"
@@ -2417,6 +3054,8 @@ static sljit_s32 sljit_emit_fmem_unalign
 #	include "sljitNativeRISCV_common.c"
 #elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
 #	include "sljitNativeS390X.c"
+#elif (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
+#	include "sljitNativeLOONGARCH_64.c"
 #endif
 
 static SLJIT_INLINE sljit_s32 emit_mov_before_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
@@ -2463,8 +3102,29 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return sljit_emit_return_void(compiler);
 }
 
+#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
+	&& !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
+	&& !(defined(SLJIT_CONFIG_LOONGARCH_64) && SLJIT_CONFIG_LOONGARCH_64)
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2r(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst_freg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2, sljit_sw src2w)
+{
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fop2r(compiler, op, dst_freg, src1, src1w, src2, src2w));
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+	ADJUST_LOCAL_OFFSET(src2, src2w);
+
+	SLJIT_SKIP_CHECKS(compiler);
+	return sljit_emit_fop2(compiler, op, dst_freg, 0, src1, src1w, src2, src2w);
+}
+
+#endif /* !SLJIT_CONFIG_X86 && !SLJIT_CONFIG_S390X && !SLJIT_CONFIG_LOONGARCH_64 */
+
 #if !(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) \
-	&& !(defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV)
+	&& !(defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \
+	&& !(defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
 
 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 src1, sljit_sw src1w,
@@ -2480,18 +3140,18 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 	condition = type & 0xff;
 #if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
 	if ((condition == SLJIT_EQUAL || condition == SLJIT_NOT_EQUAL)) {
-		if ((src1 & SLJIT_IMM) && !src1w) {
+		if (src1 == SLJIT_IMM && !src1w) {
 			src1 = src2;
 			src1w = src2w;
 			src2 = SLJIT_IMM;
 			src2w = 0;
 		}
-		if ((src2 & SLJIT_IMM) && !src2w)
+		if (src2 == SLJIT_IMM && !src2w)
 			return emit_cmp_to0(compiler, type, src1, src1w);
 	}
 #endif
 
-	if (SLJIT_UNLIKELY((src1 & SLJIT_IMM) && !(src2 & SLJIT_IMM))) {
+	if (SLJIT_UNLIKELY(src1 == SLJIT_IMM && src2 != SLJIT_IMM)) {
 		/* Immediate is preferred as second argument by most architectures. */
 		switch (condition) {
 		case SLJIT_LESS:
@@ -2532,7 +3192,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 	if (condition <= SLJIT_NOT_ZERO)
 		flags = SLJIT_SET_Z;
 	else
-		flags = condition << VARIABLE_FLAG_SHIFT;
+		flags = (condition & 0xfe) << VARIABLE_FLAG_SHIFT;
 
 	SLJIT_SKIP_CHECKS(compiler);
 	PTR_FAIL_IF(sljit_emit_op2u(compiler,
@@ -2544,20 +3204,17 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 
 #endif /* !SLJIT_CONFIG_MIPS */
 
-#if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
+#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32)
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type)
 {
-	if (type < SLJIT_UNORDERED || type > SLJIT_ORDERED_LESS_EQUAL)
-		return 0;
-
 	switch (type) {
 	case SLJIT_UNORDERED_OR_EQUAL:
 	case SLJIT_ORDERED_NOT_EQUAL:
-		return 0;
+		return 1;
 	}
 
-	return 1;
+	return 0;
 }
 
 #endif /* SLJIT_CONFIG_ARM */
@@ -2570,7 +3227,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 	CHECK_PTR(check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w));
 
 	SLJIT_SKIP_CHECKS(compiler);
-	sljit_emit_fop1(compiler, SLJIT_CMP_F64 | ((type & 0xff) << VARIABLE_FLAG_SHIFT) | (type & SLJIT_32), src1, src1w, src2, src2w);
+	sljit_emit_fop1(compiler, SLJIT_CMP_F64 | ((type & 0xfe) << VARIABLE_FLAG_SHIFT) | (type & SLJIT_32), src1, src1w, src2, src2w);
 
 	SLJIT_SKIP_CHECKS(compiler);
 	return sljit_emit_jump(compiler, type);
@@ -2630,507 +3287,174 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #endif /* !SLJIT_CONFIG_ARM_64 && !SLJIT_CONFIG_PPC */
 
 #if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
-	&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
+	&& !(defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM) \
+	&& !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 srcdst, sljit_sw srcdstw)
 {
 	CHECK_ERROR();
-	CHECK(check_sljit_get_local_base(compiler, dst, dstw, offset));
-
-	ADJUST_LOCAL_OFFSET(SLJIT_MEM1(SLJIT_SP), offset);
-
-	SLJIT_SKIP_CHECKS(compiler);
-
-	if (offset != 0)
-		return sljit_emit_op2(compiler, SLJIT_ADD, dst, dstw, SLJIT_SP, 0, SLJIT_IMM, offset);
-	return sljit_emit_op1(compiler, SLJIT_MOV, dst, dstw, SLJIT_SP, 0);
-}
-
-#endif
-
-#else /* SLJIT_CONFIG_UNSUPPORTED */
-
-/* Empty function bodies for those machines, which are not (yet) supported. */
-
-SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)
-{
-	return "unsupported";
-}
-
-SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void *allocator_data, void *exec_allocator_data)
-{
-	SLJIT_UNUSED_ARG(allocator_data);
-	SLJIT_UNUSED_ARG(exec_allocator_data);
-	SLJIT_UNREACHABLE();
-	return NULL;
-}
-
-SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler)
-{
+	CHECK(check_sljit_emit_simd_mov(compiler, type, freg, srcdst, srcdstw));
 	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNREACHABLE();
-}
-
-SLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compiler *compiler)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNREACHABLE();
-}
-
-SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_s32 size)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(size);
-	SLJIT_UNREACHABLE();
-	return NULL;
-}
-
-#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
-SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(verbose);
-	SLJIT_UNREACHABLE();
-}
-#endif
-
-SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNREACHABLE();
-	return NULL;
-}
-
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
-{
-	SLJIT_UNUSED_ARG(feature_type);
-	SLJIT_UNREACHABLE();
-	return 0;
-}
-
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type)
-{
 	SLJIT_UNUSED_ARG(type);
-	SLJIT_UNREACHABLE();
-	return 0;
-}
-
-SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code, void *exec_allocator_data)
-{
-	SLJIT_UNUSED_ARG(code);
-	SLJIT_UNUSED_ARG(exec_allocator_data);
-	SLJIT_UNREACHABLE();
-}
-
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
-	sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,
-	sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(options);
-	SLJIT_UNUSED_ARG(arg_types);
-	SLJIT_UNUSED_ARG(scratches);
-	SLJIT_UNUSED_ARG(saveds);
-	SLJIT_UNUSED_ARG(fscratches);
-	SLJIT_UNUSED_ARG(fsaveds);
-	SLJIT_UNUSED_ARG(local_size);
-	SLJIT_UNREACHABLE();
-	return SLJIT_ERR_UNSUPPORTED;
-}
-
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,
-	sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,
-	sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(options);
-	SLJIT_UNUSED_ARG(arg_types);
-	SLJIT_UNUSED_ARG(scratches);
-	SLJIT_UNUSED_ARG(saveds);
-	SLJIT_UNUSED_ARG(fscratches);
-	SLJIT_UNUSED_ARG(fsaveds);
-	SLJIT_UNUSED_ARG(local_size);
-	SLJIT_UNREACHABLE();
-	return SLJIT_ERR_UNSUPPORTED;
-}
+	SLJIT_UNUSED_ARG(freg);
+	SLJIT_UNUSED_ARG(srcdst);
+	SLJIT_UNUSED_ARG(srcdstw);
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_void(struct sljit_compiler *compiler)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNREACHABLE();
 	return SLJIT_ERR_UNSUPPORTED;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_sw srcw)
 {
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_replicate(compiler, type, freg, src, srcw));
 	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(op);
+	SLJIT_UNUSED_ARG(type);
+	SLJIT_UNUSED_ARG(freg);
 	SLJIT_UNUSED_ARG(src);
 	SLJIT_UNUSED_ARG(srcw);
-	SLJIT_UNREACHABLE();
-	return SLJIT_ERR_UNSUPPORTED;
-}
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_to(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(src);
-	SLJIT_UNUSED_ARG(srcw);
-	SLJIT_UNREACHABLE();
 	return SLJIT_ERR_UNSUPPORTED;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg, sljit_s32 lane_index,
+	sljit_s32 srcdst, sljit_sw srcdstw)
 {
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_lane_mov(compiler, type, freg, lane_index, srcdst, srcdstw));
 	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(dst);
-	SLJIT_UNUSED_ARG(dstw);
-	SLJIT_UNREACHABLE();
-	return SLJIT_ERR_UNSUPPORTED;
-}
+	SLJIT_UNUSED_ARG(type);
+	SLJIT_UNUSED_ARG(freg);
+	SLJIT_UNUSED_ARG(lane_index);
+	SLJIT_UNUSED_ARG(srcdst);
+	SLJIT_UNUSED_ARG(srcdstw);
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(op);
-	SLJIT_UNREACHABLE();
 	return SLJIT_ERR_UNSUPPORTED;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 dst, sljit_sw dstw,
-	sljit_s32 src, sljit_sw srcw)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_s32 src_lane_index)
 {
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_lane_replicate(compiler, type, freg, src, src_lane_index));
 	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(op);
-	SLJIT_UNUSED_ARG(dst);
-	SLJIT_UNUSED_ARG(dstw);
+	SLJIT_UNUSED_ARG(type);
+	SLJIT_UNUSED_ARG(freg);
 	SLJIT_UNUSED_ARG(src);
-	SLJIT_UNUSED_ARG(srcw);
-	SLJIT_UNREACHABLE();
-	return SLJIT_ERR_UNSUPPORTED;
-}
-
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 dst, sljit_sw dstw,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(op);
-	SLJIT_UNUSED_ARG(dst);
-	SLJIT_UNUSED_ARG(dstw);
-	SLJIT_UNUSED_ARG(src1);
-	SLJIT_UNUSED_ARG(src1w);
-	SLJIT_UNUSED_ARG(src2);
-	SLJIT_UNUSED_ARG(src2w);
-	SLJIT_UNREACHABLE();
-	return SLJIT_ERR_UNSUPPORTED;
-}
+	SLJIT_UNUSED_ARG(src_lane_index);
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2u(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(op);
-	SLJIT_UNUSED_ARG(src1);
-	SLJIT_UNUSED_ARG(src1w);
-	SLJIT_UNUSED_ARG(src2);
-	SLJIT_UNUSED_ARG(src2w);
-	SLJIT_UNREACHABLE();
 	return SLJIT_ERR_UNSUPPORTED;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 src_dst,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(op);
-	SLJIT_UNUSED_ARG(src_dst);
-	SLJIT_UNUSED_ARG(src1);
-	SLJIT_UNUSED_ARG(src1w);
-	SLJIT_UNUSED_ARG(src2);
-	SLJIT_UNUSED_ARG(src2w);
-	SLJIT_UNREACHABLE();
-	return SLJIT_ERR_UNSUPPORTED;
-}
-
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
 	sljit_s32 src, sljit_sw srcw)
 {
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_extend(compiler, type, freg, src, srcw));
 	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(op);
+	SLJIT_UNUSED_ARG(type);
+	SLJIT_UNUSED_ARG(freg);
 	SLJIT_UNUSED_ARG(src);
 	SLJIT_UNUSED_ARG(srcw);
-	SLJIT_UNREACHABLE();
-	return SLJIT_ERR_UNSUPPORTED;
-}
-
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
-{
-	SLJIT_UNREACHABLE();
-	return reg;
-}
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
-	void *instruction, sljit_u32 size)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(instruction);
-	SLJIT_UNUSED_ARG(size);
-	SLJIT_UNREACHABLE();
 	return SLJIT_ERR_UNSUPPORTED;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(current_flags);
-}
-
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 dst, sljit_sw dstw,
-	sljit_s32 src, sljit_sw srcw)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 dst, sljit_sw dstw)
 {
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_sign(compiler, type, freg, dst, dstw));
 	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(op);
+	SLJIT_UNUSED_ARG(type);
+	SLJIT_UNUSED_ARG(freg);
 	SLJIT_UNUSED_ARG(dst);
 	SLJIT_UNUSED_ARG(dstw);
-	SLJIT_UNUSED_ARG(src);
-	SLJIT_UNUSED_ARG(srcw);
-	SLJIT_UNREACHABLE();
-	return SLJIT_ERR_UNSUPPORTED;
-}
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 dst, sljit_sw dstw,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(op);
-	SLJIT_UNUSED_ARG(dst);
-	SLJIT_UNUSED_ARG(dstw);
-	SLJIT_UNUSED_ARG(src1);
-	SLJIT_UNUSED_ARG(src1w);
-	SLJIT_UNUSED_ARG(src2);
-	SLJIT_UNUSED_ARG(src2w);
-	SLJIT_UNREACHABLE();
 	return SLJIT_ERR_UNSUPPORTED;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNREACHABLE();
-	return NULL;
-}
-
-SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(type);
-	SLJIT_UNREACHABLE();
-	return NULL;
-}
-
-SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,
-	sljit_s32 arg_types)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(type);
-	SLJIT_UNUSED_ARG(arg_types);
-	SLJIT_UNREACHABLE();
-	return NULL;
-}
-
-SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(type);
-	SLJIT_UNUSED_ARG(src1);
-	SLJIT_UNUSED_ARG(src1w);
-	SLJIT_UNUSED_ARG(src2);
-	SLJIT_UNUSED_ARG(src2w);
-	SLJIT_UNREACHABLE();
-	return NULL;
-}
-
-SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg)
 {
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_op2(compiler, type, dst_freg, src1_freg, src2_freg));
 	SLJIT_UNUSED_ARG(compiler);
 	SLJIT_UNUSED_ARG(type);
-	SLJIT_UNUSED_ARG(src1);
-	SLJIT_UNUSED_ARG(src1w);
-	SLJIT_UNUSED_ARG(src2);
-	SLJIT_UNUSED_ARG(src2w);
-	SLJIT_UNREACHABLE();
-	return NULL;
-}
+	SLJIT_UNUSED_ARG(dst_freg);
+	SLJIT_UNUSED_ARG(src1_freg);
+	SLJIT_UNUSED_ARG(src2_freg);
 
-SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label)
-{
-	SLJIT_UNUSED_ARG(jump);
-	SLJIT_UNUSED_ARG(label);
-	SLJIT_UNREACHABLE();
-}
-
-SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target)
-{
-	SLJIT_UNUSED_ARG(jump);
-	SLJIT_UNUSED_ARG(target);
-	SLJIT_UNREACHABLE();
-}
-
-SLJIT_API_FUNC_ATTRIBUTE void sljit_set_put_label(struct sljit_put_label *put_label, struct sljit_label *label)
-{
-	SLJIT_UNUSED_ARG(put_label);
-	SLJIT_UNUSED_ARG(label);
-	SLJIT_UNREACHABLE();
-}
-
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(type);
-	SLJIT_UNUSED_ARG(src);
-	SLJIT_UNUSED_ARG(srcw);
-	SLJIT_UNREACHABLE();
 	return SLJIT_ERR_UNSUPPORTED;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,
-	sljit_s32 arg_types,
-	sljit_s32 src, sljit_sw srcw)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(type);
-	SLJIT_UNUSED_ARG(arg_types);
-	SLJIT_UNUSED_ARG(src);
-	SLJIT_UNUSED_ARG(srcw);
-	SLJIT_UNREACHABLE();
-	return SLJIT_ERR_UNSUPPORTED;
-}
+#endif /* !SLJIT_CONFIG_X86 && !SLJIT_CONFIG_ARM */
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 dst, sljit_sw dstw,
-	sljit_s32 type)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(op);
-	SLJIT_UNUSED_ARG(dst);
-	SLJIT_UNUSED_ARG(dstw);
-	SLJIT_UNUSED_ARG(type);
-	SLJIT_UNREACHABLE();
-	return SLJIT_ERR_UNSUPPORTED;
-}
+#if !(defined(SLJIT_CONFIG_X86) && SLJIT_CONFIG_X86) \
+	&& !(defined(SLJIT_CONFIG_ARM) && SLJIT_CONFIG_ARM) \
+	&& !(defined(SLJIT_CONFIG_S390X) && SLJIT_CONFIG_S390X) \
+	&& !(defined(SLJIT_CONFIG_LOONGARCH) && SLJIT_CONFIG_LOONGARCH)
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler,
+	sljit_s32 op,
 	sljit_s32 dst_reg,
-	sljit_s32 src, sljit_sw srcw)
+	sljit_s32 mem_reg)
 {
 	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(type);
+	SLJIT_UNUSED_ARG(op);
 	SLJIT_UNUSED_ARG(dst_reg);
-	SLJIT_UNUSED_ARG(src);
-	SLJIT_UNUSED_ARG(srcw);
-	SLJIT_UNREACHABLE();
-	return SLJIT_ERR_UNSUPPORTED;
-}
+	SLJIT_UNUSED_ARG(mem_reg);
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 reg, sljit_s32 mem, sljit_sw memw)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(type);
-	SLJIT_UNUSED_ARG(reg);
-	SLJIT_UNUSED_ARG(mem);
-	SLJIT_UNUSED_ARG(memw);
-	SLJIT_UNREACHABLE();
-	return SLJIT_ERR_UNSUPPORTED;
-}
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg));
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem_update(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 reg, sljit_s32 mem, sljit_sw memw)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(type);
-	SLJIT_UNUSED_ARG(reg);
-	SLJIT_UNUSED_ARG(mem);
-	SLJIT_UNUSED_ARG(memw);
-	SLJIT_UNREACHABLE();
 	return SLJIT_ERR_UNSUPPORTED;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 mem, sljit_sw memw)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler,
+	sljit_s32 op,
+	sljit_s32 src_reg,
+	sljit_s32 mem_reg,
+	sljit_s32 temp_reg)
 {
 	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(type);
-	SLJIT_UNUSED_ARG(freg);
-	SLJIT_UNUSED_ARG(mem);
-	SLJIT_UNUSED_ARG(memw);
-	SLJIT_UNREACHABLE();
-	return SLJIT_ERR_UNSUPPORTED;
-}
+	SLJIT_UNUSED_ARG(op);
+	SLJIT_UNUSED_ARG(src_reg);
+	SLJIT_UNUSED_ARG(mem_reg);
+	SLJIT_UNUSED_ARG(temp_reg);
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg));
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem_update(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 mem, sljit_sw memw)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(type);
-	SLJIT_UNUSED_ARG(freg);
-	SLJIT_UNUSED_ARG(mem);
-	SLJIT_UNUSED_ARG(memw);
-	SLJIT_UNREACHABLE();
 	return SLJIT_ERR_UNSUPPORTED;
 }
 
+#endif /* !SLJIT_CONFIG_X86 && !SLJIT_CONFIG_ARM && !SLJIT_CONFIG_S390X && !SLJIT_CONFIG_LOONGARCH */
+
+#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
+	&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
+
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)
 {
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(dst);
-	SLJIT_UNUSED_ARG(dstw);
-	SLJIT_UNUSED_ARG(offset);
-	SLJIT_UNREACHABLE();
-	return SLJIT_ERR_UNSUPPORTED;
-}
+	CHECK_ERROR();
+	CHECK(check_sljit_get_local_base(compiler, dst, dstw, offset));
 
-SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw initval)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(dst);
-	SLJIT_UNUSED_ARG(dstw);
-	SLJIT_UNUSED_ARG(initval);
-	SLJIT_UNREACHABLE();
-	return NULL;
-}
+	ADJUST_LOCAL_OFFSET(SLJIT_MEM1(SLJIT_SP), offset);
 
-SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
-{
-	SLJIT_UNUSED_ARG(compiler);
-	SLJIT_UNUSED_ARG(dst);
-	SLJIT_UNUSED_ARG(dstw);
-	return NULL;
-}
+	SLJIT_SKIP_CHECKS(compiler);
 
-SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)
-{
-	SLJIT_UNUSED_ARG(addr);
-	SLJIT_UNUSED_ARG(new_target);
-	SLJIT_UNUSED_ARG(executable_offset);
-	SLJIT_UNREACHABLE();
+	if (offset != 0)
+		return sljit_emit_op2(compiler, SLJIT_ADD, dst, dstw, SLJIT_SP, 0, SLJIT_IMM, offset);
+	return sljit_emit_op1(compiler, SLJIT_MOV, dst, dstw, SLJIT_SP, 0);
 }
 
-SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)
-{
-	SLJIT_UNUSED_ARG(addr);
-	SLJIT_UNUSED_ARG(new_constant);
-	SLJIT_UNUSED_ARG(executable_offset);
-	SLJIT_UNREACHABLE();
-}
+#endif /* !SLJIT_CONFIG_X86 && !SLJIT_CONFIG_ARM_64 */
 
 #endif /* !SLJIT_CONFIG_UNSUPPORTED */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitLir.h 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitLir.h
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitLir.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitLir.h	2024-11-20 13:56:33.000000000 +0000
@@ -72,6 +72,7 @@
 #include "sljitConfigPre.h"
 #endif /* SLJIT_HAVE_CONFIG_PRE */
 
+#include "sljitConfigCPU.h"
 #include "sljitConfig.h"
 
 /* The following header file defines useful macros for fine tuning
@@ -107,9 +108,9 @@ extern "C" {
 /* Cannot allocate executable memory.
    Only sljit_generate_code() returns with this error code. */
 #define SLJIT_ERR_EX_ALLOC_FAILED	3
-/* Return value for SLJIT_CONFIG_UNSUPPORTED placeholder architecture. */
+/* Unsupported instruction form. */
 #define SLJIT_ERR_UNSUPPORTED		4
-/* An ivalid argument is passed to any SLJIT function. */
+/* An invalid argument is passed to any SLJIT function. */
 #define SLJIT_ERR_BAD_ARGUMENT		5
 
 /* --------------------------------------------------------------------- */
@@ -127,40 +128,40 @@ extern "C" {
   is the first saved register, the one before the last is the second saved
   register, and so on.
 
-  If an architecture provides two scratch and three saved registers,
-  its scratch and saved register sets are the following:
+  For example, in an architecture with only five registers (A-E), if two
+  are scratch and three saved registers, they will be defined as follows:
 
-     R0   |        |   R0 is always a scratch register
-     R1   |        |   R1 is always a scratch register
-    [R2]  |   S2   |   R2 and S2 represent the same physical register
-    [R3]  |   S1   |   R3 and S1 represent the same physical register
-    [R4]  |   S0   |   R4 and S0 represent the same physical register
+    A |   R0   |      |  R0 always represent scratch register A
+    B |   R1   |      |  R1 always represent scratch register B
+    C |  [R2]  |  S2  |  R2 and S2 represent the same physical register C
+    D |  [R3]  |  S1  |  R3 and S1 represent the same physical register D
+    E |  [R4]  |  S0  |  R4 and S0 represent the same physical register E
 
-  Note: SLJIT_NUMBER_OF_SCRATCH_REGISTERS would be 2 and
-        SLJIT_NUMBER_OF_SAVED_REGISTERS would be 3 for this architecture.
+  Note: SLJIT_NUMBER_OF_SCRATCH_REGISTERS will be 2 and
+        SLJIT_NUMBER_OF_SAVED_REGISTERS will be 3.
 
-  Note: On all supported architectures SLJIT_NUMBER_OF_REGISTERS >= 12
+  Note: For all supported architectures SLJIT_NUMBER_OF_REGISTERS >= 12
         and SLJIT_NUMBER_OF_SAVED_REGISTERS >= 6. However, 6 registers
         are virtual on x86-32. See below.
 
   The purpose of this definition is convenience: saved registers can
-  be used as extra scratch registers. For example four registers can
-  be specified as scratch registers and the fifth one as saved register
-  on the CPU above and any user code which requires four scratch
-  registers can run unmodified. The SLJIT compiler automatically saves
-  the content of the two extra scratch register on the stack. Scratch
-  registers can also be preserved by saving their value on the stack
-  but this needs to be done manually.
+  be used as extra scratch registers. For example, building in the
+  previous example, four registers can be specified as scratch registers
+  and the fifth one as saved register, allowing any user code which requires
+  four scratch registers to run unmodified. The SLJIT compiler automatically
+  saves the content of the two extra scratch register on the stack. Scratch
+  registers can also be preserved by saving their value on the stack but
+  that needs to be done manually.
 
   Note: To emphasize that registers assigned to R2-R4 are saved
         registers, they are enclosed by square brackets.
 
-  Note: sljit_emit_enter and sljit_set_context defines whether a register
-        is S or R register. E.g: when 3 scratches and 1 saved is mapped
-        by sljit_emit_enter, the allowed register set will be: R0-R2 and
-        S0. Although S2 is mapped to the same position as R2, it does not
-        available in the current configuration. Furthermore the S1 register
-        is not available at all.
+  Note: sljit_emit_enter and sljit_set_context define whether a register
+        is S or R register. E.g: if in the previous example 3 scratches and
+        1 saved are mapped by sljit_emit_enter, the allowed register set
+        will be: R0-R2 and S0. Although S2 is mapped to the same register
+        than R2, it is not available in that configuration. Furthermore
+        the S1 register cannot be used at all.
 */
 
 /* Scratch registers. */
@@ -209,7 +210,7 @@ extern "C" {
 /* The SLJIT_SP provides direct access to the linear stack space allocated by
    sljit_emit_enter. It can only be used in the following form: SLJIT_MEM1(SLJIT_SP).
    The immediate offset is extended by the relative stack offset automatically.
-   The sljit_get_local_base can be used to obtain the real address of a value. */
+   sljit_get_local_base can be used to obtain the real address of a value. */
 #define SLJIT_SP	(SLJIT_NUMBER_OF_REGISTERS + 1)
 
 /* Return with machine word. */
@@ -221,7 +222,7 @@ extern "C" {
 /* --------------------------------------------------------------------- */
 
 /* Each floating point register can store a 32 or a 64 bit precision
-   value. The FR and FS register sets are overlap in the same way as R
+   value. The FR and FS register sets overlap in the same way as R
    and S register sets. See above. */
 
 /* Floating point scratch registers. */
@@ -231,6 +232,10 @@ extern "C" {
 #define SLJIT_FR3	4
 #define SLJIT_FR4	5
 #define SLJIT_FR5	6
+#define SLJIT_FR6	7
+#define SLJIT_FR7	8
+#define SLJIT_FR8	9
+#define SLJIT_FR9	10
 /* All FR registers provided by the architecture can be accessed by SLJIT_FR(i)
    The i parameter must be >= 0 and < SLJIT_NUMBER_OF_FLOAT_REGISTERS. */
 #define SLJIT_FR(i)	(1 + (i))
@@ -242,6 +247,10 @@ extern "C" {
 #define SLJIT_FS3	(SLJIT_NUMBER_OF_FLOAT_REGISTERS - 3)
 #define SLJIT_FS4	(SLJIT_NUMBER_OF_FLOAT_REGISTERS - 4)
 #define SLJIT_FS5	(SLJIT_NUMBER_OF_FLOAT_REGISTERS - 5)
+#define SLJIT_FS6	(SLJIT_NUMBER_OF_FLOAT_REGISTERS - 6)
+#define SLJIT_FS7	(SLJIT_NUMBER_OF_FLOAT_REGISTERS - 7)
+#define SLJIT_FS8	(SLJIT_NUMBER_OF_FLOAT_REGISTERS - 8)
+#define SLJIT_FS9	(SLJIT_NUMBER_OF_FLOAT_REGISTERS - 9)
 /* All S registers provided by the architecture can be accessed by SLJIT_FS(i)
    The i parameter must be >= 0 and < SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS. */
 #define SLJIT_FS(i)	(SLJIT_NUMBER_OF_FLOAT_REGISTERS - (i))
@@ -260,23 +269,39 @@ extern "C" {
 /* The following argument type definitions are used by sljit_emit_enter,
    sljit_set_context, sljit_emit_call, and sljit_emit_icall functions.
 
-   As for sljit_emit_call and sljit_emit_icall, the first integer argument
+   For sljit_emit_call and sljit_emit_icall, the first integer argument
    must be placed into SLJIT_R0, the second one into SLJIT_R1, and so on.
    Similarly the first floating point argument must be placed into SLJIT_FR0,
    the second one into SLJIT_FR1, and so on.
 
-   As for sljit_emit_enter, the integer arguments can be stored in scratch
-   or saved registers. The first integer argument without _R postfix is
-   stored in SLJIT_S0, the next one in SLJIT_S1, and so on. The integer
-   arguments with _R postfix are placed into scratch registers. The index
-   of the scratch register is the count of the previous integer arguments
-   starting from SLJIT_R0. The floating point arguments are always placed
-   into SLJIT_FR0, SLJIT_FR1, and so on.
-
-   Note: if a function is called by sljit_emit_call/sljit_emit_icall and
-         an argument is stored in a scratch register by sljit_emit_enter,
-         that argument uses the same scratch register index for both
-         integer and floating point arguments.
+   For sljit_emit_enter, the integer arguments can be stored in scratch
+   or saved registers. Scratch registers are identified by a _R suffix.
+
+   If only saved registers are used, then the allocation mirrors what is
+   done for the "call" functions but using saved registers, meaning that
+   the first integer argument goes to SLJIT_S0, the second one goes into
+   SLJIT_S1, and so on.
+
+   If scratch registers are used, then the way the integer registers are
+   allocated changes so that SLJIT_S0, SLJIT_S1, etc; will be assigned
+   only for the arguments not using scratch registers, while SLJIT_R<n>
+   will be used for the ones using scratch registers.
+
+   Furthermore, the index (shown as "n" above) that will be used for the
+   scratch register depends on how many previous integer registers
+   (scratch or saved) were used already, starting with SLJIT_R0.
+   Eventhough some indexes will be likely skipped, they still need to be
+   accounted for in the scratches parameter of sljit_emit_enter. See below
+   for some examples.
+
+   The floating point arguments always use scratch registers (but not the
+   _R suffix like the integer arguments) and must use SLJIT_FR0, SLJIT_FR1,
+   just like in the "call" functions.
+
+   Note: the mapping for scratch registers is part of the compiler context
+         and therefore a new context after sljit_emit_call/sljit_emit_icall
+         could remove access to some scratch registers that were used as
+         arguments.
 
    Example function definition:
      sljit_f32 SLJIT_FUNC example_c_callback(void *arg_a,
@@ -288,29 +313,33 @@ extern "C" {
         | SLJIT_ARG_VALUE(SLJIT_ARG_TYPE_32, 3) | SLJIT_ARG_VALUE(SLJIT_ARG_TYPE_F32, 4)
 
    Short form of argument type definition:
-     SLJIT_ARGS4(32, P, F64, 32, F32)
+     SLJIT_ARGS4(F32, P, F64, 32, F32)
 
    Argument passing:
      arg_a must be placed in SLJIT_R0
-     arg_c must be placed in SLJIT_R1
      arg_b must be placed in SLJIT_FR0
+     arg_c must be placed in SLJIT_R1
      arg_d must be placed in SLJIT_FR1
 
    Examples for argument processing by sljit_emit_enter:
-     SLJIT_ARGS4(VOID, P, 32_R, F32, W)
+     SLJIT_ARGS4V(P, 32_R, F32, W)
      Arguments are placed into: SLJIT_S0, SLJIT_R1, SLJIT_FR0, SLJIT_S1
+     The type of the result is void.
 
-     SLJIT_ARGS4(VOID, W, W_R, W, W_R)
+     SLJIT_ARGS4(F32, W, W_R, W, W_R)
      Arguments are placed into: SLJIT_S0, SLJIT_R1, SLJIT_S1, SLJIT_R3
+     The type of the result is sljit_f32.
 
-     SLJIT_ARGS4(VOID, F64, W, F32, W_R)
+     SLJIT_ARGS4(P, W, F32, P_R)
      Arguments are placed into: SLJIT_FR0, SLJIT_S0, SLJIT_FR1, SLJIT_R1
+     The type of the result is pointer.
 
      Note: it is recommended to pass the scratch arguments first
      followed by the saved arguments:
 
-       SLJIT_ARGS4(VOID, W_R, W_R, W, W)
+       SLJIT_ARGS4(W, W_R, W_R, W, W)
        Arguments are placed into: SLJIT_R0, SLJIT_R1, SLJIT_S0, SLJIT_S1
+       The type of the result is sljit_sw / sljit_uw.
 */
 
 /* The following flag is only allowed for the integer arguments of
@@ -318,21 +347,21 @@ extern "C" {
    stored in a scratch register instead of a saved register. */
 #define SLJIT_ARG_TYPE_SCRATCH_REG 0x8
 
-/* Void result, can only be used by SLJIT_ARG_RETURN. */
-#define SLJIT_ARG_TYPE_VOID	0
+/* No return value, only supported by SLJIT_ARG_RETURN. */
+#define SLJIT_ARG_TYPE_RET_VOID		0
 /* Machine word sized integer argument or result. */
-#define SLJIT_ARG_TYPE_W	1
+#define SLJIT_ARG_TYPE_W		1
 #define SLJIT_ARG_TYPE_W_R	(SLJIT_ARG_TYPE_W | SLJIT_ARG_TYPE_SCRATCH_REG)
 /* 32 bit integer argument or result. */
-#define SLJIT_ARG_TYPE_32	2
+#define SLJIT_ARG_TYPE_32		2
 #define SLJIT_ARG_TYPE_32_R	(SLJIT_ARG_TYPE_32 | SLJIT_ARG_TYPE_SCRATCH_REG)
 /* Pointer sized integer argument or result. */
-#define SLJIT_ARG_TYPE_P	3
+#define SLJIT_ARG_TYPE_P		3
 #define SLJIT_ARG_TYPE_P_R	(SLJIT_ARG_TYPE_P | SLJIT_ARG_TYPE_SCRATCH_REG)
 /* 64 bit floating point argument or result. */
-#define SLJIT_ARG_TYPE_F64	4
+#define SLJIT_ARG_TYPE_F64		4
 /* 32 bit floating point argument or result. */
-#define SLJIT_ARG_TYPE_F32	5
+#define SLJIT_ARG_TYPE_F32		5
 
 #define SLJIT_ARG_SHIFT 4
 #define SLJIT_ARG_RETURN(type) (type)
@@ -345,24 +374,40 @@ extern "C" {
 
    can be shortened to:
        SLJIT_ARGS1(W, F32)
+
+   Another example where no value is returned:
+       SLJIT_ARG_RETURN(SLJIT_ARG_TYPE_RET_VOID) | SLJIT_ARG_VALUE(SLJIT_ARG_TYPE_W_R, 1)
+
+   can be shortened to:
+       SLJIT_ARGS1V(W_R)
 */
 
 #define SLJIT_ARG_TO_TYPE(type) SLJIT_ARG_TYPE_ ## type
 
 #define SLJIT_ARGS0(ret) \
 	SLJIT_ARG_RETURN(SLJIT_ARG_TO_TYPE(ret))
+#define SLJIT_ARGS0V() \
+	SLJIT_ARG_RETURN(SLJIT_ARG_TYPE_RET_VOID)
 
 #define SLJIT_ARGS1(ret, arg1) \
 	(SLJIT_ARGS0(ret) | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg1), 1))
+#define SLJIT_ARGS1V(arg1) \
+	(SLJIT_ARGS0V() | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg1), 1))
 
 #define SLJIT_ARGS2(ret, arg1, arg2) \
 	(SLJIT_ARGS1(ret, arg1) | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg2), 2))
+#define SLJIT_ARGS2V(arg1, arg2) \
+	(SLJIT_ARGS1V(arg1) | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg2), 2))
 
 #define SLJIT_ARGS3(ret, arg1, arg2, arg3) \
 	(SLJIT_ARGS2(ret, arg1, arg2) | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg3), 3))
+#define SLJIT_ARGS3V(arg1, arg2, arg3) \
+	(SLJIT_ARGS2V(arg1, arg2) | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg3), 3))
 
 #define SLJIT_ARGS4(ret, arg1, arg2, arg3, arg4) \
 	(SLJIT_ARGS3(ret, arg1, arg2, arg3) | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg4), 4))
+#define SLJIT_ARGS4V(arg1, arg2, arg3, arg4) \
+	(SLJIT_ARGS3V(arg1, arg2, arg3) | SLJIT_ARG_VALUE(SLJIT_ARG_TO_TYPE(arg4), 4))
 
 /* --------------------------------------------------------------------- */
 /*  Main structures and functions                                        */
@@ -457,7 +502,7 @@ struct sljit_compiler {
 	sljit_s32 mode32;
 #endif
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 	/* Constant pool handling. */
 	sljit_uw *cpool;
 	sljit_u8 *cpool_unique;
@@ -468,10 +513,10 @@ struct sljit_compiler {
 	sljit_uw patches;
 #endif
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
 	/* Temporary fields. */
 	sljit_uw shift_imm;
-#endif /* SLJIT_CONFIG_ARM_V5 || SLJIT_CONFIG_ARM_V7 */
+#endif /* SLJIT_CONFIG_ARM_V6 || SLJIT_CONFIG_ARM_V6 */
 
 #if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) && (defined __SOFTFP__)
 	sljit_uw args_size;
@@ -501,6 +546,11 @@ struct sljit_compiler {
 	sljit_s32 mode;
 #endif
 
+#if (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
+	sljit_s32 cache_arg;
+	sljit_sw cache_argw;
+#endif
+
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
 	FILE* verbose;
 #endif
@@ -558,8 +608,7 @@ static SLJIT_INLINE sljit_s32 sljit_get_
    after the code is compiled. */
 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compiler *compiler);
 
-/*
-   Allocate a small amount of memory. The size must be <= 64 bytes on 32 bit,
+/* Allocate a small amount of memory. The size must be <= 64 bytes on 32 bit,
    and <= 128 bytes on 64 bit architectures. The memory area is owned by the
    compiler, and freed by sljit_free_compiler. The returned pointer is
    sizeof(sljit_sw) aligned. Excellent for allocating small blocks during
@@ -567,19 +616,21 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_
    to contain at most 16 pointers. If the size is outside of the range,
    the function will return with NULL. However, this return value does not
    indicate that there is no more memory (does not set the current error code
-   of the compiler to out-of-memory status).
-*/
+   of the compiler to out-of-memory status). */
 SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_s32 size);
 
+/* Returns the allocator data passed to sljit_create_compiler. These pointers
+   may contain context data even if the normal/exec allocator ignores it. */
+static SLJIT_INLINE void* sljit_get_allocator_data(struct sljit_compiler *compiler) { return compiler->allocator_data; }
+static SLJIT_INLINE void* sljit_get_exec_allocator_data(struct sljit_compiler *compiler) { return compiler->exec_allocator_data; }
+
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
 /* Passing NULL disables verbose. */
 SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose);
 #endif
 
-/*
-   Create executable code from the instruction stream. This is the final step
-   of the code generation so no more instructions can be emitted after this call.
-*/
+/* Create executable code from the instruction stream. This is the final step
+   of the code generation so no more instructions can be emitted after this call. */
 
 SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler);
 
@@ -587,8 +638,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 
 SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code, void *exec_allocator_data);
 
-/*
-   When the protected executable allocator is used the JIT code is mapped
+/* When the protected executable allocator is used the JIT code is mapped
    twice. The first mapping has read/write and the second mapping has read/exec
    permissions. This function returns with the relative offset of the executable
    mapping using the writable mapping as the base after the machine code is
@@ -596,16 +646,13 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free
    allocator, since it uses only one mapping with read/write/exec permissions.
    Dynamic code modifications requires this value.
 
-   Before a successful code generation, this function returns with 0.
-*/
+   Before a successful code generation, this function returns with 0. */
 static SLJIT_INLINE sljit_sw sljit_get_executable_offset(struct sljit_compiler *compiler) { return compiler->executable_offset; }
 
-/*
-   The executable memory consumption of the generated code can be retrieved by
+/* The executable memory consumption of the generated code can be retrieved by
    this function. The returned value can be used for statistical purposes.
 
-   Before a successful code generation, this function returns with 0.
-*/
+   Before a successful code generation, this function returns with 0. */
 static SLJIT_INLINE sljit_uw sljit_get_generated_code_size(struct sljit_compiler *compiler) { return compiler->executable_size; }
 
 /* Returns with non-zero if the feature or limitation type passed as its
@@ -628,30 +675,49 @@ static SLJIT_INLINE sljit_uw sljit_get_g
 #define SLJIT_HAS_CLZ			3
 /* [Emulated] Count trailing zero is supported. */
 #define SLJIT_HAS_CTZ			4
+/* [Emulated] Reverse the order of bytes is supported. */
+#define SLJIT_HAS_REV			5
 /* [Emulated] Rotate left/right is supported. */
-#define SLJIT_HAS_ROT			5
+#define SLJIT_HAS_ROT			6
 /* [Emulated] Conditional move is supported. */
-#define SLJIT_HAS_CMOV			6
+#define SLJIT_HAS_CMOV			7
 /* [Emulated] Prefetch instruction is available (emulated as a nop). */
-#define SLJIT_HAS_PREFETCH		7
+#define SLJIT_HAS_PREFETCH		8
+/* [Emulated] Copy from/to f32 operation is available (see sljit_emit_fcopy). */
+#define SLJIT_HAS_COPY_F32		9
+/* [Emulated] Copy from/to f64 operation is available (see sljit_emit_fcopy). */
+#define SLJIT_HAS_COPY_F64		10
+/* [Not emulated] The 64 bit floating point registers can be used as
+   two separate 32 bit floating point registers (e.g. ARM32). The
+   second 32 bit part can be accessed by SLJIT_F64_SECOND. */
+#define SLJIT_HAS_F64_AS_F32_PAIR	11
+/* [Not emulated] Some SIMD operations are supported by the compiler. */
+#define SLJIT_HAS_SIMD			12
+/* [Not emulated] SIMD registers are mapped to a pair of double precision
+   floating point registers. E.g. passing either SLJIT_FR0 or SLJIT_FR1 to
+   a simd operation represents the same 128 bit register, and both SLJIT_FR0
+   and SLJIT_FR1 are overwritten. */
+#define SLJIT_SIMD_REGS_ARE_PAIRS	13
+/* [Not emulated] Atomic support is available (fine-grained). */
+#define SLJIT_HAS_ATOMIC      14
 
 #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
-/* [Not emulated] SSE2 support is available on x86. */
-#define SLJIT_HAS_SSE2			100
+/* [Not emulated] AVX support is available on x86. */
+#define SLJIT_HAS_AVX			100
+/* [Not emulated] AVX2 support is available on x86. */
+#define SLJIT_HAS_AVX2			101
 #endif
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type);
 
 /* If type is between SLJIT_ORDERED_EQUAL and SLJIT_ORDERED_LESS_EQUAL,
-   sljit_cmp_info returns one, if the cpu supports the passed floating
-   point comparison type.
+   sljit_cmp_info returns with:
+     zero - if the cpu supports the floating point comparison type
+     one - if the comparison requires two machine instructions
+     two - if the comparison requires more than two machine instructions
 
-   If type is SLJIT_UNORDERED or SLJIT_ORDERED, sljit_cmp_info returns
-   one, if the cpu supports checking the unordered comparison result
-   regardless of the comparison type passed to the comparison instruction.
-   The returned value is always one, if there is at least one type between
-   SLJIT_ORDERED_EQUAL and SLJIT_ORDERED_LESS_EQUAL where sljit_cmp_info
-   returns with a zero value.
+   When the result is non-zero, it is recommended to avoid
+   using the specified comparison type if it is easy to do so.
 
    Otherwise it returns zero. */
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type);
@@ -662,7 +728,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 /*
    The executable code is a function from the viewpoint of the C
-   language. The function calls must obey to the ABI (Application
+   language. The function calls must conform to the ABI (Application
    Binary Interface) of the platform, which specify the purpose of
    machine registers and stack handling among other things. The
    sljit_emit_enter function emits the necessary instructions for
@@ -721,7 +787,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #define SLJIT_ENTER_REG_ARG	0x00000004
 
 /* The local_size must be >= 0 and <= SLJIT_MAX_LOCAL_SIZE. */
-#define SLJIT_MAX_LOCAL_SIZE	65536
+#define SLJIT_MAX_LOCAL_SIZE	1048576
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
 	sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,
@@ -732,9 +798,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
    by sljit_emit_enter. Several functions (such as sljit_emit_return)
    requires this context to be able to generate the appropriate code.
    However, some code fragments (compiled separately) may have no
-   normal entry point so their context is unknown for the compiler.
+   normal entry point so their context is unknown to the compiler.
 
-   The sljit_set_context and sljit_emit_enter have the same arguments,
+   sljit_set_context and sljit_emit_enter have the same arguments,
    but sljit_set_context does not generate any machine code.
 
    Note: every call of sljit_emit_enter and sljit_set_context overwrites
@@ -767,28 +833,6 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_to(struct sljit_compiler *compiler,
 	sljit_s32 src, sljit_sw srcw);
 
-/* Generating entry and exit points for fast call functions (see SLJIT_FAST_CALL).
-   Both sljit_emit_fast_enter and SLJIT_FAST_RETURN operations preserve the
-   values of all registers and stack frame. The return address is stored in the
-   dst argument of sljit_emit_fast_enter, and this return address can be passed
-   to SLJIT_FAST_RETURN to continue the execution after the fast call.
-
-   Fast calls are cheap operations (usually only a single call instruction is
-   emitted) but they do not preserve any registers. However the callee function
-   can freely use / update any registers and the local area which can be
-   efficiently exploited by various optimizations. Registers can be saved
-   and restored manually if needed.
-
-   Although returning to different address by SLJIT_FAST_RETURN is possible,
-   this address usually cannot be predicted by the return address predictor of
-   modern CPUs which may reduce performance. Furthermore certain security
-   enhancement technologies such as Intel Control-flow Enforcement Technology
-   (CET) may disallow returning to a different address.
-
-   Flags: - (does not modify flags). */
-
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw);
-
 /*
    Source and destination operands for arithmetical instructions
     imm              - a simple immediate value (cannot be used as a destination)
@@ -816,7 +860,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
    Note:   Different architectures have different addressing limitations.
            A single instruction is enough for the following addressing
-           modes. Other adrressing modes are emulated by instruction
+           modes. Other addressing modes are emulated by instruction
            sequences. This information could help to improve those code
            generators which focuses only a few architectures.
 
@@ -847,6 +891,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
    s390x:  [reg+imm], -2^19 <= imm < 2^19
            [reg+reg] is supported
            Write-back is not supported
+   loongarch:  [reg+imm], -2048 <= imm <= 2047
+           [reg+reg] is supported
+           Write-back is not supported
 */
 
 /* Macros for specifying operand types. */
@@ -854,9 +901,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #define SLJIT_MEM0()		(SLJIT_MEM)
 #define SLJIT_MEM1(r1)		(SLJIT_MEM | (r1))
 #define SLJIT_MEM2(r1, r2)	(SLJIT_MEM | (r1) | ((r2) << 8))
-#define SLJIT_IMM		0x40
+#define SLJIT_IMM		0x7f
 #define SLJIT_REG_PAIR(r1, r2)	((r1) | ((r2) << 8))
 
+/* Macros for checking operand types (only for valid arguments). */
+#define SLJIT_IS_REG(arg)	((arg) > 0 && (arg) < SLJIT_IMM)
+#define SLJIT_IS_MEM(arg)	((arg) & SLJIT_MEM)
+#define SLJIT_IS_MEM0(arg)	((arg) == SLJIT_MEM)
+#define SLJIT_IS_MEM1(arg)	((arg) > SLJIT_MEM && (arg) < (SLJIT_MEM << 1))
+#define SLJIT_IS_MEM2(arg)	(((arg) & SLJIT_MEM) && (arg) >= (SLJIT_MEM << 1))
+#define SLJIT_IS_IMM(arg)	((arg) == SLJIT_IMM)
+#define SLJIT_IS_REG_PAIR(arg)	(!((arg) & SLJIT_MEM) && (arg) >= (SLJIT_MEM << 1))
+
 /* Sets 32 bit operation mode on 64 bit CPUs. This option is ignored on
    32 bit CPUs. When this option is set for an arithmetic operation, only
    the lower 32 bits of the input registers are used, and the CPU status
@@ -1057,27 +1113,57 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
    Note: loads a pointer sized data, useful on x32 mode (a 64 bit mode
          on x86-64 which uses 32 bit pointers) or similar compiling modes */
 #define SLJIT_MOV_P			(SLJIT_OP1_BASE + 8)
-/* Flags: Z
-   Note: immediate source argument is not supported */
-#define SLJIT_NOT			(SLJIT_OP1_BASE + 9)
-#define SLJIT_NOT32			(SLJIT_NOT | SLJIT_32)
 /* Count leading zeroes
    Flags: - (may destroy flags)
    Note: immediate source argument is not supported */
-#define SLJIT_CLZ			(SLJIT_OP1_BASE + 10)
+#define SLJIT_CLZ			(SLJIT_OP1_BASE + 9)
 #define SLJIT_CLZ32			(SLJIT_CLZ | SLJIT_32)
 /* Count trailing zeroes
    Flags: - (may destroy flags)
    Note: immediate source argument is not supported */
-#define SLJIT_CTZ			(SLJIT_OP1_BASE + 11)
+#define SLJIT_CTZ			(SLJIT_OP1_BASE + 10)
 #define SLJIT_CTZ32			(SLJIT_CTZ | SLJIT_32)
+/* Reverse the order of bytes
+   Flags: - (may destroy flags)
+   Note: converts between little and big endian formats
+   Note: immediate source argument is not supported */
+#define SLJIT_REV			(SLJIT_OP1_BASE + 11)
+#define SLJIT_REV32			(SLJIT_REV | SLJIT_32)
+/* Reverse the order of bytes in the lower 16 bit and extend as unsigned
+   Flags: - (may destroy flags)
+   Note: converts between little and big endian formats
+   Note: immediate source argument is not supported */
+#define SLJIT_REV_U16			(SLJIT_OP1_BASE + 12)
+#define SLJIT_REV32_U16			(SLJIT_REV_U16 | SLJIT_32)
+/* Reverse the order of bytes in the lower 16 bit and extend as signed
+   Flags: - (may destroy flags)
+   Note: converts between little and big endian formats
+   Note: immediate source argument is not supported */
+#define SLJIT_REV_S16			(SLJIT_OP1_BASE + 13)
+#define SLJIT_REV32_S16			(SLJIT_REV_S16 | SLJIT_32)
+/* Reverse the order of bytes in the lower 32 bit and extend as unsigned
+   Flags: - (may destroy flags)
+   Note: converts between little and big endian formats
+   Note: immediate source argument is not supported */
+#define SLJIT_REV_U32			(SLJIT_OP1_BASE + 14)
+/* Reverse the order of bytes in the lower 32 bit and extend as signed
+   Flags: - (may destroy flags)
+   Note: converts between little and big endian formats
+   Note: immediate source argument is not supported */
+#define SLJIT_REV_S32			(SLJIT_OP1_BASE + 15)
+
+/* The following unary operations are supported by using sljit_emit_op2:
+     - binary not: SLJIT_XOR with immedate -1 as src1 or src2
+     - negate: SLJIT_SUB with immedate 0 as src1
+   Note: these operations are optimized by the compiler if the
+     target CPU has specialized instruction forms for them. */
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 src, sljit_sw srcw);
 
 /* Starting index of opcodes for sljit_emit_op2. */
-#define SLJIT_OP2_BASE			96
+#define SLJIT_OP2_BASE			64
 
 /* Flags: Z | OVERFLOW | CARRY */
 #define SLJIT_ADD			(SLJIT_OP2_BASE + 0)
@@ -1174,80 +1260,97 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
    op must be one of the following operations:
      SLJIT_SHL or SLJIT_SHL32:
-       src_dst <<= src2
-       src_dst |= ((src1 >> 1) >> (src2 ^ value_mask))
+       dst_reg = src1_reg << src3_reg
+       dst_reg |= ((src2_reg >> 1) >> (src3 ^ value_mask))
      SLJIT_MSHL or SLJIT_MSHL32:
-       src2 &= value_mask
+       src3 &= value_mask
        perform the SLJIT_SHL or SLJIT_SHL32 operation
      SLJIT_LSHR or SLJIT_LSHR32:
-       src_dst >>= src2
-       src_dst |= ((src1 << 1) << (src2 ^ value_mask))
+       dst_reg = src1_reg >> src3_reg
+       dst_reg |= ((src2_reg << 1) << (src3 ^ value_mask))
      SLJIT_MLSHR or SLJIT_MLSHR32:
-       src2 &= value_mask
+       src3 &= value_mask
        perform the SLJIT_LSHR or SLJIT_LSHR32 operation
 
    op can be combined (or'ed) with SLJIT_SHIFT_INTO_NON_ZERO
 
-   src_dst must be a register which content is updated after
-     the operation is completed
-   src1 / src1w contains the bits which shifted into src_dst
-   src2 / src2w contains the shift amount
+   dst_reg specifies the destination register, where dst_reg
+     and src2_reg cannot be the same registers
+   src1_reg specifies the source register
+   src2_reg specifies the register which is shifted into src1_reg
+   src3 / src3w contains the shift amount
 
-   Note: a rotate operation can be performed if src_dst and
-         src1 are set to the same register
+   Note: a rotate operation is performed if src1_reg and
+         src2_reg are the same registers
 
    Flags: - (may destroy flags) */
 
-/* The src2 contains a non-zero value. Improves the generated
-   code on certain architectures, which provides a small
-   performance improvement. */
+/* The src3 operand contains a non-zero value. Improves
+   the generated code on certain architectures, which
+   provides a small performance improvement. */
 #define SLJIT_SHIFT_INTO_NON_ZERO	0x200
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 src_dst,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w);
-
-/* Starting index of opcodes for sljit_emit_op2. */
-#define SLJIT_OP_SRC_BASE		128
+	sljit_s32 dst_reg,
+	sljit_s32 src1_reg,
+	sljit_s32 src2_reg,
+	sljit_s32 src3, sljit_sw src3w);
+
+/* Starting index of opcodes for sljit_emit_op_src
+   and sljit_emit_op_dst. */
+#define SLJIT_OP_SRC_DST_BASE		96
 
-/* Note: src cannot be an immedate value
+/* Fast return, see SLJIT_FAST_CALL for more details.
+   Note: src cannot be an immedate value
    Flags: - (does not modify flags) */
-#define SLJIT_FAST_RETURN		(SLJIT_OP_SRC_BASE + 0)
+#define SLJIT_FAST_RETURN		(SLJIT_OP_SRC_DST_BASE + 0)
 /* Skip stack frames before fast return.
    Note: src cannot be an immedate value
    Flags: may destroy flags. */
-#define SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN	(SLJIT_OP_SRC_BASE + 1)
+#define SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN	(SLJIT_OP_SRC_DST_BASE + 1)
 /* Prefetch value into the level 1 data cache
    Note: if the target CPU does not support data prefetch,
          no instructions are emitted.
    Note: this instruction never fails, even if the memory address is invalid.
    Flags: - (does not modify flags) */
-#define SLJIT_PREFETCH_L1		(SLJIT_OP_SRC_BASE + 2)
+#define SLJIT_PREFETCH_L1		(SLJIT_OP_SRC_DST_BASE + 2)
 /* Prefetch value into the level 2 data cache
    Note: same as SLJIT_PREFETCH_L1 if the target CPU
          does not support this instruction form.
    Note: this instruction never fails, even if the memory address is invalid.
    Flags: - (does not modify flags) */
-#define SLJIT_PREFETCH_L2		(SLJIT_OP_SRC_BASE + 3)
+#define SLJIT_PREFETCH_L2		(SLJIT_OP_SRC_DST_BASE + 3)
 /* Prefetch value into the level 3 data cache
    Note: same as SLJIT_PREFETCH_L2 if the target CPU
          does not support this instruction form.
    Note: this instruction never fails, even if the memory address is invalid.
    Flags: - (does not modify flags) */
-#define SLJIT_PREFETCH_L3		(SLJIT_OP_SRC_BASE + 4)
+#define SLJIT_PREFETCH_L3		(SLJIT_OP_SRC_DST_BASE + 4)
 /* Prefetch a value which is only used once (and can be discarded afterwards)
    Note: same as SLJIT_PREFETCH_L1 if the target CPU
          does not support this instruction form.
    Note: this instruction never fails, even if the memory address is invalid.
    Flags: - (does not modify flags) */
-#define SLJIT_PREFETCH_ONCE		(SLJIT_OP_SRC_BASE + 5)
+#define SLJIT_PREFETCH_ONCE		(SLJIT_OP_SRC_DST_BASE + 5)
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
 	sljit_s32 src, sljit_sw srcw);
 
+/* Fast enter, see SLJIT_FAST_CALL for more details.
+   Flags: - (does not modify flags) */
+#define SLJIT_FAST_ENTER		(SLJIT_OP_SRC_DST_BASE + 6)
+
+/* Copies the return address into dst. The return address is the
+   address where the execution continues after the called function
+   returns (see: sljit_emit_return / sljit_emit_return_void).
+   Flags: - (does not modify flags) */
+#define SLJIT_GET_RETURN_ADDRESS	(SLJIT_OP_SRC_DST_BASE + 7)
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw);
+
 /* Starting index of opcodes for sljit_emit_fop1. */
-#define SLJIT_FOP1_BASE			160
+#define SLJIT_FOP1_BASE			128
 
 /* Flags: - (does not modify flags) */
 #define SLJIT_MOV_F64			(SLJIT_FOP1_BASE + 0)
@@ -1270,15 +1373,21 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 /* Flags: - (may destroy flags) */
 #define SLJIT_CONV_F64_FROM_S32		(SLJIT_FOP1_BASE + 5)
 #define SLJIT_CONV_F32_FROM_S32		(SLJIT_CONV_F64_FROM_S32 | SLJIT_32)
+/* Flags: - (may destroy flags) */
+#define SLJIT_CONV_F64_FROM_UW		(SLJIT_FOP1_BASE + 6)
+#define SLJIT_CONV_F32_FROM_UW		(SLJIT_CONV_F64_FROM_UW | SLJIT_32)
+/* Flags: - (may destroy flags) */
+#define SLJIT_CONV_F64_FROM_U32		(SLJIT_FOP1_BASE + 7)
+#define SLJIT_CONV_F32_FROM_U32		(SLJIT_CONV_F64_FROM_U32 | SLJIT_32)
 /* Note: dst is the left and src is the right operand for SLJIT_CMP_F32/64.
    Flags: EQUAL_F | LESS_F | GREATER_EQUAL_F | GREATER_F | LESS_EQUAL_F */
-#define SLJIT_CMP_F64			(SLJIT_FOP1_BASE + 6)
+#define SLJIT_CMP_F64			(SLJIT_FOP1_BASE + 8)
 #define SLJIT_CMP_F32			(SLJIT_CMP_F64 | SLJIT_32)
 /* Flags: - (may destroy flags) */
-#define SLJIT_NEG_F64			(SLJIT_FOP1_BASE + 7)
+#define SLJIT_NEG_F64			(SLJIT_FOP1_BASE + 9)
 #define SLJIT_NEG_F32			(SLJIT_NEG_F64 | SLJIT_32)
 /* Flags: - (may destroy flags) */
-#define SLJIT_ABS_F64			(SLJIT_FOP1_BASE + 8)
+#define SLJIT_ABS_F64			(SLJIT_FOP1_BASE + 10)
 #define SLJIT_ABS_F32			(SLJIT_ABS_F64 | SLJIT_32)
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
@@ -1286,7 +1395,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	sljit_s32 src, sljit_sw srcw);
 
 /* Starting index of opcodes for sljit_emit_fop2. */
-#define SLJIT_FOP2_BASE			192
+#define SLJIT_FOP2_BASE			160
 
 /* Flags: - (may destroy flags) */
 #define SLJIT_ADD_F64			(SLJIT_FOP2_BASE + 0)
@@ -1306,10 +1415,90 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	sljit_s32 src1, sljit_sw src1w,
 	sljit_s32 src2, sljit_sw src2w);
 
+/* Starting index of opcodes for sljit_emit_fop2r. */
+#define SLJIT_FOP2R_BASE		168
+
+/* Flags: - (may destroy flags) */
+#define SLJIT_COPYSIGN_F64		(SLJIT_FOP2R_BASE + 0)
+#define SLJIT_COPYSIGN_F32		(SLJIT_COPYSIGN_F64 | SLJIT_32)
+
+/* Similar to sljit_emit_fop2, except the destination is always a register. */
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2r(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst_freg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2, sljit_sw src2w);
+
+/* Sets a floating point register to an immediate value. */
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f32 value);
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f64 value);
+
+/* The following opcodes are used by sljit_emit_fcopy(). */
+
+/* 64 bit: copy a 64 bit value from an integer register into a
+           64 bit floating point register without any modifications.
+   32 bit: copy a 32 bit register or register pair into a 64 bit
+           floating point register without any modifications. The
+           register, or the first register of the register pair
+           replaces the high order 32 bit of the floating point
+           register. If a register pair is passed, the low
+           order 32 bit is replaced by the second register.
+           Otherwise, the low order 32 bit is unchanged. */
+#define SLJIT_COPY_TO_F64		1
+/* Copy a 32 bit value from an integer register into a 32 bit
+   floating point register without any modifications. */
+#define SLJIT_COPY32_TO_F32		(SLJIT_COPY_TO_F64 | SLJIT_32)
+/* 64 bit: copy the value of a 64 bit floating point register into
+           an integer register without any modifications.
+   32 bit: copy a 64 bit floating point register into a 32 bit register
+           or a 32 bit register pair without any modifications. The
+           high order 32 bit of the floating point register is copied
+           into the register, or the first register of the register
+           pair. If a register pair is passed, the low order 32 bit
+           is copied into the second register. */
+#define SLJIT_COPY_FROM_F64		2
+/* Copy the value of a 32 bit floating point register into an integer
+   register without any modifications. The register should be processed
+   with 32 bit operations later. */
+#define SLJIT_COPY32_FROM_F32		(SLJIT_COPY_FROM_F64 | SLJIT_32)
+
+/* Special data copy which involves floating point registers.
+
+  op must be between SLJIT_COPY_TO_F64 and SLJIT_COPY32_FROM_F32
+  freg must be a floating point register
+  reg must be a register or register pair */
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 freg, sljit_s32 reg);
+
 /* Label and jump instructions. */
 
 SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler);
 
+/* The SLJIT_FAST_CALL is a calling method for creating lightweight function
+   calls. This type of calls preserve the values of all registers and stack
+   frame. Unlike normal function calls, the enter and return operations must
+   be performed by the SLJIT_FAST_ENTER and SLJIT_FAST_RETURN operations
+   respectively. The return address is stored in the dst argument of the
+   SLJIT_FAST_ENTER operation, and this return address should be passed as
+   the src argument for the SLJIT_FAST_RETURN operation to return from the
+   called function.
+
+   Fast calls are cheap operations (usually only a single call instruction is
+   emitted) but they do not preserve any registers. However the callee function
+   can freely use / update any registers and the locals area which can be
+   efficiently exploited by various optimizations. Registers can be saved
+   and restored manually if needed.
+
+   Although returning to different address by SLJIT_FAST_RETURN is possible,
+   this address usually cannot be predicted by the return address predictor of
+   modern CPUs which may reduce performance. Furthermore certain security
+   enhancement technologies such as Intel Control-flow Enforcement Technology
+   (CET) may disallow returning to a different address (indirect jumps
+   can be used instead, see SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN). */
+
 /* Invert (negate) conditional type: xor (^) with 0x1 */
 
 /* Integer comparison types. */
@@ -1321,19 +1510,19 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_la
 #define SLJIT_LESS			2
 #define SLJIT_SET_LESS			SLJIT_SET(SLJIT_LESS)
 #define SLJIT_GREATER_EQUAL		3
-#define SLJIT_SET_GREATER_EQUAL		SLJIT_SET(SLJIT_GREATER_EQUAL)
+#define SLJIT_SET_GREATER_EQUAL		SLJIT_SET(SLJIT_LESS)
 #define SLJIT_GREATER			4
 #define SLJIT_SET_GREATER		SLJIT_SET(SLJIT_GREATER)
 #define SLJIT_LESS_EQUAL		5
-#define SLJIT_SET_LESS_EQUAL		SLJIT_SET(SLJIT_LESS_EQUAL)
+#define SLJIT_SET_LESS_EQUAL		SLJIT_SET(SLJIT_GREATER)
 #define SLJIT_SIG_LESS			6
 #define SLJIT_SET_SIG_LESS		SLJIT_SET(SLJIT_SIG_LESS)
 #define SLJIT_SIG_GREATER_EQUAL		7
-#define SLJIT_SET_SIG_GREATER_EQUAL	SLJIT_SET(SLJIT_SIG_GREATER_EQUAL)
+#define SLJIT_SET_SIG_GREATER_EQUAL	SLJIT_SET(SLJIT_SIG_LESS)
 #define SLJIT_SIG_GREATER		8
 #define SLJIT_SET_SIG_GREATER		SLJIT_SET(SLJIT_SIG_GREATER)
 #define SLJIT_SIG_LESS_EQUAL		9
-#define SLJIT_SET_SIG_LESS_EQUAL	SLJIT_SET(SLJIT_SIG_LESS_EQUAL)
+#define SLJIT_SET_SIG_LESS_EQUAL	SLJIT_SET(SLJIT_SIG_GREATER)
 
 #define SLJIT_OVERFLOW			10
 #define SLJIT_SET_OVERFLOW		SLJIT_SET(SLJIT_OVERFLOW)
@@ -1344,70 +1533,74 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_la
 #define SLJIT_SET_CARRY			SLJIT_SET(SLJIT_CARRY)
 #define SLJIT_NOT_CARRY			13
 
+#define SLJIT_ATOMIC_STORED		14
+#define SLJIT_SET_ATOMIC_STORED		SLJIT_SET(SLJIT_ATOMIC_STORED)
+#define SLJIT_ATOMIC_NOT_STORED		15
+
 /* Basic floating point comparison types.
 
    Note: when the comparison result is unordered, their behaviour is unspecified. */
 
-#define SLJIT_F_EQUAL				14
+#define SLJIT_F_EQUAL				16
 #define SLJIT_SET_F_EQUAL			SLJIT_SET(SLJIT_F_EQUAL)
-#define SLJIT_F_NOT_EQUAL			15
-#define SLJIT_SET_F_NOT_EQUAL			SLJIT_SET(SLJIT_F_NOT_EQUAL)
-#define SLJIT_F_LESS				16
+#define SLJIT_F_NOT_EQUAL			17
+#define SLJIT_SET_F_NOT_EQUAL			SLJIT_SET(SLJIT_F_EQUAL)
+#define SLJIT_F_LESS				18
 #define SLJIT_SET_F_LESS			SLJIT_SET(SLJIT_F_LESS)
-#define SLJIT_F_GREATER_EQUAL			17
-#define SLJIT_SET_F_GREATER_EQUAL		SLJIT_SET(SLJIT_F_GREATER_EQUAL)
-#define SLJIT_F_GREATER				18
+#define SLJIT_F_GREATER_EQUAL			19
+#define SLJIT_SET_F_GREATER_EQUAL		SLJIT_SET(SLJIT_F_LESS)
+#define SLJIT_F_GREATER				20
 #define SLJIT_SET_F_GREATER			SLJIT_SET(SLJIT_F_GREATER)
-#define SLJIT_F_LESS_EQUAL			19
-#define SLJIT_SET_F_LESS_EQUAL			SLJIT_SET(SLJIT_F_LESS_EQUAL)
+#define SLJIT_F_LESS_EQUAL			21
+#define SLJIT_SET_F_LESS_EQUAL			SLJIT_SET(SLJIT_F_GREATER)
 
 /* Jumps when either argument contains a NaN value. */
-#define SLJIT_UNORDERED				20
+#define SLJIT_UNORDERED				22
 #define SLJIT_SET_UNORDERED			SLJIT_SET(SLJIT_UNORDERED)
 /* Jumps when neither argument contains a NaN value. */
-#define SLJIT_ORDERED				21
-#define SLJIT_SET_ORDERED			SLJIT_SET(SLJIT_ORDERED)
+#define SLJIT_ORDERED				23
+#define SLJIT_SET_ORDERED			SLJIT_SET(SLJIT_UNORDERED)
 
 /* Ordered / unordered floating point comparison types.
 
    Note: each comparison type has an ordered and unordered form. Some
          architectures supports only either of them (see: sljit_cmp_info). */
 
-#define SLJIT_ORDERED_EQUAL			22
+#define SLJIT_ORDERED_EQUAL			24
 #define SLJIT_SET_ORDERED_EQUAL			SLJIT_SET(SLJIT_ORDERED_EQUAL)
-#define SLJIT_UNORDERED_OR_NOT_EQUAL		23
-#define SLJIT_SET_UNORDERED_OR_NOT_EQUAL	SLJIT_SET(SLJIT_UNORDERED_OR_NOT_EQUAL)
-#define SLJIT_ORDERED_LESS			24
+#define SLJIT_UNORDERED_OR_NOT_EQUAL		25
+#define SLJIT_SET_UNORDERED_OR_NOT_EQUAL	SLJIT_SET(SLJIT_ORDERED_EQUAL)
+#define SLJIT_ORDERED_LESS			26
 #define SLJIT_SET_ORDERED_LESS			SLJIT_SET(SLJIT_ORDERED_LESS)
-#define SLJIT_UNORDERED_OR_GREATER_EQUAL	25
-#define SLJIT_SET_UNORDERED_OR_GREATER_EQUAL	SLJIT_SET(SLJIT_UNORDERED_OR_GREATER_EQUAL)
-#define SLJIT_ORDERED_GREATER			26
+#define SLJIT_UNORDERED_OR_GREATER_EQUAL	27
+#define SLJIT_SET_UNORDERED_OR_GREATER_EQUAL	SLJIT_SET(SLJIT_ORDERED_LESS)
+#define SLJIT_ORDERED_GREATER			28
 #define SLJIT_SET_ORDERED_GREATER		SLJIT_SET(SLJIT_ORDERED_GREATER)
-#define SLJIT_UNORDERED_OR_LESS_EQUAL		27
-#define SLJIT_SET_UNORDERED_OR_LESS_EQUAL	SLJIT_SET(SLJIT_UNORDERED_OR_LESS_EQUAL)
+#define SLJIT_UNORDERED_OR_LESS_EQUAL		29
+#define SLJIT_SET_UNORDERED_OR_LESS_EQUAL	SLJIT_SET(SLJIT_ORDERED_GREATER)
 
-#define SLJIT_UNORDERED_OR_EQUAL		28
+#define SLJIT_UNORDERED_OR_EQUAL		30
 #define SLJIT_SET_UNORDERED_OR_EQUAL		SLJIT_SET(SLJIT_UNORDERED_OR_EQUAL)
-#define SLJIT_ORDERED_NOT_EQUAL			29
-#define SLJIT_SET_ORDERED_NOT_EQUAL		SLJIT_SET(SLJIT_ORDERED_NOT_EQUAL)
-#define SLJIT_UNORDERED_OR_LESS			30
+#define SLJIT_ORDERED_NOT_EQUAL			31
+#define SLJIT_SET_ORDERED_NOT_EQUAL		SLJIT_SET(SLJIT_UNORDERED_OR_EQUAL)
+#define SLJIT_UNORDERED_OR_LESS			32
 #define SLJIT_SET_UNORDERED_OR_LESS		SLJIT_SET(SLJIT_UNORDERED_OR_LESS)
-#define SLJIT_ORDERED_GREATER_EQUAL		31
-#define SLJIT_SET_ORDERED_GREATER_EQUAL		SLJIT_SET(SLJIT_ORDERED_GREATER_EQUAL)
-#define SLJIT_UNORDERED_OR_GREATER		32
+#define SLJIT_ORDERED_GREATER_EQUAL		33
+#define SLJIT_SET_ORDERED_GREATER_EQUAL		SLJIT_SET(SLJIT_UNORDERED_OR_LESS)
+#define SLJIT_UNORDERED_OR_GREATER		34
 #define SLJIT_SET_UNORDERED_OR_GREATER		SLJIT_SET(SLJIT_UNORDERED_OR_GREATER)
-#define SLJIT_ORDERED_LESS_EQUAL		33
-#define SLJIT_SET_ORDERED_LESS_EQUAL		SLJIT_SET(SLJIT_ORDERED_LESS_EQUAL)
+#define SLJIT_ORDERED_LESS_EQUAL		35
+#define SLJIT_SET_ORDERED_LESS_EQUAL		SLJIT_SET(SLJIT_UNORDERED_OR_GREATER)
 
 /* Unconditional jump types. */
-#define SLJIT_JUMP			34
-/* Fast calling method. See sljit_emit_fast_enter / SLJIT_FAST_RETURN. */
-#define SLJIT_FAST_CALL			35
+#define SLJIT_JUMP			36
+/* Fast calling method. See the description above. */
+#define SLJIT_FAST_CALL			37
 /* Default C calling convention. */
-#define SLJIT_CALL			36
+#define SLJIT_CALL			38
 /* Called function must be compiled by SLJIT.
    See SLJIT_ENTER_REG_ARG option. */
-#define SLJIT_CALL_REG_ARG		37
+#define SLJIT_CALL_REG_ARG		39
 
 /* The target can be changed during runtime (see: sljit_set_jump_addr). */
 #define SLJIT_REWRITABLE_JUMP		0x1000
@@ -1497,19 +1690,42 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 type);
 
-/* Emit a conditional mov instruction which moves source to destination,
-   if the condition is satisfied. Unlike other arithmetic operations this
-   instruction does not support memory access.
+/* Emit a conditional select instruction which moves src1 to dst_reg,
+   if the condition is satisfied, or src2_reg to dst_reg otherwise.
 
    type must be between SLJIT_EQUAL and SLJIT_ORDERED_LESS_EQUAL
-   type can be combined (or'ed) with SLJIT_32
-   dst_reg must be a valid register
-   src must be a valid register or immediate (SLJIT_IMM)
+   type can be combined (or'ed) with SLJIT_32 to move 32 bit
+       register values instead of word sized ones
+   dst_reg and src2_reg must be valid registers
+   src1 must be valid operand
+
+   Note: if src1 is a memory operand, its value
+         might be loaded even if the condition is false.
 
    Flags: - (does not modify flags) */
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 dst_reg,
-	sljit_s32 src, sljit_sw srcw);
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_reg);
+
+/* Emit a conditional floating point select instruction which moves
+   src1 to dst_reg, if the condition is satisfied, or src2_reg to
+   dst_reg otherwise.
+
+   type must be between SLJIT_EQUAL and SLJIT_ORDERED_LESS_EQUAL
+   type can be combined (or'ed) with SLJIT_32 to move 32 bit
+       floating point values instead of 64 bit ones
+   dst_freg and src2_freg must be valid floating point registers
+   src1 must be valid operand
+
+   Note: if src1 is a memory operand, its value
+         might be loaded even if the condition is false.
+
+   Flags: - (does not modify flags) */
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_freg);
 
 /* The following flags are used by sljit_emit_mem(), sljit_emit_mem_update(),
    sljit_emit_fmem(), and sljit_emit_fmem_update(). */
@@ -1524,9 +1740,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 /* Load or stora data from an unaligned (byte aligned) address. */
 #define SLJIT_MEM_UNALIGNED	0x000400
 /* Load or stora data from a 16 bit aligned address. */
-#define SLJIT_MEM_UNALIGNED_16	0x000800
+#define SLJIT_MEM_ALIGNED_16	0x000800
 /* Load or stora data from a 32 bit aligned address. */
-#define SLJIT_MEM_UNALIGNED_32	0x001000
+#define SLJIT_MEM_ALIGNED_32	0x001000
 
 /* The following flags are used by sljit_emit_mem_update(),
    and sljit_emit_fmem_update(). */
@@ -1544,8 +1760,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 /* The sljit_emit_mem emits instructions for various memory operations:
 
-   When SLJIT_MEM_UNALIGNED / SLJIT_MEM_UNALIGNED_16 /
-        SLJIT_MEM_UNALIGNED_32 is set in type argument:
+   When SLJIT_MEM_UNALIGNED / SLJIT_MEM_ALIGNED_16 /
+        SLJIT_MEM_ALIGNED_32 is set in type argument:
      Emit instructions for unaligned memory loads or stores. When
      SLJIT_UNALIGNED is not defined, the only way to access unaligned
      memory data is using sljit_emit_mem. Otherwise all operations (e.g.
@@ -1560,8 +1776,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
      location specified by the mem/memw arguments, and the end address
      of this operation is the starting address of the data transfer
      between the second register and memory. The type argument must
-     be SLJIT_MOV. The SLJIT_MEM_UNALIGNED* options are allowed for
-     this operation.
+     be SLJIT_MOV. The SLJIT_MEM_UNALIGNED / SLJIT_MEM_ALIGNED_*
+     options are allowed for this operation.
 
    type must be between SLJIT_MOV and SLJIT_MOV_P and can be
      combined (or'ed) with SLJIT_MEM_* flags
@@ -1625,6 +1841,286 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	sljit_s32 freg,
 	sljit_s32 mem, sljit_sw memw);
 
+/* The following options are used by several simd operations. */
+
+/* Load data into a simd register, this is the default */
+#define SLJIT_SIMD_LOAD			0x000000
+/* Store data from a simd register */
+#define SLJIT_SIMD_STORE		0x000001
+/* The simd register contains floating point values */
+#define SLJIT_SIMD_FLOAT		0x000400
+/* Tests whether the operation is available */
+#define SLJIT_SIMD_TEST			0x000800
+/* Move data to/from a 64 bit (8 byte) long SIMD register */
+#define SLJIT_SIMD_REG_64		(3 << 12)
+/* Move data to/from a 128 bit (16 byte) long SIMD register */
+#define SLJIT_SIMD_REG_128		(4 << 12)
+/* Move data to/from a 256 bit (32 byte) long SIMD register */
+#define SLJIT_SIMD_REG_256		(5 << 12)
+/* Move data to/from a 512 bit (64 byte) long SIMD register */
+#define SLJIT_SIMD_REG_512		(6 << 12)
+/* Element size is 8 bit long (this is the default), usually cannot be combined with SLJIT_SIMD_FLOAT */
+#define SLJIT_SIMD_ELEM_8		(0 << 18)
+/* Element size is 16 bit long, usually cannot be combined with SLJIT_SIMD_FLOAT */
+#define SLJIT_SIMD_ELEM_16		(1 << 18)
+/* Element size is 32 bit long */
+#define SLJIT_SIMD_ELEM_32		(2 << 18)
+/* Element size is 64 bit long */
+#define SLJIT_SIMD_ELEM_64		(3 << 18)
+/* Element size is 128 bit long */
+#define SLJIT_SIMD_ELEM_128		(4 << 18)
+/* Element size is 256 bit long */
+#define SLJIT_SIMD_ELEM_256		(5 << 18)
+
+/* The following options are used by sljit_emit_simd_mov(). */
+
+/* Memory address is unaligned (this is the default) */
+#define SLJIT_SIMD_MEM_UNALIGNED	(0 << 24)
+/* Memory address is 16 bit aligned */
+#define SLJIT_SIMD_MEM_ALIGNED_16	(1 << 24)
+/* Memory address is 32 bit aligned */
+#define SLJIT_SIMD_MEM_ALIGNED_32	(2 << 24)
+/* Memory address is 64 bit aligned */
+#define SLJIT_SIMD_MEM_ALIGNED_64	(3 << 24)
+/* Memory address is 128 bit aligned */
+#define SLJIT_SIMD_MEM_ALIGNED_128	(4 << 24)
+/* Memory address is 256 bit aligned */
+#define SLJIT_SIMD_MEM_ALIGNED_256	(5 << 24)
+/* Memory address is 512 bit aligned */
+#define SLJIT_SIMD_MEM_ALIGNED_512	(6 << 24)
+
+/* Moves data between a simd register and memory.
+
+   If the operation is not supported, it returns with
+   SLJIT_ERR_UNSUPPORTED. If SLJIT_SIMD_TEST is passed,
+   it does not emit any instructions.
+
+   type must be a combination of SLJIT_SIMD_* and
+     SLJIT_SIMD_MEM_* options
+   freg is the source or destination simd register
+     of the operation
+   srcdst must be a memory operand or a simd register
+
+   Note:
+       The alignment and element size must be
+       less or equal than simd register size.
+
+   Flags: - (does not modify flags) */
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 srcdst, sljit_sw srcdstw);
+
+/* Replicates a scalar value to all lanes of a simd
+   register.
+
+   If the operation is not supported, it returns with
+   SLJIT_ERR_UNSUPPORTED. If SLJIT_SIMD_TEST is passed,
+   it does not emit any instructions.
+
+   type must be a combination of SLJIT_SIMD_* options
+     except SLJIT_SIMD_STORE.
+   freg is the destination simd register of the operation
+   src is the value which is replicated
+
+   Note:
+       The src == SLJIT_IMM and srcw == 0 can be used to
+       clear a register even when SLJIT_SIMD_FLOAT is set.
+
+   Flags: - (does not modify flags) */
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_sw srcw);
+
+/* The following options are used by sljit_emit_simd_lane_mov(). */
+
+/* Clear all bits of the simd register before loading the lane. */
+#define SLJIT_SIMD_LANE_ZERO		0x000002
+/* Sign extend the integer value stored from the lane. */
+#define SLJIT_SIMD_LANE_SIGNED		0x000004
+
+/* Moves data between a simd register lane and a register or
+   memory. If the srcdst argument is a register, it must be
+   a floating point register when SLJIT_SIMD_FLOAT is specified,
+   or a general purpose register otherwise.
+
+   If the operation is not supported, it returns with
+   SLJIT_ERR_UNSUPPORTED. If SLJIT_SIMD_TEST is passed,
+   it does not emit any instructions.
+
+   type must be a combination of SLJIT_SIMD_* options
+     Further options:
+       SLJIT_32 - when SLJIT_SIMD_FLOAT is not set
+       SLJIT_SIMD_LANE_SIGNED - when SLJIT_SIMD_STORE
+           is set and SLJIT_SIMD_FLOAT is not set
+       SLJIT_SIMD_LANE_ZERO - when SLJIT_SIMD_LOAD
+           is specified
+   freg is the source or destination simd register
+     of the operation
+   lane_index is the index of the lane
+   srcdst is the destination operand for loads, and
+     source operand for stores
+
+   Note:
+       The elem size must be lower than register size.
+
+   Flags: - (does not modify flags) */
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg, sljit_s32 lane_index,
+	sljit_s32 srcdst, sljit_sw srcdstw);
+
+/* Replicates a scalar value from a lane to all lanes
+   of a simd register.
+
+   If the operation is not supported, it returns with
+   SLJIT_ERR_UNSUPPORTED. If SLJIT_SIMD_TEST is passed,
+   it does not emit any instructions.
+
+   type must be a combination of SLJIT_SIMD_* options
+     except SLJIT_SIMD_STORE.
+   freg is the destination simd register of the operation
+   src is the simd register which lane is replicated
+   src_lane_index is the lane index of the src register
+
+   Flags: - (does not modify flags) */
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_s32 src_lane_index);
+
+/* The following options are used by sljit_emit_simd_load_extend(). */
+
+/* Sign extend the integer elements */
+#define SLJIT_SIMD_EXTEND_SIGNED	0x000002
+/* Extend data to 16 bit */
+#define SLJIT_SIMD_EXTEND_16		(1 << 24)
+/* Extend data to 32 bit */
+#define SLJIT_SIMD_EXTEND_32		(2 << 24)
+/* Extend data to 64 bit */
+#define SLJIT_SIMD_EXTEND_64		(3 << 24)
+
+/* Extend elements and stores them in a simd register.
+   The extension operation increases the size of the
+   elements (e.g. from 16 bit to 64 bit). For integer
+   values, the extension can be signed or unsigned.
+
+   If the operation is not supported, it returns with
+   SLJIT_ERR_UNSUPPORTED. If SLJIT_SIMD_TEST is passed,
+   it does not emit any instructions.
+
+   type must be a combination of SLJIT_SIMD_*, and
+     SLJIT_SIMD_EXTEND_* options except SLJIT_SIMD_STORE
+   freg is the destination simd register of the operation
+   src must be a memory operand or a simd register.
+     In the latter case, the source elements are stored
+     in the lower half of the register.
+
+   Flags: - (does not modify flags) */
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_sw srcw);
+
+/* Extract the highest bit (usually the sign bit) from
+   each elements of a vector.
+
+   If the operation is not supported, it returns with
+   SLJIT_ERR_UNSUPPORTED. If SLJIT_SIMD_TEST is passed,
+   it does not emit any instructions.
+
+   type must be a combination of SLJIT_SIMD_* and SLJIT_32
+     options except SLJIT_SIMD_LOAD
+   freg is the source simd register of the operation
+   dst is the destination operand
+
+   Flags: - (does not modify flags) */
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 dst, sljit_sw dstw);
+
+/* The following options are used by sljit_emit_simd_op2(). */
+
+/* Binary 'and' operation */
+#define SLJIT_SIMD_OP2_AND		0x000001
+/* Binary 'or' operation */
+#define SLJIT_SIMD_OP2_OR		0x000002
+/* Binary 'xor' operation */
+#define SLJIT_SIMD_OP2_XOR		0x000003
+
+/* Perform simd operations using simd registers.
+
+   If the operation is not supported, it returns with
+   SLJIT_ERR_UNSUPPORTED. If SLJIT_SIMD_TEST is passed,
+   it does not emit any instructions.
+
+   type must be a combination of SLJIT_SIMD_* and SLJIT_SIMD_OP2_
+     options except SLJIT_SIMD_LOAD and SLJIT_SIMD_STORE
+   dst_freg is the destination register of the operation
+   src1_freg is the first source register of the operation
+   src1_freg is the second source register of the operation
+
+   Flags: - (does not modify flags) */
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg);
+
+/* The sljit_emit_atomic_load and sljit_emit_atomic_store operation pair
+   can perform an atomic read-modify-write operation. First, an unsigned
+   value must be loaded from memory using sljit_emit_atomic_load. Then,
+   the updated value must be written back to the same memory location by
+   sljit_emit_atomic_store. A thread can only perform a single atomic
+   operation at a time.
+
+   Note: atomic operations are experimental, and not implemented
+         for all cpus.
+
+   The following conditions must be satisfied, or the operation
+   is undefined:
+     - the address provided in mem_reg must be divisible by the size of
+       the value (only naturally aligned updates are supported)
+     - no memory writes are allowed between the load and store operations
+       regardless of its target address (currently read operations are
+       allowed, but this might change in the future)
+     - the memory operation (op) and the base address (stored in mem_reg)
+       passed to the load/store operations must be the same (the mem_reg
+       can be a different register, only its value must be the same)
+     - an store must always follow a load for the same transaction.
+
+   op must be between SLJIT_MOV and SLJIT_MOV_P, excluding all
+     signed loads such as SLJIT_MOV32_S16
+   dst_reg is the register where the data will be loaded into
+   mem_reg is the base address of the memory load (it cannot be
+     SLJIT_SP or a virtual register on x86-32)
+
+   Flags: - (does not modify flags) */
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst_reg,
+	sljit_s32 mem_reg);
+
+/* The sljit_emit_atomic_load and sljit_emit_atomic_store operations
+   allows performing an atomic read-modify-write operation. See the
+   description of sljit_emit_atomic_load.
+
+   op must be between SLJIT_MOV and SLJIT_MOV_P, excluding all signed
+     loads such as SLJIT_MOV32_S16
+   src_reg is the register which value is stored into the memory
+   mem_reg is the base address of the memory store (it cannot be
+     SLJIT_SP or a virtual register on x86-32)
+   temp_reg is a not preserved scratch register, which must be
+     initialized with the value loaded into the dst_reg during the
+     corresponding sljit_emit_atomic_load operation, or the operation
+     is undefined
+
+   Flags: ATOMIC_STORED is set if the operation is successful,
+     otherwise the memory remains unchanged. */
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 src_reg,
+	sljit_s32 mem_reg,
+	sljit_s32 temp_reg);
+
 /* Copies the base address of SLJIT_SP + offset to dst. The offset can
    represent the starting address of a value in the local data (stack).
    The offset is not limited by the local data limits, it can be any value.
@@ -1665,30 +2161,39 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_
 /*  CPU specific functions                                               */
 /* --------------------------------------------------------------------- */
 
+/* Types for sljit_get_register_index */
+
+/* General purpose (integer) registers. */
+#define SLJIT_GP_REGISTER 0
+/* Floating point registers. */
+#define SLJIT_FLOAT_REGISTER 1
+
 /* The following function is a helper function for sljit_emit_op_custom.
-   It returns with the real machine register index ( >=0 ) of any SLJIT_R,
-   SLJIT_S and SLJIT_SP registers.
+   It returns with the real machine register index ( >=0 ) of any registers.
 
-   Note: it returns with -1 for virtual registers (only on x86-32). */
+   When type is SLJIT_GP_REGISTER:
+      reg must be an SLJIT_R(i), SLJIT_S(i), or SLJIT_SP register
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg);
+   When type is SLJIT_FLOAT_REGISTER:
+      reg must be an SLJIT_FR(i) or SLJIT_FS(i) register
 
-/* The following function is a helper function for sljit_emit_op_custom.
-   It returns with the real machine register ( >= 0 ) index of any SLJIT_FR,
-   and SLJIT_FS register.
+   When type is SLJIT_SIMD_REG_64 / 128 / 256 / 512 :
+      reg must be an SLJIT_FR(i) or SLJIT_FS(i) register
 
-   Note: the index is always an even number on ARM-32, MIPS. */
+   Note: it returns with -1 for unknown registers, such as virtual
+         registers on x86-32 or unsupported simd registers. */
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg);
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg);
 
 /* Any instruction can be inserted into the instruction stream by
    sljit_emit_op_custom. It has a similar purpose as inline assembly.
    The size parameter must match to the instruction size of the target
    architecture:
 
-         x86: 0 < size <= 15. The instruction argument can be byte aligned.
+         x86: 0 < size <= 15, the instruction argument can be byte aligned.
       Thumb2: if size == 2, the instruction argument must be 2 byte aligned.
               if size == 4, the instruction argument must be 4 byte aligned.
+       s390x: size can be 2, 4, or 6, the instruction argument can be byte aligned.
    Otherwise: size must be 4 and instruction argument must be 4 byte aligned. */
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
@@ -1725,7 +2230,8 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_
    to know the type of the code generator. */
 SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void);
 
-/* Portable helper function to get an offset of a member. */
+/* Portable helper function to get an offset of a member.
+   Same as offsetof() macro defined in stddef.h */
 #define SLJIT_OFFSETOF(base, member) ((sljit_sw)(&((base*)0x10)->member) - 0x10)
 
 #if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK)
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeARM_32.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeARM_32.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeARM_32.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeARM_32.c	2024-11-20 13:56:33.000000000 +0000
@@ -34,13 +34,16 @@ SLJIT_API_FUNC_ATTRIBUTE const char* slj
 {
 #if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
 	return "ARMv7" SLJIT_CPUINFO ARM_ABI_INFO;
-#elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
-	return "ARMv5" SLJIT_CPUINFO ARM_ABI_INFO;
+#elif (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
+	return "ARMv6" SLJIT_CPUINFO ARM_ABI_INFO;
 #else
 #error "Internal error: Unknown ARM architecture"
 #endif
 }
 
+/* Length of an instruction word. */
+typedef sljit_u32 sljit_ins;
+
 /* Last register + 1. */
 #define TMP_REG1	(SLJIT_NUMBER_OF_REGISTERS + 2)
 #define TMP_REG2	(SLJIT_NUMBER_OF_REGISTERS + 3)
@@ -55,27 +58,39 @@ SLJIT_API_FUNC_ATTRIBUTE const char* slj
 #define CONST_POOL_EMPTY	0xffffffff
 
 #define ALIGN_INSTRUCTION(ptr) \
-	(sljit_uw*)(((sljit_uw)(ptr) + (CONST_POOL_ALIGNMENT * sizeof(sljit_uw)) - 1) & ~((CONST_POOL_ALIGNMENT * sizeof(sljit_uw)) - 1))
+	(sljit_ins*)(((sljit_ins)(ptr) + (CONST_POOL_ALIGNMENT * sizeof(sljit_ins)) - 1) & ~((CONST_POOL_ALIGNMENT * sizeof(sljit_ins)) - 1))
 #define MAX_DIFFERENCE(max_diff) \
-	(((max_diff) / (sljit_s32)sizeof(sljit_uw)) - (CONST_POOL_ALIGNMENT - 1))
+	(((max_diff) / (sljit_s32)sizeof(sljit_ins)) - (CONST_POOL_ALIGNMENT - 1))
 
 /* See sljit_emit_enter and sljit_emit_op0 if you want to change them. */
 static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = {
 	0, 0, 1, 2, 3, 11, 10, 9, 8, 7, 6, 5, 4, 13, 12, 14, 15
 };
 
-static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = {
-	0, 0, 1, 2, 3, 4, 5, 15, 14, 13, 12, 11, 10, 9, 8, 6, 7
+static const sljit_u8 freg_map[((SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) << 1) + 1] = {
+	0,
+	0, 1, 2, 3, 4, 5, 15, 14, 13, 12, 11, 10, 9, 8,
+	7, 6,
+	0, 1, 2, 3, 4, 5, 15, 14, 13, 12, 11, 10, 9, 8,
+	7, 6
+};
+
+static const sljit_u8 freg_ebit_map[((SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) << 1) + 1] = {
+	0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1
 };
 
-#define RM(rm) ((sljit_uw)reg_map[rm])
-#define RM8(rm) ((sljit_uw)reg_map[rm] << 8)
-#define RD(rd) ((sljit_uw)reg_map[rd] << 12)
-#define RN(rn) ((sljit_uw)reg_map[rn] << 16)
-
-#define VM(rm) ((sljit_uw)freg_map[rm])
-#define VD(rd) ((sljit_uw)freg_map[rd] << 12)
-#define VN(rn) ((sljit_uw)freg_map[rn] << 16)
+#define RM(rm) ((sljit_ins)reg_map[rm])
+#define RM8(rm) ((sljit_ins)reg_map[rm] << 8)
+#define RD(rd) ((sljit_ins)reg_map[rd] << 12)
+#define RN(rn) ((sljit_ins)reg_map[rn] << 16)
+
+#define VM(vm) (((sljit_ins)freg_map[vm]) | ((sljit_ins)freg_ebit_map[vm] << 5))
+#define VD(vd) (((sljit_ins)freg_map[vd] << 12) | ((sljit_ins)freg_ebit_map[vd] << 22))
+#define VN(vn) (((sljit_ins)freg_map[vn] << 16) | ((sljit_ins)freg_ebit_map[vn] << 7))
 
 /* --------------------------------------------------------------------- */
 /*  Instrucion forms                                                     */
@@ -92,16 +107,19 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define AND		0xe0000000
 #define B		0xea000000
 #define BIC		0xe1c00000
+#define BKPT		0xe1200070
 #define BL		0xeb000000
 #define BLX		0xe12fff30
 #define BX		0xe12fff10
 #define CLZ		0xe16f0f10
 #define CMN		0xe1600000
 #define CMP		0xe1400000
-#define BKPT		0xe1200070
 #define EOR		0xe0200000
 #define LDR		0xe5100000
 #define LDR_POST	0xe4100000
+#define LDREX		0xe1900f9f
+#define LDREXB		0xe1d00f9f
+#define LDREXH		0xe1f00f9f
 #define MOV		0xe1a00000
 #define MUL		0xe0000090
 #define MVN		0xe1e00000
@@ -109,50 +127,89 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define ORR		0xe1800000
 #define PUSH		0xe92d0000
 #define POP		0xe8bd0000
-#define RBIT		0xe6ff0f30
+#define REV		0xe6bf0f30
+#define REV16		0xe6bf0fb0
 #define RSB		0xe0600000
 #define RSC		0xe0e00000
 #define SBC		0xe0c00000
 #define SMULL		0xe0c00090
 #define STR		0xe5000000
+#define STREX		0xe1800f90
+#define STREXB		0xe1c00f90
+#define STREXH		0xe1e00f90
 #define SUB		0xe0400000
+#define SXTB		0xe6af0070
+#define SXTH		0xe6bf0070
 #define TST		0xe1000000
 #define UMULL		0xe0800090
+#define UXTB		0xe6ef0070
+#define UXTH		0xe6ff0070
 #define VABS_F32	0xeeb00ac0
 #define VADD_F32	0xee300a00
+#define VAND		0xf2000110
 #define VCMP_F32	0xeeb40a40
 #define VCVT_F32_S32	0xeeb80ac0
+#define VCVT_F32_U32	0xeeb80a40
 #define VCVT_F64_F32	0xeeb70ac0
 #define VCVT_S32_F32	0xeebd0ac0
 #define VDIV_F32	0xee800a00
+#define VDUP		0xee800b10
+#define VDUP_s		0xf3b00c00
+#define VEOR		0xf3000110
+#define VLD1		0xf4200000
+#define VLD1_r		0xf4a00c00
+#define VLD1_s		0xf4a00000
 #define VLDR_F32	0xed100a00
 #define VMOV_F32	0xeeb00a40
 #define VMOV		0xee000a10
 #define VMOV2		0xec400a10
+#define VMOV_i		0xf2800010
+#define VMOV_s		0xee000b10
+#define VMOVN		0xf3b20200
 #define VMRS		0xeef1fa10
 #define VMUL_F32	0xee200a00
 #define VNEG_F32	0xeeb10a40
+#define VORR		0xf2200110
 #define VPOP		0xecbd0b00
 #define VPUSH		0xed2d0b00
+#define VSHLL		0xf2800a10
+#define VSHR		0xf2800010
+#define VSRA		0xf2800110
+#define VST1		0xf4000000
+#define VST1_s		0xf4800000
 #define VSTR_F32	0xed000a00
 #define VSUB_F32	0xee300a40
 
 #if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
 /* Arm v7 specific instructions. */
-#define MOVW		0xe3000000
 #define MOVT		0xe3400000
-#define SXTB		0xe6af0070
-#define SXTH		0xe6bf0070
-#define UXTB		0xe6ef0070
-#define UXTH		0xe6ff0070
+#define MOVW		0xe3000000
+#define RBIT		0xe6ff0f30
 #endif
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+
+static sljit_s32 function_check_is_freg(struct sljit_compiler *compiler, sljit_s32 fr, sljit_s32 is_32)
+{
+	if (compiler->scratches == -1)
+		return 0;
+
+	if (is_32 && fr >= SLJIT_F64_SECOND(SLJIT_FR0))
+		fr -= SLJIT_F64_SECOND(0);
+
+	return (fr >= SLJIT_FR0 && fr < (SLJIT_FR0 + compiler->fscratches))
+		|| (fr > (SLJIT_FS0 - compiler->fsaveds) && fr <= SLJIT_FS0)
+		|| (fr >= SLJIT_TMP_FREGISTER_BASE && fr < (SLJIT_TMP_FREGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS));
+}
+
+#endif /* SLJIT_ARGUMENT_CHECKS */
+
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 
 static sljit_s32 push_cpool(struct sljit_compiler *compiler)
 {
 	/* Pushing the constant pool into the instruction stream. */
-	sljit_uw* inst;
+	sljit_ins* inst;
 	sljit_uw* cpool_ptr;
 	sljit_uw* cpool_end;
 	sljit_s32 i;
@@ -162,13 +219,13 @@ static sljit_s32 push_cpool(struct sljit
 		compiler->last_label->size += compiler->cpool_fill + (CONST_POOL_ALIGNMENT - 1) + 1;
 
 	SLJIT_ASSERT(compiler->cpool_fill > 0 && compiler->cpool_fill <= CPOOL_SIZE);
-	inst = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw));
+	inst = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));
 	FAIL_IF(!inst);
 	compiler->size++;
 	*inst = 0xff000000 | compiler->cpool_fill;
 
 	for (i = 0; i < CONST_POOL_ALIGNMENT - 1; i++) {
-		inst = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw));
+		inst = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));
 		FAIL_IF(!inst);
 		compiler->size++;
 		*inst = 0;
@@ -177,7 +234,7 @@ static sljit_s32 push_cpool(struct sljit
 	cpool_ptr = compiler->cpool;
 	cpool_end = cpool_ptr + compiler->cpool_fill;
 	while (cpool_ptr < cpool_end) {
-		inst = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw));
+		inst = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));
 		FAIL_IF(!inst);
 		compiler->size++;
 		*inst = *cpool_ptr++;
@@ -187,23 +244,23 @@ static sljit_s32 push_cpool(struct sljit
 	return SLJIT_SUCCESS;
 }
 
-static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_uw inst)
+static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins inst)
 {
-	sljit_uw* ptr;
+	sljit_ins* ptr;
 
 	if (SLJIT_UNLIKELY(compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4092)))
 		FAIL_IF(push_cpool(compiler));
 
-	ptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw));
+	ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));
 	FAIL_IF(!ptr);
 	compiler->size++;
 	*ptr = inst;
 	return SLJIT_SUCCESS;
 }
 
-static sljit_s32 push_inst_with_literal(struct sljit_compiler *compiler, sljit_uw inst, sljit_uw literal)
+static sljit_s32 push_inst_with_literal(struct sljit_compiler *compiler, sljit_ins inst, sljit_uw literal)
 {
-	sljit_uw* ptr;
+	sljit_ins* ptr;
 	sljit_uw cpool_index = CPOOL_SIZE;
 	sljit_uw* cpool_ptr;
 	sljit_uw* cpool_end;
@@ -239,7 +296,7 @@ static sljit_s32 push_inst_with_literal(
 	}
 
 	SLJIT_ASSERT((inst & 0xfff) == 0);
-	ptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw));
+	ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));
 	FAIL_IF(!ptr);
 	compiler->size++;
 	*ptr = inst | cpool_index;
@@ -251,14 +308,15 @@ static sljit_s32 push_inst_with_literal(
 	return SLJIT_SUCCESS;
 }
 
-static sljit_s32 push_inst_with_unique_literal(struct sljit_compiler *compiler, sljit_uw inst, sljit_uw literal)
+static sljit_s32 push_inst_with_unique_literal(struct sljit_compiler *compiler, sljit_ins inst, sljit_uw literal)
 {
-	sljit_uw* ptr;
+	sljit_ins* ptr;
+
 	if (SLJIT_UNLIKELY((compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4092)) || compiler->cpool_fill >= CPOOL_SIZE))
 		FAIL_IF(push_cpool(compiler));
 
 	SLJIT_ASSERT(compiler->cpool_fill < CPOOL_SIZE && (inst & 0xfff) == 0);
-	ptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw));
+	ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));
 	FAIL_IF(!ptr);
 	compiler->size++;
 	*ptr = inst | compiler->cpool_fill;
@@ -305,7 +363,7 @@ static sljit_uw patch_pc_relative_loads(
 
 	while (last_pc_patch < code_ptr) {
 		/* Data transfer instruction with Rn == r15. */
-		if ((*last_pc_patch & 0x0c0f0000) == 0x040f0000) {
+		if ((*last_pc_patch & 0x0e0f0000) == 0x040f0000) {
 			diff = (sljit_uw)(const_pool - last_pc_patch);
 			ind = (*last_pc_patch) & 0xfff;
 
@@ -395,11 +453,11 @@ static sljit_s32 resolve_const_pool_inde
 
 #else
 
-static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_uw inst)
+static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins inst)
 {
-	sljit_uw* ptr;
+	sljit_ins* ptr;
 
-	ptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw));
+	ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));
 	FAIL_IF(!ptr);
 	compiler->size++;
 	*ptr = inst;
@@ -421,7 +479,7 @@ static SLJIT_INLINE sljit_s32 detect_jum
 	if (jump->flags & SLJIT_REWRITABLE_JUMP)
 		return 0;
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 	if (jump->flags & IS_BL)
 		code_ptr--;
 
@@ -449,7 +507,7 @@ static SLJIT_INLINE sljit_s32 detect_jum
 			jump->flags |= PATCH_B;
 		}
 	}
-#else
+#else /* !SLJIT_CONFIG_ARM_V6 */
 	if (jump->flags & JUMP_ADDR)
 		diff = ((sljit_sw)jump->u.target - (sljit_sw)code_ptr - executable_offset);
 	else {
@@ -467,16 +525,16 @@ static SLJIT_INLINE sljit_s32 detect_jum
 		jump->flags |= PATCH_B;
 		return 1;
 	}
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 	return 0;
 }
 
 static SLJIT_INLINE void inline_set_jump_addr(sljit_uw jump_ptr, sljit_sw executable_offset, sljit_uw new_addr, sljit_s32 flush_cache)
 {
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
-	sljit_uw *ptr = (sljit_uw *)jump_ptr;
-	sljit_uw *inst = (sljit_uw *)ptr[0];
-	sljit_uw mov_pc = ptr[1];
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
+	sljit_ins *ptr = (sljit_ins*)jump_ptr;
+	sljit_ins *inst = (sljit_ins*)ptr[0];
+	sljit_ins mov_pc = ptr[1];
 	sljit_s32 bl = (mov_pc & 0x0000f000) != RD(TMP_PC);
 	sljit_sw diff = (sljit_sw)(((sljit_sw)new_addr - (sljit_sw)(inst + 2) - executable_offset) >> 2);
 
@@ -491,7 +549,7 @@ static SLJIT_INLINE void inline_set_jump
 			inst[0] = (mov_pc & COND_MASK) | (B - CONDITIONAL) | (diff & 0xffffff);
 			if (flush_cache) {
 				SLJIT_UPDATE_WX_FLAGS(inst, inst + 1, 1);
-				inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
+				inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
 				SLJIT_CACHE_FLUSH(inst, inst + 1);
 			}
 		} else {
@@ -502,7 +560,7 @@ static SLJIT_INLINE void inline_set_jump
 			inst[1] = NOP;
 			if (flush_cache) {
 				SLJIT_UPDATE_WX_FLAGS(inst, inst + 2, 1);
-				inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
+				inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
 				SLJIT_CACHE_FLUSH(inst, inst + 2);
 			}
 		}
@@ -521,14 +579,14 @@ static SLJIT_INLINE void inline_set_jump
 			if (!bl) {
 				if (flush_cache) {
 					SLJIT_UPDATE_WX_FLAGS(inst, inst + 1, 1);
-					inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
+					inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
 					SLJIT_CACHE_FLUSH(inst, inst + 1);
 				}
 			} else {
 				inst[1] = BLX | RM(TMP_REG1);
 				if (flush_cache) {
 					SLJIT_UPDATE_WX_FLAGS(inst, inst + 2, 1);
-					inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
+					inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
 					SLJIT_CACHE_FLUSH(inst, inst + 2);
 				}
 			}
@@ -544,8 +602,8 @@ static SLJIT_INLINE void inline_set_jump
 			SLJIT_UPDATE_WX_FLAGS(ptr, ptr + 1, 1);
 		}
 	}
-#else
-	sljit_uw *inst = (sljit_uw*)jump_ptr;
+#else /* !SLJIT_CONFIG_ARM_V6 */
+	sljit_ins *inst = (sljit_ins*)jump_ptr;
 
 	SLJIT_UNUSED_ARG(executable_offset);
 
@@ -560,10 +618,10 @@ static SLJIT_INLINE void inline_set_jump
 
 	if (flush_cache) {
 		SLJIT_UPDATE_WX_FLAGS(inst, inst + 2, 1);
-		inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
+		inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
 		SLJIT_CACHE_FLUSH(inst, inst + 2);
 	}
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 }
 
 static sljit_uw get_imm(sljit_uw imm);
@@ -572,9 +630,9 @@ static sljit_s32 emit_op_mem(struct slji
 
 static SLJIT_INLINE void inline_set_const(sljit_uw addr, sljit_sw executable_offset, sljit_uw new_constant, sljit_s32 flush_cache)
 {
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
-	sljit_uw *ptr = (sljit_uw*)addr;
-	sljit_uw *inst = (sljit_uw*)ptr[0];
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
+	sljit_ins *ptr = (sljit_ins*)addr;
+	sljit_ins *inst = (sljit_ins*)ptr[0];
 	sljit_uw ldr_literal = ptr[1];
 	sljit_uw src2;
 
@@ -590,7 +648,7 @@ static SLJIT_INLINE void inline_set_cons
 
 		if (flush_cache) {
 			SLJIT_UPDATE_WX_FLAGS(inst, inst + 1, 1);
-			inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
+			inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
 			SLJIT_CACHE_FLUSH(inst, inst + 1);
 		}
 		return;
@@ -606,7 +664,7 @@ static SLJIT_INLINE void inline_set_cons
 
 		if (flush_cache) {
 			SLJIT_UPDATE_WX_FLAGS(inst, inst + 1, 1);
-			inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
+			inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
 			SLJIT_CACHE_FLUSH(inst, inst + 1);
 		}
 		return;
@@ -626,7 +684,7 @@ static SLJIT_INLINE void inline_set_cons
 
 		if (flush_cache) {
 			SLJIT_UPDATE_WX_FLAGS(inst, inst + 1, 1);
-			inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
+			inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
 			SLJIT_CACHE_FLUSH(inst, inst + 1);
 		}
 	}
@@ -640,8 +698,8 @@ static SLJIT_INLINE void inline_set_cons
 	if (flush_cache) {
 		SLJIT_UPDATE_WX_FLAGS(ptr, ptr + 1, 1);
 	}
-#else
-	sljit_uw *inst = (sljit_uw*)addr;
+#else /* !SLJIT_CONFIG_ARM_V6 */
+	sljit_ins *inst = (sljit_ins*)addr;
 
 	SLJIT_UNUSED_ARG(executable_offset);
 
@@ -656,30 +714,30 @@ static SLJIT_INLINE void inline_set_cons
 
 	if (flush_cache) {
 		SLJIT_UPDATE_WX_FLAGS(inst, inst + 2, 1);
-		inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
+		inst = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
 		SLJIT_CACHE_FLUSH(inst, inst + 2);
 	}
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 }
 
 SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)
 {
 	struct sljit_memory_fragment *buf;
-	sljit_uw *code;
-	sljit_uw *code_ptr;
-	sljit_uw *buf_ptr;
-	sljit_uw *buf_end;
+	sljit_ins *code;
+	sljit_ins *code_ptr;
+	sljit_ins *buf_ptr;
+	sljit_ins *buf_end;
 	sljit_uw size;
 	sljit_uw word_count;
 	sljit_uw next_addr;
 	sljit_sw executable_offset;
 	sljit_uw addr;
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 	sljit_uw cpool_size;
 	sljit_uw cpool_skip_alignment;
 	sljit_uw cpool_current_index;
-	sljit_uw *cpool_start_address;
-	sljit_uw *last_pc_patch;
+	sljit_ins *cpool_start_address;
+	sljit_ins *last_pc_patch;
 	struct future_patch *first_patch;
 #endif
 
@@ -693,25 +751,25 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 	reverse_buf(compiler);
 
 	/* Second code generation pass. */
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 	size = compiler->size + (compiler->patches << 1);
 	if (compiler->cpool_fill > 0)
 		size += compiler->cpool_fill + CONST_POOL_ALIGNMENT - 1;
-#else
+#else /* !SLJIT_CONFIG_ARM_V6 */
 	size = compiler->size;
-#endif
-	code = (sljit_uw*)SLJIT_MALLOC_EXEC(size * sizeof(sljit_uw), compiler->exec_allocator_data);
+#endif /* SLJIT_CONFIG_ARM_V6 */
+	code = (sljit_ins*)SLJIT_MALLOC_EXEC(size * sizeof(sljit_ins), compiler->exec_allocator_data);
 	PTR_FAIL_WITH_EXEC_IF(code);
 	buf = compiler->buf;
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 	cpool_size = 0;
 	cpool_skip_alignment = 0;
 	cpool_current_index = 0;
 	cpool_start_address = NULL;
 	first_patch = NULL;
 	last_pc_patch = code;
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 
 	code_ptr = code;
 	word_count = 0;
@@ -729,11 +787,11 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 	}
 
 	do {
-		buf_ptr = (sljit_uw*)buf->memory;
+		buf_ptr = (sljit_ins*)buf->memory;
 		buf_end = buf_ptr + (buf->used_size >> 2);
 		do {
 			word_count++;
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 			if (cpool_size > 0) {
 				if (cpool_skip_alignment > 0) {
 					buf_ptr++;
@@ -761,7 +819,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 				}
 			}
 			else if ((*buf_ptr & 0xff000000) != PUSH_POOL) {
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 				*code_ptr = *buf_ptr++;
 				if (next_addr == word_count) {
 					SLJIT_ASSERT(!label || label->size >= word_count);
@@ -771,15 +829,15 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 
 				/* These structures are ordered by their address. */
 					if (jump && jump->addr == word_count) {
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 						if (detect_jump_type(jump, code_ptr, code, executable_offset))
 							code_ptr--;
 						jump->addr = (sljit_uw)code_ptr;
-#else
+#else /* !SLJIT_CONFIG_ARM_V6 */
 						jump->addr = (sljit_uw)(code_ptr - 2);
 						if (detect_jump_type(jump, code_ptr, code, executable_offset))
 							code_ptr -= 2;
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 						jump = jump->next;
 					}
 					if (label && label->size == word_count) {
@@ -789,11 +847,11 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 						label = label->next;
 					}
 					if (const_ && const_->addr == word_count) {
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 						const_->addr = (sljit_uw)code_ptr;
-#else
+#else /* !SLJIT_CONFIG_ARM_V6 */
 						const_->addr = (sljit_uw)(code_ptr - 1);
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 						const_ = const_->next;
 					}
 					if (put_label && put_label->addr == word_count) {
@@ -804,9 +862,8 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 					next_addr = compute_next_addr(label, jump, const_, put_label);
 				}
 				code_ptr++;
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
-			}
-			else {
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
+			} else {
 				/* Fortunately, no need to shift. */
 				cpool_size = *buf_ptr++ & ~PUSH_POOL;
 				SLJIT_ASSERT(cpool_size > 0);
@@ -814,14 +871,14 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 				cpool_current_index = patch_pc_relative_loads(last_pc_patch, code_ptr, cpool_start_address, cpool_size);
 				if (cpool_current_index > 0) {
 					/* Unconditional branch. */
-					*code_ptr = B | (((sljit_uw)(cpool_start_address - code_ptr) + cpool_current_index - 2) & ~PUSH_POOL);
-					code_ptr = (sljit_uw*)(cpool_start_address + cpool_current_index);
+					*code_ptr = B | (((sljit_ins)(cpool_start_address - code_ptr) + cpool_current_index - 2) & ~PUSH_POOL);
+					code_ptr = (sljit_ins*)(cpool_start_address + cpool_current_index);
 				}
 				cpool_skip_alignment = CONST_POOL_ALIGNMENT - 1;
 				cpool_current_index = 0;
 				last_pc_patch = code_ptr;
 			}
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 		} while (buf_ptr < buf_end);
 		buf = buf->next;
 	} while (buf);
@@ -831,13 +888,13 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 	SLJIT_ASSERT(!const_);
 	SLJIT_ASSERT(!put_label);
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 	SLJIT_ASSERT(cpool_size == 0);
 	if (compiler->cpool_fill > 0) {
 		cpool_start_address = ALIGN_INSTRUCTION(code_ptr);
 		cpool_current_index = patch_pc_relative_loads(last_pc_patch, code_ptr, cpool_start_address, compiler->cpool_fill);
 		if (cpool_current_index > 0)
-			code_ptr = (sljit_uw*)(cpool_start_address + cpool_current_index);
+			code_ptr = (sljit_ins*)(cpool_start_address + cpool_current_index);
 
 		buf_ptr = compiler->cpool;
 		buf_end = buf_ptr + compiler->cpool_fill;
@@ -857,7 +914,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 
 	jump = compiler->jumps;
 	while (jump) {
-		buf_ptr = (sljit_uw *)jump->addr;
+		buf_ptr = (sljit_ins*)jump->addr;
 
 		if (jump->flags & PATCH_B) {
 			addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr + 2, executable_offset);
@@ -872,18 +929,17 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 			}
 		}
 		else if (jump->flags & SLJIT_REWRITABLE_JUMP) {
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 			jump->addr = (sljit_uw)code_ptr;
-			code_ptr[0] = (sljit_uw)buf_ptr;
+			code_ptr[0] = (sljit_ins)buf_ptr;
 			code_ptr[1] = *buf_ptr;
 			inline_set_jump_addr((sljit_uw)code_ptr, executable_offset, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target, 0);
 			code_ptr += 2;
-#else
+#else /* !SLJIT_CONFIG_ARM_V6 */
 			inline_set_jump_addr((sljit_uw)buf_ptr, executable_offset, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target, 0);
-#endif
-		}
-		else {
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#endif /* SLJIT_CONFIG_ARM_V6 */
+		} else {
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 			if (jump->flags & IS_BL)
 				buf_ptr--;
 			if (*buf_ptr & (1 << 23))
@@ -891,20 +947,20 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 			else
 				buf_ptr += 1;
 			*buf_ptr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target;
-#else
+#else /* !SLJIT_CONFIG_ARM_V6 */
 			inline_set_jump_addr((sljit_uw)buf_ptr, executable_offset, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target, 0);
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 		}
 		jump = jump->next;
 	}
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 	const_ = compiler->consts;
 	while (const_) {
-		buf_ptr = (sljit_uw*)const_->addr;
+		buf_ptr = (sljit_ins*)const_->addr;
 		const_->addr = (sljit_uw)code_ptr;
 
-		code_ptr[0] = (sljit_uw)buf_ptr;
+		code_ptr[0] = (sljit_ins)buf_ptr;
 		code_ptr[1] = *buf_ptr;
 		if (*buf_ptr & (1 << 23))
 			buf_ptr += ((*buf_ptr & 0xfff) >> 2) + 2;
@@ -916,21 +972,21 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 
 		const_ = const_->next;
 	}
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 
 	put_label = compiler->put_labels;
 	while (put_label) {
 		addr = put_label->label->addr;
-		buf_ptr = (sljit_uw*)put_label->addr;
+		buf_ptr = (sljit_ins*)put_label->addr;
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 		SLJIT_ASSERT((buf_ptr[0] & 0xffff0000) == 0xe59f0000);
 		buf_ptr[((buf_ptr[0] & 0xfff) >> 2) + 2] = addr;
-#else
+#else /* !SLJIT_CONFIG_ARM_V6 */
 		SLJIT_ASSERT((buf_ptr[-1] & 0xfff00000) == MOVW && (buf_ptr[0] & 0xfff00000) == MOVT);
 		buf_ptr[-1] |= ((addr << 4) & 0xf0000) | (addr & 0xfff);
 		buf_ptr[0] |= ((addr >> 12) & 0xf0000) | ((addr >> 16) & 0xfff);
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 		put_label = put_label->next;
 	}
 
@@ -940,8 +996,8 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 	compiler->executable_offset = executable_offset;
 	compiler->executable_size = (sljit_uw)(code_ptr - code) * sizeof(sljit_uw);
 
-	code = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset);
-	code_ptr = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
+	code = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(code, executable_offset);
+	code_ptr = (sljit_ins*)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
 
 	SLJIT_CACHE_FLUSH(code, code_ptr);
 	SLJIT_UPDATE_WX_FLAGS(code, code_ptr, 1);
@@ -952,26 +1008,42 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 {
 	switch (feature_type) {
 	case SLJIT_HAS_FPU:
+	case SLJIT_HAS_F64_AS_F32_PAIR:
 #ifdef SLJIT_IS_FPU_AVAILABLE
-		return SLJIT_IS_FPU_AVAILABLE;
+		return (SLJIT_IS_FPU_AVAILABLE) != 0;
 #else
 		/* Available by default. */
 		return 1;
-#endif
+#endif /* SLJIT_IS_FPU_AVAILABLE */
+	case SLJIT_HAS_SIMD:
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
+		return 0;
+#else
+#ifdef SLJIT_IS_FPU_AVAILABLE
+		return (SLJIT_IS_FPU_AVAILABLE) != 0;
+#else
+		/* Available by default. */
+		return 1;
+#endif /* SLJIT_IS_FPU_AVAILABLE */
+#endif /* SLJIT_CONFIG_ARM_V6 */
 
+	case SLJIT_SIMD_REGS_ARE_PAIRS:
 	case SLJIT_HAS_CLZ:
 	case SLJIT_HAS_ROT:
 	case SLJIT_HAS_CMOV:
-#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
-	case SLJIT_HAS_CTZ:
+	case SLJIT_HAS_REV:
 	case SLJIT_HAS_PREFETCH:
-#endif
+	case SLJIT_HAS_COPY_F32:
+	case SLJIT_HAS_COPY_F64:
+	case SLJIT_HAS_ATOMIC:
 		return 1;
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
 	case SLJIT_HAS_CTZ:
+#if defined(SLJIT_CONFIG_ARM_V6) && SLJIT_CONFIG_ARM_V6
 		return 2;
-#endif
+#else
+		return 1;
+#endif /* SLJIT_CONFIG_ARM_V6 */
 
 	default:
 		return 0;
@@ -991,17 +1063,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #define LOAD_DATA	0x08
 
 /* Flag bits for emit_op. */
-#define ALLOW_IMM	0x10
-#define ALLOW_INV_IMM	0x20
-#define ALLOW_ANY_IMM	(ALLOW_IMM | ALLOW_INV_IMM)
-#define ALLOW_NEG_IMM	0x40
+#define ALLOW_IMM		0x10
+#define ALLOW_INV_IMM		0x20
+#define ALLOW_ANY_IMM		(ALLOW_IMM | ALLOW_INV_IMM)
+#define ALLOW_NEG_IMM		0x40
+#define ALLOW_DOUBLE_IMM	0x80
 
 /* s/l - store/load (1 bit)
    u/s - signed/unsigned (1 bit)
    w/b/h/N - word/byte/half/NOT allowed (2 bit)
    Storing signed and unsigned values are the same operations. */
 
-static const sljit_uw data_transfer_insts[16] = {
+static const sljit_ins data_transfer_insts[16] = {
 /* s u w */ 0xe5000000 /* str */,
 /* s u b */ 0xe5400000 /* strb */,
 /* s u h */ 0xe10000b0 /* strh */,
@@ -1022,7 +1095,7 @@ static const sljit_uw data_transfer_inst
 };
 
 #define EMIT_DATA_TRANSFER(type, add, target_reg, base_reg, arg) \
-	(data_transfer_insts[(type) & 0xf] | ((add) << 23) | RD(target_reg) | RN(base_reg) | (sljit_uw)(arg))
+	(data_transfer_insts[(type) & 0xf] | ((add) << 23) | RD(target_reg) | RN(base_reg) | (sljit_ins)(arg))
 
 /* Normal ldr/str instruction.
    Type2: ldrsb, ldrh, ldrsh */
@@ -1032,7 +1105,7 @@ static const sljit_uw data_transfer_inst
 	(((imm) & 0xf) | (((imm) & 0xf0) << 4) | (1 << 22))
 
 #define EMIT_FPU_OPERATION(opcode, mode, dst, src1, src2) \
-	((sljit_uw)(opcode) | (sljit_uw)(mode) | VD(dst) | VM(src1) | VN(src2))
+	((sljit_ins)(opcode) | (sljit_ins)(mode) | VD(dst) | VM(src1) | VN(src2))
 
 /* Flags for emit_op: */
   /* Arguments are swapped. */
@@ -1104,12 +1177,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		}
 
 		if (fsaveds + fscratches >= SLJIT_NUMBER_OF_FLOAT_REGISTERS) {
-			FAIL_IF(push_inst(compiler, VPUSH | VD(SLJIT_FS0) | ((sljit_uw)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1)));
+			FAIL_IF(push_inst(compiler, VPUSH | VD(SLJIT_FS0) | ((sljit_ins)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1)));
 		} else {
 			if (fsaveds > 0)
-				FAIL_IF(push_inst(compiler, VPUSH | VD(SLJIT_FS0) | ((sljit_uw)fsaveds << 1)));
+				FAIL_IF(push_inst(compiler, VPUSH | VD(SLJIT_FS0) | ((sljit_ins)fsaveds << 1)));
 			if (fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG)
-				FAIL_IF(push_inst(compiler, VPUSH | VD(fscratches) | ((sljit_uw)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1)));
+				FAIL_IF(push_inst(compiler, VPUSH | VD(fscratches) | ((sljit_ins)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1)));
 		}
 	}
 
@@ -1138,7 +1211,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 				FAIL_IF(push_inst(compiler, VMOV2 | (offset << 10) | ((offset + sizeof(sljit_sw)) << 14) | float_arg_count));
 			else
 				FAIL_IF(push_inst(compiler, VLDR_F32 | 0x800100 | RN(SLJIT_SP)
-						| (float_arg_count << 12) | ((offset + (sljit_uw)size - 4 * sizeof(sljit_sw)) >> 2)));
+						| (float_arg_count << 12) | ((offset + (sljit_ins)size - 4 * sizeof(sljit_sw)) >> 2)));
 			float_arg_count++;
 			offset += sizeof(sljit_f64) - sizeof(sljit_sw);
 			break;
@@ -1147,7 +1220,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 				FAIL_IF(push_inst(compiler, VMOV | (float_arg_count << 16) | (offset << 10)));
 			else
 				FAIL_IF(push_inst(compiler, VLDR_F32 | 0x800000 | RN(SLJIT_SP)
-						| (float_arg_count << 12) | ((offset + (sljit_uw)size - 4 * sizeof(sljit_sw)) >> 2)));
+						| (float_arg_count << 12) | ((offset + (sljit_ins)size - 4 * sizeof(sljit_sw)) >> 2)));
 			float_arg_count++;
 			break;
 		default:
@@ -1164,7 +1237,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			if (offset < 4 * sizeof(sljit_sw))
 				FAIL_IF(push_inst(compiler, MOV | RD(tmp) | (offset >> 2)));
 			else
-				FAIL_IF(push_inst(compiler, LDR | 0x800000 | RN(SLJIT_SP) | RD(tmp) | (offset + (sljit_uw)size - 4 * sizeof(sljit_sw))));
+				FAIL_IF(push_inst(compiler, LDR | 0x800000 | RN(SLJIT_SP) | RD(tmp) | (offset + (sljit_ins)size - 4 * sizeof(sljit_sw))));
 			break;
 		}
 
@@ -1217,7 +1290,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #endif
 
 	if (local_size > 0)
-		FAIL_IF(emit_op(compiler, SLJIT_SUB, ALLOW_IMM, SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, local_size));
+		FAIL_IF(emit_op(compiler, SLJIT_SUB, ALLOW_IMM | ALLOW_DOUBLE_IMM, SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, local_size));
 
 	return SLJIT_SUCCESS;
 }
@@ -1234,6 +1307,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	size = GET_SAVED_REGISTERS_SIZE(scratches, saveds - SLJIT_KEPT_SAVEDS_COUNT(options), 1);
 
+	/* Doubles are saved, so alignment is unaffected. */
 	if ((size & SSIZE_OF(sw)) != 0 && (fsaveds > 0 || fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG))
 		size += SSIZE_OF(sw);
 
@@ -1245,13 +1319,8 @@ static sljit_s32 emit_add_sp(struct slji
 {
 	sljit_uw imm2 = get_imm(imm);
 
-	if (imm2 == 0) {
-		imm2 = (imm & ~(sljit_uw)0x3ff) >> 10;
-		imm = (imm & 0x3ff) >> 2;
-
-		FAIL_IF(push_inst(compiler, ADD | SRC2_IMM | RD(SLJIT_SP) | RN(SLJIT_SP) | 0xb00 | imm2));
-		return push_inst(compiler, ADD | SRC2_IMM | RD(SLJIT_SP) | RN(SLJIT_SP) | 0xf00 | (imm & 0xff));
-	}
+	if (imm2 == 0)
+		return emit_op(compiler, SLJIT_ADD, ALLOW_IMM | ALLOW_DOUBLE_IMM, SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, (sljit_sw)imm);
 
 	return push_inst(compiler, ADD | RD(SLJIT_SP) | RN(SLJIT_SP) | imm2);
 }
@@ -1274,12 +1343,12 @@ static sljit_s32 emit_stack_frame_releas
 			FAIL_IF(emit_add_sp(compiler, (sljit_uw)local_size));
 
 		if (fsaveds + fscratches >= SLJIT_NUMBER_OF_FLOAT_REGISTERS) {
-			FAIL_IF(push_inst(compiler, VPOP | VD(SLJIT_FS0) | ((sljit_uw)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1)));
+			FAIL_IF(push_inst(compiler, VPOP | VD(SLJIT_FS0) | ((sljit_ins)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1)));
 		} else {
 			if (fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG)
-				FAIL_IF(push_inst(compiler, VPOP | VD(fscratches) | ((sljit_uw)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1)));
+				FAIL_IF(push_inst(compiler, VPOP | VD(fscratches) | ((sljit_ins)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1)));
 			if (fsaveds > 0)
-				FAIL_IF(push_inst(compiler, VPOP | VD(SLJIT_FS0) | ((sljit_uw)fsaveds << 1)));
+				FAIL_IF(push_inst(compiler, VPOP | VD(SLJIT_FS0) | ((sljit_ins)fsaveds << 1)));
 		}
 
 		local_size = GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1) & 0x7;
@@ -1330,10 +1399,10 @@ static sljit_s32 emit_stack_frame_releas
 					if (frame_size == 0)
 						return push_inst(compiler, LDR_POST | RN(SLJIT_SP) | RD(restored_reg) | 0x800008);
 					if (frame_size > 2 * SSIZE_OF(sw))
-						return push_inst(compiler, LDR_POST | RN(SLJIT_SP) | RD(restored_reg) | (sljit_uw)(frame_size - (2 * SSIZE_OF(sw))));
+						return push_inst(compiler, LDR_POST | RN(SLJIT_SP) | RD(restored_reg) | (sljit_ins)(frame_size - (2 * SSIZE_OF(sw))));
 				}
 
-				FAIL_IF(push_inst(compiler, LDR | 0x800000 | RN(SLJIT_SP) | RD(restored_reg) | (sljit_uw)local_size));
+				FAIL_IF(push_inst(compiler, LDR | 0x800000 | RN(SLJIT_SP) | RD(restored_reg) | (sljit_ins)local_size));
 				tmp = 1;
 			} else if (frame_size == 0) {
 				frame_size = (restored_reg == TMP_REG2) ? SSIZE_OF(sw) : 2 * SSIZE_OF(sw);
@@ -1349,7 +1418,7 @@ static sljit_s32 emit_stack_frame_releas
 		local_size += SSIZE_OF(sw);
 
 		if (frame_size > local_size)
-			FAIL_IF(push_inst(compiler, SUB | RD(SLJIT_SP) | RN(SLJIT_SP) | (1 << 25) | (sljit_uw)(frame_size - local_size)));
+			FAIL_IF(push_inst(compiler, SUB | RD(SLJIT_SP) | RN(SLJIT_SP) | (1 << 25) | (sljit_ins)(frame_size - local_size)));
 		else if (frame_size < local_size)
 			FAIL_IF(emit_add_sp(compiler, (sljit_uw)(local_size - frame_size)));
 
@@ -1361,11 +1430,11 @@ static sljit_s32 emit_stack_frame_releas
 			if (restored_reg != TMP_REG2)
 				frame_size -= SSIZE_OF(sw);
 
-			return push_inst(compiler, LDR | 0x800000 | RN(SLJIT_SP) | RD(restored_reg) | (sljit_uw)frame_size);
+			return push_inst(compiler, LDR | 0x800000 | RN(SLJIT_SP) | RD(restored_reg) | (sljit_ins)frame_size);
 		}
 
 		tmp = (restored_reg == TMP_REG2) ? 0x800004 : 0x800008;
-		return push_inst(compiler, LDR_POST | RN(SLJIT_SP) | RD(restored_reg) | (sljit_uw)tmp);
+		return push_inst(compiler, LDR_POST | RN(SLJIT_SP) | RD(restored_reg) | (sljit_ins)tmp);
 	}
 
 	if (local_size > 0)
@@ -1384,7 +1453,7 @@ static sljit_s32 emit_stack_frame_releas
 	FAIL_IF(push_inst(compiler, POP | reg_list));
 
 	if (frame_size > 0)
-		return push_inst(compiler, SUB | RD(SLJIT_SP) | RN(SLJIT_SP) | (1 << 25) | ((sljit_uw)frame_size - sizeof(sljit_sw)));
+		return push_inst(compiler, SUB | RD(SLJIT_SP) | RN(SLJIT_SP) | (1 << 25) | ((sljit_ins)frame_size - sizeof(sljit_sw)));
 
 	if (lr_dst != 0)
 		return SLJIT_SUCCESS;
@@ -1432,7 +1501,7 @@ static SLJIT_INLINE sljit_s32 emit_singl
 	sljit_s32 is_masked;
 	sljit_uw shift_type;
 
-	switch (GET_OPCODE(op)) {
+	switch (op) {
 	case SLJIT_MOV:
 		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));
 		if (dst != src2) {
@@ -1446,17 +1515,10 @@ static SLJIT_INLINE sljit_s32 emit_singl
 	case SLJIT_MOV_U8:
 	case SLJIT_MOV_S8:
 		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));
-		if (flags & MOVE_REG_CONV) {
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
-			if (op == SLJIT_MOV_U8)
-				return push_inst(compiler, AND | RD(dst) | RN(src2) | SRC2_IMM | 0xff);
-			FAIL_IF(push_inst(compiler, MOV | RD(dst) | (24 << 7) | RM(src2)));
-			return push_inst(compiler, MOV | RD(dst) | (24 << 7) | (op == SLJIT_MOV_U8 ? 0x20 : 0x40) | RM(dst));
-#else
+		if (flags & MOVE_REG_CONV)
 			return push_inst(compiler, (op == SLJIT_MOV_U8 ? UXTB : SXTB) | RD(dst) | RM(src2));
-#endif
-		}
-		else if (dst != src2) {
+
+		if (dst != src2) {
 			SLJIT_ASSERT(src2 & SRC2_IMM);
 			return push_inst(compiler, ((flags & INV_IMM) ? MVN : MOV) | RD(dst) | src2);
 		}
@@ -1465,26 +1527,15 @@ static SLJIT_INLINE sljit_s32 emit_singl
 	case SLJIT_MOV_U16:
 	case SLJIT_MOV_S16:
 		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));
-		if (flags & MOVE_REG_CONV) {
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
-			FAIL_IF(push_inst(compiler, MOV | RD(dst) | (16 << 7) | RM(src2)));
-			return push_inst(compiler, MOV | RD(dst) | (16 << 7) | (op == SLJIT_MOV_U16 ? 0x20 : 0x40) | RM(dst));
-#else
+		if (flags & MOVE_REG_CONV)
 			return push_inst(compiler, (op == SLJIT_MOV_U16 ? UXTH : SXTH) | RD(dst) | RM(src2));
-#endif
-		}
-		else if (dst != src2) {
+
+		if (dst != src2) {
 			SLJIT_ASSERT(src2 & SRC2_IMM);
 			return push_inst(compiler, ((flags & INV_IMM) ? MVN : MOV) | RD(dst) | src2);
 		}
 		return SLJIT_SUCCESS;
 
-	case SLJIT_NOT:
-		if (src2 & SRC2_IMM)
-			return push_inst(compiler, ((flags & INV_IMM) ? MOV : MVN) | (flags & SET_FLAGS) | RD(dst) | src2);
-
-		return push_inst(compiler, MVN | (flags & SET_FLAGS) | RD(dst) | RM(src2));
-
 	case SLJIT_CLZ:
 		SLJIT_ASSERT(!(flags & INV_IMM) && !(src2 & SRC2_IMM));
 		FAIL_IF(push_inst(compiler, CLZ | RD(dst) | RM(src2)));
@@ -1493,17 +1544,30 @@ static SLJIT_INLINE sljit_s32 emit_singl
 	case SLJIT_CTZ:
 		SLJIT_ASSERT(!(flags & INV_IMM) && !(src2 & SRC2_IMM));
 		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 		FAIL_IF(push_inst(compiler, RSB | SRC2_IMM | RD(TMP_REG1) | RN(src2) | 0));
 		FAIL_IF(push_inst(compiler, AND | RD(TMP_REG2) | RN(src2) | RM(TMP_REG1)));
 		FAIL_IF(push_inst(compiler, CLZ | RD(dst) | RM(TMP_REG2)));
 		FAIL_IF(push_inst(compiler, CMP | SET_FLAGS | SRC2_IMM | RN(dst) | 32));
 		return push_inst(compiler, (EOR ^ 0xf0000000) | SRC2_IMM | RD(dst) | RN(dst) | 0x1f);
-#else /* !SLJIT_CONFIG_ARM_V5 */
+#else /* !SLJIT_CONFIG_ARM_V6 */
 		FAIL_IF(push_inst(compiler, RBIT | RD(dst) | RM(src2)));
 		return push_inst(compiler, CLZ | RD(dst) | RM(dst));
-#endif /* SLJIT_CONFIG_ARM_V5 */
+#endif /* SLJIT_CONFIG_ARM_V6 */
 
+	case SLJIT_REV:
+	case SLJIT_REV_U32:
+	case SLJIT_REV_S32:
+		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));
+		return push_inst(compiler, REV | RD(dst) | RM(src2));
+
+	case SLJIT_REV_U16:
+	case SLJIT_REV_S16:
+		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED) && src2 != TMP_REG1 && dst != TMP_REG1);
+		FAIL_IF(push_inst(compiler, REV16 | RD(dst) | RM(src2)));
+		if (dst == TMP_REG2 || (src2 == TMP_REG2 && op == SLJIT_REV_U16))
+			return SLJIT_SUCCESS;
+		return push_inst(compiler, (op == SLJIT_REV_U16 ? UXTH : SXTH) | RD(dst) | RM(dst));
 	case SLJIT_ADD:
 		SLJIT_ASSERT(!(flags & INV_IMM));
 
@@ -1534,7 +1598,7 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		SLJIT_ASSERT(!(src2 & SRC2_IMM));
 		compiler->status_flags_state = 0;
 
-		if (!HAS_FLAGS(op))
+		if (!(flags & SET_FLAGS))
 			return push_inst(compiler, MUL | RN(dst) | RM8(src2) | RM(src1));
 
 		FAIL_IF(push_inst(compiler, SMULL | RN(TMP_REG1) | RD(dst) | RM8(src2) | RM(src1)));
@@ -1553,25 +1617,28 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		return push_inst(compiler, ORR | (flags & SET_FLAGS) | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2)));
 
 	case SLJIT_XOR:
-		SLJIT_ASSERT(!(flags & INV_IMM));
+		if (flags & INV_IMM) {
+			SLJIT_ASSERT(src2 == SRC2_IMM);
+			return push_inst(compiler, MVN | (flags & SET_FLAGS) | RD(dst) | RM(src1));
+		}
 		return push_inst(compiler, EOR | (flags & SET_FLAGS) | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2)));
 
 	case SLJIT_SHL:
 	case SLJIT_MSHL:
 		shift_type = 0;
-		is_masked = GET_OPCODE(op) == SLJIT_MSHL;
+		is_masked = op == SLJIT_MSHL;
 		break;
 
 	case SLJIT_LSHR:
 	case SLJIT_MLSHR:
 		shift_type = 1;
-		is_masked = GET_OPCODE(op) == SLJIT_MLSHR;
+		is_masked = op == SLJIT_MLSHR;
 		break;
 
 	case SLJIT_ASHR:
 	case SLJIT_MASHR:
 		shift_type = 2;
-		is_masked = GET_OPCODE(op) == SLJIT_MASHR;
+		is_masked = op == SLJIT_MASHR;
 		break;
 
 	case SLJIT_ROTL:
@@ -1611,7 +1678,7 @@ static SLJIT_INLINE sljit_s32 emit_singl
 	}
 
 	return push_inst(compiler, MOV | (flags & SET_FLAGS) | RD(dst)
-		| RM8(src2) | (sljit_uw)(shift_type << 5) | 0x10 | RM(src1));
+		| RM8(src2) | (sljit_ins)(shift_type << 5) | 0x10 | RM(src1));
 }
 
 #undef EMIT_SHIFT_INS_AND_RETURN
@@ -1628,8 +1695,7 @@ static sljit_uw get_imm(sljit_uw imm)
 	if (!(imm & 0xff000000)) {
 		imm <<= 8;
 		rol = 8;
-	}
-	else {
+	} else {
 		imm = (imm << 24) | (imm >> 8);
 		rol = 0;
 	}
@@ -1651,22 +1717,19 @@ static sljit_uw get_imm(sljit_uw imm)
 
 	if (!(imm & 0x00ffffff))
 		return SRC2_IMM | (imm >> 24) | (rol << 8);
-	else
-		return 0;
+	return 0;
 }
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
-static sljit_s32 generate_int(struct sljit_compiler *compiler, sljit_s32 reg, sljit_uw imm, sljit_s32 positive)
+static sljit_uw compute_imm(sljit_uw imm, sljit_uw* imm2)
 {
 	sljit_uw mask;
 	sljit_uw imm1;
-	sljit_uw imm2;
 	sljit_uw rol;
 
 	/* Step1: Search a zero byte (8 continous zero bit). */
 	mask = 0xff000000;
 	rol = 8;
-	while(1) {
+	while (1) {
 		if (!(imm & mask)) {
 			/* Rol imm by rol. */
 			imm = (imm << rol) | (imm >> (32 - rol));
@@ -1674,6 +1737,7 @@ static sljit_s32 generate_int(struct slj
 			rol = 4 + (rol >> 1);
 			break;
 		}
+
 		rol += 2;
 		mask >>= 2;
 		if (mask & 0x3) {
@@ -1703,9 +1767,8 @@ static sljit_s32 generate_int(struct slj
 
 	if (!(imm & 0xff000000)) {
 		imm1 = SRC2_IMM | ((imm >> 16) & 0xff) | (((rol + 4) & 0xf) << 8);
-		imm2 = SRC2_IMM | ((imm >> 8) & 0xff) | (((rol + 8) & 0xf) << 8);
-	}
-	else if (imm & 0xc0000000) {
+		*imm2 = SRC2_IMM | ((imm >> 8) & 0xff) | (((rol + 8) & 0xf) << 8);
+	} else if (imm & 0xc0000000) {
 		imm1 = SRC2_IMM | ((imm >> 24) & 0xff) | ((rol & 0xf) << 8);
 		imm <<= 8;
 		rol += 4;
@@ -1726,11 +1789,10 @@ static sljit_s32 generate_int(struct slj
 		}
 
 		if (!(imm & 0x00ffffff))
-			imm2 = SRC2_IMM | (imm >> 24) | ((rol & 0xf) << 8);
+			*imm2 = SRC2_IMM | (imm >> 24) | ((rol & 0xf) << 8);
 		else
 			return 0;
-	}
-	else {
+	} else {
 		if (!(imm & 0xf0000000)) {
 			imm <<= 4;
 			rol += 2;
@@ -1756,25 +1818,23 @@ static sljit_s32 generate_int(struct slj
 		}
 
 		if (!(imm & 0x00ffffff))
-			imm2 = SRC2_IMM | (imm >> 24) | ((rol & 0xf) << 8);
+			*imm2 = SRC2_IMM | (imm >> 24) | ((rol & 0xf) << 8);
 		else
 			return 0;
 	}
 
-	FAIL_IF(push_inst(compiler, (positive ? MOV : MVN) | RD(reg) | imm1));
-	FAIL_IF(push_inst(compiler, (positive ? ORR : BIC) | RD(reg) | RN(reg) | imm2));
-	return 1;
+	return imm1;
 }
-#endif
 
 static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, sljit_uw imm)
 {
 	sljit_uw tmp;
-
-#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
+	sljit_uw imm1, imm2;
+#else /* !SLJIT_CONFIG_ARM_V6 */
 	if (!(imm & ~(sljit_uw)0xffff))
 		return push_inst(compiler, MOVW | RD(reg) | ((imm << 4) & 0xf0000) | (imm & 0xfff));
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 
 	/* Create imm by 1 inst. */
 	tmp = get_imm(imm);
@@ -1785,19 +1845,28 @@ static sljit_s32 load_immediate(struct s
 	if (tmp)
 		return push_inst(compiler, MVN | RD(reg) | tmp);
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 	/* Create imm by 2 inst. */
-	FAIL_IF(generate_int(compiler, reg, imm, 1));
-	FAIL_IF(generate_int(compiler, reg, ~imm, 0));
+	imm1 = compute_imm(imm, &imm2);
+	if (imm1 != 0) {
+		FAIL_IF(push_inst(compiler, MOV | RD(reg) | imm1));
+		return push_inst(compiler, ORR | RD(reg) | RN(reg) | imm2);
+	}
+
+	imm1 = compute_imm(~imm, &imm2);
+	if (imm1 != 0) {
+		FAIL_IF(push_inst(compiler, MVN | RD(reg) | imm1));
+		return push_inst(compiler, BIC | RD(reg) | RN(reg) | imm2);
+	}
 
 	/* Load integer. */
 	return push_inst_with_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, reg, TMP_PC, 0), imm);
-#else
+#else /* !SLJIT_CONFIG_ARM_V6 */
 	FAIL_IF(push_inst(compiler, MOVW | RD(reg) | ((imm << 4) & 0xf0000) | (imm & 0xfff)));
 	if (imm <= 0xffff)
 		return SLJIT_SUCCESS;
 	return push_inst(compiler, MOVT | RD(reg) | ((imm >> 12) & 0xf0000) | ((imm >> 16) & 0xfff));
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 }
 
 static sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg,
@@ -1834,13 +1903,13 @@ static sljit_s32 emit_op_mem(struct slji
 		argw &= 0x3;
 
 		if (argw != 0 && (mask == 0xff)) {
-			FAIL_IF(push_inst(compiler, ADD | RD(tmp_reg) | RN(arg) | RM(offset_reg) | ((sljit_uw)argw << 7)));
+			FAIL_IF(push_inst(compiler, ADD | RD(tmp_reg) | RN(arg) | RM(offset_reg) | ((sljit_ins)argw << 7)));
 			return push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, tmp_reg, TYPE2_TRANSFER_IMM(0)));
 		}
 
 		/* Bit 25: RM is offset. */
 		return push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, arg,
-			RM(offset_reg) | (mask == 0xff ? 0 : (1 << 25)) | ((sljit_uw)argw << 7)));
+			RM(offset_reg) | (mask == 0xff ? 0 : (1 << 25)) | ((sljit_ins)argw << 7)));
 	}
 
 	arg &= REG_MASK;
@@ -1902,10 +1971,16 @@ static sljit_s32 emit_op(struct sljit_co
 
 	/* We prefers register and simple consts. */
 	sljit_s32 dst_reg;
-	sljit_s32 src1_reg;
+	sljit_s32 src1_reg = 0;
 	sljit_s32 src2_reg = 0;
 	sljit_s32 flags = HAS_FLAGS(op) ? SET_FLAGS : 0;
 	sljit_s32 neg_op = 0;
+	sljit_u32 imm2;
+
+	op = GET_OPCODE(op);
+
+	if (flags & SET_FLAGS)
+		inp_flags &= ~ALLOW_DOUBLE_IMM;
 
 	if (dst == TMP_REG2)
 		flags |= UNUSED_RETURN;
@@ -1913,7 +1988,7 @@ static sljit_s32 emit_op(struct sljit_co
 	SLJIT_ASSERT(!(inp_flags & ALLOW_INV_IMM) || (inp_flags & ALLOW_IMM));
 
 	if (inp_flags & ALLOW_NEG_IMM) {
-		switch (GET_OPCODE(op)) {
+		switch (op) {
 		case SLJIT_ADD:
 			compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD;
 			neg_op = SLJIT_SUB;
@@ -1937,10 +2012,11 @@ static sljit_s32 emit_op(struct sljit_co
 		if (!(inp_flags & ALLOW_IMM))
 			break;
 
-		if (src2 & SLJIT_IMM) {
+		if (src2 == SLJIT_IMM) {
 			src2_reg = (sljit_s32)get_imm((sljit_uw)src2w);
 			if (src2_reg)
 				break;
+
 			if (inp_flags & ALLOW_INV_IMM) {
 				src2_reg = (sljit_s32)get_imm(~(sljit_uw)src2w);
 				if (src2_reg) {
@@ -1948,8 +2024,9 @@ static sljit_s32 emit_op(struct sljit_co
 					break;
 				}
 			}
+
 			if (neg_op != 0) {
-				src2_reg = (sljit_s32)get_imm((sljit_uw)-src2w);
+				src2_reg = (sljit_s32)get_imm((neg_op == SLJIT_ADD || neg_op == SLJIT_SUB) ? (sljit_uw)-src2w : ~(sljit_uw)src2w);
 				if (src2_reg) {
 					op = neg_op | GET_ALL_FLAGS(op);
 					break;
@@ -1957,7 +2034,7 @@ static sljit_s32 emit_op(struct sljit_co
 			}
 		}
 
-		if (src1 & SLJIT_IMM) {
+		if (src1 == SLJIT_IMM) {
 			src2_reg = (sljit_s32)get_imm((sljit_uw)src1w);
 			if (src2_reg) {
 				flags |= ARGS_SWAPPED;
@@ -1965,6 +2042,7 @@ static sljit_s32 emit_op(struct sljit_co
 				src1w = src2w;
 				break;
 			}
+
 			if (inp_flags & ALLOW_INV_IMM) {
 				src2_reg = (sljit_s32)get_imm(~(sljit_uw)src1w);
 				if (src2_reg) {
@@ -1974,8 +2052,11 @@ static sljit_s32 emit_op(struct sljit_co
 					break;
 				}
 			}
+
 			if (neg_op >= SLJIT_SUB) {
 				/* Note: additive operation (commutative). */
+				SLJIT_ASSERT(op == SLJIT_ADD || op == SLJIT_ADDC);
+
 				src2_reg = (sljit_s32)get_imm((sljit_uw)-src1w);
 				if (src2_reg) {
 					src1 = src2;
@@ -1993,8 +2074,7 @@ static sljit_s32 emit_op(struct sljit_co
 	else if (src1 & SLJIT_MEM) {
 		FAIL_IF(emit_op_mem(compiler, inp_flags | LOAD_DATA, TMP_REG1, src1, src1w, TMP_REG1));
 		src1_reg = TMP_REG1;
-	}
-	else {
+	} else if (!(inp_flags & ALLOW_DOUBLE_IMM) || src2_reg != 0 || op == SLJIT_SUB || op == SLJIT_SUBC) {
 		FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)src1w));
 		src1_reg = TMP_REG1;
 	}
@@ -2023,8 +2103,62 @@ static sljit_s32 emit_op(struct sljit_co
 			src2_reg = src2;
 		else if (src2 & SLJIT_MEM)
 			FAIL_IF(emit_op_mem(compiler, inp_flags | LOAD_DATA, src2_reg, src2, src2w, TMP_REG2));
-		else
+		else if (!(inp_flags & ALLOW_DOUBLE_IMM))
 			FAIL_IF(load_immediate(compiler, src2_reg, (sljit_uw)src2w));
+		else {
+			SLJIT_ASSERT(!(flags & SET_FLAGS));
+
+			if (src1_reg == 0) {
+				FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)src1w));
+				src1_reg = TMP_REG1;
+			}
+
+			src2_reg = (sljit_s32)compute_imm((sljit_uw)src2w, &imm2);
+
+			if (src2_reg == 0 && neg_op != 0) {
+				src2_reg = (sljit_s32)compute_imm((sljit_uw)-src2w, &imm2);
+				if (src2_reg != 0)
+					op = neg_op;
+			}
+
+			if (src2_reg == 0) {
+				FAIL_IF(load_immediate(compiler, TMP_REG2, (sljit_uw)src2w));
+				src2_reg = TMP_REG2;
+			} else {
+				FAIL_IF(emit_single_op(compiler, op, flags, (sljit_uw)dst_reg, (sljit_uw)src1_reg, (sljit_uw)src2_reg));
+				src1_reg = dst_reg;
+				src2_reg = (sljit_s32)imm2;
+
+				if (op == SLJIT_ADDC)
+					op = SLJIT_ADD;
+				else if (op == SLJIT_SUBC)
+					op = SLJIT_SUB;
+			}
+		}
+	}
+
+	if (src1_reg == 0) {
+		SLJIT_ASSERT((inp_flags & ALLOW_DOUBLE_IMM) && !(flags & SET_FLAGS));
+
+		src1_reg = (sljit_s32)compute_imm((sljit_uw)src1w, &imm2);
+
+		if (src1_reg == 0 && neg_op != 0) {
+			src1_reg = (sljit_s32)compute_imm((sljit_uw)-src1w, &imm2);
+			if (src1_reg != 0)
+				op = neg_op;
+		}
+
+		if (src1_reg == 0) {
+			FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)src1w));
+			src1_reg = TMP_REG1;
+		} else {
+			FAIL_IF(emit_single_op(compiler, op, flags, (sljit_uw)dst_reg, (sljit_uw)src2_reg, (sljit_uw)src1_reg));
+			src1_reg = dst_reg;
+			src2_reg = (sljit_s32)imm2;
+
+			if (op == SLJIT_ADDC)
+				op = SLJIT_ADD;
+		}
 	}
 
 	FAIL_IF(emit_single_op(compiler, op, flags, (sljit_uw)dst_reg, (sljit_uw)src1_reg, (sljit_uw)src2_reg));
@@ -2114,7 +2248,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 				SLJIT_ASSERT(saved_reg_list[1] < 8);
 				FAIL_IF(push_inst(compiler, LDR | 0x8d0004 | (saved_reg_list[1] << 12) /* ldr rX, [sp, #4] */));
 			}
-			return push_inst(compiler, (LDR ^ (1 << 24)) | 0x8d0000 | (sljit_uw)(saved_reg_count >= 3 ? 16 : 8)
+			return push_inst(compiler, (LDR ^ (1 << 24)) | 0x8d0000 | (sljit_ins)(saved_reg_count >= 3 ? 16 : 8)
 						| (saved_reg_list[0] << 12) /* ldr rX, [sp], #8/16 */);
 		}
 		return SLJIT_SUCCESS;
@@ -2144,23 +2278,27 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		return emit_op(compiler, SLJIT_MOV, ALLOW_ANY_IMM, dst, dstw, TMP_REG1, 0, src, srcw);
 
 	case SLJIT_MOV_U8:
-		return emit_op(compiler, SLJIT_MOV_U8, ALLOW_ANY_IMM | BYTE_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw);
+		return emit_op(compiler, SLJIT_MOV_U8, ALLOW_ANY_IMM | BYTE_SIZE, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u8)srcw : srcw);
 
 	case SLJIT_MOV_S8:
-		return emit_op(compiler, SLJIT_MOV_S8, ALLOW_ANY_IMM | SIGNED | BYTE_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw);
+		return emit_op(compiler, SLJIT_MOV_S8, ALLOW_ANY_IMM | SIGNED | BYTE_SIZE, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s8)srcw : srcw);
 
 	case SLJIT_MOV_U16:
-		return emit_op(compiler, SLJIT_MOV_U16, ALLOW_ANY_IMM | HALF_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw);
+		return emit_op(compiler, SLJIT_MOV_U16, ALLOW_ANY_IMM | HALF_SIZE, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u16)srcw : srcw);
 
 	case SLJIT_MOV_S16:
-		return emit_op(compiler, SLJIT_MOV_S16, ALLOW_ANY_IMM | SIGNED | HALF_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw);
-
-	case SLJIT_NOT:
-		return emit_op(compiler, op, ALLOW_ANY_IMM, dst, dstw, TMP_REG1, 0, src, srcw);
+		return emit_op(compiler, SLJIT_MOV_S16, ALLOW_ANY_IMM | SIGNED | HALF_SIZE, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s16)srcw : srcw);
 
 	case SLJIT_CLZ:
 	case SLJIT_CTZ:
+	case SLJIT_REV:
+	case SLJIT_REV_U32:
+	case SLJIT_REV_S32:
 		return emit_op(compiler, op, 0, dst, dstw, TMP_REG1, 0, src, srcw);
+
+	case SLJIT_REV_U16:
+	case SLJIT_REV_S16:
+		return emit_op(compiler, op, HALF_SIZE, dst, dstw, TMP_REG1, 0, src, srcw);
 	}
 
 	return SLJIT_SUCCESS;
@@ -2171,6 +2309,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	sljit_s32 src1, sljit_sw src1w,
 	sljit_s32 src2, sljit_sw src2w)
 {
+	sljit_s32 inp_flags;
+
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_op2(compiler, op, 0, dst, dstw, src1, src1w, src2, src2w));
 	ADJUST_LOCAL_OFFSET(dst, dstw);
@@ -2182,11 +2322,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	case SLJIT_ADDC:
 	case SLJIT_SUB:
 	case SLJIT_SUBC:
-		return emit_op(compiler, op, ALLOW_IMM | ALLOW_NEG_IMM, dst, dstw, src1, src1w, src2, src2w);
+		return emit_op(compiler, op, ALLOW_IMM | ALLOW_NEG_IMM | ALLOW_DOUBLE_IMM, dst, dstw, src1, src1w, src2, src2w);
 
 	case SLJIT_OR:
+		return emit_op(compiler, op, ALLOW_IMM | ALLOW_DOUBLE_IMM, dst, dstw, src1, src1w, src2, src2w);
+
 	case SLJIT_XOR:
-		return emit_op(compiler, op, ALLOW_IMM, dst, dstw, src1, src1w, src2, src2w);
+		inp_flags = ALLOW_IMM | ALLOW_DOUBLE_IMM;
+		if ((src1 == SLJIT_IMM && src1w == -1) || (src2 == SLJIT_IMM && src2w == -1)) {
+			inp_flags |= ALLOW_INV_IMM;
+		}
+		return emit_op(compiler, op, inp_flags, dst, dstw, src1, src1w, src2, src2w);
 
 	case SLJIT_MUL:
 		return emit_op(compiler, op, 0, dst, dstw, src1, src1w, src2, src2w);
@@ -2202,7 +2348,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	case SLJIT_MASHR:
 	case SLJIT_ROTL:
 	case SLJIT_ROTR:
-		if (src2 & SLJIT_IMM) {
+		if (src2 == SLJIT_IMM) {
 			compiler->shift_imm = src2w & 0x1f;
 			return emit_op(compiler, op, 0, dst, dstw, TMP_REG1, 0, src1, src1w);
 		} else {
@@ -2226,60 +2372,52 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 src_dst,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w)
+	sljit_s32 dst_reg,
+	sljit_s32 src1_reg,
+	sljit_s32 src2_reg,
+	sljit_s32 src3, sljit_sw src3w)
 {
 	sljit_s32 is_left;
 
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_shift_into(compiler, op, src_dst, src1, src1w, src2, src2w));
+	CHECK(check_sljit_emit_shift_into(compiler, op, dst_reg, src1_reg, src2_reg, src3, src3w));
 
 	op = GET_OPCODE(op);
 	is_left = (op == SLJIT_SHL || op == SLJIT_MSHL);
 
-	if (src_dst == src1) {
+	if (src1_reg == src2_reg) {
 		SLJIT_SKIP_CHECKS(compiler);
-		return sljit_emit_op2(compiler, is_left ? SLJIT_ROTL : SLJIT_ROTR, src_dst, 0, src_dst, 0, src2, src2w);
+		return sljit_emit_op2(compiler, is_left ? SLJIT_ROTL : SLJIT_ROTR, dst_reg, 0, src1_reg, 0, src3, src3w);
 	}
 
-	ADJUST_LOCAL_OFFSET(src1, src1w);
-	ADJUST_LOCAL_OFFSET(src2, src2w);
+	ADJUST_LOCAL_OFFSET(src3, src3w);
 
 	/* Shift type of ROR is 3. */
-	if (src2 & SLJIT_IMM) {
-		src2w &= 0x1f;
+	if (src3 == SLJIT_IMM) {
+		src3w &= 0x1f;
 
-		if (src2w == 0)
+		if (src3w == 0)
 			return SLJIT_SUCCESS;
-	} else if (src2 & SLJIT_MEM) {
-		FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG2, src2, src2w, TMP_REG2));
-		src2 = TMP_REG2;
-	}
 
-	if (src1 & SLJIT_MEM) {
-		FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG1, src1, src1w, TMP_REG1));
-		src1 = TMP_REG1;
-	} else if (src1 & SLJIT_IMM) {
-		FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)src1w));
-		src1 = TMP_REG1;
+		FAIL_IF(push_inst(compiler, MOV | RD(dst_reg) | RM(src1_reg) | ((sljit_ins)(is_left ? 0 : 1) << 5) | ((sljit_ins)src3w << 7)));
+		src3w = (src3w ^ 0x1f) + 1;
+		return push_inst(compiler, ORR | RD(dst_reg) | RN(dst_reg) | RM(src2_reg) | ((sljit_ins)(is_left ? 1 : 0) << 5) | ((sljit_ins)src3w << 7));
 	}
 
-	if (src2 & SLJIT_IMM) {
-		FAIL_IF(push_inst(compiler, MOV | RD(src_dst) | RM(src_dst) | ((sljit_uw)(is_left ? 0 : 1) << 5) | ((sljit_uw)src2w << 7)));
-		src2w = (src2w ^ 0x1f) + 1;
-		return push_inst(compiler, ORR | RD(src_dst) | RN(src_dst) | RM(src1) | ((sljit_uw)(is_left ? 1 : 0) << 5) | ((sljit_uw)src2w << 7));
+	if (src3 & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG2, src3, src3w, TMP_REG2));
+		src3 = TMP_REG2;
 	}
 
-	if (op == SLJIT_MSHL || op == SLJIT_MLSHR) {
-		FAIL_IF(push_inst(compiler, AND | SRC2_IMM | RD(TMP_REG2) | RN(src2) | 0x1f));
-		src2 = TMP_REG2;
+	if (op == SLJIT_MSHL || op == SLJIT_MLSHR || dst_reg == src3) {
+		FAIL_IF(push_inst(compiler, AND | SRC2_IMM | RD(TMP_REG2) | RN(src3) | 0x1f));
+		src3 = TMP_REG2;
 	}
 
-	FAIL_IF(push_inst(compiler, MOV | RD(src_dst) | RM8(src2) | ((sljit_uw)(is_left ? 0 : 1) << 5) | 0x10 | RM(src_dst)));
-	FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | RM(src1) | ((sljit_uw)(is_left ? 1 : 0) << 5) | (1 << 7)));
-	FAIL_IF(push_inst(compiler, EOR | SRC2_IMM | RD(TMP_REG2) | RN(src2) | 0x1f));
-	return push_inst(compiler, ORR | RD(src_dst) | RN(src_dst) | RM(TMP_REG1) | ((sljit_uw)(is_left ? 1 : 0) << 5) | 0x10 | RM8(TMP_REG2));
+	FAIL_IF(push_inst(compiler, MOV | RD(dst_reg) | RM8(src3) | ((sljit_ins)(is_left ? 0 : 1) << 5) | 0x10 | RM(src1_reg)));
+	FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | RM(src2_reg) | ((sljit_ins)(is_left ? 1 : 0) << 5) | (1 << 7)));
+	FAIL_IF(push_inst(compiler, EOR | SRC2_IMM | RD(TMP_REG2) | RN(src3) | 0x1f));
+	return push_inst(compiler, ORR | RD(dst_reg) | RN(dst_reg) | RM8(TMP_REG2) | ((sljit_ins)(is_left ? 1 : 0) << 5) | 0x10 | RM(TMP_REG1));
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
@@ -2305,27 +2443,67 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	case SLJIT_PREFETCH_L2:
 	case SLJIT_PREFETCH_L3:
 	case SLJIT_PREFETCH_ONCE:
-#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
 		SLJIT_ASSERT(src & SLJIT_MEM);
 		return emit_op_mem(compiler, PRELOAD | LOAD_DATA, TMP_PC, src, srcw, TMP_REG1);
-#else /* !SLJIT_CONFIG_ARM_V7 */
-		return SLJIT_SUCCESS;
-#endif /* SLJIT_CONFIG_ARM_V7 */
 	}
 
 	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw)
 {
-	CHECK_REG_INDEX(check_sljit_get_register_index(reg));
-	return reg_map[reg];
+	sljit_s32 size, dst_r;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_op_dst(compiler, op, dst, dstw));
+	ADJUST_LOCAL_OFFSET(dst, dstw);
+
+	switch (op) {
+	case SLJIT_FAST_ENTER:
+		SLJIT_ASSERT(reg_map[TMP_REG2] == 14);
+
+		if (FAST_IS_REG(dst))
+			return push_inst(compiler, MOV | RD(dst) | RM(TMP_REG2));
+		break;
+	case SLJIT_GET_RETURN_ADDRESS:
+		size = GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds - SLJIT_KEPT_SAVEDS_COUNT(compiler->options), 0);
+
+		if (compiler->fsaveds > 0 || compiler->fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG) {
+			/* The size of pc is not added above. */
+			if ((size & SSIZE_OF(sw)) == 0)
+				size += SSIZE_OF(sw);
+
+			size += GET_SAVED_FLOAT_REGISTERS_SIZE(compiler->fscratches, compiler->fsaveds, f64);
+		}
+
+		SLJIT_ASSERT(((compiler->local_size + size + SSIZE_OF(sw)) & 0x7) == 0);
+
+		dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2;
+		FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, dst_r, SLJIT_MEM1(SLJIT_SP), compiler->local_size + size, TMP_REG1));
+		break;
+	}
+
+	if (dst & SLJIT_MEM)
+		return emit_op_mem(compiler, WORD_SIZE, TMP_REG2, dst, dstw, TMP_REG1);
+
+	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg)
 {
-	CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
-	return (freg_map[reg] << 1);
+	CHECK_REG_INDEX(check_sljit_get_register_index(type, reg));
+
+	if (type == SLJIT_GP_REGISTER)
+		return reg_map[reg];
+
+	if (type == SLJIT_FLOAT_REGISTER || type == SLJIT_SIMD_REG_64)
+		return freg_map[reg];
+
+	if (type != SLJIT_SIMD_REG_128)
+		return freg_map[reg] & ~0x1;
+
+	return -1;
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
@@ -2335,7 +2513,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
 
-	return push_inst(compiler, *(sljit_uw*)instruction);
+	return push_inst(compiler, *(sljit_ins*)instruction);
 }
 
 /* --------------------------------------------------------------------- */
@@ -2344,18 +2522,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 #define FPU_LOAD (1 << 20)
 #define EMIT_FPU_DATA_TRANSFER(inst, add, base, freg, offs) \
-	((inst) | (sljit_uw)((add) << 23) | RN(base) | VD(freg) | (sljit_uw)(offs))
+	((inst) | (sljit_ins)((add) << 23) | RN(base) | VD(freg) | (sljit_ins)(offs))
 
 static sljit_s32 emit_fop_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)
 {
 	sljit_uw imm;
-	sljit_uw inst = VSTR_F32 | (flags & (SLJIT_32 | FPU_LOAD));
+	sljit_ins inst = VSTR_F32 | (flags & (SLJIT_32 | FPU_LOAD));
 
 	SLJIT_ASSERT(arg & SLJIT_MEM);
 	arg &= ~SLJIT_MEM;
 
 	if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) {
-		FAIL_IF(push_inst(compiler, ADD | RD(TMP_REG2) | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | (((sljit_uw)argw & 0x3) << 7)));
+		FAIL_IF(push_inst(compiler, ADD | RD(TMP_REG2) | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | (((sljit_ins)argw & 0x3) << 7)));
 		arg = TMP_REG2;
 		argw = 0;
 	}
@@ -2410,14 +2588,12 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 	return emit_fop_mem(compiler, 0, TMP_FREG1, dst, dstw);
 }
 
-static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
+static sljit_s32 sljit_emit_fop1_conv_f64_from_w(struct sljit_compiler *compiler, sljit_ins ins,
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 src, sljit_sw srcw)
 {
 	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
 
-	op ^= SLJIT_32;
-
 	if (FAST_IS_REG(src))
 		FAIL_IF(push_inst(compiler, VMOV | RD(src) | VN(TMP_FREG1)));
 	else if (src & SLJIT_MEM) {
@@ -2429,13 +2605,27 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 		FAIL_IF(push_inst(compiler, VMOV | RD(TMP_REG1) | VN(TMP_FREG1)));
 	}
 
-	FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCVT_F32_S32, op & SLJIT_32, dst_r, TMP_FREG1, 0)));
+	FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(ins, ins & SLJIT_32, dst_r, TMP_FREG1, 0)));
 
 	if (dst & SLJIT_MEM)
-		return emit_fop_mem(compiler, (op & SLJIT_32), TMP_FREG1, dst, dstw);
+		return emit_fop_mem(compiler, (ins & SLJIT_32), TMP_FREG1, dst, dstw);
 	return SLJIT_SUCCESS;
 }
 
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	return sljit_emit_fop1_conv_f64_from_w(compiler, VCVT_F32_S32 | (~op & SLJIT_32), dst, dstw, src, srcw);
+}
+
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	return sljit_emit_fop1_conv_f64_from_w(compiler, VCVT_F32_U32 | (~op & SLJIT_32), dst, dstw, src, srcw);
+}
+
 static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,
 	sljit_s32 src1, sljit_sw src1w,
 	sljit_s32 src2, sljit_sw src2w)
@@ -2453,7 +2643,12 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 	}
 
 	FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCMP_F32, op & SLJIT_32, src1, src2, 0)));
-	return push_inst(compiler, VMRS);
+	FAIL_IF(push_inst(compiler, VMRS));
+
+	if (GET_FLAG_TYPE(op) != SLJIT_UNORDERED_OR_EQUAL)
+		return SLJIT_SUCCESS;
+
+	return push_inst(compiler, (CMP - CONDITIONAL) | (0x60000000 /* VS */) | SET_FLAGS | RN(TMP_REG1) | RM(TMP_REG1));
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
@@ -2534,18 +2729,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	case SLJIT_ADD_F64:
 		FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VADD_F32, op & SLJIT_32, dst_r, src2, src1)));
 		break;
-
 	case SLJIT_SUB_F64:
 		FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VSUB_F32, op & SLJIT_32, dst_r, src2, src1)));
 		break;
-
 	case SLJIT_MUL_F64:
 		FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMUL_F32, op & SLJIT_32, dst_r, src2, src1)));
 		break;
-
 	case SLJIT_DIV_F64:
 		FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VDIV_F32, op & SLJIT_32, dst_r, src2, src1)));
 		break;
+	case SLJIT_COPYSIGN_F64:
+		FAIL_IF(push_inst(compiler, VMOV | (1 << 20) | VN(src2) | RD(TMP_REG1) | ((op & SLJIT_32) ? (1 << 7) : 0)));
+		FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VABS_F32, op & SLJIT_32, dst_r, src1, 0)));
+		FAIL_IF(push_inst(compiler, CMP | SET_FLAGS | RN(TMP_REG1) | SRC2_IMM | 0));
+		return push_inst(compiler, EMIT_FPU_OPERATION((VNEG_F32 & ~COND_MASK) | 0xb0000000, op & SLJIT_32, dst_r, dst_r, 0));
 	}
 
 	if (dst_r == TMP_FREG1)
@@ -2556,42 +2753,120 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 #undef EMIT_FPU_DATA_TRANSFER
 
-/* --------------------------------------------------------------------- */
-/*  Other instructions                                                   */
-/* --------------------------------------------------------------------- */
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f32 value)
+{
+#if defined(__ARM_NEON) && __ARM_NEON
+	sljit_u32 exp;
+	sljit_ins ins;
+#endif /* NEON */
+	union {
+		sljit_u32 imm;
+		sljit_f32 value;
+	} u;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fset32(compiler, freg, value));
+
+	u.value = value;
+
+#if defined(__ARM_NEON) && __ARM_NEON
+	if ((u.imm << (32 - 19)) == 0) {
+		exp = (u.imm >> (23 + 2)) & 0x3f;
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+		if (exp == 0x20 || exp == 0x1f) {
+			ins = ((u.imm >> 24) & 0x80) | ((u.imm >> 19) & 0x7f);
+			return push_inst(compiler, (VMOV_F32 ^ (1 << 6)) | ((ins & 0xf0) << 12) | VD(freg) | (ins & 0xf));
+		}
+	}
+#endif /* NEON */
+
+	FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm));
+	return push_inst(compiler, VMOV | VN(freg) | RD(TMP_REG1));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f64 value)
 {
+#if defined(__ARM_NEON) && __ARM_NEON
+	sljit_u32 exp;
+	sljit_ins ins;
+#endif /* NEON */
+	union {
+		sljit_u32 imm[2];
+		sljit_f64 value;
+	} u;
+
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
-	ADJUST_LOCAL_OFFSET(dst, dstw);
+	CHECK(check_sljit_emit_fset64(compiler, freg, value));
 
-	SLJIT_ASSERT(reg_map[TMP_REG2] == 14);
+	u.value = value;
 
-	if (FAST_IS_REG(dst))
-		return push_inst(compiler, MOV | RD(dst) | RM(TMP_REG2));
+#if defined(__ARM_NEON) && __ARM_NEON
+	if (u.imm[0] == 0 && (u.imm[1] << (64 - 48)) == 0) {
+		exp = (u.imm[1] >> ((52 - 32) + 2)) & 0x1ff;
+
+		if (exp == 0x100 || exp == 0xff) {
+			ins = ((u.imm[1] >> (56 - 32)) & 0x80) | ((u.imm[1] >> (48 - 32)) & 0x7f);
+			return push_inst(compiler, (VMOV_F32 ^ (1 << 6)) | (1 << 8) | ((ins & 0xf0) << 12) | VD(freg) | (ins & 0xf));
+		}
+	}
+#endif /* NEON */
+
+	FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm[0]));
+	if (u.imm[0] == u.imm[1])
+		return push_inst(compiler, VMOV2 | RN(TMP_REG1) | RD(TMP_REG1) | VM(freg));
+
+	FAIL_IF(load_immediate(compiler, TMP_REG2, u.imm[1]));
+	return push_inst(compiler, VMOV2 | RN(TMP_REG2) | RD(TMP_REG1) | VM(freg));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 freg, sljit_s32 reg)
+{
+	sljit_s32 reg2;
+	sljit_ins inst;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg));
+
+	if (reg & REG_PAIR_MASK) {
+		reg2 = REG_PAIR_SECOND(reg);
+		reg = REG_PAIR_FIRST(reg);
+
+		inst = VMOV2 | RN(reg) | RD(reg2) | VM(freg);
+	} else {
+		inst = VMOV | VN(freg) | RD(reg);
 
-	/* Memory. */
-	return emit_op_mem(compiler, WORD_SIZE, TMP_REG2, dst, dstw, TMP_REG1);
+		if (!(op & SLJIT_32))
+			inst |= 1 << 7;
+	}
+
+	if (GET_OPCODE(op) == SLJIT_COPY_FROM_F64)
+		inst |= 1 << 20;
+
+	return push_inst(compiler, inst);
 }
 
 /* --------------------------------------------------------------------- */
 /*  Conditional instructions                                             */
 /* --------------------------------------------------------------------- */
 
-static sljit_uw get_cc(struct sljit_compiler *compiler, sljit_s32 type)
+static sljit_ins get_cc(struct sljit_compiler *compiler, sljit_s32 type)
 {
 	switch (type) {
 	case SLJIT_EQUAL:
+	case SLJIT_ATOMIC_STORED:
 	case SLJIT_F_EQUAL:
 	case SLJIT_ORDERED_EQUAL:
-	case SLJIT_UNORDERED_OR_EQUAL: /* Not supported. */
+	case SLJIT_UNORDERED_OR_EQUAL:
 		return 0x00000000;
 
 	case SLJIT_NOT_EQUAL:
+	case SLJIT_ATOMIC_NOT_STORED:
 	case SLJIT_F_NOT_EQUAL:
 	case SLJIT_UNORDERED_OR_NOT_EQUAL:
-	case SLJIT_ORDERED_NOT_EQUAL: /* Not supported. */
+	case SLJIT_ORDERED_NOT_EQUAL:
 		return 0x10000000;
 
 	case SLJIT_CARRY:
@@ -2696,7 +2971,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 
 	SLJIT_ASSERT(reg_map[TMP_REG1] != 14);
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 	if (type >= SLJIT_FAST_CALL)
 		PTR_FAIL_IF(prepare_blx(compiler));
 	PTR_FAIL_IF(push_inst_with_unique_literal(compiler, ((EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1,
@@ -2714,13 +2989,13 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 
 	if (!(jump->flags & SLJIT_REWRITABLE_JUMP))
 		jump->addr = compiler->size;
-#else
+#else /* !SLJIT_CONFIG_ARM_V6 */
 	if (type >= SLJIT_FAST_CALL)
 		jump->flags |= IS_BL;
 	PTR_FAIL_IF(emit_imm(compiler, TMP_REG1, 0));
 	PTR_FAIL_IF(push_inst(compiler, (((type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1)) & ~COND_MASK) | get_cc(compiler, type)));
 	jump->addr = compiler->size;
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 	return jump;
 }
 
@@ -2738,7 +3013,7 @@ static sljit_s32 softfloat_call_with_arg
 	sljit_u8 *offset_ptr = offsets;
 
 	if (src && FAST_IS_REG(*src))
-		src_offset = (sljit_uw)reg_map[*src] * sizeof(sljit_sw);
+		src_offset = (sljit_u32)reg_map[*src] * sizeof(sljit_sw);
 
 	arg_types >>= SLJIT_ARG_SHIFT;
 
@@ -2773,7 +3048,7 @@ static sljit_s32 softfloat_call_with_arg
 		if (is_tail_call)
 			offset += sizeof(sljit_sw);
 
-		offset = ((offset - 4 * sizeof(sljit_sw)) + 0x7) & ~(sljit_uw)0x7;
+		offset = ((offset - 4 * sizeof(sljit_sw)) + 0x7) & ~(sljit_u32)0x7;
 
 		*extra_space = offset;
 
@@ -2903,8 +3178,6 @@ static sljit_s32 hardfloat_call_with_arg
 
 #endif /* __SOFTFP__ */
 
-#undef EMIT_FPU_OPERATION
-
 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 arg_types)
 {
@@ -2971,7 +3244,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	SLJIT_ASSERT(reg_map[TMP_REG1] != 14);
 
-	if (!(src & SLJIT_IMM)) {
+	if (src != SLJIT_IMM) {
 		if (FAST_IS_REG(src)) {
 			SLJIT_ASSERT(reg_map[src] != 14);
 			return push_inst(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RM(src));
@@ -2988,16 +3261,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	set_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_BL : 0));
 	jump->u.target = (sljit_uw)srcw;
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 	if (type >= SLJIT_FAST_CALL)
 		FAIL_IF(prepare_blx(compiler));
 	FAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, type <= SLJIT_JUMP ? TMP_PC : TMP_REG1, TMP_PC, 0), 0));
 	if (type >= SLJIT_FAST_CALL)
 		FAIL_IF(emit_blx(compiler));
-#else
+#else /* !SLJIT_CONFIG_ARM_V6 */
 	FAIL_IF(emit_imm(compiler, TMP_REG1, 0));
 	FAIL_IF(push_inst(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1)));
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 	jump->addr = compiler->size;
 	return SLJIT_SUCCESS;
 }
@@ -3096,7 +3369,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	sljit_s32 type)
 {
 	sljit_s32 dst_reg, flags = GET_ALL_FLAGS(op);
-	sljit_uw cc, ins;
+	sljit_ins cc, ins;
 
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type));
@@ -3132,61 +3405,114 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 dst_reg,
-	sljit_s32 src, sljit_sw srcw)
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_reg)
 {
-	sljit_uw cc, tmp;
+	sljit_ins cc, tmp;
 
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));
+	CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg));
+
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+
+	if (src2_reg != dst_reg && src1 == dst_reg) {
+		src1 = src2_reg;
+		src1w = 0;
+		src2_reg = dst_reg;
+		type ^= 0x1;
+	}
+
+	if (src1 & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, (src2_reg != dst_reg) ? dst_reg : TMP_REG1, src1, src1w, TMP_REG2));
+
+		if (src2_reg != dst_reg) {
+			src1 = src2_reg;
+			src1w = 0;
+			type ^= 0x1;
+		} else {
+			src1 = TMP_REG1;
+			src1w = 0;
+		}
+	} else if (dst_reg != src2_reg)
+		FAIL_IF(push_inst(compiler, MOV | RD(dst_reg) | RM(src2_reg)));
 
 	cc = get_cc(compiler, type & ~SLJIT_32);
 
-	if (SLJIT_UNLIKELY(src & SLJIT_IMM)) {
-		tmp = get_imm((sljit_uw)srcw);
+	if (SLJIT_UNLIKELY(src1 == SLJIT_IMM)) {
+		tmp = get_imm((sljit_uw)src1w);
 		if (tmp)
 			return push_inst(compiler, ((MOV | RD(dst_reg) | tmp) & ~COND_MASK) | cc);
 
-		tmp = get_imm(~(sljit_uw)srcw);
+		tmp = get_imm(~(sljit_uw)src1w);
 		if (tmp)
 			return push_inst(compiler, ((MVN | RD(dst_reg) | tmp) & ~COND_MASK) | cc);
 
 #if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
-		tmp = (sljit_uw)srcw;
+		tmp = (sljit_ins)src1w;
 		FAIL_IF(push_inst(compiler, (MOVW & ~COND_MASK) | cc | RD(dst_reg) | ((tmp << 4) & 0xf0000) | (tmp & 0xfff)));
 		if (tmp <= 0xffff)
 			return SLJIT_SUCCESS;
 		return push_inst(compiler, (MOVT & ~COND_MASK) | cc | RD(dst_reg) | ((tmp >> 12) & 0xf0000) | ((tmp >> 16) & 0xfff));
-#else
-		FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)srcw));
-		src = TMP_REG1;
-#endif
+#else /* !SLJIT_CONFIG_ARM_V7 */
+		FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)src1w));
+		src1 = TMP_REG1;
+#endif /* SLJIT_CONFIG_ARM_V7 */
+	}
+
+	return push_inst(compiler, ((MOV | RD(dst_reg) | RM(src1)) & ~COND_MASK) | cc);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_freg)
+{
+	sljit_ins cc;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg));
+
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+
+	type ^= SLJIT_32;
+
+	if (dst_freg != src2_freg) {
+		if (dst_freg == src1) {
+			src1 = src2_freg;
+			src1w = 0;
+			type ^= 0x1;
+		} else
+			FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMOV_F32, (type & SLJIT_32), dst_freg, src2_freg, 0)));
+	}
+
+	if (src1 & SLJIT_MEM) {
+		FAIL_IF(emit_fop_mem(compiler, (type & SLJIT_32) | FPU_LOAD, TMP_FREG1, src1, src1w));
+		src1 = TMP_FREG1;
 	}
 
-	return push_inst(compiler, ((MOV | RD(dst_reg) | RM(src)) & ~COND_MASK) | cc);
+	cc = get_cc(compiler, type & ~SLJIT_32);
+	return push_inst(compiler, EMIT_FPU_OPERATION((VMOV_F32 & ~COND_MASK) | cc, (type & SLJIT_32), dst_freg, src1, 0));
 }
 
+#undef EMIT_FPU_OPERATION
+
 static sljit_s32 update_mem_addr(struct sljit_compiler *compiler, sljit_s32 *mem, sljit_sw *memw, sljit_s32 max_offset)
 {
 	sljit_s32 arg = *mem;
 	sljit_sw argw = *memw;
 	sljit_uw imm, tmp;
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
-	sljit_sw mask = max_offset >= 0xf00 ? 0xfff : 0xff;
-	sljit_sw sign = max_offset >= 0xf00 ? 0x1000 : 0x100;
-#else /* !SLJIT_CONFIG_ARM_V5 */
 	sljit_sw mask = 0xfff;
 	sljit_sw sign = 0x1000;
 
 	SLJIT_ASSERT(max_offset >= 0xf00);
-#endif /* SLJIT_CONFIG_ARM_V5 */
 
 	*mem = TMP_REG1;
 
 	if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) {
 		*memw = 0;
-		return push_inst(compiler, ADD | RD(TMP_REG1) | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | ((sljit_uw)(argw & 0x3) << 7));
+		return push_inst(compiler, ADD | RD(TMP_REG1) | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | ((sljit_ins)(argw & 0x3) << 7));
 	}
 
 	arg &= REG_MASK;
@@ -3234,158 +3560,6 @@ static sljit_s32 update_mem_addr(struct
 	return push_inst(compiler, ADD | RD(TMP_REG1) | RN(TMP_REG1) | RM(arg));
 }
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
-
-static sljit_s32 sljit_emit_mem_unaligned(struct sljit_compiler *compiler, sljit_s32 type,
-	sljit_s32 reg,
-	sljit_s32 mem, sljit_sw memw)
-{
-	sljit_s32 flags, steps, tmp_reg;
-	sljit_uw add, shift;
-
-	switch (type & 0xff) {
-	case SLJIT_MOV_U8:
-	case SLJIT_MOV_S8:
-		flags = BYTE_SIZE;
-		if (!(type & SLJIT_MEM_STORE))
-			flags |= LOAD_DATA;
-		if ((type & 0xff) == SLJIT_MOV_S8)
-			flags |= SIGNED;
-
-		return emit_op_mem(compiler, flags, reg, mem, memw, TMP_REG1);
-
-	case SLJIT_MOV_U16:
-		FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xfff - 1));
-		flags = BYTE_SIZE;
-		steps = 1;
-		break;
-
-	case SLJIT_MOV_S16:
-		FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xff - 1));
-		flags = BYTE_SIZE | SIGNED;
-		steps = 1;
-		break;
-
-	default:
-		if (type & SLJIT_MEM_UNALIGNED_32) {
-			flags = WORD_SIZE;
-			if (!(type & SLJIT_MEM_STORE))
-				flags |= LOAD_DATA;
-
-			return emit_op_mem(compiler, flags, reg, mem, memw, TMP_REG1);
-		}
-
-		if (!(type & SLJIT_MEM_UNALIGNED_16)) {
-			FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xfff - 3));
-			flags = BYTE_SIZE;
-			steps = 3;
-			break;
-		}
-
-		FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xff - 2));
-
-		add = 1;
-		if (memw < 0) {
-			add = 0;
-			memw = -memw;
-		}
-
-		tmp_reg = reg;
-
-		if (type & SLJIT_MEM_STORE) {
-			FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(HALF_SIZE, add, reg, mem, TYPE2_TRANSFER_IMM(memw))));
-			FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG2) | RM(reg) | (16 << 7) | (2 << 4)));
-		} else {
-			if (reg == mem) {
-				SLJIT_ASSERT(reg != TMP_REG1);
-				tmp_reg = TMP_REG1;
-			}
-
-			FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(HALF_SIZE | LOAD_DATA, add, tmp_reg, mem, TYPE2_TRANSFER_IMM(memw))));
-		}
-
-		if (!add) {
-			memw -= 2;
-			if (memw <= 0) {
-				memw = -memw;
-				add = 1;
-			}
-		} else
-			memw += 2;
-
-		if (type & SLJIT_MEM_STORE)
-			return push_inst(compiler, EMIT_DATA_TRANSFER(HALF_SIZE, add, TMP_REG2, mem, TYPE2_TRANSFER_IMM(memw)));
-
-		FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(HALF_SIZE | LOAD_DATA, add, TMP_REG2, mem, TYPE2_TRANSFER_IMM(memw))));
-		return push_inst(compiler, ORR | RD(reg) | RN(tmp_reg) | RM(TMP_REG2) | (16 << 7));
-	}
-
-	SLJIT_ASSERT(steps > 0);
-
-	add = 1;
-	if (memw < 0) {
-		add = 0;
-		memw = -memw;
-	}
-
-	if (type & SLJIT_MEM_STORE) {
-		FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(BYTE_SIZE, add, reg, mem, memw)));
-		FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG2) | RM(reg) | (8 << 7) | (2 << 4)));
-
-		while (1) {
-			if (!add) {
-				memw -= 1;
-				if (memw == 0)
-					add = 1;
-			} else
-				memw += 1;
-
-			FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(BYTE_SIZE, add, TMP_REG2, mem, memw)));
-
-			if (--steps == 0)
-				return SLJIT_SUCCESS;
-
-			FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG2) | RM(TMP_REG2) | (8 << 7) | (2 << 4)));
-		}
-	}
-
-	tmp_reg = reg;
-
-	if (reg == mem) {
-		SLJIT_ASSERT(reg != TMP_REG1);
-		tmp_reg = TMP_REG1;
-	}
-
-	shift = 8;
-	FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(BYTE_SIZE | LOAD_DATA, add, tmp_reg, mem, memw)));
-
-	do {
-		if (!add) {
-			memw -= 1;
-			if (memw == 0)
-				add = 1;
-		} else
-			memw += 1;
-
-		if (steps > 1) {
-			FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(BYTE_SIZE | LOAD_DATA, add, TMP_REG2, mem, memw)));
-			FAIL_IF(push_inst(compiler, ORR | RD(tmp_reg) | RN(tmp_reg) | RM(TMP_REG2) | (shift << 7)));
-			shift += 8;
-		}
-	} while (--steps != 0);
-
-	flags |= LOAD_DATA;
-
-	if (flags & SIGNED)
-		FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(flags, add, TMP_REG2, mem, TYPE2_TRANSFER_IMM(memw))));
-	else
-		FAIL_IF(push_inst(compiler, EMIT_DATA_TRANSFER(flags, add, TMP_REG2, mem, memw)));
-
-	return push_inst(compiler, ORR | RD(reg) | RN(tmp_reg) | RM(TMP_REG2) | (shift << 7));
-}
-
-#endif /* SLJIT_CONFIG_ARM_V5 */
-
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 reg,
 	sljit_s32 mem, sljit_sw memw)
@@ -3395,30 +3569,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw));
 
-	if (!(reg & REG_PAIR_MASK)) {
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
-		ADJUST_LOCAL_OFFSET(mem, memw);
-#endif /* SLJIT_CONFIG_ARM_V5 */
-
+	if (!(reg & REG_PAIR_MASK))
 		return sljit_emit_mem_unaligned(compiler, type, reg, mem, memw);
-	}
 
 	ADJUST_LOCAL_OFFSET(mem, memw);
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
-	if (type & (SLJIT_MEM_UNALIGNED | SLJIT_MEM_UNALIGNED_16)) {
-		FAIL_IF(update_mem_addr(compiler, &mem, &memw, (type & SLJIT_MEM_UNALIGNED_16) ? 0xfff - 6 : 0xfff - 7));
-
-		if (!(type & SLJIT_MEM_STORE) && REG_PAIR_FIRST(reg) == (mem & REG_MASK)) {
-			FAIL_IF(sljit_emit_mem_unaligned(compiler, type, REG_PAIR_SECOND(reg), SLJIT_MEM1(mem), memw + SSIZE_OF(sw)));
-			return sljit_emit_mem_unaligned(compiler, type, REG_PAIR_FIRST(reg), SLJIT_MEM1(mem), memw);
-		}
-
-		FAIL_IF(sljit_emit_mem_unaligned(compiler, type, REG_PAIR_FIRST(reg), SLJIT_MEM1(mem), memw));
-		return sljit_emit_mem_unaligned(compiler, type, REG_PAIR_SECOND(reg), SLJIT_MEM1(mem), memw + SSIZE_OF(sw));
-	}
-#endif /* SLJIT_CONFIG_ARM_V5 */
-
 	FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xfff - 4));
 
 	flags = WORD_SIZE;
@@ -3441,7 +3596,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	sljit_s32 mem, sljit_sw memw)
 {
 	sljit_s32 flags;
-	sljit_uw is_type1_transfer, inst;
+	sljit_ins is_type1_transfer, inst;
 
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_mem_update(compiler, type, reg, mem, memw));
@@ -3500,7 +3655,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	if (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) {
 		memw &= 0x3;
 
-		inst = EMIT_DATA_TRANSFER(flags, 1, reg, mem & REG_MASK, RM(OFFS_REG(mem)) | ((sljit_uw)memw << 7));
+		inst = EMIT_DATA_TRANSFER(flags, 1, reg, mem & REG_MASK, RM(OFFS_REG(mem)) | ((sljit_ins)memw << 7));
 
 		if (is_type1_transfer)
 			inst |= (1 << 25);
@@ -3526,7 +3681,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		else
 			memw = -memw;
 
-		return push_inst(compiler, inst | (sljit_uw)memw);
+		return push_inst(compiler, inst | (sljit_ins)memw);
 	}
 
 	if (memw >= 0)
@@ -3534,106 +3689,752 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	else
 		memw = -memw;
 
-	return push_inst(compiler, inst | TYPE2_TRANSFER_IMM((sljit_uw)memw));
+	return push_inst(compiler, inst | TYPE2_TRANSFER_IMM((sljit_ins)memw));
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 freg,
 	sljit_s32 mem, sljit_sw memw)
 {
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
-	sljit_s32 max_offset;
-	sljit_s32 dst;
-#endif /* SLJIT_CONFIG_ARM_V5 */
-
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_fmem(compiler, type, freg, mem, memw));
 
-	if (type & SLJIT_MEM_UNALIGNED_32)
+	if (type & SLJIT_MEM_ALIGNED_32)
 		return emit_fop_mem(compiler, ((type ^ SLJIT_32) & SLJIT_32) | ((type & SLJIT_MEM_STORE) ? 0 : FPU_LOAD), freg, mem, memw);
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
 	if (type & SLJIT_MEM_STORE) {
 		FAIL_IF(push_inst(compiler, VMOV | (1 << 20) | VN(freg) | RD(TMP_REG2)));
 
 		if (type & SLJIT_32)
-			return sljit_emit_mem_unaligned(compiler, SLJIT_MOV | SLJIT_MEM_STORE | (type & SLJIT_MEM_UNALIGNED_16), TMP_REG2, mem, memw);
-
-		max_offset = 0xfff - 7;
-		if (type & SLJIT_MEM_UNALIGNED_16)
-			max_offset++;
+			return emit_op_mem(compiler, WORD_SIZE, TMP_REG2, mem, memw, TMP_REG1);
 
-		FAIL_IF(update_mem_addr(compiler, &mem, &memw, max_offset));
+		FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xfff - 4));
 		mem |= SLJIT_MEM;
 
-		FAIL_IF(sljit_emit_mem_unaligned(compiler, SLJIT_MOV | SLJIT_MEM_STORE | (type & SLJIT_MEM_UNALIGNED_16), TMP_REG2, mem, memw));
-
+		FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, mem, memw, TMP_REG1));
 		FAIL_IF(push_inst(compiler, VMOV | (1 << 20) | VN(freg) | 0x80 | RD(TMP_REG2)));
-		return sljit_emit_mem_unaligned(compiler, SLJIT_MOV | SLJIT_MEM_STORE | (type & SLJIT_MEM_UNALIGNED_16), TMP_REG2, mem, memw + 4);
+		return emit_op_mem(compiler, WORD_SIZE, TMP_REG2, mem, memw + 4, TMP_REG1);
 	}
 
-	max_offset = (type & SLJIT_32) ? 0xfff - 3 : 0xfff - 7;
-	if (type & SLJIT_MEM_UNALIGNED_16)
-		max_offset++;
+	if (type & SLJIT_32) {
+		FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG2, mem, memw, TMP_REG1));
+		return push_inst(compiler, VMOV | VN(freg) | RD(TMP_REG2));
+	}
+
+	FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xfff - 4));
+	mem |= SLJIT_MEM;
+
+	FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG2, mem, memw, TMP_REG1));
+	FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG1, mem, memw + 4, TMP_REG1));
+	return push_inst(compiler, VMOV2 | VM(freg) | RD(TMP_REG2) | RN(TMP_REG1));
+}
 
-	FAIL_IF(update_mem_addr(compiler, &mem, &memw, max_offset));
+static sljit_s32 sljit_emit_simd_mem_offset(struct sljit_compiler *compiler, sljit_s32 *mem_ptr, sljit_sw memw)
+{
+	sljit_s32 mem = *mem_ptr;
+	sljit_uw imm;
 
-	dst = TMP_REG1;
+	if (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) {
+		*mem_ptr = TMP_REG1;
+		return push_inst(compiler, ADD | RD(TMP_REG1) | RN(mem & REG_MASK) | RM(OFFS_REG(mem)) | ((sljit_ins)(memw & 0x3) << 7));
+	}
 
-	/* Stack offset adjustment is not needed because dst
-	   is not stored on the stack when mem is SLJIT_SP. */
+	if (SLJIT_UNLIKELY(!(mem & REG_MASK))) {
+		*mem_ptr = TMP_REG1;
+		return load_immediate(compiler, TMP_REG1, (sljit_uw)memw);
+	}
 
-	if (mem == TMP_REG1) {
-		dst = SLJIT_R3;
+	mem &= REG_MASK;
 
-		if (compiler->scratches >= 4)
-			FAIL_IF(push_inst(compiler, STR | (1 << 21) | RN(SLJIT_SP) | RD(SLJIT_R3) | 8));
+	if (memw == 0) {
+		*mem_ptr = mem;
+		return SLJIT_SUCCESS;
 	}
 
-	mem |= SLJIT_MEM;
+	*mem_ptr = TMP_REG1;
+	imm = get_imm((sljit_uw)(memw < 0 ? -memw : memw));
+
+	if (imm != 0)
+		return push_inst(compiler, ((memw < 0) ? SUB : ADD) | RD(TMP_REG1) | RN(mem) | imm);
+
+	FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)memw));
+	return push_inst(compiler, ADD | RD(TMP_REG1) | RN(TMP_REG1) | RM(mem));
+}
+
+static SLJIT_INLINE sljit_s32 simd_get_quad_reg_index(sljit_s32 freg)
+{
+	freg += freg & 0x1;
+
+	SLJIT_ASSERT((freg_map[freg] & 0x1) == (freg <= SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS));
+
+	if (freg <= SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS)
+		freg--;
+
+	return freg;
+}
+
+#define SLJIT_QUAD_OTHER_HALF(freg) ((((freg) & 0x1) << 1) - 1)
 
-	FAIL_IF(sljit_emit_mem_unaligned(compiler, SLJIT_MOV | (type & SLJIT_MEM_UNALIGNED_16), dst, mem, memw));
-	FAIL_IF(push_inst(compiler, VMOV | VN(freg) | RD(dst)));
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 srcdst, sljit_sw srcdstw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_s32 alignment = SLJIT_SIMD_GET_ELEM2_SIZE(type);
+	sljit_ins ins;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_mov(compiler, type, freg, srcdst, srcdstw));
+
+	ADJUST_LOCAL_OFFSET(srcdst, srcdstw);
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (reg_size == 4)
+		freg = simd_get_quad_reg_index(freg);
+
+	if (!(srcdst & SLJIT_MEM)) {
+		if (reg_size == 4)
+			srcdst = simd_get_quad_reg_index(srcdst);
 
-	if (!(type & SLJIT_32)) {
-		FAIL_IF(sljit_emit_mem_unaligned(compiler, SLJIT_MOV | (type & SLJIT_MEM_UNALIGNED_16), dst, mem, memw + 4));
-		FAIL_IF(push_inst(compiler, VMOV | VN(freg) | 0x80 | RD(dst)));
+		if (type & SLJIT_SIMD_STORE)
+			ins = VD(srcdst) | VN(freg) | VM(freg);
+		else
+			ins = VD(freg) | VN(srcdst) | VM(srcdst);
+
+		if (reg_size == 4)
+			ins |= (sljit_ins)1 << 6;
+
+		return push_inst(compiler, VORR | ins);
 	}
 
-	if (dst == SLJIT_R3 && compiler->scratches >= 4)
-		FAIL_IF(push_inst(compiler, (LDR ^ (0x1 << 24)) | (0x1 << 23) | RN(SLJIT_SP) | RD(SLJIT_R3) | 8));
-	return SLJIT_SUCCESS;
-#else /* !SLJIT_CONFIG_ARM_V5 */
-	if (type & SLJIT_MEM_STORE) {
-		FAIL_IF(push_inst(compiler, VMOV | (1 << 20) | VN(freg) | RD(TMP_REG2)));
+	FAIL_IF(sljit_emit_simd_mem_offset(compiler, &srcdst, srcdstw));
 
-		if (type & SLJIT_32)
-			return emit_op_mem(compiler, WORD_SIZE, TMP_REG2, mem, memw, TMP_REG1);
+	if (elem_size > 3)
+		elem_size = 3;
 
-		FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xfff - 4));
-		mem |= SLJIT_MEM;
+	ins = ((type & SLJIT_SIMD_STORE) ? VST1 : VLD1) | VD(freg)
+		| (sljit_ins)((reg_size == 3) ? (0x7 << 8) : (0xa << 8));
 
-		FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, mem, memw, TMP_REG1));
-		FAIL_IF(push_inst(compiler, VMOV | (1 << 20) | VN(freg) | 0x80 | RD(TMP_REG2)));
-		return emit_op_mem(compiler, WORD_SIZE, TMP_REG2, mem, memw + 4, TMP_REG1);
+	SLJIT_ASSERT(reg_size >= alignment);
+
+	if (alignment == 3)
+		ins |= 0x10;
+	else if (alignment >= 3)
+		ins |= 0x20;
+
+	return push_inst(compiler, ins | RN(srcdst) | ((sljit_ins)elem_size) << 6 | 0xf);
+}
+
+static sljit_ins simd_get_imm(sljit_s32 elem_size, sljit_uw value)
+{
+	sljit_ins result;
+
+	if (elem_size > 1 && (sljit_u16)value == (value >> 16)) {
+		elem_size = 1;
+		value = (sljit_u16)value;
 	}
 
-	if (type & SLJIT_32) {
-		FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG2, mem, memw, TMP_REG1));
-		return push_inst(compiler, VMOV | VN(freg) | RD(TMP_REG2));
+	if (elem_size == 1 && (sljit_u8)value == (value >> 8)) {
+		elem_size = 0;
+		value = (sljit_u8)value;
 	}
 
-	FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xfff - 4));
-	mem |= SLJIT_MEM;
+	switch (elem_size) {
+	case 0:
+		SLJIT_ASSERT(value <= 0xff);
+		result = 0xe00;
+		break;
+	case 1:
+		SLJIT_ASSERT(value <= 0xffff);
+		result = 0;
 
-	FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG2, mem, memw, TMP_REG1));
-	FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG1, mem, memw + 4, TMP_REG1));
-	return push_inst(compiler, VMOV2 | VM(freg) | RD(TMP_REG2) | RN(TMP_REG1));
-#endif /* SLJIT_CONFIG_ARM_V5 */
+		while (1) {
+			if (value <= 0xff) {
+				result |= 0x800;
+				break;
+			}
+
+			if ((value & 0xff) == 0) {
+				value >>= 8;
+				result |= 0xa00;
+				break;
+			}
+
+			if (result != 0)
+				return ~(sljit_ins)0;
+
+			value ^= (sljit_uw)0xffff;
+			result = (1 << 5);
+		}
+		break;
+	default:
+		SLJIT_ASSERT(value <= 0xffffffff);
+		result = 0;
+
+		while (1) {
+			if (value <= 0xff) {
+				result |= 0x000;
+				break;
+			}
+
+			if ((value & ~(sljit_uw)0xff00) == 0) {
+				value >>= 8;
+				result |= 0x200;
+				break;
+			}
+
+			if ((value & ~(sljit_uw)0xff0000) == 0) {
+				value >>= 16;
+				result |= 0x400;
+				break;
+			}
+
+			if ((value & ~(sljit_uw)0xff000000) == 0) {
+				value >>= 24;
+				result |= 0x600;
+				break;
+			}
+
+			if ((value & (sljit_uw)0xff) == 0xff && (value >> 16) == 0) {
+				value >>= 8;
+				result |= 0xc00;
+				break;
+			}
+
+			if ((value & (sljit_uw)0xffff) == 0xffff && (value >> 24) == 0) {
+				value >>= 16;
+				result |= 0xd00;
+				break;
+			}
+
+			if (result != 0)
+				return ~(sljit_ins)0;
+
+			value = ~value;
+			result = (1 << 5);
+		}
+		break;
+	}
+
+	return ((sljit_ins)value & 0xf) | (((sljit_ins)value & 0x70) << 12) | (((sljit_ins)value & 0x80) << 17) | result;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins, imm;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_replicate(compiler, type, freg, src, srcw));
+
+	ADJUST_LOCAL_OFFSET(src, srcw);
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) ? (elem_size < 2 || elem_size > 3) : (elem_size > 2))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (reg_size == 4)
+		freg = simd_get_quad_reg_index(freg);
+
+	if (src == SLJIT_IMM && srcw == 0)
+		return push_inst(compiler, VMOV_i | ((reg_size == 4) ? (1 << 6) : 0) | VD(freg));
+
+	if (SLJIT_UNLIKELY(elem_size == 3)) {
+		SLJIT_ASSERT(type & SLJIT_SIMD_FLOAT);
+
+		if (src & SLJIT_MEM) {
+			FAIL_IF(emit_fop_mem(compiler, FPU_LOAD | SLJIT_32, freg, src, srcw));
+			src = freg;
+		} else if (freg != src)
+			FAIL_IF(push_inst(compiler, VORR | VD(freg) | VN(src) | VM(src)));
+
+		freg += SLJIT_QUAD_OTHER_HALF(freg);
+
+		if (freg != src)
+			return push_inst(compiler, VORR | VD(freg) | VN(src) | VM(src));
+		return SLJIT_SUCCESS;
+	}
+
+	if (src & SLJIT_MEM) {
+		FAIL_IF(sljit_emit_simd_mem_offset(compiler, &src, srcw));
+
+		ins = (sljit_ins)(elem_size << 6);
+
+		if (reg_size == 4)
+			ins |= (sljit_ins)1 << 5;
+
+		return push_inst(compiler, VLD1_r | ins | VD(freg) | RN(src) | 0xf);
+	}
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		SLJIT_ASSERT(elem_size == 2);
+		ins = ((sljit_ins)freg_ebit_map[src] << (16 + 2 + 1)) | ((sljit_ins)1 << (16 + 2));
+
+		if (reg_size == 4)
+			ins |= (sljit_ins)1 << 6;
+
+		return push_inst(compiler, VDUP_s | ins | VD(freg) | (sljit_ins)freg_map[src]);
+	}
+
+	if (src == SLJIT_IMM) {
+		if (elem_size < 2)
+			srcw &= ((sljit_sw)1 << (((sljit_sw)1 << elem_size) << 3)) - 1;
+
+		imm = simd_get_imm(elem_size, (sljit_uw)srcw);
+
+		if (imm != ~(sljit_ins)0) {
+			if (reg_size == 4)
+				imm |= (sljit_ins)1 << 6;
+
+			return push_inst(compiler, VMOV_i | imm | VD(freg));
+		}
+
+		FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)srcw));
+		src = TMP_REG1;
+	}
+
+	switch (elem_size) {
+	case 0:
+		ins = 1 << 22;
+		break;
+	case 1:
+		ins = 1 << 5;
+		break;
+	default:
+		ins = 0;
+		break;
+	}
+
+	if (reg_size == 4)
+		ins |= (sljit_ins)1 << 21;
+
+	return push_inst(compiler, VDUP | ins | VN(freg) | RD(src));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg, sljit_s32 lane_index,
+	sljit_s32 srcdst, sljit_sw srcdstw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_lane_mov(compiler, type, freg, lane_index, srcdst, srcdstw));
+
+	ADJUST_LOCAL_OFFSET(srcdst, srcdstw);
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) ? (elem_size < 2 || elem_size > 3) : (elem_size > 2))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (reg_size == 4)
+		freg = simd_get_quad_reg_index(freg);
+
+	if (type & SLJIT_SIMD_LANE_ZERO) {
+		ins = (reg_size == 3) ? 0 : ((sljit_ins)1 << 6);
+
+		if (type & SLJIT_SIMD_FLOAT) {
+			if (elem_size == 3 && !(srcdst & SLJIT_MEM)) {
+				if (lane_index == 1)
+					freg += SLJIT_QUAD_OTHER_HALF(freg);
+
+				if (srcdst != freg)
+					FAIL_IF(push_inst(compiler, VORR | VD(freg) | VN(srcdst) | VM(srcdst)));
+
+				freg += SLJIT_QUAD_OTHER_HALF(freg);
+				return push_inst(compiler, VMOV_i | VD(freg));
+			}
+
+			if (srcdst == freg || (elem_size == 3 && srcdst == (freg + SLJIT_QUAD_OTHER_HALF(freg)))) {
+				FAIL_IF(push_inst(compiler, VORR | ins | VD(TMP_FREG2) | VN(freg) | VM(freg)));
+				srcdst = TMP_FREG2;
+				srcdstw = 0;
+			}
+		}
+
+		FAIL_IF(push_inst(compiler, VMOV_i | ins | VD(freg)));
+	}
+
+	if (reg_size == 4 && lane_index >= (0x8 >> elem_size)) {
+		lane_index -= (0x8 >> elem_size);
+		freg += SLJIT_QUAD_OTHER_HALF(freg);
+	}
+
+	if (srcdst & SLJIT_MEM) {
+		if (elem_size == 3)
+			return emit_fop_mem(compiler, ((type & SLJIT_SIMD_STORE) ? 0 : FPU_LOAD) | SLJIT_32, freg, srcdst, srcdstw);
+
+		FAIL_IF(sljit_emit_simd_mem_offset(compiler, &srcdst, srcdstw));
+
+		lane_index = lane_index << elem_size;
+		ins = (sljit_ins)((elem_size << 10) | (lane_index << 5));
+		return push_inst(compiler, ((type & SLJIT_SIMD_STORE) ? VST1_s : VLD1_s) | ins | VD(freg) | RN(srcdst) | 0xf);
+	}
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		if (elem_size == 3) {
+			if (type & SLJIT_SIMD_STORE)
+				return push_inst(compiler, VORR | VD(srcdst) | VN(freg) | VM(freg));
+			return push_inst(compiler, VMOV_F32 | SLJIT_32 | VD(freg) | VM(srcdst));
+		}
+
+		if (type & SLJIT_SIMD_STORE) {
+			if (freg_ebit_map[freg] == 0) {
+				if (lane_index == 1)
+					freg = SLJIT_F64_SECOND(freg);
+
+				return push_inst(compiler, VMOV_F32 | VD(srcdst) | VM(freg));
+			}
+
+			FAIL_IF(push_inst(compiler, VMOV_s | (1 << 20) | ((sljit_ins)lane_index << 21) | VN(freg) | RD(TMP_REG1)));
+			return push_inst(compiler, VMOV | VN(srcdst) | RD(TMP_REG1));
+		}
+
+		FAIL_IF(push_inst(compiler, VMOV | (1 << 20) | VN(srcdst) | RD(TMP_REG1)));
+		return push_inst(compiler, VMOV_s | ((sljit_ins)lane_index << 21) | VN(freg) | RD(TMP_REG1));
+	}
+
+	if (srcdst == SLJIT_IMM) {
+		if (elem_size < 2)
+			srcdstw &= ((sljit_sw)1 << (((sljit_sw)1 << elem_size) << 3)) - 1;
+
+		FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)srcdstw));
+		srcdst = TMP_REG1;
+	}
+
+	if (elem_size == 0)
+		ins = 0x400000;
+	else if (elem_size == 1)
+		ins = 0x20;
+	else
+		ins = 0;
+
+	lane_index = lane_index << elem_size;
+	ins |= (sljit_ins)(((lane_index & 0x4) << 19) | ((lane_index & 0x3) << 5));
+
+	if (type & SLJIT_SIMD_STORE) {
+		ins |= (1 << 20);
+
+		if (elem_size < 2 && !(type & SLJIT_SIMD_LANE_SIGNED))
+			ins |= (1 << 23);
+	}
+
+	return push_inst(compiler, VMOV_s | ins | VN(freg) | RD(srcdst));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_s32 src_lane_index)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_lane_replicate(compiler, type, freg, src, src_lane_index));
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (reg_size == 4) {
+		freg = simd_get_quad_reg_index(freg);
+		src = simd_get_quad_reg_index(src);
+
+		if (src_lane_index >= (0x8 >> elem_size)) {
+			src_lane_index -= (0x8 >> elem_size);
+			src += SLJIT_QUAD_OTHER_HALF(src);
+		}
+	}
+
+	if (elem_size == 3) {
+		if (freg != src)
+			FAIL_IF(push_inst(compiler, VORR | VD(freg) | VN(src) | VM(src)));
+
+		freg += SLJIT_QUAD_OTHER_HALF(freg);
+
+		if (freg != src)
+			return push_inst(compiler, VORR | VD(freg) | VN(src) | VM(src));
+		return SLJIT_SUCCESS;
+	}
+
+	ins = ((((sljit_ins)src_lane_index << 1) | 1) << (16 + elem_size));
+
+	if (reg_size == 4)
+		ins |= (sljit_ins)1 << 6;
+
+	return push_inst(compiler, VDUP_s | ins | VD(freg) | VM(src));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_s32 elem2_size = SLJIT_SIMD_GET_ELEM2_SIZE(type);
+	sljit_s32 dst_reg;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_extend(compiler, type, freg, src, srcw));
+
+	ADJUST_LOCAL_OFFSET(src, srcw);
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size != 2 || elem2_size != 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (reg_size == 4)
+		freg = simd_get_quad_reg_index(freg);
+
+	if (src & SLJIT_MEM) {
+		FAIL_IF(sljit_emit_simd_mem_offset(compiler, &src, srcw));
+		if (reg_size == 4 && elem2_size - elem_size == 1)
+			FAIL_IF(push_inst(compiler, VLD1 | (0x7 << 8) | VD(freg) | RN(src) | 0xf));
+		else
+			FAIL_IF(push_inst(compiler, VLD1_s | (sljit_ins)((reg_size - elem2_size + elem_size) << 10) | VD(freg) | RN(src) | 0xf));
+		src = freg;
+	} else if (reg_size == 4)
+		src = simd_get_quad_reg_index(src);
+
+	if (!(type & SLJIT_SIMD_FLOAT)) {
+		dst_reg = (reg_size == 4) ? freg : TMP_FREG2;
+
+		do {
+			FAIL_IF(push_inst(compiler, VSHLL | ((type & SLJIT_SIMD_EXTEND_SIGNED) ? 0 : (1 << 24))
+				| ((sljit_ins)1 << (19 + elem_size)) | VD(dst_reg) | VM(src)));
+			src = dst_reg;
+		} while (++elem_size < elem2_size);
+
+		if (dst_reg == TMP_FREG2)
+			return push_inst(compiler, VORR | VD(freg) | VN(TMP_FREG2) | VM(TMP_FREG2));
+		return SLJIT_SUCCESS;
+	}
+
+	/* No SIMD variant, must use VFP instead. */
+	SLJIT_ASSERT(reg_size == 4);
+
+	if (freg == src) {
+		freg += SLJIT_QUAD_OTHER_HALF(freg);
+		FAIL_IF(push_inst(compiler, VCVT_F64_F32 | VD(freg) | VM(src) | 0x20));
+		freg += SLJIT_QUAD_OTHER_HALF(freg);
+		return push_inst(compiler, VCVT_F64_F32 | VD(freg) | VM(src));
+	}
+
+	FAIL_IF(push_inst(compiler, VCVT_F64_F32 | VD(freg) | VM(src)));
+	freg += SLJIT_QUAD_OTHER_HALF(freg);
+	return push_inst(compiler, VCVT_F64_F32 | VD(freg) | VM(src) | 0x20);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 dst, sljit_sw dstw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins, imms;
+	sljit_s32 dst_r;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_sign(compiler, type, freg, dst, dstw));
+
+	ADJUST_LOCAL_OFFSET(dst, dstw);
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	switch (elem_size) {
+	case 0:
+		imms = 0x243219;
+		ins = VSHR | (1 << 24) | (0x9 << 16);
+		break;
+	case 1:
+		imms = (reg_size == 4) ? 0x243219 : 0x2231;
+		ins = VSHR | (1 << 24) | (0x11 << 16);
+		break;
+	case 2:
+		imms = (reg_size == 4) ? 0x2231 : 0x21;
+		ins = VSHR | (1 << 24) | (0x21 << 16);
+		break;
+	default:
+		imms = 0x21;
+		ins = VSHR | (1 << 24) | (0x1 << 16) | (1 << 7);
+		break;
+	}
+
+	if (reg_size == 4) {
+		freg = simd_get_quad_reg_index(freg);
+		ins |= (sljit_ins)1 << 6;
+	}
+
+	SLJIT_ASSERT((freg_map[TMP_FREG2] & 0x1) == 0);
+	FAIL_IF(push_inst(compiler, ins | VD(TMP_FREG2) | VM(freg)));
+
+	if (reg_size == 4 && elem_size > 0)
+		FAIL_IF(push_inst(compiler, VMOVN | ((sljit_ins)(elem_size - 1) << 18) | VD(TMP_FREG2) | VM(TMP_FREG2)));
+
+	ins = (reg_size == 4 && elem_size == 0) ? (1 << 6) : 0;
+
+	while (imms >= 0x100) {
+		FAIL_IF(push_inst(compiler, VSRA | (1 << 24) | ins | ((imms & 0xff) << 16) | VD(TMP_FREG2) | VM(TMP_FREG2)));
+		imms >>= 8;
+	}
+
+	FAIL_IF(push_inst(compiler, VSRA | (1 << 24) | ins | (1 << 7) | (imms << 16) | VD(TMP_FREG2) | VM(TMP_FREG2)));
+
+	dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
+	FAIL_IF(push_inst(compiler, VMOV_s | (1 << 20) | (1 << 23) | (0x2 << 21) | RD(dst_r) | VN(TMP_FREG2)));
+
+	if (reg_size == 4 && elem_size == 0) {
+		SLJIT_ASSERT(freg_map[TMP_FREG2] + 1 == freg_map[TMP_FREG1]);
+		FAIL_IF(push_inst(compiler, VMOV_s | (1 << 20) | (1 << 23) | (0x2 << 21) | RD(TMP_REG2) | VN(TMP_FREG1)));
+		FAIL_IF(push_inst(compiler, ORR | RD(dst_r) | RN(dst_r) | RM(TMP_REG2) | (0x8 << 7)));
+	}
+
+	if (dst_r == TMP_REG1)
+		return emit_op_mem(compiler, WORD_SIZE, TMP_REG1, dst, dstw, TMP_REG2);
+
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins = 0;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_op2(compiler, type, dst_freg, src1_freg, src2_freg));
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	switch (SLJIT_SIMD_GET_OPCODE(type)) {
+	case SLJIT_SIMD_OP2_AND:
+		ins = VAND;
+		break;
+	case SLJIT_SIMD_OP2_OR:
+		ins = VORR;
+		break;
+	case SLJIT_SIMD_OP2_XOR:
+		ins = VEOR;
+		break;
+	}
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (reg_size == 4) {
+		dst_freg = simd_get_quad_reg_index(dst_freg);
+		src1_freg = simd_get_quad_reg_index(src1_freg);
+		src2_freg = simd_get_quad_reg_index(src2_freg);
+		ins |= (sljit_ins)1 << 6;
+	}
+
+	return push_inst(compiler, ins | VD(dst_freg) | VN(src1_freg) | VM(src2_freg));
 }
 
 #undef FPU_LOAD
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst_reg,
+	sljit_s32 mem_reg)
+{
+	sljit_u32 ins;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg));
+
+	switch (GET_OPCODE(op)) {
+	case SLJIT_MOV_U8:
+		ins = LDREXB;
+		break;
+	case SLJIT_MOV_U16:
+		ins = LDREXH;
+		break;
+	default:
+		ins = LDREX;
+		break;
+	}
+
+	return push_inst(compiler, ins | RN(mem_reg) | RD(dst_reg));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 src_reg,
+	sljit_s32 mem_reg,
+	sljit_s32 temp_reg)
+{
+	sljit_u32 ins;
+
+	/* temp_reg == mem_reg is undefined so use another temp register */
+	SLJIT_UNUSED_ARG(temp_reg);
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg));
+
+	switch (GET_OPCODE(op)) {
+	case SLJIT_MOV_U8:
+		ins = STREXB;
+		break;
+	case SLJIT_MOV_U16:
+		ins = STREXH;
+		break;
+	default:
+		ins = STREX;
+		break;
+	}
+
+	FAIL_IF(push_inst(compiler, ins | RN(mem_reg) | RD(TMP_REG1) | RM(src_reg)));
+	if (op & SLJIT_SET_ATOMIC_STORED)
+		return push_inst(compiler, CMP | SET_FLAGS | SRC2_IMM | RN(TMP_REG1));
+
+	return SLJIT_SUCCESS;
+}
+
 SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
 {
 	struct sljit_const *const_;
@@ -3645,13 +4446,13 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_co
 
 	dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2;
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 	PTR_FAIL_IF(push_inst_with_unique_literal(compiler,
-		EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, dst_r, TMP_PC, 0), (sljit_uw)init_value));
+		EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, dst_r, TMP_PC, 0), (sljit_ins)init_value));
 	compiler->patches++;
-#else
+#else /* !SLJIT_CONFIG_ARM_V6 */
 	PTR_FAIL_IF(emit_imm(compiler, dst_r, init_value));
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 
 	const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
 	PTR_FAIL_IF(!const_);
@@ -3673,12 +4474,12 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_pu
 
 	dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2;
 
-#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
 	PTR_FAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, dst_r, TMP_PC, 0), 0));
 	compiler->patches++;
-#else
+#else /* !SLJIT_CONFIG_ARM_V6 */
 	PTR_FAIL_IF(emit_imm(compiler, dst_r, 0));
-#endif
+#endif /* SLJIT_CONFIG_ARM_V6 */
 
 	put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label));
 	PTR_FAIL_IF(!put_label);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeARM_64.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeARM_64.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeARM_64.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeARM_64.c	2024-11-20 13:56:33.000000000 +0000
@@ -67,79 +67,123 @@ static const sljit_u8 freg_map[SLJIT_NUM
 /*  Instrucion forms                                                     */
 /* --------------------------------------------------------------------- */
 
-#define ADC 0x9a000000
-#define ADD 0x8b000000
-#define ADDE 0x8b200000
-#define ADDI 0x91000000
-#define AND 0x8a000000
-#define ANDI 0x92000000
-#define ASRV 0x9ac02800
-#define B 0x14000000
-#define B_CC 0x54000000
-#define BL 0x94000000
-#define BLR 0xd63f0000
-#define BR 0xd61f0000
-#define BRK 0xd4200000
-#define CBZ 0xb4000000
-#define CLZ 0xdac01000
-#define CSEL 0x9a800000
-#define CSINC 0x9a800400
-#define EOR 0xca000000
-#define EORI 0xd2000000
-#define EXTR 0x93c00000
-#define FABS 0x1e60c000
-#define FADD 0x1e602800
-#define FCMP 0x1e602000
-#define FCVT 0x1e224000
-#define FCVTZS 0x9e780000
-#define FDIV 0x1e601800
-#define FMOV 0x1e604000
-#define FMUL 0x1e600800
-#define FNEG 0x1e614000
-#define FSUB 0x1e603800
-#define LDRI 0xf9400000
-#define LDRI_F64 0xfd400000
-#define LDRI_POST 0xf8400400
-#define LDP 0xa9400000
-#define LDP_F64 0x6d400000
-#define LDP_POST 0xa8c00000
-#define LDR_PRE 0xf8400c00
-#define LSLV 0x9ac02000
-#define LSRV 0x9ac02400
-#define MADD 0x9b000000
-#define MOVK 0xf2800000
-#define MOVN 0x92800000
-#define MOVZ 0xd2800000
-#define NOP 0xd503201f
-#define ORN 0xaa200000
-#define ORR 0xaa000000
-#define ORRI 0xb2000000
-#define RBIT 0xdac00000
-#define RET 0xd65f0000
-#define RORV 0x9ac02c00
-#define SBC 0xda000000
-#define SBFM 0x93000000
-#define SCVTF 0x9e620000
-#define SDIV 0x9ac00c00
-#define SMADDL 0x9b200000
-#define SMULH 0x9b403c00
-#define STP 0xa9000000
-#define STP_F64 0x6d000000
-#define STP_PRE 0xa9800000
-#define STRB 0x38206800
-#define STRBI 0x39000000
-#define STRI 0xf9000000
-#define STRI_F64 0xfd000000
-#define STR_FI 0x3d000000
-#define STR_FR 0x3c206800
-#define STUR_FI 0x3c000000
-#define STURBI 0x38000000
-#define SUB 0xcb000000
-#define SUBI 0xd1000000
-#define SUBS 0xeb000000
-#define UBFM 0xd3000000
-#define UDIV 0x9ac00800
-#define UMULH 0x9bc03c00
+#define ADC		0x9a000000
+#define ADD		0x8b000000
+#define ADDE		0x8b200000
+#define ADDI		0x91000000
+#define AND		0x8a000000
+#define ANDI		0x92000000
+#define AND_v		0x0e201c00
+#define ASRV		0x9ac02800
+#define B		0x14000000
+#define B_CC		0x54000000
+#define BL		0x94000000
+#define BLR		0xd63f0000
+#define BR		0xd61f0000
+#define BRK		0xd4200000
+#define CAS		0xc8a07c00
+#define CASB		0x08a07c00
+#define CASH		0x48a07c00
+#define CBZ		0xb4000000
+#define CCMPI		0xfa400800
+#define CLZ		0xdac01000
+#define CSEL		0x9a800000
+#define CSINC		0x9a800400
+#define DUP_e		0x0e000400
+#define DUP_g		0x0e000c00
+#define EOR		0xca000000
+#define EOR_v		0x2e201c00
+#define EORI		0xd2000000
+#define EXTR		0x93c00000
+#define FABS		0x1e60c000
+#define FADD		0x1e602800
+#define FCMP		0x1e602000
+#define FCSEL		0x1e600c00
+#define FCVT		0x1e224000
+#define FCVTL		0x0e217800
+#define FCVTZS		0x9e780000
+#define FDIV		0x1e601800
+#define FMOV		0x1e604000
+#define FMOV_R		0x9e660000
+#define FMOV_I		0x1e601000
+#define FMUL		0x1e600800
+#define FNEG		0x1e614000
+#define FSUB		0x1e603800
+#define INS		0x4e001c00
+#define INS_e		0x6e000400
+#define LD1		0x0c407000
+#define LD1_s		0x0d400000
+#define LD1R		0x0d40c000
+#define LDRI		0xf9400000
+#define LDRI_F64	0xfd400000
+#define LDRI_POST	0xf8400400
+#define LDP		0xa9400000
+#define LDP_F64		0x6d400000
+#define LDP_POST	0xa8c00000
+#define LDR_PRE		0xf8400c00
+#define LDXR		0xc85f7c00
+#define LDXRB		0x085f7c00
+#define LDXRH		0x485f7c00
+#define LSLV		0x9ac02000
+#define LSRV		0x9ac02400
+#define MADD		0x9b000000
+#define MOVI		0x0f000400
+#define MOVK		0xf2800000
+#define MOVN		0x92800000
+#define MOVZ		0xd2800000
+#define NOP		0xd503201f
+#define ORN		0xaa200000
+#define ORR		0xaa000000
+#define ORR_v		0x0ea01c00
+#define ORRI		0xb2000000
+#define RBIT		0xdac00000
+#define RET		0xd65f0000
+#define REV		0xdac00c00
+#define REV16		0xdac00400
+#define RORV		0x9ac02c00
+#define SBC		0xda000000
+#define SBFM		0x93400000
+#define SCVTF		0x9e620000
+#define SDIV		0x9ac00c00
+#define SMADDL		0x9b200000
+#define SMOV		0x0e002c00
+#define SMULH		0x9b403c00
+#define SSHLL		0x0f00a400
+#define ST1		0x0c007000
+#define ST1_s		0x0d000000
+#define STP		0xa9000000
+#define STP_F64		0x6d000000
+#define STP_PRE		0xa9800000
+#define STRB		0x38206800
+#define STRBI		0x39000000
+#define STRI		0xf9000000
+#define STRI_F64	0xfd000000
+#define STR_FI		0x3d000000
+#define STR_FR		0x3c206800
+#define STUR_FI		0x3c000000
+#define STURBI		0x38000000
+#define STXR		0xc8007c00
+#define STXRB		0x8007c00
+#define STXRH		0x48007c00
+#define SUB		0xcb000000
+#define SUBI		0xd1000000
+#define SUBS		0xeb000000
+#define TBZ		0x36000000
+#define UBFM		0xd3400000
+#define UCVTF		0x9e630000
+#define UDIV		0x9ac00800
+#define UMOV		0x0e003c00
+#define UMULH		0x9bc03c00
+#define USHLL		0x2f00a400
+#define USHR		0x2f000400
+#define USRA		0x2f001400
+#define XTN		0x0e212800
+
+#define CSET		(CSINC | RM(TMP_ZERO) | RN(TMP_ZERO))
+#define LDR		(STRI | (1 << 22))
+#define LDRB		(STRBI | (1 << 22))
+#define LDRH		(LDRB | (1 << 30))
+#define MOV		(ORR | RN(TMP_ZERO))
 
 static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins)
 {
@@ -175,7 +219,7 @@ static SLJIT_INLINE sljit_sw detect_jump
 		target_addr = (sljit_uw)(code + jump->u.label->size) + (sljit_uw)executable_offset;
 	}
 
-	diff = (sljit_sw)target_addr - (sljit_sw)(code_ptr + 4) - executable_offset;
+	diff = (sljit_sw)target_addr - (sljit_sw)(code_ptr - 4) - executable_offset;
 
 	if (jump->flags & IS_COND) {
 		diff += SSIZE_OF(ins);
@@ -385,8 +429,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 {
 	switch (feature_type) {
 	case SLJIT_HAS_FPU:
+	case SLJIT_HAS_SIMD:
 #ifdef SLJIT_IS_FPU_AVAILABLE
-		return SLJIT_IS_FPU_AVAILABLE;
+		return (SLJIT_IS_FPU_AVAILABLE) != 0;
 #else
 		/* Available by default. */
 		return 1;
@@ -394,9 +439,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	case SLJIT_HAS_CLZ:
 	case SLJIT_HAS_CTZ:
+	case SLJIT_HAS_REV:
 	case SLJIT_HAS_ROT:
 	case SLJIT_HAS_CMOV:
 	case SLJIT_HAS_PREFETCH:
+	case SLJIT_HAS_COPY_F32:
+	case SLJIT_HAS_COPY_F64:
+	case SLJIT_HAS_ATOMIC:
 		return 1;
 
 	default:
@@ -404,6 +453,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	}
 }
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type)
+{
+	switch (type) {
+	case SLJIT_UNORDERED_OR_EQUAL:
+	case SLJIT_ORDERED_NOT_EQUAL:
+		return 2;
+	}
+
+	return 0;
+}
+
 /* --------------------------------------------------------------------- */
 /*  Core code generator functions.                                       */
 /* --------------------------------------------------------------------- */
@@ -636,6 +696,11 @@ static sljit_s32 emit_op_imm(struct slji
 		case SLJIT_MUL:
 		case SLJIT_CLZ:
 		case SLJIT_CTZ:
+		case SLJIT_REV:
+		case SLJIT_REV_U16:
+		case SLJIT_REV_S16:
+		case SLJIT_REV_U32:
+		case SLJIT_REV_S32:
 		case SLJIT_ADDC:
 		case SLJIT_SUBC:
 			/* No form with immediate operand (except imm 0, which
@@ -644,10 +709,6 @@ static sljit_s32 emit_op_imm(struct slji
 		case SLJIT_MOV:
 			SLJIT_ASSERT(!(flags & SET_FLAGS) && (flags & ARG2_IMM) && arg1 == TMP_REG1);
 			return load_immediate(compiler, dst, imm);
-		case SLJIT_NOT:
-			SLJIT_ASSERT(flags & ARG2_IMM);
-			FAIL_IF(load_immediate(compiler, dst, (flags & INT_OP) ? (~imm & 0xffffffff) : ~imm));
-			goto set_flags;
 		case SLJIT_SUB:
 			compiler->status_flags_state = SLJIT_CURRENT_FLAGS_SUB;
 			if (flags & ARG1_IMM)
@@ -694,8 +755,13 @@ static sljit_s32 emit_op_imm(struct slji
 				break;
 			CHECK_FLAGS(3 << 29);
 			return push_inst(compiler, (ANDI ^ inv_bits) | RD(dst) | RN(reg) | inst_bits);
-		case SLJIT_OR:
 		case SLJIT_XOR:
+			if (imm == -1) {
+				FAIL_IF(push_inst(compiler, (ORN ^ inv_bits) | RD(dst) | RN(TMP_ZERO) | RM(reg)));
+				goto set_flags;
+			}
+			/* fallthrough */
+		case SLJIT_OR:
 			inst_bits = logical_imm(imm, LOGICAL_IMM_CHECK | ((flags & INT_OP) ? 16 : 32));
 			if (!inst_bits)
 				break;
@@ -718,6 +784,7 @@ static sljit_s32 emit_op_imm(struct slji
 				inst_bits = ((sljit_ins)1 << 22) | (((sljit_ins)-imm & 0x3f) << 16) | ((63 - (sljit_ins)imm) << 10);
 			}
 
+			inv_bits |= inv_bits >> 9;
 			FAIL_IF(push_inst(compiler, (UBFM ^ inv_bits) | RD(dst) | RN(arg1) | inst_bits));
 			goto set_flags;
 		case SLJIT_LSHR:
@@ -727,6 +794,7 @@ static sljit_s32 emit_op_imm(struct slji
 			if (flags & ARG1_IMM)
 				break;
 
+			inv_bits |= inv_bits >> 9;
 			if (op >= SLJIT_ASHR)
 				inv_bits |= 1 << 30;
 
@@ -780,22 +848,22 @@ static sljit_s32 emit_op_imm(struct slji
 		SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
 		if (dst == arg2)
 			return SLJIT_SUCCESS;
-		return push_inst(compiler, ORR | RD(dst) | RN(TMP_ZERO) | RM(arg2));
+		return push_inst(compiler, MOV | RD(dst) | RM(arg2));
 	case SLJIT_MOV_U8:
 		SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
-		return push_inst(compiler, (UBFM ^ W_OP) | RD(dst) | RN(arg2) | (7 << 10));
+		inv_bits |= inv_bits >> 9;
+		return push_inst(compiler, (UBFM ^ inv_bits) | RD(dst) | RN(arg2) | (7 << 10));
 	case SLJIT_MOV_S8:
 		SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
-		if (!(flags & INT_OP))
-			inv_bits |= 1 << 22;
+		inv_bits |= inv_bits >> 9;
 		return push_inst(compiler, (SBFM ^ inv_bits) | RD(dst) | RN(arg2) | (7 << 10));
 	case SLJIT_MOV_U16:
 		SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
-		return push_inst(compiler, (UBFM ^ W_OP) | RD(dst) | RN(arg2) | (15 << 10));
+		inv_bits |= inv_bits >> 9;
+		return push_inst(compiler, (UBFM ^ inv_bits) | RD(dst) | RN(arg2) | (15 << 10));
 	case SLJIT_MOV_S16:
 		SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
-		if (!(flags & INT_OP))
-			inv_bits |= 1 << 22;
+		inv_bits |= inv_bits >> 9;
 		return push_inst(compiler, (SBFM ^ inv_bits) | RD(dst) | RN(arg2) | (15 << 10));
 	case SLJIT_MOV32:
 		SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
@@ -804,14 +872,10 @@ static sljit_s32 emit_op_imm(struct slji
 		/* fallthrough */
 	case SLJIT_MOV_U32:
 		SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
-		return push_inst(compiler, (ORR ^ W_OP) | RD(dst) | RN(TMP_ZERO) | RM(arg2));
+		return push_inst(compiler, (MOV ^ W_OP) | RD(dst) | RM(arg2));
 	case SLJIT_MOV_S32:
 		SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
 		return push_inst(compiler, SBFM | (1 << 22) | RD(dst) | RN(arg2) | (31 << 10));
-	case SLJIT_NOT:
-		SLJIT_ASSERT(arg1 == TMP_REG1);
-		FAIL_IF(push_inst(compiler, (ORN ^ inv_bits) | RD(dst) | RN(TMP_ZERO) | RM(arg2)));
-		break; /* Set flags. */
 	case SLJIT_CLZ:
 		SLJIT_ASSERT(arg1 == TMP_REG1);
 		return push_inst(compiler, (CLZ ^ inv_bits) | RD(dst) | RN(arg2));
@@ -819,6 +883,25 @@ static sljit_s32 emit_op_imm(struct slji
 		SLJIT_ASSERT(arg1 == TMP_REG1);
 		FAIL_IF(push_inst(compiler, (RBIT ^ inv_bits) | RD(dst) | RN(arg2)));
 		return push_inst(compiler, (CLZ ^ inv_bits) | RD(dst) | RN(dst));
+	case SLJIT_REV:
+		SLJIT_ASSERT(arg1 == TMP_REG1);
+		inv_bits |= inv_bits >> 21;
+		return push_inst(compiler, (REV ^ inv_bits) | RD(dst) | RN(arg2));
+	case SLJIT_REV_U16:
+	case SLJIT_REV_S16:
+		SLJIT_ASSERT(arg1 == TMP_REG1 && dst != TMP_REG2);
+		FAIL_IF(push_inst(compiler, (REV16 ^ (sljit_ins)0x80000000) | RD(dst) | RN(arg2)));
+		if (dst == TMP_REG1 || (arg2 == TMP_REG2 && op == SLJIT_REV_U16))
+			return SLJIT_SUCCESS;
+		inv_bits |= inv_bits >> 9;
+		return push_inst(compiler, ((op == SLJIT_REV_U16 ? UBFM : SBFM) ^ inv_bits) | RD(dst) | RN(dst) | (15 << 10));
+	case SLJIT_REV_U32:
+	case SLJIT_REV_S32:
+		SLJIT_ASSERT(arg1 == TMP_REG1 && dst != TMP_REG2);
+		FAIL_IF(push_inst(compiler, (REV ^ (sljit_ins)0x80000400) | RD(dst) | RN(arg2)));
+		if (op == SLJIT_REV_U32 || dst == TMP_REG1)
+			return SLJIT_SUCCESS;
+		return push_inst(compiler, SBFM | (1 << 22) | RD(dst) | RN(dst) | (31 << 10));
 	case SLJIT_ADD:
 		compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD;
 		CHECK_FLAGS(1 << 29);
@@ -980,7 +1063,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	set_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);
 
 	saved_regs_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds - saved_arg_count, 2);
-	saved_regs_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, SSIZE_OF(f64));
+	saved_regs_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
 
 	local_size = (local_size + saved_regs_size + 0xf) & ~0xf;
 	compiler->local_size = local_size;
@@ -1065,7 +1148,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		while (arg_types) {
 			if ((arg_types & SLJIT_ARG_MASK) < SLJIT_ARG_TYPE_F64) {
 				if (!(arg_types & SLJIT_ARG_TYPE_SCRATCH_REG)) {
-					FAIL_IF(push_inst(compiler, ORR | RD(SLJIT_S0 - saved_arg_count) | RN(TMP_ZERO) | RM(tmp)));
+					FAIL_IF(push_inst(compiler, MOV | RD(SLJIT_S0 - saved_arg_count) | RM(tmp)));
 					saved_arg_count++;
 				}
 				tmp++;
@@ -1153,7 +1236,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	set_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);
 
 	saved_regs_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds - SLJIT_KEPT_SAVEDS_COUNT(options), 2);
-	saved_regs_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, SSIZE_OF(f64));
+	saved_regs_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
 
 	compiler->local_size = (local_size + saved_regs_size + 0xf) & ~0xf;
 	return SLJIT_SUCCESS;
@@ -1272,7 +1355,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		src = TMP_REG1;
 		srcw = 0;
 	} else if (src >= SLJIT_FIRST_SAVED_REG && src <= (SLJIT_S0 - SLJIT_KEPT_SAVEDS_COUNT(compiler->options))) {
-		FAIL_IF(push_inst(compiler, ORR | RD(TMP_REG1) | RN(TMP_ZERO) | RM(src)));
+		FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | RM(src)));
 		src = TMP_REG1;
 		srcw = 0;
 	}
@@ -1302,12 +1385,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		return push_inst(compiler, NOP);
 	case SLJIT_LMUL_UW:
 	case SLJIT_LMUL_SW:
-		FAIL_IF(push_inst(compiler, ORR | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0)));
+		FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | RM(SLJIT_R0)));
 		FAIL_IF(push_inst(compiler, MADD | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO)));
 		return push_inst(compiler, (op == SLJIT_LMUL_UW ? UMULH : SMULH) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1));
 	case SLJIT_DIVMOD_UW:
 	case SLJIT_DIVMOD_SW:
-		FAIL_IF(push_inst(compiler, (ORR ^ inv_bits) | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0)));
+		FAIL_IF(push_inst(compiler, (MOV ^ inv_bits) | RD(TMP_REG1) | RM(SLJIT_R0)));
 		FAIL_IF(push_inst(compiler, ((op == SLJIT_DIVMOD_UW ? UDIV : SDIV) ^ inv_bits) | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1)));
 		FAIL_IF(push_inst(compiler, (MADD ^ inv_bits) | RD(SLJIT_R1) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO)));
 		return push_inst(compiler, (SUB ^ inv_bits) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1));
@@ -1349,33 +1432,33 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			break;
 		case SLJIT_MOV_U8:
 			mem_flags = BYTE_SIZE;
-			if (src & SLJIT_IMM)
+			if (src == SLJIT_IMM)
 				srcw = (sljit_u8)srcw;
 			break;
 		case SLJIT_MOV_S8:
 			mem_flags = BYTE_SIZE | SIGNED;
-			if (src & SLJIT_IMM)
+			if (src == SLJIT_IMM)
 				srcw = (sljit_s8)srcw;
 			break;
 		case SLJIT_MOV_U16:
 			mem_flags = HALF_SIZE;
-			if (src & SLJIT_IMM)
+			if (src == SLJIT_IMM)
 				srcw = (sljit_u16)srcw;
 			break;
 		case SLJIT_MOV_S16:
 			mem_flags = HALF_SIZE | SIGNED;
-			if (src & SLJIT_IMM)
+			if (src == SLJIT_IMM)
 				srcw = (sljit_s16)srcw;
 			break;
 		case SLJIT_MOV_U32:
 			mem_flags = INT_SIZE;
-			if (src & SLJIT_IMM)
+			if (src == SLJIT_IMM)
 				srcw = (sljit_u32)srcw;
 			break;
 		case SLJIT_MOV_S32:
 		case SLJIT_MOV32:
 			mem_flags = INT_SIZE | SIGNED;
-			if (src & SLJIT_IMM)
+			if (src == SLJIT_IMM)
 				srcw = (sljit_s32)srcw;
 			break;
 		default:
@@ -1384,7 +1467,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			break;
 		}
 
-		if (src & SLJIT_IMM)
+		if (src == SLJIT_IMM)
 			FAIL_IF(emit_op_imm(compiler, SLJIT_MOV | ARG2_IMM, dst_r, TMP_REG1, srcw));
 		else if (!(src & SLJIT_MEM))
 			dst_r = src;
@@ -1397,11 +1480,24 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	}
 
 	flags = HAS_FLAGS(op_flags) ? SET_FLAGS : 0;
-	mem_flags = WORD_SIZE;
 
-	if (op_flags & SLJIT_32) {
-		flags |= INT_OP;
+	switch (op) {
+	case SLJIT_REV_U16:
+	case SLJIT_REV_S16:
+		mem_flags = HALF_SIZE;
+		break;
+	case SLJIT_REV_U32:
+	case SLJIT_REV_S32:
 		mem_flags = INT_SIZE;
+		break;
+	default:
+		mem_flags = WORD_SIZE;
+
+		if (op_flags & SLJIT_32) {
+			flags |= INT_OP;
+			mem_flags = INT_SIZE;
+		}
+		break;
 	}
 
 	if (src & SLJIT_MEM) {
@@ -1451,12 +1547,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		src2 = TMP_REG2;
 	}
 
-	if (src1 & SLJIT_IMM)
+	if (src1 == SLJIT_IMM)
 		flags |= ARG1_IMM;
 	else
 		src1w = src1;
 
-	if (src2 & SLJIT_IMM)
+	if (src2 == SLJIT_IMM)
 		flags |= ARG2_IMM;
 	else
 		src2w = src2;
@@ -1480,57 +1576,52 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 src_dst,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w)
+	sljit_s32 dst_reg,
+	sljit_s32 src1_reg,
+	sljit_s32 src2_reg,
+	sljit_s32 src3, sljit_sw src3w)
 {
 	sljit_ins inv_bits, imm;
 	sljit_s32 is_left;
 	sljit_sw mask;
 
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_shift_into(compiler, op, src_dst, src1, src1w, src2, src2w));
+	CHECK(check_sljit_emit_shift_into(compiler, op, dst_reg, src1_reg, src2_reg, src3, src3w));
 
 	is_left = (GET_OPCODE(op) == SLJIT_SHL || GET_OPCODE(op) == SLJIT_MSHL);
 
-	if (src_dst == src1) {
+	if (src1_reg == src2_reg) {
 		SLJIT_SKIP_CHECKS(compiler);
-		return sljit_emit_op2(compiler, (is_left ? SLJIT_ROTL : SLJIT_ROTR) | (op & SLJIT_32), src_dst, 0, src_dst, 0, src2, src2w);
+		return sljit_emit_op2(compiler, (is_left ? SLJIT_ROTL : SLJIT_ROTR) | (op & SLJIT_32), dst_reg, 0, src1_reg, 0, src3, src3w);
 	}
 
-	ADJUST_LOCAL_OFFSET(src1, src1w);
-	ADJUST_LOCAL_OFFSET(src2, src2w);
+	ADJUST_LOCAL_OFFSET(src3, src3w);
 
 	inv_bits = (op & SLJIT_32) ? W_OP : 0;
-	mask = inv_bits ? 0x1f : 0x3f;
 
-	if (src2 & SLJIT_IMM) {
-		src2w &= mask;
+	if (src3 == SLJIT_IMM) {
+		mask = inv_bits ? 0x1f : 0x3f;
+		src3w &= mask;
 
-		if (src2w == 0)
+		if (src3w == 0)
 			return SLJIT_SUCCESS;
-	} else if (src2 & SLJIT_MEM) {
-		FAIL_IF(emit_op_mem(compiler, inv_bits ? INT_SIZE : WORD_SIZE, TMP_REG2, src2, src2w, TMP_REG2));
-		src2 = TMP_REG2;
-	}
 
-	if (src1 & SLJIT_MEM) {
-		FAIL_IF(emit_op_mem(compiler, inv_bits ? INT_SIZE : WORD_SIZE, TMP_REG1, src1, src1w, TMP_REG1));
-		src1 = TMP_REG1;
-	} else if (src1 & SLJIT_IMM) {
-		FAIL_IF(load_immediate(compiler, TMP_REG1, src1w));
-		src1 = TMP_REG1;
-	}
-
-	if (src2 & SLJIT_IMM) {
 		if (is_left)
-			src2w = (src2w ^ mask) + 1;
+			src3w = (src3w ^ mask) + 1;
+
+		return push_inst(compiler, (EXTR ^ (inv_bits | (inv_bits >> 9))) | RD(dst_reg)
+			| RN(is_left ? src1_reg : src2_reg) | RM(is_left ? src2_reg : src1_reg) | ((sljit_ins)src3w << 10));
+	}
 
-		return push_inst(compiler, (EXTR ^ (inv_bits | (inv_bits >> 9))) | RD(src_dst)
-			| RN(is_left ? src_dst : src1) | RM(is_left ? src1 : src_dst) | ((sljit_ins)src2w << 10));
+	if (src3 & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem(compiler, inv_bits ? INT_SIZE : WORD_SIZE, TMP_REG2, src3, src3w, TMP_REG2));
+		src3 = TMP_REG2;
+	} else if (dst_reg == src3) {
+		FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG2) | RM(src3)));
+		src3 = TMP_REG2;
 	}
 
-	FAIL_IF(push_inst(compiler, ((is_left ? LSLV : LSRV) ^ inv_bits) | RD(src_dst) | RN(src_dst) | RM(src2)));
+	FAIL_IF(push_inst(compiler, ((is_left ? LSLV : LSRV) ^ inv_bits) | RD(dst_reg) | RN(src1_reg) | RM(src3)));
 
 	if (!(op & SLJIT_SHIFT_INTO_NON_ZERO)) {
 		/* Shift left/right by 1. */
@@ -1539,18 +1630,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		else
 			imm = (sljit_ins)(inv_bits ? ((31 << 16) | (30 << 10)) : ((63 << 16) | (62 << 10) | (1 << 22)));
 
-		FAIL_IF(push_inst(compiler, (UBFM ^ inv_bits) | RD(TMP_REG1) | RN(src1) | imm));
+		FAIL_IF(push_inst(compiler, (UBFM ^ (inv_bits | (inv_bits >> 9))) | RD(TMP_REG1) | RN(src2_reg) | imm));
 
 		/* Set imm to mask. */
 		imm = (sljit_ins)(inv_bits ? (4 << 10) : ((5 << 10) | (1 << 22)));
-		FAIL_IF(push_inst(compiler, (EORI ^ inv_bits) | RD(TMP_REG2) | RN(src2) | imm));
+		FAIL_IF(push_inst(compiler, (EORI ^ inv_bits) | RD(TMP_REG2) | RN(src3) | imm));
 
-		src1 = TMP_REG1;
+		src2_reg = TMP_REG1;
 	} else
-		FAIL_IF(push_inst(compiler, (SUB ^ inv_bits) | RD(TMP_REG2) | RN(TMP_ZERO) | RM(src2)));
+		FAIL_IF(push_inst(compiler, (SUB ^ inv_bits) | RD(TMP_REG2) | RN(TMP_ZERO) | RM(src3)));
 
-	FAIL_IF(push_inst(compiler, ((is_left ? LSRV : LSLV) ^ inv_bits) | RD(TMP_REG1) | RN(src1) | RM(TMP_REG2)));
-	return push_inst(compiler, (ORR ^ inv_bits) | RD(src_dst) | RN(src_dst) | RM(TMP_REG1));
+	FAIL_IF(push_inst(compiler, ((is_left ? LSRV : LSLV) ^ inv_bits) | RD(TMP_REG1) | RN(src2_reg) | RM(TMP_REG2)));
+	return push_inst(compiler, (ORR ^ inv_bits) | RD(dst_reg) | RN(dst_reg) | RM(TMP_REG1));
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
@@ -1563,7 +1654,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	switch (op) {
 	case SLJIT_FAST_RETURN:
 		if (FAST_IS_REG(src))
-			FAIL_IF(push_inst(compiler, ORR | RD(TMP_LR) | RN(TMP_ZERO) | RM(src)));
+			FAIL_IF(push_inst(compiler, MOV | RD(TMP_LR) | RM(src)));
 		else
 			FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_LR, src, srcw, TMP_REG1));
 
@@ -1593,15 +1684,42 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw)
 {
-	CHECK_REG_INDEX(check_sljit_get_register_index(reg));
-	return reg_map[reg];
+	sljit_s32 dst_r = TMP_LR;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_op_dst(compiler, op, dst, dstw));
+	ADJUST_LOCAL_OFFSET(dst, dstw);
+
+	switch (op) {
+	case SLJIT_FAST_ENTER:
+		if (FAST_IS_REG(dst))
+			return push_inst(compiler, MOV | RD(dst) | RM(TMP_LR));
+		break;
+	case SLJIT_GET_RETURN_ADDRESS:
+		dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
+		FAIL_IF(emit_op_mem(compiler, WORD_SIZE, dst_r, SLJIT_MEM1(SLJIT_SP), 0x8, TMP_REG2));
+		break;
+	}
+
+	if (dst & SLJIT_MEM)
+		return emit_op_mem(compiler, WORD_SIZE | STORE, dst_r, dst, dstw, TMP_REG2);
+
+	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg)
 {
-	CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
+	CHECK_REG_INDEX(check_sljit_get_register_index(type, reg));
+
+	if (type == SLJIT_GP_REGISTER)
+		return reg_map[reg];
+
+	if (type != SLJIT_FLOAT_REGISTER && type != SLJIT_SIMD_REG_64 && type != SLJIT_SIMD_REG_128)
+		return -1;
+
 	return freg_map[reg];
 }
 
@@ -1679,7 +1797,7 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 		inv_bits |= W_OP;
 
 	if (src & SLJIT_MEM) {
-		emit_fop_mem(compiler, (op & SLJIT_32) ? INT_SIZE : WORD_SIZE, TMP_FREG1, src, srcw);
+		FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_32) ? INT_SIZE : WORD_SIZE, TMP_FREG1, src, srcw));
 		src = TMP_FREG1;
 	}
 
@@ -1690,34 +1808,59 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 	return SLJIT_SUCCESS;
 }
 
-static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
+static sljit_s32 sljit_emit_fop1_conv_f64_from_w(struct sljit_compiler *compiler, sljit_ins ins,
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 src, sljit_sw srcw)
 {
 	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
-	sljit_ins inv_bits = (op & SLJIT_32) ? (1 << 22) : 0;
-
-	if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)
-		inv_bits |= W_OP;
 
 	if (src & SLJIT_MEM) {
-		emit_op_mem(compiler, ((GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) ? INT_SIZE : WORD_SIZE), TMP_REG1, src, srcw, TMP_REG1);
+		emit_op_mem(compiler, (ins & W_OP) ? WORD_SIZE : INT_SIZE, TMP_REG1, src, srcw, TMP_REG1);
 		src = TMP_REG1;
-	} else if (src & SLJIT_IMM) {
-		if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)
-			srcw = (sljit_s32)srcw;
-
+	} else if (src == SLJIT_IMM) {
 		FAIL_IF(load_immediate(compiler, TMP_REG1, srcw));
 		src = TMP_REG1;
 	}
 
-	FAIL_IF(push_inst(compiler, (SCVTF ^ inv_bits) | VD(dst_r) | RN(src)));
+	FAIL_IF(push_inst(compiler, ins | VD(dst_r) | RN(src)));
 
 	if (dst & SLJIT_MEM)
-		return emit_fop_mem(compiler, ((op & SLJIT_32) ? INT_SIZE : WORD_SIZE) | STORE, TMP_FREG1, dst, dstw);
+		return emit_fop_mem(compiler, ((ins & (1 << 22)) ? WORD_SIZE : INT_SIZE) | STORE, TMP_FREG1, dst, dstw);
 	return SLJIT_SUCCESS;
 }
 
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_ins inv_bits = (op & SLJIT_32) ? (1 << 22) : 0;
+
+	if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) {
+		inv_bits |= W_OP;
+
+		if (src == SLJIT_IMM)
+			srcw = (sljit_s32)srcw;
+	}
+
+	return sljit_emit_fop1_conv_f64_from_w(compiler, SCVTF ^ inv_bits, dst, dstw, src, srcw);
+}
+
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_ins inv_bits = (op & SLJIT_32) ? (1 << 22) : 0;
+
+	if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_U32) {
+		inv_bits |= W_OP;
+
+		if (src == SLJIT_IMM)
+			srcw = (sljit_u32)srcw;
+	}
+
+	return sljit_emit_fop1_conv_f64_from_w(compiler, UCVTF ^ inv_bits, dst, dstw, src, srcw);
+}
+
 static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,
 	sljit_s32 src1, sljit_sw src1w,
 	sljit_s32 src2, sljit_sw src2w)
@@ -1726,16 +1869,22 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 	sljit_ins inv_bits = (op & SLJIT_32) ? (1 << 22) : 0;
 
 	if (src1 & SLJIT_MEM) {
-		emit_fop_mem(compiler, mem_flags, TMP_FREG1, src1, src1w);
+		FAIL_IF(emit_fop_mem(compiler, mem_flags, TMP_FREG1, src1, src1w));
 		src1 = TMP_FREG1;
 	}
 
 	if (src2 & SLJIT_MEM) {
-		emit_fop_mem(compiler, mem_flags, TMP_FREG2, src2, src2w);
+		FAIL_IF(emit_fop_mem(compiler, mem_flags, TMP_FREG2, src2, src2w));
 		src2 = TMP_FREG2;
 	}
 
-	return push_inst(compiler, (FCMP ^ inv_bits) | VN(src1) | VM(src2));
+	FAIL_IF(push_inst(compiler, (FCMP ^ inv_bits) | VN(src1) | VM(src2)));
+
+	if (GET_FLAG_TYPE(op) != SLJIT_UNORDERED_OR_EQUAL)
+		return SLJIT_SUCCESS;
+
+	FAIL_IF(push_inst(compiler, CSINC | (0x0 << 12) | RD(TMP_REG1) | RN(TMP_ZERO) | RM(TMP_ZERO)));
+	return push_inst(compiler, CCMPI | (0x0 << 16) | (0x7 << 12) | RN(TMP_REG1) | 0x4);
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
@@ -1754,7 +1903,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
 
 	if (src & SLJIT_MEM) {
-		emit_fop_mem(compiler, (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32) ? (mem_flags ^ 0x1) : mem_flags, dst_r, src, srcw);
+		FAIL_IF(emit_fop_mem(compiler, (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32) ? (mem_flags ^ 0x1) : mem_flags, dst_r, src, srcw));
 		src = dst_r;
 	}
 
@@ -1799,11 +1948,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
 	if (src1 & SLJIT_MEM) {
-		emit_fop_mem(compiler, mem_flags, TMP_FREG1, src1, src1w);
+		FAIL_IF(emit_fop_mem(compiler, mem_flags, TMP_FREG1, src1, src1w));
 		src1 = TMP_FREG1;
 	}
 	if (src2 & SLJIT_MEM) {
-		emit_fop_mem(compiler, mem_flags, TMP_FREG2, src2, src2w);
+		FAIL_IF(emit_fop_mem(compiler, mem_flags, TMP_FREG2, src2, src2w));
 		src2 = TMP_FREG2;
 	}
 
@@ -1820,6 +1969,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	case SLJIT_DIV_F64:
 		FAIL_IF(push_inst(compiler, (FDIV ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));
 		break;
+	case SLJIT_COPYSIGN_F64:
+		FAIL_IF(push_inst(compiler, (FMOV_R ^ ((op & SLJIT_32) ? (W_OP | (1 << 22)) : 0)) | VN(src2) | RD(TMP_REG1)));
+		FAIL_IF(push_inst(compiler, (FABS ^ inv_bits) | VD(dst_r) | VN(src1)));
+		FAIL_IF(push_inst(compiler, TBZ | ((op & SLJIT_32) ? 0 : ((sljit_ins)1 << 31)) | (0x1f << 19) | (2 << 5) | RT(TMP_REG1)));
+		return push_inst(compiler, (FNEG ^ inv_bits) | VD(dst_r) | VN(dst_r));
 	}
 
 	if (!(dst & SLJIT_MEM))
@@ -1827,21 +1981,79 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return emit_fop_mem(compiler, mem_flags | STORE, TMP_FREG1, dst, dstw);
 }
 
-/* --------------------------------------------------------------------- */
-/*  Other instructions                                                   */
-/* --------------------------------------------------------------------- */
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f32 value)
+{
+	sljit_u32 exp;
+	union {
+		sljit_u32 imm;
+		sljit_f32 value;
+	} u;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fset32(compiler, freg, value));
+
+	u.value = value;
+
+	if (u.imm == 0)
+		return push_inst(compiler, (FMOV_R ^ (W_OP | (1 << 22))) | RN(TMP_ZERO) | VD(freg) | (1 << 16));
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+	if ((u.imm << (32 - 19)) == 0) {
+		exp = (u.imm >> (23 + 2)) & 0x3f;
+
+		if (exp == 0x20 || exp == 0x1f)
+			return push_inst(compiler, (FMOV_I ^ (1 << 22)) | (sljit_ins)((((u.imm >> 24) & 0x80) | ((u.imm >> 19) & 0x7f)) << 13) | VD(freg));
+	}
+
+	FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_s32)u.imm));
+	return push_inst(compiler, (FMOV_R ^ (W_OP | (1 << 22))) | RN(TMP_REG1) | VD(freg) | (1 << 16));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f64 value)
 {
+	sljit_uw exp;
+	union {
+		sljit_uw imm;
+		sljit_f64 value;
+	} u;
+
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
-	ADJUST_LOCAL_OFFSET(dst, dstw);
+	CHECK(check_sljit_emit_fset64(compiler, freg, value));
 
-	if (FAST_IS_REG(dst))
-		return push_inst(compiler, ORR | RD(dst) | RN(TMP_ZERO) | RM(TMP_LR));
+	u.value = value;
 
-	/* Memory. */
-	return emit_op_mem(compiler, WORD_SIZE | STORE, TMP_LR, dst, dstw, TMP_REG1);
+	if (u.imm == 0)
+		return push_inst(compiler, FMOV_R | RN(TMP_ZERO) | VD(freg) | (sljit_ins)1 << 16);
+
+	if ((u.imm << (64 - 48)) == 0) {
+		exp = (u.imm >> (52 + 2)) & 0x1ff;
+
+		if (exp == 0x100 || exp == 0xff)
+			return push_inst(compiler, FMOV_I | (sljit_ins)((((u.imm >> 56) & 0x80) | ((u.imm >> 48) & 0x7f)) << 13) | VD(freg));
+	}
+
+	FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_sw)u.imm));
+	return push_inst(compiler, FMOV_R | RN(TMP_REG1) | VD(freg) | (1 << 16));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 freg, sljit_s32 reg)
+{
+	sljit_ins inst;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg));
+
+	if (GET_OPCODE(op) == SLJIT_COPY_TO_F64)
+		inst = FMOV_R | RN(reg) | VD(freg) | (1 << 16);
+	else
+		inst = FMOV_R | VN(freg) | RD(reg);
+
+	if (op & SLJIT_32)
+		inst ^= W_OP | (1 << 22);
+
+	return push_inst(compiler, inst);
 }
 
 /* --------------------------------------------------------------------- */
@@ -1852,15 +2064,17 @@ static sljit_ins get_cc(struct sljit_com
 {
 	switch (type) {
 	case SLJIT_EQUAL:
+	case SLJIT_ATOMIC_STORED:
 	case SLJIT_F_EQUAL:
 	case SLJIT_ORDERED_EQUAL:
-	case SLJIT_UNORDERED_OR_EQUAL: /* Not supported. */
+	case SLJIT_UNORDERED_OR_EQUAL:
 		return 0x1;
 
 	case SLJIT_NOT_EQUAL:
+	case SLJIT_ATOMIC_NOT_STORED:
 	case SLJIT_F_NOT_EQUAL:
 	case SLJIT_UNORDERED_OR_NOT_EQUAL:
-	case SLJIT_ORDERED_NOT_EQUAL: /* Not supported. */
+	case SLJIT_ORDERED_NOT_EQUAL:
 		return 0x0;
 
 	case SLJIT_CARRY:
@@ -2011,7 +2225,7 @@ static SLJIT_INLINE struct sljit_jump* e
 		PTR_FAIL_IF(emit_op_mem(compiler, inv_bits ? INT_SIZE : WORD_SIZE, TMP_REG1, src, srcw, TMP_REG1));
 		src = TMP_REG1;
 	}
-	else if (src & SLJIT_IMM) {
+	else if (src == SLJIT_IMM) {
 		PTR_FAIL_IF(load_immediate(compiler, TMP_REG1, srcw));
 		src = TMP_REG1;
 	}
@@ -2035,7 +2249,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));
 
-	if (!(src & SLJIT_IMM)) {
+	if (src != SLJIT_IMM) {
 		if (src & SLJIT_MEM) {
 			ADJUST_LOCAL_OFFSET(src, srcw);
 			FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src, srcw, TMP_REG1));
@@ -2071,7 +2285,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	if (type & SLJIT_CALL_RETURN) {
 		if (src >= SLJIT_FIRST_SAVED_REG && src <= (SLJIT_S0 - SLJIT_KEPT_SAVEDS_COUNT(compiler->options))) {
-			FAIL_IF(push_inst(compiler, ORR | RD(TMP_REG1) | RN(TMP_ZERO) | RM(src)));
+			FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | RM(src)));
 			src = TMP_REG1;
 		}
 
@@ -2131,27 +2345,53 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 dst_reg,
-	sljit_s32 src, sljit_sw srcw)
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_reg)
 {
 	sljit_ins inv_bits = (type & SLJIT_32) ? W_OP : 0;
 	sljit_ins cc;
 
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));
+	CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg));
+
+	ADJUST_LOCAL_OFFSET(src1, src1w);
 
-	if (SLJIT_UNLIKELY(src & SLJIT_IMM)) {
+	if (src1 == SLJIT_IMM) {
 		if (type & SLJIT_32)
-			srcw = (sljit_s32)srcw;
-		FAIL_IF(load_immediate(compiler, TMP_REG1, srcw));
-		src = TMP_REG1;
-		srcw = 0;
+			src1w = (sljit_s32)src1w;
+		FAIL_IF(load_immediate(compiler, TMP_REG1, src1w));
+		src1 = TMP_REG1;
+	} else if (src1 & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src1, src1w, TMP_REG2));
+		src1 = TMP_REG1;
 	}
 
 	cc = get_cc(compiler, type & ~SLJIT_32);
+	return push_inst(compiler, (CSEL ^ inv_bits) | (cc << 12) | RD(dst_reg) | RN(src2_reg) | RM(src1));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_freg)
+{
+	sljit_ins inv_bits = (type & SLJIT_32) ? (1 << 22) : 0;
+	sljit_ins cc;
 
-	return push_inst(compiler, (CSEL ^ inv_bits) | (cc << 12) | RD(dst_reg) | RN(dst_reg) | RM(src));
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg));
+
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+
+	if (src1 & SLJIT_MEM) {
+		FAIL_IF(emit_fop_mem(compiler, (type & SLJIT_32) ? INT_SIZE : WORD_SIZE, TMP_FREG1, src1, src1w));
+		src1 = TMP_FREG1;
+	}
+
+	cc = get_cc(compiler, type & ~SLJIT_32);
+	return push_inst(compiler, (FCSEL ^ inv_bits) | (cc << 12) | VD(dst_freg) | VN(src2_freg) | VM(src1));
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,
@@ -2308,6 +2548,661 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return push_inst(compiler, inst | VT(freg) | RN(mem & REG_MASK) | (sljit_ins)((memw & 0x1ff) << 12));
 }
 
+static sljit_s32 sljit_emit_simd_mem_offset(struct sljit_compiler *compiler, sljit_s32 *mem_ptr, sljit_sw memw)
+{
+	sljit_ins ins;
+	sljit_s32 mem = *mem_ptr;
+
+	if (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) {
+		*mem_ptr = TMP_REG1;
+		return push_inst(compiler, ADD | RD(TMP_REG1) | RN(mem & REG_MASK) | RM(OFFS_REG(mem)) | ((sljit_ins)(memw & 0x3) << 10));
+	}
+
+	if (!(mem & REG_MASK)) {
+		*mem_ptr = TMP_REG1;
+		return load_immediate(compiler, TMP_REG1, memw);
+	}
+
+	mem &= REG_MASK;
+
+	if (memw == 0) {
+		*mem_ptr = mem;
+		return SLJIT_SUCCESS;
+	}
+
+	*mem_ptr = TMP_REG1;
+
+	if (memw < -0xffffff || memw > 0xffffff) {
+		FAIL_IF(load_immediate(compiler, TMP_REG1, memw));
+		return push_inst(compiler, ADD | RD(TMP_REG1) | RN(TMP_REG1) | RM(mem));
+	}
+
+	ins = ADDI;
+
+	if (memw < 0) {
+		memw = -memw;
+		ins = SUBI;
+	}
+
+	if (memw > 0xfff) {
+		FAIL_IF(push_inst(compiler, ins | (1 << 22) | RD(TMP_REG1) | RN(mem) | ((sljit_ins)(memw >> 12) << 10)));
+
+		memw &= 0xfff;
+		if (memw == 0)
+			return SLJIT_SUCCESS;
+
+		mem = TMP_REG1;
+	}
+
+	return push_inst(compiler, ins | RD(TMP_REG1) | RN(mem) | ((sljit_ins)memw << 10));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 srcdst, sljit_sw srcdstw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_mov(compiler, type, freg, srcdst, srcdstw));
+
+	ADJUST_LOCAL_OFFSET(srcdst, srcdstw);
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (!(srcdst & SLJIT_MEM)) {
+		if (type & SLJIT_SIMD_STORE)
+			ins = VD(srcdst) | VN(freg) | VM(freg);
+		else
+			ins = VD(freg) | VN(srcdst) | VM(srcdst);
+
+		if (reg_size == 4)
+			ins |= (1 << 30);
+
+		return push_inst(compiler, ORR_v | ins);
+	}
+
+	FAIL_IF(sljit_emit_simd_mem_offset(compiler, &srcdst, srcdstw));
+
+	if (elem_size > 3)
+		elem_size = 3;
+
+	ins = (type & SLJIT_SIMD_STORE) ? ST1 : LD1;
+
+	if (reg_size == 4)
+		ins |= (1 << 30);
+
+	return push_inst(compiler, ins | ((sljit_ins)elem_size << 10) | RN(srcdst) | VT(freg));
+}
+
+static sljit_ins simd_get_imm(sljit_s32 elem_size, sljit_uw value)
+{
+	sljit_ins result;
+
+	if (elem_size > 2 && (sljit_u32)value == (value >> 32)) {
+		elem_size = 2;
+		value = (sljit_u32)value;
+	}
+
+	if (elem_size == 2 && (sljit_u16)value == (value >> 16)) {
+		elem_size = 1;
+		value = (sljit_u16)value;
+	}
+
+	if (elem_size == 1 && (sljit_u8)value == (value >> 8)) {
+		elem_size = 0;
+		value = (sljit_u8)value;
+	}
+
+	switch (elem_size) {
+	case 0:
+		SLJIT_ASSERT(value <= 0xff);
+		result = 0xe000;
+		break;
+	case 1:
+		SLJIT_ASSERT(value <= 0xffff);
+		result = 0;
+
+		while (1) {
+			if (value <= 0xff) {
+				result |= 0x8000;
+				break;
+			}
+
+			if ((value & 0xff) == 0) {
+				value >>= 8;
+				result |= 0xa000;
+				break;
+			}
+
+			if (result != 0)
+				return ~(sljit_ins)0;
+
+			value ^= (sljit_uw)0xffff;
+			result = (1 << 29);
+		}
+		break;
+	case 2:
+		SLJIT_ASSERT(value <= 0xffffffff);
+		result = 0;
+
+		while (1) {
+			if (value <= 0xff) {
+				result |= 0x0000;
+				break;
+			}
+
+			if ((value & ~(sljit_uw)0xff00) == 0) {
+				value >>= 8;
+				result |= 0x2000;
+				break;
+			}
+
+			if ((value & ~(sljit_uw)0xff0000) == 0) {
+				value >>= 16;
+				result |= 0x4000;
+				break;
+			}
+
+			if ((value & ~(sljit_uw)0xff000000) == 0) {
+				value >>= 24;
+				result |= 0x6000;
+				break;
+			}
+
+			if ((value & (sljit_uw)0xff) == 0xff && (value >> 16) == 0) {
+				value >>= 8;
+				result |= 0xc000;
+				break;
+			}
+
+			if ((value & (sljit_uw)0xffff) == 0xffff && (value >> 24) == 0) {
+				value >>= 16;
+				result |= 0xd000;
+				break;
+			}
+
+			if (result != 0)
+				return ~(sljit_ins)0;
+
+			value ^= (sljit_uw)0xffffffff;
+			result = (1 << 29);
+		}
+		break;
+	default:
+		return ~(sljit_ins)0;
+	}
+
+	return (((sljit_ins)value & 0x1f) << 5) | (((sljit_ins)value & 0xe0) << 11) | result;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins, imm;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_replicate(compiler, type, freg, src, srcw));
+
+	ADJUST_LOCAL_OFFSET(src, srcw);
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (src & SLJIT_MEM) {
+		FAIL_IF(sljit_emit_simd_mem_offset(compiler, &src, srcw));
+
+		ins = (sljit_ins)elem_size << 10;
+
+		if (reg_size == 4)
+			ins |= (sljit_ins)1 << 30;
+
+		return push_inst(compiler, LD1R | ins | RN(src) | VT(freg));
+	}
+
+	ins = (sljit_ins)1 << (16 + elem_size);
+
+	if (reg_size == 4)
+		ins |= (sljit_ins)1 << 30;
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		if (src == SLJIT_IMM)
+			return push_inst(compiler, MOVI | (ins & ((sljit_ins)1 << 30)) | VD(freg));
+
+		return push_inst(compiler, DUP_e | ins | VD(freg) | VN(src));
+	}
+
+	if (src == SLJIT_IMM) {
+		if (elem_size < 3)
+			srcw &= ((sljit_sw)1 << (((sljit_sw)1 << elem_size) << 3)) - 1;
+
+		imm = simd_get_imm(elem_size, (sljit_uw)srcw);
+
+		if (imm != ~(sljit_ins)0) {
+			imm |= ins & ((sljit_ins)1 << 30);
+
+			return push_inst(compiler, MOVI | imm | VD(freg));
+		}
+
+		FAIL_IF(load_immediate(compiler, TMP_REG1, srcw));
+		src = TMP_REG1;
+	}
+
+	return push_inst(compiler, DUP_g | ins | VD(freg) | RN(src));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg, sljit_s32 lane_index,
+	sljit_s32 srcdst, sljit_sw srcdstw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_lane_mov(compiler, type, freg, lane_index, srcdst, srcdstw));
+
+	ADJUST_LOCAL_OFFSET(srcdst, srcdstw);
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (type & SLJIT_SIMD_LANE_ZERO) {
+		ins = (reg_size == 3) ? 0 : ((sljit_ins)1 << 30);
+
+		if ((type & SLJIT_SIMD_FLOAT) && freg == srcdst) {
+			FAIL_IF(push_inst(compiler, ORR_v | ins | VD(TMP_FREG1) | VN(freg) | VM(freg)));
+			srcdst = TMP_FREG1;
+			srcdstw = 0;
+		}
+
+		FAIL_IF(push_inst(compiler, MOVI | ins | VD(freg)));
+	}
+
+	if (srcdst & SLJIT_MEM) {
+		FAIL_IF(sljit_emit_simd_mem_offset(compiler, &srcdst, srcdstw));
+
+		if (elem_size == 3)
+			ins = 0x8400;
+		else if (elem_size == 0)
+			ins = 0;
+		else
+			ins = (sljit_ins)0x2000 << elem_size;
+
+		lane_index = lane_index << elem_size;
+		ins |= (sljit_ins)(((lane_index & 0x8) << 27) | ((lane_index & 0x7) << 10));
+
+		return push_inst(compiler, ((type & SLJIT_SIMD_STORE) ? ST1_s : LD1_s) | ins | RN(srcdst) | VT(freg));
+	}
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		if (type & SLJIT_SIMD_STORE)
+			ins = INS_e | ((sljit_ins)1 << (16 + elem_size)) | ((sljit_ins)lane_index << (11 + elem_size)) | VD(srcdst) | VN(freg);
+		else
+			ins = INS_e | ((((sljit_ins)lane_index << 1) | 1) << (16 + elem_size)) | VD(freg) | VN(srcdst);
+
+		return push_inst(compiler, ins);
+	}
+
+	if (srcdst == SLJIT_IMM) {
+		if (elem_size < 3)
+			srcdstw &= ((sljit_sw)1 << (((sljit_sw)1 << elem_size) << 3)) - 1;
+
+		FAIL_IF(load_immediate(compiler, TMP_REG1, srcdstw));
+		srcdst = TMP_REG1;
+	}
+
+	if (type & SLJIT_SIMD_STORE) {
+		ins = RD(srcdst) | VN(freg);
+
+		if ((type & SLJIT_SIMD_LANE_SIGNED) && (elem_size < 2 || (elem_size == 2 && !(type & SLJIT_32)))) {
+			ins |= SMOV;
+
+			if (!(type & SLJIT_32))
+				ins |= (sljit_ins)1 << 30;
+		} else
+			ins |= UMOV;
+	} else
+		ins = INS | VD(freg) | RN(srcdst);
+
+	if (elem_size == 3)
+		ins |= (sljit_ins)1 << 30;
+
+	return push_inst(compiler, ins | ((((sljit_ins)lane_index << 1) | 1) << (16 + elem_size)));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_s32 src_lane_index)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_lane_replicate(compiler, type, freg, src, src_lane_index));
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	ins = (((sljit_ins)src_lane_index << 1) | 1) << (16 + elem_size);
+
+	if (reg_size == 4)
+		ins |= (sljit_ins)1 << 30;
+
+	return push_inst(compiler, DUP_e | ins | VD(freg) | VN(src));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_s32 elem2_size = SLJIT_SIMD_GET_ELEM2_SIZE(type);
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_extend(compiler, type, freg, src, srcw));
+
+	ADJUST_LOCAL_OFFSET(src, srcw);
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size != 2 || elem2_size != 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (src & SLJIT_MEM) {
+		FAIL_IF(sljit_emit_simd_mem_offset(compiler, &src, srcw));
+
+		if (reg_size == 4 && elem2_size - elem_size == 1)
+			FAIL_IF(push_inst(compiler, LD1 | ((sljit_ins)elem_size << 10) | RN(src) | VT(freg)));
+		else
+			FAIL_IF(push_inst(compiler, LD1_s | ((sljit_ins)0x2000 << (reg_size - elem2_size + elem_size)) | RN(src) | VT(freg)));
+		src = freg;
+	}
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		SLJIT_ASSERT(reg_size == 4);
+		return push_inst(compiler, FCVTL | (1 << 22) | VD(freg) | VN(src));
+	}
+
+	do {
+		FAIL_IF(push_inst(compiler, ((type & SLJIT_SIMD_EXTEND_SIGNED) ? SSHLL : USHLL)
+			| ((sljit_ins)1 << (19 + elem_size)) | VD(freg) | VN(src)));
+		src = freg;
+	} while (++elem_size < elem2_size);
+
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 dst, sljit_sw dstw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins, imms;
+	sljit_s32 dst_r;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_sign(compiler, type, freg, dst, dstw));
+
+	ADJUST_LOCAL_OFFSET(dst, dstw);
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	switch (elem_size) {
+	case 0:
+		imms = 0x643219;
+		ins = USHR | (0x9 << 16);
+		break;
+	case 1:
+		imms = (reg_size == 4) ? 0x643219 : 0x6231;
+		ins = USHR | (0x11 << 16);
+		break;
+	case 2:
+		imms = (reg_size == 4) ? 0x6231 : 0x61;
+		ins = USHR | (0x21 << 16);
+		break;
+	default:
+		imms = 0x61;
+		ins = USHR | (0x41 << 16);
+		break;
+	}
+
+	if (reg_size == 4)
+		ins |= (1 << 30);
+
+	FAIL_IF(push_inst(compiler, ins | VD(TMP_FREG1) | VN(freg)));
+
+	if (reg_size == 4 && elem_size > 0)
+		FAIL_IF(push_inst(compiler, XTN | ((sljit_ins)(elem_size - 1) << 22) | VD(TMP_FREG1) | VN(TMP_FREG1)));
+
+	if (imms >= 0x100) {
+		ins = (reg_size == 4 && elem_size == 0) ? (1 << 30) : 0;
+
+		do {
+			FAIL_IF(push_inst(compiler, USRA | ins | ((imms & 0xff) << 16) | VD(TMP_FREG1) | VN(TMP_FREG1)));
+			imms >>= 8;
+		} while (imms >= 0x100);
+	}
+
+	FAIL_IF(push_inst(compiler, USRA | (1 << 30) | (imms << 16) | VD(TMP_FREG1) | VN(TMP_FREG1)));
+
+	dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
+	ins = (0x1 << 16);
+
+	if (reg_size == 4 && elem_size == 0) {
+		FAIL_IF(push_inst(compiler, INS_e | (0x3 << 16) | (0x8 << 11) | VD(TMP_FREG1) | VN(TMP_FREG1)));
+		ins = (0x2 << 16);
+	}
+
+	FAIL_IF(push_inst(compiler, UMOV | ins | RD(dst_r) | VN(TMP_FREG1)));
+
+	if (dst_r == TMP_REG1)
+		return emit_op_mem(compiler, STORE | ((type & SLJIT_32) ? INT_SIZE : WORD_SIZE), TMP_REG1, dst, dstw, TMP_REG2);
+
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins = 0;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_op2(compiler, type, dst_freg, src1_freg, src2_freg));
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	switch (SLJIT_SIMD_GET_OPCODE(type)) {
+	case SLJIT_SIMD_OP2_AND:
+		ins = AND_v;
+		break;
+	case SLJIT_SIMD_OP2_OR:
+		ins = ORR_v;
+		break;
+	case SLJIT_SIMD_OP2_XOR:
+		ins = EOR_v;
+		break;
+	}
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (reg_size == 4)
+		ins |= (sljit_ins)1 << 30;
+
+	return push_inst(compiler, ins | VD(dst_freg) | VN(src1_freg) | VM(src2_freg));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst_reg,
+	sljit_s32 mem_reg)
+{
+	sljit_ins ins;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg));
+
+#ifdef __ARM_FEATURE_ATOMICS
+	switch (GET_OPCODE(op)) {
+	case SLJIT_MOV32:
+	case SLJIT_MOV_U32:
+		ins = LDR ^ (1 << 30);
+		break;
+	case SLJIT_MOV_U16:
+		ins = LDRH;
+		break;
+	case SLJIT_MOV_U8:
+		ins = LDRB;
+		break;
+	default:
+		ins = LDR;
+		break;
+	}
+#else /* !__ARM_FEATURE_ATOMICS */
+	switch (GET_OPCODE(op)) {
+	case SLJIT_MOV32:
+	case SLJIT_MOV_U32:
+		ins = LDXR ^ (1 << 30);
+		break;
+	case SLJIT_MOV_U8:
+		ins = LDXRB;
+		break;
+	case SLJIT_MOV_U16:
+		ins = LDXRH;
+		break;
+	default:
+		ins = LDXR;
+		break;
+	}
+#endif /* ARM_FEATURE_ATOMICS */
+	return push_inst(compiler, ins | RN(mem_reg) | RT(dst_reg));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 src_reg,
+	sljit_s32 mem_reg,
+	sljit_s32 temp_reg)
+{
+	sljit_ins ins;
+	sljit_s32 tmp = temp_reg;
+	sljit_ins cmp = 0;
+	sljit_ins inv_bits = W_OP;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg));
+
+#ifdef __ARM_FEATURE_ATOMICS
+	if (op & SLJIT_SET_ATOMIC_STORED)
+		cmp = (SUBS ^ W_OP) | RD(TMP_ZERO);
+
+	switch (GET_OPCODE(op)) {
+	case SLJIT_MOV32:
+	case SLJIT_MOV_U32:
+		ins = CAS ^ (1 << 30);
+		break;
+	case SLJIT_MOV_U16:
+		ins = CASH;
+		break;
+	case SLJIT_MOV_U8:
+		ins = CASB;
+		break;
+	default:
+		ins = CAS;
+		inv_bits = 0;
+		if (cmp)
+			cmp ^= W_OP;
+		break;
+	}
+
+	if (cmp) {
+		FAIL_IF(push_inst(compiler, (MOV ^ inv_bits) | RM(temp_reg) | RD(TMP_REG1)));
+		tmp = TMP_REG1;
+	}
+	FAIL_IF(push_inst(compiler, ins | RM(tmp) | RN(mem_reg) | RD(src_reg)));
+	if (!cmp)
+		return SLJIT_SUCCESS;
+
+	FAIL_IF(push_inst(compiler, cmp | RM(tmp) | RN(temp_reg)));
+	FAIL_IF(push_inst(compiler, (CSET ^ inv_bits) | RD(tmp)));
+	return push_inst(compiler, cmp | RM(tmp) | RN(TMP_ZERO));
+#else /* !__ARM_FEATURE_ATOMICS */
+	SLJIT_UNUSED_ARG(tmp);
+	SLJIT_UNUSED_ARG(inv_bits);
+
+	if (op & SLJIT_SET_ATOMIC_STORED)
+		cmp = (SUBI ^ W_OP) | (1 << 29);
+
+	switch (GET_OPCODE(op)) {
+	case SLJIT_MOV32:
+	case SLJIT_MOV_U32:
+		ins = STXR ^ (1 << 30);
+		break;
+	case SLJIT_MOV_U8:
+		ins = STXRB;
+		break;
+	case SLJIT_MOV_U16:
+		ins = STXRH;
+		break;
+	default:
+		ins = STXR;
+		break;
+	}
+
+	FAIL_IF(push_inst(compiler, ins | RM(TMP_REG1) | RN(mem_reg) | RT(src_reg)));
+	return cmp ? push_inst(compiler, cmp | RD(TMP_ZERO) | RN(TMP_REG1)) : SLJIT_SUCCESS;
+#endif /* __ARM_FEATURE_ATOMICS */
+}
+
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)
 {
 	sljit_s32 dst_reg;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c	2024-11-20 13:56:33.000000000 +0000
@@ -49,8 +49,20 @@ static const sljit_u8 reg_map[SLJIT_NUMB
 	0, 0, 1, 2, 3, 11, 10, 9, 8, 7, 6, 5, 4, 13, 12, 14, 15
 };
 
-static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = {
-	0, 0, 1, 2, 3, 4, 5, 15, 14, 13, 12, 11, 10, 9, 8, 6, 7
+static const sljit_u8 freg_map[((SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) << 1) + 1] = {
+	0,
+	0, 1, 2, 3, 4, 5, 15, 14, 13, 12, 11, 10, 9, 8,
+	7, 6,
+	0, 1, 2, 3, 4, 5, 15, 14, 13, 12, 11, 10, 9, 8,
+	7, 6
+};
+
+static const sljit_u8 freg_ebit_map[((SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) << 1) + 1] = {
+	0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1
 };
 
 #define COPY_BITS(src, from, to, bits) \
@@ -75,13 +87,15 @@ static const sljit_u8 freg_map[SLJIT_NUM
 	(reg_map[reg1] <= 7 && reg_map[reg2] <= 7 && reg_map[reg3] <= 7)
 
 /* Thumb32 encodings. */
-#define RD4(rd) ((sljit_ins)reg_map[rd] << 8)
-#define RN4(rn) ((sljit_ins)reg_map[rn] << 16)
 #define RM4(rm) ((sljit_ins)reg_map[rm])
+#define RD4(rd) ((sljit_ins)reg_map[rd] << 8)
 #define RT4(rt) ((sljit_ins)reg_map[rt] << 12)
-#define DD4(dd) ((sljit_ins)freg_map[dd] << 12)
-#define DN4(dn) ((sljit_ins)freg_map[dn] << 16)
-#define DM4(dm) ((sljit_ins)freg_map[dm])
+#define RN4(rn) ((sljit_ins)reg_map[rn] << 16)
+
+#define VM4(vm) (((sljit_ins)freg_map[vm]) | ((sljit_ins)freg_ebit_map[vm] << 5))
+#define VD4(vd) (((sljit_ins)freg_map[vd] << 12) | ((sljit_ins)freg_ebit_map[vd] << 22))
+#define VN4(vn) (((sljit_ins)freg_map[vn] << 16) | ((sljit_ins)freg_ebit_map[vn] << 7))
+
 #define IMM5(imm) \
 	(COPY_BITS(imm, 2, 12, 3) | (((sljit_ins)imm & 0x3) << 6))
 #define IMM12(imm) \
@@ -128,9 +142,12 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define EORS		0x4040
 #define EOR_W		0xea800000
 #define IT		0xbf00
-#define LDR_SP		0x9800
 #define LDR		0xf8d00000
+#define LDR_SP		0x9800
 #define LDRD		0xe9500000
+#define LDREX		0xe8500f00
+#define LDREXB		0xe8d00f4f
+#define LDREXH		0xe8d00f5f
 #define LDRI		0xf8500800
 #define LSLS		0x4080
 #define LSLSI		0x0000
@@ -160,6 +177,10 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define POP_W		0xe8bd0000
 #define PUSH		0xb400
 #define PUSH_W		0xe92d0000
+#define REV		0xba00
+#define REV_W		0xfa90f080
+#define REV16		0xba40
+#define REV16_W		0xfa90f090
 #define RBIT		0xfa90f0a0
 #define RORS		0x41c0
 #define ROR_W		0xfa60f000
@@ -171,8 +192,11 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define SBC_W		0xeb600000
 #define SDIV		0xfb90f0f0
 #define SMULL		0xfb800000
-#define STRD		0xe9400000
 #define STR_SP		0x9000
+#define STRD		0xe9400000
+#define STREX		0xe8400000
+#define STREXB		0xe8c00f40
+#define STREXH		0xe8c00f50
 #define SUBS		0x1a00
 #define SUBSI3		0x1e00
 #define SUBSI8		0x3800
@@ -195,23 +219,57 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define UXTH_W		0xfa1ff080
 #define VABS_F32	0xeeb00ac0
 #define VADD_F32	0xee300a00
+#define VAND		0xef000110
 #define VCMP_F32	0xeeb40a40
 #define VCVT_F32_S32	0xeeb80ac0
+#define VCVT_F32_U32	0xeeb80a40
 #define VCVT_F64_F32	0xeeb70ac0
 #define VCVT_S32_F32	0xeebd0ac0
 #define VDIV_F32	0xee800a00
+#define VDUP		0xee800b10
+#define VDUP_s		0xffb00c00
+#define VEOR		0xff000110
+#define VLD1		0xf9200000
+#define VLD1_r		0xf9a00c00
+#define VLD1_s		0xf9a00000
 #define VLDR_F32	0xed100a00
 #define VMOV_F32	0xeeb00a40
 #define VMOV		0xee000a10
 #define VMOV2		0xec400a10
+#define VMOV_i		0xef800010
+#define VMOV_s		0xee000b10
+#define VMOVN		0xffb20200
 #define VMRS		0xeef1fa10
 #define VMUL_F32	0xee200a00
 #define VNEG_F32	0xeeb10a40
+#define VORR		0xef200110
 #define VPOP		0xecbd0b00
 #define VPUSH		0xed2d0b00
+#define VSHLL		0xef800a10
+#define VSHR		0xef800010
+#define VSRA		0xef800110
+#define VST1		0xf9000000
+#define VST1_s		0xf9800000
 #define VSTR_F32	0xed000a00
 #define VSUB_F32	0xee300a40
 
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+
+static sljit_s32 function_check_is_freg(struct sljit_compiler *compiler, sljit_s32 fr, sljit_s32 is_32)
+{
+	if (compiler->scratches == -1)
+		return 0;
+
+	if (is_32 && fr >= SLJIT_F64_SECOND(SLJIT_FR0))
+		fr -= SLJIT_F64_SECOND(0);
+
+	return (fr >= SLJIT_FR0 && fr < (SLJIT_FR0 + compiler->fscratches))
+		|| (fr > (SLJIT_FS0 - compiler->fsaveds) && fr <= SLJIT_FS0)
+		|| (fr >= SLJIT_TMP_FREGISTER_BASE && fr < (SLJIT_TMP_FREGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS));
+}
+
+#endif /* SLJIT_ARGUMENT_CHECKS */
+
 static sljit_s32 push_inst16(struct sljit_compiler *compiler, sljit_ins inst)
 {
 	sljit_u16 *ptr;
@@ -488,18 +546,25 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 {
 	switch (feature_type) {
 	case SLJIT_HAS_FPU:
+	case SLJIT_HAS_F64_AS_F32_PAIR:
+	case SLJIT_HAS_SIMD:
 #ifdef SLJIT_IS_FPU_AVAILABLE
-		return SLJIT_IS_FPU_AVAILABLE;
+		return (SLJIT_IS_FPU_AVAILABLE) != 0;
 #else
 		/* Available by default. */
 		return 1;
 #endif
 
+	case SLJIT_SIMD_REGS_ARE_PAIRS:
 	case SLJIT_HAS_CLZ:
 	case SLJIT_HAS_CTZ:
+	case SLJIT_HAS_REV:
 	case SLJIT_HAS_ROT:
 	case SLJIT_HAS_CMOV:
 	case SLJIT_HAS_PREFETCH:
+	case SLJIT_HAS_COPY_F32:
+	case SLJIT_HAS_COPY_F64:
+	case SLJIT_HAS_ATOMIC:
 		return 1;
 
 	default:
@@ -615,18 +680,17 @@ static sljit_s32 emit_op_imm(struct slji
 		switch (flags & 0xffff) {
 		case SLJIT_CLZ:
 		case SLJIT_CTZ:
+		case SLJIT_REV:
+		case SLJIT_REV_U16:
+		case SLJIT_REV_S16:
+		case SLJIT_REV_U32:
+		case SLJIT_REV_S32:
 		case SLJIT_MUL:
 			/* No form with immediate operand. */
 			break;
 		case SLJIT_MOV:
 			SLJIT_ASSERT(!(flags & SET_FLAGS) && (flags & ARG2_IMM) && arg1 == TMP_REG2);
 			return load_immediate(compiler, dst, imm);
-		case SLJIT_NOT:
-			if (!(flags & SET_FLAGS))
-				return load_immediate(compiler, dst, ~imm);
-			/* Since the flags should be set, we just fallback to the register mode.
-			   Although some clever things could be done here, "NOT IMM" does not worth the efforts. */
-			break;
 		case SLJIT_ADD:
 			compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD;
 			imm2 = NEGATE(imm);
@@ -657,9 +721,14 @@ static sljit_s32 emit_op_imm(struct slji
 			break;
 		case SLJIT_ADDC:
 			compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD;
-			imm = get_imm(imm);
-			if (imm != INVALID_IMM)
-				return push_inst32(compiler, ADCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm);
+			imm2 = get_imm(imm);
+			if (imm2 != INVALID_IMM)
+				return push_inst32(compiler, ADCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm2);
+			if (flags & ARG2_IMM) {
+				imm = get_imm(~imm);
+				if (imm != INVALID_IMM)
+					return push_inst32(compiler, SBCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm);
+			}
 			break;
 		case SLJIT_SUB:
 			compiler->status_flags_state = SLJIT_CURRENT_FLAGS_SUB;
@@ -712,9 +781,12 @@ static sljit_s32 emit_op_imm(struct slji
 			compiler->status_flags_state = SLJIT_CURRENT_FLAGS_SUB;
 			if (flags & ARG1_IMM)
 				break;
-			imm = get_imm(imm);
+			imm2 = get_imm(imm);
+			if (imm2 != INVALID_IMM)
+				return push_inst32(compiler, SBCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm2);
+			imm = get_imm(~imm);
 			if (imm != INVALID_IMM)
-				return push_inst32(compiler, SBCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm);
+				return push_inst32(compiler, ADCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm);
 			break;
 		case SLJIT_AND:
 			imm2 = get_imm(imm);
@@ -733,6 +805,11 @@ static sljit_s32 emit_op_imm(struct slji
 				return push_inst32(compiler, ORNI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm);
 			break;
 		case SLJIT_XOR:
+			if (imm == (sljit_uw)-1) {
+				if (IS_2_LO_REGS(dst, reg))
+					return push_inst16(compiler, MVNS | RD3(dst) | RN3(reg));
+				return push_inst32(compiler, MVN_W | (flags & SET_FLAGS) | RD4(dst) | RM4(reg));
+			}
 			imm = get_imm(imm);
 			if (imm != INVALID_IMM)
 				return push_inst32(compiler, EORI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm);
@@ -788,8 +865,7 @@ static sljit_s32 emit_op_imm(struct slji
 			imm = arg2;
 			arg2 = (arg1 == TMP_REG1) ? TMP_REG2 : TMP_REG1;
 			FAIL_IF(load_immediate(compiler, (sljit_s32)arg2, imm));
-		}
-		else {
+		} else {
 			imm = arg1;
 			arg1 = (arg2 == TMP_REG1) ? TMP_REG2 : TMP_REG1;
 			FAIL_IF(load_immediate(compiler, (sljit_s32)arg1, imm));
@@ -829,11 +905,6 @@ static sljit_s32 emit_op_imm(struct slji
 		if (IS_2_LO_REGS(dst, arg2))
 			return push_inst16(compiler, SXTH | RD3(dst) | RN3(arg2));
 		return push_inst32(compiler, SXTH_W | RD4(dst) | RM4(arg2));
-	case SLJIT_NOT:
-		SLJIT_ASSERT(arg1 == TMP_REG2);
-		if (IS_2_LO_REGS(dst, arg2))
-			return push_inst16(compiler, MVNS | RD3(dst) | RN3(arg2));
-		return push_inst32(compiler, MVN_W | (flags & SET_FLAGS) | RD4(dst) | RM4(arg2));
 	case SLJIT_CLZ:
 		SLJIT_ASSERT(arg1 == TMP_REG2);
 		return push_inst32(compiler, CLZ | RN4(arg2) | RD4(dst) | RM4(arg2));
@@ -841,6 +912,29 @@ static sljit_s32 emit_op_imm(struct slji
 		SLJIT_ASSERT(arg1 == TMP_REG2);
 		FAIL_IF(push_inst32(compiler, RBIT | RN4(arg2) | RD4(dst) | RM4(arg2)));
 		return push_inst32(compiler, CLZ | RN4(dst) | RD4(dst) | RM4(dst));
+	case SLJIT_REV:
+	case SLJIT_REV_U32:
+	case SLJIT_REV_S32:
+		SLJIT_ASSERT(arg1 == TMP_REG2);
+		if (IS_2_LO_REGS(dst, arg2))
+			return push_inst16(compiler, REV | RD3(dst) | RN3(arg2));
+		return push_inst32(compiler, REV_W | RN4(arg2) | RD4(dst) | RM4(arg2));
+	case SLJIT_REV_U16:
+	case SLJIT_REV_S16:
+		SLJIT_ASSERT(arg1 == TMP_REG2 && dst != TMP_REG2);
+
+		flags &= 0xffff;
+		if (IS_2_LO_REGS(dst, arg2))
+			FAIL_IF(push_inst16(compiler, REV16 | RD3(dst) | RN3(arg2)));
+		else
+			FAIL_IF(push_inst32(compiler, REV16_W | RN4(arg2) | RD4(dst) | RM4(arg2)));
+
+		if (dst == TMP_REG1 || (arg2 == TMP_REG1 && flags == SLJIT_REV_U16))
+			return SLJIT_SUCCESS;
+
+		if (reg_map[dst] <= 7)
+			return push_inst16(compiler, (flags == SLJIT_REV_U16 ? UXTH : SXTH) | RD3(dst) | RN3(dst));
+		return push_inst32(compiler, (flags == SLJIT_REV_U16 ? UXTH_W : SXTH_W) | RD4(dst) | RM4(dst));
 	case SLJIT_ADD:
 		compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD;
 		if (IS_3_LO_REGS(dst, arg1, arg2))
@@ -1176,12 +1270,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		}
 
 		if (fsaveds + fscratches >= SLJIT_NUMBER_OF_FLOAT_REGISTERS) {
-			FAIL_IF(push_inst32(compiler, VPUSH | DD4(SLJIT_FS0) | ((sljit_uw)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1)));
+			FAIL_IF(push_inst32(compiler, VPUSH | VD4(SLJIT_FS0) | ((sljit_uw)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1)));
 		} else {
 			if (fsaveds > 0)
-				FAIL_IF(push_inst32(compiler, VPUSH | DD4(SLJIT_FS0) | ((sljit_uw)fsaveds << 1)));
+				FAIL_IF(push_inst32(compiler, VPUSH | VD4(SLJIT_FS0) | ((sljit_uw)fsaveds << 1)));
 			if (fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG)
-				FAIL_IF(push_inst32(compiler, VPUSH | DD4(fscratches) | ((sljit_uw)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1)));
+				FAIL_IF(push_inst32(compiler, VPUSH | VD4(fscratches) | ((sljit_uw)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1)));
 		}
 	}
 
@@ -1258,17 +1352,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		switch (arg_types & SLJIT_ARG_MASK) {
 		case SLJIT_ARG_TYPE_F64:
 			if (offset != old_offset)
-				*remap_ptr++ = VMOV_F32 | SLJIT_32 | DD4(offset) | DM4(old_offset);
+				*remap_ptr++ = VMOV_F32 | SLJIT_32 | VD4(offset) | VM4(old_offset);
 			old_offset++;
 			offset++;
 			break;
 		case SLJIT_ARG_TYPE_F32:
 			if (f32_offset != 0) {
-				*remap_ptr++ = VMOV_F32 | 0x20 | DD4(offset) | DM4(f32_offset);
+				*remap_ptr++ = VMOV_F32 | 0x20 | VD4(offset) | VM4(f32_offset);
 				f32_offset = 0;
 			} else {
 				if (offset != old_offset)
-					*remap_ptr++ = VMOV_F32 | DD4(offset) | DM4(old_offset);
+					*remap_ptr++ = VMOV_F32 | VD4(offset) | VM4(old_offset);
 				f32_offset = old_offset;
 				old_offset++;
 			}
@@ -1356,6 +1450,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	size = GET_SAVED_REGISTERS_SIZE(scratches, saveds - SLJIT_KEPT_SAVEDS_COUNT(options), 1);
 
+	/* Doubles are saved, so alignment is unaffected. */
 	if ((size & SSIZE_OF(sw)) != 0 && (fsaveds > 0 || fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG))
 		size += SSIZE_OF(sw);
 
@@ -1401,12 +1496,12 @@ static sljit_s32 emit_stack_frame_releas
 			FAIL_IF(emit_add_sp(compiler, (sljit_uw)local_size));
 
 		if (fsaveds + fscratches >= SLJIT_NUMBER_OF_FLOAT_REGISTERS) {
-			FAIL_IF(push_inst32(compiler, VPOP | DD4(SLJIT_FS0) | ((sljit_uw)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1)));
+			FAIL_IF(push_inst32(compiler, VPOP | VD4(SLJIT_FS0) | ((sljit_uw)SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS << 1)));
 		} else {
 			if (fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG)
-				FAIL_IF(push_inst32(compiler, VPOP | DD4(fscratches) | ((sljit_uw)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1)));
+				FAIL_IF(push_inst32(compiler, VPOP | VD4(fscratches) | ((sljit_uw)(fscratches - (SLJIT_FIRST_SAVED_FLOAT_REG - 1)) << 1)));
 			if (fsaveds > 0)
-				FAIL_IF(push_inst32(compiler, VPOP | DD4(SLJIT_FS0) | ((sljit_uw)fsaveds << 1)));
+				FAIL_IF(push_inst32(compiler, VPOP | VD4(SLJIT_FS0) | ((sljit_uw)fsaveds << 1)));
 		}
 
 		local_size = GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1) & 0x7;
@@ -1705,22 +1800,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			break;
 		case SLJIT_MOV_U8:
 			flags = BYTE_SIZE;
-			if (src & SLJIT_IMM)
+			if (src == SLJIT_IMM)
 				srcw = (sljit_u8)srcw;
 			break;
 		case SLJIT_MOV_S8:
 			flags = BYTE_SIZE | SIGNED;
-			if (src & SLJIT_IMM)
+			if (src == SLJIT_IMM)
 				srcw = (sljit_s8)srcw;
 			break;
 		case SLJIT_MOV_U16:
 			flags = HALF_SIZE;
-			if (src & SLJIT_IMM)
+			if (src == SLJIT_IMM)
 				srcw = (sljit_u16)srcw;
 			break;
 		case SLJIT_MOV_S16:
 			flags = HALF_SIZE | SIGNED;
-			if (src & SLJIT_IMM)
+			if (src == SLJIT_IMM)
 				srcw = (sljit_s16)srcw;
 			break;
 		default:
@@ -1729,7 +1824,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			break;
 		}
 
-		if (src & SLJIT_IMM)
+		if (src == SLJIT_IMM)
 			FAIL_IF(emit_op_imm(compiler, SLJIT_MOV | ARG2_IMM, dst_r, TMP_REG2, (sljit_uw)srcw));
 		else if (src & SLJIT_MEM) {
 			FAIL_IF(emit_op_mem(compiler, flags, dst_r, src, srcw, TMP_REG1));
@@ -1745,10 +1840,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		return emit_op_mem(compiler, flags | STORE, dst_r, dst, dstw, TMP_REG2);
 	}
 
+	SLJIT_COMPILE_ASSERT(WORD_SIZE == 0, word_size_must_be_0);
 	flags = HAS_FLAGS(op_flags) ? SET_FLAGS : 0;
 
+	if (op == SLJIT_REV_U16 || op == SLJIT_REV_S16)
+		flags |= HALF_SIZE;
+
 	if (src & SLJIT_MEM) {
-		FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src, srcw, TMP_REG1));
+		FAIL_IF(emit_op_mem(compiler, flags, TMP_REG1, src, srcw, TMP_REG1));
 		src = TMP_REG1;
 	}
 
@@ -1778,7 +1877,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	if (dst == TMP_REG1)
 		flags |= UNUSED_RETURN;
 
-	if (src1 & SLJIT_IMM)
+	if (src1 == SLJIT_IMM)
 		flags |= ARG1_IMM;
 	else if (src1 & SLJIT_MEM) {
 		emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src1, src1w, TMP_REG1);
@@ -1787,7 +1886,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	else
 		src1w = src1;
 
-	if (src2 & SLJIT_IMM)
+	if (src2 == SLJIT_IMM)
 		flags |= ARG2_IMM;
 	else if (src2 & SLJIT_MEM) {
 		src2_reg = (!(flags & ARG1_IMM) && (src1w == TMP_REG1)) ? TMP_REG2 : TMP_REG1;
@@ -1816,68 +1915,60 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 src_dst,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w)
+	sljit_s32 dst_reg,
+	sljit_s32 src1_reg,
+	sljit_s32 src2_reg,
+	sljit_s32 src3, sljit_sw src3w)
 {
 	sljit_s32 is_left;
 
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_shift_into(compiler, op, src_dst, src1, src1w, src2, src2w));
+	CHECK(check_sljit_emit_shift_into(compiler, op, dst_reg, src1_reg, src2_reg, src3, src3w));
 
 	op = GET_OPCODE(op);
 	is_left = (op == SLJIT_SHL || op == SLJIT_MSHL);
 
-	if (src_dst == src1) {
+	if (src1_reg == src2_reg) {
 		SLJIT_SKIP_CHECKS(compiler);
-		return sljit_emit_op2(compiler, is_left ? SLJIT_ROTL : SLJIT_ROTR, src_dst, 0, src_dst, 0, src2, src2w);
+		return sljit_emit_op2(compiler, is_left ? SLJIT_ROTL : SLJIT_ROTR, dst_reg, 0, src1_reg, 0, src3, src3w);
 	}
 
-	ADJUST_LOCAL_OFFSET(src1, src1w);
-	ADJUST_LOCAL_OFFSET(src2, src2w);
+	ADJUST_LOCAL_OFFSET(src3, src3w);
 
-	if (src2 & SLJIT_IMM) {
-		src2w &= 0x1f;
+	if (src3 == SLJIT_IMM) {
+		src3w &= 0x1f;
 
-		if (src2w == 0)
+		if (src3w == 0)
 			return SLJIT_SUCCESS;
-	} else if (src2 & SLJIT_MEM) {
-		FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, src2, src2w, TMP_REG2));
-		src2 = TMP_REG2;
-	}
 
-	if (src1 & SLJIT_MEM) {
-		FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src1, src1w, TMP_REG1));
-		src1 = TMP_REG1;
-	} else if (src1 & SLJIT_IMM) {
-		FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)src1w));
-		src1 = TMP_REG1;
-	}
-
-	if (src2 & SLJIT_IMM) {
-		if (reg_map[src_dst] <= 7)
-			FAIL_IF(push_inst16(compiler, (is_left ? LSLSI : LSRSI) | RD3(src_dst) | RN3(src_dst) | ((sljit_ins)src2w << 6)));
+		if (IS_2_LO_REGS(dst_reg, src1_reg))
+			FAIL_IF(push_inst16(compiler, (is_left ? LSLSI : LSRSI) | RD3(dst_reg) | RN3(src1_reg) | ((sljit_ins)src3w << 6)));
 		else
-			FAIL_IF(push_inst32(compiler, (is_left ? LSL_WI : LSR_WI) | RD4(src_dst) | RM4(src_dst) | IMM5(src2w)));
+			FAIL_IF(push_inst32(compiler, (is_left ? LSL_WI : LSR_WI) | RD4(dst_reg) | RM4(src1_reg) | IMM5(src3w)));
 
-		src2w = (src2w ^ 0x1f) + 1;
-		return push_inst32(compiler, ORR_W | RD4(src_dst) | RN4(src_dst) | RM4(src1) | (is_left ? 0x10 : 0x0) | IMM5(src2w));
+		src3w = (src3w ^ 0x1f) + 1;
+		return push_inst32(compiler, ORR_W | RD4(dst_reg) | RN4(dst_reg) | RM4(src2_reg) | (is_left ? 0x10 : 0x0) | IMM5(src3w));
 	}
 
-	if (op == SLJIT_MSHL || op == SLJIT_MLSHR) {
-		FAIL_IF(push_inst32(compiler, ANDI | RD4(TMP_REG2) | RN4(src2) | 0x1f));
-		src2 = TMP_REG2;
+	if (src3 & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, src3, src3w, TMP_REG2));
+		src3 = TMP_REG2;
 	}
 
-	if (IS_2_LO_REGS(src_dst, src2))
-		FAIL_IF(push_inst16(compiler, (is_left ? LSLS : LSRS) | RD3(src_dst) | RN3(src2)));
+	if (op == SLJIT_MSHL || op == SLJIT_MLSHR || dst_reg == src3) {
+		FAIL_IF(push_inst32(compiler, ANDI | RD4(TMP_REG2) | RN4(src3) | 0x1f));
+		src3 = TMP_REG2;
+	}
+
+	if (dst_reg == src1_reg && IS_2_LO_REGS(dst_reg, src3))
+		FAIL_IF(push_inst16(compiler, (is_left ? LSLS : LSRS) | RD3(dst_reg) | RN3(src3)));
 	else
-		FAIL_IF(push_inst32(compiler, (is_left ? LSL_W : LSR_W) | RD4(src_dst) | RN4(src_dst) | RM4(src2)));
+		FAIL_IF(push_inst32(compiler, (is_left ? LSL_W : LSR_W) | RD4(dst_reg) | RN4(src1_reg) | RM4(src3)));
 
-	FAIL_IF(push_inst32(compiler, (is_left ? LSR_WI : LSL_WI) | RD4(TMP_REG1) | RM4(src1) | (1 << 6)));
-	FAIL_IF(push_inst32(compiler, EORI | RD4(TMP_REG2) | RN4(src2) | 0x1f));
+	FAIL_IF(push_inst32(compiler, (is_left ? LSR_WI : LSL_WI) | RD4(TMP_REG1) | RM4(src2_reg) | (1 << 6)));
+	FAIL_IF(push_inst32(compiler, EORI | RD4(TMP_REG2) | RN4(src3) | 0x1f));
 	FAIL_IF(push_inst32(compiler, (is_left ? LSR_W : LSL_W) | RD4(TMP_REG1) | RN4(TMP_REG1) | RM4(TMP_REG2)));
-	return push_inst32(compiler, ORR_W | RD4(src_dst) | RN4(src_dst) | RM4(TMP_REG1));
+	return push_inst32(compiler, ORR_W | RD4(dst_reg) | RN4(dst_reg) | RM4(TMP_REG1));
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
@@ -1909,16 +2000,60 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw)
 {
-	CHECK_REG_INDEX(check_sljit_get_register_index(reg));
-	return reg_map[reg];
+	sljit_s32 size, dst_r;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_op_dst(compiler, op, dst, dstw));
+	ADJUST_LOCAL_OFFSET(dst, dstw);
+
+	switch (op) {
+	case SLJIT_FAST_ENTER:
+		SLJIT_ASSERT(reg_map[TMP_REG2] == 14);
+
+		if (FAST_IS_REG(dst))
+			return push_inst16(compiler, MOV | SET_REGS44(dst, TMP_REG2));
+		break;
+	case SLJIT_GET_RETURN_ADDRESS:
+		size = GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds - SLJIT_KEPT_SAVEDS_COUNT(compiler->options), 0);
+
+		if (compiler->fsaveds > 0 || compiler->fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG) {
+			/* The size of pc is not added above. */
+			if ((size & SSIZE_OF(sw)) == 0)
+				size += SSIZE_OF(sw);
+
+			size += GET_SAVED_FLOAT_REGISTERS_SIZE(compiler->fscratches, compiler->fsaveds, f64);
+		}
+
+		SLJIT_ASSERT(((compiler->local_size + size + SSIZE_OF(sw)) & 0x7) == 0);
+
+		dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2;
+		FAIL_IF(emit_op_mem(compiler, WORD_SIZE, dst_r, SLJIT_MEM1(SLJIT_SP), compiler->local_size + size, TMP_REG1));
+		break;
+	}
+
+	if (dst & SLJIT_MEM)
+		return emit_op_mem(compiler, WORD_SIZE | STORE, TMP_REG2, dst, dstw, TMP_REG1);
+
+	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg)
 {
-	CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
-	return (freg_map[reg] << 1);
+	CHECK_REG_INDEX(check_sljit_get_register_index(type, reg));
+
+	if (type == SLJIT_GP_REGISTER)
+		return reg_map[reg];
+
+	if (type == SLJIT_FLOAT_REGISTER || type == SLJIT_SIMD_REG_64)
+		return freg_map[reg];
+
+	if (type != SLJIT_SIMD_REG_128)
+		return freg_map[reg] & ~0x1;
+
+	return -1;
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
@@ -1954,35 +2089,35 @@ static sljit_s32 emit_fop_mem(struct slj
 
 	if ((arg & REG_MASK) && (argw & 0x3) == 0) {
 		if (!(argw & ~0x3fc))
-			return push_inst32(compiler, inst | 0x800000 | RN4(arg & REG_MASK) | DD4(reg) | ((sljit_uw)argw >> 2));
+			return push_inst32(compiler, inst | 0x800000 | RN4(arg & REG_MASK) | VD4(reg) | ((sljit_uw)argw >> 2));
 		if (!(-argw & ~0x3fc))
-			return push_inst32(compiler, inst | RN4(arg & REG_MASK) | DD4(reg) | ((sljit_uw)-argw >> 2));
+			return push_inst32(compiler, inst | RN4(arg & REG_MASK) | VD4(reg) | ((sljit_uw)-argw >> 2));
 	}
 
 	if (arg & REG_MASK) {
 		if (emit_set_delta(compiler, TMP_REG1, arg & REG_MASK, argw) != SLJIT_ERR_UNSUPPORTED) {
 			FAIL_IF(compiler->error);
-			return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | DD4(reg));
+			return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | VD4(reg));
 		}
 
 		imm = get_imm((sljit_uw)argw & ~(sljit_uw)0x3fc);
 		if (imm != INVALID_IMM) {
 			FAIL_IF(push_inst32(compiler, ADD_WI | RD4(TMP_REG1) | RN4(arg & REG_MASK) | imm));
-			return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | DD4(reg) | (((sljit_uw)argw & 0x3fc) >> 2));
+			return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | VD4(reg) | (((sljit_uw)argw & 0x3fc) >> 2));
 		}
 
 		imm = get_imm((sljit_uw)-argw & ~(sljit_uw)0x3fc);
 		if (imm != INVALID_IMM) {
 			argw = -argw;
 			FAIL_IF(push_inst32(compiler, SUB_WI | RD4(TMP_REG1) | RN4(arg & REG_MASK) | imm));
-			return push_inst32(compiler, inst | RN4(TMP_REG1) | DD4(reg) | (((sljit_uw)argw & 0x3fc) >> 2));
+			return push_inst32(compiler, inst | RN4(TMP_REG1) | VD4(reg) | (((sljit_uw)argw & 0x3fc) >> 2));
 		}
 	}
 
 	FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)argw));
 	if (arg & REG_MASK)
 		FAIL_IF(push_inst16(compiler, ADD | SET_REGS44(TMP_REG1, (arg & REG_MASK))));
-	return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | DD4(reg));
+	return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | VD4(reg));
 }
 
 static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,
@@ -1996,41 +2131,53 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 		src = TMP_FREG1;
 	}
 
-	FAIL_IF(push_inst32(compiler, VCVT_S32_F32 | (op & SLJIT_32) | DD4(TMP_FREG1) | DM4(src)));
+	FAIL_IF(push_inst32(compiler, VCVT_S32_F32 | (op & SLJIT_32) | VD4(TMP_FREG1) | VM4(src)));
 
 	if (FAST_IS_REG(dst))
-		return push_inst32(compiler, VMOV | (1 << 20) | RT4(dst) | DN4(TMP_FREG1));
+		return push_inst32(compiler, VMOV | (1 << 20) | RT4(dst) | VN4(TMP_FREG1));
 
 	/* Store the integer value from a VFP register. */
 	return emit_fop_mem(compiler, 0, TMP_FREG1, dst, dstw);
 }
 
-static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
+static sljit_s32 sljit_emit_fop1_conv_f64_from_w(struct sljit_compiler *compiler, sljit_ins ins,
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 src, sljit_sw srcw)
 {
 	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
 
-	op ^= SLJIT_32;
-
 	if (FAST_IS_REG(src))
-		FAIL_IF(push_inst32(compiler, VMOV | RT4(src) | DN4(TMP_FREG1)));
+		FAIL_IF(push_inst32(compiler, VMOV | RT4(src) | VN4(TMP_FREG1)));
 	else if (src & SLJIT_MEM) {
 		/* Load the integer value into a VFP register. */
 		FAIL_IF(emit_fop_mem(compiler, FPU_LOAD, TMP_FREG1, src, srcw));
 	}
 	else {
 		FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)srcw));
-		FAIL_IF(push_inst32(compiler, VMOV | RT4(TMP_REG1) | DN4(TMP_FREG1)));
+		FAIL_IF(push_inst32(compiler, VMOV | RT4(TMP_REG1) | VN4(TMP_FREG1)));
 	}
 
-	FAIL_IF(push_inst32(compiler, VCVT_F32_S32 | (op & SLJIT_32) | DD4(dst_r) | DM4(TMP_FREG1)));
+	FAIL_IF(push_inst32(compiler, ins | VD4(dst_r) | VM4(TMP_FREG1)));
 
 	if (dst & SLJIT_MEM)
-		return emit_fop_mem(compiler, (op & SLJIT_32), TMP_FREG1, dst, dstw);
+		return emit_fop_mem(compiler, (ins & SLJIT_32), TMP_FREG1, dst, dstw);
 	return SLJIT_SUCCESS;
 }
 
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	return sljit_emit_fop1_conv_f64_from_w(compiler, VCVT_F32_S32 | (~op & SLJIT_32), dst, dstw, src, srcw);
+}
+
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	return sljit_emit_fop1_conv_f64_from_w(compiler, VCVT_F32_U32 | (~op & SLJIT_32), dst, dstw, src, srcw);
+}
+
 static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,
 	sljit_s32 src1, sljit_sw src1w,
 	sljit_s32 src2, sljit_sw src2w)
@@ -2038,17 +2185,23 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 	op ^= SLJIT_32;
 
 	if (src1 & SLJIT_MEM) {
-		emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG1, src1, src1w);
+		FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG1, src1, src1w));
 		src1 = TMP_FREG1;
 	}
 
 	if (src2 & SLJIT_MEM) {
-		emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG2, src2, src2w);
+		FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG2, src2, src2w));
 		src2 = TMP_FREG2;
 	}
 
-	FAIL_IF(push_inst32(compiler, VCMP_F32 | (op & SLJIT_32) | DD4(src1) | DM4(src2)));
-	return push_inst32(compiler, VMRS);
+	FAIL_IF(push_inst32(compiler, VCMP_F32 | (op & SLJIT_32) | VD4(src1) | VM4(src2)));
+	FAIL_IF(push_inst32(compiler, VMRS));
+
+	if (GET_FLAG_TYPE(op) != SLJIT_UNORDERED_OR_EQUAL)
+		return SLJIT_SUCCESS;
+
+	FAIL_IF(push_inst16(compiler, IT | (0x6 << 4) | 0x8));
+	return push_inst16(compiler, CMP /* Rm, Rn = r0 */);
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
@@ -2068,7 +2221,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		op ^= SLJIT_32;
 
 	if (src & SLJIT_MEM) {
-		emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, dst_r, src, srcw);
+		FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, dst_r, src, srcw));
 		src = dst_r;
 	}
 
@@ -2076,19 +2229,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	case SLJIT_MOV_F64:
 		if (src != dst_r) {
 			if (dst_r != TMP_FREG1)
-				FAIL_IF(push_inst32(compiler, VMOV_F32 | (op & SLJIT_32) | DD4(dst_r) | DM4(src)));
+				FAIL_IF(push_inst32(compiler, VMOV_F32 | (op & SLJIT_32) | VD4(dst_r) | VM4(src)));
 			else
 				dst_r = src;
 		}
 		break;
 	case SLJIT_NEG_F64:
-		FAIL_IF(push_inst32(compiler, VNEG_F32 | (op & SLJIT_32) | DD4(dst_r) | DM4(src)));
+		FAIL_IF(push_inst32(compiler, VNEG_F32 | (op & SLJIT_32) | VD4(dst_r) | VM4(src)));
 		break;
 	case SLJIT_ABS_F64:
-		FAIL_IF(push_inst32(compiler, VABS_F32 | (op & SLJIT_32) | DD4(dst_r) | DM4(src)));
+		FAIL_IF(push_inst32(compiler, VABS_F32 | (op & SLJIT_32) | VD4(dst_r) | VM4(src)));
 		break;
 	case SLJIT_CONV_F64_FROM_F32:
-		FAIL_IF(push_inst32(compiler, VCVT_F64_F32 | (op & SLJIT_32) | DD4(dst_r) | DM4(src)));
+		FAIL_IF(push_inst32(compiler, VCVT_F64_F32 | (op & SLJIT_32) | VD4(dst_r) | VM4(src)));
 		op ^= SLJIT_32;
 		break;
 	}
@@ -2115,27 +2268,33 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
 	if (src1 & SLJIT_MEM) {
-		emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG1, src1, src1w);
+		FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG1, src1, src1w));
 		src1 = TMP_FREG1;
 	}
 	if (src2 & SLJIT_MEM) {
-		emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG2, src2, src2w);
+		FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_32) | FPU_LOAD, TMP_FREG2, src2, src2w));
 		src2 = TMP_FREG2;
 	}
 
 	switch (GET_OPCODE(op)) {
 	case SLJIT_ADD_F64:
-		FAIL_IF(push_inst32(compiler, VADD_F32 | (op & SLJIT_32) | DD4(dst_r) | DN4(src1) | DM4(src2)));
+		FAIL_IF(push_inst32(compiler, VADD_F32 | (op & SLJIT_32) | VD4(dst_r) | VN4(src1) | VM4(src2)));
 		break;
 	case SLJIT_SUB_F64:
-		FAIL_IF(push_inst32(compiler, VSUB_F32 | (op & SLJIT_32) | DD4(dst_r) | DN4(src1) | DM4(src2)));
+		FAIL_IF(push_inst32(compiler, VSUB_F32 | (op & SLJIT_32) | VD4(dst_r) | VN4(src1) | VM4(src2)));
 		break;
 	case SLJIT_MUL_F64:
-		FAIL_IF(push_inst32(compiler, VMUL_F32 | (op & SLJIT_32) | DD4(dst_r) | DN4(src1) | DM4(src2)));
+		FAIL_IF(push_inst32(compiler, VMUL_F32 | (op & SLJIT_32) | VD4(dst_r) | VN4(src1) | VM4(src2)));
 		break;
 	case SLJIT_DIV_F64:
-		FAIL_IF(push_inst32(compiler, VDIV_F32 | (op & SLJIT_32) | DD4(dst_r) | DN4(src1) | DM4(src2)));
+		FAIL_IF(push_inst32(compiler, VDIV_F32 | (op & SLJIT_32) | VD4(dst_r) | VN4(src1) | VM4(src2)));
 		break;
+	case SLJIT_COPYSIGN_F64:
+		FAIL_IF(push_inst32(compiler, VMOV | (1 << 20) | VN4(src2) | RT4(TMP_REG1) | ((op & SLJIT_32) ? (1 << 7) : 0)));
+		FAIL_IF(push_inst32(compiler, VABS_F32 | (op & SLJIT_32) | VD4(dst_r) | VM4(src1)));
+		FAIL_IF(push_inst32(compiler, CMPI_W | RN4(TMP_REG1) | 0));
+		FAIL_IF(push_inst16(compiler, IT | (0xb << 4) | 0x8));
+		return push_inst32(compiler, VNEG_F32 | (op & SLJIT_32) | VD4(dst_r) | VM4(dst_r));
 	}
 
 	if (!(dst & SLJIT_MEM))
@@ -2143,23 +2302,99 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return emit_fop_mem(compiler, (op & SLJIT_32), TMP_FREG1, dst, dstw);
 }
 
-/* --------------------------------------------------------------------- */
-/*  Other instructions                                                   */
-/* --------------------------------------------------------------------- */
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f32 value)
+{
+#if defined(__ARM_NEON) && __ARM_NEON
+	sljit_u32 exp;
+	sljit_ins ins;
+#endif /* NEON */
+	union {
+		sljit_u32 imm;
+		sljit_f32 value;
+	} u;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fset32(compiler, freg, value));
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+	u.value = value;
+
+#if defined(__ARM_NEON) && __ARM_NEON
+	if ((u.imm << (32 - 19)) == 0) {
+		exp = (u.imm >> (23 + 2)) & 0x3f;
+
+		if (exp == 0x20 || exp == 0x1f) {
+			ins = ((u.imm >> 24) & 0x80) | ((u.imm >> 19) & 0x7f);
+			return push_inst32(compiler, (VMOV_F32 ^ (1 << 6)) | ((ins & 0xf0) << 12) | VD4(freg) | (ins & 0xf));
+		}
+	}
+#endif /* NEON */
+
+	FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm));
+	return push_inst32(compiler, VMOV | VN4(freg) | RT4(TMP_REG1));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f64 value)
 {
+#if defined(__ARM_NEON) && __ARM_NEON
+	sljit_u32 exp;
+	sljit_ins ins;
+#endif /* NEON */
+	union {
+		sljit_u32 imm[2];
+		sljit_f64 value;
+	} u;
+
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
-	ADJUST_LOCAL_OFFSET(dst, dstw);
+	CHECK(check_sljit_emit_fset64(compiler, freg, value));
 
-	SLJIT_ASSERT(reg_map[TMP_REG2] == 14);
+	u.value = value;
 
-	if (FAST_IS_REG(dst))
-		return push_inst16(compiler, MOV | SET_REGS44(dst, TMP_REG2));
+#if defined(__ARM_NEON) && __ARM_NEON
+	if (u.imm[0] == 0 && (u.imm[1] << (64 - 48)) == 0) {
+		exp = (u.imm[1] >> ((52 - 32) + 2)) & 0x1ff;
 
-	/* Memory. */
-	return emit_op_mem(compiler, WORD_SIZE | STORE, TMP_REG2, dst, dstw, TMP_REG1);
+		if (exp == 0x100 || exp == 0xff) {
+			ins = ((u.imm[1] >> (56 - 32)) & 0x80) | ((u.imm[1] >> (48 - 32)) & 0x7f);
+			return push_inst32(compiler, (VMOV_F32 ^ (1 << 6)) | (1 << 8) | ((ins & 0xf0) << 12) | VD4(freg) | (ins & 0xf));
+		}
+	}
+#endif /* NEON */
+
+	FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm[0]));
+	if (u.imm[0] == u.imm[1])
+		return push_inst32(compiler, VMOV2 | RN4(TMP_REG1) | RT4(TMP_REG1) | VM4(freg));
+
+	FAIL_IF(load_immediate(compiler, TMP_REG2, u.imm[1]));
+	return push_inst32(compiler, VMOV2 | RN4(TMP_REG2) | RT4(TMP_REG1) | VM4(freg));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 freg, sljit_s32 reg)
+{
+	sljit_s32 reg2;
+	sljit_ins inst;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg));
+
+	if (reg & REG_PAIR_MASK) {
+		reg2 = REG_PAIR_SECOND(reg);
+		reg = REG_PAIR_FIRST(reg);
+
+		inst = VMOV2 | RN4(reg) | RT4(reg2) | VM4(freg);
+	} else {
+		inst = VMOV | VN4(freg) | RT4(reg);
+
+		if (!(op & SLJIT_32))
+			inst |= 1 << 7;
+	}
+
+	if (GET_OPCODE(op) == SLJIT_COPY_FROM_F64)
+		inst |= 1 << 20;
+
+	return push_inst32(compiler, inst);
 }
 
 /* --------------------------------------------------------------------- */
@@ -2170,15 +2405,17 @@ static sljit_uw get_cc(struct sljit_comp
 {
 	switch (type) {
 	case SLJIT_EQUAL:
+	case SLJIT_ATOMIC_STORED:
 	case SLJIT_F_EQUAL:
 	case SLJIT_ORDERED_EQUAL:
-	case SLJIT_UNORDERED_OR_EQUAL: /* Not supported. */
+	case SLJIT_UNORDERED_OR_EQUAL:
 		return 0x0;
 
 	case SLJIT_NOT_EQUAL:
+	case SLJIT_ATOMIC_NOT_STORED:
 	case SLJIT_F_NOT_EQUAL:
 	case SLJIT_UNORDERED_OR_NOT_EQUAL:
-	case SLJIT_ORDERED_NOT_EQUAL: /* Not supported. */
+	case SLJIT_ORDERED_NOT_EQUAL:
 		return 0x1;
 
 	case SLJIT_CARRY:
@@ -2453,18 +2690,18 @@ static sljit_s32 hardfloat_call_with_arg
 		switch (arg_types & SLJIT_ARG_MASK) {
 		case SLJIT_ARG_TYPE_F64:
 			if (offset != new_offset)
-				FAIL_IF(push_inst32(compiler, VMOV_F32 | SLJIT_32 | DD4(new_offset) | DM4(offset)));
+				FAIL_IF(push_inst32(compiler, VMOV_F32 | SLJIT_32 | VD4(new_offset) | VM4(offset)));
 
 			new_offset++;
 			offset++;
 			break;
 		case SLJIT_ARG_TYPE_F32:
 			if (f32_offset != 0) {
-				FAIL_IF(push_inst32(compiler, VMOV_F32 | 0x400000 | DD4(f32_offset) | DM4(offset)));
+				FAIL_IF(push_inst32(compiler, VMOV_F32 | 0x400000 | VD4(f32_offset) | VM4(offset)));
 				f32_offset = 0;
 			} else {
 				if (offset != new_offset)
-					FAIL_IF(push_inst32(compiler, VMOV_F32 | 0x400000 | DD4(new_offset) | DM4(offset)));
+					FAIL_IF(push_inst32(compiler, VMOV_F32 | 0x400000 | VD4(new_offset) | VM4(offset)));
 				f32_offset = new_offset;
 				new_offset++;
 			}
@@ -2546,7 +2783,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	SLJIT_ASSERT(reg_map[TMP_REG1] != 14);
 
-	if (!(src & SLJIT_IMM)) {
+	if (src != SLJIT_IMM) {
 		if (FAST_IS_REG(src)) {
 			SLJIT_ASSERT(reg_map[src] != 14);
 			return push_inst16(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RN3(src));
@@ -2645,8 +2882,8 @@ static SLJIT_INLINE sljit_s32 emit_fmov_
 
 	if (FAST_IS_REG(src)) {
 		if (op & SLJIT_32)
-			return push_inst32(compiler, VMOV | (1 << 20) | DN4(src) | RT4(SLJIT_R0));
-		return push_inst32(compiler, VMOV2 | (1 << 20) | DM4(src) | RT4(SLJIT_R0) | RN4(SLJIT_R1));
+			return push_inst32(compiler, VMOV | (1 << 20) | VN4(src) | RT4(SLJIT_R0));
+		return push_inst32(compiler, VMOV2 | (1 << 20) | VM4(src) | RT4(SLJIT_R0) | RN4(SLJIT_R1));
 	}
 
 	SLJIT_SKIP_CHECKS(compiler);
@@ -2711,23 +2948,47 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return push_inst32(compiler, MOV_W | SET_FLAGS | RD4(TMP_REG1) | RM4(dst_r));
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 dst_reg,
-	sljit_s32 src, sljit_sw srcw)
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_reg)
 {
 	sljit_uw cc, tmp;
 
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));
+	CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg));
+
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+
+	if (src2_reg != dst_reg && src1 == dst_reg) {
+		src1 = src2_reg;
+		src1w = 0;
+		src2_reg = dst_reg;
+		type ^= 0x1;
+	}
+
+	if (src1 & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem(compiler, WORD_SIZE, (src2_reg != dst_reg) ? dst_reg : TMP_REG1, src1, src1w, TMP_REG2));
+
+		if (src2_reg != dst_reg) {
+			src1 = src2_reg;
+			src1w = 0;
+			type ^= 0x1;
+		} else {
+			src1 = TMP_REG1;
+			src1w = 0;
+		}
+	} else if (dst_reg != src2_reg)
+		FAIL_IF(push_inst16(compiler, MOV | SET_REGS44(dst_reg, src2_reg)));
 
 	cc = get_cc(compiler, type & ~SLJIT_32);
 
-	if (!(src & SLJIT_IMM)) {
+	if (src1 != SLJIT_IMM) {
 		FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8));
-		return push_inst16(compiler, MOV | SET_REGS44(dst_reg, src));
+		return push_inst16(compiler, MOV | SET_REGS44(dst_reg, src1));
 	}
 
-	tmp = (sljit_uw) srcw;
+	tmp = (sljit_uw)src1w;
 
 	if (tmp < 0x10000) {
 		/* set low 16 bits, set hi 16 bits to 0. */
@@ -2736,13 +2997,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			| COPY_BITS(tmp, 12, 16, 4) | COPY_BITS(tmp, 11, 26, 1) | COPY_BITS(tmp, 8, 12, 3) | (tmp & 0xff));
 	}
 
-	tmp = get_imm((sljit_uw)srcw);
+	tmp = get_imm((sljit_uw)src1w);
 	if (tmp != INVALID_IMM) {
 		FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8));
 		return push_inst32(compiler, MOV_WI | RD4(dst_reg) | tmp);
 	}
 
-	tmp = get_imm(~(sljit_uw)srcw);
+	tmp = get_imm(~(sljit_uw)src1w);
 	if (tmp != INVALID_IMM) {
 		FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8));
 		return push_inst32(compiler, MVN_WI | RD4(dst_reg) | tmp);
@@ -2750,13 +3011,43 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	FAIL_IF(push_inst16(compiler, IT | (cc << 4) | ((cc & 0x1) << 3) | 0x4));
 
-	tmp = (sljit_uw) srcw;
+	tmp = (sljit_uw)src1w;
 	FAIL_IF(push_inst32(compiler, MOVW | RD4(dst_reg)
 		| COPY_BITS(tmp, 12, 16, 4) | COPY_BITS(tmp, 11, 26, 1) | COPY_BITS(tmp, 8, 12, 3) | (tmp & 0xff)));
 	return push_inst32(compiler, MOVT | RD4(dst_reg)
 		| COPY_BITS(tmp, 12 + 16, 16, 4) | COPY_BITS(tmp, 11 + 16, 26, 1) | COPY_BITS(tmp, 8 + 16, 12, 3) | ((tmp & 0xff0000) >> 16));
 }
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_freg)
+{
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg));
+
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+
+	type ^= SLJIT_32;
+
+	if (dst_freg != src2_freg) {
+		if (dst_freg == src1) {
+			src1 = src2_freg;
+			src1w = 0;
+			type ^= 0x1;
+		} else
+			FAIL_IF(push_inst32(compiler, VMOV_F32 | (type & SLJIT_32) | VD4(dst_freg) | VM4(src2_freg)));
+	}
+
+	if (src1 & SLJIT_MEM) {
+		FAIL_IF(emit_fop_mem(compiler, (type & SLJIT_32) | FPU_LOAD, TMP_FREG1, src1, src1w));
+		src1 = TMP_FREG1;
+	}
+
+	FAIL_IF(push_inst16(compiler, IT | (get_cc(compiler, type & ~SLJIT_32) << 4) | 0x8));
+	return push_inst32(compiler, VMOV_F32 | (type & SLJIT_32) | VD4(dst_freg) | VM4(src1));
+}
+
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 reg,
 	sljit_s32 mem, sljit_sw memw)
@@ -2770,7 +3061,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	if (!(reg & REG_PAIR_MASK))
 		return sljit_emit_mem_unaligned(compiler, type, reg, mem, memw);
 
-	if (type & (SLJIT_MEM_UNALIGNED | SLJIT_MEM_UNALIGNED_16 | SLJIT_MEM_UNALIGNED_32)) {
+	if (type & (SLJIT_MEM_UNALIGNED | SLJIT_MEM_ALIGNED_16 | SLJIT_MEM_ALIGNED_32)) {
 		if ((mem & REG_MASK) == 0) {
 			if ((memw & 0xfff) >= (0x1000 - SSIZE_OF(sw))) {
 				imm = get_imm((sljit_uw)((memw + 0x1000) & ~0xfff));
@@ -2781,7 +3072,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 				imm = get_imm((sljit_uw)(memw & ~0xfff));
 
 				if (imm != INVALID_IMM)
-					memw &= 0xff;
+					memw &= 0xfff;
 			}
 
 			if (imm == INVALID_IMM) {
@@ -3058,11 +3349,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_fmem(compiler, type, freg, mem, memw));
 
-	if (type & SLJIT_MEM_UNALIGNED_32)
+	if (type & SLJIT_MEM_ALIGNED_32)
 		return emit_fop_mem(compiler, ((type ^ SLJIT_32) & SLJIT_32) | ((type & SLJIT_MEM_STORE) ? 0 : FPU_LOAD), freg, mem, memw);
 
 	if (type & SLJIT_MEM_STORE) {
-		FAIL_IF(push_inst32(compiler, VMOV | (1 << 20) | DN4(freg) | RT4(TMP_REG2)));
+		FAIL_IF(push_inst32(compiler, VMOV | (1 << 20) | VN4(freg) | RT4(TMP_REG2)));
 
 		if (type & SLJIT_32)
 			return emit_op_mem(compiler, WORD_SIZE | STORE, TMP_REG2, mem, memw, TMP_REG1);
@@ -3071,13 +3362,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		mem |= SLJIT_MEM;
 
 		FAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, TMP_REG2, mem, memw, TMP_REG1));
-		FAIL_IF(push_inst32(compiler, VMOV | (1 << 20) | DN4(freg) | 0x80 | RT4(TMP_REG2)));
+		FAIL_IF(push_inst32(compiler, VMOV | (1 << 20) | VN4(freg) | 0x80 | RT4(TMP_REG2)));
 		return emit_op_mem(compiler, WORD_SIZE | STORE, TMP_REG2, mem, memw + 4, TMP_REG1);
 	}
 
 	if (type & SLJIT_32) {
 		FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, mem, memw, TMP_REG1));
-		return push_inst32(compiler, VMOV | DN4(freg) | RT4(TMP_REG2));
+		return push_inst32(compiler, VMOV | VN4(freg) | RT4(TMP_REG2));
 	}
 
 	FAIL_IF(update_mem_addr(compiler, &mem, &memw, 0xfff - 4));
@@ -3085,11 +3376,715 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, mem, memw, TMP_REG1));
 	FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, mem, memw + 4, TMP_REG1));
-	return push_inst32(compiler, VMOV2 | DM4(freg) | RT4(TMP_REG2) | RN4(TMP_REG1));
+	return push_inst32(compiler, VMOV2 | VM4(freg) | RT4(TMP_REG2) | RN4(TMP_REG1));
+}
+
+static sljit_s32 sljit_emit_simd_mem_offset(struct sljit_compiler *compiler, sljit_s32 *mem_ptr, sljit_sw memw)
+{
+	sljit_uw imm;
+	sljit_s32 mem = *mem_ptr;
+
+	if (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) {
+		*mem_ptr = TMP_REG1;
+		return push_inst32(compiler, ADD_W | RD4(TMP_REG1) | RN4(mem & REG_MASK) | RM4(OFFS_REG(mem)) | ((sljit_uw)(memw & 0x3) << 6));
+	}
+
+	if (SLJIT_UNLIKELY(!(mem & REG_MASK))) {
+		*mem_ptr = TMP_REG1;
+		return load_immediate(compiler, TMP_REG1, (sljit_uw)memw);
+	}
+
+	mem &= REG_MASK;
+
+	if (memw == 0) {
+		*mem_ptr = mem;
+		return SLJIT_SUCCESS;
+	}
+
+	*mem_ptr = TMP_REG1;
+	imm = get_imm((sljit_uw)(memw < 0 ? -memw : memw));
+
+	if (imm != INVALID_IMM)
+		return push_inst32(compiler, ((memw < 0) ? SUB_WI : ADD_WI) | RD4(TMP_REG1) | RN4(mem) | imm);
+
+	FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)memw));
+	return push_inst16(compiler, ADD | SET_REGS44(TMP_REG1, mem));
+}
+
+static SLJIT_INLINE sljit_s32 simd_get_quad_reg_index(sljit_s32 freg)
+{
+	freg += freg & 0x1;
+
+	SLJIT_ASSERT((freg_map[freg] & 0x1) == (freg <= SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS));
+
+	if (freg <= SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS)
+		freg--;
+
+	return freg;
+}
+
+#define SLJIT_QUAD_OTHER_HALF(freg) ((((freg) & 0x1) << 1) - 1)
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 srcdst, sljit_sw srcdstw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_s32 alignment = SLJIT_SIMD_GET_ELEM2_SIZE(type);
+	sljit_ins ins;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_mov(compiler, type, freg, srcdst, srcdstw));
+
+	ADJUST_LOCAL_OFFSET(srcdst, srcdstw);
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (reg_size == 4)
+		freg = simd_get_quad_reg_index(freg);
+
+	if (!(srcdst & SLJIT_MEM)) {
+		if (reg_size == 4)
+			srcdst = simd_get_quad_reg_index(srcdst);
+
+		if (type & SLJIT_SIMD_STORE)
+			ins = VD4(srcdst) | VN4(freg) | VM4(freg);
+		else
+			ins = VD4(freg) | VN4(srcdst) | VM4(srcdst);
+
+		if (reg_size == 4)
+			ins |= (sljit_ins)1 << 6;
+
+		return push_inst32(compiler, VORR | ins);
+	}
+
+	FAIL_IF(sljit_emit_simd_mem_offset(compiler, &srcdst, srcdstw));
+
+	if (elem_size > 3)
+		elem_size = 3;
+
+	ins = ((type & SLJIT_SIMD_STORE) ? VST1 : VLD1) | VD4(freg)
+		| (sljit_ins)((reg_size == 3) ? (0x7 << 8) : (0xa << 8));
+
+	SLJIT_ASSERT(reg_size >= alignment);
+
+	if (alignment == 3)
+		ins |= 0x10;
+	else if (alignment >= 4)
+		ins |= 0x20;
+
+	return push_inst32(compiler, ins | RN4(srcdst) | ((sljit_ins)elem_size) << 6 | 0xf);
+}
+
+static sljit_ins simd_get_imm(sljit_s32 elem_size, sljit_uw value)
+{
+	sljit_ins result;
+
+	if (elem_size > 1 && (sljit_u16)value == (value >> 16)) {
+		elem_size = 1;
+		value = (sljit_u16)value;
+	}
+
+	if (elem_size == 1 && (sljit_u8)value == (value >> 8)) {
+		elem_size = 0;
+		value = (sljit_u8)value;
+	}
+
+	switch (elem_size) {
+	case 0:
+		SLJIT_ASSERT(value <= 0xff);
+		result = 0xe00;
+		break;
+	case 1:
+		SLJIT_ASSERT(value <= 0xffff);
+		result = 0;
+
+		while (1) {
+			if (value <= 0xff) {
+				result |= 0x800;
+				break;
+			}
+
+			if ((value & 0xff) == 0) {
+				value >>= 8;
+				result |= 0xa00;
+				break;
+			}
+
+			if (result != 0)
+				return ~(sljit_ins)0;
+
+			value ^= (sljit_uw)0xffff;
+			result = (1 << 5);
+		}
+		break;
+	default:
+		SLJIT_ASSERT(value <= 0xffffffff);
+		result = 0;
+
+		while (1) {
+			if (value <= 0xff) {
+				result |= 0x000;
+				break;
+			}
+
+			if ((value & ~(sljit_uw)0xff00) == 0) {
+				value >>= 8;
+				result |= 0x200;
+				break;
+			}
+
+			if ((value & ~(sljit_uw)0xff0000) == 0) {
+				value >>= 16;
+				result |= 0x400;
+				break;
+			}
+
+			if ((value & ~(sljit_uw)0xff000000) == 0) {
+				value >>= 24;
+				result |= 0x600;
+				break;
+			}
+
+			if ((value & (sljit_uw)0xff) == 0xff && (value >> 16) == 0) {
+				value >>= 8;
+				result |= 0xc00;
+				break;
+			}
+
+			if ((value & (sljit_uw)0xffff) == 0xffff && (value >> 24) == 0) {
+				value >>= 16;
+				result |= 0xd00;
+				break;
+			}
+
+			if (result != 0)
+				return ~(sljit_ins)0;
+
+			value = ~value;
+			result = (1 << 5);
+		}
+		break;
+	}
+
+	return ((sljit_ins)value & 0xf) | (((sljit_ins)value & 0x70) << 12) | (((sljit_ins)value & 0x80) << 21) | result;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins, imm;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_replicate(compiler, type, freg, src, srcw));
+
+	ADJUST_LOCAL_OFFSET(src, srcw);
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) ? (elem_size < 2 || elem_size > 3) : (elem_size > 2))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (reg_size == 4)
+		freg = simd_get_quad_reg_index(freg);
+
+	if (src == SLJIT_IMM && srcw == 0)
+		return push_inst32(compiler, VMOV_i | ((reg_size == 4) ? (1 << 6) : 0) | VD4(freg));
+
+	if (SLJIT_UNLIKELY(elem_size == 3)) {
+		SLJIT_ASSERT(type & SLJIT_SIMD_FLOAT);
+
+		if (src & SLJIT_MEM) {
+			FAIL_IF(emit_fop_mem(compiler, FPU_LOAD | SLJIT_32, freg, src, srcw));
+			src = freg;
+		} else if (freg != src)
+			FAIL_IF(push_inst32(compiler, VORR | VD4(freg) | VN4(src) | VM4(src)));
+
+		freg += SLJIT_QUAD_OTHER_HALF(freg);
+
+		if (freg != src)
+			return push_inst32(compiler, VORR | VD4(freg) | VN4(src) | VM4(src));
+		return SLJIT_SUCCESS;
+	}
+
+	if (src & SLJIT_MEM) {
+		FAIL_IF(sljit_emit_simd_mem_offset(compiler, &src, srcw));
+
+		ins = (sljit_ins)(elem_size << 6);
+
+		if (reg_size == 4)
+			ins |= 1 << 5;
+
+		return push_inst32(compiler, VLD1_r | ins | VD4(freg) | RN4(src) | 0xf);
+	}
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		SLJIT_ASSERT(elem_size == 2);
+		ins = ((sljit_ins)freg_ebit_map[src] << (16 + 2 + 1)) | ((sljit_ins)1 << (16 + 2));
+
+		if (reg_size == 4)
+			ins |= (sljit_ins)1 << 6;
+
+		return push_inst32(compiler, VDUP_s | ins | VD4(freg) | (sljit_ins)freg_map[src]);
+	}
+
+	if (src == SLJIT_IMM) {
+		if (elem_size < 2)
+			srcw &= ((sljit_sw)1 << (((sljit_sw)1 << elem_size) << 3)) - 1;
+
+		imm = simd_get_imm(elem_size, (sljit_uw)srcw);
+
+		if (imm != ~(sljit_ins)0) {
+			if (reg_size == 4)
+				imm |= (sljit_ins)1 << 6;
+
+			return push_inst32(compiler, VMOV_i | imm | VD4(freg));
+		}
+
+		FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)srcw));
+		src = TMP_REG1;
+	}
+
+	switch (elem_size) {
+	case 0:
+		ins = 1 << 22;
+		break;
+	case 1:
+		ins = 1 << 5;
+		break;
+	default:
+		ins = 0;
+		break;
+	}
+
+	if (reg_size == 4)
+		ins |= (sljit_ins)1 << 21;
+
+	return push_inst32(compiler, VDUP | ins | VN4(freg) | RT4(src));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg, sljit_s32 lane_index,
+	sljit_s32 srcdst, sljit_sw srcdstw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_lane_mov(compiler, type, freg, lane_index, srcdst, srcdstw));
+
+	ADJUST_LOCAL_OFFSET(srcdst, srcdstw);
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) ? (elem_size < 2 || elem_size > 3) : (elem_size > 2))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (reg_size == 4)
+		freg = simd_get_quad_reg_index(freg);
+
+	if (type & SLJIT_SIMD_LANE_ZERO) {
+		ins = (reg_size == 3) ? 0 : ((sljit_ins)1 << 6);
+
+		if (type & SLJIT_SIMD_FLOAT) {
+			if (elem_size == 3 && !(srcdst & SLJIT_MEM)) {
+				if (lane_index == 1)
+					freg += SLJIT_QUAD_OTHER_HALF(freg);
+
+				if (srcdst != freg)
+					FAIL_IF(push_inst32(compiler, VORR | VD4(freg) | VN4(srcdst) | VM4(srcdst)));
+
+				freg += SLJIT_QUAD_OTHER_HALF(freg);
+				return push_inst32(compiler, VMOV_i | VD4(freg));
+			}
+
+			if (srcdst == freg || (elem_size == 3 && srcdst == (freg + SLJIT_QUAD_OTHER_HALF(freg)))) {
+				FAIL_IF(push_inst32(compiler, VORR | ins | VD4(TMP_FREG2) | VN4(freg) | VM4(freg)));
+				srcdst = TMP_FREG2;
+				srcdstw = 0;
+			}
+		}
+
+		FAIL_IF(push_inst32(compiler, VMOV_i | ins | VD4(freg)));
+	}
+
+	if (reg_size == 4 && lane_index >= (0x8 >> elem_size)) {
+		lane_index -= (0x8 >> elem_size);
+		freg += SLJIT_QUAD_OTHER_HALF(freg);
+	}
+
+	if (srcdst & SLJIT_MEM) {
+		if (elem_size == 3)
+			return emit_fop_mem(compiler, ((type & SLJIT_SIMD_STORE) ? 0 : FPU_LOAD) | SLJIT_32, freg, srcdst, srcdstw);
+
+		FAIL_IF(sljit_emit_simd_mem_offset(compiler, &srcdst, srcdstw));
+
+		lane_index = lane_index << elem_size;
+		ins = (sljit_ins)((elem_size << 10) | (lane_index << 5));
+		return push_inst32(compiler, ((type & SLJIT_SIMD_STORE) ? VST1_s : VLD1_s) | ins | VD4(freg) | RN4(srcdst) | 0xf);
+	}
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		if (elem_size == 3) {
+			if (type & SLJIT_SIMD_STORE)
+				return push_inst32(compiler, VORR | VD4(srcdst) | VN4(freg) | VM4(freg));
+			return push_inst32(compiler, VMOV_F32 | SLJIT_32 | VD4(freg) | VM4(srcdst));
+		}
+
+		if (type & SLJIT_SIMD_STORE) {
+			if (freg_ebit_map[freg] == 0) {
+				if (lane_index == 1)
+					freg = SLJIT_F64_SECOND(freg);
+
+				return push_inst32(compiler, VMOV_F32 | VD4(srcdst) | VM4(freg));
+			}
+
+			FAIL_IF(push_inst32(compiler, VMOV_s | (1 << 20) | ((sljit_ins)lane_index << 21) | VN4(freg) | RT4(TMP_REG1)));
+			return push_inst32(compiler, VMOV | VN4(srcdst) | RT4(TMP_REG1));
+		}
+
+		FAIL_IF(push_inst32(compiler, VMOV | (1 << 20) | VN4(srcdst) | RT4(TMP_REG1)));
+		return push_inst32(compiler, VMOV_s | ((sljit_ins)lane_index << 21) | VN4(freg) | RT4(TMP_REG1));
+	}
+
+	if (srcdst == SLJIT_IMM) {
+		if (elem_size < 2)
+			srcdstw &= ((sljit_sw)1 << (((sljit_sw)1 << elem_size) << 3)) - 1;
+
+		FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_uw)srcdstw));
+		srcdst = TMP_REG1;
+	}
+
+	if (elem_size == 0)
+		ins = 0x400000;
+	else if (elem_size == 1)
+		ins = 0x20;
+	else
+		ins = 0;
+
+	lane_index = lane_index << elem_size;
+	ins |= (sljit_ins)(((lane_index & 0x4) << 19) | ((lane_index & 0x3) << 5));
+
+	if (type & SLJIT_SIMD_STORE) {
+		ins |= (1 << 20);
+
+		if (elem_size < 2 && !(type & SLJIT_SIMD_LANE_SIGNED))
+			ins |= (1 << 23);
+	}
+
+	return push_inst32(compiler, VMOV_s | ins | VN4(freg) | RT4(srcdst));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_s32 src_lane_index)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_lane_replicate(compiler, type, freg, src, src_lane_index));
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (reg_size == 4) {
+		freg = simd_get_quad_reg_index(freg);
+		src = simd_get_quad_reg_index(src);
+
+		if (src_lane_index >= (0x8 >> elem_size)) {
+			src_lane_index -= (0x8 >> elem_size);
+			src += SLJIT_QUAD_OTHER_HALF(src);
+		}
+	}
+
+	if (elem_size == 3) {
+		if (freg != src)
+			FAIL_IF(push_inst32(compiler, VORR | VD4(freg) | VN4(src) | VM4(src)));
+
+		freg += SLJIT_QUAD_OTHER_HALF(freg);
+
+		if (freg != src)
+			return push_inst32(compiler, VORR | VD4(freg) | VN4(src) | VM4(src));
+		return SLJIT_SUCCESS;
+	}
+
+	ins = ((((sljit_ins)src_lane_index << 1) | 1) << (16 + elem_size));
+
+	if (reg_size == 4)
+		ins |= (sljit_ins)1 << 6;
+
+	return push_inst32(compiler, VDUP_s | ins | VD4(freg) | VM4(src));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_s32 elem2_size = SLJIT_SIMD_GET_ELEM2_SIZE(type);
+	sljit_s32 dst_reg;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_extend(compiler, type, freg, src, srcw));
+
+	ADJUST_LOCAL_OFFSET(src, srcw);
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size != 2 || elem2_size != 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (reg_size == 4)
+		freg = simd_get_quad_reg_index(freg);
+
+	if (src & SLJIT_MEM) {
+		FAIL_IF(sljit_emit_simd_mem_offset(compiler, &src, srcw));
+		if (reg_size == 4 && elem2_size - elem_size == 1)
+			FAIL_IF(push_inst32(compiler, VLD1 | (0x7 << 8) | VD4(freg) | RN4(src) | 0xf));
+		else
+			FAIL_IF(push_inst32(compiler, VLD1_s | (sljit_ins)((reg_size - elem2_size + elem_size) << 10) | VD4(freg) | RN4(src) | 0xf));
+		src = freg;
+	} else if (reg_size == 4)
+		src = simd_get_quad_reg_index(src);
+
+	if (!(type & SLJIT_SIMD_FLOAT)) {
+		dst_reg = (reg_size == 4) ? freg : TMP_FREG2;
+
+		do {
+			FAIL_IF(push_inst32(compiler, VSHLL | ((type & SLJIT_SIMD_EXTEND_SIGNED) ? 0 : (1 << 28))
+				| ((sljit_ins)1 << (19 + elem_size)) | VD4(dst_reg) | VM4(src)));
+			src = dst_reg;
+		} while (++elem_size < elem2_size);
+
+		if (dst_reg == TMP_FREG2)
+			return push_inst32(compiler, VORR | VD4(freg) | VN4(TMP_FREG2) | VM4(TMP_FREG2));
+		return SLJIT_SUCCESS;
+	}
+
+	/* No SIMD variant, must use VFP instead. */
+	SLJIT_ASSERT(reg_size == 4);
+
+	if (freg == src) {
+		freg += SLJIT_QUAD_OTHER_HALF(freg);
+		FAIL_IF(push_inst32(compiler, VCVT_F64_F32 | VD4(freg) | VM4(src) | 0x20));
+		freg += SLJIT_QUAD_OTHER_HALF(freg);
+		return push_inst32(compiler, VCVT_F64_F32 | VD4(freg) | VM4(src));
+	}
+
+	FAIL_IF(push_inst32(compiler, VCVT_F64_F32 | VD4(freg) | VM4(src)));
+	freg += SLJIT_QUAD_OTHER_HALF(freg);
+	return push_inst32(compiler, VCVT_F64_F32 | VD4(freg) | VM4(src) | 0x20);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 dst, sljit_sw dstw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins, imms;
+	sljit_s32 dst_r;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_sign(compiler, type, freg, dst, dstw));
+
+	ADJUST_LOCAL_OFFSET(dst, dstw);
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	switch (elem_size) {
+	case 0:
+		imms = 0x243219;
+		ins = VSHR | (1 << 28) | (0x9 << 16);
+		break;
+	case 1:
+		imms = (reg_size == 4) ? 0x243219 : 0x2231;
+		ins = VSHR | (1 << 28) | (0x11 << 16);
+		break;
+	case 2:
+		imms = (reg_size == 4) ? 0x2231 : 0x21;
+		ins = VSHR | (1 << 28) | (0x21 << 16);
+		break;
+	default:
+		imms = 0x21;
+		ins = VSHR | (1 << 28) | (0x1 << 16) | (1 << 7);
+		break;
+	}
+
+	if (reg_size == 4) {
+		freg = simd_get_quad_reg_index(freg);
+		ins |= (sljit_ins)1 << 6;
+	}
+
+	SLJIT_ASSERT((freg_map[TMP_FREG2] & 0x1) == 0);
+	FAIL_IF(push_inst32(compiler, ins | VD4(TMP_FREG2) | VM4(freg)));
+
+	if (reg_size == 4 && elem_size > 0)
+		FAIL_IF(push_inst32(compiler, VMOVN | ((sljit_ins)(elem_size - 1) << 18) | VD4(TMP_FREG2) | VM4(TMP_FREG2)));
+
+	ins = (reg_size == 4 && elem_size == 0) ? (1 << 6) : 0;
+
+	while (imms >= 0x100) {
+		FAIL_IF(push_inst32(compiler, VSRA | (1 << 28) | ins | ((imms & 0xff) << 16) | VD4(TMP_FREG2) | VM4(TMP_FREG2)));
+		imms >>= 8;
+	}
+
+	FAIL_IF(push_inst32(compiler, VSRA | (1 << 28) | ins | (1 << 7) | (imms << 16) | VD4(TMP_FREG2) | VM4(TMP_FREG2)));
+
+	dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
+	FAIL_IF(push_inst32(compiler, VMOV_s | (1 << 20) | (1 << 23) | (0x2 << 21) | RT4(dst_r) | VN4(TMP_FREG2)));
+
+	if (reg_size == 4 && elem_size == 0) {
+		SLJIT_ASSERT(freg_map[TMP_FREG2] + 1 == freg_map[TMP_FREG1]);
+		FAIL_IF(push_inst32(compiler, VMOV_s | (1 << 20) | (1 << 23) | (0x2 << 21) | RT4(TMP_REG2)| VN4(TMP_FREG1)));
+		FAIL_IF(push_inst32(compiler, ORR_W | RD4(dst_r) | RN4(dst_r) | RM4(TMP_REG2) | (0x2 << 12)));
+	}
+
+	if (dst_r == TMP_REG1)
+		return emit_op_mem(compiler, STORE | WORD_SIZE, TMP_REG1, dst, dstw, TMP_REG2);
+
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins = 0;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_op2(compiler, type, dst_freg, src1_freg, src2_freg));
+
+	if (reg_size != 3 && reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	switch (SLJIT_SIMD_GET_OPCODE(type)) {
+	case SLJIT_SIMD_OP2_AND:
+		ins = VAND;
+		break;
+	case SLJIT_SIMD_OP2_OR:
+		ins = VORR;
+		break;
+	case SLJIT_SIMD_OP2_XOR:
+		ins = VEOR;
+		break;
+	}
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (reg_size == 4) {
+		dst_freg = simd_get_quad_reg_index(dst_freg);
+		src1_freg = simd_get_quad_reg_index(src1_freg);
+		src2_freg = simd_get_quad_reg_index(src2_freg);
+		ins |= (sljit_ins)1 << 6;
+	}
+
+	return push_inst32(compiler, ins | VD4(dst_freg) | VN4(src1_freg) | VM4(src2_freg));
 }
 
 #undef FPU_LOAD
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst_reg,
+	sljit_s32 mem_reg)
+{
+	sljit_ins ins;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg));
+
+	switch (GET_OPCODE(op)) {
+	case SLJIT_MOV_U8:
+		ins = LDREXB;
+		break;
+	case SLJIT_MOV_U16:
+		ins = LDREXH;
+		break;
+	default:
+		ins = LDREX;
+		break;
+	}
+
+	return push_inst32(compiler, ins | RN4(mem_reg) | RT4(dst_reg));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 src_reg,
+	sljit_s32 mem_reg,
+	sljit_s32 temp_reg)
+{
+	sljit_ins ins;
+
+	/* temp_reg == mem_reg is undefined so use another temp register */
+	SLJIT_UNUSED_ARG(temp_reg);
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg));
+
+	switch (GET_OPCODE(op)) {
+	case SLJIT_MOV_U8:
+		ins = STREXB | RM4(TMP_REG1);
+		break;
+	case SLJIT_MOV_U16:
+		ins = STREXH | RM4(TMP_REG1);
+		break;
+	default:
+		ins = STREX | RD4(TMP_REG1);
+		break;
+	}
+
+	FAIL_IF(push_inst32(compiler, ins | RN4(mem_reg) | RT4(src_reg)));
+	if (op & SLJIT_SET_ATOMIC_STORED)
+		return push_inst32(compiler, CMPI_W | RN4(TMP_REG1));
+
+	return SLJIT_SUCCESS;
+}
+
 SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
 {
 	struct sljit_const *const_;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_32.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_32.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_32.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_32.c	2024-11-20 13:56:33.000000000 +0000
@@ -26,6 +26,49 @@
 
 /* mips 32-bit arch dependent functions. */
 
+static sljit_s32 emit_copysign(struct sljit_compiler *compiler, sljit_s32 op,
+		sljit_sw src1, sljit_sw src2, sljit_sw dst)
+{
+	int is_32 = (op & SLJIT_32);
+	sljit_ins mfhc = MFC1, mthc = MTC1;
+	sljit_ins src1_r = FS(src1), src2_r = FS(src2), dst_r = FS(dst);
+
+	if (!is_32) {
+		switch (cpu_feature_list & CPU_FEATURE_FR) {
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
+		case CPU_FEATURE_FR:
+			mfhc = MFHC1;
+			mthc = MTHC1;
+			break;
+#endif /* SLJIT_MIPS_REV >= 2 */
+		default:
+			src1_r |= (1 << 11);
+			src2_r |= (1 << 11);
+			dst_r |= (1 << 11);
+			break;
+		}
+	}
+
+	FAIL_IF(push_inst(compiler, mfhc | T(TMP_REG1) | src1_r, DR(TMP_REG1)));
+	FAIL_IF(push_inst(compiler, mfhc | T(TMP_REG2) | src2_r, DR(TMP_REG2)));
+	if (!is_32 && src1 != dst)
+		FAIL_IF(push_inst(compiler, MOV_fmt(FMT_S) | FS(src1) | FD(dst), MOVABLE_INS));
+#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1
+	else
+		FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
+#endif /* MIPS III */
+	FAIL_IF(push_inst(compiler, XOR | T(TMP_REG1) | D(TMP_REG2) | S(TMP_REG2), DR(TMP_REG2)));
+	FAIL_IF(push_inst(compiler, SRL | T(TMP_REG2) | D(TMP_REG2) | SH_IMM(31), DR(TMP_REG2)));
+	FAIL_IF(push_inst(compiler, SLL | T(TMP_REG2) | D(TMP_REG2) | SH_IMM(31), DR(TMP_REG2)));
+	FAIL_IF(push_inst(compiler, XOR | T(TMP_REG2) | D(TMP_REG1) | S(TMP_REG1), DR(TMP_REG1)));
+	FAIL_IF(push_inst(compiler, mthc | T(TMP_REG1) | dst_r, MOVABLE_INS));
+#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1
+	if (mthc == MTC1)
+		return push_inst(compiler, NOP, UNMOVABLE_INS);
+#endif /* MIPS III */
+	return SLJIT_SUCCESS;
+}
+
 static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm)
 {
 	if (!(imm & ~0xffff))
@@ -44,6 +87,108 @@ static SLJIT_INLINE sljit_s32 emit_const
 	return push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value), DR(dst));
 }
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f64 value)
+{
+	union {
+		struct {
+#if defined(SLJIT_LITTLE_ENDIAN) && SLJIT_LITTLE_ENDIAN
+			sljit_s32 lo;
+			sljit_s32 hi;
+#else /* !SLJIT_LITTLE_ENDIAN */
+			sljit_s32 hi;
+			sljit_s32 lo;
+#endif /* SLJIT_LITTLE_ENDIAN */
+		} bin;
+		sljit_f64 value;
+	} u;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fset64(compiler, freg, value));
+
+	u.value = value;
+
+	if (u.bin.lo != 0)
+		FAIL_IF(load_immediate(compiler, DR(TMP_REG1), u.bin.lo));
+	if (u.bin.hi != 0)
+		FAIL_IF(load_immediate(compiler, DR(TMP_REG2), u.bin.hi));
+
+	FAIL_IF(push_inst(compiler, MTC1 | (u.bin.lo != 0 ? T(TMP_REG1) : TA(0)) | FS(freg), MOVABLE_INS));
+	switch (cpu_feature_list & CPU_FEATURE_FR) {
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
+	case CPU_FEATURE_FR:
+		return push_inst(compiler, MTHC1 | (u.bin.hi != 0 ? T(TMP_REG2) : TA(0)) | FS(freg), MOVABLE_INS);
+#endif /* SLJIT_MIPS_REV >= 2 */
+	default:
+		FAIL_IF(push_inst(compiler, MTC1 | (u.bin.hi != 0 ? T(TMP_REG2) : TA(0)) | FS(freg) | (1 << 11), MOVABLE_INS));
+		break;
+	}
+#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1
+	FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
+#endif /* MIPS III */
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 freg, sljit_s32 reg)
+{
+	sljit_s32 reg2 = 0;
+	sljit_ins inst = FS(freg);
+	sljit_ins mthc = MTC1, mfhc = MFC1;
+	int is_32 = (op & SLJIT_32);
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg));
+
+	op = GET_OPCODE(op);
+	if (reg & REG_PAIR_MASK) {
+		reg2 = REG_PAIR_SECOND(reg);
+		reg = REG_PAIR_FIRST(reg);
+
+		inst |= T(reg2);
+
+		if (op == SLJIT_COPY_TO_F64)
+			FAIL_IF(push_inst(compiler, MTC1 | inst, MOVABLE_INS));
+		else
+			FAIL_IF(push_inst(compiler, MFC1 | inst, DR(reg2)));
+
+		inst = FS(freg) | (1 << 11);
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
+		if (cpu_feature_list & CPU_FEATURE_FR) {
+			mthc = MTHC1;
+			mfhc = MFHC1;
+			inst = FS(freg);
+		}
+#endif /* SLJIT_MIPS_REV >= 2 */
+	}
+
+	inst |= T(reg);
+	if (!is_32 && !reg2) {
+		switch (cpu_feature_list & CPU_FEATURE_FR) {
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
+		case CPU_FEATURE_FR:
+			mthc = MTHC1;
+			mfhc = MFHC1;
+			break;
+#endif /* SLJIT_MIPS_REV >= 2 */
+		default:
+			inst |= (1 << 11);
+			break;
+		}
+	}
+
+	if (op == SLJIT_COPY_TO_F64)
+		FAIL_IF(push_inst(compiler, mthc | inst, MOVABLE_INS));
+	else
+		FAIL_IF(push_inst(compiler, mfhc | inst, DR(reg)));
+
+#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1
+	if (mthc == MTC1 || mfhc == MFC1)
+		return push_inst(compiler, NOP, UNMOVABLE_INS);
+#endif /* MIPS III */
+	return SLJIT_SUCCESS;
+}
+
 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)
 {
 	sljit_ins *inst = (sljit_ins *)addr;
@@ -74,6 +219,11 @@ static sljit_s32 call_with_args(struct s
 	sljit_ins ins = NOP;
 	sljit_u8 offsets[4];
 	sljit_u8 *offsets_ptr = offsets;
+#if defined(SLJIT_LITTLE_ENDIAN) && SLJIT_LITTLE_ENDIAN
+	sljit_ins f64_hi = TA(7), f64_lo = TA(6);
+#else
+	sljit_ins f64_hi = TA(6), f64_lo = TA(7);
+#endif /* SLJIT_LITTLE_ENDIAN */
 
 	SLJIT_ASSERT(reg_map[TMP_REG1] == 4 && freg_map[TMP_FREG1] == 12);
 
@@ -138,20 +288,28 @@ static sljit_s32 call_with_args(struct s
 
 		switch (types & SLJIT_ARG_MASK) {
 		case SLJIT_ARG_TYPE_F64:
-			if (*offsets_ptr < 4 * sizeof (sljit_sw)) {
+			if (*offsets_ptr < 4 * sizeof(sljit_sw)) {
 				if (prev_ins != NOP)
 					FAIL_IF(push_inst(compiler, prev_ins, MOVABLE_INS));
 
 				/* Must be preceded by at least one other argument,
 				 * and its starting offset must be 8 because of alignment. */
 				SLJIT_ASSERT((*offsets_ptr >> 2) == 2);
-
-				prev_ins = MFC1 | TA(6) | FS(float_arg_count) | (1 << 11);
-				ins = MFC1 | TA(7) | FS(float_arg_count);
+				switch (cpu_feature_list & CPU_FEATURE_FR) {
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
+				case CPU_FEATURE_FR:
+					prev_ins = MFHC1 | f64_hi | FS(float_arg_count);
+					break;
+#endif /* SLJIT_MIPS_REV >= 2 */
+				default:
+					prev_ins = MFC1 | f64_hi | FS(float_arg_count) | (1 << 11);
+					break;
+				}
+				ins = MFC1 | f64_lo | FS(float_arg_count);
 			} else if (*offsets_ptr < 254)
 				ins = SDC1 | S(SLJIT_SP) | FT(float_arg_count) | IMM(*offsets_ptr);
 			else if (*offsets_ptr == 254)
-				ins = MOV_S | FMT_D | FS(SLJIT_FR0) | FD(TMP_FREG1);
+				ins = MOV_fmt(FMT_D) | FS(SLJIT_FR0) | FD(TMP_FREG1);
 
 			float_arg_count--;
 			break;
@@ -161,7 +319,7 @@ static sljit_s32 call_with_args(struct s
 			else if (*offsets_ptr < 254)
 				ins = SWC1 | S(SLJIT_SP) | FT(float_arg_count) | IMM(*offsets_ptr);
 			else if (*offsets_ptr == 254)
-				ins = MOV_S | FMT_S | FS(SLJIT_FR0) | FD(TMP_FREG1);
+				ins = MOV_fmt(FMT_S) | FS(SLJIT_FR0) | FD(TMP_FREG1);
 
 			float_arg_count--;
 			break;
@@ -285,7 +443,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	SLJIT_ASSERT(DR(PIC_ADDR_REG) == 25 && PIC_ADDR_REG == TMP_REG2);
 
-	if (src & SLJIT_IMM)
+	if (src == SLJIT_IMM)
 		FAIL_IF(load_immediate(compiler, DR(PIC_ADDR_REG), srcw));
 	else if (src != PIC_ADDR_REG)
 		FAIL_IF(push_inst(compiler, ADDU | S(src) | TA(0) | D(PIC_ADDR_REG), DR(PIC_ADDR_REG)));
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_64.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_64.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_64.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_64.c	2024-11-20 13:56:33.000000000 +0000
@@ -26,6 +26,23 @@
 
 /* mips 64-bit arch dependent functions. */
 
+static sljit_s32 emit_copysign(struct sljit_compiler *compiler, sljit_s32 op,
+		sljit_s32 src1, sljit_s32 src2, sljit_s32 dst)
+{
+	FAIL_IF(push_inst(compiler, SELECT_OP(DMFC1, MFC1) | T(TMP_REG1) | FS(src1), DR(TMP_REG1)));
+	FAIL_IF(push_inst(compiler, SELECT_OP(DMFC1, MFC1) | T(TMP_REG2) | FS(src2), DR(TMP_REG2)));
+	FAIL_IF(push_inst(compiler, XOR | S(TMP_REG2) | T(TMP_REG1) | D(TMP_REG2), DR(TMP_REG2)));
+	FAIL_IF(push_inst(compiler, SELECT_OP(DSRL32, SRL) | T(TMP_REG2) | D(TMP_REG2) | SH_IMM(31), DR(TMP_REG2)));
+	FAIL_IF(push_inst(compiler, SELECT_OP(DSLL32, SLL) | T(TMP_REG2) | D(TMP_REG2) | SH_IMM(31), DR(TMP_REG2)));
+	FAIL_IF(push_inst(compiler, XOR | S(TMP_REG1) | T(TMP_REG2) | D(TMP_REG1), DR(TMP_REG1)));
+	FAIL_IF(push_inst(compiler, SELECT_OP(DMTC1, MTC1) | T(TMP_REG1) | FS(dst), MOVABLE_INS));
+#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1
+	if (!(op & SLJIT_32))
+		return push_inst(compiler, NOP, UNMOVABLE_INS);
+#endif /* MIPS III */
+	return SLJIT_SUCCESS;
+}
+
 static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm)
 {
 	sljit_s32 shift = 32;
@@ -128,6 +145,57 @@ static SLJIT_INLINE sljit_s32 emit_const
 	return push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value), DR(dst));
 }
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f64 value)
+{
+	union {
+		sljit_sw imm;
+		sljit_f64 value;
+	} u;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fset64(compiler, freg, value));
+
+	u.value = value;
+
+	if (u.imm == 0) {
+		FAIL_IF(push_inst(compiler, DMTC1 | TA(0) | FS(freg), MOVABLE_INS));
+#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1
+		FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
+#endif /* MIPS III */
+		return SLJIT_SUCCESS;
+	}
+
+	FAIL_IF(load_immediate(compiler, DR(TMP_REG1), u.imm));
+	FAIL_IF(push_inst(compiler, DMTC1 | T(TMP_REG1) | FS(freg), MOVABLE_INS));
+#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1
+	FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
+#endif /* MIPS III */
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 freg, sljit_s32 reg)
+{
+	sljit_ins inst;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg));
+
+	inst = T(reg) | FS(freg);
+
+	if (GET_OPCODE(op) == SLJIT_COPY_TO_F64)
+		FAIL_IF(push_inst(compiler, SELECT_OP(DMTC1, MTC1) | inst, MOVABLE_INS));
+	else
+		FAIL_IF(push_inst(compiler, SELECT_OP(DMFC1, MFC1) | inst, DR(reg)));
+
+#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1
+	if (!(op & SLJIT_32))
+		return push_inst(compiler, NOP, UNMOVABLE_INS);
+#endif /* MIPS III */
+	return SLJIT_SUCCESS;
+}
+
 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)
 {
 	sljit_ins *inst = (sljit_ins *)addr;
@@ -183,17 +251,17 @@ static sljit_s32 call_with_args(struct s
 		switch (types & SLJIT_ARG_MASK) {
 		case SLJIT_ARG_TYPE_F64:
 			if (arg_count != float_arg_count)
-				ins = MOV_S | FMT_D | FS(float_arg_count) | FD(arg_count);
+				ins = MOV_fmt(FMT_D) | FS(float_arg_count) | FD(arg_count);
 			else if (arg_count == 1)
-				ins = MOV_S | FMT_D | FS(SLJIT_FR0) | FD(TMP_FREG1);
+				ins = MOV_fmt(FMT_D) | FS(SLJIT_FR0) | FD(TMP_FREG1);
 			arg_count--;
 			float_arg_count--;
 			break;
 		case SLJIT_ARG_TYPE_F32:
 			if (arg_count != float_arg_count)
-				ins = MOV_S | FMT_S | FS(float_arg_count) | FD(arg_count);
+				ins = MOV_fmt(FMT_S) | FS(float_arg_count) | FD(arg_count);
 			else if (arg_count == 1)
-				ins = MOV_S | FMT_S | FS(SLJIT_FR0) | FD(TMP_FREG1);
+				ins = MOV_fmt(FMT_S) | FS(SLJIT_FR0) | FD(TMP_FREG1);
 			arg_count--;
 			float_arg_count--;
 			break;
@@ -300,7 +368,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	SLJIT_ASSERT(DR(PIC_ADDR_REG) == 25 && PIC_ADDR_REG == TMP_REG2);
 
-	if (src & SLJIT_IMM)
+	if (src == SLJIT_IMM)
 		FAIL_IF(load_immediate(compiler, DR(PIC_ADDR_REG), srcw));
 	else if (src != PIC_ADDR_REG)
 		FAIL_IF(push_inst(compiler, DADDU | S(src) | TA(0) | D(PIC_ADDR_REG), DR(PIC_ADDR_REG)));
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_common.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_common.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_common.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeMIPS_common.c	2024-11-20 13:56:33.000000000 +0000
@@ -26,9 +26,12 @@
 
 /* Latest MIPS architecture. */
 
-#ifndef __mips_hard_float
+#ifdef HAVE_PRCTL
+#include <sys/prctl.h>
+#endif
+
+#if !defined(__mips_hard_float) || defined(__mips_single_float)
 /* Disable automatic detection, covers both -msoft-float and -mno-float */
-#undef SLJIT_IS_FPU_AVAILABLE
 #define SLJIT_IS_FPU_AVAILABLE 0
 #endif
 
@@ -42,6 +45,14 @@ SLJIT_API_FUNC_ATTRIBUTE const char* slj
 	return "MIPS64-R6" SLJIT_CPUINFO;
 #endif /* SLJIT_CONFIG_MIPS_32 */
 
+#elif (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 5)
+
+#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
+	return "MIPS32-R5" SLJIT_CPUINFO;
+#else /* !SLJIT_CONFIG_MIPS_32 */
+	return "MIPS64-R5" SLJIT_CPUINFO;
+#endif /* SLJIT_CONFIG_MIPS_32 */
+
 #elif (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2)
 
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
@@ -83,27 +94,31 @@ typedef sljit_u32 sljit_ins;
 #define EQUAL_FLAG	3
 #define OTHER_FLAG	1
 
+static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 7] = {
+	0, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 24, 23, 22, 21, 20, 19, 18, 17, 16, 29, 4, 25, 31, 3, 1
+};
+
 #define TMP_FREG1	(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)
 #define TMP_FREG2	(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2)
 #define TMP_FREG3	(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3)
 
-static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = {
-	0, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 24, 23, 22, 21, 20, 19, 18, 17, 16, 29, 4, 25, 31
-};
-
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
 
-static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = {
-	0, 0, 14, 2, 4, 6, 8, 18, 30, 28, 26, 24, 22, 20, 12, 10, 16
+static const sljit_u8 freg_map[((SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3) << 1) + 1] = {
+	0,
+	0, 14, 2, 4, 6, 8, 18, 30, 28, 26, 24, 22, 20,
+	12, 10, 16,
+	1, 15, 3, 5, 7, 9, 19, 31, 29, 27, 25, 23, 21,
+	13, 11, 17
 };
 
-#else
+#else /* !SLJIT_CONFIG_MIPS_32 */
 
 static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = {
 	0, 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 1, 2, 3, 4, 5, 6, 7, 8, 9, 31, 30, 29, 28, 27, 26, 25, 24, 12, 11, 10
 };
 
-#endif
+#endif /* SLJIT_CONFIG_MIPS_32 */
 
 /* --------------------------------------------------------------------- */
 /*  Instrucion forms                                                     */
@@ -200,10 +215,18 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define DMULTU		(HI(0) | LO(29))
 #endif /* SLJIT_MIPS_REV >= 6 */
 #define DIV_S		(HI(17) | FMT_S | LO(3))
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
 #define DINSU		(HI(31) | LO(6))
+#endif /* SLJIT_MIPS_REV >= 2 */
+#define DMFC1		(HI(17) | (1 << 21))
+#define DMTC1		(HI(17) | (5 << 21))
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
 #define DROTR		(HI(0) | (1 << 21) | LO(58))
 #define DROTR32		(HI(0) | (1 << 21) | LO(62))
 #define DROTRV		(HI(0) | (1 << 6) | LO(22))
+#define DSBH		(HI(31) | (2 << 6) | LO(36))
+#define DSHD		(HI(31) | (5 << 6) | LO(36))
+#endif /* SLJIT_MIPS_REV >= 2 */
 #define DSLL		(HI(0) | LO(56))
 #define DSLL32		(HI(0) | LO(60))
 #define DSLLV		(HI(0) | LO(20))
@@ -232,6 +255,9 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define LWR		(HI(38))
 #define LWC1		(HI(49))
 #define MFC1		(HI(17))
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
+#define MFHC1		(HI(17) | (3 << 21))
+#endif /* SLJIT_MIPS_REV >= 2 */
 #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
 #define MOD		(HI(0) | (3 << 6) | LO(26))
 #define MODU		(HI(0) | (3 << 6) | LO(27))
@@ -239,8 +265,10 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define MFHI		(HI(0) | LO(16))
 #define MFLO		(HI(0) | LO(18))
 #endif /* SLJIT_MIPS_REV >= 6 */
-#define MOV_S		(HI(17) | FMT_S | LO(6))
 #define MTC1		(HI(17) | (4 << 21))
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
+#define MTHC1		(HI(17) | (7 << 21))
+#endif /* SLJIT_MIPS_REV >= 2 */
 #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)
 #define MUH		(HI(0) | (3 << 6) | LO(24))
 #define MUHU		(HI(0) | (3 << 6) | LO(25))
@@ -256,8 +284,10 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define NOR		(HI(0) | LO(39))
 #define OR		(HI(0) | LO(37))
 #define ORI		(HI(13))
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
 #define ROTR		(HI(0) | (1 << 21) | LO(2))
 #define ROTRV		(HI(0) | (1 << 6) | LO(6))
+#endif /* SLJIT_MIPS_REV >= 2 */
 #define SD		(HI(63))
 #define SDL		(HI(44))
 #define SDR		(HI(45))
@@ -279,6 +309,9 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define SWR		(HI(46))
 #define SWC1		(HI(57))
 #define TRUNC_W_S	(HI(17) | FMT_S | LO(13))
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
+#define WSBH		(HI(31) | (2 << 6) | LO(32))
+#endif /* SLJIT_MIPS_REV >= 2 */
 #define XOR		(HI(0) | LO(38))
 #define XORI		(HI(14))
 
@@ -289,15 +322,21 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #else /* SLJIT_MIPS_REV < 6 */
 #define DCLZ		(HI(28) | LO(36))
 #define MOVF		(HI(0) | (0 << 16) | LO(1))
+#define MOVF_S		(HI(17) | FMT_S | (0 << 16) | LO(17))
 #define MOVN		(HI(0) | LO(11))
+#define MOVN_S		(HI(17) | FMT_S | LO(19))
 #define MOVT		(HI(0) | (1 << 16) | LO(1))
+#define MOVT_S		(HI(17) | FMT_S | (1 << 16) | LO(17))
 #define MOVZ		(HI(0) | LO(10))
+#define MOVZ_S		(HI(17) | FMT_S | LO(18))
 #define MUL		(HI(28) | LO(2))
 #endif /* SLJIT_MIPS_REV >= 6 */
 #define PREF		(HI(51))
 #define PREFX		(HI(19) | LO(15))
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
 #define SEB		(HI(31) | (16 << 6) | LO(32))
 #define SEH		(HI(31) | (24 << 6) | LO(32))
+#endif /* SLJIT_MIPS_REV >= 2 */
 #endif /* SLJIT_MIPS_REV >= 1 */
 
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
@@ -318,10 +357,107 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define LOAD_W		LD
 #endif
 
+#define MOV_fmt(f)	(HI(17) | f | LO(6))
+
 #define SIMM_MAX	(0x7fff)
 #define SIMM_MIN	(-0x8000)
 #define UIMM_MAX	(0xffff)
 
+#define CPU_FEATURE_DETECTED	(1 << 0)
+#define CPU_FEATURE_FPU		(1 << 1)
+#define CPU_FEATURE_FP64	(1 << 2)
+#define CPU_FEATURE_FR		(1 << 3)
+
+static sljit_u32 cpu_feature_list = 0;
+
+#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
+	&& (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+
+static sljit_s32 function_check_is_freg(struct sljit_compiler *compiler, sljit_s32 fr, sljit_s32 is_32)
+{
+	if (compiler->scratches == -1)
+		return 0;
+
+	if (is_32 && fr >= SLJIT_F64_SECOND(SLJIT_FR0))
+		fr -= SLJIT_F64_SECOND(0);
+
+	return (fr >= SLJIT_FR0 && fr < (SLJIT_FR0 + compiler->fscratches))
+		|| (fr > (SLJIT_FS0 - compiler->fsaveds) && fr <= SLJIT_FS0)
+		|| (fr >= SLJIT_TMP_FREGISTER_BASE && fr < (SLJIT_TMP_FREGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS));
+}
+
+#endif /* SLJIT_CONFIG_MIPS_32 && SLJIT_ARGUMENT_CHECKS */
+
+static void get_cpu_features(void)
+{
+#if !defined(SLJIT_IS_FPU_AVAILABLE) && defined(__GNUC__)
+	sljit_u32 fir = 0;
+#endif /* !SLJIT_IS_FPU_AVAILABLE && __GNUC__ */
+	sljit_u32 feature_list = CPU_FEATURE_DETECTED;
+
+#if defined(SLJIT_IS_FPU_AVAILABLE)
+#if SLJIT_IS_FPU_AVAILABLE
+	feature_list |= CPU_FEATURE_FPU;
+#if SLJIT_IS_FPU_AVAILABLE == 64
+	feature_list |= CPU_FEATURE_FP64;
+#endif /* SLJIT_IS_FPU_AVAILABLE == 64 */
+#endif /* SLJIT_IS_FPU_AVAILABLE */
+#elif defined(__GNUC__)
+	__asm__ ("cfc1 %0, $0" : "=r"(fir));
+	if ((fir & (0x3 << 16)) == (0x3 << 16))
+		feature_list |= CPU_FEATURE_FPU;
+
+#if (defined(SLJIT_CONFIG_MIPS_64) && SLJIT_CONFIG_MIPS_64) \
+	&& (!defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV < 2)
+	if ((feature_list & CPU_FEATURE_FPU))
+		feature_list |= CPU_FEATURE_FP64;
+#else /* SLJIT_CONFIG_MIPS32 || SLJIT_MIPS_REV >= 2 */
+	if ((fir & (1 << 22)))
+		feature_list |= CPU_FEATURE_FP64;
+#endif /* SLJIT_CONFIG_MIPS_64 && SLJIT_MIPS_REV < 2 */
+#endif /* SLJIT_IS_FPU_AVAILABLE */
+
+	if ((feature_list & CPU_FEATURE_FPU) && (feature_list & CPU_FEATURE_FP64)) {
+#if defined(SLJIT_CONFIG_MIPS_32) && SLJIT_CONFIG_MIPS_32
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 6
+		feature_list |= CPU_FEATURE_FR;
+#elif defined(SLJIT_DETECT_FR) && SLJIT_DETECT_FR == 0
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 5
+		feature_list |= CPU_FEATURE_FR;
+#endif /* SLJIT_MIPS_REV >= 5 */
+#else
+		sljit_s32 flag = -1;
+#ifndef FR_GET_FP_MODE
+		sljit_f64 zero = 0.0;
+#else /* PR_GET_FP_MODE */
+		flag = prctl(PR_GET_FP_MODE);
+
+		if (flag > 0)
+			feature_list |= CPU_FEATURE_FR;
+#endif /* FP_GET_PR_MODE */
+#if ((defined(SLJIT_DETECT_FR) && SLJIT_DETECT_FR == 2) \
+	|| (!defined(PR_GET_FP_MODE) && (!defined(SLJIT_DETECT_FR) || SLJIT_DETECT_FR >= 1))) \
+	&& (defined(__GNUC__) && (defined(__mips) && __mips >= 2))
+		if (flag < 0) {
+			__asm__ (".set oddspreg\n"
+				"lwc1 $f17, %0\n"
+				"ldc1 $f16, %1\n"
+				"swc1 $f17, %0\n"
+			: "+m" (flag) : "m" (zero) : "$f16", "$f17");
+			if (flag)
+				feature_list |= CPU_FEATURE_FR;
+		}
+#endif /* (!PR_GET_FP_MODE || (PR_GET_FP_MODE && SLJIT_DETECT_FR == 2)) && __GNUC__ */
+#endif /* SLJIT_MIPS_REV >= 6 */
+#else /* !SLJIT_CONFIG_MIPS_32 */
+		/* StatusFR=1 is the only mode supported by the code in MIPS64 */
+		feature_list |= CPU_FEATURE_FR;
+#endif /* SLJIT_CONFIG_MIPS_32 */
+	}
+
+	cpu_feature_list = feature_list;
+}
+
 /* dest_reg is the absolute name of the register
    Useful for reordering instructions in the delay slot. */
 static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit_s32 delay_slot)
@@ -715,21 +851,23 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
 {
-#if defined(__GNUC__) && !defined(SLJIT_IS_FPU_AVAILABLE)
-	sljit_sw fir = 0;
-#endif /* __GNUC__ && !SLJIT_IS_FPU_AVAILABLE */
-
 	switch (feature_type) {
+#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
+		&& (!defined(SLJIT_IS_FPU_AVAILABLE) || SLJIT_IS_FPU_AVAILABLE)
+	case SLJIT_HAS_F64_AS_F32_PAIR:
+		if (!cpu_feature_list)
+			get_cpu_features();
+
+		return (cpu_feature_list & CPU_FEATURE_FR) != 0;
+#endif /* SLJIT_CONFIG_MIPS_32 && SLJIT_IS_FPU_AVAILABLE */
 	case SLJIT_HAS_FPU:
-#ifdef SLJIT_IS_FPU_AVAILABLE
-		return SLJIT_IS_FPU_AVAILABLE;
-#elif defined(__GNUC__)
-		__asm__ ("cfc1 %0, $0" : "=r"(fir));
-		return (fir >> 22) & 0x1;
-#else
-#error "FIR check is not implemented for this architecture"
-#endif
+		if (!cpu_feature_list)
+			get_cpu_features();
+
+		return (cpu_feature_list & CPU_FEATURE_FPU) != 0;
 	case SLJIT_HAS_ZERO_REGISTER:
+	case SLJIT_HAS_COPY_F32:
+	case SLJIT_HAS_COPY_F64:
 		return 1;
 #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
 	case SLJIT_HAS_CLZ:
@@ -741,6 +879,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		return 2;
 #endif /* SLJIT_MIPS_REV >= 1 */
 #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2)
+	case SLJIT_HAS_REV:
 	case SLJIT_HAS_ROT:
 		return 1;
 #endif /* SLJIT_MIPS_REV >= 2 */
@@ -751,7 +890,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type)
 {
-	return (type >= SLJIT_ORDERED_EQUAL && type <= SLJIT_ORDERED_LESS_EQUAL);
+	SLJIT_UNUSED_ARG(type);
+	return 0;
 }
 
 /* --------------------------------------------------------------------- */
@@ -792,6 +932,12 @@ static sljit_s32 emit_op_mem(struct slji
 static sljit_s32 emit_stack_frame_release(struct sljit_compiler *compiler, sljit_s32 frame_size, sljit_ins *ins_ptr);
 
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
+#define SELECT_OP(a, b)	(b)
+#else
+#define SELECT_OP(a, b)	(!(op & SLJIT_32) ? a : b)
+#endif
+
+#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
 #include "sljitNativeMIPS_32.c"
 #else
 #include "sljitNativeMIPS_64.c"
@@ -815,12 +961,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	if (fsaveds > 0 || fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG) {
 		if ((local_size & SSIZE_OF(sw)) != 0)
 			local_size += SSIZE_OF(sw);
-		local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, sizeof(sljit_f64));
+		local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
 	}
 
 	local_size = (local_size + SLJIT_LOCALS_OFFSET + 15) & ~0xf;
 #else
-	local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, sizeof(sljit_f64));
+	local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
 	local_size = (local_size + SLJIT_LOCALS_OFFSET + 31) & ~0x1f;
 #endif
 	compiler->local_size = local_size;
@@ -918,10 +1064,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 			if (word_arg_count == 0 && float_arg_count <= 2) {
 				if (float_arg_count == 1)
-					FAIL_IF(push_inst(compiler, MOV_S | FMT_D | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS));
+					FAIL_IF(push_inst(compiler, MOV_fmt(FMT_D) | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS));
 			} else if (arg_count < 4) {
 				FAIL_IF(push_inst(compiler, MTC1 | TA(4 + arg_count) | FS(float_arg_count), MOVABLE_INS));
-				FAIL_IF(push_inst(compiler, MTC1 | TA(5 + arg_count) | FS(float_arg_count) | (1 << 11), MOVABLE_INS));
+				switch (cpu_feature_list & CPU_FEATURE_FR) {
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
+				case CPU_FEATURE_FR:
+					FAIL_IF(push_inst(compiler, MTHC1 | TA(5 + arg_count) | FS(float_arg_count), MOVABLE_INS));
+					break;
+#endif /* SLJIT_MIPS_REV >= 2 */
+				default:
+					FAIL_IF(push_inst(compiler, MTC1 | TA(5 + arg_count) | FS(float_arg_count) | (1 << 11), MOVABLE_INS));
+					break;
+				}
 			} else
 				FAIL_IF(push_inst(compiler, LDC1 | base | FT(float_arg_count) | IMM(local_size + (arg_count << 2)), MOVABLE_INS));
 			arg_count++;
@@ -931,7 +1086,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 			if (word_arg_count == 0 && float_arg_count <= 2) {
 				if (float_arg_count == 1)
-					FAIL_IF(push_inst(compiler, MOV_S | FMT_S | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS));
+					FAIL_IF(push_inst(compiler, MOV_fmt(FMT_S) | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS));
 			} else if (arg_count < 4)
 				FAIL_IF(push_inst(compiler, MTC1 | TA(4 + arg_count) | FS(float_arg_count), MOVABLE_INS));
 			else
@@ -966,16 +1121,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		case SLJIT_ARG_TYPE_F64:
 			float_arg_count++;
 			if (arg_count != float_arg_count)
-				FAIL_IF(push_inst(compiler, MOV_S | FMT_D | FS(arg_count) | FD(float_arg_count), MOVABLE_INS));
+				FAIL_IF(push_inst(compiler, MOV_fmt(FMT_D) | FS(arg_count) | FD(float_arg_count), MOVABLE_INS));
 			else if (arg_count == 1)
-				FAIL_IF(push_inst(compiler, MOV_S | FMT_D | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS));
+				FAIL_IF(push_inst(compiler, MOV_fmt(FMT_D) | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS));
 			break;
 		case SLJIT_ARG_TYPE_F32:
 			float_arg_count++;
 			if (arg_count != float_arg_count)
-				FAIL_IF(push_inst(compiler, MOV_S | FMT_S | FS(arg_count) | FD(float_arg_count), MOVABLE_INS));
+				FAIL_IF(push_inst(compiler, MOV_fmt(FMT_S) | FS(arg_count) | FD(float_arg_count), MOVABLE_INS));
 			else if (arg_count == 1)
-				FAIL_IF(push_inst(compiler, MOV_S | FMT_S | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS));
+				FAIL_IF(push_inst(compiler, MOV_fmt(FMT_S) | FS(TMP_FREG1) | FD(SLJIT_FR0), MOVABLE_INS));
 			break;
 		default:
 			word_arg_count++;
@@ -1011,12 +1166,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	if (fsaveds > 0 || fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG) {
 		if ((local_size & SSIZE_OF(sw)) != 0)
 			local_size += SSIZE_OF(sw);
-		local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, sizeof(sljit_f64));
+		local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
 	}
 
 	compiler->local_size = (local_size + SLJIT_LOCALS_OFFSET + 15) & ~0xf;
 #else
-	local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, sizeof(sljit_f64));
+	local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
 	compiler->local_size = (local_size + SLJIT_LOCALS_OFFSET + 31) & ~0x1f;
 #endif
 	return SLJIT_SUCCESS;
@@ -1042,10 +1197,10 @@ static sljit_s32 emit_stack_frame_releas
 	if (fsaveds > 0 || fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG) {
 		if ((tmp & SSIZE_OF(sw)) != 0)
 			tmp += SSIZE_OF(sw);
-		tmp += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, sizeof(sljit_f64));
+		tmp += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
 	}
 #else
-	tmp += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, sizeof(sljit_f64));
+	tmp += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
 #endif
 
 	if (local_size <= SIMM_MAX) {
@@ -1138,7 +1293,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	FAIL_IF(emit_stack_frame_release(compiler, 1, &ins));
 
-	if (!(src & SLJIT_IMM)) {
+	if (src != SLJIT_IMM) {
 		FAIL_IF(push_inst(compiler, JR | S(src), UNMOVABLE_INS));
 		return push_inst(compiler, ins, UNMOVABLE_INS);
 	}
@@ -1388,16 +1543,12 @@ static SLJIT_INLINE sljit_s32 emit_op_me
 
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
 
-#define SELECT_OP(a, b) (b)
-
 #define EMIT_SHIFT(dimm, dimm32, imm, dv, v) \
 	op_imm = (imm); \
 	op_v = (v);
 
 #else /* !SLJIT_CONFIG_MIPS_32 */
 
-#define SELECT_OP(a, b) \
-	(!(op & SLJIT_32) ? a : b)
 
 #define EMIT_SHIFT(dimm, dimm32, imm, dv, v) \
 	op_dimm = (dimm); \
@@ -1414,10 +1565,10 @@ static sljit_s32 emit_clz_ctz(struct slj
 {
 	sljit_s32 is_clz = (GET_OPCODE(op) == SLJIT_CLZ);
 #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
-	sljit_ins max = (op & SLJIT_32) ? 32 : 64;
-#else /* !SLJIT_CONFIG_RISCV_64 */
-	sljit_ins max = 32;
-#endif /* SLJIT_CONFIG_RISCV_64 */
+	sljit_ins word_size = (op & SLJIT_32) ? 32 : 64;
+#else /* !SLJIT_CONFIG_MIPS_64 */
+	sljit_ins word_size = 32;
+#endif /* SLJIT_CONFIG_MIPS_64 */
 
 	/* The TMP_REG2 is the next value. */
 	if (src != TMP_REG2)
@@ -1425,7 +1576,7 @@ static sljit_s32 emit_clz_ctz(struct slj
 
 	FAIL_IF(push_inst(compiler, BEQ | S(TMP_REG2) | TA(0) | IMM(is_clz ? 13 : 14), UNMOVABLE_INS));
 	/* The OTHER_FLAG is the counter. Delay slot. */
-	FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | TA(OTHER_FLAG) | IMM(max), OTHER_FLAG));
+	FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | TA(OTHER_FLAG) | IMM(word_size), OTHER_FLAG));
 
 	if (!is_clz) {
 		FAIL_IF(push_inst(compiler, ANDI | S(TMP_REG2) | T(TMP_REG1) | IMM(1), DR(TMP_REG1)));
@@ -1437,7 +1588,7 @@ static sljit_s32 emit_clz_ctz(struct slj
 	FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | TA(OTHER_FLAG) | IMM(0), OTHER_FLAG));
 
 	/* The TMP_REG1 is the next shift. */
-	FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | T(TMP_REG1) | IMM(max), DR(TMP_REG1)));
+	FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | T(TMP_REG1) | IMM(word_size), DR(TMP_REG1)));
 
 	FAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(TMP_REG2) | TA(0) | DA(EQUAL_FLAG), EQUAL_FLAG));
 	FAIL_IF(push_inst(compiler, SELECT_OP(DSRL, SRL) | T(TMP_REG1) | D(TMP_REG1) | SH_IMM(1), DR(TMP_REG1)));
@@ -1459,6 +1610,104 @@ static sljit_s32 emit_clz_ctz(struct slj
 
 #endif /* SLJIT_MIPS_REV < 1 */
 
+static sljit_s32 emit_rev(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw src)
+{
+#if defined(SLJIT_CONFIG_MIPS_64) && SLJIT_CONFIG_MIPS_64
+	int is_32 = (op & SLJIT_32);
+#endif /* SLJIT_CONFIG_MIPS_64 */
+
+	op = GET_OPCODE(op);
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
+#if defined(SLJIT_CONFIG_MIPS_64) && SLJIT_CONFIG_MIPS_64
+	if (!is_32 && (op == SLJIT_REV)) {
+		FAIL_IF(push_inst(compiler, DSBH | T(src) | D(dst), DR(dst)));
+		return push_inst(compiler, DSHD | T(dst) | D(dst), DR(dst));
+	}
+	if (op != SLJIT_REV && src != TMP_REG2) {
+		FAIL_IF(push_inst(compiler, SLL | T(src) | D(TMP_REG1), DR(TMP_REG1)));
+		src = TMP_REG1;
+	}
+#endif /* SLJIT_CONFIG_MIPS_64 */
+	FAIL_IF(push_inst(compiler, WSBH | T(src) | D(dst), DR(dst)));
+	FAIL_IF(push_inst(compiler, ROTR | T(dst) | D(dst) | SH_IMM(16), DR(dst)));
+#if defined(SLJIT_CONFIG_MIPS_64) && SLJIT_CONFIG_MIPS_64
+	if (op == SLJIT_REV_U32 && dst != TMP_REG2 && dst != TMP_REG3)
+		FAIL_IF(push_inst(compiler, DINSU | T(dst) | SA(0) | (31 << 11), DR(dst)));
+#endif /* SLJIT_CONFIG_MIPS_64 */
+#else /* SLJIT_MIPS_REV < 2 */
+#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
+	if (!is_32) {
+		FAIL_IF(push_inst(compiler, DSRL32 | T(src) | D(TMP_REG1) | SH_IMM(0), DR(TMP_REG1)));
+		FAIL_IF(push_inst(compiler, ORI | SA(0) | TA(OTHER_FLAG) | 0xffff, OTHER_FLAG));
+		FAIL_IF(push_inst(compiler, DSLL32 | T(src) | D(dst) | SH_IMM(0), DR(dst)));
+		FAIL_IF(push_inst(compiler, DSLL32 | TA(OTHER_FLAG) | DA(OTHER_FLAG) | SH_IMM(0), OTHER_FLAG));
+		FAIL_IF(push_inst(compiler, OR | S(dst) | T(TMP_REG1) | D(dst), DR(dst)));
+
+		FAIL_IF(push_inst(compiler, DSRL | T(dst) | D(TMP_REG1) | SH_IMM(16), DR(TMP_REG1)));
+		FAIL_IF(push_inst(compiler, ORI | SA(OTHER_FLAG) | TA(OTHER_FLAG) | 0xffff, OTHER_FLAG));
+		FAIL_IF(push_inst(compiler, AND | S(dst) | TA(OTHER_FLAG) | D(dst), DR(dst)));
+		FAIL_IF(push_inst(compiler, AND | S(TMP_REG1) | TA(OTHER_FLAG) | D(TMP_REG1), DR(TMP_REG1)));
+		FAIL_IF(push_inst(compiler, DSLL | TA(OTHER_FLAG) | DA(EQUAL_FLAG) | SH_IMM(8), EQUAL_FLAG));
+		FAIL_IF(push_inst(compiler, DSLL | T(dst) | D(dst) | SH_IMM(16), DR(dst)));
+		FAIL_IF(push_inst(compiler, XOR | SA(OTHER_FLAG) | TA(EQUAL_FLAG) | DA(OTHER_FLAG), OTHER_FLAG));
+		FAIL_IF(push_inst(compiler, OR | S(dst) | T(TMP_REG1) | D(dst), DR(dst)));
+
+		FAIL_IF(push_inst(compiler, DSRL | T(dst) | D(TMP_REG1) | SH_IMM(8), DR(TMP_REG1)));
+		FAIL_IF(push_inst(compiler, AND | S(dst) | TA(OTHER_FLAG) | D(dst), DR(dst)));
+		FAIL_IF(push_inst(compiler, AND | S(TMP_REG1) | TA(OTHER_FLAG) | D(TMP_REG1), DR(TMP_REG1)));
+		FAIL_IF(push_inst(compiler, DSLL | T(dst) | D(dst) | SH_IMM(8), DR(dst)));
+		return push_inst(compiler, OR | S(dst) | T(TMP_REG1) | D(dst), DR(dst));
+	}
+
+	if (op != SLJIT_REV && src != TMP_REG2) {
+		FAIL_IF(push_inst(compiler, SLL | T(src) | D(TMP_REG2) | SH_IMM(0), DR(TMP_REG2)));
+		src = TMP_REG2;
+	}
+#endif /* SLJIT_CONFIG_MIPS_64 */
+
+	FAIL_IF(push_inst(compiler, SRL | T(src) | D(TMP_REG1) | SH_IMM(16), DR(TMP_REG1)));
+	FAIL_IF(push_inst(compiler, LUI | TA(OTHER_FLAG) | 0xff, OTHER_FLAG));
+	FAIL_IF(push_inst(compiler, SLL | T(src) | D(dst) | SH_IMM(16), DR(dst)));
+	FAIL_IF(push_inst(compiler, ORI | SA(OTHER_FLAG) | TA(OTHER_FLAG) | 0xff, OTHER_FLAG));
+	FAIL_IF(push_inst(compiler, OR | S(dst) | T(TMP_REG1) | D(dst), DR(dst)));
+
+	FAIL_IF(push_inst(compiler, SRL | T(dst) | D(TMP_REG1) | SH_IMM(8), DR(TMP_REG1)));
+	FAIL_IF(push_inst(compiler, AND | S(dst) | TA(OTHER_FLAG) | D(dst), DR(dst)));
+	FAIL_IF(push_inst(compiler, AND | S(TMP_REG1) | TA(OTHER_FLAG) | D(TMP_REG1), DR(TMP_REG1)));
+	FAIL_IF(push_inst(compiler, SLL | T(dst) | D(dst) | SH_IMM(8), DR(dst)));
+	FAIL_IF(push_inst(compiler, OR | S(dst) | T(TMP_REG1) | D(dst), DR(dst)));
+
+#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
+	if (op == SLJIT_REV_U32 && dst != TMP_REG2 && dst != TMP_REG3) {
+		FAIL_IF(push_inst(compiler, DSLL32 | T(dst) | D(dst) | SH_IMM(0), DR(dst)));
+		FAIL_IF(push_inst(compiler, DSRL32 | T(dst) | D(dst) | SH_IMM(0), DR(dst)));
+	}
+#endif /* SLJIT_CONFIG_MIPS_64 */
+#endif /* SLJIT_MIPR_REV >= 2 */
+	return SLJIT_SUCCESS;
+}
+
+static sljit_s32 emit_rev16(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw src)
+{
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
+#if defined(SLJIT_CONFIG_MIPS_32) && SLJIT_CONFIG_MIPS_32
+	FAIL_IF(push_inst(compiler, WSBH | T(src) | D(dst), DR(dst)));
+#else /* !SLJIT_CONFIG_MIPS_32 */
+	FAIL_IF(push_inst(compiler, DSBH | T(src) | D(dst), DR(dst)));
+#endif /* SLJIT_CONFIG_MIPS_32 */
+	if (GET_OPCODE(op) == SLJIT_REV_U16)
+		return push_inst(compiler, ANDI | S(dst) | T(dst) | 0xffff, DR(dst));
+	else
+		return push_inst(compiler, SEH | T(dst) | D(dst), DR(dst));
+#else /* SLJIT_MIPS_REV < 2 */
+	FAIL_IF(push_inst(compiler, SELECT_OP(DSRL, SRL) | T(src) | D(TMP_REG1) | SH_IMM(8), DR(TMP_REG1)));
+	FAIL_IF(push_inst(compiler, SELECT_OP(DSLL32, SLL) | T(src) | D(dst) | SH_IMM(24), DR(dst)));
+	FAIL_IF(push_inst(compiler, ANDI | S(TMP_REG1) | T(TMP_REG1) | 0xff, DR(TMP_REG1)));
+	FAIL_IF(push_inst(compiler, (GET_OPCODE(op) == SLJIT_REV_U16 ? SELECT_OP(DSRL32, SRL) : SELECT_OP(DSRA32, SRA)) | T(dst) | D(dst) | SH_IMM(16), DR(dst)));
+	return push_inst(compiler, OR | S(dst) | T(TMP_REG1) | D(dst), DR(dst));
+#endif /* SLJIT_MIPS_REV >= 2 */
+}
+
 static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,
 	sljit_s32 dst, sljit_s32 src1, sljit_sw src2)
 {
@@ -1486,17 +1735,17 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
 		if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2)
 			return push_inst(compiler, SEB | T(src2) | D(dst), DR(dst));
-#else /* SLJIT_MIPS_REV < 1 */
+#else /* SLJIT_MIPS_REV < 2 */
 			FAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(24), DR(dst)));
 			return push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(24), DR(dst));
-#endif /* SLJIT_MIPS_REV >= 1 */
+#endif /* SLJIT_MIPS_REV >= 2 */
 #else /* !SLJIT_CONFIG_MIPS_32 */
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2)
 			if (op & SLJIT_32)
 				return push_inst(compiler, SEB | T(src2) | D(dst), DR(dst));
-#endif /* SLJIT_MIPS_REV >= 1 */
+#endif /* SLJIT_MIPS_REV >= 2 */
 			FAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(24), DR(dst)));
 			return push_inst(compiler, DSRA32 | T(dst) | D(dst) | SH_IMM(24), DR(dst));
 #endif /* SLJIT_CONFIG_MIPS_32 */
@@ -1515,17 +1764,17 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
 		if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2)
 			return push_inst(compiler, SEH | T(src2) | D(dst), DR(dst));
-#else /* SLJIT_MIPS_REV < 1 */
+#else /* SLJIT_MIPS_REV < 2 */
 			FAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(16), DR(dst)));
 			return push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(16), DR(dst));
-#endif /* SLJIT_MIPS_REV >= 1 */
+#endif /* SLJIT_MIPS_REV >= 2 */
 #else /* !SLJIT_CONFIG_MIPS_32 */
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
+#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2)
 			if (op & SLJIT_32)
 				return push_inst(compiler, SEH | T(src2) | D(dst), DR(dst));
-#endif /* SLJIT_MIPS_REV >= 1 */
+#endif /* SLJIT_MIPS_REV >= 2 */
 			FAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(16), DR(dst)));
 			return push_inst(compiler, DSRA32 | T(dst) | D(dst) | SH_IMM(16), DR(dst));
 #endif /* SLJIT_CONFIG_MIPS_32 */
@@ -1539,7 +1788,7 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
 #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2)
 			if (dst == src2)
-				return push_inst(compiler, DINSU | T(src2) | SA(0) | (31 << 11) | (0 << 11), DR(dst));
+				return push_inst(compiler, DINSU | T(src2) | SA(0) | (31 << 11), DR(dst));
 #endif /* SLJIT_MIPS_REV >= 2 */
 			FAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(0), DR(dst)));
 			return push_inst(compiler, DSRL32 | T(dst) | D(dst) | SH_IMM(0), DR(dst));
@@ -1556,14 +1805,6 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		return SLJIT_SUCCESS;
 #endif /* SLJIT_CONFIG_MIPS_64 */
 
-	case SLJIT_NOT:
-		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
-		if (op & SLJIT_SET_Z)
-			FAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));
-		if (!(flags & UNUSED_DEST))
-			FAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | D(dst), DR(dst)));
-		return SLJIT_SUCCESS;
-
 #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
 	case SLJIT_CLZ:
 		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
@@ -1591,10 +1832,21 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		return emit_clz_ctz(compiler, op, dst, src2);
 #endif /* SLJIT_MIPS_REV >= 1 */
 
+	case SLJIT_REV:
+	case SLJIT_REV_U32:
+	case SLJIT_REV_S32:
+		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM) && src2 != TMP_REG1 && dst != TMP_REG1);
+		return emit_rev(compiler, op, dst, src2);
+
+	case SLJIT_REV_U16:
+	case SLJIT_REV_S16:
+		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
+		return emit_rev16(compiler, op, dst, src2);
+
 	case SLJIT_ADD:
 		/* Overflow computation (both add and sub): overflow = src1_sign ^ src2_sign ^ result_sign ^ carry_flag */
 		is_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW;
-		carry_src_ar = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);
+		carry_src_ar = GET_FLAG_TYPE(op) == SLJIT_CARRY;
 
 		if (flags & SRC2_IMM) {
 			if (is_overflow) {
@@ -1650,7 +1902,7 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		return push_inst(compiler, XOR | S(TMP_REG1) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG);
 
 	case SLJIT_ADDC:
-		carry_src_ar = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);
+		carry_src_ar = GET_FLAG_TYPE(op) == SLJIT_CARRY;
 
 		if (flags & SRC2_IMM) {
 			FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | T(dst) | IMM(src2), DR(dst)));
@@ -1697,11 +1949,11 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		is_handled = 0;
 
 		if (flags & SRC2_IMM) {
-			if (GET_FLAG_TYPE(op) == SLJIT_LESS || GET_FLAG_TYPE(op) == SLJIT_GREATER_EQUAL) {
+			if (GET_FLAG_TYPE(op) == SLJIT_LESS) {
 				FAIL_IF(push_inst(compiler, SLTIU | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG));
 				is_handled = 1;
 			}
-			else if (GET_FLAG_TYPE(op) == SLJIT_SIG_LESS || GET_FLAG_TYPE(op) == SLJIT_SIG_GREATER_EQUAL) {
+			else if (GET_FLAG_TYPE(op) == SLJIT_SIG_LESS) {
 				FAIL_IF(push_inst(compiler, SLTI | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG));
 				is_handled = 1;
 			}
@@ -1718,19 +1970,15 @@ static SLJIT_INLINE sljit_s32 emit_singl
 
 			switch (GET_FLAG_TYPE(op)) {
 			case SLJIT_LESS:
-			case SLJIT_GREATER_EQUAL:
 				FAIL_IF(push_inst(compiler, SLTU | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG));
 				break;
 			case SLJIT_GREATER:
-			case SLJIT_LESS_EQUAL:
 				FAIL_IF(push_inst(compiler, SLTU | S(src2) | T(src1) | DA(OTHER_FLAG), OTHER_FLAG));
 				break;
 			case SLJIT_SIG_LESS:
-			case SLJIT_SIG_GREATER_EQUAL:
 				FAIL_IF(push_inst(compiler, SLT | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG));
 				break;
 			case SLJIT_SIG_GREATER:
-			case SLJIT_SIG_LESS_EQUAL:
 				FAIL_IF(push_inst(compiler, SLT | S(src2) | T(src1) | DA(OTHER_FLAG), OTHER_FLAG));
 				break;
 			}
@@ -1753,7 +2001,7 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		}
 
 		is_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW;
-		is_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);
+		is_carry = GET_FLAG_TYPE(op) == SLJIT_CARRY;
 
 		if (flags & SRC2_IMM) {
 			if (is_overflow) {
@@ -1802,7 +2050,7 @@ static SLJIT_INLINE sljit_s32 emit_singl
 			flags &= ~SRC2_IMM;
 		}
 
-		is_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);
+		is_carry = GET_FLAG_TYPE(op) == SLJIT_CARRY;
 
 		if (flags & SRC2_IMM) {
 			if (is_carry)
@@ -1868,6 +2116,14 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		return SLJIT_SUCCESS;
 
 	case SLJIT_XOR:
+		if (!(flags & LOGICAL_OP)) {
+			SLJIT_ASSERT((flags & SRC2_IMM) && src2 == -1);
+			if (op & SLJIT_SET_Z)
+				FAIL_IF(push_inst(compiler, NOR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG));
+			if (!(flags & UNUSED_DEST))
+				FAIL_IF(push_inst(compiler, NOR | S(src1) | T(src1) | D(dst), DR(dst)));
+			return SLJIT_SUCCESS;
+		}
 		EMIT_LOGICAL(XORI, XOR);
 		return SLJIT_SUCCESS;
 
@@ -2034,9 +2290,10 @@ static sljit_s32 emit_op(struct sljit_co
 		compiler->cache_argw = 0;
 	}
 
-	if (dst == TMP_REG2) {
+	if (dst == 0) {
 		SLJIT_ASSERT(HAS_FLAGS(op));
 		flags |= UNUSED_DEST;
+		dst = TMP_REG2;
 	}
 	else if (FAST_IS_REG(dst)) {
 		dst_r = dst;
@@ -2048,10 +2305,10 @@ static sljit_s32 emit_op(struct sljit_co
 		flags |= SLOW_DEST;
 
 	if (flags & IMM_OP) {
-		if ((src2 & SLJIT_IMM) && src2w != 0 && CHECK_IMM(flags, src2w)) {
+		if (src2 == SLJIT_IMM && src2w != 0 && CHECK_IMM(flags, src2w)) {
 			flags |= SRC2_IMM;
 			src2_r = src2w;
-		} else if ((flags & CUMULATIVE_OP) && (src1 & SLJIT_IMM) && src1w != 0 && CHECK_IMM(flags, src1w)) {
+		} else if ((flags & CUMULATIVE_OP) && src1 == SLJIT_IMM && src1w != 0 && CHECK_IMM(flags, src1w)) {
 			flags |= SRC2_IMM;
 			src2_r = src1w;
 
@@ -2068,7 +2325,7 @@ static sljit_s32 emit_op(struct sljit_co
 		src1_r = src1;
 		flags |= REG1_SOURCE;
 	}
-	else if (src1 & SLJIT_IMM) {
+	else if (src1 == SLJIT_IMM) {
 		if (src1w) {
 			FAIL_IF(load_immediate(compiler, DR(TMP_REG1), src1w));
 			src1_r = TMP_REG1;
@@ -2091,7 +2348,7 @@ static sljit_s32 emit_op(struct sljit_co
 		if ((flags & (REG_DEST | MOVE_OP)) == MOVE_OP)
 			dst_r = (sljit_s32)src2_r;
 	}
-	else if (src2 & SLJIT_IMM) {
+	else if (src2 == SLJIT_IMM) {
 		if (!(flags & SRC2_IMM)) {
 			if (src2w) {
 				FAIL_IF(load_immediate(compiler, DR(sugg_src2_r), src2w));
@@ -2279,31 +2536,37 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
 	case SLJIT_MOV_U32:
-		return emit_op(compiler, SLJIT_MOV_U32, INT_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u32)srcw : srcw);
+		return emit_op(compiler, SLJIT_MOV_U32, INT_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u32)srcw : srcw);
 
 	case SLJIT_MOV_S32:
 	case SLJIT_MOV32:
-		return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s32)srcw : srcw);
+		return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s32)srcw : srcw);
 #endif
 
 	case SLJIT_MOV_U8:
-		return emit_op(compiler, op, BYTE_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw);
+		return emit_op(compiler, op, BYTE_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u8)srcw : srcw);
 
 	case SLJIT_MOV_S8:
-		return emit_op(compiler, op, BYTE_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw);
+		return emit_op(compiler, op, BYTE_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s8)srcw : srcw);
 
 	case SLJIT_MOV_U16:
-		return emit_op(compiler, op, HALF_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw);
+		return emit_op(compiler, op, HALF_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u16)srcw : srcw);
 
 	case SLJIT_MOV_S16:
-		return emit_op(compiler, op, HALF_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw);
-
-	case SLJIT_NOT:
-		return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw);
+		return emit_op(compiler, op, HALF_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s16)srcw : srcw);
 
 	case SLJIT_CLZ:
 	case SLJIT_CTZ:
+	case SLJIT_REV:
 		return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw);
+
+	case SLJIT_REV_U16:
+	case SLJIT_REV_S16:
+		return emit_op(compiler, op, HALF_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
+
+	case SLJIT_REV_U32:
+	case SLJIT_REV_S32:
+		return emit_op(compiler, op | SLJIT_32, INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
 	}
 
 	SLJIT_UNREACHABLE();
@@ -2326,9 +2589,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
 	if (op & SLJIT_32) {
 		flags |= INT_DATA | SIGNED_DATA;
-		if (src1 & SLJIT_IMM)
+		if (src1 == SLJIT_IMM)
 			src1w = (sljit_s32)src1w;
-		if (src2 & SLJIT_IMM)
+		if (src2 == SLJIT_IMM)
 			src2w = (sljit_s32)src2w;
 	}
 #endif
@@ -2348,9 +2611,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		compiler->status_flags_state = 0;
 		return emit_op(compiler, op, flags | CUMULATIVE_OP, dst, dstw, src1, src1w, src2, src2w);
 
+	case SLJIT_XOR:
+		if ((src1 == SLJIT_IMM && src1w == -1) || (src2 == SLJIT_IMM && src2w == -1)) {
+			return emit_op(compiler, op, flags | CUMULATIVE_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w);
+		}
+		/* fallthrough */
 	case SLJIT_AND:
 	case SLJIT_OR:
-	case SLJIT_XOR:
 		return emit_op(compiler, op, flags | CUMULATIVE_OP | LOGICAL_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w);
 
 	case SLJIT_SHL:
@@ -2362,10 +2629,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	case SLJIT_ROTL:
 	case SLJIT_ROTR:
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
-		if (src2 & SLJIT_IMM)
+		if (src2 == SLJIT_IMM)
 			src2w &= 0x1f;
 #else
-		if (src2 & SLJIT_IMM) {
+		if (src2 == SLJIT_IMM) {
 			if (op & SLJIT_32)
 				src2w &= 0x1f;
 			else
@@ -2387,7 +2654,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	CHECK(check_sljit_emit_op2(compiler, op, 1, 0, 0, src1, src1w, src2, src2w));
 
 	SLJIT_SKIP_CHECKS(compiler);
-	return sljit_emit_op2(compiler, op, TMP_REG2, 0, src1, src1w, src2, src2w);
+	return sljit_emit_op2(compiler, op, 0, 0, src1, src1w, src2, src2w);
 }
 
 #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
@@ -2399,9 +2666,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #endif /* SLJIT_CONFIG_MIPS_64 */
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 src_dst,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w)
+	sljit_s32 dst_reg,
+	sljit_s32 src1_reg,
+	sljit_s32 src2_reg,
+	sljit_s32 src3, sljit_sw src3w)
 {
 	sljit_s32 is_left;
 	sljit_ins ins1, ins2, ins3;
@@ -2414,50 +2682,44 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #endif /* SLJIT_CONFIG_MIPS_64 */
 
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_shift_into(compiler, op, src_dst, src1, src1w, src2, src2w));
+	CHECK(check_sljit_emit_shift_into(compiler, op, dst_reg, src1_reg, src2_reg, src3, src3w));
 
 	is_left = (GET_OPCODE(op) == SLJIT_SHL || GET_OPCODE(op) == SLJIT_MSHL);
 
-	if (src_dst == src1) {
+	if (src1_reg == src2_reg) {
 		SLJIT_SKIP_CHECKS(compiler);
-		return sljit_emit_op2(compiler, (is_left ? SLJIT_ROTL : SLJIT_ROTR) | (op & SLJIT_32), src_dst, 0, src_dst, 0, src2, src2w);
+		return sljit_emit_op2(compiler, (is_left ? SLJIT_ROTL : SLJIT_ROTR) | (op & SLJIT_32), dst_reg, 0, src1_reg, 0, src3, src3w);
 	}
 
-	ADJUST_LOCAL_OFFSET(src1, src1w);
-	ADJUST_LOCAL_OFFSET(src2, src2w);
+	ADJUST_LOCAL_OFFSET(src3, src3w);
 
-	if (src2 & SLJIT_IMM) {
-		src2w &= bit_length - 1;
+	if (src3 == SLJIT_IMM) {
+		src3w &= bit_length - 1;
 
-		if (src2w == 0)
+		if (src3w == 0)
 			return SLJIT_SUCCESS;
-	} else if (src2 & SLJIT_MEM) {
-		FAIL_IF(emit_op_mem(compiler, inp_flags, DR(TMP_REG2), src2, src2w));
-		src2 = TMP_REG2;
-	}
-
-	if (src1 & SLJIT_MEM) {
-		FAIL_IF(emit_op_mem(compiler, inp_flags, DR(TMP_REG1), src1, src1w));
-		src1 = TMP_REG1;
-	} else if (src1 & SLJIT_IMM) {
-		FAIL_IF(load_immediate(compiler, DR(TMP_REG1), src1w));
-		src1 = TMP_REG1;
-	}
 
-	if (src2 & SLJIT_IMM) {
 		if (is_left) {
-			ins1 = SELECT_OP3(op, src2w, DSLL, DSLL32, SLL);
-			src2w = bit_length - src2w;
-			ins2 = SELECT_OP3(op, src2w, DSRL, DSRL32, SRL);
+			ins1 = SELECT_OP3(op, src3w, DSLL, DSLL32, SLL);
+			src3w = bit_length - src3w;
+			ins2 = SELECT_OP3(op, src3w, DSRL, DSRL32, SRL);
 		} else {
-			ins1 = SELECT_OP3(op, src2w, DSRL, DSRL32, SRL);
-			src2w = bit_length - src2w;
-			ins2 = SELECT_OP3(op, src2w, DSLL, DSLL32, SLL);
-		}
-
-		FAIL_IF(push_inst(compiler, ins1 | T(src_dst) | D(src_dst), DR(src_dst)));
-		FAIL_IF(push_inst(compiler, ins2 | T(src1) | D(TMP_REG1), DR(TMP_REG1)));
-		return push_inst(compiler, OR | S(src_dst) | T(TMP_REG1) | D(src_dst), DR(src_dst));
+			ins1 = SELECT_OP3(op, src3w, DSRL, DSRL32, SRL);
+			src3w = bit_length - src3w;
+			ins2 = SELECT_OP3(op, src3w, DSLL, DSLL32, SLL);
+		}
+
+		FAIL_IF(push_inst(compiler, ins1 | T(src1_reg) | D(dst_reg), DR(dst_reg)));
+		FAIL_IF(push_inst(compiler, ins2 | T(src2_reg) | D(TMP_REG1), DR(TMP_REG1)));
+		return push_inst(compiler, OR | S(dst_reg) | T(TMP_REG1) | D(dst_reg), DR(dst_reg));
+	}
+
+	if (src3 & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem(compiler, inp_flags, DR(TMP_REG2), src3, src3w));
+		src3 = TMP_REG2;
+	} else if (dst_reg == src3) {
+		FAIL_IF(push_inst(compiler, SELECT_OP2(op, DADDU, ADDU) | S(src3) | TA(0) | D(TMP_REG2), DR(TMP_REG2)));
+		src3 = TMP_REG2;
 	}
 
 	if (is_left) {
@@ -2470,17 +2732,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		ins3 = SELECT_OP2(op, DSLLV, SLLV);
 	}
 
-	FAIL_IF(push_inst(compiler, ins2 | S(src2) | T(src_dst) | D(src_dst), DR(src_dst)));
+	FAIL_IF(push_inst(compiler, ins2 | S(src3) | T(src1_reg) | D(dst_reg), DR(dst_reg)));
 
 	if (!(op & SLJIT_SHIFT_INTO_NON_ZERO)) {
-		FAIL_IF(push_inst(compiler, ins1 | T(src1) | D(TMP_REG1) | (1 << 6), DR(TMP_REG1)));
-		FAIL_IF(push_inst(compiler, XORI | S(src2) | T(TMP_REG2) | ((sljit_ins)bit_length - 1), DR(TMP_REG2)));
-		src1 = TMP_REG1;
+		FAIL_IF(push_inst(compiler, ins1 | T(src2_reg) | D(TMP_REG1) | (1 << 6), DR(TMP_REG1)));
+		FAIL_IF(push_inst(compiler, XORI | S(src3) | T(TMP_REG2) | ((sljit_ins)bit_length - 1), DR(TMP_REG2)));
+		src2_reg = TMP_REG1;
 	} else
-		FAIL_IF(push_inst(compiler, SELECT_OP2(op, DSUBU, SUBU) | SA(0) | T(src2) | D(TMP_REG2), DR(TMP_REG2)));
+		FAIL_IF(push_inst(compiler, SELECT_OP2(op, DSUBU, SUBU) | SA(0) | T(src3) | D(TMP_REG2), DR(TMP_REG2)));
 
-	FAIL_IF(push_inst(compiler, ins3 | S(TMP_REG2) | T(src1) | D(TMP_REG1), DR(TMP_REG1)));
-	return push_inst(compiler, OR | S(src_dst) | T(TMP_REG1) | D(src_dst), DR(src_dst));
+	FAIL_IF(push_inst(compiler, ins3 | S(TMP_REG2) | T(src2_reg) | D(TMP_REG1), DR(TMP_REG1)));
+	return push_inst(compiler, OR | S(dst_reg) | T(TMP_REG1) | D(dst_reg), DR(dst_reg));
 }
 
 #undef SELECT_OP3
@@ -2518,21 +2780,54 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw)
 {
-	CHECK_REG_INDEX(check_sljit_get_register_index(reg));
-	return reg_map[reg];
+	sljit_s32 dst_ar = RETURN_ADDR_REG;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_op_dst(compiler, op, dst, dstw));
+	ADJUST_LOCAL_OFFSET(dst, dstw);
+
+	switch (op) {
+	case SLJIT_FAST_ENTER:
+		if (FAST_IS_REG(dst))
+			return push_inst(compiler, ADDU_W | SA(RETURN_ADDR_REG) | TA(0) | D(dst), UNMOVABLE_INS);
+		break;
+	case SLJIT_GET_RETURN_ADDRESS:
+		dst_ar = DR(FAST_IS_REG(dst) ? dst : TMP_REG2);
+		FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, dst_ar, SLJIT_MEM1(SLJIT_SP), compiler->local_size - SSIZE_OF(sw)));
+		break;
+	}
+
+	if (dst & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem(compiler, WORD_DATA, dst_ar, dst, dstw));
+
+		if (op == SLJIT_FAST_ENTER)
+			compiler->delay_slot = UNMOVABLE_INS;
+	}
+
+	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg)
 {
-	CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
+	CHECK_REG_INDEX(check_sljit_get_register_index(type, reg));
+
+	if (type == SLJIT_GP_REGISTER)
+		return reg_map[reg];
+
+	if (type != SLJIT_FLOAT_REGISTER)
+		return -1;
+
 	return FR(reg);
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
 	void *instruction, sljit_u32 size)
 {
+	SLJIT_UNUSED_ARG(size);
+
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
 
@@ -2544,14 +2839,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 /* --------------------------------------------------------------------- */
 
 #define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_32) >> 7))
-#define FMT(op) ((((sljit_ins)op & SLJIT_32) ^ SLJIT_32) << (21 - 8))
+#define FMT(op) (FMT_S | (~(sljit_ins)op & SLJIT_32) << (21 - (5 + 3)))
 
 static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 src, sljit_sw srcw)
 {
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
-#	define flags (sljit_u32)0
+	sljit_u32 flags = 0;
 #else
 	sljit_u32 flags = ((sljit_u32)(GET_OPCODE(op) == SLJIT_CONV_SW_FROM_F64)) << 21;
 #endif
@@ -2565,18 +2860,13 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 
 	if (FAST_IS_REG(dst)) {
 		FAIL_IF(push_inst(compiler, MFC1 | flags | T(dst) | FS(TMP_FREG1), MOVABLE_INS));
-#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3)
+#if !defined(SLJIT_MIPS_REV) || (SLJIT_CONFIG_MIPS_32 && SLJIT_MIPS_REV <= 1)
 		FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
-#endif
+#endif /* MIPS III */
 		return SLJIT_SUCCESS;
 	}
 
-	/* Store the integer value from a VFP register. */
 	return emit_op_mem2(compiler, flags ? DOUBLE_DATA : SINGLE_DATA, FR(TMP_FREG1), dst, dstw, 0, 0);
-
-#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
-#	undef flags
-#endif
 }
 
 static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
@@ -2584,43 +2874,158 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 	sljit_s32 src, sljit_sw srcw)
 {
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
-#	define flags (sljit_u32)0
+	sljit_u32 flags = 0;
 #else
 	sljit_u32 flags = ((sljit_u32)(GET_OPCODE(op) == SLJIT_CONV_F64_FROM_SW)) << 21;
 #endif
-
 	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
 
-	if (FAST_IS_REG(src)) {
-		FAIL_IF(push_inst(compiler, MTC1 | flags | T(src) | FS(TMP_FREG1), MOVABLE_INS));
-#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3)
-		FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
-#endif
-	} else if (src & SLJIT_MEM) {
-		/* Load the integer value into a VFP register. */
+	if (src & SLJIT_MEM)
 		FAIL_IF(emit_op_mem2(compiler, (flags ? DOUBLE_DATA : SINGLE_DATA) | LOAD_DATA, FR(TMP_FREG1), src, srcw, dst, dstw));
-	}
 	else {
+		if (src == SLJIT_IMM) {
 #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
-		if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)
-			srcw = (sljit_s32)srcw;
+			if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)
+				srcw = (sljit_s32)srcw;
 #endif
-		FAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw));
-		FAIL_IF(push_inst(compiler, MTC1 | flags | T(TMP_REG1) | FS(TMP_FREG1), MOVABLE_INS));
-#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3)
+			FAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw));
+			src = TMP_REG1;
+		}
+
+		FAIL_IF(push_inst(compiler, MTC1 | flags | T(src) | FS(TMP_FREG1), MOVABLE_INS));
+#if !defined(SLJIT_MIPS_REV) || (SLJIT_CONFIG_MIPS_32 && SLJIT_MIPS_REV <= 1)
 		FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
-#endif
+#endif /* MIPS III */
 	}
 
-	FAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | ((((sljit_ins)op & SLJIT_32) ^ SLJIT_32) >> 8) | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS));
+	FAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | ((~(sljit_ins)op & SLJIT_32) >> 8) | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS));
 
 	if (dst & SLJIT_MEM)
 		return emit_op_mem2(compiler, FLOAT_DATA(op), FR(TMP_FREG1), dst, dstw, 0, 0);
 	return SLJIT_SUCCESS;
+}
 
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
-#	undef flags
+	sljit_u32 flags = 0;
+#else
+	sljit_u32 flags = 1 << 21;
+#endif
+	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
+
+	if (src & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem2(compiler, (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_UW ? WORD_DATA : INT_DATA) | LOAD_DATA, DR(TMP_REG1), src, srcw, dst, dstw));
+		src = TMP_REG1;
+	} else if (src == SLJIT_IMM) {
+#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
+		if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_U32)
+			srcw = (sljit_u32)srcw;
 #endif
+		FAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw));
+		src = TMP_REG1;
+	}
+
+#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
+	if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_U32) {
+		if (src != TMP_REG1) {
+			FAIL_IF(push_inst(compiler, DSLL32 | T(src) | D(TMP_REG1) | SH_IMM(0), DR(TMP_REG1)));
+			FAIL_IF(push_inst(compiler, DSRL32 | T(TMP_REG1) | D(TMP_REG1) | SH_IMM(0), DR(TMP_REG1)));
+		}
+
+		FAIL_IF(push_inst(compiler, MTC1 | flags | T(TMP_REG1) | FS(TMP_FREG1), MOVABLE_INS));
+#if !defined(SLJIT_MIPS_REV)
+		FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
+#endif /* MIPS III */
+
+		FAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | ((~(sljit_ins)op & SLJIT_32) >> 8) | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS));
+
+		if (dst & SLJIT_MEM)
+			return emit_op_mem2(compiler, FLOAT_DATA(op), FR(TMP_FREG1), dst, dstw, 0, 0);
+		return SLJIT_SUCCESS;
+	}
+#else /* !SLJIT_CONFIG_MIPS_64 */
+	if (!(op & SLJIT_32)) {
+		FAIL_IF(push_inst(compiler, SLL | T(src) | D(TMP_REG2) | SH_IMM(1), DR(TMP_REG2)));
+		FAIL_IF(push_inst(compiler, SRL | T(TMP_REG2) | D(TMP_REG2) | SH_IMM(1), DR(TMP_REG2)));
+
+		FAIL_IF(push_inst(compiler, MTC1 | flags | T(TMP_REG2) | FS(TMP_FREG1), MOVABLE_INS));
+#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1
+		FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
+#endif /* MIPS III */
+
+		FAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | 1 | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS));
+
+#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 1)
+		FAIL_IF(push_inst(compiler, BGEZ | S(src) | 5, UNMOVABLE_INS));
+#else /* SLJIT_MIPS_REV >= 1 */
+		FAIL_IF(push_inst(compiler, BGEZ | S(src) | 4, UNMOVABLE_INS));
+#endif  /* SLJIT_MIPS_REV < 1 */
+
+		FAIL_IF(push_inst(compiler, LUI | T(TMP_REG2) | IMM(0x41e0), UNMOVABLE_INS));
+		FAIL_IF(push_inst(compiler, MTC1 | TA(0) | FS(TMP_FREG2), UNMOVABLE_INS));
+		switch (cpu_feature_list & CPU_FEATURE_FR) {
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
+		case CPU_FEATURE_FR:
+			FAIL_IF(push_inst(compiler, MTHC1 | T(TMP_REG2) | FS(TMP_FREG2), UNMOVABLE_INS));
+			break;
+#endif /* SLJIT_MIPS_REV >= 2 */
+		default:
+			FAIL_IF(push_inst(compiler, MTC1 | T(TMP_REG2) | FS(TMP_FREG2) | (1 << 11), UNMOVABLE_INS));
+#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1
+			FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
+#endif /* MIPS III */
+			break;
+		}
+		FAIL_IF(push_inst(compiler, ADD_S | FMT(op) | FT(TMP_FREG2) | FS(dst_r) | FD(dst_r), UNMOVABLE_INS));
+
+		if (dst & SLJIT_MEM)
+			return emit_op_mem2(compiler, FLOAT_DATA(op), FR(TMP_FREG1), dst, dstw, 0, 0);
+		return SLJIT_SUCCESS;
+	}
+#endif /* SLJIT_CONFIG_MIPS_64 */
+
+#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 1)
+	FAIL_IF(push_inst(compiler, BLTZ | S(src) | 5, UNMOVABLE_INS));
+#else /* SLJIT_MIPS_REV >= 1 */
+	FAIL_IF(push_inst(compiler, BLTZ | S(src) | 4, UNMOVABLE_INS));
+#endif  /* SLJIT_MIPS_REV < 1 */
+	FAIL_IF(push_inst(compiler, ANDI | S(src) | T(TMP_REG2) | IMM(1), DR(TMP_REG2)));
+
+	FAIL_IF(push_inst(compiler, MTC1 | flags | T(src) | FS(TMP_FREG1), MOVABLE_INS));
+#if !defined(SLJIT_MIPS_REV)
+	FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
+#endif /* !SLJIT_MIPS_REV */
+
+	FAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | ((~(sljit_ins)op & SLJIT_32) >> 8) | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS));
+
+#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 1)
+	FAIL_IF(push_inst(compiler, BEQ | 6, UNMOVABLE_INS));
+#else /* SLJIT_MIPS_REV >= 1 */
+	FAIL_IF(push_inst(compiler, BEQ | 5, UNMOVABLE_INS));
+#endif  /* SLJIT_MIPS_REV < 1 */
+
+#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
+	FAIL_IF(push_inst(compiler, DSRL | T(src) | D(TMP_REG1) | SH_IMM(1), DR(TMP_REG1)));
+#else /* !SLJIT_CONFIG_MIPS_64 */
+	FAIL_IF(push_inst(compiler, SRL | T(src) | D(TMP_REG1) | SH_IMM(1), DR(TMP_REG1)));
+#endif /* SLJIT_CONFIG_MIPS_64 */
+
+	FAIL_IF(push_inst(compiler, OR | S(TMP_REG1) | T(TMP_REG2) | D(TMP_REG1), DR(TMP_REG1)));
+
+	FAIL_IF(push_inst(compiler, MTC1 | flags | T(TMP_REG1) | FS(TMP_FREG1), MOVABLE_INS));
+#if !defined(SLJIT_MIPS_REV)
+	FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
+#endif /* !SLJIT_MIPS_REV */
+
+	FAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | ((~(sljit_ins)op & SLJIT_32) >> 8) | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS));
+	FAIL_IF(push_inst(compiler, ADD_S | FMT(op) | FT(dst_r) | FS(dst_r) | FD(dst_r), UNMOVABLE_INS));
+
+	if (dst & SLJIT_MEM)
+		return emit_op_mem2(compiler, FLOAT_DATA(op), FR(TMP_FREG1), dst, dstw, 0, 0);
+	return SLJIT_SUCCESS;
 }
 
 static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,
@@ -2642,36 +3047,30 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 	switch (GET_FLAG_TYPE(op)) {
 	case SLJIT_F_EQUAL:
 	case SLJIT_ORDERED_EQUAL:
-	case SLJIT_UNORDERED_OR_NOT_EQUAL:
 		inst = C_EQ_S;
 		break;
 	case SLJIT_F_NOT_EQUAL:
 	case SLJIT_UNORDERED_OR_EQUAL:
-	case SLJIT_ORDERED_NOT_EQUAL:
 		inst = C_UEQ_S;
 		break;
 	case SLJIT_F_LESS:
 	case SLJIT_ORDERED_LESS:
-	case SLJIT_UNORDERED_OR_GREATER_EQUAL:
 		inst = C_OLT_S;
 		break;
 	case SLJIT_F_GREATER_EQUAL:
 	case SLJIT_UNORDERED_OR_LESS:
-	case SLJIT_ORDERED_GREATER_EQUAL:
 		inst = C_ULT_S;
 		break;
 	case SLJIT_F_GREATER:
 	case SLJIT_ORDERED_GREATER:
-	case SLJIT_UNORDERED_OR_LESS_EQUAL:
 		inst = C_ULE_S;
 		break;
 	case SLJIT_F_LESS_EQUAL:
 	case SLJIT_UNORDERED_OR_GREATER:
-	case SLJIT_ORDERED_LESS_EQUAL:
 		inst = C_OLE_S;
 		break;
 	default:
-		SLJIT_ASSERT(GET_FLAG_TYPE(op) == SLJIT_UNORDERED || GET_FLAG_TYPE(op) == SLJIT_ORDERED);
+		SLJIT_ASSERT(GET_FLAG_TYPE(op) == SLJIT_UNORDERED);
 		inst = C_UN_S;
 		break;
 	}
@@ -2705,7 +3104,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	case SLJIT_MOV_F64:
 		if (src != dst_r) {
 			if (dst_r != TMP_FREG1)
-				FAIL_IF(push_inst(compiler, MOV_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS));
+				FAIL_IF(push_inst(compiler, MOV_fmt(FMT(op)) | FS(src) | FD(dst_r), MOVABLE_INS));
 			else
 				dst_r = src;
 		}
@@ -2786,18 +3185,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	case SLJIT_ADD_F64:
 		FAIL_IF(push_inst(compiler, ADD_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));
 		break;
-
 	case SLJIT_SUB_F64:
 		FAIL_IF(push_inst(compiler, SUB_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));
 		break;
-
 	case SLJIT_MUL_F64:
 		FAIL_IF(push_inst(compiler, MUL_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));
 		break;
-
 	case SLJIT_DIV_F64:
 		FAIL_IF(push_inst(compiler, DIV_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));
 		break;
+	case SLJIT_COPYSIGN_F64:
+		return emit_copysign(compiler, op, src1, src2, dst_r);
 	}
 
 	if (dst_r == TMP_FREG2)
@@ -2806,26 +3204,24 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
-#undef FLOAT_DATA
-#undef FMT
-
-/* --------------------------------------------------------------------- */
-/*  Other instructions                                                   */
-/* --------------------------------------------------------------------- */
-
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f32 value)
 {
+	union {
+		sljit_s32 imm;
+		sljit_f32 value;
+	} u;
+
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
-	ADJUST_LOCAL_OFFSET(dst, dstw);
+	CHECK(check_sljit_emit_fset32(compiler, freg, value));
 
-	if (FAST_IS_REG(dst))
-		return push_inst(compiler, ADDU_W | SA(RETURN_ADDR_REG) | TA(0) | D(dst), UNMOVABLE_INS);
+	u.value = value;
 
-	/* Memory. */
-	FAIL_IF(emit_op_mem(compiler, WORD_DATA, RETURN_ADDR_REG, dst, dstw));
-	compiler->delay_slot = UNMOVABLE_INS;
-	return SLJIT_SUCCESS;
+	if (u.imm == 0)
+		return push_inst(compiler, MTC1 | TA(0) | FS(freg), MOVABLE_INS);
+
+	FAIL_IF(load_immediate(compiler, DR(TMP_REG1), u.imm));
+	return push_inst(compiler, MTC1 | T(TMP_REG1) | FS(freg), MOVABLE_INS);
 }
 
 /* --------------------------------------------------------------------- */
@@ -2984,7 +3380,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 }
 
 #define RESOLVE_IMM1() \
-	if (src1 & SLJIT_IMM) { \
+	if (src1 == SLJIT_IMM) { \
 		if (src1w) { \
 			PTR_FAIL_IF(load_immediate(compiler, DR(TMP_REG1), src1w)); \
 			src1 = TMP_REG1; \
@@ -2994,7 +3390,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 	}
 
 #define RESOLVE_IMM2() \
-	if (src2 & SLJIT_IMM) { \
+	if (src2 == SLJIT_IMM) { \
 		if (src2w) { \
 			PTR_FAIL_IF(load_immediate(compiler, DR(TMP_REG2), src2w)); \
 			src2 = TMP_REG2; \
@@ -3046,10 +3442,9 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 		if (compiler->delay_slot == MOVABLE_INS || (compiler->delay_slot != UNMOVABLE_INS && compiler->delay_slot != DR(src1) && compiler->delay_slot != DR(src2)))
 			jump->flags |= IS_MOVABLE;
 		PTR_FAIL_IF(push_inst(compiler, (type == SLJIT_EQUAL ? BNE : BEQ) | S(src1) | T(src2) | BRANCH_LENGTH, UNMOVABLE_INS));
-	}
-	else if (type >= SLJIT_SIG_LESS && (((src1 & SLJIT_IMM) && (src1w == 0)) || ((src2 & SLJIT_IMM) && (src2w == 0)))) {
+	} else if (type >= SLJIT_SIG_LESS && ((src1 == SLJIT_IMM && src1w == 0) || (src2 == SLJIT_IMM && src2w == 0))) {
 		inst = NOP;
-		if ((src1 & SLJIT_IMM) && (src1w == 0)) {
+		if (src1 == SLJIT_IMM && src1w == 0) {
 			RESOLVE_IMM2();
 			switch (type) {
 			case SLJIT_SIG_LESS:
@@ -3097,7 +3492,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 	else {
 		if (type == SLJIT_LESS || type == SLJIT_GREATER_EQUAL || type == SLJIT_SIG_LESS || type == SLJIT_SIG_GREATER_EQUAL) {
 			RESOLVE_IMM1();
-			if ((src2 & SLJIT_IMM) && src2w <= SIMM_MAX && src2w >= SIMM_MIN)
+			if (src2 == SLJIT_IMM && src2w <= SIMM_MAX && src2w >= SIMM_MIN)
 				PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTIU : SLTI) | S(src1) | T(TMP_REG1) | IMM(src2w), DR(TMP_REG1)));
 			else {
 				RESOLVE_IMM2();
@@ -3107,7 +3502,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 		}
 		else {
 			RESOLVE_IMM2();
-			if ((src1 & SLJIT_IMM) && src1w <= SIMM_MAX && src1w >= SIMM_MIN)
+			if (src1 == SLJIT_IMM && src1w <= SIMM_MAX && src1w >= SIMM_MIN)
 				PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTIU : SLTI) | S(src2) | T(TMP_REG1) | IMM(src1w), DR(TMP_REG1)));
 			else {
 				RESOLVE_IMM1();
@@ -3142,9 +3537,6 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 #undef BR_T
 #undef BR_F
 
-#undef FLOAT_DATA
-#undef FMT
-
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)
 {
 	struct sljit_jump *jump = NULL;
@@ -3152,7 +3544,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));
 
-	if (src & SLJIT_IMM) {
+	if (src == SLJIT_IMM) {
 		jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
 		FAIL_IF(!jump);
 		set_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_JAL : 0));
@@ -3184,8 +3576,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #endif
 	}
 
-	FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
-	return SLJIT_SUCCESS;
+	return push_inst(compiler, NOP, UNMOVABLE_INS);
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,
@@ -3287,50 +3678,29 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return emit_op(compiler, saved_op, mem_type, dst, dstw, dst, dstw, TMP_REG2, 0);
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,
-	sljit_s32 dst_reg,
-	sljit_s32 src, sljit_sw srcw)
-{
 #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6)
-	sljit_ins ins;
-#endif /* SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6 */
-
-	CHECK_ERROR();
-	CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));
-
-#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6)
-
-	if (SLJIT_UNLIKELY(src & SLJIT_IMM)) {
-#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
-		if (type & SLJIT_32)
-			srcw = (sljit_s32)srcw;
-#endif
-		FAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw));
-		src = TMP_REG1;
-		srcw = 0;
-	}
 
+static sljit_ins get_select_cc(sljit_s32 type, sljit_s32 is_float)
+{
 	switch (type & ~SLJIT_32) {
 	case SLJIT_EQUAL:
-		ins = MOVZ | TA(EQUAL_FLAG);
-		break;
+		return (is_float ? MOVZ_S : MOVZ) | TA(EQUAL_FLAG);
 	case SLJIT_NOT_EQUAL:
-		ins = MOVN | TA(EQUAL_FLAG);
-		break;
+		return (is_float ? MOVN_S : MOVN) | TA(EQUAL_FLAG);
 	case SLJIT_LESS:
 	case SLJIT_GREATER:
 	case SLJIT_SIG_LESS:
 	case SLJIT_SIG_GREATER:
 	case SLJIT_OVERFLOW:
-		ins = MOVN | TA(OTHER_FLAG);
-		break;
+	case SLJIT_CARRY:
+		return (is_float ? MOVN_S : MOVN) | TA(OTHER_FLAG);
 	case SLJIT_GREATER_EQUAL:
 	case SLJIT_LESS_EQUAL:
 	case SLJIT_SIG_GREATER_EQUAL:
 	case SLJIT_SIG_LESS_EQUAL:
 	case SLJIT_NOT_OVERFLOW:
-		ins = MOVZ | TA(OTHER_FLAG);
-		break;
+	case SLJIT_NOT_CARRY:
+		return (is_float ? MOVZ_S : MOVZ) | TA(OTHER_FLAG);
 	case SLJIT_F_EQUAL:
 	case SLJIT_F_LESS:
 	case SLJIT_F_LESS_EQUAL:
@@ -3341,8 +3711,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	case SLJIT_UNORDERED_OR_LESS_EQUAL:
 	case SLJIT_ORDERED_LESS_EQUAL:
 	case SLJIT_UNORDERED:
-		ins = MOVT;
-		break;
+		return is_float ? MOVT_S : MOVT;
 	case SLJIT_F_NOT_EQUAL:
 	case SLJIT_F_GREATER_EQUAL:
 	case SLJIT_F_GREATER:
@@ -3353,21 +3722,159 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	case SLJIT_ORDERED_GREATER:
 	case SLJIT_UNORDERED_OR_GREATER:
 	case SLJIT_ORDERED:
-		ins = MOVF;
-		break;
+		return is_float ? MOVF_S : MOVF;
 	default:
-		ins = MOVZ | TA(OTHER_FLAG);
 		SLJIT_UNREACHABLE();
-		break;
+		return (is_float ? MOVZ_S : MOVZ) | TA(OTHER_FLAG);
+	}
+}
+
+#endif /* SLJIT_MIPS_REV >= 1 */
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_reg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_reg)
+{
+#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
+	sljit_s32 inp_flags = ((type & SLJIT_32) ? INT_DATA : WORD_DATA) | LOAD_DATA;
+	sljit_ins mov_ins = (type & SLJIT_32) ? ADDU : DADDU;
+#else /* !SLJIT_CONFIG_MIPS_64 */
+	sljit_s32 inp_flags = WORD_DATA | LOAD_DATA;
+	sljit_ins mov_ins = ADDU;
+#endif /* SLJIT_CONFIG_MIPS_64 */
+
+#if !(defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6)
+	struct sljit_label *label;
+	struct sljit_jump *jump;
+#endif /* !(SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6) */
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg));
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+
+#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6)
+	if (src1 & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem(compiler, inp_flags, DR(TMP_REG2), src1, src1w));
+		src1 = TMP_REG2;
+	} else if (src1 == SLJIT_IMM) {
+#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
+		if (type & SLJIT_32)
+			src1w = (sljit_s32)src1w;
+#endif
+		FAIL_IF(load_immediate(compiler, DR(TMP_REG1), src1w));
+		src1 = TMP_REG1;
+	}
+
+	if (dst_reg != src2_reg) {
+		if (dst_reg == src1) {
+			src1 = src2_reg;
+			type ^= 0x1;
+		} else
+			FAIL_IF(push_inst(compiler, mov_ins | S(src2_reg) | TA(0) | D(dst_reg), DR(dst_reg)));
+	}
+
+	return push_inst(compiler, get_select_cc(type, 0) | S(src1) | D(dst_reg), DR(dst_reg));
+
+#else /* SLJIT_MIPS_REV < 1 || SLJIT_MIPS_REV >= 6 */
+	if (dst_reg != src2_reg) {
+		if (dst_reg == src1) {
+			src1 = src2_reg;
+			src1w = 0;
+			type ^= 0x1;
+		} else {
+			if (ADDRESSING_DEPENDS_ON(src1, dst_reg)) {
+				FAIL_IF(push_inst(compiler, ADDU_W | S(dst_reg) | TA(0) | D(TMP_REG2), DR(TMP_REG2)));
+
+				if ((src1 & REG_MASK) == dst_reg)
+					src1 = (src1 & ~REG_MASK) | TMP_REG2;
+
+				if (OFFS_REG(src1) == dst_reg)
+					src1 = (src1 & ~OFFS_REG_MASK) | TO_OFFS_REG(TMP_REG2);
+			}
+
+			FAIL_IF(push_inst(compiler, mov_ins | S(src2_reg) | TA(0) | D(dst_reg), DR(dst_reg)));
+		}
+	}
+
+	SLJIT_SKIP_CHECKS(compiler);
+	jump = sljit_emit_jump(compiler, (type & ~SLJIT_32) ^ 0x1);
+	FAIL_IF(!jump);
+
+	if (src1 & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem(compiler, inp_flags, DR(dst_reg), src1, src1w));
+	} else if (src1 == SLJIT_IMM) {
+#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
+		if (type & SLJIT_32)
+			src1w = (sljit_s32)src1w;
+#endif /* SLJIT_CONFIG_MIPS_64 */
+		FAIL_IF(load_immediate(compiler, DR(dst_reg), src1w));
+	} else
+		FAIL_IF(push_inst(compiler, mov_ins | S(src1) | TA(0) | D(dst_reg), DR(dst_reg)));
+
+	SLJIT_SKIP_CHECKS(compiler);
+	label = sljit_emit_label(compiler);
+	FAIL_IF(!label);
+
+	sljit_set_label(jump, label);
+	return SLJIT_SUCCESS;
+#endif /* SLJIT_MIPS_REV >= 1 */
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_freg)
+{
+#if !(defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6)
+	struct sljit_label *label;
+	struct sljit_jump *jump;
+#endif /* !(SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6) */
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg));
+
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+
+	if (dst_freg != src2_freg) {
+		if (dst_freg == src1) {
+			src1 = src2_freg;
+			src1w = 0;
+			type ^= 0x1;
+		} else
+			FAIL_IF(push_inst(compiler, MOV_fmt(FMT(type)) | FS(src2_freg) | FD(dst_freg), MOVABLE_INS));
 	}
 
-	return push_inst(compiler, ins | S(src) | D(dst_reg), DR(dst_reg));
+#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6)
+	if (src1 & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(type) | LOAD_DATA, FR(TMP_FREG1), src1, src1w));
+		src1 = TMP_FREG1;
+	}
+
+	return push_inst(compiler, get_select_cc(type, 1) | FMT(type) | FS(src1) | FD(dst_freg), MOVABLE_INS);
 
 #else /* SLJIT_MIPS_REV < 1 || SLJIT_MIPS_REV >= 6 */
-	return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);
+	SLJIT_SKIP_CHECKS(compiler);
+	jump = sljit_emit_jump(compiler, (type & ~SLJIT_32) ^ 0x1);
+	FAIL_IF(!jump);
+
+	if (src1 & SLJIT_MEM)
+		FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(type) | LOAD_DATA, FR(dst_freg), src1, src1w));
+	else
+		FAIL_IF(push_inst(compiler, MOV_fmt(FMT(type)) | FS(src1) | FD(dst_freg), MOVABLE_INS));
+
+	SLJIT_SKIP_CHECKS(compiler);
+	label = sljit_emit_label(compiler);
+	FAIL_IF(!label);
+
+	sljit_set_label(jump, label);
+	return SLJIT_SUCCESS;
 #endif /* SLJIT_MIPS_REV >= 1 */
 }
 
+#undef FLOAT_DATA
+#undef FMT
+
 static sljit_s32 update_mem_addr(struct sljit_compiler *compiler, sljit_s32 *mem, sljit_sw *memw, sljit_s16 max_offset)
 {
 	sljit_s32 arg = *mem;
@@ -3410,21 +3917,33 @@ static sljit_s32 update_mem_addr(struct
 }
 
 #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
-#define MEM16_IMM_FIRST(memw) IMM((memw) + 1)
-#define MEM16_IMM_SECOND(memw) IMM(memw)
-#define MEMF64_FS_FIRST(freg) FS(freg)
-#define MEMF64_FS_SECOND(freg) (FS(freg) | ((sljit_ins)1 << 11))
+#define IMM_LEFT(memw)			IMM((memw) + SSIZE_OF(sw) - 1)
+#define IMM_RIGHT(memw)			IMM(memw)
+#define IMM_32_LEFT(memw)		IMM((memw) + SSIZE_OF(s32) - 1)
+#define IMM_32_RIGHT(memw)		IMM(memw)
+#define IMM_F64_FIRST_LEFT(memw)	IMM((memw) + SSIZE_OF(s32) - 1)
+#define IMM_F64_FIRST_RIGHT(memw)	IMM(memw)
+#define IMM_F64_SECOND_LEFT(memw)	IMM((memw) + SSIZE_OF(f64) - 1)
+#define IMM_F64_SECOND_RIGHT(memw)	IMM((memw) + SSIZE_OF(s32))
+#define IMM_16_FIRST(memw)		IMM((memw) + 1)
+#define IMM_16_SECOND(memw)		IMM(memw)
 #else /* !SLJIT_LITTLE_ENDIAN */
-#define MEM16_IMM_FIRST(memw) IMM(memw)
-#define MEM16_IMM_SECOND(memw) IMM((memw) + 1)
-#define MEMF64_FS_FIRST(freg) (FS(freg) | ((sljit_ins)1 << 11))
-#define MEMF64_FS_SECOND(freg) FS(freg)
+#define IMM_LEFT(memw)			IMM(memw)
+#define IMM_RIGHT(memw)			IMM((memw) + SSIZE_OF(sw) - 1)
+#define IMM_32_LEFT(memw)		IMM(memw)
+#define IMM_32_RIGHT(memw)		IMM((memw) + SSIZE_OF(s32) - 1)
+#define IMM_F64_FIRST_LEFT(memw)	IMM((memw) + SSIZE_OF(s32))
+#define IMM_F64_FIRST_RIGHT(memw)	IMM((memw) + SSIZE_OF(f64) - 1)
+#define IMM_F64_SECOND_LEFT(memw)	IMM(memw)
+#define IMM_F64_SECOND_RIGHT(memw)	IMM((memw) + SSIZE_OF(s32) - 1)
+#define IMM_16_FIRST(memw)		IMM(memw)
+#define IMM_16_SECOND(memw)		IMM((memw) + 1)
 #endif /* SLJIT_LITTLE_ENDIAN */
 
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
-#define MEM_CHECK_UNALIGNED(type) ((type) & (SLJIT_MEM_UNALIGNED | SLJIT_MEM_UNALIGNED_16))
+#define MEM_CHECK_UNALIGNED(type) ((type) & (SLJIT_MEM_UNALIGNED | SLJIT_MEM_ALIGNED_16))
 #else /* !SLJIT_CONFIG_MIPS_32 */
-#define MEM_CHECK_UNALIGNED(type) ((type) & (SLJIT_MEM_UNALIGNED | SLJIT_MEM_UNALIGNED_16 | SLJIT_MEM_UNALIGNED_32))
+#define MEM_CHECK_UNALIGNED(type) ((type) & (SLJIT_MEM_UNALIGNED | SLJIT_MEM_ALIGNED_16 | SLJIT_MEM_ALIGNED_32))
 #endif /* SLJIT_CONFIG_MIPS_32 */
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,
@@ -3461,10 +3980,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			ins_right = ((type & SLJIT_MEM_STORE) ? SDR : LDR) | S(mem);
 #endif /* SLJIT_CONFIG_MIPS_32 */
 
-			FAIL_IF(push_inst(compiler, ins | T(REG_PAIR_FIRST(reg)) | IMM(memw), DR(REG_PAIR_FIRST(reg))));
-			FAIL_IF(push_inst(compiler, ins_right | T(REG_PAIR_FIRST(reg)) | IMM(memw + (SSIZE_OF(sw) - 1)), DR(REG_PAIR_FIRST(reg))));
-			FAIL_IF(push_inst(compiler, ins | T(REG_PAIR_SECOND(reg)) | IMM(memw + SSIZE_OF(sw)), DR(REG_PAIR_SECOND(reg))));
-			return push_inst(compiler, ins_right | T(REG_PAIR_SECOND(reg)) | IMM((memw + 2 * SSIZE_OF(sw) - 1)), DR(REG_PAIR_SECOND(reg)));
+			FAIL_IF(push_inst(compiler, ins | T(REG_PAIR_FIRST(reg)) | IMM_LEFT(memw), DR(REG_PAIR_FIRST(reg))));
+			FAIL_IF(push_inst(compiler, ins_right | T(REG_PAIR_FIRST(reg)) | IMM_RIGHT(memw), DR(REG_PAIR_FIRST(reg))));
+			FAIL_IF(push_inst(compiler, ins | T(REG_PAIR_SECOND(reg)) | IMM_LEFT(memw + SSIZE_OF(sw)), DR(REG_PAIR_SECOND(reg))));
+			return push_inst(compiler, ins_right | T(REG_PAIR_SECOND(reg)) | IMM_RIGHT(memw + SSIZE_OF(sw)), DR(REG_PAIR_SECOND(reg)));
 		}
 #endif /* !(SLJIT_MIPS_REV >= 6) */
 
@@ -3505,8 +4024,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 		if (type & SLJIT_MEM_STORE) {
 			FAIL_IF(push_inst(compiler, SRA_W | T(reg) | D(TMP_REG2) | SH_IMM(8), DR(TMP_REG2)));
-			FAIL_IF(push_inst(compiler, data_transfer_insts[BYTE_DATA] | S(mem) | T(TMP_REG2) | MEM16_IMM_FIRST(memw), MOVABLE_INS));
-			return push_inst(compiler, data_transfer_insts[BYTE_DATA] | S(mem) | T(reg) | MEM16_IMM_SECOND(memw), MOVABLE_INS);
+			FAIL_IF(push_inst(compiler, data_transfer_insts[BYTE_DATA] | S(mem) | T(TMP_REG2) | IMM_16_FIRST(memw), MOVABLE_INS));
+			return push_inst(compiler, data_transfer_insts[BYTE_DATA] | S(mem) | T(reg) | IMM_16_SECOND(memw), MOVABLE_INS);
 		}
 
 		flags = BYTE_DATA | LOAD_DATA;
@@ -3514,15 +4033,15 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		if (op == SLJIT_MOV_S16)
 			flags |= SIGNED_DATA;
 
-		FAIL_IF(push_inst(compiler, data_transfer_insts[flags] | S(mem) | T(TMP_REG2) | MEM16_IMM_FIRST(memw), DR(TMP_REG2)));
-		FAIL_IF(push_inst(compiler, data_transfer_insts[BYTE_DATA | LOAD_DATA] | S(mem) | T(reg) | MEM16_IMM_SECOND(memw), DR(reg)));
+		FAIL_IF(push_inst(compiler, data_transfer_insts[flags] | S(mem) | T(TMP_REG2) | IMM_16_FIRST(memw), DR(TMP_REG2)));
+		FAIL_IF(push_inst(compiler, data_transfer_insts[BYTE_DATA | LOAD_DATA] | S(mem) | T(reg) | IMM_16_SECOND(memw), DR(reg)));
 		FAIL_IF(push_inst(compiler, SLL_W | T(TMP_REG2) | D(TMP_REG2) | SH_IMM(8), DR(TMP_REG2)));
 		return push_inst(compiler, OR | S(reg) | T(TMP_REG2) | D(reg), DR(reg));
 
 	case SLJIT_MOV:
 	case SLJIT_MOV_P:
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
-		if (type & SLJIT_MEM_UNALIGNED_32) {
+		if (type & SLJIT_MEM_ALIGNED_32) {
 			flags = WORD_DATA;
 			if (!(type & SLJIT_MEM_STORE))
 				flags |= LOAD_DATA;
@@ -3534,8 +4053,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		SLJIT_ASSERT(FAST_IS_REG(mem) && mem != TMP_REG2);
 
 		if (type & SLJIT_MEM_STORE) {
-			FAIL_IF(push_inst(compiler, SDL | S(mem) | T(reg) | IMM(memw), MOVABLE_INS));
-			return push_inst(compiler, SDR | S(mem) | T(reg) | IMM(memw + 7), MOVABLE_INS);
+			FAIL_IF(push_inst(compiler, SDL | S(mem) | T(reg) | IMM_LEFT(memw), MOVABLE_INS));
+			return push_inst(compiler, SDR | S(mem) | T(reg) | IMM_RIGHT(memw), MOVABLE_INS);
 		}
 
 		if (mem == reg) {
@@ -3543,8 +4062,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			mem = TMP_REG1;
 		}
 
-		FAIL_IF(push_inst(compiler, LDL | S(mem) | T(reg) | IMM(memw), DR(reg)));
-		return push_inst(compiler, LDR | S(mem) | T(reg) | IMM(memw + 7), DR(reg));
+		FAIL_IF(push_inst(compiler, LDL | S(mem) | T(reg) | IMM_LEFT(memw), DR(reg)));
+		return push_inst(compiler, LDR | S(mem) | T(reg) | IMM_RIGHT(memw), DR(reg));
 #endif /* SLJIT_CONFIG_MIPS_32 */
 	}
 
@@ -3552,8 +4071,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	SLJIT_ASSERT(FAST_IS_REG(mem) && mem != TMP_REG2);
 
 	if (type & SLJIT_MEM_STORE) {
-		FAIL_IF(push_inst(compiler, SWL | S(mem) | T(reg) | IMM(memw), MOVABLE_INS));
-		return push_inst(compiler, SWR | S(mem) | T(reg) | IMM(memw + 3), MOVABLE_INS);
+		FAIL_IF(push_inst(compiler, SWL | S(mem) | T(reg) | IMM_32_LEFT(memw), MOVABLE_INS));
+		return push_inst(compiler, SWR | S(mem) | T(reg) | IMM_32_RIGHT(memw), MOVABLE_INS);
 	}
 
 	if (mem == reg) {
@@ -3561,18 +4080,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		mem = TMP_REG1;
 	}
 
-	FAIL_IF(push_inst(compiler, LWL | S(mem) | T(reg) | IMM(memw), DR(reg)));
+	FAIL_IF(push_inst(compiler, LWL | S(mem) | T(reg) | IMM_32_LEFT(memw), DR(reg)));
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
-	return push_inst(compiler, LWR | S(mem) | T(reg) | IMM(memw + 3), DR(reg));
+	return push_inst(compiler, LWR | S(mem) | T(reg) | IMM_32_RIGHT(memw), DR(reg));
 #else /* !SLJIT_CONFIG_MIPS_32 */
-	FAIL_IF(push_inst(compiler, LWR | S(mem) | T(reg) | IMM(memw + 3), DR(reg)));
+	FAIL_IF(push_inst(compiler, LWR | S(mem) | T(reg) | IMM_32_RIGHT(memw), DR(reg)));
 
 	if (op != SLJIT_MOV_U32)
 		return SLJIT_SUCCESS;
 
 #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 2)
-	return push_inst(compiler, DINSU | T(reg) | SA(0) | (31 << 11) | (0 << 11), DR(reg));
-#else  /* SLJIT_MIPS_REV < 1 */
+	return push_inst(compiler, DINSU | T(reg) | SA(0) | (31 << 11), DR(reg));
+#else  /* SLJIT_MIPS_REV < 2 */
 	FAIL_IF(push_inst(compiler, DSLL32 | T(reg) | D(reg) | SH_IMM(0), DR(reg)));
 	return push_inst(compiler, DSRL32 | T(reg) | D(reg) | SH_IMM(0), DR(reg));
 #endif /* SLJIT_MIPS_REV >= 2 */
@@ -3595,77 +4114,97 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	if (type & SLJIT_MEM_STORE) {
 		if (type & SLJIT_32) {
 			FAIL_IF(push_inst(compiler, MFC1 | T(TMP_REG2) | FS(freg), DR(TMP_REG2)));
-#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3)
+#if !defined(SLJIT_MIPS_REV) || (SLJIT_CONFIG_MIPS_32 && SLJIT_MIPS_REV <= 1)
 			FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
-#endif
-			FAIL_IF(push_inst(compiler, SWL | S(mem) | T(TMP_REG2) | IMM(memw), MOVABLE_INS));
-			return push_inst(compiler, SWR | S(mem) | T(TMP_REG2) | IMM(memw + 3), MOVABLE_INS);
+#endif /* MIPS III */
+			FAIL_IF(push_inst(compiler, SWL | S(mem) | T(TMP_REG2) | IMM_32_LEFT(memw), MOVABLE_INS));
+			return push_inst(compiler, SWR | S(mem) | T(TMP_REG2) | IMM_32_RIGHT(memw), MOVABLE_INS);
 		}
 
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
-		FAIL_IF(push_inst(compiler, MFC1 | T(TMP_REG2) | MEMF64_FS_FIRST(freg), DR(TMP_REG2)));
-#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3)
+		FAIL_IF(push_inst(compiler, MFC1 | T(TMP_REG2) | FS(freg), DR(TMP_REG2)));
+#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1
 		FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
+#endif /* MIPS III */
+		FAIL_IF(push_inst(compiler, SWL | S(mem) | T(TMP_REG2) | IMM_F64_FIRST_LEFT(memw), MOVABLE_INS));
+		FAIL_IF(push_inst(compiler, SWR | S(mem) | T(TMP_REG2) | IMM_F64_FIRST_RIGHT(memw), MOVABLE_INS));
+		switch (cpu_feature_list & CPU_FEATURE_FR) {
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
+		case CPU_FEATURE_FR:
+			FAIL_IF(push_inst(compiler, MFHC1 | T(TMP_REG2) | FS(freg), DR(TMP_REG2)));
+			break;
+#endif /* SLJIT_MIPS_REV >= 2 */
+		default:
+			FAIL_IF(push_inst(compiler, MFC1 | T(TMP_REG2) | FS(freg) | (1 << 11), DR(TMP_REG2)));
+#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1
+			FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
 #endif
-		FAIL_IF(push_inst(compiler, SWL | S(mem) | T(TMP_REG2) | IMM(memw), MOVABLE_INS));
-		FAIL_IF(push_inst(compiler, SWR | S(mem) | T(TMP_REG2) | IMM(memw + 3), MOVABLE_INS));
+			break;
+		}
 
-		FAIL_IF(push_inst(compiler, MFC1 | T(TMP_REG2) | MEMF64_FS_SECOND(freg), DR(TMP_REG2)));
-#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3)
-		FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
-#endif
-		FAIL_IF(push_inst(compiler, SWL | S(mem) | T(TMP_REG2) | IMM(memw + 4), MOVABLE_INS));
-		return push_inst(compiler, SWR | S(mem) | T(TMP_REG2) | IMM(memw + 7), MOVABLE_INS);
+		FAIL_IF(push_inst(compiler, SWL | S(mem) | T(TMP_REG2) | IMM_F64_SECOND_LEFT(memw), MOVABLE_INS));
+		return push_inst(compiler, SWR | S(mem) | T(TMP_REG2) | IMM_F64_SECOND_RIGHT(memw), MOVABLE_INS);
 #else /* !SLJIT_CONFIG_MIPS_32 */
-		FAIL_IF(push_inst(compiler, MFC1 | (1 << 21) | T(TMP_REG2) | FS(freg), DR(TMP_REG2)));
-#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3)
+		FAIL_IF(push_inst(compiler, DMFC1 | T(TMP_REG2) | FS(freg), DR(TMP_REG2)));
+#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1
 		FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
-#endif
-		FAIL_IF(push_inst(compiler, SDL | S(mem) | T(TMP_REG2) | IMM(memw), MOVABLE_INS));
-		return push_inst(compiler, SDR | S(mem) | T(TMP_REG2) | IMM(memw + 7), MOVABLE_INS);
+#endif /* MIPS III */
+		FAIL_IF(push_inst(compiler, SDL | S(mem) | T(TMP_REG2) | IMM_LEFT(memw), MOVABLE_INS));
+		return push_inst(compiler, SDR | S(mem) | T(TMP_REG2) | IMM_RIGHT(memw), MOVABLE_INS);
 #endif /* SLJIT_CONFIG_MIPS_32 */
 	}
 
 	if (type & SLJIT_32) {
-		FAIL_IF(push_inst(compiler, LWL | S(mem) | T(TMP_REG2) | IMM(memw), DR(TMP_REG2)));
-		FAIL_IF(push_inst(compiler, LWR | S(mem) | T(TMP_REG2) | IMM(memw + 3), DR(TMP_REG2)));
+		FAIL_IF(push_inst(compiler, LWL | S(mem) | T(TMP_REG2) | IMM_32_LEFT(memw), DR(TMP_REG2)));
+		FAIL_IF(push_inst(compiler, LWR | S(mem) | T(TMP_REG2) | IMM_32_RIGHT(memw), DR(TMP_REG2)));
 
 		FAIL_IF(push_inst(compiler, MTC1 | T(TMP_REG2) | FS(freg), MOVABLE_INS));
-#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3)
+#if !defined(SLJIT_MIPS_REV) || (SLJIT_CONFIG_MIPS_32 && SLJIT_MIPS_REV <= 1)
 		FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
-#endif
+#endif /* MIPS III */
 		return SLJIT_SUCCESS;
 	}
 
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
-	FAIL_IF(push_inst(compiler, LWL | S(mem) | T(TMP_REG2) | IMM(memw), DR(TMP_REG2)));
-	FAIL_IF(push_inst(compiler, LWR | S(mem) | T(TMP_REG2) | IMM(memw + 3), DR(TMP_REG2)));
-	FAIL_IF(push_inst(compiler, MTC1 | T(TMP_REG2) | MEMF64_FS_FIRST(freg), MOVABLE_INS));
-
-	FAIL_IF(push_inst(compiler, LWL | S(mem) | T(TMP_REG2) | IMM(memw + 4), DR(TMP_REG2)));
-	FAIL_IF(push_inst(compiler, LWR | S(mem) | T(TMP_REG2) | IMM(memw + 7), DR(TMP_REG2)));
-	FAIL_IF(push_inst(compiler, MTC1 | T(TMP_REG2) | MEMF64_FS_SECOND(freg), MOVABLE_INS));
-#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3)
-	FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
-#endif
+	FAIL_IF(push_inst(compiler, LWL | S(mem) | T(TMP_REG2) | IMM_F64_FIRST_LEFT(memw), DR(TMP_REG2)));
+	FAIL_IF(push_inst(compiler, LWR | S(mem) | T(TMP_REG2) | IMM_F64_FIRST_RIGHT(memw), DR(TMP_REG2)));
+	FAIL_IF(push_inst(compiler, MTC1 | T(TMP_REG2) | FS(freg), MOVABLE_INS));
+
+	FAIL_IF(push_inst(compiler, LWL | S(mem) | T(TMP_REG2) | IMM_F64_SECOND_LEFT(memw), DR(TMP_REG2)));
+	FAIL_IF(push_inst(compiler, LWR | S(mem) | T(TMP_REG2) | IMM_F64_SECOND_RIGHT(memw), DR(TMP_REG2)));
+	switch (cpu_feature_list & CPU_FEATURE_FR) {
+#if defined(SLJIT_MIPS_REV) && SLJIT_MIPS_REV >= 2
+	case CPU_FEATURE_FR:
+		return push_inst(compiler, MTHC1 | T(TMP_REG2) | FS(freg), MOVABLE_INS);
+#endif /* SLJIT_MIPS_REV >= 2 */
+	default:
+		FAIL_IF(push_inst(compiler, MTC1 | T(TMP_REG2) | FS(freg) | (1 << 11), MOVABLE_INS));
+		break;
+	}
 #else /* !SLJIT_CONFIG_MIPS_32 */
-	FAIL_IF(push_inst(compiler, LDL | S(mem) | T(TMP_REG2) | IMM(memw), DR(TMP_REG2)));
-	FAIL_IF(push_inst(compiler, LDR | S(mem) | T(TMP_REG2) | IMM(memw + 7), DR(TMP_REG2)));
+	FAIL_IF(push_inst(compiler, LDL | S(mem) | T(TMP_REG2) | IMM_LEFT(memw), DR(TMP_REG2)));
+	FAIL_IF(push_inst(compiler, LDR | S(mem) | T(TMP_REG2) | IMM_RIGHT(memw), DR(TMP_REG2)));
 
-	FAIL_IF(push_inst(compiler, MTC1 | (1 << 21) | T(TMP_REG2) | FS(freg), MOVABLE_INS));
-#if (!defined SLJIT_MIPS_REV || SLJIT_MIPS_REV <= 3)
-	FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
-#endif
+	FAIL_IF(push_inst(compiler, DMTC1 | T(TMP_REG2) | FS(freg), MOVABLE_INS));
 #endif /* SLJIT_CONFIG_MIPS_32 */
+#if !defined(SLJIT_MIPS_REV) || SLJIT_MIPS_REV <= 1
+	FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
+#endif /* MIPS III */
 	return SLJIT_SUCCESS;
 }
 
 #endif /* !SLJIT_MIPS_REV || SLJIT_MIPS_REV < 6 */
 
-#undef MEM16_IMM_FIRST
-#undef MEM16_IMM_SECOND
-#undef MEMF64_FS_FIRST
-#undef MEMF64_FS_SECOND
+#undef IMM_16_SECOND
+#undef IMM_16_FIRST
+#undef IMM_F64_SECOND_RIGHT
+#undef IMM_F64_SECOND_LEFT
+#undef IMM_F64_FIRST_RIGHT
+#undef IMM_F64_FIRST_LEFT
+#undef IMM_32_RIGHT
+#undef IMM_32_LEFT
+#undef IMM_RIGHT
+#undef IMM_LEFT
 #undef MEM_CHECK_UNALIGNED
 
 #undef TO_ARGW_HI
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativePPC_32.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativePPC_32.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativePPC_32.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativePPC_32.c	2024-11-20 13:56:33.000000000 +0000
@@ -85,10 +85,6 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		}
 		return SLJIT_SUCCESS;
 
-	case SLJIT_NOT:
-		SLJIT_ASSERT(src1 == TMP_REG1);
-		return push_inst(compiler, NOR | RC(flags) | S(src2) | A(dst) | B(src2));
-
 	case SLJIT_CLZ:
 		SLJIT_ASSERT(src1 == TMP_REG1);
 		return push_inst(compiler, CNTLZW | S(src2) | A(dst));
@@ -246,6 +242,10 @@ static SLJIT_INLINE sljit_s32 emit_singl
 			FAIL_IF(push_inst(compiler, XORI | S(src1) | A(dst) | IMM(imm)));
 			return push_inst(compiler, XORIS | S(dst) | A(dst) | IMM(imm >> 16));
 		}
+		if (flags & ALT_FORM4) {
+			SLJIT_ASSERT(src1 == TMP_REG1);
+			return push_inst(compiler, NOR | RC(flags) | S(src2) | A(dst) | B(src2));
+		}
 		return push_inst(compiler, XOR | RC(flags) | S(src1) | A(dst) | B(src2));
 
 	case SLJIT_SHL:
@@ -325,6 +325,151 @@ static SLJIT_INLINE sljit_s32 emit_const
 	return push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value));
 }
 
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
+	sljit_s32 invert_sign = 1;
+
+	if (src == SLJIT_IMM) {
+		FAIL_IF(load_immediate(compiler, TMP_REG1, srcw ^ (sljit_sw)0x80000000));
+		src = TMP_REG1;
+		invert_sign = 0;
+	} else if (!FAST_IS_REG(src)) {
+		FAIL_IF(emit_op_mem(compiler, WORD_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1));
+		src = TMP_REG1;
+	}
+
+	/* First, a special double precision floating point value is constructed:
+	      (2^53 + (src xor (2^31)))
+	   The upper 32 bits of this number is a constant, and the lower 32 bits
+	   is simply the value of the source argument. The xor 2^31 operation adds
+	   0x80000000 to the source argument, which moves it into the 0 - 0xffffffff
+	   range. Finally we substract 2^53 + 2^31 to get the converted value. */
+	FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG2) | A(0) | 0x4330));
+	if (invert_sign)
+		FAIL_IF(push_inst(compiler, XORIS | S(src) | A(TMP_REG1) | 0x8000));
+	FAIL_IF(push_inst(compiler, STW | S(TMP_REG2) | A(SLJIT_SP) | TMP_MEM_OFFSET_HI));
+	FAIL_IF(push_inst(compiler, STW | S(TMP_REG1) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO));
+	FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG1) | A(0) | 0x8000));
+	FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+	FAIL_IF(push_inst(compiler, STW | S(TMP_REG1) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO));
+	FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG2) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+
+	FAIL_IF(push_inst(compiler, FSUB | FD(dst_r) | FA(TMP_FREG1) | FB(TMP_FREG2)));
+
+	if (op & SLJIT_32)
+		FAIL_IF(push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r)));
+
+	if (dst & SLJIT_MEM)
+		return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1);
+	return SLJIT_SUCCESS;
+}
+
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
+
+	if (src == SLJIT_IMM) {
+		FAIL_IF(load_immediate(compiler, TMP_REG1, srcw));
+		src = TMP_REG1;
+	} else if (!FAST_IS_REG(src)) {
+		FAIL_IF(emit_op_mem(compiler, WORD_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1));
+		src = TMP_REG1;
+	}
+
+	/* First, a special double precision floating point value is constructed:
+	      (2^53 + src)
+	   The upper 32 bits of this number is a constant, and the lower 32 bits
+	   is simply the value of the source argument. Finally we substract 2^53
+	   to get the converted value. */
+	FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG2) | A(0) | 0x4330));
+	FAIL_IF(push_inst(compiler, STW | S(src) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO));
+	FAIL_IF(push_inst(compiler, STW | S(TMP_REG2) | A(SLJIT_SP) | TMP_MEM_OFFSET_HI));
+
+	FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+	FAIL_IF(push_inst(compiler, STW | S(TMP_ZERO) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO));
+	FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG2) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+
+	FAIL_IF(push_inst(compiler, FSUB | FD(dst_r) | FA(TMP_FREG1) | FB(TMP_FREG2)));
+
+	if (op & SLJIT_32)
+		FAIL_IF(push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r)));
+
+	if (dst & SLJIT_MEM)
+		return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1);
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f64 value)
+{
+	union {
+		sljit_s32 imm[2];
+		sljit_f64 value;
+	} u;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fset64(compiler, freg, value));
+
+	u.value = value;
+
+	if (u.imm[0] != 0)
+		FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm[0]));
+	if (u.imm[1] != 0)
+		FAIL_IF(load_immediate(compiler, TMP_REG2, u.imm[1]));
+
+	/* Saved in the same endianness. */
+	FAIL_IF(push_inst(compiler, STW | S(u.imm[0] != 0 ? TMP_REG1 : TMP_ZERO) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+	FAIL_IF(push_inst(compiler, STW | S(u.imm[1] != 0 ? TMP_REG2 : TMP_ZERO) | A(SLJIT_SP) | (TMP_MEM_OFFSET + sizeof(sljit_s32))));
+	return push_inst(compiler, LFD | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 freg, sljit_s32 reg)
+{
+	sljit_s32 reg2 = 0;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg));
+
+	if (op & SLJIT_32) {
+		if (op == SLJIT_COPY32_TO_F32) {
+			FAIL_IF(push_inst(compiler, STW | S(reg) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+			return push_inst(compiler, LFS | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET);
+		}
+
+		FAIL_IF(push_inst(compiler, STFS | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+		return push_inst(compiler, LWZ | S(reg) | A(SLJIT_SP) | TMP_MEM_OFFSET);
+	}
+
+	if (reg & REG_PAIR_MASK) {
+		reg2 = REG_PAIR_SECOND(reg);
+		reg = REG_PAIR_FIRST(reg);
+	}
+
+	if (op == SLJIT_COPY_TO_F64) {
+		FAIL_IF(push_inst(compiler, STW | S(reg) | A(SLJIT_SP) | TMP_MEM_OFFSET_HI));
+
+		if (reg2 != 0)
+			FAIL_IF(push_inst(compiler, STW | S(reg2) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO));
+		else
+			FAIL_IF(push_inst(compiler, STFD | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO));
+
+		return push_inst(compiler, LFD | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET);
+	}
+
+	FAIL_IF(push_inst(compiler, STFD | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+
+	if (reg2 != 0)
+		FAIL_IF(push_inst(compiler, LWZ | S(reg2) | A(SLJIT_SP) | TMP_MEM_OFFSET_LO));
+
+	return push_inst(compiler, LWZ | S(reg) | A(SLJIT_SP) | TMP_MEM_OFFSET_HI);
+}
+
 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)
 {
 	sljit_ins *inst = (sljit_ins *)addr;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativePPC_64.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativePPC_64.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativePPC_64.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativePPC_64.c	2024-11-20 13:56:33.000000000 +0000
@@ -49,7 +49,7 @@ static sljit_s32 load_immediate(struct s
 	if (imm <= SIMM_MAX && imm >= SIMM_MIN)
 		return push_inst(compiler, ADDI | D(reg) | A(0) | IMM(imm));
 
-	if (!(imm & ~0xffff))
+	if (((sljit_uw)imm >> 16) == 0)
 		return push_inst(compiler, ORI | S(TMP_ZERO) | A(reg) | IMM(imm));
 
 	if (imm <= 0x7fffffffl && imm >= -0x80000000l) {
@@ -57,6 +57,11 @@ static sljit_s32 load_immediate(struct s
 		return (imm & 0xffff) ? push_inst(compiler, ORI | S(reg) | A(reg) | IMM(imm)) : SLJIT_SUCCESS;
 	}
 
+	if (((sljit_uw)imm >> 32) == 0) {
+		FAIL_IF(push_inst(compiler, ORIS | S(TMP_ZERO) | A(reg) | IMM(imm >> 16)));
+		return (imm & 0xffff) ? push_inst(compiler, ORI | S(reg) | A(reg) | IMM(imm)) : SLJIT_SUCCESS;
+	}
+
 	/* Count leading zeroes. */
 	tmp = (sljit_uw)((imm >= 0) ? imm : ~imm);
 	ASM_SLJIT_CLZ(tmp, shift);
@@ -198,11 +203,6 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		}
 		return SLJIT_SUCCESS;
 
-	case SLJIT_NOT:
-		SLJIT_ASSERT(src1 == TMP_REG1);
-		UN_EXTS();
-		return push_inst(compiler, NOR | RC(flags) | S(src2) | A(dst) | B(src2));
-
 	case SLJIT_CLZ:
 		SLJIT_ASSERT(src1 == TMP_REG1);
 		return push_inst(compiler, ((flags & ALT_FORM1) ? CNTLZW : CNTLZD) | S(src2) | A(dst));
@@ -399,6 +399,11 @@ static SLJIT_INLINE sljit_s32 emit_singl
 			FAIL_IF(push_inst(compiler, XORI | S(src1) | A(dst) | IMM(imm)));
 			return push_inst(compiler, XORIS | S(dst) | A(dst) | IMM(imm >> 16));
 		}
+		if (flags & ALT_FORM4) {
+			SLJIT_ASSERT(src1 == TMP_REG1);
+			UN_EXTS();
+			return push_inst(compiler, NOR | RC(flags) | S(src2) | A(dst) | B(src2));
+		}
 		return push_inst(compiler, XOR | RC(flags) | S(src1) | A(dst) | B(src2));
 
 	case SLJIT_SHL:
@@ -563,6 +568,141 @@ static SLJIT_INLINE sljit_s32 emit_const
 	return push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value));
 }
 
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
+
+	if (src == SLJIT_IMM) {
+		if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)
+			srcw = (sljit_s32)srcw;
+
+		FAIL_IF(load_immediate(compiler, TMP_REG1, srcw));
+		src = TMP_REG1;
+	} else if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) {
+		if (FAST_IS_REG(src))
+			FAIL_IF(push_inst(compiler, EXTSW | S(src) | A(TMP_REG1)));
+		else
+			FAIL_IF(emit_op_mem(compiler, INT_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1));
+		src = TMP_REG1;
+	}
+
+	if (FAST_IS_REG(src)) {
+		FAIL_IF(push_inst(compiler, STD | S(src) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+		FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+	} else
+		FAIL_IF(emit_op_mem(compiler, DOUBLE_DATA | LOAD_DATA, TMP_FREG1, src, srcw, TMP_REG1));
+
+	FAIL_IF(push_inst(compiler, FCFID | FD(dst_r) | FB(TMP_FREG1)));
+
+	if (op & SLJIT_32)
+		FAIL_IF(push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r)));
+
+	if (dst & SLJIT_MEM)
+		return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1);
+	return SLJIT_SUCCESS;
+}
+
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
+
+	if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_U32) {
+		if (src == SLJIT_IMM) {
+			FAIL_IF(load_immediate(compiler, TMP_REG1, (sljit_u32)srcw));
+			src = TMP_REG1;
+		} else {
+			if (FAST_IS_REG(src))
+				FAIL_IF(push_inst(compiler, CLRLDI(TMP_REG1, src, 32)));
+			else
+				FAIL_IF(emit_op_mem(compiler, INT_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1));
+			src = TMP_REG1;
+		}
+
+		FAIL_IF(push_inst(compiler, STD | S(src) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+		FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+		FAIL_IF(push_inst(compiler, FCFID | FD(dst_r) | FB(TMP_FREG1)));
+	} else {
+		if (src == SLJIT_IMM) {
+			FAIL_IF(load_immediate(compiler, TMP_REG1, srcw));
+			src = TMP_REG1;
+		} else if (src & SLJIT_MEM) {
+			FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1));
+			src = TMP_REG1;
+		}
+
+		FAIL_IF(push_inst(compiler, CMPI | CRD(0 | 1) | A(src) | 0));
+		FAIL_IF(push_inst(compiler, BCx | (12 << 21) | (0 << 16) | 20));
+		FAIL_IF(push_inst(compiler, STD | S(src) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+		FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+		FAIL_IF(push_inst(compiler, FCFID | FD(dst_r) | FB(TMP_FREG1)));
+		FAIL_IF(push_inst(compiler, Bx | ((op & SLJIT_32) ? 36 : 32)));
+
+		if (op & SLJIT_32)
+			FAIL_IF(push_inst(compiler, RLWINM | S(src) | A(TMP_REG2) | RLWI_SH(10) | RLWI_MBE(10, 21)));
+		else
+			FAIL_IF(push_inst(compiler, ANDI | S(src) | A(TMP_REG2) | 0x1));
+
+		/* Shift right. */
+		FAIL_IF(push_inst(compiler, RLDICL | S(src) | A(TMP_REG1) | RLDI_SH(63) | RLDI_MB(1)));
+
+		if (op & SLJIT_32)
+			FAIL_IF(push_inst(compiler, RLDICR | S(TMP_REG1) | A(TMP_REG1) | RLDI_SH(0) | RLDI_ME(53)));
+
+		FAIL_IF(push_inst(compiler, OR | S(TMP_REG1) | A(TMP_REG1) | B(TMP_REG2)));
+
+		FAIL_IF(push_inst(compiler, STD | S(TMP_REG1) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+		FAIL_IF(push_inst(compiler, LFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+		FAIL_IF(push_inst(compiler, FCFID | FD(dst_r) | FB(TMP_FREG1)));
+		FAIL_IF(push_inst(compiler, FADD | FD(dst_r) | FA(dst_r) | FB(dst_r)));
+	}
+
+	if (op & SLJIT_32)
+		FAIL_IF(push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r)));
+
+	if (dst & SLJIT_MEM)
+		return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1);
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f64 value)
+{
+	union {
+		sljit_sw imm;
+		sljit_f64 value;
+	} u;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fset64(compiler, freg, value));
+
+	u.value = value;
+
+	if (u.imm != 0)
+		FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm));
+
+	FAIL_IF(push_inst(compiler, STD | S(u.imm != 0 ? TMP_REG1 : TMP_ZERO) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+	return push_inst(compiler, LFD | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 freg, sljit_s32 reg)
+{
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg));
+
+	if (GET_OPCODE(op) == SLJIT_COPY_TO_F64) {
+		FAIL_IF(push_inst(compiler, ((op & SLJIT_32) ? STW : STD) | S(reg) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+		return push_inst(compiler, ((op & SLJIT_32) ? LFS : LFD) | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET);
+	}
+
+	FAIL_IF(push_inst(compiler, ((op & SLJIT_32) ? STFS : STFD) | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+	return push_inst(compiler, ((op & SLJIT_32) ? LWZ : LD) | S(reg) | A(SLJIT_SP) | TMP_MEM_OFFSET);
+}
+
 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)
 {
 	sljit_ins *inst = (sljit_ins*)addr;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativePPC_common.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativePPC_common.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativePPC_common.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativePPC_common.c	2024-11-20 13:56:33.000000000 +0000
@@ -132,7 +132,7 @@ static const sljit_u8 freg_map[SLJIT_NUM
    OE and Rc flag (see ALT_SET_FLAGS). */
 #define OE(flags)	((flags) & ALT_SET_FLAGS)
 /* Rc flag (see ALT_SET_FLAGS). */
-#define RC(flags)	(((flags) & ALT_SET_FLAGS) >> 10)
+#define RC(flags)	((sljit_ins)((flags) & ALT_SET_FLAGS) >> 10)
 #define HI(opcode)	((sljit_ins)(opcode) << 26)
 #define LO(opcode)	((sljit_ins)(opcode) << 1)
 
@@ -150,6 +150,9 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define BCx		(HI(16))
 #define BCCTR		(HI(19) | LO(528) | (3 << 11))
 #define BLR		(HI(19) | LO(16) | (0x14 << 21))
+#if defined(_ARCH_PWR10) && _ARCH_PWR10
+#define BRD		(HI(31) | LO(187))
+#endif /* POWER10 */
 #define CNTLZD		(HI(31) | LO(58))
 #define CNTLZW		(HI(31) | LO(26))
 #define CMP		(HI(31) | LO(0))
@@ -183,6 +186,12 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define FSUBS		(HI(59) | LO(20))
 #define LD		(HI(58) | 0)
 #define LFD		(HI(50))
+#define LFS		(HI(48))
+#if defined(_ARCH_PWR7) && _ARCH_PWR7
+#define LDBRX		(HI(31) | LO(532))
+#endif /* POWER7 */
+#define LHBRX		(HI(31) | LO(790))
+#define LWBRX		(HI(31) | LO(534))
 #define LWZ		(HI(32))
 #define MFCR		(HI(31) | LO(19))
 #define MFLR		(HI(31) | LO(339) | 0x80000)
@@ -219,11 +228,17 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define SRD		(HI(31) | LO(539))
 #define SRW		(HI(31) | LO(536))
 #define STD		(HI(62) | 0)
+#if defined(_ARCH_PWR7) && _ARCH_PWR7
+#define STDBRX		(HI(31) | LO(660))
+#endif /* POWER7 */
 #define STDU		(HI(62) | 1)
 #define STDUX		(HI(31) | LO(181))
 #define STFD		(HI(54))
 #define STFIWX		(HI(31) | LO(983))
+#define STFS		(HI(52))
+#define STHBRX		(HI(31) | LO(918))
 #define STW		(HI(36))
+#define STWBRX		(HI(31) | LO(662))
 #define STWU		(HI(37))
 #define STWUX		(HI(31) | LO(183))
 #define SUBF		(HI(31) | LO(40))
@@ -253,10 +268,24 @@ static const sljit_u8 freg_map[SLJIT_NUM
 
 #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
 #define SLWI_W(shift) SLWI(shift)
+#define TMP_MEM_OFFSET (2 * sizeof(sljit_sw))
 #else /* !SLJIT_CONFIG_PPC_32 */
 #define SLWI_W(shift) SLDI(shift)
+#define TMP_MEM_OFFSET (6 * sizeof(sljit_sw))
 #endif /* SLJIT_CONFIG_PPC_32 */
 
+#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
+#define TMP_MEM_OFFSET_LO	(TMP_MEM_OFFSET)
+#define TMP_MEM_OFFSET_HI	(TMP_MEM_OFFSET + sizeof(sljit_s32))
+#define LWBRX_FIRST_REG		S(TMP_REG1)
+#define LWBRX_SECOND_REG	S(dst)
+#else /* !SLJIT_LITTLE_ENDIAN */
+#define TMP_MEM_OFFSET_LO	(TMP_MEM_OFFSET + sizeof(sljit_s32))
+#define TMP_MEM_OFFSET_HI	(TMP_MEM_OFFSET)
+#define LWBRX_FIRST_REG		S(dst)
+#define LWBRX_SECOND_REG	S(TMP_REG1)
+#endif /* SLJIT_LITTLE_ENDIAN */
+
 #if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_function_context(void** func_ptr, struct sljit_function_context* context, sljit_uw addr, void* func)
 {
@@ -423,6 +452,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 	reverse_buf(compiler);
 
 #if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
+	/* add to compiler->size additional instruction space to hold the trampoline and padding */
 #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
 	compiler->size += (compiler->size & 0x1) + (sizeof(struct sljit_function_context) / sizeof(sljit_ins));
 #else
@@ -623,7 +653,6 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 
 	compiler->error = SLJIT_ERR_COMPILED;
 	compiler->executable_offset = executable_offset;
-	compiler->executable_size = (sljit_uw)(code_ptr - code) * sizeof(sljit_ins);
 
 	code = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset);
 
@@ -641,8 +670,12 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 	SLJIT_UPDATE_WX_FLAGS(code, code_ptr, 1);
 
 #if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
+	compiler->executable_size = (sljit_uw)(code_ptr - code) * sizeof(sljit_ins) + sizeof(struct sljit_function_context);
+
 	return code_ptr;
 #else
+	compiler->executable_size = (sljit_uw)(code_ptr - code) * sizeof(sljit_ins);
+
 	return code;
 #endif
 }
@@ -652,12 +685,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	switch (feature_type) {
 	case SLJIT_HAS_FPU:
 #ifdef SLJIT_IS_FPU_AVAILABLE
-		return SLJIT_IS_FPU_AVAILABLE;
+		return (SLJIT_IS_FPU_AVAILABLE) != 0;
 #else
 		/* Available by default. */
 		return 1;
 #endif
-
+	case SLJIT_HAS_REV:
+#if defined(_ARCH_PWR10) && _ARCH_PWR10
+		return 1;
+#else /* !POWER10 */
+		return 2;
+#endif /* POWER10 */
 	/* A saved register is set to a zero value. */
 	case SLJIT_HAS_ZERO_REGISTER:
 	case SLJIT_HAS_CLZ:
@@ -675,7 +713,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type)
 {
-	return (type >= SLJIT_UNORDERED && type <= SLJIT_ORDERED_LESS_EQUAL);
+	switch (type) {
+	case SLJIT_UNORDERED_OR_EQUAL:
+	case SLJIT_ORDERED_NOT_EQUAL:
+	case SLJIT_UNORDERED_OR_LESS:
+	case SLJIT_ORDERED_GREATER_EQUAL:
+	case SLJIT_UNORDERED_OR_GREATER:
+	case SLJIT_ORDERED_LESS_EQUAL:
+		return 1;
+	}
+
+	return 0;
 }
 
 /* --------------------------------------------------------------------- */
@@ -699,6 +747,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 #define MEM_MASK	0x7f
 
+#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_32) >> 6))
+
 /* Other inp_flags. */
 
 /* Integer opertion and set flags -> requires exts on 64 bit systems. */
@@ -722,6 +772,9 @@ ALT_FORM1		0x001000
 ...
 ALT_FORM5		0x010000 */
 
+static sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 inp_flags, sljit_s32 reg,
+	sljit_s32 arg, sljit_sw argw, sljit_s32 tmp_reg);
+
 #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
 #include "sljitNativePPC_32.c"
 #else
@@ -737,16 +790,13 @@ ALT_FORM5		0x010000 */
 #endif
 
 #if (defined SLJIT_PPC_STACK_FRAME_V2 && SLJIT_PPC_STACK_FRAME_V2)
-#define LR_SAVE_OFFSET		2 * SSIZE_OF(sw)
+#define LR_SAVE_OFFSET		(2 * SSIZE_OF(sw))
 #else
 #define LR_SAVE_OFFSET		SSIZE_OF(sw)
 #endif
 
 #define STACK_MAX_DISTANCE	(0x8000 - SSIZE_OF(sw) - LR_SAVE_OFFSET)
 
-static sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 inp_flags, sljit_s32 reg,
-	sljit_s32 arg, sljit_sw argw, sljit_s32 tmp_reg);
-
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
 	sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,
 	sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
@@ -763,7 +813,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	set_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);
 
 	local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds - saved_arg_count, 0)
-		+ GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, sizeof(sljit_f64));
+		+ GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
 
 	if (!(options & SLJIT_ENTER_REG_ARG))
 		local_size += SSIZE_OF(sw);
@@ -873,7 +923,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	set_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);
 
 	local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds - SLJIT_KEPT_SAVEDS_COUNT(options), 0)
-		+ GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, sizeof(sljit_f64));
+		+ GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
 
 	if (!(options & SLJIT_ENTER_REG_ARG))
 		local_size += SSIZE_OF(sw);
@@ -1222,7 +1272,7 @@ static sljit_s32 emit_op(struct sljit_co
 		src1_r = src1;
 		flags |= REG1_SOURCE;
 	}
-	else if (src1 & SLJIT_IMM) {
+	else if (src1 == SLJIT_IMM) {
 		src1_r = TMP_ZERO;
 		if (src1w != 0) {
 			FAIL_IF(load_immediate(compiler, TMP_REG1, src1w));
@@ -1242,7 +1292,7 @@ static sljit_s32 emit_op(struct sljit_co
 		if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOV_P)
 			dst_r = src2_r;
 	}
-	else if (src2 & SLJIT_IMM) {
+	else if (src2 == SLJIT_IMM) {
 		src2_r = TMP_ZERO;
 		if (src2w != 0) {
 			FAIL_IF(load_immediate(compiler, sugg_src2_r, src2w));
@@ -1312,29 +1362,161 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
-static sljit_s32 emit_prefetch(struct sljit_compiler *compiler,
-        sljit_s32 src, sljit_sw srcw)
+static sljit_s32 emit_rev(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
 {
-	if (!(src & OFFS_REG_MASK)) {
-		if (srcw == 0 && (src & REG_MASK))
-			return push_inst(compiler, DCBT | A(0) | B(src & REG_MASK));
+	sljit_s32 mem, offs_reg, inp_flags;
+	sljit_sw memw;
+#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
+	sljit_s32 is_32 = op & SLJIT_32;
 
-		FAIL_IF(load_immediate(compiler, TMP_REG1, srcw));
-		/* Works with SLJIT_MEM0() case as well. */
-		return push_inst(compiler, DCBT | A(src & REG_MASK) | B(TMP_REG1));
+	op = GET_OPCODE(op);
+#endif /* SLJIT_CONFIG_PPC_64 */
+
+	if (!((dst | src) & SLJIT_MEM)) {
+		/* Both are registers. */
+		if (op == SLJIT_REV_U16 || op == SLJIT_REV_S16) {
+			if (src == dst) {
+				FAIL_IF(push_inst(compiler, RLWIMI | S(dst) | A(dst) | RLWI_SH(16) | RLWI_MBE(8, 15)));
+				FAIL_IF(push_inst(compiler, RLWINM | S(dst) | A(dst) | RLWI_SH(24) | RLWI_MBE(16, 31)));
+			} else {
+				FAIL_IF(push_inst(compiler, RLWINM | S(src) | A(dst) | RLWI_SH(8) | RLWI_MBE(16, 23)));
+				FAIL_IF(push_inst(compiler, RLWIMI | S(src) | A(dst) | RLWI_SH(24) | RLWI_MBE(24, 31)));
+			}
+
+			if (op == SLJIT_REV_U16)
+				return SLJIT_SUCCESS;
+			return push_inst(compiler, EXTSH | S(dst) | A(dst));
+		}
+
+#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
+		if (!is_32) {
+#if defined(_ARCH_PWR10) && _ARCH_PWR10
+			return push_inst(compiler, BRD | S(src) | A(dst));
+#else /* !POWER10 */
+			FAIL_IF(push_inst(compiler, ADDI | D(TMP_REG2) | A(0) | IMM(TMP_MEM_OFFSET_HI)));
+			FAIL_IF(push_inst(compiler, RLDICL | S(src) | A(TMP_REG1) | RLDI_SH(32) | RLDI_MB(32)));
+			FAIL_IF(push_inst(compiler, STWBRX | S(src) | A(SLJIT_SP) | B(TMP_REG2)));
+			FAIL_IF(push_inst(compiler, ADDI | D(TMP_REG2) | A(0) | IMM(TMP_MEM_OFFSET_LO)));
+			FAIL_IF(push_inst(compiler, STWBRX | S(TMP_REG1) | A(SLJIT_SP) | B(TMP_REG2)));
+			return push_inst(compiler, LD | D(dst) | A(SLJIT_SP) | TMP_MEM_OFFSET);
+#endif /* POWER10 */
+		}
+#endif /* SLJIT_CONFIG_PPC_64 */
+
+		FAIL_IF(push_inst(compiler, ADDI | D(TMP_REG2) | A(0) | IMM(TMP_MEM_OFFSET)));
+		FAIL_IF(push_inst(compiler, STWBRX | S(src) | A(SLJIT_SP) | B(TMP_REG2)));
+		FAIL_IF(push_inst(compiler, LWZ | D(dst) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+
+#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
+		if (op == SLJIT_REV_S32)
+			return push_inst(compiler, EXTSW | S(dst) | A(dst));
+#endif /* SLJIT_CONFIG_PPC_64 */
+		return SLJIT_SUCCESS;
 	}
 
-	srcw &= 0x3;
+	mem = src;
+	memw = srcw;
 
-	if (srcw == 0)
-		return push_inst(compiler, DCBT | A(src & REG_MASK) | B(OFFS_REG(src)));
+	if (dst & SLJIT_MEM) {
+		mem = dst;
+		memw = dstw;
 
-	FAIL_IF(push_inst(compiler, SLWI_W(srcw) | S(OFFS_REG(src)) | A(TMP_REG1)));
-	return push_inst(compiler, DCBT | A(src & REG_MASK) | B(TMP_REG1));
+		if (src & SLJIT_MEM) {
+			inp_flags = HALF_DATA | LOAD_DATA;
+
+			if (op != SLJIT_REV_U16 && op != SLJIT_REV_S16) {
+#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
+				inp_flags = (is_32 ? INT_DATA : WORD_DATA) | LOAD_DATA;
+#else /* !SLJIT_CONFIG_PPC_64 */
+				inp_flags = WORD_DATA | LOAD_DATA;
+#endif /* SLJIT_CONFIG_PPC_64 */
+			}
+
+			FAIL_IF(emit_op_mem(compiler, inp_flags, TMP_REG1, src, srcw, TMP_REG2));
+			src = TMP_REG1;
+		}
+	}
+
+	if (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) {
+		offs_reg = OFFS_REG(mem);
+		mem &= REG_MASK;
+		memw &= 0x3;
+
+		if (memw != 0) {
+			FAIL_IF(push_inst(compiler, SLWI_W(memw) | S(offs_reg) | A(TMP_REG2)));
+			offs_reg = TMP_REG2;
+		}
+#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
+	} else if (memw > 0x7fff7fffl || memw < -0x80000000l) {
+		FAIL_IF(load_immediate(compiler, TMP_REG2, memw));
+		offs_reg = TMP_REG2;
+		mem &= REG_MASK;
+#endif /* SLJIT_CONFIG_PPC_64 */
+	} else {
+		FAIL_IF(push_inst(compiler, ADDI | D(TMP_REG2) | A(mem & REG_MASK) | IMM(memw)));
+		if (memw > SIMM_MAX || memw < SIMM_MIN)
+			FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG2) | A(TMP_REG2) | IMM((memw + 0x8000) >> 16)));
+
+		mem = 0;
+		offs_reg = TMP_REG2;
+	}
+
+	if (op == SLJIT_REV_U16 || op == SLJIT_REV_S16) {
+		if (dst & SLJIT_MEM)
+			return push_inst(compiler, STHBRX | S(src) | A(mem) | B(offs_reg));
+
+		FAIL_IF(push_inst(compiler, LHBRX | S(dst) | A(mem) | B(offs_reg)));
+
+		if (op == SLJIT_REV_U16)
+			return SLJIT_SUCCESS;
+		return push_inst(compiler, EXTSH | S(dst) | A(dst));
+	}
+
+#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
+	if (!is_32) {
+		if (dst & SLJIT_MEM) {
+#if defined(_ARCH_PWR7) && _ARCH_PWR7
+			return push_inst(compiler, STDBRX | S(src) | A(mem) | B(offs_reg));
+#else /* !POWER7 */
+#if defined(SLJIT_LITTLE_ENDIAN) && SLJIT_LITTLE_ENDIAN
+			FAIL_IF(push_inst(compiler, RLDICL | S(src) | A(TMP_REG1) | RLDI_SH(32) | RLDI_MB(32)));
+			FAIL_IF(push_inst(compiler, STWBRX | S(TMP_REG1) | A(mem) | B(offs_reg)));
+			FAIL_IF(push_inst(compiler, ADDI | D(TMP_REG2) | A(offs_reg) | IMM(SSIZE_OF(s32))));
+			return push_inst(compiler, STWBRX | S(src) | A(mem) | B(TMP_REG2));
+#else /* !SLJIT_LITTLE_ENDIAN */
+			FAIL_IF(push_inst(compiler, STWBRX | S(src) | A(mem) | B(offs_reg)));
+			FAIL_IF(push_inst(compiler, RLDICL | S(src) | A(TMP_REG1) | RLDI_SH(32) | RLDI_MB(32)));
+			FAIL_IF(push_inst(compiler, ADDI | D(TMP_REG2) | A(offs_reg) | IMM(SSIZE_OF(s32))));
+			return push_inst(compiler, STWBRX | S(TMP_REG1) | A(mem) | B(TMP_REG2));
+#endif /* SLJIT_LITTLE_ENDIAN */
+#endif /* POWER7 */
+		}
+#if defined(_ARCH_PWR7) && _ARCH_PWR7
+		return push_inst(compiler, LDBRX | S(dst) | A(mem) | B(offs_reg));
+#else /* !POWER7 */
+		FAIL_IF(push_inst(compiler, LWBRX | LWBRX_FIRST_REG | A(mem) | B(offs_reg)));
+		FAIL_IF(push_inst(compiler, ADDI | D(TMP_REG2) | A(offs_reg) | IMM(SSIZE_OF(s32))));
+		FAIL_IF(push_inst(compiler, LWBRX | LWBRX_SECOND_REG | A(mem) | B(TMP_REG2)));
+		return push_inst(compiler, RLDIMI | S(TMP_REG1) | A(dst) | RLDI_SH(32) | RLDI_MB(0));
+#endif /* POWER7 */
+	}
+#endif /* SLJIT_CONFIG_PPC_64 */
+
+	if (dst & SLJIT_MEM)
+		return push_inst(compiler, STWBRX | S(src) | A(mem) | B(offs_reg));
+
+	FAIL_IF(push_inst(compiler, LWBRX | S(dst) | A(mem) | B(offs_reg)));
+#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
+	if (op == SLJIT_REV_S32)
+		return push_inst(compiler, EXTSW | S(dst) | A(dst));
+#endif /* SLJIT_CONFIG_PPC_64 */
+	return SLJIT_SUCCESS;
 }
 
 #define EMIT_MOV(type, type_flags, type_cast) \
-	emit_op(compiler, (src & SLJIT_IMM) ? SLJIT_MOV : type, flags | (type_flags), dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? type_cast srcw : srcw)
+	emit_op(compiler, (src == SLJIT_IMM) ? SLJIT_MOV : type, flags | (type_flags), dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? type_cast srcw : srcw)
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
 	sljit_s32 dst, sljit_sw dstw,
@@ -1353,19 +1535,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	if (GET_FLAG_TYPE(op_flags) == SLJIT_OVERFLOW)
 		FAIL_IF(push_inst(compiler, MTXER | S(TMP_ZERO)));
 
-	if (op < SLJIT_NOT && FAST_IS_REG(src) && src == dst) {
+	if (op <= SLJIT_MOV_P && FAST_IS_REG(src) && src == dst) {
 		if (!TYPE_CAST_NEEDED(op))
 			return SLJIT_SUCCESS;
 	}
 
 #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
 	if (op_flags & SLJIT_32) {
-		if (op < SLJIT_NOT) {
+		if (op <= SLJIT_MOV_P) {
 			if (src & SLJIT_MEM) {
 				if (op == SLJIT_MOV_S32)
 					op = SLJIT_MOV_U32;
 			}
-			else if (src & SLJIT_IMM) {
+			else if (src == SLJIT_IMM) {
 				if (op == SLJIT_MOV_U32)
 					op = SLJIT_MOV_S32;
 			}
@@ -1410,16 +1592,26 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	case SLJIT_MOV_S16:
 		return EMIT_MOV(SLJIT_MOV_S16, HALF_DATA | SIGNED_DATA, (sljit_s16));
 
-	case SLJIT_NOT:
-		return emit_op(compiler, SLJIT_NOT, flags, dst, dstw, TMP_REG1, 0, src, srcw);
-
 	case SLJIT_CLZ:
 	case SLJIT_CTZ:
 #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
-		return emit_op(compiler, op, flags | (!(op_flags & SLJIT_32) ? 0 : ALT_FORM1), dst, dstw, TMP_REG1, 0, src, srcw);
-#else
+		if (op_flags & SLJIT_32)
+			flags |= ALT_FORM1;
+#endif /* SLJIT_CONFIG_PPC_64 */
 		return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw);
-#endif
+	case SLJIT_REV_U32:
+	case SLJIT_REV_S32:
+#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
+		op |= SLJIT_32;
+#endif /* SLJIT_CONFIG_PPC_64 */
+		/* fallthrough */
+	case SLJIT_REV:
+	case SLJIT_REV_U16:
+	case SLJIT_REV_S16:
+#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
+		op |= (op_flags & SLJIT_32);
+#endif /* SLJIT_CONFIG_PPC_64 */
+		return emit_rev(compiler, op, dst, dstw, src, srcw);
 	}
 
 	return SLJIT_SUCCESS;
@@ -1427,40 +1619,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 #undef EMIT_MOV
 
+/* Macros for checking different operand types / values. */
 #define TEST_SL_IMM(src, srcw) \
-	(((src) & SLJIT_IMM) && (srcw) <= SIMM_MAX && (srcw) >= SIMM_MIN)
-
+	((src) == SLJIT_IMM && (srcw) <= SIMM_MAX && (srcw) >= SIMM_MIN)
 #define TEST_UL_IMM(src, srcw) \
-	(((src) & SLJIT_IMM) && !((srcw) & ~0xffff))
-
-#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
-#define TEST_SH_IMM(src, srcw) \
-	(((src) & SLJIT_IMM) && !((srcw) & 0xffff) && (srcw) <= 0x7fffffffl && (srcw) >= -0x80000000l)
-#else
-#define TEST_SH_IMM(src, srcw) \
-	(((src) & SLJIT_IMM) && !((srcw) & 0xffff))
-#endif
-
+	((src) == SLJIT_IMM && !((srcw) & ~0xffff))
 #define TEST_UH_IMM(src, srcw) \
-	(((src) & SLJIT_IMM) && !((srcw) & ~(sljit_sw)0xffff0000))
+	((src) == SLJIT_IMM && !((srcw) & ~(sljit_sw)0xffff0000))
 
 #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
+#define TEST_SH_IMM(src, srcw) \
+	((src) == SLJIT_IMM && !((srcw) & 0xffff) && (srcw) <= 0x7fffffffl && (srcw) >= -0x80000000l)
 #define TEST_ADD_IMM(src, srcw) \
-	(((src) & SLJIT_IMM) && (srcw) <= 0x7fff7fffl && (srcw) >= -0x80000000l)
-#else
-#define TEST_ADD_IMM(src, srcw) \
-	((src) & SLJIT_IMM)
-#endif
-
-#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
-#define TEST_UI_IMM(src, srcw) \
-	(((src) & SLJIT_IMM) && !((srcw) & ~0xffffffff))
-#else
+	((src) == SLJIT_IMM && (srcw) <= 0x7fff7fffl && (srcw) >= -0x80000000l)
 #define TEST_UI_IMM(src, srcw) \
-	((src) & SLJIT_IMM)
-#endif
+	((src) == SLJIT_IMM && !((srcw) & ~0xffffffff))
 
-#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
 #define TEST_ADD_FORM1(op) \
 	(GET_FLAG_TYPE(op) == SLJIT_OVERFLOW \
 		|| (op & (SLJIT_32 | SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_32 | SLJIT_SET_Z | SLJIT_SET_CARRY))
@@ -1470,14 +1644,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #define TEST_SUB_FORM3(op) \
 	(GET_FLAG_TYPE(op) == SLJIT_OVERFLOW \
 		|| (op & (SLJIT_32 | SLJIT_SET_Z)) == (SLJIT_32 | SLJIT_SET_Z))
-#else
+
+#else /* !SLJIT_CONFIG_PPC_64 */
+#define TEST_SH_IMM(src, srcw) \
+	((src) == SLJIT_IMM && !((srcw) & 0xffff))
+#define TEST_ADD_IMM(src, srcw) \
+	((src) == SLJIT_IMM)
+#define TEST_UI_IMM(src, srcw) \
+	((src) == SLJIT_IMM)
+
 #define TEST_ADD_FORM1(op) \
 	(GET_FLAG_TYPE(op) == SLJIT_OVERFLOW)
 #define TEST_SUB_FORM2(op) \
 	(GET_FLAG_TYPE(op) >= SLJIT_SIG_LESS && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL)
 #define TEST_SUB_FORM3(op) \
 	(GET_FLAG_TYPE(op) == SLJIT_OVERFLOW)
-#endif
+#endif /* SLJIT_CONFIG_PPC_64 */
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,
 	sljit_s32 dst, sljit_sw dstw,
@@ -1496,9 +1678,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	if (op & SLJIT_32) {
 		/* Most operations expect sign extended arguments. */
 		flags |= INT_DATA | SIGNED_DATA;
-		if (src1 & SLJIT_IMM)
+		if (src1 == SLJIT_IMM)
 			src1w = (sljit_s32)(src1w);
-		if (src2 & SLJIT_IMM)
+		if (src2 == SLJIT_IMM)
 			src2w = (sljit_s32)(src2w);
 		if (HAS_FLAGS(op))
 			flags |= ALT_SIGN_EXT;
@@ -1514,7 +1696,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		if (TEST_ADD_FORM1(op))
 			return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM1, dst, dstw, src1, src1w, src2, src2w);
 
-		if (!HAS_FLAGS(op) && ((src1 | src2) & SLJIT_IMM)) {
+		if (!HAS_FLAGS(op) && (src1 == SLJIT_IMM || src2 == SLJIT_IMM)) {
 			if (TEST_SL_IMM(src2, src2w)) {
 				compiler->imm = (sljit_ins)src2w & 0xffff;
 				return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2, dst, dstw, src1, src1w, TMP_REG2, 0);
@@ -1565,7 +1747,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 				return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM3, dst, dstw, src2, src2w, TMP_REG2, 0);
 			}
 		}
-		return emit_op(compiler, SLJIT_ADD, flags | ((GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)) ? ALT_FORM5 : 0), dst, dstw, src1, src1w, src2, src2w);
+		return emit_op(compiler, SLJIT_ADD, flags | ((GET_FLAG_TYPE(op) == SLJIT_CARRY) ? ALT_FORM5 : 0), dst, dstw, src1, src1w, src2, src2w);
 
 	case SLJIT_ADDC:
 		compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD;
@@ -1583,7 +1765,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 				return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM1, dst, dstw, src1, src1w, src2, src2w);
 			}
 
-			if ((src2 & SLJIT_IMM) && src2w >= 0 && src2w <= (SIMM_MAX + 1)) {
+			if (src2 == SLJIT_IMM && src2w >= 0 && src2w <= (SIMM_MAX + 1)) {
 				compiler->imm = (sljit_ins)src2w;
 				return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM1 | ALT_FORM2 | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0);
 			}
@@ -1599,7 +1781,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		}
 
 		if (TEST_SUB_FORM2(op)) {
-			if ((src2 & SLJIT_IMM) && src2w >= -SIMM_MAX && src2w <= SIMM_MAX) {
+			if (src2 == SLJIT_IMM && src2w >= -SIMM_MAX && src2w <= SIMM_MAX) {
 				compiler->imm = (sljit_ins)src2w & 0xffff;
 				return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2 | ALT_FORM3 | ALT_FORM4, dst, dstw, src1, src1w, TMP_REG2, 0);
 			}
@@ -1632,7 +1814,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		}
 
 		/* We know ALT_SIGN_EXT is set if it is an SLJIT_32 on 64 bit systems. */
-		return emit_op(compiler, SLJIT_SUB, flags | ((GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)) ? ALT_FORM5 : 0), dst, dstw, src1, src1w, src2, src2w);
+		return emit_op(compiler, SLJIT_SUB, flags | ((GET_FLAG_TYPE(op) == SLJIT_CARRY) ? ALT_FORM5 : 0), dst, dstw, src1, src1w, src2, src2w);
 
 	case SLJIT_SUBC:
 		compiler->status_flags_state = SLJIT_CURRENT_FLAGS_SUB;
@@ -1657,9 +1839,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			FAIL_IF(push_inst(compiler, MTXER | S(TMP_ZERO)));
 		return emit_op(compiler, SLJIT_MUL, flags, dst, dstw, src1, src1w, src2, src2w);
 
+	case SLJIT_XOR:
+		if (src2 == SLJIT_IMM && src2w == -1) {
+			return emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM4, dst, dstw, TMP_REG1, 0, src1, src1w);
+		}
+		if (src1 == SLJIT_IMM && src1w == -1) {
+			return emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM4, dst, dstw, TMP_REG1, 0, src2, src2w);
+		}
+		/* fallthrough */
 	case SLJIT_AND:
 	case SLJIT_OR:
-	case SLJIT_XOR:
 		/* Commutative unsigned operations. */
 		if (!HAS_FLAGS(op) || GET_OPCODE(op) == SLJIT_AND) {
 			if (TEST_UL_IMM(src2, src2w)) {
@@ -1704,7 +1893,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		if (op & SLJIT_32)
 			flags |= ALT_FORM2;
 #endif
-		if (src2 & SLJIT_IMM) {
+		if (src2 == SLJIT_IMM) {
 			compiler->imm = (sljit_ins)src2w;
 			return emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM1, dst, dstw, src1, src1w, TMP_REG2, 0);
 		}
@@ -1730,9 +1919,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #undef TEST_SUB_FORM3
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 src_dst,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w)
+	sljit_s32 dst_reg,
+	sljit_s32 src1_reg,
+	sljit_s32 src2_reg,
+	sljit_s32 src3, sljit_sw src3w)
 {
 	sljit_s32 is_right;
 #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
@@ -1744,85 +1934,97 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #endif /* SLJIT_CONFIG_PPC_64 */
 
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_shift_into(compiler, op, src_dst, src1, src1w, src2, src2w));
+	CHECK(check_sljit_emit_shift_into(compiler, op, dst_reg, src1_reg, src2_reg, src3, src3w));
 
 	is_right = (GET_OPCODE(op) == SLJIT_LSHR || GET_OPCODE(op) == SLJIT_MLSHR);
 
-	if (src_dst == src1) {
+	if (src1_reg == src2_reg) {
 		SLJIT_SKIP_CHECKS(compiler);
-		return sljit_emit_op2(compiler, (is_right ? SLJIT_ROTR : SLJIT_ROTL) | (op & SLJIT_32), src_dst, 0, src_dst, 0, src2, src2w);
+		return sljit_emit_op2(compiler, (is_right ? SLJIT_ROTR : SLJIT_ROTL) | (op & SLJIT_32), dst_reg, 0, src1_reg, 0, src3, src3w);
 	}
 
-	ADJUST_LOCAL_OFFSET(src1, src1w);
-	ADJUST_LOCAL_OFFSET(src2, src2w);
+	ADJUST_LOCAL_OFFSET(src3, src3w);
 
-	if (src2 & SLJIT_IMM) {
-		src2w &= bit_length - 1;
+	if (src3 == SLJIT_IMM) {
+		src3w &= bit_length - 1;
 
-		if (src2w == 0)
+		if (src3w == 0)
 			return SLJIT_SUCCESS;
-	} else if (src2 & SLJIT_MEM) {
-		FAIL_IF(emit_op_mem(compiler, inp_flags, TMP_REG2, src2, src2w, TMP_REG2));
-		src2 = TMP_REG2;
-	}
-
-	if (src1 & SLJIT_MEM) {
-		FAIL_IF(emit_op_mem(compiler, inp_flags, TMP_REG1, src1, src1w, TMP_REG1));
-		src1 = TMP_REG1;
-	} else if (src1 & SLJIT_IMM) {
-		FAIL_IF(load_immediate(compiler, TMP_REG1, src1w));
-		src1 = TMP_REG1;
-	}
 
-	if (src2 & SLJIT_IMM) {
 #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
 		if (!(op & SLJIT_32)) {
 			if (is_right) {
-				FAIL_IF(push_inst(compiler, SRDI(src2w) | S(src_dst) | A(src_dst)));
-				return push_inst(compiler, RLDIMI | S(src1) | A(src_dst) | RLDI_SH(64 - src2w) | RLDI_MB(0));
+				FAIL_IF(push_inst(compiler, SRDI(src3w) | S(src1_reg) | A(dst_reg)));
+				return push_inst(compiler, RLDIMI | S(src2_reg) | A(dst_reg) | RLDI_SH(64 - src3w) | RLDI_MB(0));
 			}
 
-			FAIL_IF(push_inst(compiler, SLDI(src2w) | S(src_dst) | A(src_dst)));
+			FAIL_IF(push_inst(compiler, SLDI(src3w) | S(src1_reg) | A(dst_reg)));
 			/* Computes SRDI(64 - src2w). */
-			FAIL_IF(push_inst(compiler, RLDICL | S(src1) | A(TMP_REG1) | RLDI_SH(src2w) | RLDI_MB(64 - src2w)));
-			return push_inst(compiler, OR | S(src_dst) | A(src_dst) | B(TMP_REG1));
+			FAIL_IF(push_inst(compiler, RLDICL | S(src2_reg) | A(TMP_REG1) | RLDI_SH(src3w) | RLDI_MB(64 - src3w)));
+			return push_inst(compiler, OR | S(dst_reg) | A(dst_reg) | B(TMP_REG1));
 		}
 #endif /* SLJIT_CONFIG_PPC_64 */
 
 		if (is_right) {
-			FAIL_IF(push_inst(compiler, SRWI(src2w) | S(src_dst) | A(src_dst)));
-			return push_inst(compiler, RLWIMI | S(src1) | A(src_dst) | RLWI_SH(32 - src2w) | RLWI_MBE(0, src2w - 1));
+			FAIL_IF(push_inst(compiler, SRWI(src3w) | S(src1_reg) | A(dst_reg)));
+			return push_inst(compiler, RLWIMI | S(src2_reg) | A(dst_reg) | RLWI_SH(32 - src3w) | RLWI_MBE(0, src3w - 1));
 		}
 
-		FAIL_IF(push_inst(compiler, SLWI(src2w) | S(src_dst) | A(src_dst)));
-		return push_inst(compiler, RLWIMI | S(src1) | A(src_dst) | RLWI_SH(src2w) | RLWI_MBE(32 - src2w, 31));
+		FAIL_IF(push_inst(compiler, SLWI(src3w) | S(src1_reg) | A(dst_reg)));
+		return push_inst(compiler, RLWIMI | S(src2_reg) | A(dst_reg) | RLWI_SH(src3w) | RLWI_MBE(32 - src3w, 31));
+	}
+
+	if (src3 & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem(compiler, inp_flags, TMP_REG2, src3, src3w, TMP_REG2));
+		src3 = TMP_REG2;
 	}
 
 #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
 	if (!(op & SLJIT_32)) {
-		if (GET_OPCODE(op) == SLJIT_MSHL || GET_OPCODE(op) == SLJIT_MLSHR) {
-			FAIL_IF(push_inst(compiler, ANDI | S(src2) | A(TMP_REG2) | 0x3f));
-			src2 = TMP_REG2;
+		if (GET_OPCODE(op) == SLJIT_MSHL || GET_OPCODE(op) == SLJIT_MLSHR || dst_reg == src3) {
+			FAIL_IF(push_inst(compiler, ANDI | S(src3) | A(TMP_REG2) | 0x3f));
+			src3 = TMP_REG2;
 		}
 
-		FAIL_IF(push_inst(compiler, (is_right ? SRD : SLD) | S(src_dst) | A(src_dst) | B(src2)));
-		FAIL_IF(push_inst(compiler, (is_right ? SLDI(1) : SRDI(1)) | S(src1) | A(TMP_REG1)));
-		FAIL_IF(push_inst(compiler, XORI | S(src2) | A(TMP_REG2) | 0x3f));
+		FAIL_IF(push_inst(compiler, (is_right ? SRD : SLD) | S(src1_reg) | A(dst_reg) | B(src3)));
+		FAIL_IF(push_inst(compiler, (is_right ? SLDI(1) : SRDI(1)) | S(src2_reg) | A(TMP_REG1)));
+		FAIL_IF(push_inst(compiler, XORI | S(src3) | A(TMP_REG2) | 0x3f));
 		FAIL_IF(push_inst(compiler, (is_right ? SLD : SRD) | S(TMP_REG1) | A(TMP_REG1) | B(TMP_REG2)));
-		return push_inst(compiler, OR | S(src_dst) | A(src_dst) | B(TMP_REG1));
+		return push_inst(compiler, OR | S(dst_reg) | A(dst_reg) | B(TMP_REG1));
 	}
 #endif /* SLJIT_CONFIG_PPC_64 */
 
-	if (GET_OPCODE(op) == SLJIT_MSHL || GET_OPCODE(op) == SLJIT_MLSHR) {
-		FAIL_IF(push_inst(compiler, ANDI | S(src2) | A(TMP_REG2) | 0x1f));
-		src2 = TMP_REG2;
+	if (GET_OPCODE(op) == SLJIT_MSHL || GET_OPCODE(op) == SLJIT_MLSHR || dst_reg == src3) {
+		FAIL_IF(push_inst(compiler, ANDI | S(src3) | A(TMP_REG2) | 0x1f));
+		src3 = TMP_REG2;
 	}
 
-	FAIL_IF(push_inst(compiler, (is_right ? SRW : SLW) | S(src_dst) | A(src_dst) | B(src2)));
-	FAIL_IF(push_inst(compiler, (is_right ? SLWI(1) : SRWI(1)) | S(src1) | A(TMP_REG1)));
-	FAIL_IF(push_inst(compiler, XORI | S(src2) | A(TMP_REG2) | 0x1f));
+	FAIL_IF(push_inst(compiler, (is_right ? SRW : SLW) | S(src1_reg) | A(dst_reg) | B(src3)));
+	FAIL_IF(push_inst(compiler, (is_right ? SLWI(1) : SRWI(1)) | S(src2_reg) | A(TMP_REG1)));
+	FAIL_IF(push_inst(compiler, XORI | S(src3) | A(TMP_REG2) | 0x1f));
 	FAIL_IF(push_inst(compiler, (is_right ? SLW : SRW) | S(TMP_REG1) | A(TMP_REG1) | B(TMP_REG2)));
-	return push_inst(compiler, OR | S(src_dst) | A(src_dst) | B(TMP_REG1));
+	return push_inst(compiler, OR | S(dst_reg) | A(dst_reg) | B(TMP_REG1));
+}
+
+static sljit_s32 emit_prefetch(struct sljit_compiler *compiler,
+        sljit_s32 src, sljit_sw srcw)
+{
+	if (!(src & OFFS_REG_MASK)) {
+		if (srcw == 0 && (src & REG_MASK))
+			return push_inst(compiler, DCBT | A(0) | B(src & REG_MASK));
+
+		FAIL_IF(load_immediate(compiler, TMP_REG1, srcw));
+		/* Works with SLJIT_MEM0() case as well. */
+		return push_inst(compiler, DCBT | A(src & REG_MASK) | B(TMP_REG1));
+	}
+
+	srcw &= 0x3;
+
+	if (srcw == 0)
+		return push_inst(compiler, DCBT | A(src & REG_MASK) | B(OFFS_REG(src)));
+
+	FAIL_IF(push_inst(compiler, SLWI_W(srcw) | S(OFFS_REG(src)) | A(TMP_REG1)));
+	return push_inst(compiler, DCBT | A(src & REG_MASK) | B(TMP_REG1));
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
@@ -1854,21 +2056,52 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw)
 {
-	CHECK_REG_INDEX(check_sljit_get_register_index(reg));
-	return reg_map[reg];
+	sljit_s32 dst_r;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_op_dst(compiler, op, dst, dstw));
+	ADJUST_LOCAL_OFFSET(dst, dstw);
+
+	switch (op) {
+	case SLJIT_FAST_ENTER:
+		if (FAST_IS_REG(dst))
+			return push_inst(compiler, MFLR | D(dst));
+
+		FAIL_IF(push_inst(compiler, MFLR | D(TMP_REG1)));
+		break;
+	case SLJIT_GET_RETURN_ADDRESS:
+		dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
+		FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, dst_r, SLJIT_MEM1(SLJIT_SP), compiler->local_size + LR_SAVE_OFFSET, TMP_REG2));
+		break;
+	}
+
+	if (dst & SLJIT_MEM)
+		return emit_op_mem(compiler, WORD_DATA, TMP_REG1, dst, dstw, TMP_REG2);
+
+	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg)
 {
-	CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
+	CHECK_REG_INDEX(check_sljit_get_register_index(type, reg));
+
+	if (type == SLJIT_GP_REGISTER)
+		return reg_map[reg];
+
+	if (type != SLJIT_FLOAT_REGISTER)
+		return -1;
+
 	return freg_map[reg];
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
 	void *instruction, sljit_u32 size)
 {
+	SLJIT_UNUSED_ARG(size);
+
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
 
@@ -1879,24 +2112,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 /*  Floating point operators                                             */
 /* --------------------------------------------------------------------- */
 
-#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_32) >> 6))
 #define SELECT_FOP(op, single, double) ((sljit_ins)((op & SLJIT_32) ? single : double))
 
-#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
-#define FLOAT_TMP_MEM_OFFSET (6 * sizeof(sljit_sw))
-#else
-#define FLOAT_TMP_MEM_OFFSET (2 * sizeof(sljit_sw))
-
-#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
-#define FLOAT_TMP_MEM_OFFSET_LOW (2 * sizeof(sljit_sw))
-#define FLOAT_TMP_MEM_OFFSET_HI (3 * sizeof(sljit_sw))
-#else
-#define FLOAT_TMP_MEM_OFFSET_LOW (3 * sizeof(sljit_sw))
-#define FLOAT_TMP_MEM_OFFSET_HI (2 * sizeof(sljit_sw))
-#endif
-
-#endif /* SLJIT_CONFIG_PPC_64 */
-
 static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 src, sljit_sw srcw)
@@ -1913,19 +2130,19 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 
 	if (op == SLJIT_CONV_SW_FROM_F64) {
 		if (FAST_IS_REG(dst)) {
-			FAIL_IF(emit_op_mem(compiler, DOUBLE_DATA, TMP_FREG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1));
-			return emit_op_mem(compiler, WORD_DATA | LOAD_DATA, dst, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1);
+			FAIL_IF(push_inst(compiler, STFD | FS(TMP_FREG1) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+			return push_inst(compiler, LD | S(dst) | A(SLJIT_SP) | TMP_MEM_OFFSET);
 		}
 		return emit_op_mem(compiler, DOUBLE_DATA, TMP_FREG1, dst, dstw, TMP_REG1);
 	}
-#else
+#else /* !SLJIT_CONFIG_PPC_64 */
 	FAIL_IF(push_inst(compiler, FCTIWZ | FD(TMP_FREG1) | FB(src)));
-#endif
+#endif /* SLJIT_CONFIG_PPC_64 */
 
 	if (FAST_IS_REG(dst)) {
-		FAIL_IF(load_immediate(compiler, TMP_REG1, FLOAT_TMP_MEM_OFFSET));
+		FAIL_IF(load_immediate(compiler, TMP_REG1, TMP_MEM_OFFSET));
 		FAIL_IF(push_inst(compiler, STFIWX | FS(TMP_FREG1) | A(SLJIT_SP) | B(TMP_REG1)));
-		return emit_op_mem(compiler, INT_DATA | LOAD_DATA, dst, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1);
+		return push_inst(compiler, LWZ | S(dst) | A(SLJIT_SP) | TMP_MEM_OFFSET);
 	}
 
 	SLJIT_ASSERT(dst & SLJIT_MEM);
@@ -1935,16 +2152,14 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 		if (dstw) {
 			FAIL_IF(push_inst(compiler, SLWI_W(dstw) | S(OFFS_REG(dst)) | A(TMP_REG1)));
 			dstw = TMP_REG1;
-		}
-		else
+		} else
 			dstw = OFFS_REG(dst);
 	}
 	else {
 		if ((dst & REG_MASK) && !dstw) {
 			dstw = dst & REG_MASK;
 			dst = 0;
-		}
-		else {
+		} else {
 			/* This works regardless we have SLJIT_MEM1 or SLJIT_MEM0. */
 			FAIL_IF(load_immediate(compiler, TMP_REG1, dstw));
 			dstw = TMP_REG1;
@@ -1954,85 +2169,6 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 	return push_inst(compiler, STFIWX | FS(TMP_FREG1) | A(dst & REG_MASK) | B(dstw));
 }
 
-static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 dst, sljit_sw dstw,
-	sljit_s32 src, sljit_sw srcw)
-{
-#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
-
-	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
-
-	if (src & SLJIT_IMM) {
-		if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)
-			srcw = (sljit_s32)srcw;
-
-		FAIL_IF(load_immediate(compiler, TMP_REG1, srcw));
-		src = TMP_REG1;
-	}
-	else if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) {
-		if (FAST_IS_REG(src))
-			FAIL_IF(push_inst(compiler, EXTSW | S(src) | A(TMP_REG1)));
-		else
-			FAIL_IF(emit_op_mem(compiler, INT_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1));
-		src = TMP_REG1;
-	}
-
-	if (FAST_IS_REG(src)) {
-		FAIL_IF(emit_op_mem(compiler, WORD_DATA, src, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1));
-		FAIL_IF(emit_op_mem(compiler, DOUBLE_DATA | LOAD_DATA, TMP_FREG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1));
-	}
-	else
-		FAIL_IF(emit_op_mem(compiler, DOUBLE_DATA | LOAD_DATA, TMP_FREG1, src, srcw, TMP_REG1));
-
-	FAIL_IF(push_inst(compiler, FCFID | FD(dst_r) | FB(TMP_FREG1)));
-
-	if (dst & SLJIT_MEM)
-		return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1);
-	if (op & SLJIT_32)
-		return push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r));
-	return SLJIT_SUCCESS;
-
-#else
-
-	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
-	sljit_s32 invert_sign = 1;
-
-	if (src & SLJIT_IMM) {
-		FAIL_IF(load_immediate(compiler, TMP_REG1, srcw ^ (sljit_sw)0x80000000));
-		src = TMP_REG1;
-		invert_sign = 0;
-	}
-	else if (!FAST_IS_REG(src)) {
-		FAIL_IF(emit_op_mem(compiler, WORD_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1));
-		src = TMP_REG1;
-	}
-
-	/* First, a special double floating point value is constructed: (2^53 + (input xor (2^31)))
-	   The double precision format has exactly 53 bit precision, so the lower 32 bit represents
-	   the lower 32 bit of such value. The result of xor 2^31 is the same as adding 0x80000000
-	   to the input, which shifts it into the 0 - 0xffffffff range. To get the converted floating
-	   point value, we need to subtract 2^53 + 2^31 from the constructed value. */
-	FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG2) | A(0) | 0x4330));
-	if (invert_sign)
-		FAIL_IF(push_inst(compiler, XORIS | S(src) | A(TMP_REG1) | 0x8000));
-	FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG2, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET_HI, TMP_REG1));
-	FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET_LOW, TMP_REG2));
-	FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG1) | A(0) | 0x8000));
-	FAIL_IF(emit_op_mem(compiler, DOUBLE_DATA | LOAD_DATA, TMP_FREG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1));
-	FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET_LOW, TMP_REG2));
-	FAIL_IF(emit_op_mem(compiler, DOUBLE_DATA | LOAD_DATA, TMP_FREG2, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1));
-
-	FAIL_IF(push_inst(compiler, FSUB | FD(dst_r) | FA(TMP_FREG1) | FB(TMP_FREG2)));
-
-	if (dst & SLJIT_MEM)
-		return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1);
-	if (op & SLJIT_32)
-		return push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r));
-	return SLJIT_SUCCESS;
-
-#endif
-}
-
 static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,
 	sljit_s32 src1, sljit_sw src1w,
 	sljit_s32 src2, sljit_sw src2w)
@@ -2051,13 +2187,10 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 
 	switch (GET_FLAG_TYPE(op)) {
 	case SLJIT_UNORDERED_OR_EQUAL:
-	case SLJIT_ORDERED_NOT_EQUAL:
 		return push_inst(compiler, CROR | ((4 + 2) << 21) | ((4 + 2) << 16) | ((4 + 3) << 11));
 	case SLJIT_UNORDERED_OR_LESS:
-	case SLJIT_ORDERED_GREATER_EQUAL:
 		return push_inst(compiler, CROR | ((4 + 0) << 21) | ((4 + 0) << 16) | ((4 + 3) << 11));
 	case SLJIT_UNORDERED_OR_GREATER:
-	case SLJIT_ORDERED_LESS_EQUAL:
 		return push_inst(compiler, CROR | ((4 + 1) << 21) | ((4 + 1) << 16) | ((4 + 3) << 11));
 	}
 
@@ -2143,18 +2276,30 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	case SLJIT_ADD_F64:
 		FAIL_IF(push_inst(compiler, SELECT_FOP(op, FADDS, FADD) | FD(dst_r) | FA(src1) | FB(src2)));
 		break;
-
 	case SLJIT_SUB_F64:
 		FAIL_IF(push_inst(compiler, SELECT_FOP(op, FSUBS, FSUB) | FD(dst_r) | FA(src1) | FB(src2)));
 		break;
-
 	case SLJIT_MUL_F64:
 		FAIL_IF(push_inst(compiler, SELECT_FOP(op, FMULS, FMUL) | FD(dst_r) | FA(src1) | FC(src2) /* FMUL use FC as src2 */));
 		break;
-
 	case SLJIT_DIV_F64:
 		FAIL_IF(push_inst(compiler, SELECT_FOP(op, FDIVS, FDIV) | FD(dst_r) | FA(src1) | FB(src2)));
 		break;
+	case SLJIT_COPYSIGN_F64:
+		FAIL_IF(push_inst(compiler, ((op & SLJIT_32) ? STFS : STFD) | FS(src2) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
+		FAIL_IF(push_inst(compiler, LWZ | S(TMP_REG1) | A(SLJIT_SP) | ((op & SLJIT_32) ? TMP_MEM_OFFSET : TMP_MEM_OFFSET_HI)));
+#else /* !SLJIT_CONFIG_PPC_32 */
+		FAIL_IF(push_inst(compiler, ((op & SLJIT_32) ? LWZ : LD) | S(TMP_REG1) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+#endif /* SLJIT_CONFIG_PPC_32 */
+		FAIL_IF(push_inst(compiler, FABS | FD(dst_r) | FB(src1)));
+#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
+		FAIL_IF(push_inst(compiler, CMPI | CRD(0) | A(TMP_REG1) | 0));
+#else /* !SLJIT_CONFIG_PPC_32 */
+		FAIL_IF(push_inst(compiler, CMPI | CRD(0 | ((op & SLJIT_32) ? 0 : 1)) | A(TMP_REG1) | 0));
+#endif /* SLJIT_CONFIG_PPC_32 */
+		FAIL_IF(push_inst(compiler, BCx | (4 << 21) | (0 << 16) | 8));
+		return push_inst(compiler, FNEG | FD(dst_r) | FB(dst_r));
 	}
 
 	if (dst & SLJIT_MEM)
@@ -2165,22 +2310,24 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 #undef SELECT_FOP
 
-/* --------------------------------------------------------------------- */
-/*  Other instructions                                                   */
-/* --------------------------------------------------------------------- */
-
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f32 value)
 {
+	union {
+		sljit_s32 imm;
+		sljit_f32 value;
+	} u;
+
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
-	ADJUST_LOCAL_OFFSET(dst, dstw);
+	CHECK(check_sljit_emit_fset32(compiler, freg, value));
+
+	u.value = value;
 
-	if (FAST_IS_REG(dst))
-		return push_inst(compiler, MFLR | D(dst));
+	if (u.imm != 0)
+		FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm));
 
-	/* Memory. */
-	FAIL_IF(push_inst(compiler, MFLR | D(TMP_REG2)));
-	return emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0);
+	FAIL_IF(push_inst(compiler, STW | S(u.imm != 0 ? TMP_REG1 : TMP_ZERO) | A(SLJIT_SP) | TMP_MEM_OFFSET));
+	return push_inst(compiler, LFS | FS(freg) | A(SLJIT_SP) | TMP_MEM_OFFSET);
 }
 
 /* --------------------------------------------------------------------- */
@@ -2303,7 +2450,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 	set_jump(jump, compiler, (sljit_u32)type & SLJIT_REWRITABLE_JUMP);
 	type &= 0xff;
 
-	if (type == SLJIT_CARRY || type == SLJIT_NOT_CARRY)
+	if ((type | 0x1) == SLJIT_NOT_CARRY)
 		PTR_FAIL_IF(push_inst(compiler, ADDE | RC(ALT_SET_FLAGS) | D(TMP_REG1) | A(TMP_ZERO) | B(TMP_ZERO)));
 
 	/* In PPC, we don't need to touch the arguments. */
@@ -2324,6 +2471,8 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 arg_types)
 {
+	SLJIT_UNUSED_ARG(arg_types);
+
 	CHECK_ERROR_PTR();
 	CHECK_PTR(check_sljit_emit_call(compiler, type, arg_types));
 
@@ -2360,7 +2509,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #else /* SLJIT_PASS_ENTRY_ADDR_TO_CALL */
 		src_r = src;
 #endif /* SLJIT_PASS_ENTRY_ADDR_TO_CALL */
-	} else if (src & SLJIT_IMM) {
+	} else if (src == SLJIT_IMM) {
 		/* These jumps are converted to jump/call instructions when possible. */
 		jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
 		FAIL_IF(!jump);
@@ -2390,6 +2539,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	sljit_s32 arg_types,
 	sljit_s32 src, sljit_sw srcw)
 {
+	SLJIT_UNUSED_ARG(arg_types);
+
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw));
 
@@ -2572,14 +2723,106 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return sljit_emit_op2(compiler, saved_op, dst, 0, dst, 0, TMP_REG2, 0);
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 dst_reg,
-	sljit_s32 src, sljit_sw srcw)
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_reg)
+{
+	sljit_ins *ptr;
+	sljit_uw size;
+#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
+	sljit_s32 inp_flags = ((type & SLJIT_32) ? INT_DATA : WORD_DATA) | LOAD_DATA;
+#else /* !SLJIT_CONFIG_PPC_64 */
+        sljit_s32 inp_flags = WORD_DATA | LOAD_DATA;
+#endif /* SLJIT_CONFIG_PPC_64 */
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg));
+
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+
+	if (dst_reg != src2_reg) {
+		if (dst_reg == src1) {
+				src1 = src2_reg;
+				src1w = 0;
+				type ^= 0x1;
+		} else {
+			if (ADDRESSING_DEPENDS_ON(src1, dst_reg)) {
+				FAIL_IF(push_inst(compiler, OR | S(dst_reg) | A(TMP_REG2) | B(dst_reg)));
+
+				if ((src1 & REG_MASK) == dst_reg)
+					src1 = (src1 & ~REG_MASK) | TMP_REG2;
+
+				if (OFFS_REG(src1) == dst_reg)
+					src1 = (src1 & ~OFFS_REG_MASK) | TO_OFFS_REG(TMP_REG2);
+			}
+
+			FAIL_IF(push_inst(compiler, OR | S(src2_reg) | A(dst_reg) | B(src2_reg)));
+		}
+	}
+
+	if (((type & ~SLJIT_32) | 0x1) == SLJIT_NOT_CARRY)
+		FAIL_IF(push_inst(compiler, ADDE | RC(ALT_SET_FLAGS) | D(TMP_REG1) | A(TMP_ZERO) | B(TMP_ZERO)));
+
+	size = compiler->size;
+
+	ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));
+	FAIL_IF(!ptr);
+	compiler->size++;
+
+	if (src1 & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem(compiler, inp_flags, dst_reg, src1, src1w, TMP_REG1));
+	} else if (src1 == SLJIT_IMM) {
+#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
+		if (type & SLJIT_32)
+			src1w = (sljit_s32)src1w;
+#endif /* SLJIT_CONFIG_RISCV_64 */
+		FAIL_IF(load_immediate(compiler, dst_reg, src1w));
+	} else
+		FAIL_IF(push_inst(compiler, OR | S(src1) | A(dst_reg) | B(src1)));
+
+	*ptr = BCx | get_bo_bi_flags(compiler, (type ^ 0x1) & ~SLJIT_32) | (sljit_ins)((compiler->size - size) << 2);
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_freg)
 {
+	sljit_ins *ptr;
+	sljit_uw size;
+
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));
+	CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg));
+
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+
+	if (dst_freg != src2_freg) {
+		if (dst_freg == src1) {
+			src1 = src2_freg;
+			src1w = 0;
+			type ^= 0x1;
+		} else
+			FAIL_IF(push_inst(compiler, FMR | FD(dst_freg) | FB(src2_freg)));
+	}
+
+	if (((type & ~SLJIT_32) | 0x1) == SLJIT_NOT_CARRY)
+		FAIL_IF(push_inst(compiler, ADDE | RC(ALT_SET_FLAGS) | D(TMP_REG1) | A(TMP_ZERO) | B(TMP_ZERO)));
+
+	size = compiler->size;
 
-	return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);;
+	ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));
+	FAIL_IF(!ptr);
+	compiler->size++;
+
+	if (src1 & SLJIT_MEM)
+		FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(type) | LOAD_DATA, dst_freg, src1, src1w, TMP_REG1));
+	else
+		FAIL_IF(push_inst(compiler, FMR | FD(dst_freg) | FB(src1)));
+
+	*ptr = BCx | get_bo_bi_flags(compiler, (type ^ 0x1) & ~SLJIT_32) | (sljit_ins)((compiler->size - size) << 2);
+	return SLJIT_SUCCESS;
 }
 
 #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
@@ -2813,7 +3056,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_co
 	PTR_FAIL_IF(emit_const(compiler, dst_r, init_value));
 
 	if (dst & SLJIT_MEM)
-		PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0));
+		PTR_FAIL_IF(emit_op_mem(compiler, WORD_DATA, dst_r, dst, dstw, TMP_REG1));
 
 	return const_;
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeRISCV_32.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeRISCV_32.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeRISCV_32.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeRISCV_32.c	2024-11-20 13:56:33.000000000 +0000
@@ -27,7 +27,6 @@
 static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_r, sljit_sw imm, sljit_s32 tmp_r)
 {
 	SLJIT_UNUSED_ARG(tmp_r);
-	SLJIT_ASSERT(dst_r != tmp_r);
 
 	if (imm <= SIMM_MAX && imm >= SIMM_MIN)
 		return push_inst(compiler, ADDI | RD(dst_r) | RS1(TMP_ZERO) | IMM_I(imm));
@@ -43,6 +42,76 @@ static sljit_s32 load_immediate(struct s
 	return push_inst(compiler, ADDI | RD(dst_r) | RS1(dst_r) | IMM_I(imm));
 }
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f64 value)
+{
+	union {
+		sljit_s32 imm[2];
+		sljit_f64 value;
+	} u;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fset64(compiler, freg, value));
+
+	u.value = value;
+
+	if (u.imm[0] != 0)
+		FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm[0], TMP_REG3));
+	if (u.imm[1] != 0)
+		FAIL_IF(load_immediate(compiler, TMP_REG2, u.imm[1], TMP_REG3));
+
+	FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RS1(SLJIT_SP) | IMM_I(-16)));
+	FAIL_IF(push_inst(compiler, SW | RS1(SLJIT_SP) | RS2(u.imm[0] != 0 ? TMP_REG1 : TMP_ZERO) | (8 << 7)));
+	FAIL_IF(push_inst(compiler, SW | RS1(SLJIT_SP) | RS2(u.imm[1] != 0 ? TMP_REG2 : TMP_ZERO) | (12 << 7)));
+	FAIL_IF(push_inst(compiler, FLD | FRD(freg) | RS1(SLJIT_SP) | IMM_I(8)));
+	return push_inst(compiler, ADDI | RD(SLJIT_SP) | RS1(SLJIT_SP) | IMM_I(16));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 freg, sljit_s32 reg)
+{
+	sljit_ins inst;
+	sljit_s32 reg2 = 0;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg));
+
+	if (op & SLJIT_32) {
+		if (op == SLJIT_COPY32_TO_F32)
+			inst = FMV_W_X | RS1(reg) | FRD(freg);
+		else
+			inst = FMV_X_W | FRS1(freg) | RD(reg);
+
+		return push_inst(compiler, inst);
+	}
+
+	FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RS1(SLJIT_SP) | IMM_I(-16)));
+
+	if (reg & REG_PAIR_MASK) {
+		reg2 = REG_PAIR_SECOND(reg);
+		reg = REG_PAIR_FIRST(reg);
+	}
+
+	if (op == SLJIT_COPY_TO_F64) {
+		if (reg2 != 0)
+			FAIL_IF(push_inst(compiler, SW | RS1(SLJIT_SP) | RS2(reg2) | (8 << 7)));
+		else
+			FAIL_IF(push_inst(compiler, FSW | RS1(SLJIT_SP) | FRS2(freg) | (8 << 7)));
+
+		FAIL_IF(push_inst(compiler, SW | RS1(SLJIT_SP) | RS2(reg) | (12 << 7)));
+		FAIL_IF(push_inst(compiler, FLD | FRD(freg) | RS1(SLJIT_SP) | IMM_I(8)));
+	} else {
+		FAIL_IF(push_inst(compiler, FSD | RS1(SLJIT_SP) | FRS2(freg) | (8 << 7)));
+
+		if (reg2 != 0)
+			FAIL_IF(push_inst(compiler, FMV_X_W | FRS1(freg) | RD(reg2)));
+
+		FAIL_IF(push_inst(compiler, LW | RD(reg) | RS1(SLJIT_SP) | IMM_I(12)));
+	}
+
+	return push_inst(compiler, ADDI | RD(SLJIT_SP) | RS1(SLJIT_SP) | IMM_I(16));
+}
+
 static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw init_value, sljit_ins last_ins)
 {
 	if ((init_value & 0x800) != 0)
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeRISCV_64.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeRISCV_64.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeRISCV_64.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeRISCV_64.c	2024-11-20 13:56:33.000000000 +0000
@@ -28,8 +28,6 @@ static sljit_s32 load_immediate(struct s
 {
 	sljit_sw high;
 
-	SLJIT_ASSERT(dst_r != tmp_r);
-
 	if (imm <= SIMM_MAX && imm >= SIMM_MIN)
 		return push_inst(compiler, ADDI | RD(dst_r) | RS1(TMP_ZERO) | IMM_I(imm));
 
@@ -81,6 +79,8 @@ static sljit_s32 load_immediate(struct s
 		return SLJIT_SUCCESS;
 	}
 
+	SLJIT_ASSERT(dst_r != tmp_r);
+
 	high = imm >> 32;
 	imm = (sljit_s32)imm;
 
@@ -126,6 +126,45 @@ static sljit_s32 load_immediate(struct s
 	return push_inst(compiler, XOR | RD(dst_r) | RS1(dst_r) | RS2(tmp_r));
 }
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f64 value)
+{
+	union {
+		sljit_sw imm;
+		sljit_f64 value;
+	} u;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fset64(compiler, freg, value));
+
+	u.value = value;
+
+	if (u.imm == 0)
+		return push_inst(compiler, FMV_W_X | (1 << 25) | RS1(TMP_ZERO) | FRD(freg));
+
+	FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm, TMP_REG3));
+	return push_inst(compiler, FMV_W_X | (1 << 25) | RS1(TMP_REG1) | FRD(freg));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 freg, sljit_s32 reg)
+{
+	sljit_ins inst;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg));
+
+	if (GET_OPCODE(op) == SLJIT_COPY_TO_F64)
+		inst = FMV_W_X | RS1(reg) | FRD(freg);
+	else
+		inst = FMV_X_W | FRS1(freg) | RD(reg);
+
+	if (!(op & SLJIT_32))
+		inst |= (sljit_ins)1 << 25;
+
+	return push_inst(compiler, inst);
+}
+
 static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw init_value, sljit_ins last_ins)
 {
 	sljit_sw high;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeRISCV_common.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeRISCV_common.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeRISCV_common.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeRISCV_common.c	2024-11-20 13:56:33.000000000 +0000
@@ -97,16 +97,20 @@ static const sljit_u8 freg_map[SLJIT_NUM
 #define FLD		(F3(0x3) | OPC(0x7))
 #define FLE_S		(F7(0x50) | F3(0x0) | OPC(0x53))
 #define FLT_S		(F7(0x50) | F3(0x1) | OPC(0x53))
-#define FSD		(F3(0x3) | OPC(0x27))
 /* These conversion opcodes are partly defined. */
 #define FCVT_S_D	(F7(0x20) | OPC(0x53))
 #define FCVT_S_W	(F7(0x68) | OPC(0x53))
+#define FCVT_S_WU	(F7(0x68) | F12(0x1) | OPC(0x53))
 #define FCVT_W_S	(F7(0x60) | F3(0x1) | OPC(0x53))
 #define FMUL_S		(F7(0x8) | F3(0x7) | OPC(0x53))
+#define FMV_X_W		(F7(0x70) | F3(0x0) | OPC(0x53))
+#define FMV_W_X		(F7(0x78) | F3(0x0) | OPC(0x53))
+#define FSD		(F3(0x3) | OPC(0x27))
 #define FSGNJ_S		(F7(0x10) | F3(0x0) | OPC(0x53))
 #define FSGNJN_S	(F7(0x10) | F3(0x1) | OPC(0x53))
 #define FSGNJX_S	(F7(0x10) | F3(0x2) | OPC(0x53))
 #define FSUB_S		(F7(0x4) | F3(0x7) | OPC(0x53))
+#define FSW		(F3(0x2) | OPC(0x27))
 #define JAL		(OPC(0x6f))
 #define JALR		(F3(0x0) | OPC(0x67))
 #define LD		(F3(0x3) | OPC(0x3))
@@ -344,13 +348,12 @@ static SLJIT_INLINE void load_addr_to_re
 		if ((addr & 0x80000000l) != 0)
 			high = ~high;
 
-		if ((high & 0x800) != 0)
-			high += 0x1000;
-
 		if (flags & PATCH_ABS52) {
 			SLJIT_ASSERT(addr <= S52_MAX);
 			inst[0] = LUI | RD(TMP_REG3) | (sljit_ins)(high << 12);
 		} else {
+			if ((high & 0x800) != 0)
+				high += 0x1000;
 			inst[0] = LUI | RD(TMP_REG3) | (sljit_ins)(high & ~0xfff);
 			inst[1] = ADDI | RD(TMP_REG3) | RS1(TMP_REG3) | IMM_I(high);
 			inst++;
@@ -531,7 +534,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 {
 	switch (feature_type) {
 	case SLJIT_HAS_FPU:
+#ifdef SLJIT_IS_FPU_AVAILABLE
+		return (SLJIT_IS_FPU_AVAILABLE) != 0;
+#elif defined(__riscv_float_abi_soft)
+		return 0;
+#else
+		return 1;
+#endif /* SLJIT_IS_FPU_AVAILABLE */
 	case SLJIT_HAS_ZERO_REGISTER:
+	case SLJIT_HAS_COPY_F32:
+#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
+	case SLJIT_HAS_COPY_F64:
+#endif /* !SLJIT_CONFIG_RISCV_64 */
 		return 1;
 	default:
 		return 0;
@@ -540,7 +554,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type)
 {
-	return (type >= SLJIT_ORDERED_EQUAL && type <= SLJIT_ORDERED_LESS_EQUAL);
+	switch (type) {
+	case SLJIT_UNORDERED_OR_EQUAL:
+	case SLJIT_ORDERED_NOT_EQUAL:
+		return 2;
+
+	case SLJIT_UNORDERED:
+	case SLJIT_ORDERED:
+		return 1;
+	}
+
+	return 0;
 }
 
 /* --------------------------------------------------------------------- */
@@ -610,10 +634,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	if (fsaveds > 0 || fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG) {
 		if ((local_size & SSIZE_OF(sw)) != 0)
 			local_size += SSIZE_OF(sw);
-		local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, sizeof(sljit_f64));
+		local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
 	}
 #else
-	local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, sizeof(sljit_f64));
+	local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
 #endif
 	local_size = (local_size + SLJIT_LOCALS_OFFSET + 15) & ~0xf;
 	compiler->local_size = local_size;
@@ -704,10 +728,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	if (fsaveds > 0 || fscratches >= SLJIT_FIRST_SAVED_FLOAT_REG) {
 		if ((local_size & SSIZE_OF(sw)) != 0)
 			local_size += SSIZE_OF(sw);
-		local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, sizeof(sljit_f64));
+		local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
 	}
 #else
-	local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, sizeof(sljit_f64));
+	local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
 #endif
 	compiler->local_size = (local_size + SLJIT_LOCALS_OFFSET + 15) & ~0xf;
 
@@ -915,7 +939,7 @@ static sljit_s32 getput_arg(struct sljit
 
 	/* Since tmp can be the same as base or offset registers,
 	 * these might be unavailable after modifying tmp. */
-	if ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA))
+	if ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA) && reg == TMP_REG2)
 		tmp_r = reg;
 
 	if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) {
@@ -1031,9 +1055,11 @@ static SLJIT_INLINE sljit_s32 emit_op_me
 
 #if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
 #define WORD 0
+#define WORD_32 0
 #define IMM_EXTEND(v) (IMM_I(v))
 #else /* !SLJIT_CONFIG_RISCV_32 */
 #define WORD word
+#define WORD_32 0x08
 #define IMM_EXTEND(v) (IMM_I((op & SLJIT_32) ? (v) : (32 + (v))))
 #endif /* SLJIT_CONFIG_RISCV_32 */
 
@@ -1041,16 +1067,16 @@ static sljit_s32 emit_clz_ctz(struct slj
 {
 	sljit_s32 is_clz = (GET_OPCODE(op) == SLJIT_CLZ);
 #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
-	sljit_ins word = (op & SLJIT_32) >> 5;
-	sljit_ins max = (op & SLJIT_32) ? 32 : 64;
+	sljit_ins word = (sljit_ins)(op & SLJIT_32) >> 5;
+	sljit_ins word_size = (op & SLJIT_32) ? 32 : 64;
 #else /* !SLJIT_CONFIG_RISCV_64 */
-	sljit_ins max = 32;
+	sljit_ins word_size = 32;
 #endif /* SLJIT_CONFIG_RISCV_64 */
 
 	SLJIT_ASSERT(WORD == 0 || WORD == 0x8);
 
 	/* The OTHER_FLAG is the counter. */
-	FAIL_IF(push_inst(compiler, ADDI | WORD | RD(OTHER_FLAG) | RS1(TMP_ZERO) | IMM_I(max)));
+	FAIL_IF(push_inst(compiler, ADDI | WORD | RD(OTHER_FLAG) | RS1(TMP_ZERO) | IMM_I(word_size)));
 
 	/* The TMP_REG2 is the next value. */
 	if (src != TMP_REG2)
@@ -1066,7 +1092,7 @@ static sljit_s32 emit_clz_ctz(struct slj
 		FAIL_IF(push_inst(compiler, BLT | RS1(TMP_REG2) | RS2(TMP_ZERO) | ((sljit_ins)(2 * SSIZE_OF(ins)) << 7) | ((sljit_ins)(8 * SSIZE_OF(ins)) << 20)));
 
 	/* The TMP_REG1 is the next shift. */
-	FAIL_IF(push_inst(compiler, ADDI | WORD | RD(TMP_REG1) | RS1(TMP_ZERO) | IMM_I(max)));
+	FAIL_IF(push_inst(compiler, ADDI | WORD | RD(TMP_REG1) | RS1(TMP_ZERO) | IMM_I(word_size)));
 
 	FAIL_IF(push_inst(compiler, ADDI | WORD | RD(EQUAL_FLAG) | RS1(TMP_REG2) | IMM_I(0)));
 	FAIL_IF(push_inst(compiler, SRLI | WORD | RD(TMP_REG1) | RS1(TMP_REG1) | IMM_I(1)));
@@ -1081,6 +1107,65 @@ static sljit_s32 emit_clz_ctz(struct slj
 	return push_inst(compiler, ADDI | WORD | RD(dst) | RS1(OTHER_FLAG) | IMM_I(0));
 }
 
+static sljit_s32 emit_rev(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw src)
+{
+	SLJIT_UNUSED_ARG(op);
+
+#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
+	if (!(op & SLJIT_32)) {
+		FAIL_IF(push_inst(compiler, LUI | RD(OTHER_FLAG) | 0x10000));
+		FAIL_IF(push_inst(compiler, SRLI | RD(TMP_REG1) | RS1(src) | IMM_I(32)));
+		FAIL_IF(push_inst(compiler, ADDI | RD(OTHER_FLAG) | RS1(OTHER_FLAG) | IMM_I(0xfff)));
+		FAIL_IF(push_inst(compiler, SLLI | RD(dst) | RS1(src) | IMM_I(32)));
+		FAIL_IF(push_inst(compiler, SLLI | RD(EQUAL_FLAG) | RS1(OTHER_FLAG) | IMM_I(32)));
+		FAIL_IF(push_inst(compiler, OR | RD(dst) | RS1(dst) | RS2(TMP_REG1)));
+		FAIL_IF(push_inst(compiler, OR | RD(OTHER_FLAG) | RS1(OTHER_FLAG) | RS2(EQUAL_FLAG)));
+
+		FAIL_IF(push_inst(compiler, SRLI | RD(TMP_REG1) | RS1(dst) | IMM_I(16)));
+		FAIL_IF(push_inst(compiler, AND | RD(dst) | RS1(dst) | RS2(OTHER_FLAG)));
+		FAIL_IF(push_inst(compiler, AND | RD(TMP_REG1) | RS1(TMP_REG1) | RS2(OTHER_FLAG)));
+		FAIL_IF(push_inst(compiler, SLLI | RD(EQUAL_FLAG) | RS1(OTHER_FLAG) | IMM_I(8)));
+		FAIL_IF(push_inst(compiler, SLLI | RD(dst) | RS1(dst) | IMM_I(16)));
+		FAIL_IF(push_inst(compiler, XOR | RD(OTHER_FLAG) | RS1(OTHER_FLAG) | RS2(EQUAL_FLAG)));
+		FAIL_IF(push_inst(compiler, OR | RD(dst) | RS1(dst) | RS2(TMP_REG1)));
+
+		FAIL_IF(push_inst(compiler, SRLI | RD(TMP_REG1) | RS1(dst) | IMM_I(8)));
+		FAIL_IF(push_inst(compiler, AND | RD(dst) | RS1(dst) | RS2(OTHER_FLAG)));
+		FAIL_IF(push_inst(compiler, AND | RD(TMP_REG1) | RS1(TMP_REG1) | RS2(OTHER_FLAG)));
+		FAIL_IF(push_inst(compiler, SLLI | RD(dst) | RS1(dst) | IMM_I(8)));
+		return push_inst(compiler, OR | RD(dst) | RS1(dst) | RS2(TMP_REG1));
+	}
+#endif /* SLJIT_CONFIG_RISCV_64 */
+
+	FAIL_IF(push_inst(compiler, SRLI | WORD_32 | RD(TMP_REG1) | RS1(src) | IMM_I(16)));
+	FAIL_IF(push_inst(compiler, LUI | RD(OTHER_FLAG) | 0xff0000));
+	FAIL_IF(push_inst(compiler, SLLI | WORD_32 | RD(dst) | RS1(src) | IMM_I(16)));
+	FAIL_IF(push_inst(compiler, ORI | RD(OTHER_FLAG) | RS1(OTHER_FLAG) | IMM_I(0xff)));
+	FAIL_IF(push_inst(compiler, OR | RD(dst) | RS1(dst) | RS2(TMP_REG1)));
+
+	FAIL_IF(push_inst(compiler, SRLI | WORD_32 | RD(TMP_REG1) | RS1(dst) | IMM_I(8)));
+	FAIL_IF(push_inst(compiler, AND | RD(dst) | RS1(dst) | RS2(OTHER_FLAG)));
+	FAIL_IF(push_inst(compiler, AND | RD(TMP_REG1) | RS1(TMP_REG1) | RS2(OTHER_FLAG)));
+	FAIL_IF(push_inst(compiler, SLLI | WORD_32 | RD(dst) | RS1(dst) | IMM_I(8)));
+	return push_inst(compiler, OR | RD(dst) | RS1(dst) | RS2(TMP_REG1));
+}
+
+static sljit_s32 emit_rev16(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw src)
+{
+#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
+	sljit_ins word = (sljit_ins)(op & SLJIT_32) >> 5;
+	sljit_ins word_size = (op & SLJIT_32) ? 32 : 64;
+#else /* !SLJIT_CONFIG_RISCV_64 */
+	sljit_ins word_size = 32;
+#endif /* SLJIT_CONFIG_RISCV_64 */
+
+	FAIL_IF(push_inst(compiler, SRLI | WORD | RD(TMP_REG1) | RS1(src) | IMM_I(8)));
+	FAIL_IF(push_inst(compiler, SLLI | WORD | RD(dst) | RS1(src) | IMM_I(word_size - 8)));
+	FAIL_IF(push_inst(compiler, ANDI | RD(TMP_REG1) | RS1(TMP_REG1) | IMM_I(0xff)));
+	FAIL_IF(push_inst(compiler, (GET_OPCODE(op) == SLJIT_REV_U16 ? SRLI : SRAI) | WORD | RD(dst) | RS1(dst) | IMM_I(word_size - 16)));
+	return push_inst(compiler, OR | RD(dst) | RS1(dst) | RS2(TMP_REG1));
+}
+
 #define EMIT_LOGICAL(op_imm, op_reg) \
 	if (flags & SRC2_IMM) { \
 		if (op & SLJIT_SET_Z) \
@@ -1105,7 +1190,7 @@ static SLJIT_INLINE sljit_s32 emit_singl
 	sljit_s32 is_overflow, is_carry, carry_src_r, is_handled;
 	sljit_ins op_imm, op_reg;
 #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
-	sljit_ins word = (op & SLJIT_32) >> 5;
+	sljit_ins word = (sljit_ins)(op & SLJIT_32) >> 5;
 #endif /* SLJIT_CONFIG_RISCV_64 */
 
 	SLJIT_ASSERT(WORD == 0 || WORD == 0x8);
@@ -1174,10 +1259,33 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
 		return emit_clz_ctz(compiler, op, dst, src2);
 
+	case SLJIT_REV:
+	case SLJIT_REV_S32:
+#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
+	case SLJIT_REV_U32:
+#endif /* SLJIT_CONFIG_RISCV_32 */
+		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
+		return emit_rev(compiler, op, dst, src2);
+
+	case SLJIT_REV_U16:
+	case SLJIT_REV_S16:
+		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
+		return emit_rev16(compiler, op, dst, src2);
+
+#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
+	case SLJIT_REV_U32:
+		SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM) && dst != TMP_REG1);
+		FAIL_IF(emit_rev(compiler, op, dst, src2));
+		if (dst == TMP_REG2)
+			return SLJIT_SUCCESS;
+		FAIL_IF(push_inst(compiler, SLLI | RD(dst) | RS1(dst) | IMM_I(32)));
+		return push_inst(compiler, SRLI | RD(dst) | RS1(dst) | IMM_I(32));
+#endif /* SLJIT_CONFIG_RISCV_32 */
+
 	case SLJIT_ADD:
 		/* Overflow computation (both add and sub): overflow = src1_sign ^ src2_sign ^ result_sign ^ carry_flag */
 		is_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW;
-		carry_src_r = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);
+		carry_src_r = GET_FLAG_TYPE(op) == SLJIT_CARRY;
 
 		if (flags & SRC2_IMM) {
 			if (is_overflow) {
@@ -1233,7 +1341,7 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		return push_inst(compiler, XOR | RD(OTHER_FLAG) | RS1(TMP_REG1) | RS2(OTHER_FLAG));
 
 	case SLJIT_ADDC:
-		carry_src_r = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);
+		carry_src_r = GET_FLAG_TYPE(op) == SLJIT_CARRY;
 
 		if (flags & SRC2_IMM) {
 			FAIL_IF(push_inst(compiler, ADDI | WORD | RD(dst) | RS1(src1) | IMM_I(src2)));
@@ -1280,11 +1388,11 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		is_handled = 0;
 
 		if (flags & SRC2_IMM) {
-			if (GET_FLAG_TYPE(op) == SLJIT_LESS || GET_FLAG_TYPE(op) == SLJIT_GREATER_EQUAL) {
+			if (GET_FLAG_TYPE(op) == SLJIT_LESS) {
 				FAIL_IF(push_inst(compiler, SLTUI | RD(OTHER_FLAG) | RS1(src1) | IMM_I(src2)));
 				is_handled = 1;
 			}
-			else if (GET_FLAG_TYPE(op) == SLJIT_SIG_LESS || GET_FLAG_TYPE(op) == SLJIT_SIG_GREATER_EQUAL) {
+			else if (GET_FLAG_TYPE(op) == SLJIT_SIG_LESS) {
 				FAIL_IF(push_inst(compiler, SLTI | RD(OTHER_FLAG) | RS1(src1) | IMM_I(src2)));
 				is_handled = 1;
 			}
@@ -1301,19 +1409,15 @@ static SLJIT_INLINE sljit_s32 emit_singl
 
 			switch (GET_FLAG_TYPE(op)) {
 			case SLJIT_LESS:
-			case SLJIT_GREATER_EQUAL:
 				FAIL_IF(push_inst(compiler, SLTU | RD(OTHER_FLAG) | RS1(src1) | RS2(src2)));
 				break;
 			case SLJIT_GREATER:
-			case SLJIT_LESS_EQUAL:
 				FAIL_IF(push_inst(compiler, SLTU | RD(OTHER_FLAG) | RS1(src2) | RS2(src1)));
 				break;
 			case SLJIT_SIG_LESS:
-			case SLJIT_SIG_GREATER_EQUAL:
 				FAIL_IF(push_inst(compiler, SLT | RD(OTHER_FLAG) | RS1(src1) | RS2(src2)));
 				break;
 			case SLJIT_SIG_GREATER:
-			case SLJIT_SIG_LESS_EQUAL:
 				FAIL_IF(push_inst(compiler, SLT | RD(OTHER_FLAG) | RS1(src2) | RS2(src1)));
 				break;
 			}
@@ -1336,7 +1440,7 @@ static SLJIT_INLINE sljit_s32 emit_singl
 		}
 
 		is_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW;
-		is_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);
+		is_carry = GET_FLAG_TYPE(op) == SLJIT_CARRY;
 
 		if (flags & SRC2_IMM) {
 			if (is_overflow) {
@@ -1385,7 +1489,7 @@ static SLJIT_INLINE sljit_s32 emit_singl
 			flags &= ~SRC2_IMM;
 		}
 
-		is_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);
+		is_carry = GET_FLAG_TYPE(op) == SLJIT_CARRY;
 
 		if (flags & SRC2_IMM) {
 			if (is_carry)
@@ -1534,9 +1638,10 @@ static sljit_s32 emit_op(struct sljit_co
 		compiler->cache_argw = 0;
 	}
 
-	if (dst == TMP_REG2) {
+	if (dst == 0) {
 		SLJIT_ASSERT(HAS_FLAGS(op));
 		flags |= UNUSED_DEST;
+		dst = TMP_REG2;
 	}
 	else if (FAST_IS_REG(dst)) {
 		dst_r = dst;
@@ -1548,11 +1653,11 @@ static sljit_s32 emit_op(struct sljit_co
 		flags |= SLOW_DEST;
 
 	if (flags & IMM_OP) {
-		if ((src2 & SLJIT_IMM) && src2w != 0 && src2w <= SIMM_MAX && src2w >= SIMM_MIN) {
+		if (src2 == SLJIT_IMM && src2w != 0 && src2w <= SIMM_MAX && src2w >= SIMM_MIN) {
 			flags |= SRC2_IMM;
 			src2_r = src2w;
 		}
-		else if ((flags & CUMULATIVE_OP) && (src1 & SLJIT_IMM) && src1w != 0 && src1w <= SIMM_MAX && src1w >= SIMM_MIN) {
+		else if ((flags & CUMULATIVE_OP) && src1 == SLJIT_IMM && src1w != 0 && src1w <= SIMM_MAX && src1w >= SIMM_MIN) {
 			flags |= SRC2_IMM;
 			src2_r = src1w;
 
@@ -1569,7 +1674,7 @@ static sljit_s32 emit_op(struct sljit_co
 		src1_r = src1;
 		flags |= REG1_SOURCE;
 	}
-	else if (src1 & SLJIT_IMM) {
+	else if (src1 == SLJIT_IMM) {
 		if (src1w) {
 			FAIL_IF(load_immediate(compiler, TMP_REG1, src1w, TMP_REG3));
 			src1_r = TMP_REG1;
@@ -1592,7 +1697,7 @@ static sljit_s32 emit_op(struct sljit_co
 		if ((flags & (REG_DEST | MOVE_OP)) == MOVE_OP)
 			dst_r = (sljit_s32)src2_r;
 	}
-	else if (src2 & SLJIT_IMM) {
+	else if (src2 == SLJIT_IMM) {
 		if (!(flags & SRC2_IMM)) {
 			if (src2w) {
 				FAIL_IF(load_immediate(compiler, sugg_src2_r, src2w, TMP_REG3));
@@ -1649,7 +1754,7 @@ static sljit_s32 emit_op(struct sljit_co
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
 {
 #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
-	sljit_ins word = (op & SLJIT_32) >> 5;
+	sljit_ins word = (sljit_ins)(op & SLJIT_32) >> 5;
 
 	SLJIT_ASSERT(word == 0 || word == 0x8);
 #endif /* SLJIT_CONFIG_RISCV_64 */
@@ -1718,32 +1823,38 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
 	case SLJIT_MOV_U32:
-		return emit_op(compiler, SLJIT_MOV_U32, INT_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u32)srcw : srcw);
+		return emit_op(compiler, SLJIT_MOV_U32, INT_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u32)srcw : srcw);
 
 	case SLJIT_MOV_S32:
 	/* Logical operators have no W variant, so sign extended input is necessary for them. */
 	case SLJIT_MOV32:
-		return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s32)srcw : srcw);
+		return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s32)srcw : srcw);
 #endif
 
 	case SLJIT_MOV_U8:
-		return emit_op(compiler, op, BYTE_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw);
+		return emit_op(compiler, op, BYTE_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u8)srcw : srcw);
 
 	case SLJIT_MOV_S8:
-		return emit_op(compiler, op, BYTE_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw);
+		return emit_op(compiler, op, BYTE_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s8)srcw : srcw);
 
 	case SLJIT_MOV_U16:
-		return emit_op(compiler, op, HALF_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw);
+		return emit_op(compiler, op, HALF_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_u16)srcw : srcw);
 
 	case SLJIT_MOV_S16:
-		return emit_op(compiler, op, HALF_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw);
-
-	case SLJIT_NOT:
-		return emit_op(compiler, SLJIT_XOR | (op & (SLJIT_32 | SLJIT_SET_Z)), flags, dst, dstw, src, srcw, SLJIT_IMM, -1);
+		return emit_op(compiler, op, HALF_DATA | SIGNED_DATA | MOVE_OP, dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? (sljit_s16)srcw : srcw);
 
 	case SLJIT_CLZ:
 	case SLJIT_CTZ:
+	case SLJIT_REV:
 		return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw);
+
+	case SLJIT_REV_U16:
+	case SLJIT_REV_S16:
+		return emit_op(compiler, op, HALF_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
+
+	case SLJIT_REV_U32:
+	case SLJIT_REV_S32:
+		return emit_op(compiler, op | SLJIT_32, INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
 	}
 
 	SLJIT_UNREACHABLE();
@@ -1766,9 +1877,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
 	if (op & SLJIT_32) {
 		flags |= INT_DATA | SIGNED_DATA;
-		if (src1 & SLJIT_IMM)
+		if (src1 == SLJIT_IMM)
 			src1w = (sljit_s32)src1w;
-		if (src2 & SLJIT_IMM)
+		if (src2 == SLJIT_IMM)
 			src2w = (sljit_s32)src2w;
 	}
 #endif
@@ -1801,7 +1912,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	case SLJIT_MASHR:
 	case SLJIT_ROTL:
 	case SLJIT_ROTR:
-		if (src2 & SLJIT_IMM) {
+		if (src2 == SLJIT_IMM) {
 #if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
 			src2w &= 0x1f;
 #else /* !SLJIT_CONFIG_RISCV_32 */
@@ -1827,18 +1938,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	CHECK(check_sljit_emit_op2(compiler, op, 1, 0, 0, src1, src1w, src2, src2w));
 
 	SLJIT_SKIP_CHECKS(compiler);
-	return sljit_emit_op2(compiler, op, TMP_REG2, 0, src1, src1w, src2, src2w);
+	return sljit_emit_op2(compiler, op, 0, 0, src1, src1w, src2, src2w);
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 src_dst,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w)
+	sljit_s32 dst_reg,
+	sljit_s32 src1_reg,
+	sljit_s32 src2_reg,
+	sljit_s32 src3, sljit_sw src3w)
 {
 	sljit_s32 is_left;
 	sljit_ins ins1, ins2, ins3;
 #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
-	sljit_ins word = (op & SLJIT_32) >> 5;
+	sljit_ins word = (sljit_ins)(op & SLJIT_32) >> 5;
 	sljit_s32 inp_flags = ((op & SLJIT_32) ? INT_DATA : WORD_DATA) | LOAD_DATA;
 	sljit_sw bit_length = (op & SLJIT_32) ? 32 : 64;
 #else /* !SLJIT_CONFIG_RISCV_64 */
@@ -1849,50 +1961,44 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	SLJIT_ASSERT(WORD == 0 || WORD == 0x8);
 
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_shift_into(compiler, op, src_dst, src1, src1w, src2, src2w));
+	CHECK(check_sljit_emit_shift_into(compiler, op, dst_reg, src1_reg, src2_reg, src3, src3w));
 
 	is_left = (GET_OPCODE(op) == SLJIT_SHL || GET_OPCODE(op) == SLJIT_MSHL);
 
-	if (src_dst == src1) {
+	if (src1_reg == src2_reg) {
 		SLJIT_SKIP_CHECKS(compiler);
-		return sljit_emit_op2(compiler, (is_left ? SLJIT_ROTL : SLJIT_ROTR) | (op & SLJIT_32), src_dst, 0, src_dst, 0, src2, src2w);
+		return sljit_emit_op2(compiler, (is_left ? SLJIT_ROTL : SLJIT_ROTR) | (op & SLJIT_32), dst_reg, 0, src1_reg, 0, src3, src3w);
 	}
 
-	ADJUST_LOCAL_OFFSET(src1, src1w);
-	ADJUST_LOCAL_OFFSET(src2, src2w);
+	ADJUST_LOCAL_OFFSET(src3, src3w);
 
-	if (src2 & SLJIT_IMM) {
-		src2w &= bit_length - 1;
+	if (src3 == SLJIT_IMM) {
+		src3w &= bit_length - 1;
 
-		if (src2w == 0)
+		if (src3w == 0)
 			return SLJIT_SUCCESS;
-	} else if (src2 & SLJIT_MEM) {
-		FAIL_IF(emit_op_mem(compiler, inp_flags, TMP_REG2, src2, src2w));
-		src2 = TMP_REG2;
-	}
 
-	if (src1 & SLJIT_MEM) {
-		FAIL_IF(emit_op_mem(compiler, inp_flags, TMP_REG1, src1, src1w));
-		src1 = TMP_REG1;
-	} else if (src1 & SLJIT_IMM) {
-		FAIL_IF(load_immediate(compiler, TMP_REG1, src1w, TMP_REG3));
-		src1 = TMP_REG1;
-	}
-
-	if (src2 & SLJIT_IMM) {
 		if (is_left) {
-			ins1 = SLLI | WORD | IMM_I(src2w);
-			src2w = bit_length - src2w;
-			ins2 = SRLI | WORD | IMM_I(src2w);
+			ins1 = SLLI | WORD | IMM_I(src3w);
+			src3w = bit_length - src3w;
+			ins2 = SRLI | WORD | IMM_I(src3w);
 		} else {
-			ins1 = SRLI | WORD | IMM_I(src2w);
-			src2w = bit_length - src2w;
-			ins2 = SLLI | WORD | IMM_I(src2w);
-		}
-
-		FAIL_IF(push_inst(compiler, ins1 | RD(src_dst) | RS1(src_dst)));
-		FAIL_IF(push_inst(compiler, ins2 | RD(TMP_REG1) | RS1(src1)));
-		return push_inst(compiler, OR | RD(src_dst) | RS1(src_dst) | RS2(TMP_REG1));
+			ins1 = SRLI | WORD | IMM_I(src3w);
+			src3w = bit_length - src3w;
+			ins2 = SLLI | WORD | IMM_I(src3w);
+		}
+
+		FAIL_IF(push_inst(compiler, ins1 | RD(dst_reg) | RS1(src1_reg)));
+		FAIL_IF(push_inst(compiler, ins2 | RD(TMP_REG1) | RS1(src2_reg)));
+		return push_inst(compiler, OR | RD(dst_reg) | RS1(dst_reg) | RS2(TMP_REG1));
+	}
+
+	if (src3 & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem(compiler, inp_flags, TMP_REG2, src3, src3w));
+		src3 = TMP_REG2;
+	} else if (dst_reg == src3) {
+		push_inst(compiler, ADDI | WORD | RD(TMP_REG2) | RS1(src3) | IMM_I(0));
+		src3 = TMP_REG2;
 	}
 
 	if (is_left) {
@@ -1905,21 +2011,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		ins3 = SLL;
 	}
 
-	FAIL_IF(push_inst(compiler, ins1 | WORD | RD(src_dst) | RS1(src_dst) | RS2(src2)));
+	FAIL_IF(push_inst(compiler, ins1 | WORD | RD(dst_reg) | RS1(src1_reg) | RS2(src3)));
 
 	if (!(op & SLJIT_SHIFT_INTO_NON_ZERO)) {
-		FAIL_IF(push_inst(compiler, ins2 | WORD | RD(TMP_REG1) | RS1(src1) | IMM_I(1)));
-		FAIL_IF(push_inst(compiler, XORI | RD(TMP_REG2) | RS1(src2) | IMM_I((sljit_ins)bit_length - 1)));
-		src1 = TMP_REG1;
+		FAIL_IF(push_inst(compiler, ins2 | WORD | RD(TMP_REG1) | RS1(src2_reg) | IMM_I(1)));
+		FAIL_IF(push_inst(compiler, XORI | RD(TMP_REG2) | RS1(src3) | IMM_I((sljit_ins)bit_length - 1)));
+		src2_reg = TMP_REG1;
 	} else
-		FAIL_IF(push_inst(compiler, SUB | WORD | RD(TMP_REG2) | RS1(TMP_ZERO) | RS2(src2)));
+		FAIL_IF(push_inst(compiler, SUB | WORD | RD(TMP_REG2) | RS1(TMP_ZERO) | RS2(src3)));
 
-	FAIL_IF(push_inst(compiler, ins3 | WORD | RD(TMP_REG1) | RS1(src1) | RS2(TMP_REG2)));
-	return push_inst(compiler, OR | RD(src_dst) | RS1(src_dst) | RS2(TMP_REG1));
+	FAIL_IF(push_inst(compiler, ins3 | WORD | RD(TMP_REG1) | RS1(src2_reg) | RS2(TMP_REG2)));
+	return push_inst(compiler, OR | RD(dst_reg) | RS1(dst_reg) | RS2(TMP_REG1));
 }
 
-#undef WORD
-
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
 	sljit_s32 src, sljit_sw srcw)
 {
@@ -1947,21 +2051,52 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw)
 {
-	CHECK_REG_INDEX(check_sljit_get_register_index(reg));
-	return reg_map[reg];
+	sljit_s32 dst_r;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_op_dst(compiler, op, dst, dstw));
+	ADJUST_LOCAL_OFFSET(dst, dstw);
+
+	switch (op) {
+	case SLJIT_FAST_ENTER:
+		if (FAST_IS_REG(dst))
+			return push_inst(compiler, ADDI | RD(dst) | RS1(RETURN_ADDR_REG) | IMM_I(0));
+
+		SLJIT_ASSERT(RETURN_ADDR_REG == TMP_REG2);
+		break;
+	case SLJIT_GET_RETURN_ADDRESS:
+		dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2;
+		FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, dst_r, SLJIT_MEM1(SLJIT_SP), compiler->local_size - SSIZE_OF(sw)));
+		break;
+	}
+
+	if (dst & SLJIT_MEM)
+		return emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw);
+
+	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg)
 {
-	CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
+	CHECK_REG_INDEX(check_sljit_get_register_index(type, reg));
+
+	if (type == SLJIT_GP_REGISTER)
+		return reg_map[reg];
+
+	if (type != SLJIT_FLOAT_REGISTER)
+		return -1;
+
 	return freg_map[reg];
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
 	void *instruction, sljit_u32 size)
 {
+	SLJIT_UNUSED_ARG(size);
+
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
 
@@ -2008,51 +2143,73 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 #endif
 }
 
-static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
+static sljit_s32 sljit_emit_fop1_conv_f64_from_w(struct sljit_compiler *compiler, sljit_ins ins,
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 src, sljit_sw srcw)
 {
-	sljit_ins inst;
-#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
-	sljit_u32 flags = ((sljit_u32)(GET_OPCODE(op) == SLJIT_CONV_F64_FROM_SW)) << 21;
-#endif
-
 	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
 
 	if (src & SLJIT_MEM) {
 #if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
 		FAIL_IF(emit_op_mem2(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, src, srcw, dst, dstw));
-#else
-		FAIL_IF(emit_op_mem2(compiler, (flags ? WORD_DATA : INT_DATA) | LOAD_DATA, TMP_REG1, src, srcw, dst, dstw));
-#endif
+#else /* SLJIT_CONFIG_RISCV_32 */
+		FAIL_IF(emit_op_mem2(compiler, ((ins & (1 << 21)) ? WORD_DATA : INT_DATA) | LOAD_DATA, TMP_REG1, src, srcw, dst, dstw));
+#endif /* !SLJIT_CONFIG_RISCV_32 */
 		src = TMP_REG1;
-	} else if (src & SLJIT_IMM) {
-#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
-		if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)
-			srcw = (sljit_s32)srcw;
-#endif
-
+	} else if (src == SLJIT_IMM) {
 		FAIL_IF(load_immediate(compiler, TMP_REG1, srcw, TMP_REG3));
 		src = TMP_REG1;
 	}
 
-	inst = FCVT_S_W | FMT(op) | FRD(dst_r) | RS1(src);
+	FAIL_IF(push_inst(compiler, ins | FRD(dst_r) | RS1(src)));
+
+	if (dst & SLJIT_MEM)
+		return emit_op_mem2(compiler, DOUBLE_DATA | ((sljit_s32)(~ins >> 24) & 0x2), TMP_FREG1, dst, dstw, 0, 0);
+	return SLJIT_SUCCESS;
+}
+
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_ins ins = FCVT_S_W | FMT(op);
 
 #if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
 	if (op & SLJIT_32)
-		inst |= F3(0x7);
-#else
-	inst |= flags;
+		ins |= F3(0x7);
+#else /* !SLJIT_CONFIG_RISCV_32 */
+	if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_SW)
+		ins |= (1 << 21);
+	else if (src == SLJIT_IMM)
+		srcw = (sljit_s32)srcw;
 
 	if (op != SLJIT_CONV_F64_FROM_S32)
-		inst |= F3(0x7);
-#endif
+		ins |= F3(0x7);
+#endif /* SLJIT_CONFIG_RISCV_32 */
 
-	FAIL_IF(push_inst(compiler, inst));
+	return sljit_emit_fop1_conv_f64_from_w(compiler, ins, dst, dstw, src, srcw);
+}
 
-	if (dst & SLJIT_MEM)
-		return emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, 0, 0);
-	return SLJIT_SUCCESS;
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_ins ins = FCVT_S_WU | FMT(op);
+
+#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
+	if (op & SLJIT_32)
+		ins |= F3(0x7);
+#else /* !SLJIT_CONFIG_RISCV_32 */
+	if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_UW)
+		ins |= (1 << 21);
+	else if (src == SLJIT_IMM)
+		srcw = (sljit_u32)srcw;
+
+	if (op != SLJIT_CONV_F64_FROM_S32)
+		ins |= F3(0x7);
+#endif /* SLJIT_CONFIG_RISCV_32 */
+
+	return sljit_emit_fop1_conv_f64_from_w(compiler, ins, dst, dstw, src, srcw);
 }
 
 static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,
@@ -2073,40 +2230,36 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 
 	switch (GET_FLAG_TYPE(op)) {
 	case SLJIT_F_EQUAL:
-	case SLJIT_F_NOT_EQUAL:
 	case SLJIT_ORDERED_EQUAL:
-	case SLJIT_UNORDERED_OR_NOT_EQUAL:
 		inst = FEQ_S | FMT(op) | RD(OTHER_FLAG) | FRS1(src1) | FRS2(src2);
 		break;
 	case SLJIT_F_LESS:
-	case SLJIT_F_GREATER_EQUAL:
 	case SLJIT_ORDERED_LESS:
-	case SLJIT_UNORDERED_OR_GREATER_EQUAL:
 		inst = FLT_S | FMT(op) | RD(OTHER_FLAG) | FRS1(src1) | FRS2(src2);
 		break;
 	case SLJIT_ORDERED_GREATER:
-	case SLJIT_UNORDERED_OR_LESS_EQUAL:
 		inst = FLT_S | FMT(op) | RD(OTHER_FLAG) | FRS1(src2) | FRS2(src1);
 		break;
 	case SLJIT_F_GREATER:
-	case SLJIT_F_LESS_EQUAL:
 	case SLJIT_UNORDERED_OR_GREATER:
-	case SLJIT_ORDERED_LESS_EQUAL:
 		inst = FLE_S | FMT(op) | RD(OTHER_FLAG) | FRS1(src1) | FRS2(src2);
 		break;
 	case SLJIT_UNORDERED_OR_LESS:
-	case SLJIT_ORDERED_GREATER_EQUAL:
 		inst = FLE_S | FMT(op) | RD(OTHER_FLAG) | FRS1(src2) | FRS2(src1);
 		break;
-	case SLJIT_UNORDERED_OR_EQUAL: /* Not supported. */
-	case SLJIT_ORDERED_NOT_EQUAL: /* Not supported. */
+	case SLJIT_UNORDERED_OR_EQUAL:
 		FAIL_IF(push_inst(compiler, FLT_S | FMT(op) | RD(OTHER_FLAG) | FRS1(src1) | FRS2(src2)));
 		FAIL_IF(push_inst(compiler, FLT_S | FMT(op) | RD(TMP_REG1) | FRS1(src2) | FRS2(src1)));
 		inst = OR | RD(OTHER_FLAG) | RS1(OTHER_FLAG) | RS2(TMP_REG1);
 		break;
-	default: /* SLJIT_UNORDERED, SLJIT_ORDERED */
-		FAIL_IF(push_inst(compiler, FADD_S | FMT(op) | FRD(TMP_FREG1) | FRS1(src1) | FRS2(src2)));
-		inst = FEQ_S | FMT(op) | RD(OTHER_FLAG) | FRS1(TMP_FREG1) | FRS2(TMP_FREG1);
+	default: /* SLJIT_UNORDERED */
+		if (src1 == src2) {
+			inst = FEQ_S | FMT(op) | RD(OTHER_FLAG) | FRS1(src1) | FRS2(src1);
+			break;
+		}
+		FAIL_IF(push_inst(compiler, FEQ_S | FMT(op) | RD(OTHER_FLAG) | FRS1(src1) | FRS2(src1)));
+		FAIL_IF(push_inst(compiler, FEQ_S | FMT(op) | RD(TMP_REG1) | FRS1(src2) | FRS2(src2)));
+		inst = AND | RD(OTHER_FLAG) | RS1(OTHER_FLAG) | RS2(TMP_REG1);
 		break;
 	}
 
@@ -2233,6 +2386,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	case SLJIT_DIV_F64:
 		FAIL_IF(push_inst(compiler, FDIV_S | FMT(op) | FRD(dst_r) | FRS1(src1) | FRS2(src2)));
 		break;
+
+	case SLJIT_COPYSIGN_F64:
+		return push_inst(compiler, FSGNJ_S | FMT(op) | FRD(dst_r) | FRS1(src1) | FRS2(src2));
 	}
 
 	if (dst_r == TMP_FREG2)
@@ -2241,24 +2397,24 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
-#undef FLOAT_DATA
-#undef FMT
-
-/* --------------------------------------------------------------------- */
-/*  Other instructions                                                   */
-/* --------------------------------------------------------------------- */
-
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f32 value)
 {
+	union {
+		sljit_s32 imm;
+		sljit_f32 value;
+	} u;
+
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
-	ADJUST_LOCAL_OFFSET(dst, dstw);
+	CHECK(check_sljit_emit_fset32(compiler, freg, value));
 
-	if (FAST_IS_REG(dst))
-		return push_inst(compiler, ADDI | RD(dst) | RS1(RETURN_ADDR_REG) | IMM_I(0));
+	u.value = value;
 
-	/* Memory. */
-	return emit_op_mem(compiler, WORD_DATA, RETURN_ADDR_REG, dst, dstw);
+	if (u.imm == 0)
+		return push_inst(compiler, FMV_W_X | RS1(TMP_ZERO) | FRD(freg));
+
+	FAIL_IF(load_immediate(compiler, TMP_REG1, u.imm, TMP_REG3));
+	return push_inst(compiler, FMV_W_X | RS1(TMP_REG1) | FRD(freg));
 }
 
 /* --------------------------------------------------------------------- */
@@ -2287,26 +2443,13 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_la
 #define BRANCH_LENGTH	((sljit_ins)(7 * sizeof(sljit_ins)) << 7)
 #endif
 
-SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
+static sljit_ins get_jump_instruction(sljit_s32 type)
 {
-	struct sljit_jump *jump;
-	sljit_ins inst;
-
-	CHECK_ERROR_PTR();
-	CHECK_PTR(check_sljit_emit_jump(compiler, type));
-
-	jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
-	PTR_FAIL_IF(!jump);
-	set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
-	type &= 0xff;
-
 	switch (type) {
 	case SLJIT_EQUAL:
-		inst = BNE | RS1(EQUAL_FLAG) | RS2(TMP_ZERO) | BRANCH_LENGTH;
-		break;
+		return BNE | RS1(EQUAL_FLAG) | RS2(TMP_ZERO);
 	case SLJIT_NOT_EQUAL:
-		inst = BEQ | RS1(EQUAL_FLAG) | RS2(TMP_ZERO) | BRANCH_LENGTH;
-		break;
+		return BEQ | RS1(EQUAL_FLAG) | RS2(TMP_ZERO);
 	case SLJIT_LESS:
 	case SLJIT_GREATER:
 	case SLJIT_SIG_LESS:
@@ -2315,7 +2458,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 	case SLJIT_CARRY:
 	case SLJIT_F_EQUAL:
 	case SLJIT_ORDERED_EQUAL:
-	case SLJIT_ORDERED_NOT_EQUAL: /* Not supported. */
+	case SLJIT_ORDERED_NOT_EQUAL:
 	case SLJIT_F_LESS:
 	case SLJIT_ORDERED_LESS:
 	case SLJIT_ORDERED_GREATER:
@@ -2323,7 +2466,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 	case SLJIT_ORDERED_LESS_EQUAL:
 	case SLJIT_ORDERED_GREATER_EQUAL:
 	case SLJIT_ORDERED:
-		inst = BEQ | RS1(OTHER_FLAG) | RS2(TMP_ZERO) | BRANCH_LENGTH;
+		return BEQ | RS1(OTHER_FLAG) | RS2(TMP_ZERO);
 		break;
 	case SLJIT_GREATER_EQUAL:
 	case SLJIT_LESS_EQUAL:
@@ -2333,7 +2476,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 	case SLJIT_NOT_CARRY:
 	case SLJIT_F_NOT_EQUAL:
 	case SLJIT_UNORDERED_OR_NOT_EQUAL:
-	case SLJIT_UNORDERED_OR_EQUAL: /* Not supported. */
+	case SLJIT_UNORDERED_OR_EQUAL:
 	case SLJIT_F_GREATER_EQUAL:
 	case SLJIT_UNORDERED_OR_GREATER_EQUAL:
 	case SLJIT_UNORDERED_OR_LESS_EQUAL:
@@ -2341,16 +2484,30 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 	case SLJIT_UNORDERED_OR_GREATER:
 	case SLJIT_UNORDERED_OR_LESS:
 	case SLJIT_UNORDERED:
-		inst = BNE | RS1(OTHER_FLAG) | RS2(TMP_ZERO) | BRANCH_LENGTH;
-		break;
+		return BNE | RS1(OTHER_FLAG) | RS2(TMP_ZERO);
 	default:
 		/* Not conditional branch. */
-		inst = 0;
-		break;
+		return 0;
 	}
+}
+
+SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
+{
+	struct sljit_jump *jump;
+	sljit_ins inst;
+
+	CHECK_ERROR_PTR();
+	CHECK_PTR(check_sljit_emit_jump(compiler, type));
+
+	jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
+	PTR_FAIL_IF(!jump);
+	set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
+	type &= 0xff;
+
+	inst = get_jump_instruction(type);
 
 	if (inst != 0) {
-		PTR_FAIL_IF(push_inst(compiler, inst));
+		PTR_FAIL_IF(push_inst(compiler, inst | BRANCH_LENGTH));
 		jump->flags |= IS_COND;
 	}
 
@@ -2420,7 +2577,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 		src2 = TMP_REG2;
 	}
 
-	if (src1 & SLJIT_IMM) {
+	if (src1 == SLJIT_IMM) {
 		if (src1w != 0) {
 			PTR_FAIL_IF(load_immediate(compiler, TMP_REG1, src1w, TMP_REG3));
 			src1 = TMP_REG1;
@@ -2429,7 +2586,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 			src1 = TMP_ZERO;
 	}
 
-	if (src2 & SLJIT_IMM) {
+	if (src2 == SLJIT_IMM) {
 		if (src2w != 0) {
 			PTR_FAIL_IF(load_immediate(compiler, TMP_REG2, src2w, TMP_REG3));
 			src2 = TMP_REG2;
@@ -2499,7 +2656,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));
 
-	if (!(src & SLJIT_IMM)) {
+	if (src != SLJIT_IMM) {
 		if (src & SLJIT_MEM) {
 			ADJUST_LOCAL_OFFSET(src, srcw);
 			FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, src, srcw));
@@ -2641,16 +2798,110 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return emit_op(compiler, saved_op, mem_type, dst, dstw, dst, dstw, src_r, 0);
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 dst_reg,
-	sljit_s32 src, sljit_sw srcw)
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_reg)
 {
+	sljit_ins *ptr;
+	sljit_uw size;
+#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
+	sljit_ins word = (sljit_ins)(type & SLJIT_32) >> 5;
+	sljit_s32 inp_flags = ((type & SLJIT_32) ? INT_DATA : WORD_DATA) | LOAD_DATA;
+#else /* !SLJIT_CONFIG_RISCV_64 */
+        sljit_s32 inp_flags = WORD_DATA | LOAD_DATA;
+#endif /* SLJIT_CONFIG_RISCV_64 */
+
+	SLJIT_ASSERT(WORD == 0 || WORD == 0x8);
+
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));
+	CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg));
+
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+
+	if (dst_reg != src2_reg) {
+		if (dst_reg == src1) {
+			src1 = src2_reg;
+			src1w = 0;
+			type ^= 0x1;
+		} else {
+			if (ADDRESSING_DEPENDS_ON(src1, dst_reg)) {
+				FAIL_IF(push_inst(compiler, ADDI | RD(TMP_REG2) | RS1(dst_reg) | IMM_I(0)));
 
-	return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);;
+				if ((src1 & REG_MASK) == dst_reg)
+					src1 = (src1 & ~REG_MASK) | TMP_REG2;
+
+				if (OFFS_REG(src1) == dst_reg)
+					src1 = (src1 & ~OFFS_REG_MASK) | TO_OFFS_REG(TMP_REG2);
+			}
+
+			FAIL_IF(push_inst(compiler, ADDI | WORD | RD(dst_reg) | RS1(src2_reg) | IMM_I(0)));
+		}
+	}
+
+	size = compiler->size;
+
+	ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));
+	FAIL_IF(!ptr);
+	compiler->size++;
+
+	if (src1 & SLJIT_MEM) {
+		FAIL_IF(emit_op_mem(compiler, inp_flags, dst_reg, src1, src1w));
+	} else if (src1 == SLJIT_IMM) {
+#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
+		if (word)
+			src1w = (sljit_s32)src1w;
+#endif /* SLJIT_CONFIG_RISCV_64 */
+		FAIL_IF(load_immediate(compiler, dst_reg, src1w, TMP_REG1));
+	} else
+		FAIL_IF(push_inst(compiler, ADDI | WORD | RD(dst_reg) | RS1(src1) | IMM_I(0)));
+
+	*ptr = get_jump_instruction(type & ~SLJIT_32) | (sljit_ins)((compiler->size - size) << 9);
+	return SLJIT_SUCCESS;
 }
 
+#undef WORD
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_freg)
+{
+	sljit_ins *ptr;
+	sljit_uw size;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg));
+
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+
+	if (dst_freg != src2_freg) {
+		if (dst_freg == src1) {
+			src1 = src2_freg;
+			src1w = 0;
+			type ^= 0x1;
+		} else
+			FAIL_IF(push_inst(compiler, FSGNJ_S | FMT(type) | FRD(dst_freg) | FRS1(src2_freg) | FRS2(src2_freg)));
+	}
+
+	size = compiler->size;
+
+	ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));
+	FAIL_IF(!ptr);
+	compiler->size++;
+
+	if (src1 & SLJIT_MEM)
+		FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(type) | LOAD_DATA, dst_freg, src1, src1w));
+	else
+		FAIL_IF(push_inst(compiler, FSGNJ_S | FMT(type) | FRD(dst_freg) | FRS1(src1) | FRS2(src1)));
+
+	*ptr = get_jump_instruction(type & ~SLJIT_32) | (sljit_ins)((compiler->size - size) << 9);
+	return SLJIT_SUCCESS;
+}
+
+#undef FLOAT_DATA
+#undef FMT
+
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 reg,
 	sljit_s32 mem, sljit_sw memw)
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeS390X.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeS390X.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeS390X.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeS390X.c	2024-11-20 13:56:33.000000000 +0000
@@ -47,8 +47,8 @@ static const sljit_ins sljit_ins_const =
 #define TMP_REG1	(SLJIT_NUMBER_OF_REGISTERS + 2)
 #define TMP_REG2	(SLJIT_NUMBER_OF_REGISTERS + 3)
 
-static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 4] = {
-	0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 0, 1
+static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = {
+	0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 0, 1, 14
 };
 
 /* there are also a[2-15] available, but they are slower to access and
@@ -83,7 +83,7 @@ static const sljit_gpr r10 = 10;	/* reg_
 static const sljit_gpr r11 = 11;	/* reg_map[10] */
 static const sljit_gpr r12 = 12;	/* reg_map[11]: GOT */
 static const sljit_gpr r13 = 13;	/* reg_map[12]: Literal Pool pointer */
-static const sljit_gpr r14 = 14;	/* reg_map[0]: return address and flag register */
+static const sljit_gpr r14 = 14;	/* reg_map[0]: return address */
 static const sljit_gpr r15 = 15;	/* reg_map[SLJIT_NUMBER_OF_REGISTERS + 1]: stack pointer */
 
 /* WARNING: r12 and r13 shouldn't be used as per ABI recommendation */
@@ -96,20 +96,16 @@ static const sljit_gpr r15 = 15;	/* reg_
 #define tmp0	r0
 #define tmp1	r1
 
-/* TODO(carenas): flags should move to a different register so that
- *                link register doesn't need to change
- */
-
 /* When reg cannot be unused. */
 #define IS_GPR_REG(reg)		((reg > 0) && (reg) <= SLJIT_SP)
 
 /* Link register. */
 static const sljit_gpr link_r = 14;     /* r14 */
 
-#define TMP_FREG1	(0)
+#define TMP_FREG1	(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)
 
-static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1] = {
-	1, 0, 2, 4, 6, 3, 5, 7, 15, 14, 13, 12, 11, 10, 9, 8,
+static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2] = {
+	0, 0, 2, 4, 6, 3, 5, 7, 15, 14, 13, 12, 11, 10, 9, 8, 1
 };
 
 #define R0A(r) (r)
@@ -126,7 +122,10 @@ static const sljit_u8 freg_map[SLJIT_NUM
 
 #define F0(r) ((sljit_ins)freg_map[r])
 #define F4(r) (R4A((sljit_ins)freg_map[r]))
+#define F12(r) (R12A((sljit_ins)freg_map[r]))
 #define F20(r) (R20A((sljit_ins)freg_map[r]))
+#define F28(r) (R28A((sljit_ins)freg_map[r]))
+#define F32(r) (R32A((sljit_ins)freg_map[r]))
 #define F36(r) (R36A((sljit_ins)freg_map[r]))
 
 struct sljit_s390x_const {
@@ -141,12 +140,6 @@ static SLJIT_INLINE sljit_gpr gpr(sljit_
 	return reg_map[r];
 }
 
-static SLJIT_INLINE sljit_gpr fgpr(sljit_s32 r)
-{
-	SLJIT_ASSERT(r >= 0 && r < (sljit_s32)(sizeof(freg_map) / sizeof(freg_map[0])));
-	return freg_map[r];
-}
-
 /* Size of instruction in bytes. Tags must already be cleared. */
 static SLJIT_INLINE sljit_uw sizeof_ins(sljit_ins ins)
 {
@@ -217,6 +210,7 @@ static SLJIT_INLINE sljit_u8 get_cc(stru
 		}
 		/* fallthrough */
 
+	case SLJIT_ATOMIC_STORED:
 	case SLJIT_F_EQUAL:
 	case SLJIT_ORDERED_EQUAL:
 		return cc0;
@@ -236,6 +230,7 @@ static SLJIT_INLINE sljit_u8 get_cc(stru
 		return (cc1 | cc2 | cc3);
 
 	case SLJIT_LESS:
+	case SLJIT_ATOMIC_NOT_STORED:
 		return cc1;
 
 	case SLJIT_GREATER_EQUAL:
@@ -454,10 +449,12 @@ HAVE_FACILITY(have_misc2,   MISCELLANEOU
 
 static SLJIT_INLINE sljit_ins disp_s20(sljit_s32 d)
 {
+	sljit_uw dh, dl;
+
 	SLJIT_ASSERT(is_s20(d));
 
-	sljit_uw dh = (d >> 12) & 0xff;
-	sljit_uw dl = (d << 8) & 0xfff00;
+	dh = (d >> 12) & 0xff;
+	dl = ((sljit_uw)d << 8) & 0xfff00;
 	return (dh | dl) << 8;
 }
 
@@ -899,23 +896,17 @@ static sljit_s32 push_load_imm_inst(stru
 	if (((sljit_uw)v & ~(sljit_uw)0xffff000000000000) == 0)
 		return push_inst(compiler, llihh(target, (sljit_u16)(v >> 48)));
 
-	/* 6 byte instructions (requires extended immediate facility) */
-	if (have_eimm()) {
-		if (is_s32(v))
-			return push_inst(compiler, lgfi(target, (sljit_s32)v));
+	if (is_s32(v))
+		return push_inst(compiler, lgfi(target, (sljit_s32)v));
 
-		if (((sljit_uw)v >> 32) == 0)
-			return push_inst(compiler, llilf(target, (sljit_u32)v));
+	if (((sljit_uw)v >> 32) == 0)
+		return push_inst(compiler, llilf(target, (sljit_u32)v));
 
-		if (((sljit_uw)v << 32) == 0)
-			return push_inst(compiler, llihf(target, (sljit_u32)((sljit_uw)v >> 32)));
-
-		FAIL_IF(push_inst(compiler, llilf(target, (sljit_u32)v)));
-		return push_inst(compiler, iihf(target, (sljit_u32)(v >> 32)));
-	}
+	if (((sljit_uw)v << 32) == 0)
+		return push_inst(compiler, llihf(target, (sljit_u32)((sljit_uw)v >> 32)));
 
-	/* TODO(mundaym): instruction sequences that don't use extended immediates */
-	abort();
+	FAIL_IF(push_inst(compiler, llilf(target, (sljit_u32)v)));
+	return push_inst(compiler, iihf(target, (sljit_u32)(v >> 32)));
 }
 
 struct addr {
@@ -995,24 +986,47 @@ static sljit_s32 make_addr_bx(struct slj
 	(cond) ? EVAL(i1, r, addr) : EVAL(i2, r, addr)
 
 /* May clobber tmp1. */
-static sljit_s32 load_word(struct sljit_compiler *compiler, sljit_gpr dst_r,
-		sljit_s32 src, sljit_sw srcw,
-		sljit_s32 is_32bit)
+static sljit_s32 load_store_op(struct sljit_compiler *compiler, sljit_gpr reg,
+		sljit_s32 mem, sljit_sw memw,
+		sljit_s32 is_32bit, const sljit_ins* forms)
 {
 	struct addr addr;
-	sljit_ins ins;
 
-	SLJIT_ASSERT(src & SLJIT_MEM);
+	SLJIT_ASSERT(mem & SLJIT_MEM);
 
-	if (is_32bit && ((src & OFFS_REG_MASK) || is_u12(srcw) || !is_s20(srcw))) {
-		FAIL_IF(make_addr_bx(compiler, &addr, src, srcw, tmp1));
-		return push_inst(compiler, 0x58000000 /* l */ | R20A(dst_r) | R16A(addr.index) | R12A(addr.base) | (sljit_ins)addr.offset);
+	if (is_32bit && ((mem & OFFS_REG_MASK) || is_u12(memw) || !is_s20(memw))) {
+		FAIL_IF(make_addr_bx(compiler, &addr, mem, memw, tmp1));
+		return push_inst(compiler, forms[0] | R20A(reg) | R16A(addr.index) | R12A(addr.base) | (sljit_ins)addr.offset);
 	}
 
-	FAIL_IF(make_addr_bxy(compiler, &addr, src, srcw, tmp1));
+	FAIL_IF(make_addr_bxy(compiler, &addr, mem, memw, tmp1));
+	return push_inst(compiler, (is_32bit ? forms[1] : forms[2]) | R36A(reg) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset));
+}
 
-	ins = is_32bit ? 0xe30000000058 /* ly */ : 0xe30000000004 /* lg */;
-	return push_inst(compiler, ins | R36A(dst_r) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset));
+static const sljit_ins load_forms[3] = {
+	0x58000000 /* l */,
+	0xe30000000058 /* ly */,
+	0xe30000000004 /* lg */
+};
+
+static const sljit_ins store_forms[3] = {
+	0x50000000 /* st */,
+	0xe30000000050 /* sty */,
+	0xe30000000024 /* stg */
+};
+
+static const sljit_ins load_halfword_forms[3] = {
+	0x48000000 /* lh */,
+	0xe30000000078 /* lhy */,
+	0xe30000000015 /* lgh */
+};
+
+/* May clobber tmp1. */
+static SLJIT_INLINE sljit_s32 load_word(struct sljit_compiler *compiler, sljit_gpr dst_r,
+		sljit_s32 src, sljit_sw srcw,
+		sljit_s32 is_32bit)
+{
+	return load_store_op(compiler, dst_r, src, srcw, is_32bit, load_forms);
 }
 
 /* May clobber tmp1. */
@@ -1032,24 +1046,11 @@ static sljit_s32 load_unsigned_word(stru
 }
 
 /* May clobber tmp1. */
-static sljit_s32 store_word(struct sljit_compiler *compiler, sljit_gpr src_r,
+static SLJIT_INLINE sljit_s32 store_word(struct sljit_compiler *compiler, sljit_gpr src_r,
 		sljit_s32 dst, sljit_sw dstw,
 		sljit_s32 is_32bit)
 {
-	struct addr addr;
-	sljit_ins ins;
-
-	SLJIT_ASSERT(dst & SLJIT_MEM);
-
-	if (is_32bit && ((dst & OFFS_REG_MASK) || is_u12(dstw) || !is_s20(dstw))) {
-		FAIL_IF(make_addr_bx(compiler, &addr, dst, dstw, tmp1));
-		return push_inst(compiler, 0x50000000 /* st */ | R20A(src_r) | R16A(addr.index) | R12A(addr.base) | (sljit_ins)addr.offset);
-	}
-
-	FAIL_IF(make_addr_bxy(compiler, &addr, dst, dstw, tmp1));
-
-	ins = is_32bit ? 0xe30000000050 /* sty */ : 0xe30000000024 /* stg */;
-	return push_inst(compiler, ins | R36A(src_r) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset));
+	return load_store_op(compiler, src_r, dst, dstw, is_32bit, store_forms);
 }
 
 #undef WHEN
@@ -1058,15 +1059,17 @@ static sljit_s32 emit_move(struct sljit_
 	sljit_gpr dst_r,
 	sljit_s32 src, sljit_sw srcw)
 {
+	sljit_gpr src_r;
+
 	SLJIT_ASSERT(!IS_GPR_REG(src) || dst_r != gpr(src & REG_MASK));
 
-	if (src & SLJIT_IMM)
+	if (src == SLJIT_IMM)
 		return push_load_imm_inst(compiler, dst_r, srcw);
 
 	if (src & SLJIT_MEM)
 		return load_word(compiler, dst_r, src, srcw, (compiler->mode & SLJIT_32) != 0);
 
-	sljit_gpr src_r = gpr(src & REG_MASK);
+	src_r = gpr(src & REG_MASK);
 	return push_inst(compiler, (compiler->mode & SLJIT_32) ? lr(dst_r, src_r) : lgr(dst_r, src_r));
 }
 
@@ -1259,10 +1262,10 @@ static sljit_s32 emit_siy(struct sljit_c
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_sw srcw)
 {
-	SLJIT_ASSERT(dst & SLJIT_MEM);
-
 	sljit_gpr dst_r = tmp1;
 
+	SLJIT_ASSERT(dst & SLJIT_MEM);
+
 	if (dst & OFFS_REG_MASK) {
 		sljit_gpr index = tmp1;
 
@@ -1567,6 +1570,8 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 			if (jump && jump->addr == j) {
 				sljit_sw target = (sljit_sw)((jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target);
 				if ((jump->flags & SLJIT_REWRITABLE_JUMP) || (jump->flags & JUMP_ADDR)) {
+					sljit_ins op, arg;
+
 					jump->addr = (sljit_uw)pool_ptr;
 
 					/* load address into tmp1 */
@@ -1583,8 +1588,8 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 					*(pool_ptr++) = (sljit_uw)target;
 
 					/* branch to tmp1 */
-					sljit_ins op = (ins >> 32) & 0xf;
-					sljit_ins arg = (ins >> 36) & 0xf;
+					op = (ins >> 32) & 0xf;
+					arg = (ins >> 36) & 0xf;
 					switch (op) {
 					case 4: /* brcl -> bcr */
 						ins = bcr(arg, tmp1);
@@ -1638,6 +1643,8 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
 	compiler->error = SLJIT_ERR_COMPILED;
 	compiler->executable_offset = executable_offset;
 	compiler->executable_size = ins_size;
+	if (pool_size)
+		compiler->executable_size += (pad_size + pool_size);
 	code = SLJIT_ADD_EXEC_OFFSET(code, executable_offset);
 	code_ptr = SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
 	SLJIT_CACHE_FLUSH(code, code_ptr);
@@ -1650,12 +1657,25 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	/* TODO(mundaym): implement all */
 	switch (feature_type) {
 	case SLJIT_HAS_FPU:
+#ifdef SLJIT_IS_FPU_AVAILABLE
+		return (SLJIT_IS_FPU_AVAILABLE) != 0;
+#else
+		return 1;
+#endif /* SLJIT_IS_FPU_AVAILABLE */
+
 	case SLJIT_HAS_CLZ:
+	case SLJIT_HAS_REV:
 	case SLJIT_HAS_ROT:
 	case SLJIT_HAS_PREFETCH:
+	case SLJIT_HAS_COPY_F32:
+	case SLJIT_HAS_COPY_F64:
+	case SLJIT_HAS_SIMD:
+	case SLJIT_HAS_ATOMIC:
 		return 1;
+
 	case SLJIT_HAS_CTZ:
 		return 2;
+
 	case SLJIT_HAS_CMOV:
 		return have_lscond1() ? 1 : 0;
 	}
@@ -1664,7 +1684,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type)
 {
-	return (type >= SLJIT_UNORDERED && type <= SLJIT_ORDERED_LESS_EQUAL);
+	SLJIT_UNUSED_ARG(type);
+	return 0;
 }
 
 /* --------------------------------------------------------------------- */
@@ -1741,7 +1762,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	local_size = (local_size + SLJIT_S390X_DEFAULT_STACK_FRAME_SIZE + 0xf) & ~0xf;
 	compiler->local_size = local_size;
 
-	FAIL_IF(push_inst(compiler, 0xe30000000071 /* lay */ | R36A(r15) | R28A(r15) | disp_s20(-local_size)));
+	if (is_s20(-local_size))
+		FAIL_IF(push_inst(compiler, 0xe30000000071 /* lay */ | R36A(r15) | R28A(r15) | disp_s20(-local_size)));
+	else
+		FAIL_IF(push_inst(compiler, 0xc20400000000 /* slgfi */ | R36A(r15) | (sljit_ins)local_size));
 
 	if (options & SLJIT_ENTER_REG_ARG)
 		return SLJIT_SUCCESS;
@@ -1786,8 +1810,10 @@ static sljit_s32 emit_stack_frame_releas
 
 	if (is_u12(local_size))
 		FAIL_IF(push_inst(compiler, 0x41000000 /* ly */ | R20A(r15) | R12A(r15) | (sljit_ins)local_size));
-	else
+	else if (is_s20(local_size))
 		FAIL_IF(push_inst(compiler, 0xe30000000071 /* lay */ | R36A(r15) | R28A(r15) | disp_s20(local_size)));
+	else
+		FAIL_IF(push_inst(compiler, 0xc20a00000000 /* algfi */ | R36A(r15) | (sljit_ins)local_size));
 
 	offset = 2 * SSIZE_OF(sw);
 	if (saveds + scratches >= SLJIT_NUMBER_OF_REGISTERS) {
@@ -2011,12 +2037,85 @@ static sljit_s32 sljit_emit_clz_ctz(stru
 	return push_inst(compiler, ((op & SLJIT_32) ? 0x1800 /* lr */ : 0xb9040000 /* lgr */) | R4A(dst_r) | R0A(tmp0));
 }
 
+static sljit_s32 sljit_emit_rev(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	struct addr addr;
+	sljit_gpr reg;
+	sljit_ins ins;
+	sljit_s32 opcode = GET_OPCODE(op);
+	sljit_s32 is_16bit = (opcode == SLJIT_REV_U16 || opcode == SLJIT_REV_S16);
+
+	if (dst & SLJIT_MEM) {
+		if (src & SLJIT_MEM) {
+			FAIL_IF(load_store_op(compiler, tmp0, src, srcw, op & SLJIT_32, is_16bit ? load_halfword_forms : load_forms));
+			reg = tmp0;
+		} else
+			reg = gpr(src);
+
+		FAIL_IF(make_addr_bxy(compiler, &addr, dst, dstw, tmp1));
+
+		if (is_16bit)
+			ins = 0xe3000000003f /* strvh */;
+		else
+			ins = (op & SLJIT_32) ? 0xe3000000003e /* strv */ : 0xe3000000002f /* strvg */;
+
+		return push_inst(compiler, ins | R36A(reg) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset));
+	}
+
+	reg = gpr(dst);
+
+	if (src & SLJIT_MEM) {
+		FAIL_IF(make_addr_bxy(compiler, &addr, src, srcw, tmp1));
+
+		if (is_16bit)
+			ins = 0xe3000000001f /* lrvh */;
+		else
+			ins = (op & SLJIT_32) ? 0xe3000000001e /* lrv */ : 0xe3000000000f /* lrvg */;
+
+		FAIL_IF(push_inst(compiler, ins | R36A(reg) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset)));
+
+		if (opcode == SLJIT_REV)
+			return SLJIT_SUCCESS;
+
+		if (is_16bit) {
+			if (op & SLJIT_32)
+				ins = (opcode == SLJIT_REV_U16) ? 0xb9950000 /* llhr */ : 0xb9270000 /* lhr */;
+			else
+				ins = (opcode == SLJIT_REV_U16) ? 0xb9850000 /* llghr */ : 0xb9070000 /* lghr */;
+		} else
+			ins = (opcode == SLJIT_REV_U32) ? 0xb9160000 /* llgfr */ : 0xb9140000 /* lgfr */;
+
+		return push_inst(compiler, ins | R4A(reg) | R0A(reg));
+	}
+
+	ins = (op & SLJIT_32) ? 0xb91f0000 /* lrvr */ : 0xb90f0000 /* lrvgr */;
+	FAIL_IF(push_inst(compiler, ins | R4A(reg) | R0A(gpr(src))));
+
+	if (opcode == SLJIT_REV)
+		return SLJIT_SUCCESS;
+
+	if (!is_16bit) {
+		ins = (opcode == SLJIT_REV_U32) ? 0xb9160000 /* llgfr */ : 0xb9140000 /* lgfr */;
+		return push_inst(compiler, ins | R4A(reg) | R0A(reg));
+	}
+
+	if (op & SLJIT_32) {
+		ins = (opcode == SLJIT_REV_U16) ? 0x88000000 /* srl */ : 0x8a000000 /* sra */;
+		return push_inst(compiler, ins | R20A(reg) | 16);
+	}
+
+	ins = (opcode == SLJIT_REV_U16) ? 0xeb000000000c /* srlg */ : 0xeb000000000a /* srag */;
+	return push_inst(compiler, ins | R36A(reg) | R32A(reg) | (48 << 16));
+}
+
 /* LEVAL will be defined later with different parameters as needed */
 #define WHEN2(cond, i1, i2) (cond) ? LEVAL(i1) : LEVAL(i2)
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
-        sljit_s32 dst, sljit_sw dstw,
-        sljit_s32 src, sljit_sw srcw)
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
 {
 	sljit_ins ins;
 	struct addr mem;
@@ -2087,7 +2186,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			return SLJIT_SUCCESS;
 		}
 		/* LOAD IMMEDIATE */
-		if (FAST_IS_REG(dst) && (src & SLJIT_IMM)) {
+		if (FAST_IS_REG(dst) && src == SLJIT_IMM) {
 			switch (opcode) {
 			case SLJIT_MOV_U8:
 				srcw = (sljit_sw)((sljit_u8)(srcw));
@@ -2166,14 +2265,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			return SLJIT_SUCCESS;
 		}
 		/* STORE and STORE IMMEDIATE */
-		if ((dst & SLJIT_MEM)
-			&& (FAST_IS_REG(src) || (src & SLJIT_IMM))) {
+		if ((dst & SLJIT_MEM) && (FAST_IS_REG(src) || src == SLJIT_IMM)) {
+			struct addr mem;
 			sljit_gpr reg = FAST_IS_REG(src) ? gpr(src) : tmp0;
-			if (src & SLJIT_IMM) {
+
+			if (src == SLJIT_IMM) {
 				/* TODO(mundaym): MOVE IMMEDIATE? */
 				FAIL_IF(push_load_imm_inst(compiler, reg, srcw));
 			}
-			struct addr mem;
 			FAIL_IF(make_addr_bxy(compiler, &mem, dst, dstw, tmp1));
 			switch (opcode) {
 			case SLJIT_MOV_U8:
@@ -2240,39 +2339,15 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		SLJIT_UNREACHABLE();
 	}
 
-	SLJIT_ASSERT((src & SLJIT_IMM) == 0); /* no immediates */
+	SLJIT_ASSERT(src != SLJIT_IMM);
 
-	dst_r = FAST_IS_REG(dst) ? gpr(REG_MASK & dst) : tmp0;
-	src_r = FAST_IS_REG(src) ? gpr(REG_MASK & src) : tmp0;
+	dst_r = FAST_IS_REG(dst) ? gpr(dst) : tmp0;
+	src_r = FAST_IS_REG(src) ? gpr(src) : tmp0;
 
 	compiler->status_flags_state = op & (VARIABLE_FLAG_MASK | SLJIT_SET_Z);
 
 	/* TODO(mundaym): optimize loads and stores */
 	switch (opcode) {
-	case SLJIT_NOT:
-		if (src & SLJIT_MEM)
-			FAIL_IF(load_word(compiler, src_r, src, srcw, op & SLJIT_32));
-
-		/* emulate ~x with x^-1 */
-		if (!(op & SLJIT_32)) {
-			FAIL_IF(push_load_imm_inst(compiler, tmp1, -1));
-			if (src_r != dst_r)
-				FAIL_IF(push_inst(compiler, lgr(dst_r, src_r)));
-
-			FAIL_IF(push_inst(compiler, xgr(dst_r, tmp1)));
-			break;
-		}
-
-		if (have_eimm())
-			FAIL_IF(push_inst(compiler, xilf(dst_r, 0xffffffff)));
-		else {
-			FAIL_IF(push_load_imm_inst(compiler, tmp1, -1));
-			if (src_r != dst_r)
-				FAIL_IF(push_inst(compiler, lr(dst_r, src_r)));
-
-			FAIL_IF(push_inst(compiler, xr(dst_r, tmp1)));
-		}
-		break;
 	case SLJIT_CLZ:
 	case SLJIT_CTZ:
 		if (src & SLJIT_MEM)
@@ -2280,13 +2355,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 		FAIL_IF(sljit_emit_clz_ctz(compiler, op, dst_r, src_r));
 		break;
+	case SLJIT_REV_U32:
+	case SLJIT_REV_S32:
+		op |= SLJIT_32;
+		/* fallthrough */
+	case SLJIT_REV:
+	case SLJIT_REV_U16:
+	case SLJIT_REV_S16:
+		return sljit_emit_rev(compiler, op, dst, dstw, src, srcw);
 	default:
 		SLJIT_UNREACHABLE();
 	}
 
-	if ((op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_SET_Z | SLJIT_SET_OVERFLOW))
-		FAIL_IF(update_zero_overflow(compiler, op, dst_r));
-
 	if (dst & SLJIT_MEM)
 		return store_word(compiler, dst_r, dst, dstw, op & SLJIT_32);
 
@@ -2337,7 +2417,7 @@ static sljit_s32 sljit_emit_add(struct s
 	const struct ins_forms *forms;
 	sljit_ins ins;
 
-	if (src2 & SLJIT_IMM) {
+	if (src2 == SLJIT_IMM) {
 		if (!sets_zero_overflow && is_s8(src2w) && (src1 & SLJIT_MEM) && (dst == src1 && dstw == src1w)) {
 			if (sets_overflow)
 				ins = (op & SLJIT_32) ? 0xeb000000006a /* asi */ : 0xeb000000007a /* agsi */;
@@ -2422,9 +2502,8 @@ static sljit_s32 sljit_emit_sub(struct s
 
 		compiler->status_flags_state |= SLJIT_CURRENT_FLAGS_COMPARE;
 
-		if (src2 & SLJIT_IMM) {
-			if (compare_signed || ((op & VARIABLE_FLAG_MASK) == 0 && is_s32(src2w)))
-			{
+		if (src2 == SLJIT_IMM) {
+			if (compare_signed || ((op & VARIABLE_FLAG_MASK) == 0 && is_s32(src2w))) {
 				if ((op & SLJIT_32) || is_s32(src2w)) {
 					ins = (op & SLJIT_32) ? 0xc20d00000000 /* cfi */ : 0xc20c00000000 /* cgfi */;
 					return emit_ri(compiler, ins, src1, src1, src1w, src2w, RIL_A);
@@ -2465,7 +2544,7 @@ static sljit_s32 sljit_emit_sub(struct s
 		goto done;
 	}
 
-	if (src2 & SLJIT_IMM) {
+	if (src2 == SLJIT_IMM) {
 		sljit_sw neg_src2w = -src2w;
 
 		if (sets_signed || neg_src2w != 0 || (op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == 0) {
@@ -2573,7 +2652,7 @@ static sljit_s32 sljit_emit_multiply(str
 		return emit_commutative(compiler, &multiply_overflow_forms, dst, src1, src1w, src2, src2w);
 	}
 
-	if (src2 & SLJIT_IMM) {
+	if (src2 == SLJIT_IMM) {
 		if (is_s16(src2w)) {
 			ins = (op & SLJIT_32) ? 0xa70c0000 /* mhi */ : 0xa70d0000 /* mghi */;
 			return emit_ri(compiler, ins, dst, src1, src1w, src2w, RI_A);
@@ -2680,7 +2759,7 @@ static sljit_s32 sljit_emit_bitwise(stru
 	sljit_s32 type = GET_OPCODE(op);
 	const struct ins_forms *forms;
 
-	if ((src2 & SLJIT_IMM) && (!(op & SLJIT_SET_Z) || (type == SLJIT_AND && dst == (sljit_s32)tmp0))) {
+	if (src2 == SLJIT_IMM && (!(op & SLJIT_SET_Z) || (type == SLJIT_AND && dst == (sljit_s32)tmp0))) {
 		sljit_s32 count16 = 0;
 		sljit_uw imm = (sljit_uw)src2w;
 
@@ -2705,12 +2784,12 @@ static sljit_s32 sljit_emit_bitwise(stru
 				FAIL_IF(emit_move(compiler, tmp0, src1, src1w));
 
 			if ((imm & 0x000000000000ffffull) != 0 || imm == 0)
-				return push_inst(compiler, 0xa7010000 | R20A(src_r) | imm);
+				return push_inst(compiler, 0xa7010000 /* tmll */ | R20A(src_r) | imm);
 			if ((imm & 0x00000000ffff0000ull) != 0)
-				return push_inst(compiler, 0xa7000000 | R20A(src_r) | (imm >> 16));
+				return push_inst(compiler, 0xa7000000 /* tmlh */ | R20A(src_r) | (imm >> 16));
 			if ((imm & 0x0000ffff00000000ull) != 0)
-				return push_inst(compiler, 0xa7030000 | R20A(src_r) | (imm >> 32));
-			return push_inst(compiler, 0xa7020000 | R20A(src_r) | (imm >> 48));
+				return push_inst(compiler, 0xa7030000 /* tmhl */ | R20A(src_r) | (imm >> 32));
+			return push_inst(compiler, 0xa7020000 /* tmhh */ | R20A(src_r) | (imm >> 48));
 		}
 
 		if (!(op & SLJIT_SET_Z))
@@ -2744,7 +2823,7 @@ static sljit_s32 sljit_emit_shift(struct
 	else
 		FAIL_IF(emit_move(compiler, tmp0, src1, src1w));
 
-	if (!(src2 & SLJIT_IMM)) {
+	if (src2 != SLJIT_IMM) {
 		if (FAST_IS_REG(src2))
 			base_r = gpr(src2);
 		else {
@@ -2804,7 +2883,7 @@ static sljit_s32 sljit_emit_rotate(struc
 	else
 		FAIL_IF(emit_move(compiler, tmp0, src1, src1w));
 
-	if (!(src2 & SLJIT_IMM)) {
+	if (src2 != SLJIT_IMM) {
 		if (FAST_IS_REG(src2))
 			base_r = gpr(src2);
 		else {
@@ -2814,7 +2893,7 @@ static sljit_s32 sljit_emit_rotate(struc
 	}
 
 	if (GET_OPCODE(op) == SLJIT_ROTR) {
-		if (!(src2 & SLJIT_IMM)) {
+		if (src2 != SLJIT_IMM) {
 			ins = (op & SLJIT_32) ? 0x1300 /* lcr */ : 0xb9030000 /* lcgr */;
 			FAIL_IF(push_inst(compiler, ins | R4A(tmp1) | R0A(base_r)));
 			base_r = tmp1;
@@ -2822,7 +2901,7 @@ static sljit_s32 sljit_emit_rotate(struc
 			src2w = -src2w;
 	}
 
-	if (src2 & SLJIT_IMM)
+	if (src2 == SLJIT_IMM)
 		imm = (sljit_ins)(src2w & ((op & SLJIT_32) ? 0x1f : 0x3f));
 
 	ins = (op & SLJIT_32) ? 0xeb000000001d /* rll */ : 0xeb000000001c /* rllg */;
@@ -2863,7 +2942,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	compiler->mode = op & SLJIT_32;
 	compiler->status_flags_state = op & (VARIABLE_FLAG_MASK | SLJIT_SET_Z);
 
-	if (is_commutative(op) && (src1 & SLJIT_IMM) && !(src2 & SLJIT_IMM)) {
+	if (is_commutative(op) && src1 == SLJIT_IMM && src2 != SLJIT_IMM) {
 		src1 ^= src2;
 		src2 ^= src1;
 		src1 ^= src2;
@@ -2931,122 +3010,125 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 src_dst,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w)
+	sljit_s32 dst_reg,
+	sljit_s32 src1_reg,
+	sljit_s32 src2_reg,
+	sljit_s32 src3, sljit_sw src3w)
 {
 	sljit_s32 is_right;
 	sljit_sw bit_length = (op & SLJIT_32) ? 32 : 64;
-	sljit_gpr src_dst_r = gpr(src_dst);
-	sljit_gpr src1_r = tmp0;
-	sljit_gpr src2_r = tmp1;
+	sljit_gpr dst_r = gpr(dst_reg);
+	sljit_gpr src1_r = gpr(src1_reg);
+	sljit_gpr src2_r = gpr(src2_reg);
+	sljit_gpr src3_r = tmp1;
 	sljit_ins ins;
 
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_shift_into(compiler, op, src_dst, src1, src1w, src2, src2w));
+	CHECK(check_sljit_emit_shift_into(compiler, op, dst_reg, src1_reg, src2_reg, src3, src3w));
 
 	is_right = (GET_OPCODE(op) == SLJIT_LSHR || GET_OPCODE(op) == SLJIT_MLSHR);
 
-	if (src_dst == src1) {
+	if (src1_reg == src2_reg) {
 		SLJIT_SKIP_CHECKS(compiler);
-		return sljit_emit_op2(compiler, (is_right ? SLJIT_ROTR : SLJIT_ROTL) | (op & SLJIT_32), src_dst, 0, src_dst, 0, src2, src2w);
+		return sljit_emit_op2(compiler, (is_right ? SLJIT_ROTR : SLJIT_ROTL) | (op & SLJIT_32), dst_reg, 0, src1_reg, 0, src3, src3w);
 	}
 
-	ADJUST_LOCAL_OFFSET(src1, src1w);
-	ADJUST_LOCAL_OFFSET(src2, src2w);
+	ADJUST_LOCAL_OFFSET(src3, src3w);
 
-	if (src1 & SLJIT_MEM)
-		FAIL_IF(load_word(compiler, tmp0, src1, src1w, op & SLJIT_32));
-	else if (src1 & SLJIT_IMM)
-		FAIL_IF(push_load_imm_inst(compiler, tmp0, src1w));
-	else
-		src1_r = gpr(src1);
-
-	if (src2 & SLJIT_IMM) {
-		src2w &= bit_length - 1;
+	if (src3 == SLJIT_IMM) {
+		src3w &= bit_length - 1;
 
-		if (src2w == 0)
+		if (src3w == 0)
 			return SLJIT_SUCCESS;
-	} else if (!(src2 & SLJIT_MEM))
-		src2_r = gpr(src2);
-	else
-		FAIL_IF(load_word(compiler, tmp1, src2, src2w, op & SLJIT_32));
 
-	if (src2 & SLJIT_IMM) {
 		if (op & SLJIT_32) {
-			ins = is_right ? 0x88000000 /* srl */ : 0x89000000 /* sll */;
-			FAIL_IF(push_inst(compiler, ins | R20A(src_dst_r) | (sljit_ins)src2w));
+			if (dst_r == src1_r) {
+				ins = is_right ? 0x88000000 /* srl */ : 0x89000000 /* sll */;
+				FAIL_IF(push_inst(compiler, ins | R20A(dst_r) | (sljit_ins)src3w));
+			} else {
+				ins = is_right ? 0xeb00000000de /* srlk */ : 0xeb00000000df /* sllk */;
+				FAIL_IF(push_inst(compiler, ins | R36A(dst_r) | R32A(src1_r) | ((sljit_ins)src3w << 16)));
+			}
 		} else {
 			ins = is_right ? 0xeb000000000c /* srlg */ : 0xeb000000000d /* sllg */;
-			FAIL_IF(push_inst(compiler, ins | R36A(src_dst_r) | R32A(src_dst_r) | ((sljit_ins)src2w << 16)));
+			FAIL_IF(push_inst(compiler, ins | R36A(dst_r) | R32A(src1_r) | ((sljit_ins)src3w << 16)));
 		}
 
 		ins = 0xec0000000055 /* risbg */;
 
 		if (is_right) {
-			src2w = bit_length - src2w;
-			ins |= ((sljit_ins)(64 - bit_length) << 24) | ((sljit_ins)(63 - src2w) << 16) | ((sljit_ins)src2w << 8);
+			src3w = bit_length - src3w;
+			ins |= ((sljit_ins)(64 - bit_length) << 24) | ((sljit_ins)(63 - src3w) << 16) | ((sljit_ins)src3w << 8);
 		} else
-			ins |= ((sljit_ins)(64 - src2w) << 24) | ((sljit_ins)63 << 16) | ((sljit_ins)src2w << 8);
+			ins |= ((sljit_ins)(64 - src3w) << 24) | ((sljit_ins)63 << 16) | ((sljit_ins)(src3w + 64 - bit_length) << 8);
 
-		return push_inst(compiler, ins | R36A(src_dst_r) | R32A(src1_r));
+		return push_inst(compiler, ins | R36A(dst_r) | R32A(src2_r));
 	}
 
+	if (!(src3 & SLJIT_MEM)) {
+		src3_r = gpr(src3);
+
+		if (dst_r == src3_r) {
+			FAIL_IF(push_inst(compiler, 0x1800 /* lr */ | R4A(tmp1) | R0A(src3_r)));
+			src3_r = tmp1;
+		}
+	} else
+		FAIL_IF(load_word(compiler, tmp1, src3, src3w, op & SLJIT_32));
+
 	if (op & SLJIT_32) {
 		if (GET_OPCODE(op) == SLJIT_MSHL || GET_OPCODE(op) == SLJIT_MLSHR) {
-			if (src2_r != tmp1) {
-				FAIL_IF(push_inst(compiler, 0xec0000000055 /* risbg */ | R36A(tmp1) | R32A(src2_r) | (59 << 24) | (1 << 23) | (63 << 16)));
-				src2_r = tmp1;
+			if (src3_r != tmp1) {
+				FAIL_IF(push_inst(compiler, 0xec0000000055 /* risbg */ | R36A(tmp1) | R32A(src3_r) | (59 << 24) | (1 << 23) | (63 << 16)));
+				src3_r = tmp1;
 			} else
 				FAIL_IF(push_inst(compiler, 0xa5070000 /* nill */ | R20A(tmp1) | 0x1f));
 		}
 
-		ins = is_right ? 0x88000000 /* srl */ : 0x89000000 /* sll */;
-		FAIL_IF(push_inst(compiler, ins | R20A(src_dst_r) | R12A(src2_r)));
+		if (dst_r == src1_r) {
+			ins = is_right ? 0x88000000 /* srl */ : 0x89000000 /* sll */;
+			FAIL_IF(push_inst(compiler, ins | R20A(dst_r) | R12A(src3_r)));
+		} else {
+			ins = is_right ? 0xeb00000000de /* srlk */ : 0xeb00000000df /* sllk */;
+			FAIL_IF(push_inst(compiler, ins | R36A(dst_r) | R32A(src1_r) | R28A(src3_r)));
+		}
 
-		if (src2_r != tmp1) {
+		if (src3_r != tmp1) {
 			FAIL_IF(push_inst(compiler, 0xa50f0000 /* llill */ | R20A(tmp1) | 0x1f));
-			FAIL_IF(push_inst(compiler, 0x1700 /* xr */ | R4A(tmp1) | R0A(src2_r)));
+			FAIL_IF(push_inst(compiler, 0x1700 /* xr */ | R4A(tmp1) | R0A(src3_r)));
 		} else
 			FAIL_IF(push_inst(compiler, 0xc00700000000 /* xilf */ | R36A(tmp1) | 0x1f));
 
-		if (src1_r == tmp0) {
-			ins = is_right ? 0x89000000 /* sll */ : 0x88000000 /* srl */;
-			FAIL_IF(push_inst(compiler, ins | R20A(tmp0) | R12A(tmp1) | 0x1));
-		} else {
-			ins = is_right ? 0xeb00000000df /* sllk */ : 0xeb00000000de /* srlk */;
-			FAIL_IF(push_inst(compiler, ins | R36A(tmp0) | R32A(src1_r) | R28A(tmp1) | (0x1 << 16)));
-		}
+		ins = is_right ? 0xeb00000000df /* sllk */ : 0xeb00000000de /* srlk */;
+		FAIL_IF(push_inst(compiler, ins | R36A(tmp0) | R32A(src2_r) | R28A(tmp1) | (0x1 << 16)));
 
-		return push_inst(compiler, 0x1600 /* or */ | R4A(src_dst_r) | R0A(tmp0));
+		return push_inst(compiler, 0x1600 /* or */ | R4A(dst_r) | R0A(tmp0));
 	}
 
 	ins = is_right ? 0xeb000000000c /* srlg */ : 0xeb000000000d /* sllg */;
-	FAIL_IF(push_inst(compiler, ins | R36A(src_dst_r) | R32A(src_dst_r) | R28A(src2_r)));
+	FAIL_IF(push_inst(compiler, ins | R36A(dst_r) | R32A(src1_r) | R28A(src3_r)));
 
 	ins = is_right ? 0xeb000000000d /* sllg */ : 0xeb000000000c /* srlg */;
 
 	if (!(op & SLJIT_SHIFT_INTO_NON_ZERO)) {
-		if (src2_r != tmp1)
+		if (src3_r != tmp1)
 			FAIL_IF(push_inst(compiler, 0xa50f0000 /* llill */ | R20A(tmp1) | 0x3f));
 
-		FAIL_IF(push_inst(compiler, ins | R36A(tmp0) | R32A(src1_r) | (0x1 << 16)));
-		src1_r = tmp0;
+		FAIL_IF(push_inst(compiler, ins | R36A(tmp0) | R32A(src2_r) | (0x1 << 16)));
+		src2_r = tmp0;
 
-		if (src2_r != tmp1)
-			FAIL_IF(push_inst(compiler, 0xb9820000 /* xgr */ | R4A(tmp1) | R0A(src2_r)));
+		if (src3_r != tmp1)
+			FAIL_IF(push_inst(compiler, 0xb9820000 /* xgr */ | R4A(tmp1) | R0A(src3_r)));
 		else
 			FAIL_IF(push_inst(compiler, 0xc00700000000 /* xilf */ | R36A(tmp1) | 0x3f));
 	} else
-		FAIL_IF(push_inst(compiler, 0xb9030000 /* lcgr */ | R4A(tmp1) | R0A(src2_r)));
+		FAIL_IF(push_inst(compiler, 0xb9030000 /* lcgr */ | R4A(tmp1) | R0A(src3_r)));
 
-	FAIL_IF(push_inst(compiler, ins | R36A(tmp0) | R32A(src1_r) | R28A(tmp1)));
-	return push_inst(compiler, 0xb9810000 /* ogr */ | R4A(src_dst_r) | R0A(tmp0));
+	FAIL_IF(push_inst(compiler, ins | R36A(tmp0) | R32A(src2_r) | R28A(tmp1)));
+	return push_inst(compiler, 0xb9810000 /* ogr */ | R4A(dst_r) | R0A(tmp0));
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(
-	struct sljit_compiler *compiler,
-	sljit_s32 op, sljit_s32 src, sljit_sw srcw)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 src, sljit_sw srcw)
 {
 	sljit_gpr src_r;
 	struct addr addr;
@@ -3077,16 +3159,46 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw)
 {
-	CHECK_REG_INDEX(check_sljit_get_register_index(reg));
-	return (sljit_s32)gpr(reg);
+	sljit_gpr dst_r = link_r;
+	sljit_s32 size;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_op_dst(compiler, op, dst, dstw));
+	ADJUST_LOCAL_OFFSET(dst, dstw);
+
+	switch (op) {
+	case SLJIT_FAST_ENTER:
+		if (FAST_IS_REG(dst))
+			return push_inst(compiler, lgr(gpr(dst), link_r));
+		break;
+	case SLJIT_GET_RETURN_ADDRESS:
+		dst_r = FAST_IS_REG(dst) ? gpr(dst) : tmp0;
+
+		size = GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds - SLJIT_KEPT_SAVEDS_COUNT(compiler->options), 2);
+		FAIL_IF(load_word(compiler, dst_r, SLJIT_MEM1(SLJIT_SP), compiler->local_size + size, 0));
+		break;
+	}
+
+	if (dst & SLJIT_MEM)
+		return store_word(compiler, dst_r, dst, dstw, 0);
+
+	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg)
 {
-	CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
-	return (sljit_s32)fgpr(reg);
+	CHECK_REG_INDEX(check_sljit_get_register_index(type, reg));
+
+	if (type == SLJIT_GP_REGISTER)
+		return (sljit_s32)gpr(reg);
+
+	if (type != SLJIT_FLOAT_REGISTER)
+		return -1;
+
+	return (sljit_s32)freg_map[reg];
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
@@ -3177,33 +3289,61 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 	return SLJIT_SUCCESS;
 }
 
-static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
+static sljit_s32 sljit_emit_fop1_conv_f64_from_w(struct sljit_compiler *compiler, sljit_ins ins,
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 src, sljit_sw srcw)
 {
 	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
-	sljit_ins ins;
 
-	if (src & SLJIT_IMM) {
+	if (src == SLJIT_IMM) {
 		FAIL_IF(push_load_imm_inst(compiler, tmp0, srcw));
 		src = (sljit_s32)tmp0;
 	}
 	else if (src & SLJIT_MEM) {
-		FAIL_IF(load_word(compiler, tmp0, src, srcw, GET_OPCODE(op) >= SLJIT_CONV_F64_FROM_S32));
+		FAIL_IF(load_word(compiler, tmp0, src, srcw, ins & 0x100000));
 		src = (sljit_s32)tmp0;
 	}
 
+	FAIL_IF(push_inst(compiler, ins | F4(dst_r) | R0(src)));
+
+	if (dst & SLJIT_MEM)
+		return float_mem(compiler, FLOAT_STORE | ((ins & 0x10000) ? 0 : SLJIT_32), TMP_FREG1, dst, dstw);
+
+	return SLJIT_SUCCESS;
+}
+
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_ins ins;
+
+	if (src == SLJIT_IMM && GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)
+		srcw = (sljit_s32)srcw;
+
 	if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_SW)
 		ins = (op & SLJIT_32) ? 0xb3a40000 /* cegbr */ : 0xb3a50000 /* cdgbr */;
 	else
 		ins = (op & SLJIT_32) ? 0xb3940000 /* cefbr */ : 0xb3950000 /* cdfbr */;
 
-	FAIL_IF(push_inst(compiler, ins | F4(dst_r) | R0(src)));
+	return sljit_emit_fop1_conv_f64_from_w(compiler, ins, dst, dstw, src, srcw);
+}
 
-	if (dst & SLJIT_MEM)
-		return float_mem(compiler, FLOAT_STORE | (op & SLJIT_32), TMP_FREG1, dst, dstw);
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_ins ins;
 
-	return SLJIT_SUCCESS;
+	if (src == SLJIT_IMM && GET_OPCODE(op) == SLJIT_CONV_F64_FROM_U32)
+		srcw = (sljit_u32)srcw;
+
+	if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_UW)
+		ins = (op & SLJIT_32) ? 0xb3a00000 /* celgbr */ : 0xb3a10000 /* cdlgbr */;
+	else
+		ins = (op & SLJIT_32) ? 0xb3900000 /* celfbr */ : 0xb3910000 /* cdlfbr */;
+
+	return sljit_emit_fop1_conv_f64_from_w(compiler, ins, dst, dstw, src, srcw);
 }
 
 static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,
@@ -3355,21 +3495,91 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
-/* --------------------------------------------------------------------- */
-/*  Other instructions                                                   */
-/* --------------------------------------------------------------------- */
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2r(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst_freg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2, sljit_sw src2w)
+{
+	sljit_s32 reg;
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fop2r(compiler, op, dst_freg, src1, src1w, src2, src2w));
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+	ADJUST_LOCAL_OFFSET(src2, src2w);
+
+	if (src2 & SLJIT_MEM) {
+		FAIL_IF(float_mem(compiler, FLOAT_LOAD | (op & SLJIT_32), TMP_FREG1, src2, src2w));
+		src2 = TMP_FREG1;
+	}
+
+	if (src1 & SLJIT_MEM) {
+		reg = (dst_freg == src2) ? TMP_FREG1 : dst_freg;
+		FAIL_IF(float_mem(compiler, FLOAT_LOAD | (op & SLJIT_32), reg, src1, src1w));
+		src1 = reg;
+	}
+
+	return push_inst(compiler, 0xb3720000 /* cpsdr */ | F12(src2) | F4(dst_freg) | F0(src1));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f32 value)
 {
+	union {
+		sljit_s32 imm;
+		sljit_f32 value;
+	} u;
+
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
-	ADJUST_LOCAL_OFFSET(dst, dstw);
+	CHECK(check_sljit_emit_fset32(compiler, freg, value));
+
+	u.value = value;
+
+	FAIL_IF(push_load_imm_inst(compiler, tmp1, (sljit_sw)(((sljit_uw)u.imm << 32))));
+	return push_inst(compiler, 0xb3c10000 /* ldgr */ | F4(freg) | R0A(tmp1));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f64 value)
+{
+	union {
+		sljit_sw imm;
+		sljit_f64 value;
+	} u;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fset64(compiler, freg, value));
+
+	u.value = value;
+
+	FAIL_IF(push_load_imm_inst(compiler, tmp1, (sljit_sw)u.imm));
+	return push_inst(compiler, 0xb3c10000 /* ldgr */ | F4(freg) | R0A(tmp1));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 freg, sljit_s32 reg)
+{
+	sljit_gpr gen_r;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg));
+
+	gen_r = gpr(reg);
+
+	if (GET_OPCODE(op) == SLJIT_COPY_TO_F64) {
+		if (op & SLJIT_32) {
+			FAIL_IF(push_inst(compiler, 0xeb000000000d /* sllg */ | R36A(tmp0) | R32A(gen_r) | (32 << 16)));
+			gen_r = tmp0;
+		}
+
+		return push_inst(compiler, 0xb3c10000 /* ldgr */ | F4(freg) | R0A(gen_r));
+	}
+
+	FAIL_IF(push_inst(compiler, 0xb3cd0000 /* lgdr */ | R4A(gen_r) | F0(freg)));
 
-	if (FAST_IS_REG(dst))
-		return push_inst(compiler, lgr(gpr(dst), link_r));
+	if (!(op & SLJIT_32))
+		return SLJIT_SUCCESS;
 
-	/* memory */
-	return store_word(compiler, link_r, dst, dstw, 0);
+	return push_inst(compiler, 0xeb000000000c /* srlg */ | R36A(gen_r) | R32A(gen_r) | (32 << 16));
 }
 
 /* --------------------------------------------------------------------- */
@@ -3394,14 +3604,14 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_la
 
 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
 {
+	struct sljit_jump *jump;
 	sljit_u8 mask = ((type & 0xff) < SLJIT_JUMP) ? get_cc(compiler, type & 0xff) : 0xf;
 
 	CHECK_ERROR_PTR();
 	CHECK_PTR(check_sljit_emit_jump(compiler, type));
 
 	/* record jump */
-	struct sljit_jump *jump = (struct sljit_jump *)
-		ensure_abuf(compiler, sizeof(struct sljit_jump));
+	jump = (struct sljit_jump *)ensure_abuf(compiler, sizeof(struct sljit_jump));
 	PTR_FAIL_IF(!jump);
 	set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
 	jump->addr = compiler->size;
@@ -3439,7 +3649,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));
 
-	if (src & SLJIT_IMM) {
+	if (src == SLJIT_IMM) {
 		SLJIT_ASSERT(!(srcw & 1)); /* target address must be even */
 		FAIL_IF(push_load_imm_inst(compiler, src_r, srcw));
 	}
@@ -3459,6 +3669,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	sljit_s32 arg_types,
 	sljit_s32 src, sljit_sw srcw)
 {
+	SLJIT_UNUSED_ARG(arg_types);
+
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw));
 
@@ -3490,13 +3702,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 type)
 {
+	sljit_gpr dst_r = FAST_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0;
+	sljit_gpr loc_r = tmp1;
 	sljit_u8 mask = get_cc(compiler, type);
 
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type));
 
-	sljit_gpr dst_r = FAST_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0;
-	sljit_gpr loc_r = tmp1;
 	switch (GET_OPCODE(op)) {
 	case SLJIT_AND:
 	case SLJIT_OR:
@@ -3556,37 +3768,125 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type,
 	sljit_s32 dst_reg,
-	sljit_s32 src, sljit_sw srcw)
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_reg)
 {
-	sljit_ins mask = get_cc(compiler, type & ~SLJIT_32);
+	sljit_ins mask;
 	sljit_gpr src_r;
+	sljit_gpr dst_r = gpr(dst_reg);
 	sljit_ins ins;
 
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));
+	CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg));
 
-	if (type & SLJIT_32)
-		srcw = (sljit_s32)srcw;
+	ADJUST_LOCAL_OFFSET(src1, src1w);
 
-	if (have_lscond2() && (src & SLJIT_IMM) && is_s16(srcw)) {
-		ins = (type & SLJIT_32) ? 0xec0000000042 /* lochi */ : 0xec0000000046 /* locghi */;
-		return push_inst(compiler, ins | R36A(gpr(dst_reg)) | (mask << 32) | (sljit_ins)(srcw & 0xffff) << 16);
+	if (dst_reg != src2_reg) {
+		if (src1 == dst_reg) {
+			src1 = src2_reg;
+			src1w = 0;
+			type ^= 0x1;
+		} else {
+			if (ADDRESSING_DEPENDS_ON(src1, dst_reg)) {
+				FAIL_IF(load_word(compiler, dst_r, src1, src1w, type & SLJIT_32));
+				src1 = src2_reg;
+				src1w = 0;
+				type ^= 0x1;
+			} else
+				FAIL_IF(push_inst(compiler, ((type & SLJIT_32) ? 0x1800 /* lr */ : 0xb9040000 /* lgr */) | R4A(dst_r) | R0A(gpr(src2_reg))));
+		}
 	}
 
-	if (src & SLJIT_IMM) {
-		FAIL_IF(push_load_imm_inst(compiler, tmp0, srcw));
+	mask = get_cc(compiler, type & ~SLJIT_32);
+
+	if (src1 & SLJIT_MEM) {
+		if (src1 & OFFS_REG_MASK) {
+			src_r = gpr(OFFS_REG(src1));
+
+			if (src1w != 0) {
+				FAIL_IF(push_inst(compiler, 0xeb000000000d /* sllg */ | R36A(tmp1) | R32A(src_r) | ((sljit_ins)(src1w & 0x3) << 16)));
+				src_r = tmp1;
+			}
+
+			FAIL_IF(push_inst(compiler, 0xb9e80000 /* agrk */ | R12A(src_r) | R4A(tmp1) | R0A(gpr(src1 & REG_MASK))));
+			src_r = tmp1;
+			src1w = 0;
+		} else if (!is_s20(src1w)) {
+			FAIL_IF(push_load_imm_inst(compiler, tmp1, src1w));
+
+			if (src1 & REG_MASK)
+				FAIL_IF(push_inst(compiler, 0xb9e80000 /* agrk */ | R12A(tmp1) | R4A(tmp1) | R0A(gpr(src1 & REG_MASK))));
+
+			src_r = tmp1;
+			src1w = 0;
+		} else
+			src_r = gpr(src1 & REG_MASK);
+
+		ins = (type & SLJIT_32) ? 0xeb00000000f2 /* loc */ : 0xeb00000000e2 /* locg */;
+		return push_inst(compiler, ins | R36A(dst_r) | (mask << 32) | R28A(src_r) | disp_s20((sljit_s32)src1w));
+	}
+
+	if (src1 == SLJIT_IMM) {
+		if (type & SLJIT_32)
+			src1w = (sljit_s32)src1w;
+
+		if (have_lscond2() && is_s16(src1w)) {
+			ins = (type & SLJIT_32) ? 0xec0000000042 /* lochi */ : 0xec0000000046 /* locghi */;
+			return push_inst(compiler, ins | R36A(dst_r) | (mask << 32) | (sljit_ins)(src1w & 0xffff) << 16);
+		}
+
+		FAIL_IF(push_load_imm_inst(compiler, tmp0, src1w));
 		src_r = tmp0;
 	} else
-		src_r = gpr(src);
+		src_r = gpr(src1);
+
+	ins = (type & SLJIT_32) ? 0xb9f20000 /* locr */ : 0xb9e20000 /* locgr */;
+	return push_inst(compiler, ins | (mask << 12) | R4A(dst_r) | R0A(src_r));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_freg)
+{
+	sljit_ins ins;
+	struct sljit_label *label;
+	struct sljit_jump *jump;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg));
 
-	if (have_lscond1()) {
-		ins = (type & SLJIT_32) ? 0xb9f20000 /* locr */ : 0xb9e20000 /* locgr */;
-		return push_inst(compiler, ins | (mask << 12) | R4A(gpr(dst_reg)) | R0A(src_r));
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+
+	if (dst_freg != src2_freg) {
+		if (dst_freg == src1) {
+			src1 = src2_freg;
+			src1w = 0;
+			type ^= 0x1;
+		} else {
+			ins = (type & SLJIT_32) ? 0x3800 /* ler */ : 0x2800 /* ldr */;
+			FAIL_IF(push_inst(compiler, ins | F4(dst_freg) | F0(src2_freg)));
+		}
 	}
 
-	return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);
+	SLJIT_SKIP_CHECKS(compiler);
+	jump = sljit_emit_jump(compiler, (type & ~SLJIT_32) ^ 0x1);
+	FAIL_IF(!jump);
+
+	if (!(src1 & SLJIT_MEM)) {
+		ins = (type & SLJIT_32) ? 0x3800 /* ler */ : 0x2800 /* ldr */;
+		FAIL_IF(push_inst(compiler, ins | F4(dst_freg) | F0(src1)));
+	} else
+		FAIL_IF(float_mem(compiler, FLOAT_LOAD | (type & SLJIT_32), dst_freg, src1, src1w));
+
+	SLJIT_SKIP_CHECKS(compiler);
+	label = sljit_emit_label(compiler);
+	FAIL_IF(!label);
+
+	sljit_set_label(jump, label);
+	return SLJIT_SUCCESS;
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,
@@ -3648,6 +3948,502 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return push_inst(compiler, ins | R36A(reg2) | disp_s20((sljit_s32)memw + SSIZE_OF(sw)));
 }
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 srcdst, sljit_sw srcdstw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_s32 alignment = SLJIT_SIMD_GET_ELEM2_SIZE(type);
+	struct addr addr;
+	sljit_ins ins;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_mov(compiler, type, freg, srcdst, srcdstw));
+
+	ADJUST_LOCAL_OFFSET(srcdst, srcdstw);
+
+	if (reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (!(srcdst & SLJIT_MEM)) {
+		if (type & SLJIT_SIMD_STORE)
+			ins = F36(srcdst) | F32(freg);
+		else
+			ins = F36(freg) | F32(srcdst);
+
+		return push_inst(compiler, 0xe70000000056 /* vlr */ | ins);
+	}
+
+	FAIL_IF(make_addr_bx(compiler, &addr, srcdst, srcdstw, tmp1));
+	ins = F36(freg) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset);
+
+	if (alignment >= 4)
+		ins |= 4 << 12;
+	else if (alignment == 3)
+		ins |= 3 << 12;
+
+	return push_inst(compiler, ((type & SLJIT_SIMD_STORE) ? 0xe7000000000e /* vst */ : 0xe70000000006 /* vl */) | ins);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	struct addr addr;
+	sljit_gpr reg;
+	sljit_sw sign_ext;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_replicate(compiler, type, freg, src, srcw));
+
+	ADJUST_LOCAL_OFFSET(src, srcw);
+
+	if (reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && elem_size < 2)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (src & SLJIT_MEM) {
+		FAIL_IF(make_addr_bx(compiler, &addr, src, srcw, tmp1));
+		return push_inst(compiler, 0xe70000000005 /* vlrep */ | F36(freg)
+			| R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset) | ((sljit_ins)elem_size << 12));
+	}
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		if (src == SLJIT_IMM)
+			return push_inst(compiler, 0xe70000000044 /* vgbm */ | F36(freg));
+
+		return push_inst(compiler, 0xe7000000004d /* vrep */ | F36(freg) | F32(src) | ((sljit_ins)elem_size << 12));
+	}
+
+	if (src == SLJIT_IMM) {
+		sign_ext = 0x10000;
+
+		switch (elem_size) {
+		case 0:
+			srcw &= 0xff;
+			sign_ext = (sljit_s8)srcw;
+			break;
+		case 1:
+			srcw &= 0xffff;
+			sign_ext = (sljit_s16)srcw;
+			break;
+		case 2:
+			if ((sljit_s32)srcw == (sljit_s16)srcw) {
+				srcw &= 0xffff;
+				sign_ext = (sljit_s16)srcw;
+			} else
+				srcw &= 0xffffffff;
+			break;
+		default:
+			if (srcw == (sljit_s16)srcw) {
+				srcw &= 0xffff;
+				sign_ext = (sljit_s16)srcw;
+			}
+			break;
+		}
+
+		if (sign_ext != 0x10000) {
+			if (sign_ext == 0 || sign_ext == -1)
+				return push_inst(compiler, 0xe70000000044 /* vgbm */ | F36(freg)
+					| (sign_ext == 0 ? 0 : ((sljit_ins)0xffff << 16)));
+
+			return push_inst(compiler, 0xe70000000045 /* vrepi */ | F36(freg)
+				| ((sljit_ins)srcw << 16) | ((sljit_ins)elem_size << 12));
+		}
+
+		push_load_imm_inst(compiler, tmp0, srcw);
+		reg = tmp0;
+	} else
+		reg = gpr(src);
+
+	FAIL_IF(push_inst(compiler, 0xe70000000022 /* vlvg */ | F36(freg) | R32A(reg) | ((sljit_ins)elem_size << 12)));
+	return push_inst(compiler, 0xe7000000004d /* vrep */ | F36(freg) | F32(freg) | ((sljit_ins)elem_size << 12));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg, sljit_s32 lane_index,
+	sljit_s32 srcdst, sljit_sw srcdstw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	struct addr addr;
+	sljit_gpr reg;
+	sljit_ins ins = 0;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_lane_mov(compiler, type, freg, lane_index, srcdst, srcdstw));
+
+	ADJUST_LOCAL_OFFSET(srcdst, srcdstw);
+
+	if (reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && elem_size < 2)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (srcdst & SLJIT_MEM) {
+		FAIL_IF(make_addr_bx(compiler, &addr, srcdst, srcdstw, tmp1));
+		ins = F36(freg) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset);
+	}
+
+	if (type & SLJIT_SIMD_LANE_ZERO) {
+		if ((srcdst & SLJIT_MEM) && lane_index == ((1 << (3 - elem_size)) - 1))
+			return push_inst(compiler, 0xe70000000004 /* vllez */ | ins | ((sljit_ins)elem_size << 12));
+
+		if ((type & SLJIT_SIMD_FLOAT) && freg == srcdst) {
+			FAIL_IF(push_inst(compiler, 0xe70000000056 /* vlr */ | F36(TMP_FREG1) | F32(freg)));
+			srcdst = TMP_FREG1;
+			srcdstw = 0;
+		}
+
+		FAIL_IF(push_inst(compiler, 0xe70000000044 /* vgbm */ | F36(freg)));
+	}
+
+	if (srcdst & SLJIT_MEM) {
+		switch (elem_size) {
+		case 0:
+			ins |= 0xe70000000000 /* vleb */;
+			break;
+		case 1:
+			ins |= 0xe70000000001 /* vleh */;
+			break;
+		case 2:
+			ins |= 0xe70000000003 /* vlef */;
+			break;
+		default:
+			ins |= 0xe70000000002 /* vleg */;
+			break;
+		}
+
+		/* Convert to vsteb - vsteg  */
+		if (type & SLJIT_SIMD_STORE)
+			ins |= 0x8;
+
+		return push_inst(compiler, ins | ((sljit_ins)lane_index << 12));
+	}
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		if (type & SLJIT_SIMD_STORE)
+			return push_inst(compiler, 0xe7000000004d /* vrep */ | F36(srcdst) | F32(freg) | ((sljit_ins)lane_index << 16) | ((sljit_ins)elem_size << 12));
+
+		if (elem_size == 3) {
+			if (lane_index == 0)
+				ins = F32(srcdst) | F28(freg) | (1 << 12);
+			else
+				ins = F32(freg) | F28(srcdst);
+
+			return push_inst(compiler, 0xe70000000084 /* vpdi */ | F36(freg) | ins);
+		}
+
+		FAIL_IF(push_inst(compiler, 0xe70000000021 /* vlgv */ | R36A(tmp0) | F32(srcdst) | ((sljit_ins)2 << 12)));
+		return push_inst(compiler, 0xe70000000022 /* vlvg */ | F36(freg) | R32A(tmp0) | ((sljit_ins)lane_index << 16) | ((sljit_ins)2 << 12));
+	}
+
+	if (srcdst == SLJIT_IMM) {
+		switch (elem_size) {
+		case 0:
+			ins = 0xe70000000040 /* vleib */;
+			srcdstw &= 0xff;
+			break;
+		case 1:
+			ins = 0xe70000000041 /* vleih */;
+			srcdstw &= 0xffff;
+			break;
+		case 2:
+			if ((sljit_s32)srcdstw == (sljit_s16)srcdstw) {
+				srcdstw &= 0xffff;
+				ins = 0xe70000000043 /* vleif */;
+			} else
+				srcdstw &= 0xffffffff;
+			break;
+		default:
+			if (srcdstw == (sljit_s16)srcdstw) {
+				srcdstw &= 0xffff;
+				ins = 0xe70000000042 /* vleig */;
+			}
+			break;
+		}
+
+		if (ins != 0)
+			return push_inst(compiler, ins | F36(freg) | ((sljit_ins)srcdstw << 16) | ((sljit_ins)lane_index << 12));
+
+		push_load_imm_inst(compiler, tmp0, srcdstw);
+		reg = tmp0;
+	} else
+		reg = gpr(srcdst);
+
+	ins = ((sljit_ins)lane_index << 16) | ((sljit_ins)elem_size << 12);
+
+	if (!(type & SLJIT_SIMD_STORE))
+		return push_inst(compiler, 0xe70000000022 /* vlvg */ | F36(freg) | R32A(reg) | ins);
+
+	FAIL_IF(push_inst(compiler, 0xe70000000021 /* vlgv */ | R36A(reg) | F32(freg) | ins));
+
+	if (!(type & SLJIT_SIMD_LANE_SIGNED) || elem_size >= 3)
+		return SLJIT_SUCCESS;
+
+	switch (elem_size) {
+	case 0:
+		ins = 0xb9060000 /* lgbr */;
+		break;
+	case 1:
+		ins = 0xb9070000 /* lghr */;
+		break;
+	default:
+		ins = 0xb9140000 /* lgfr */;
+		break;
+	}
+
+	return push_inst(compiler, ins | R4A(reg) | R0A(reg));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_s32 src_lane_index)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_lane_replicate(compiler, type, freg, src, src_lane_index));
+
+	if (reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && elem_size < 2)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	return push_inst(compiler, 0xe7000000004d /* vrep */ | F36(freg) | F32(src)
+		| ((sljit_ins)src_lane_index << 16) | ((sljit_ins)elem_size << 12));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_s32 elem2_size = SLJIT_SIMD_GET_ELEM2_SIZE(type);
+	struct addr addr;
+	sljit_ins ins;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_extend(compiler, type, freg, src, srcw));
+
+	ADJUST_LOCAL_OFFSET(src, srcw);
+
+	if (reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && elem_size < 2)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (src & SLJIT_MEM) {
+		FAIL_IF(make_addr_bx(compiler, &addr, src, srcw, tmp1));
+		ins = F36(freg) | R32A(addr.index) | R28A(addr.base) | disp_s20(addr.offset);
+
+		switch (elem2_size - elem_size) {
+		case 1:
+			ins |= 0xe70000000002 /* vleg */;
+			break;
+		case 2:
+			ins |= 0xe70000000003 /* vlef */;
+			break;
+		default:
+			ins |= 0xe70000000001 /* vleh */;
+			break;
+		}
+
+		FAIL_IF(push_inst(compiler, ins));
+		src = freg;
+	}
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		FAIL_IF(push_inst(compiler, 0xe700000000d5 /* vuplh */ | F36(freg) | F32(src) | (2 << 12)));
+		FAIL_IF(push_inst(compiler, 0xe70000000030 /* vesl */ | F36(freg) | F32(freg) | (32 << 16) | (3 << 12)));
+		return push_inst(compiler, 0xe700000000c4 /* vfll */ | F36(freg) | F32(freg) | (2 << 12));
+	}
+
+	ins = ((type & SLJIT_SIMD_EXTEND_SIGNED) ? 0xe700000000d7 /* vuph */ : 0xe700000000d5 /* vuplh */) | F36(freg);
+
+	do {
+		FAIL_IF(push_inst(compiler, ins | F32(src) | ((sljit_ins)elem_size << 12)));
+		src = freg;
+	} while (++elem_size < elem2_size);
+
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 dst, sljit_sw dstw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_gpr dst_r;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_sign(compiler, type, freg, dst, dstw));
+
+	ADJUST_LOCAL_OFFSET(dst, dstw);
+
+	if (reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && elem_size < 2)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	switch (elem_size) {
+	case 0:
+		push_load_imm_inst(compiler, tmp0, (sljit_sw)0x4048505860687078);
+		push_load_imm_inst(compiler, tmp1, (sljit_sw)0x0008101820283038);
+		FAIL_IF(push_inst(compiler, 0xe70000000062 /* vlvgp */ | F36(TMP_FREG1) | R32A(tmp1) | R28A(tmp0)));
+		break;
+	case 1:
+		push_load_imm_inst(compiler, tmp0, (sljit_sw)0x0010203040506070);
+		break;
+	case 2:
+		push_load_imm_inst(compiler, tmp0, (sljit_sw)0x8080808000204060);
+		break;
+	default:
+		push_load_imm_inst(compiler, tmp0, (sljit_sw)0x8080808080800040);
+		break;
+	}
+
+	if (elem_size != 0)
+		FAIL_IF(push_inst(compiler, 0xe70000000022 /* vlvg */ | F36(TMP_FREG1) | R32A(tmp0) | (1 << 16) | (3 << 12)));
+
+	FAIL_IF(push_inst(compiler, 0xe70000000085 /* vbperm */ | F36(TMP_FREG1) | F32(freg) | F28(TMP_FREG1)));
+
+	dst_r = FAST_IS_REG(dst) ? gpr(dst) : tmp0;
+	FAIL_IF(push_inst(compiler, 0xe70000000021 /* vlgv */ | R36A(dst_r) | F32(TMP_FREG1)
+		| (elem_size == 0 ? ((3 << 16) | (1 << 12)) : (7 << 16))));
+
+	if (dst_r == tmp0)
+		return store_word(compiler, tmp0, dst, dstw, type & SLJIT_32);
+
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_ins ins = 0;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_op2(compiler, type, dst_freg, src1_freg, src2_freg));
+
+	if (reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	switch (SLJIT_SIMD_GET_OPCODE(type)) {
+	case SLJIT_SIMD_OP2_AND:
+		ins = 0xe70000000068 /* vn */;
+		break;
+	case SLJIT_SIMD_OP2_OR:
+		ins = 0xe7000000006a /* vo */;
+		break;
+	case SLJIT_SIMD_OP2_XOR:
+		ins = 0xe7000000006d /* vx */;
+		break;
+	}
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	return push_inst(compiler, ins | F36(dst_freg) | F32(src1_freg) | F28(src2_freg));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst_reg,
+	sljit_s32 mem_reg)
+{
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg));
+
+	SLJIT_SKIP_CHECKS(compiler);
+	return sljit_emit_op1(compiler, op, dst_reg, 0, SLJIT_MEM1(mem_reg), 0);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 src_reg,
+	sljit_s32 mem_reg,
+	sljit_s32 temp_reg)
+{
+	sljit_ins mask;
+	sljit_gpr tmp_r = gpr(temp_reg);
+	sljit_gpr mem_r = gpr(mem_reg);
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg));
+
+	switch (GET_OPCODE(op)) {
+	case SLJIT_MOV32:
+	case SLJIT_MOV_U32:
+		return push_inst(compiler, 0xba000000 /* cs */ | R20A(tmp_r) | R16A(gpr(src_reg)) | R12A(mem_r));
+	case SLJIT_MOV_U8:
+		mask = 0xff;
+		break;
+	case SLJIT_MOV_U16:
+		mask = 0xffff;
+		break;
+	default:
+		return push_inst(compiler, 0xeb0000000030 /* csg */ | R36A(tmp_r) | R32A(gpr(src_reg)) | R28A(mem_r));
+	}
+
+	/* tmp0 = (src_reg ^ tmp_r) & mask */
+	FAIL_IF(push_inst(compiler, 0xa50f0000 /* llill */ | R20A(tmp1) | mask));
+	FAIL_IF(push_inst(compiler, 0xb9e70000 /* xgrk */ | R4A(tmp0) | R0A(gpr(src_reg)) | R12A(tmp_r)));
+	FAIL_IF(push_inst(compiler, 0xa7090000 /* lghi */ | R20A(tmp_r) | 0xfffc));
+	FAIL_IF(push_inst(compiler, 0xb9800000 /* ngr */ | R4A(tmp0) | R0A(tmp1)));
+
+	/* tmp0 = tmp0 << (((mem_r ^ 0x3) & 0x3) << 3) */
+	FAIL_IF(push_inst(compiler, 0xa50f0000 /* llill */ | R20A(tmp1) | (sljit_ins)((mask == 0xff) ? 0x18 : 0x10)));
+	FAIL_IF(push_inst(compiler, 0xb9800000 /* ngr */ | R4A(tmp_r) | R0A(mem_r)));
+	FAIL_IF(push_inst(compiler, 0xec0000000057 /* rxsbg */ | R36A(tmp1) | R32A(mem_r) | (59 << 24) | (60 << 16) | (3 << 8)));
+	FAIL_IF(push_inst(compiler, 0xeb000000000d /* sllg */ | R36A(tmp0) | R32A(tmp0) | R28A(tmp1)));
+
+	/* Already computed: tmp_r = mem_r & ~0x3 */
+
+	FAIL_IF(push_inst(compiler, 0x58000000 /* l */ | R20A(tmp1) | R12A(tmp_r)));
+	FAIL_IF(push_inst(compiler, 0x1700 /* x */ | R4A(tmp0) | R0A(tmp1)));
+	return push_inst(compiler, 0xba000000 /* cs */ | R20A(tmp1) | R16A(tmp0) | R12A(tmp_r));
+}
+
 /* --------------------------------------------------------------------- */
 /*  Other instructions                                                   */
 /* --------------------------------------------------------------------- */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeX86_32.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeX86_32.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeX86_32.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeX86_32.c	2024-11-20 13:56:33.000000000 +0000
@@ -62,21 +62,19 @@ static sljit_u8* emit_x86_instruction(st
 	/* Both size flags cannot be switched on. */
 	SLJIT_ASSERT((flags & (EX86_BYTE_ARG | EX86_HALF_ARG)) != (EX86_BYTE_ARG | EX86_HALF_ARG));
 	/* SSE2 and immediate is not possible. */
-	SLJIT_ASSERT(!(a & SLJIT_IMM) || !(flags & EX86_SSE2));
-	SLJIT_ASSERT((flags & (EX86_PREF_F2 | EX86_PREF_F3)) != (EX86_PREF_F2 | EX86_PREF_F3)
-		&& (flags & (EX86_PREF_F2 | EX86_PREF_66)) != (EX86_PREF_F2 | EX86_PREF_66)
-		&& (flags & (EX86_PREF_F3 | EX86_PREF_66)) != (EX86_PREF_F3 | EX86_PREF_66));
+	SLJIT_ASSERT(a != SLJIT_IMM || !(flags & EX86_SSE2));
+	SLJIT_ASSERT(((flags & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66))
+			& ((flags & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66)) - 1)) == 0);
+	SLJIT_ASSERT((flags & (EX86_VEX_EXT | EX86_REX)) != EX86_VEX_EXT);
 
 	size &= 0xf;
-	inst_size = size;
+	/* The mod r/m byte is always present. */
+	inst_size = size + 1;
 
-	if (flags & (EX86_PREF_F2 | EX86_PREF_F3))
-		inst_size++;
-	if (flags & EX86_PREF_66)
+	if (flags & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66))
 		inst_size++;
 
 	/* Calculate size of b. */
-	inst_size += 1; /* mod r/m byte. */
 	if (b & SLJIT_MEM) {
 		if (!(b & REG_MASK))
 			inst_size += sizeof(sljit_sw);
@@ -87,8 +85,7 @@ static sljit_u8* emit_x86_instruction(st
 					inst_size += sizeof(sljit_s8);
 				else
 					inst_size += sizeof(sljit_sw);
-			}
-			else if (reg_map[b & REG_MASK] == 5) {
+			} else if (reg_map[b & REG_MASK] == 5) {
 				/* Swap registers if possible. */
 				if ((b & OFFS_REG_MASK) && (immb & 0x3) == 0 && reg_map[OFFS_REG(b)] != 5)
 					b = SLJIT_MEM | OFFS_REG(b) | TO_OFFS_REG(b & REG_MASK);
@@ -105,15 +102,14 @@ static sljit_u8* emit_x86_instruction(st
 	}
 
 	/* Calculate size of a. */
-	if (a & SLJIT_IMM) {
+	if (a == SLJIT_IMM) {
 		if (flags & EX86_BIN_INS) {
 			if (imma <= 127 && imma >= -128) {
 				inst_size += 1;
 				flags |= EX86_BYTE_ARG;
 			} else
 				inst_size += 4;
-		}
-		else if (flags & EX86_SHIFT_INS) {
+		} else if (flags & EX86_SHIFT_INS) {
 			SLJIT_ASSERT(imma <= 0x1f);
 			if (imma != 1) {
 				inst_size++;
@@ -125,8 +121,7 @@ static sljit_u8* emit_x86_instruction(st
 			inst_size += sizeof(short);
 		else
 			inst_size += sizeof(sljit_sw);
-	}
-	else
+	} else
 		SLJIT_ASSERT(!(flags & EX86_SHIFT_INS) || a == SLJIT_PREF_SHIFT_REG);
 
 	inst = (sljit_u8*)ensure_buf(compiler, 1 + inst_size);
@@ -136,27 +131,26 @@ static sljit_u8* emit_x86_instruction(st
 	INC_SIZE(inst_size);
 	if (flags & EX86_PREF_F2)
 		*inst++ = 0xf2;
-	if (flags & EX86_PREF_F3)
+	else if (flags & EX86_PREF_F3)
 		*inst++ = 0xf3;
-	if (flags & EX86_PREF_66)
+	else if (flags & EX86_PREF_66)
 		*inst++ = 0x66;
 
 	buf_ptr = inst + size;
 
 	/* Encode mod/rm byte. */
 	if (!(flags & EX86_SHIFT_INS)) {
-		if ((flags & EX86_BIN_INS) && (a & SLJIT_IMM))
+		if ((flags & EX86_BIN_INS) && a == SLJIT_IMM)
 			*inst = (flags & EX86_BYTE_ARG) ? GROUP_BINARY_83 : GROUP_BINARY_81;
 
-		if (a & SLJIT_IMM)
+		if (a == SLJIT_IMM)
 			*buf_ptr = 0;
 		else if (!(flags & EX86_SSE2_OP1))
 			*buf_ptr = U8(reg_map[a] << 3);
 		else
-			*buf_ptr = U8(a << 3);
-	}
-	else {
-		if (a & SLJIT_IMM) {
+			*buf_ptr = U8(freg_map[a] << 3);
+	} else {
+		if (a == SLJIT_IMM) {
 			if (imma == 1)
 				*inst = GROUP_SHIFT_1;
 			else
@@ -167,7 +161,7 @@ static sljit_u8* emit_x86_instruction(st
 	}
 
 	if (!(b & SLJIT_MEM)) {
-		*buf_ptr = U8(*buf_ptr | MOD_REG | (!(flags & EX86_SSE2_OP2) ? reg_map[b] : b));
+		*buf_ptr = U8(*buf_ptr | MOD_REG | (!(flags & EX86_SSE2_OP2) ? reg_map[b] : freg_map[b]));
 		buf_ptr++;
 	} else if (b & REG_MASK) {
 		reg_map_b = reg_map[b & REG_MASK];
@@ -183,8 +177,9 @@ static sljit_u8* emit_x86_instruction(st
 			if (!(b & OFFS_REG_MASK))
 				*buf_ptr++ |= reg_map_b;
 			else {
-				*buf_ptr++ |= 0x04;
-				*buf_ptr++ = U8(reg_map_b | (reg_map[OFFS_REG(b)] << 3));
+				buf_ptr[0] |= 0x04;
+				buf_ptr[1] = U8(reg_map_b | (reg_map[OFFS_REG(b)] << 3));
+				buf_ptr += 2;
 			}
 
 			if (immb != 0 || reg_map_b == 5) {
@@ -195,25 +190,24 @@ static sljit_u8* emit_x86_instruction(st
 					buf_ptr += sizeof(sljit_sw);
 				}
 			}
-		}
-		else {
+		} else {
 			if (reg_map_b == 5)
 				*buf_ptr |= 0x40;
 
-			*buf_ptr++ |= 0x04;
-			*buf_ptr++ = U8(reg_map_b | (reg_map[OFFS_REG(b)] << 3) | (immb << 6));
+			buf_ptr[0] |= 0x04;
+			buf_ptr[1] = U8(reg_map_b | (reg_map[OFFS_REG(b)] << 3) | (immb << 6));
+			buf_ptr += 2;
 
 			if (reg_map_b == 5)
 				*buf_ptr++ = 0;
 		}
-	}
-	else {
+	} else {
 		*buf_ptr++ |= 0x05;
 		sljit_unaligned_store_sw(buf_ptr, immb); /* 32 bit displacement. */
 		buf_ptr += sizeof(sljit_sw);
 	}
 
-	if (a & SLJIT_IMM) {
+	if (a == SLJIT_IMM) {
 		if (flags & EX86_BYTE_ARG)
 			*buf_ptr = U8(imma);
 		else if (flags & EX86_HALF_ARG)
@@ -222,7 +216,67 @@ static sljit_u8* emit_x86_instruction(st
 			sljit_unaligned_store_sw(buf_ptr, imma);
 	}
 
-	return !(flags & EX86_SHIFT_INS) ? inst : (inst + 1);
+	return inst;
+}
+
+static sljit_s32 emit_vex_instruction(struct sljit_compiler *compiler, sljit_uw op,
+	/* The first and second register operand. */
+	sljit_s32 a, sljit_s32 v,
+	/* The general operand (not immediate). */
+	sljit_s32 b, sljit_sw immb)
+{
+	sljit_u8 *inst;
+	sljit_u8 vex = 0;
+	sljit_u8 vex_m = 0;
+	sljit_uw size;
+
+	SLJIT_ASSERT(((op & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66))
+			& ((op & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66)) - 1)) == 0);
+
+	if (op & VEX_OP_0F38)
+		vex_m = 0x2;
+	else if (op & VEX_OP_0F3A)
+		vex_m = 0x3;
+
+	if (op & VEX_W) {
+		if (vex_m == 0)
+			vex_m = 0x1;
+
+		vex |= 0x80;
+	}
+
+	if (op & EX86_PREF_66)
+		vex |= 0x1;
+	else if (op & EX86_PREF_F2)
+		vex |= 0x3;
+	else if (op & EX86_PREF_F3)
+		vex |= 0x2;
+
+	op &= ~(EX86_PREF_66 | EX86_PREF_F2 | EX86_PREF_F3);
+
+	if (op & VEX_256)
+		vex |= 0x4;
+
+	vex = U8(vex | ((((op & VEX_SSE2_OPV) ? freg_map[v] : reg_map[v]) ^ 0xf) << 3));
+
+	size = op & ~(sljit_uw)0xff;
+	size |= (vex_m == 0) ? 3 : 4;
+
+	inst = emit_x86_instruction(compiler, size, a, 0, b, immb);
+	FAIL_IF(!inst);
+
+	if (vex_m == 0) {
+		inst[0] = 0xc5;
+		inst[1] = U8(vex | 0x80);
+		inst[2] = U8(op);
+		return SLJIT_SUCCESS;
+	}
+
+	inst[0] = 0xc4;
+	inst[1] = U8(vex_m | 0xe0);
+	inst[2] = vex;
+	inst[3] = U8(op);
+	return SLJIT_SUCCESS;
 }
 
 /* --------------------------------------------------------------------- */
@@ -578,8 +632,6 @@ static sljit_s32 emit_stack_frame_releas
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_void(struct sljit_compiler *compiler)
 {
-	sljit_u8 *inst;
-
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_return_void(compiler));
 
@@ -588,11 +640,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	FAIL_IF(emit_stack_frame_release(compiler, 0));
 
-	inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
-	FAIL_IF(!inst);
-	INC_SIZE(1);
-	RET();
-	return SLJIT_SUCCESS;
+	return emit_byte(compiler, RET_near);
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_to(struct sljit_compiler *compiler,
@@ -782,7 +830,7 @@ static sljit_s32 tail_call_with_args(str
 
 		offset = stack_size + compiler->local_size;
 
-		if (!(src & SLJIT_IMM) && src != SLJIT_R0) {
+		if (src != SLJIT_IMM && src != SLJIT_R0) {
 			if (word_arg_count >= 1) {
 				EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_R0, 0);
 				r2_offset = sizeof(sljit_sw);
@@ -836,7 +884,7 @@ static sljit_s32 tail_call_with_args(str
 
 	stack_size = args_size + SSIZE_OF(sw);
 
-	if (word_arg_count >= 1 && !(src & SLJIT_IMM) && src != SLJIT_R0) {
+	if (word_arg_count >= 1 && src != SLJIT_IMM && src != SLJIT_R0) {
 		r2_offset = SSIZE_OF(sw);
 		stack_size += SSIZE_OF(sw);
 	}
@@ -865,7 +913,7 @@ static sljit_s32 tail_call_with_args(str
 			EMIT_MOV(compiler, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), word_arg4_offset);
 	}
 
-	if (!(src & SLJIT_IMM) && src != SLJIT_R0) {
+	if (src != SLJIT_IMM && src != SLJIT_R0) {
 		if (word_arg_count >= 1) {
 			SLJIT_ASSERT(r2_offset == sizeof(sljit_sw));
 			EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_R0, 0);
@@ -952,13 +1000,7 @@ static sljit_s32 emit_tail_call_end(stru
 	sljit_u8 *inst;
 
 	BINARY_IMM32(ADD, extra_space, SLJIT_SP, 0);
-
-	inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
-	FAIL_IF(!inst);
-	INC_SIZE(1);
-	RET();
-
-	return SLJIT_SUCCESS;
+	return emit_byte(compiler, RET_near);
 }
 
 static sljit_s32 tail_call_reg_arg_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types)
@@ -1075,7 +1117,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		stack_size = type;
 		FAIL_IF(tail_call_with_args(compiler, &stack_size, arg_types, src, srcw));
 
-		if (!(src & SLJIT_IMM)) {
+		if (src != SLJIT_IMM) {
 			src = SLJIT_R0;
 			srcw = 0;
 		}
@@ -1142,30 +1184,20 @@ static SLJIT_INLINE sljit_s32 emit_fmov_
 	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+static sljit_s32 emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
 {
 	sljit_u8 *inst;
 
-	CHECK_ERROR();
-	CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
-	ADJUST_LOCAL_OFFSET(dst, dstw);
-
 	CHECK_EXTRA_REGS(dst, dstw, (void)0);
 
-	if (FAST_IS_REG(dst)) {
-		/* Unused dest is possible here. */
-		inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
-		FAIL_IF(!inst);
-
-		INC_SIZE(1);
-		POP_REG(reg_map[dst]);
-		return SLJIT_SUCCESS;
-	}
+	/* Unused dest is possible here. */
+	if (FAST_IS_REG(dst))
+		return emit_byte(compiler, U8(POP_r + reg_map[dst]));
 
 	/* Memory. */
 	inst = emit_x86_instruction(compiler, 1, 0, 0, dst, dstw);
 	FAIL_IF(!inst);
-	*inst++ = POP_rm;
+	*inst = POP_rm;
 	return SLJIT_SUCCESS;
 }
 
@@ -1185,8 +1217,8 @@ static sljit_s32 emit_fast_return(struct
 	else {
 		inst = emit_x86_instruction(compiler, 1, 0, 0, src, srcw);
 		FAIL_IF(!inst);
-		*inst++ = GROUP_FF;
-		*inst |= PUSH_rm;
+		inst[0] = GROUP_FF;
+		inst[1] |= PUSH_rm;
 
 		inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
 		FAIL_IF(!inst);
@@ -1197,6 +1229,22 @@ static sljit_s32 emit_fast_return(struct
 	return SLJIT_SUCCESS;
 }
 
+static sljit_s32 sljit_emit_get_return_address(struct sljit_compiler *compiler,
+	sljit_s32 dst, sljit_sw dstw)
+{
+	sljit_s32 options = compiler->options;
+	sljit_s32 saveds = compiler->saveds;
+	sljit_s32 scratches = compiler->scratches;
+
+	saveds = ((scratches > 9 ? (scratches - 9) : 0) + (saveds <= 3 ? saveds : 3) - SLJIT_KEPT_SAVEDS_COUNT(options)) * SSIZE_OF(sw);
+
+	/* Saving ebp. */
+	if (!(options & SLJIT_ENTER_REG_ARG))
+		saveds += SSIZE_OF(sw);
+
+	return emit_mov(compiler, dst, dstw, SLJIT_MEM1(SLJIT_SP), compiler->local_size + saveds);
+}
+
 /* --------------------------------------------------------------------- */
 /*  Other operations                                                     */
 /* --------------------------------------------------------------------- */
@@ -1278,6 +1326,283 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	return SLJIT_SUCCESS;
 }
+
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG;
+	sljit_u8 *inst, *jump_inst1, *jump_inst2;
+	sljit_uw size1, size2;
+
+	/* Binary representation of 0x80000000. */
+	static const sljit_f64 f64_high_bit = (sljit_f64)0x80000000ul;
+
+	CHECK_EXTRA_REGS(src, srcw, (void)0);
+
+	if (!(op & SLJIT_32)) {
+		EMIT_MOV(compiler, TMP_REG1, 0, src, srcw);
+
+		inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 1, TMP_REG1, 0);
+		FAIL_IF(!inst);
+		inst[1] |= ROL;
+
+		inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 1, TMP_REG1, 0);
+		FAIL_IF(!inst);
+		inst[1] |= SHR;
+
+		FAIL_IF(emit_groupf(compiler, CVTSI2SD_x_rm | EX86_PREF_F2 | EX86_SSE2_OP1, dst_r, TMP_REG1, 0));
+
+		inst = (sljit_u8*)ensure_buf(compiler, 1 + 2);
+		FAIL_IF(!inst);
+		INC_SIZE(2);
+		inst[0] = U8(get_jump_code(SLJIT_NOT_CARRY) - 0x10);
+
+		size1 = compiler->size;
+		FAIL_IF(emit_groupf(compiler, ADDSD_x_xm | EX86_PREF_F2 | EX86_SSE2, dst_r, SLJIT_MEM0(), (sljit_sw)&f64_high_bit));
+
+		inst[1] = U8(compiler->size - size1);
+
+		if (dst_r == TMP_FREG)
+			return emit_sse2_store(compiler, 0, dst, dstw, TMP_FREG);
+		return SLJIT_SUCCESS;
+	}
+
+	if (!FAST_IS_REG(src)) {
+		EMIT_MOV(compiler, TMP_REG1, 0, src, srcw);
+		src = TMP_REG1;
+	}
+
+	BINARY_IMM32(CMP, 0, src, 0);
+
+	inst = (sljit_u8*)ensure_buf(compiler, 1 + 2);
+	FAIL_IF(!inst);
+	INC_SIZE(2);
+	inst[0] = JL_i8;
+	jump_inst1 = inst;
+
+	size1 = compiler->size;
+
+	FAIL_IF(emit_groupf(compiler, CVTSI2SD_x_rm | EX86_SELECT_F2_F3(op) | EX86_SSE2_OP1, dst_r, src, 0));
+
+	inst = (sljit_u8*)ensure_buf(compiler, 1 + 2);
+	FAIL_IF(!inst);
+	INC_SIZE(2);
+	inst[0] = JMP_i8;
+	jump_inst2 = inst;
+
+	size2 = compiler->size;
+
+	jump_inst1[1] = U8(size2 - size1);
+
+	if (src != TMP_REG1)
+		EMIT_MOV(compiler, TMP_REG1, 0, src, 0);
+
+	inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 1, TMP_REG1, 0);
+	FAIL_IF(!inst);
+	inst[1] |= SHR;
+
+	inst = (sljit_u8*)ensure_buf(compiler, 1 + 2);
+	FAIL_IF(!inst);
+	INC_SIZE(2);
+	inst[0] = JNC_i8;
+	jump_inst1 = inst;
+
+	size1 = compiler->size;
+
+	BINARY_IMM32(OR, 1, TMP_REG1, 0);
+	jump_inst1[1] = U8(compiler->size - size1);
+
+	FAIL_IF(emit_groupf(compiler, CVTSI2SD_x_rm | EX86_SELECT_F2_F3(op) | EX86_SSE2_OP1, dst_r, TMP_REG1, 0));
+	FAIL_IF(emit_groupf(compiler, ADDSD_x_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2, dst_r, dst_r, 0));
+
+	jump_inst2[1] = U8(compiler->size - size2);
+
+	if (dst_r == TMP_FREG)
+		return emit_sse2_store(compiler, op & SLJIT_32, dst, dstw, TMP_FREG);
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f32 value)
+{
+	sljit_u8 *inst;
+	union {
+		sljit_s32 imm;
+		sljit_f32 value;
+	} u;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fset32(compiler, freg, value));
+
+	u.value = value;
+
+	if (u.imm != 0)
+		EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, u.imm);
+
+	inst = (sljit_u8*)ensure_buf(compiler, 1 + 4);
+	FAIL_IF(!inst);
+	INC_SIZE(4);
+
+	inst[0] = GROUP_66;
+	inst[1] = GROUP_0F;
+
+	if (u.imm == 0) {
+		inst[2] = PXOR_x_xm;
+		inst[3] = U8(freg | (freg << 3) | MOD_REG);
+	} else {
+		inst[2] = MOVD_x_rm;
+		inst[3] = U8(reg_map[TMP_REG1] | (freg << 3) | MOD_REG);
+	}
+
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f64 value)
+{
+	sljit_u8 *inst;
+	sljit_s32 tmp_freg = freg;
+	union {
+		sljit_s32 imm[2];
+		sljit_f64 value;
+	} u;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fset64(compiler, freg, value));
+
+	u.value = value;
+
+	if (u.imm[0] == 0) {
+		if (u.imm[1] == 0)
+			return emit_groupf(compiler, PXOR_x_xm | EX86_PREF_66 | EX86_SSE2, freg, freg, 0);
+
+		EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, u.imm[1]);
+	} else
+		EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, u.imm[0]);
+
+	FAIL_IF(emit_groupf(compiler, MOVD_x_rm | EX86_PREF_66 | EX86_SSE2_OP1, freg, TMP_REG1, 0));
+
+	if (u.imm[1] == 0)
+		return SLJIT_SUCCESS;
+
+	if (u.imm[0] == 0) {
+		inst = (sljit_u8*)ensure_buf(compiler, 1 + 4);
+		FAIL_IF(!inst);
+		INC_SIZE(4);
+
+		inst[0] = GROUP_0F;
+		inst[1] = SHUFPS_x_xm;
+		inst[2] = U8(MOD_REG | (freg << 3) | freg);
+		inst[3] = 0x51;
+		return SLJIT_SUCCESS;
+	}
+
+	if (u.imm[0] != u.imm[1]) {
+		SLJIT_ASSERT(u.imm[1] != 0 && cpu_feature_list != 0);
+
+		EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, u.imm[1]);
+
+		if (cpu_feature_list & CPU_FEATURE_SSE41) {
+			FAIL_IF(emit_groupf_ext(compiler, PINSRD_x_rm_i8 | EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2_OP1, freg, TMP_REG1, 0));
+			return emit_byte(compiler, 1);
+		}
+
+		FAIL_IF(emit_groupf(compiler, MOVD_x_rm | EX86_PREF_66 | EX86_SSE2_OP1, TMP_FREG, TMP_REG1, 0));
+		tmp_freg = TMP_FREG;
+	}
+
+	inst = (sljit_u8*)ensure_buf(compiler, 1 + 3);
+	FAIL_IF(!inst);
+	INC_SIZE(3);
+
+	inst[0] = GROUP_0F;
+	inst[1] = UNPCKLPS_x_xm;
+	inst[2] = U8(MOD_REG | (freg << 3) | tmp_freg);
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 freg, sljit_s32 reg)
+{
+	sljit_u8 *inst;
+	sljit_s32 reg2;
+	sljit_sw regw, reg2w;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg));
+
+	regw = 0;
+	reg2 = 0;
+	reg2w = 0;
+
+	SLJIT_ASSERT(cpu_feature_list != 0);
+
+	if (!(op & SLJIT_32) && (cpu_feature_list & CPU_FEATURE_SSE41)) {
+		if (reg & REG_PAIR_MASK) {
+			reg2 = REG_PAIR_FIRST(reg);
+			reg = REG_PAIR_SECOND(reg);
+
+			CHECK_EXTRA_REGS(reg, regw, (void)0);
+
+			FAIL_IF(emit_groupf(compiler, (GET_OPCODE(op) == SLJIT_COPY_TO_F64 ? MOVD_x_rm : MOVD_rm_x)
+				| EX86_PREF_66 | EX86_SSE2_OP1, freg, reg, regw));
+		} else
+			reg2 = reg;
+
+		CHECK_EXTRA_REGS(reg2, reg2w, (void)0);
+
+		FAIL_IF(emit_groupf_ext(compiler, (GET_OPCODE(op) == SLJIT_COPY_TO_F64 ? PINSRD_x_rm_i8 : PEXTRD_rm_x_i8)
+			| EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2_OP1, freg, reg2, reg2w));
+		return emit_byte(compiler, 1);
+	}
+
+	if (reg & REG_PAIR_MASK) {
+		reg2 = REG_PAIR_SECOND(reg);
+		reg = REG_PAIR_FIRST(reg);
+
+		if (reg == reg2)
+			reg = 0;
+
+		CHECK_EXTRA_REGS(reg2, reg2w, (void)0);
+	}
+
+	CHECK_EXTRA_REGS(reg, regw, (void)0);
+
+	if (op & SLJIT_32)
+		return emit_groupf(compiler, (GET_OPCODE(op) == SLJIT_COPY_TO_F64 ? MOVD_x_rm : MOVD_rm_x)
+			| EX86_PREF_66 | EX86_SSE2_OP1, freg, reg, regw);
+
+	if (op == SLJIT_COPY_FROM_F64) {
+		inst = (sljit_u8*)ensure_buf(compiler, 1 + 5);
+		FAIL_IF(!inst);
+		INC_SIZE(5);
+
+		inst[0] = GROUP_66;
+		inst[1] = GROUP_0F;
+		inst[2] = PSHUFD_x_xm;
+		inst[3] = U8(MOD_REG | (TMP_FREG << 3) | freg);
+		inst[4] = 1;
+	} else if (reg != 0)
+		FAIL_IF(emit_groupf(compiler, MOVD_x_rm | EX86_PREF_66 | EX86_SSE2_OP1, TMP_FREG, reg, regw));
+
+	if (reg2 != 0)
+		FAIL_IF(emit_groupf(compiler, (GET_OPCODE(op) == SLJIT_COPY_TO_F64 ? MOVD_x_rm : MOVD_rm_x)
+			| EX86_PREF_66 | EX86_SSE2_OP1, freg, reg2, reg2w));
+
+	if (GET_OPCODE(op) == SLJIT_COPY_TO_F64) {
+		inst = (sljit_u8*)ensure_buf(compiler, 1 + 3);
+		FAIL_IF(!inst);
+		INC_SIZE(3);
+
+		inst[0] = GROUP_0F;
+		inst[1] = UNPCKLPS_x_xm;
+		inst[2] = U8(MOD_REG | (freg << 3) | (reg == 0 ? freg : TMP_FREG));
+	} else
+		FAIL_IF(emit_groupf(compiler, MOVD_rm_x | EX86_PREF_66 | EX86_SSE2_OP1, TMP_FREG, reg, regw));
+
+	return SLJIT_SUCCESS;
+}
 
 static sljit_s32 skip_frames_before_return(struct sljit_compiler *compiler)
 {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeX86_64.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeX86_64.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeX86_64.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeX86_64.c	2024-11-20 13:56:33.000000000 +0000
@@ -37,9 +37,9 @@ static sljit_s32 emit_load_imm64(struct
 	inst = (sljit_u8*)ensure_buf(compiler, 1 + 2 + sizeof(sljit_sw));
 	FAIL_IF(!inst);
 	INC_SIZE(2 + sizeof(sljit_sw));
-	*inst++ = REX_W | ((reg_map[reg] <= 7) ? 0 : REX_B);
-	*inst++ = U8(MOV_r_i32 | (reg_map[reg] & 0x7));
-	sljit_unaligned_store_sw(inst, imm);
+	inst[0] = REX_W | ((reg_map[reg] <= 7) ? 0 : REX_B);
+	inst[1] = U8(MOV_r_i32 | reg_lmap[reg]);
+	sljit_unaligned_store_sw(inst + 2, imm);
 	return SLJIT_SUCCESS;
 }
 
@@ -72,7 +72,7 @@ static sljit_u8* emit_x86_instruction(st
 	sljit_uw inst_size;
 
 	/* The immediate operand must be 32 bit. */
-	SLJIT_ASSERT(!(a & SLJIT_IMM) || compiler->mode32 || IS_HALFWORD(imma));
+	SLJIT_ASSERT(a != SLJIT_IMM || compiler->mode32 || IS_HALFWORD(imma));
 	/* Both cannot be switched on. */
 	SLJIT_ASSERT((flags & (EX86_BIN_INS | EX86_SHIFT_INS)) != (EX86_BIN_INS | EX86_SHIFT_INS));
 	/* Size flags not allowed for typed instructions. */
@@ -80,26 +80,24 @@ static sljit_u8* emit_x86_instruction(st
 	/* Both size flags cannot be switched on. */
 	SLJIT_ASSERT((flags & (EX86_BYTE_ARG | EX86_HALF_ARG)) != (EX86_BYTE_ARG | EX86_HALF_ARG));
 	/* SSE2 and immediate is not possible. */
-	SLJIT_ASSERT(!(a & SLJIT_IMM) || !(flags & EX86_SSE2));
-	SLJIT_ASSERT((flags & (EX86_PREF_F2 | EX86_PREF_F3)) != (EX86_PREF_F2 | EX86_PREF_F3)
-		&& (flags & (EX86_PREF_F2 | EX86_PREF_66)) != (EX86_PREF_F2 | EX86_PREF_66)
-		&& (flags & (EX86_PREF_F3 | EX86_PREF_66)) != (EX86_PREF_F3 | EX86_PREF_66));
+	SLJIT_ASSERT(a != SLJIT_IMM || !(flags & EX86_SSE2));
+	SLJIT_ASSERT(((flags & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66))
+			& ((flags & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66)) - 1)) == 0);
+	SLJIT_ASSERT((flags & (EX86_VEX_EXT | EX86_REX)) != EX86_VEX_EXT);
 
 	size &= 0xf;
-	inst_size = size;
+	/* The mod r/m byte is always present. */
+	inst_size = size + 1;
 
 	if (!compiler->mode32 && !(flags & EX86_NO_REXW))
 		rex |= REX_W;
 	else if (flags & EX86_REX)
 		rex |= REX;
 
-	if (flags & (EX86_PREF_F2 | EX86_PREF_F3))
-		inst_size++;
-	if (flags & EX86_PREF_66)
+	if (flags & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66))
 		inst_size++;
 
 	/* Calculate size of b. */
-	inst_size += 1; /* mod r/m byte. */
 	if (b & SLJIT_MEM) {
 		if (!(b & OFFS_REG_MASK) && NOT_HALFWORD(immb)) {
 			PTR_FAIL_IF(emit_load_imm64(compiler, TMP_REG2, immb));
@@ -119,8 +117,7 @@ static sljit_u8* emit_x86_instruction(st
 					inst_size += sizeof(sljit_s8);
 				else
 					inst_size += sizeof(sljit_s32);
-			}
-			else if (reg_lmap[b & REG_MASK] == 5) {
+			} else if (reg_lmap[b & REG_MASK] == 5) {
 				/* Swap registers if possible. */
 				if ((b & OFFS_REG_MASK) && (immb & 0x3) == 0 && reg_lmap[OFFS_REG(b)] != 5)
 					b = SLJIT_MEM | OFFS_REG(b) | TO_OFFS_REG(b & REG_MASK);
@@ -140,23 +137,26 @@ static sljit_u8* emit_x86_instruction(st
 					rex |= REX_X;
 			}
 		}
-	}
-	else if (!(flags & EX86_SSE2_OP2)) {
+	} else if (!(flags & EX86_SSE2_OP2)) {
 		if (reg_map[b] >= 8)
 			rex |= REX_B;
-	}
-	else if (freg_map[b] >= 8)
+	} else if (freg_map[b] >= 8)
 		rex |= REX_B;
 
-	if (a & SLJIT_IMM) {
+	if ((flags & EX86_VEX_EXT) && (rex & 0x3)) {
+		SLJIT_ASSERT(size == 2);
+		size++;
+		inst_size++;
+	}
+
+	if (a == SLJIT_IMM) {
 		if (flags & EX86_BIN_INS) {
 			if (imma <= 127 && imma >= -128) {
 				inst_size += 1;
 				flags |= EX86_BYTE_ARG;
 			} else
 				inst_size += 4;
-		}
-		else if (flags & EX86_SHIFT_INS) {
+		} else if (flags & EX86_SHIFT_INS) {
 			SLJIT_ASSERT(imma <= (compiler->mode32 ? 0x1f : 0x3f));
 			if (imma != 1) {
 				inst_size++;
@@ -168,8 +168,7 @@ static sljit_u8* emit_x86_instruction(st
 			inst_size += sizeof(short);
 		else
 			inst_size += sizeof(sljit_s32);
-	}
-	else {
+	} else {
 		SLJIT_ASSERT(!(flags & EX86_SHIFT_INS) || a == SLJIT_PREF_SHIFT_REG);
 		/* reg_map[SLJIT_PREF_SHIFT_REG] is less than 8. */
 		if (!(flags & EX86_SSE2_OP1)) {
@@ -186,32 +185,34 @@ static sljit_u8* emit_x86_instruction(st
 	inst = (sljit_u8*)ensure_buf(compiler, 1 + inst_size);
 	PTR_FAIL_IF(!inst);
 
-	/* Encoding the byte. */
+	/* Encoding prefixes. */
 	INC_SIZE(inst_size);
 	if (flags & EX86_PREF_F2)
 		*inst++ = 0xf2;
-	if (flags & EX86_PREF_F3)
+	else if (flags & EX86_PREF_F3)
 		*inst++ = 0xf3;
-	if (flags & EX86_PREF_66)
+	else if (flags & EX86_PREF_66)
 		*inst++ = 0x66;
+
+	/* Rex is always the last prefix. */
 	if (rex)
 		*inst++ = rex;
+
 	buf_ptr = inst + size;
 
 	/* Encode mod/rm byte. */
 	if (!(flags & EX86_SHIFT_INS)) {
-		if ((flags & EX86_BIN_INS) && (a & SLJIT_IMM))
+		if ((flags & EX86_BIN_INS) && a == SLJIT_IMM)
 			*inst = (flags & EX86_BYTE_ARG) ? GROUP_BINARY_83 : GROUP_BINARY_81;
 
-		if (a & SLJIT_IMM)
+		if (a == SLJIT_IMM)
 			*buf_ptr = 0;
 		else if (!(flags & EX86_SSE2_OP1))
 			*buf_ptr = U8(reg_lmap[a] << 3);
 		else
 			*buf_ptr = U8(freg_lmap[a] << 3);
-	}
-	else {
-		if (a & SLJIT_IMM) {
+	} else {
+		if (a == SLJIT_IMM) {
 			if (imma == 1)
 				*inst = GROUP_SHIFT_1;
 			else
@@ -238,8 +239,9 @@ static sljit_u8* emit_x86_instruction(st
 			if (!(b & OFFS_REG_MASK))
 				*buf_ptr++ |= reg_lmap_b;
 			else {
-				*buf_ptr++ |= 0x04;
-				*buf_ptr++ = U8(reg_lmap_b | (reg_lmap[OFFS_REG(b)] << 3));
+				buf_ptr[0] |= 0x04;
+				buf_ptr[1] = U8(reg_lmap_b | (reg_lmap[OFFS_REG(b)] << 3));
+				buf_ptr += 2;
 			}
 
 			if (immb != 0 || reg_lmap_b == 5) {
@@ -250,26 +252,26 @@ static sljit_u8* emit_x86_instruction(st
 					buf_ptr += sizeof(sljit_s32);
 				}
 			}
-		}
-		else {
+		} else {
 			if (reg_lmap_b == 5)
 				*buf_ptr |= 0x40;
 
-			*buf_ptr++ |= 0x04;
-			*buf_ptr++ = U8(reg_lmap_b | (reg_lmap[OFFS_REG(b)] << 3) | (immb << 6));
+			buf_ptr[0] |= 0x04;
+			buf_ptr[1] = U8(reg_lmap_b | (reg_lmap[OFFS_REG(b)] << 3) | (immb << 6));
+			buf_ptr += 2;
 
 			if (reg_lmap_b == 5)
 				*buf_ptr++ = 0;
 		}
-	}
-	else {
-		*buf_ptr++ |= 0x04;
-		*buf_ptr++ = 0x25;
+	} else {
+		buf_ptr[0] |= 0x04;
+		buf_ptr[1] = 0x25;
+		buf_ptr += 2;
 		sljit_unaligned_store_s32(buf_ptr, (sljit_s32)immb); /* 32 bit displacement. */
 		buf_ptr += sizeof(sljit_s32);
 	}
 
-	if (a & SLJIT_IMM) {
+	if (a == SLJIT_IMM) {
 		if (flags & EX86_BYTE_ARG)
 			*buf_ptr = U8(imma);
 		else if (flags & EX86_HALF_ARG)
@@ -278,7 +280,78 @@ static sljit_u8* emit_x86_instruction(st
 			sljit_unaligned_store_s32(buf_ptr, (sljit_s32)imma);
 	}
 
-	return !(flags & EX86_SHIFT_INS) ? inst : (inst + 1);
+	return inst;
+}
+
+static sljit_s32 emit_vex_instruction(struct sljit_compiler *compiler, sljit_uw op,
+	/* The first and second register operand. */
+	sljit_s32 a, sljit_s32 v,
+	/* The general operand (not immediate). */
+	sljit_s32 b, sljit_sw immb)
+{
+	sljit_u8 *inst;
+	sljit_u8 vex = 0;
+	sljit_u8 vex_m = 0;
+	sljit_uw size;
+
+	SLJIT_ASSERT(((op & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66))
+			& ((op & (EX86_PREF_F2 | EX86_PREF_F3 | EX86_PREF_66)) - 1)) == 0);
+
+	op |= EX86_REX;
+
+	if (op & VEX_OP_0F38)
+		vex_m = 0x2;
+	else if (op & VEX_OP_0F3A)
+		vex_m = 0x3;
+
+	if ((op & VEX_W) || ((op & VEX_AUTO_W) && !compiler->mode32)) {
+		if (vex_m == 0)
+			vex_m = 0x1;
+
+		vex |= 0x80;
+	}
+
+	if (op & EX86_PREF_66)
+		vex |= 0x1;
+	else if (op & EX86_PREF_F2)
+		vex |= 0x3;
+	else if (op & EX86_PREF_F3)
+		vex |= 0x2;
+
+	op &= ~(EX86_PREF_66 | EX86_PREF_F2 | EX86_PREF_F3);
+
+	if (op & VEX_256)
+		vex |= 0x4;
+
+	vex = U8(vex | ((((op & VEX_SSE2_OPV) ? freg_map[v] : reg_map[v]) ^ 0xf) << 3));
+
+	size = op & ~(sljit_uw)0xff;
+	size |= (vex_m == 0) ? (EX86_VEX_EXT | 2) : 3;
+
+	inst = emit_x86_instruction(compiler, size, a, 0, b, immb);
+	FAIL_IF(!inst);
+
+	SLJIT_ASSERT((inst[-1] & 0xf0) == REX);
+
+	/* If X or B is present in REX prefix. */
+	if (vex_m == 0 && inst[-1] & 0x3)
+		vex_m = 0x1;
+
+	if (vex_m == 0) {
+		vex |= U8(((inst[-1] >> 2) ^ 0x1) << 7);
+
+		inst[-1] = 0xc5;
+		inst[0] = vex;
+		inst[1] = U8(op);
+		return SLJIT_SUCCESS;
+	}
+
+	vex_m |= U8((inst[-1] ^ 0x7) << 5);
+	inst[-1] = 0xc4;
+	inst[0] = vex_m;
+	inst[1] = vex;
+	inst[2] = U8(op);
+	return SLJIT_SUCCESS;
 }
 
 /* --------------------------------------------------------------------- */
@@ -370,6 +443,12 @@ static sljit_u8* generate_put_label_code
 	return code_ptr;
 }
 
+#ifdef _WIN64
+typedef struct {
+	sljit_sw regs[2];
+} sljit_sse2_reg;
+#endif /* _WIN64 */
+
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
 	sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,
 	sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
@@ -423,7 +502,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 #ifdef _WIN64
 	local_size += SLJIT_LOCALS_OFFSET;
-	saved_float_regs_size = GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, 16);
+	saved_float_regs_size = GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, sse2_reg);
 
 	if (saved_float_regs_size > 0) {
 		saved_float_regs_offset = ((local_size + 0xf) & ~0xf);
@@ -532,16 +611,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 		tmp = SLJIT_FS0 - fsaveds;
 		for (i = SLJIT_FS0; i > tmp; i--) {
-			inst = emit_x86_instruction(compiler, 2 | EX86_SSE2, i, 0, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset);
-			*inst++ = GROUP_0F;
-			*inst = MOVAPS_xm_x;
+			FAIL_IF(emit_groupf(compiler, MOVAPS_xm_x | EX86_SSE2, i, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset));
 			saved_float_regs_offset += 16;
 		}
 
 		for (i = fscratches; i >= SLJIT_FIRST_SAVED_FLOAT_REG; i--) {
-			inst = emit_x86_instruction(compiler, 2 | EX86_SSE2, i, 0, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset);
-			*inst++ = GROUP_0F;
-			*inst = MOVAPS_xm_x;
+			FAIL_IF(emit_groupf(compiler, MOVAPS_xm_x | EX86_SSE2, i, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset));
 			saved_float_regs_offset += 16;
 		}
 	}
@@ -565,7 +640,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 #ifdef _WIN64
 	local_size += SLJIT_LOCALS_OFFSET;
-	saved_float_regs_size = GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, 16);
+	saved_float_regs_size = GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, sse2_reg);
 
 	if (saved_float_regs_size > 0)
 		local_size = ((local_size + 0xf) & ~0xf) + saved_float_regs_size;
@@ -591,7 +666,7 @@ static sljit_s32 emit_stack_frame_releas
 #endif /* _WIN64 */
 
 #ifdef _WIN64
-	saved_float_regs_offset = GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, 16);
+	saved_float_regs_offset = GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, sse2_reg);
 
 	if (saved_float_regs_offset > 0) {
 		compiler->mode32 = 1;
@@ -599,16 +674,12 @@ static sljit_s32 emit_stack_frame_releas
 
 		tmp = SLJIT_FS0 - fsaveds;
 		for (i = SLJIT_FS0; i > tmp; i--) {
-			inst = emit_x86_instruction(compiler, 2 | EX86_SSE2, i, 0, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset);
-			*inst++ = GROUP_0F;
-			*inst = MOVAPS_x_xm;
+			FAIL_IF(emit_groupf(compiler, MOVAPS_x_xm | EX86_SSE2, i, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset));
 			saved_float_regs_offset += 16;
 		}
 
 		for (i = fscratches; i >= SLJIT_FIRST_SAVED_FLOAT_REG; i--) {
-			inst = emit_x86_instruction(compiler, 2 | EX86_SSE2, i, 0, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset);
-			*inst++ = GROUP_0F;
-			*inst = MOVAPS_x_xm;
+			FAIL_IF(emit_groupf(compiler, MOVAPS_x_xm | EX86_SSE2, i, SLJIT_MEM1(SLJIT_SP), saved_float_regs_offset));
 			saved_float_regs_offset += 16;
 		}
 
@@ -656,20 +727,13 @@ static sljit_s32 emit_stack_frame_releas
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_void(struct sljit_compiler *compiler)
 {
-	sljit_u8 *inst;
-
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_return_void(compiler));
 
 	compiler->mode32 = 0;
 
 	FAIL_IF(emit_stack_frame_release(compiler, 0));
-
-	inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
-	FAIL_IF(!inst);
-	INC_SIZE(1);
-	RET();
-	return SLJIT_SUCCESS;
+	return emit_byte(compiler, RET_near);
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_to(struct sljit_compiler *compiler,
@@ -863,22 +927,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return sljit_emit_ijump(compiler, type, src, srcw);
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+static sljit_s32 emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
 {
 	sljit_u8 *inst;
 
-	CHECK_ERROR();
-	CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
-	ADJUST_LOCAL_OFFSET(dst, dstw);
-
 	if (FAST_IS_REG(dst)) {
-		if (reg_map[dst] < 8) {
-			inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
-			FAIL_IF(!inst);
-			INC_SIZE(1);
-			POP_REG(reg_lmap[dst]);
-			return SLJIT_SUCCESS;
-		}
+		if (reg_map[dst] < 8)
+			return emit_byte(compiler, U8(POP_r + reg_lmap[dst]));
 
 		inst = (sljit_u8*)ensure_buf(compiler, 1 + 2);
 		FAIL_IF(!inst);
@@ -892,7 +947,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	compiler->mode32 = 1;
 	inst = emit_x86_instruction(compiler, 1, 0, 0, dst, dstw);
 	FAIL_IF(!inst);
-	*inst++ = POP_rm;
+	*inst = POP_rm;
 	return SLJIT_SUCCESS;
 }
 
@@ -922,8 +977,8 @@ static sljit_s32 emit_fast_return(struct
 		compiler->mode32 = 1;
 		inst = emit_x86_instruction(compiler, 1, 0, 0, src, srcw);
 		FAIL_IF(!inst);
-		*inst++ = GROUP_FF;
-		*inst |= PUSH_rm;
+		inst[0] = GROUP_FF;
+		inst[1] |= PUSH_rm;
 
 		inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
 		FAIL_IF(!inst);
@@ -934,6 +989,16 @@ static sljit_s32 emit_fast_return(struct
 	return SLJIT_SUCCESS;
 }
 
+static sljit_s32 sljit_emit_get_return_address(struct sljit_compiler *compiler,
+	sljit_s32 dst, sljit_sw dstw)
+{
+	sljit_s32 saved_regs_size;
+
+	compiler->mode32 = 0;
+	saved_regs_size = GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds - SLJIT_KEPT_SAVEDS_COUNT(compiler->options), 0);
+	return emit_mov(compiler, dst, dstw, SLJIT_MEM1(SLJIT_SP), compiler->local_size + saved_regs_size);
+}
+
 /* --------------------------------------------------------------------- */
 /*  Other operations                                                     */
 /* --------------------------------------------------------------------- */
@@ -1027,15 +1092,15 @@ static sljit_s32 emit_mov_int(struct slj
 
 	compiler->mode32 = 0;
 
-	if (src & SLJIT_IMM) {
+	if (src == SLJIT_IMM) {
 		if (FAST_IS_REG(dst)) {
-			if (sign || ((sljit_uw)srcw <= 0x7fffffff)) {
-				inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, (sljit_sw)(sljit_s32)srcw, dst, dstw);
-				FAIL_IF(!inst);
-				*inst = MOV_rm_i32;
-				return SLJIT_SUCCESS;
-			}
-			return emit_load_imm64(compiler, dst, srcw);
+			if (!sign || ((sljit_u32)srcw <= 0x7fffffff))
+				return emit_do_imm32(compiler, reg_map[dst] <= 7 ? 0 : REX_B, U8(MOV_r_i32 | reg_lmap[dst]), srcw);
+
+			inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, (sljit_sw)(sljit_s32)srcw, dst, dstw);
+			FAIL_IF(!inst);
+			*inst = MOV_rm_i32;
+			return SLJIT_SUCCESS;
 		}
 		compiler->mode32 = 1;
 		inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, (sljit_sw)(sljit_s32)srcw, dst, dstw);
@@ -1053,10 +1118,10 @@ static sljit_s32 emit_mov_int(struct slj
 		if (sign) {
 			inst = emit_x86_instruction(compiler, 1, dst_r, 0, src, srcw);
 			FAIL_IF(!inst);
-			*inst++ = MOVSXD_r_rm;
+			*inst = MOVSXD_r_rm;
 		} else {
 			compiler->mode32 = 1;
-			FAIL_IF(emit_mov(compiler, dst_r, 0, src, srcw));
+			EMIT_MOV(compiler, dst_r, 0, src, srcw);
 			compiler->mode32 = 0;
 		}
 	}
@@ -1071,6 +1136,203 @@ static sljit_s32 emit_mov_int(struct slj
 
 	return SLJIT_SUCCESS;
 }
+
+static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_uw(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG;
+	sljit_u8 *inst, *jump_inst1, *jump_inst2;
+	sljit_uw size1, size2;
+
+	compiler->mode32 = 0;
+
+	if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_U32) {
+		if (src != SLJIT_IMM) {
+			compiler->mode32 = 1;
+			EMIT_MOV(compiler, TMP_REG1, 0, src, srcw);
+			compiler->mode32 = 0;
+		} else
+			FAIL_IF(emit_do_imm32(compiler, reg_map[TMP_REG1] <= 7 ? 0 : REX_B, U8(MOV_r_i32 | reg_lmap[TMP_REG1]), srcw));
+
+		FAIL_IF(emit_groupf(compiler, CVTSI2SD_x_rm | EX86_SELECT_F2_F3(op) | EX86_SSE2_OP1, dst_r, TMP_REG1, 0));
+
+		compiler->mode32 = 1;
+
+		if (dst_r == TMP_FREG)
+			return emit_sse2_store(compiler, op & SLJIT_32, dst, dstw, TMP_FREG);
+		return SLJIT_SUCCESS;
+	}
+
+	if (!FAST_IS_REG(src)) {
+		EMIT_MOV(compiler, TMP_REG1, 0, src, srcw);
+		src = TMP_REG1;
+	}
+
+	BINARY_IMM32(CMP, 0, src, 0);
+
+	inst = (sljit_u8*)ensure_buf(compiler, 1 + 2);
+	FAIL_IF(!inst);
+	INC_SIZE(2);
+	inst[0] = JL_i8;
+	jump_inst1 = inst;
+
+	size1 = compiler->size;
+
+	compiler->mode32 = 0;
+	FAIL_IF(emit_groupf(compiler, CVTSI2SD_x_rm | EX86_SELECT_F2_F3(op) | EX86_SSE2_OP1, dst_r, src, 0));
+
+	inst = (sljit_u8*)ensure_buf(compiler, 1 + 2);
+	FAIL_IF(!inst);
+	INC_SIZE(2);
+	inst[0] = JMP_i8;
+	jump_inst2 = inst;
+
+	size2 = compiler->size;
+
+	jump_inst1[1] = U8(size2 - size1);
+
+	if (src != TMP_REG1)
+		EMIT_MOV(compiler, TMP_REG1, 0, src, 0);
+
+	EMIT_MOV(compiler, TMP_REG2, 0, src, 0);
+
+	inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 1, TMP_REG1, 0);
+	FAIL_IF(!inst);
+	inst[1] |= SHR;
+
+	compiler->mode32 = 1;
+	BINARY_IMM32(AND, 1, TMP_REG2, 0);
+
+	compiler->mode32 = 0;
+	inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, TMP_REG2, 0);
+	FAIL_IF(!inst);
+	inst[0] = OR_r_rm;
+
+	FAIL_IF(emit_groupf(compiler, CVTSI2SD_x_rm | EX86_SELECT_F2_F3(op) | EX86_SSE2_OP1, dst_r, TMP_REG1, 0));
+	compiler->mode32 = 1;
+	FAIL_IF(emit_groupf(compiler, ADDSD_x_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2, dst_r, dst_r, 0));
+
+	jump_inst2[1] = U8(compiler->size - size2);
+
+	if (dst_r == TMP_FREG)
+		return emit_sse2_store(compiler, op & SLJIT_32, dst, dstw, TMP_FREG);
+	return SLJIT_SUCCESS;
+}
+
+static sljit_s32 sljit_emit_fset(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_u8 rex, sljit_s32 is_zero)
+{
+	sljit_u8 *inst;
+	sljit_u32 size;
+
+	if (is_zero) {
+		rex = freg_map[freg] >= 8 ? (REX_R | REX_B) : 0;
+	} else {
+		if (freg_map[freg] >= 8)
+			rex |= REX_R;
+		if (reg_map[TMP_REG1] >= 8)
+			rex |= REX_B;
+	}
+
+	size = (rex != 0) ? 5 : 4;
+
+	inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
+	FAIL_IF(!inst);
+	INC_SIZE(size);
+
+	*inst++ = GROUP_66;
+	if (rex != 0)
+		*inst++ = rex;
+	inst[0] = GROUP_0F;
+
+	if (is_zero) {
+		inst[1] = PXOR_x_xm;
+		inst[2] = U8(freg_lmap[freg] | (freg_lmap[freg] << 3) | MOD_REG);
+	} else {
+		inst[1] = MOVD_x_rm;
+		inst[2] = U8(reg_lmap[TMP_REG1] | (freg_lmap[freg] << 3) | MOD_REG);
+	}
+
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f32 value)
+{
+	union {
+		sljit_s32 imm;
+		sljit_f32 value;
+	} u;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fset32(compiler, freg, value));
+
+	u.value = value;
+
+	if (u.imm != 0) {
+		compiler->mode32 = 1;
+		EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, u.imm);
+	}
+
+	return sljit_emit_fset(compiler, freg, 0, u.imm == 0);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler,
+	sljit_s32 freg, sljit_f64 value)
+{
+	union {
+		sljit_sw imm;
+		sljit_f64 value;
+	} u;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fset64(compiler, freg, value));
+
+	u.value = value;
+
+	if (u.imm != 0) {
+		compiler->mode32 = 0;
+		EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, u.imm);
+	}
+
+	return sljit_emit_fset(compiler, freg, REX_W, u.imm == 0);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 freg, sljit_s32 reg)
+{
+	sljit_u8 *inst;
+	sljit_u32 size;
+	sljit_u8 rex = 0;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg));
+
+	if (!(op & SLJIT_32))
+		rex = REX_W;
+
+	if (freg_map[freg] >= 8)
+		rex |= REX_R;
+
+	if (reg_map[reg] >= 8)
+		rex |= REX_B;
+
+	size = (rex != 0) ? 5 : 4;
+
+	inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
+	FAIL_IF(!inst);
+	INC_SIZE(size);
+
+	*inst++ = GROUP_66;
+	if (rex != 0)
+		*inst++ = rex;
+	inst[0] = GROUP_0F;
+	inst[1] = GET_OPCODE(op) == SLJIT_COPY_TO_F64 ? MOVD_x_rm : MOVD_rm_x;
+	inst[2] = U8(reg_lmap[reg] | (freg_lmap[freg] << 3) | MOD_REG);
+
+	return SLJIT_SUCCESS;
+}
 
 static sljit_s32 skip_frames_before_return(struct sljit_compiler *compiler)
 {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeX86_common.c 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeX86_common.c
--- 5.15.15+dfsg-2/src/3rdparty/pcre2/src/sljit/sljitNativeX86_common.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/pcre2/src/sljit/sljitNativeX86_common.c	2024-11-20 13:56:33.000000000 +0000
@@ -24,6 +24,12 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#if defined(__has_feature)
+#if __has_feature(memory_sanitizer)
+#include <sanitizer/msan_interface.h>
+#endif /* __has_feature(memory_sanitizer) */
+#endif /* defined(__has_feature) */
+
 SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)
 {
 	return "x86" SLJIT_CPUINFO;
@@ -61,15 +67,18 @@ SLJIT_API_FUNC_ATTRIBUTE const char* slj
     15 - R15
 */
 
-#define TMP_FREG	(0)
+#define TMP_REG1	(SLJIT_NUMBER_OF_REGISTERS + 2)
+#define TMP_FREG	(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)
 
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
 
-/* Last register + 1. */
-#define TMP_REG1	(SLJIT_NUMBER_OF_REGISTERS + 2)
 
 static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 3] = {
-	0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 7, 6, 3, 4, 5
+	0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 5, 7, 6, 4, 3
+};
+
+static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2] = {
+	0, 1, 2, 3, 4, 5, 6, 7, 0
 };
 
 #define CHECK_EXTRA_REGS(p, w, do) \
@@ -81,12 +90,10 @@ static const sljit_u8 reg_map[SLJIT_NUMB
 
 #else /* SLJIT_CONFIG_X86_32 */
 
-/* Last register + 1. */
-#define TMP_REG1	(SLJIT_NUMBER_OF_REGISTERS + 2)
 #define TMP_REG2	(SLJIT_NUMBER_OF_REGISTERS + 3)
 
 /* Note: r12 & 0x7 == 0b100, which decoded as SIB byte present
-   Note: avoid to use r12 and r13 for memory addessing
+   Note: avoid to use r12 and r13 for memory addressing
    therefore r12 is better to be a higher saved register. */
 #ifndef _WIN64
 /* Args: rdi(=7), rsi(=6), rdx(=2), rcx(=1), r8, r9. Scratches: rax(=0), r10, r11 */
@@ -95,7 +102,7 @@ static const sljit_u8 reg_map[SLJIT_NUMB
 };
 /* low-map. reg_map & 0x7. */
 static const sljit_u8 reg_lmap[SLJIT_NUMBER_OF_REGISTERS + 4] = {
-	0, 0, 6, 7, 1, 0, 3,  2,  4,  5,  5,  6,  7, 3, 4, 2, 1
+	0, 0, 6, 7, 1, 0,  3,  2,  4, 5,  5,  6,  7, 3, 4, 2, 1
 };
 #else
 /* Args: rcx(=1), rdx(=2), r8, r9. Scratches: rax(=0), r10, r11 */
@@ -109,12 +116,12 @@ static const sljit_u8 reg_lmap[SLJIT_NUM
 #endif
 
 /* Args: xmm0-xmm3 */
-static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1] = {
-	4, 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
+static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2] = {
+	0, 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 4
 };
 /* low-map. freg_map & 0x7. */
-static const sljit_u8 freg_lmap[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1] = {
-	4, 0, 1, 2, 3, 5, 6, 7, 0, 1, 2,  3,  4,  5,  6,  7
+static const sljit_u8 freg_lmap[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2] = {
+	0, 0, 1, 2, 3, 5, 6, 7, 0, 1,  2,  3,  4,  5,  6,  7, 4
 };
 
 #define REX_W		0x48
@@ -140,155 +147,237 @@ static const sljit_u8 freg_lmap[SLJIT_NU
 
 #define U8(v)			((sljit_u8)(v))
 
-
 /* Size flags for emit_x86_instruction: */
-#define EX86_BIN_INS		0x0010
-#define EX86_SHIFT_INS		0x0020
-#define EX86_REX		0x0040
-#define EX86_NO_REXW		0x0080
-#define EX86_BYTE_ARG		0x0100
-#define EX86_HALF_ARG		0x0200
-#define EX86_PREF_66		0x0400
-#define EX86_PREF_F2		0x0800
-#define EX86_PREF_F3		0x1000
-#define EX86_SSE2_OP1		0x2000
-#define EX86_SSE2_OP2		0x4000
+#define EX86_BIN_INS		((sljit_uw)0x000010)
+#define EX86_SHIFT_INS		((sljit_uw)0x000020)
+#define EX86_BYTE_ARG		((sljit_uw)0x000040)
+#define EX86_HALF_ARG		((sljit_uw)0x000080)
+/* Size flags for both emit_x86_instruction and emit_vex_instruction: */
+#define EX86_REX		((sljit_uw)0x000100)
+#define EX86_NO_REXW		((sljit_uw)0x000200)
+#define EX86_PREF_66		((sljit_uw)0x000400)
+#define EX86_PREF_F2		((sljit_uw)0x000800)
+#define EX86_PREF_F3		((sljit_uw)0x001000)
+#define EX86_SSE2_OP1		((sljit_uw)0x002000)
+#define EX86_SSE2_OP2		((sljit_uw)0x004000)
 #define EX86_SSE2		(EX86_SSE2_OP1 | EX86_SSE2_OP2)
+#define EX86_VEX_EXT		((sljit_uw)0x008000)
+/* Op flags for emit_vex_instruction: */
+#define VEX_OP_0F38		((sljit_uw)0x010000)
+#define VEX_OP_0F3A		((sljit_uw)0x020000)
+#define VEX_SSE2_OPV		((sljit_uw)0x040000)
+#define VEX_AUTO_W		((sljit_uw)0x080000)
+#define VEX_W			((sljit_uw)0x100000)
+#define VEX_256			((sljit_uw)0x200000)
+
+#define EX86_SELECT_66(op)	(((op) & SLJIT_32) ? 0 : EX86_PREF_66)
+#define EX86_SELECT_F2_F3(op)	(((op) & SLJIT_32) ? EX86_PREF_F3 : EX86_PREF_F2)
 
 /* --------------------------------------------------------------------- */
-/*  Instrucion forms                                                     */
+/*  Instruction forms                                                    */
 /* --------------------------------------------------------------------- */
 
-#define ADD		(/* BINARY */ 0 << 3)
-#define ADD_EAX_i32	0x05
-#define ADD_r_rm	0x03
-#define ADD_rm_r	0x01
-#define ADDSD_x_xm	0x58
-#define ADC		(/* BINARY */ 2 << 3)
-#define ADC_EAX_i32	0x15
-#define ADC_r_rm	0x13
-#define ADC_rm_r	0x11
-#define AND		(/* BINARY */ 4 << 3)
-#define AND_EAX_i32	0x25
-#define AND_r_rm	0x23
-#define AND_rm_r	0x21
-#define ANDPD_x_xm	0x54
-#define BSR_r_rm	(/* GROUP_0F */ 0xbd)
-#define BSF_r_rm	(/* GROUP_0F */ 0xbc)
-#define CALL_i32	0xe8
-#define CALL_rm		(/* GROUP_FF */ 2 << 3)
-#define CDQ		0x99
-#define CMOVE_r_rm	(/* GROUP_0F */ 0x44)
-#define CMP		(/* BINARY */ 7 << 3)
-#define CMP_EAX_i32	0x3d
-#define CMP_r_rm	0x3b
-#define CMP_rm_r	0x39
-#define CVTPD2PS_x_xm	0x5a
-#define CVTSI2SD_x_rm	0x2a
-#define CVTTSD2SI_r_xm	0x2c
-#define DIV		(/* GROUP_F7 */ 6 << 3)
-#define DIVSD_x_xm	0x5e
-#define FLDS		0xd9
-#define FLDL		0xdd
-#define FSTPS		0xd9
-#define FSTPD		0xdd
-#define INT3		0xcc
-#define IDIV		(/* GROUP_F7 */ 7 << 3)
-#define IMUL		(/* GROUP_F7 */ 5 << 3)
-#define IMUL_r_rm	(/* GROUP_0F */ 0xaf)
-#define IMUL_r_rm_i8	0x6b
-#define IMUL_r_rm_i32	0x69
-#define JE_i8		0x74
-#define JNE_i8		0x75
-#define JMP_i8		0xeb
-#define JMP_i32		0xe9
-#define JMP_rm		(/* GROUP_FF */ 4 << 3)
-#define LEA_r_m		0x8d
-#define LOOP_i8		0xe2
-#define LZCNT_r_rm	(/* GROUP_F3 */ /* GROUP_0F */ 0xbd)
-#define MOV_r_rm	0x8b
-#define MOV_r_i32	0xb8
-#define MOV_rm_r	0x89
-#define MOV_rm_i32	0xc7
-#define MOV_rm8_i8	0xc6
-#define MOV_rm8_r8	0x88
-#define MOVAPS_x_xm	0x28
-#define MOVAPS_xm_x	0x29
-#define MOVSD_x_xm	0x10
-#define MOVSD_xm_x	0x11
-#define MOVSXD_r_rm	0x63
-#define MOVSX_r_rm8	(/* GROUP_0F */ 0xbe)
-#define MOVSX_r_rm16	(/* GROUP_0F */ 0xbf)
-#define MOVZX_r_rm8	(/* GROUP_0F */ 0xb6)
-#define MOVZX_r_rm16	(/* GROUP_0F */ 0xb7)
-#define MUL		(/* GROUP_F7 */ 4 << 3)
-#define MULSD_x_xm	0x59
-#define NEG_rm		(/* GROUP_F7 */ 3 << 3)
-#define NOP		0x90
-#define NOT_rm		(/* GROUP_F7 */ 2 << 3)
-#define OR		(/* BINARY */ 1 << 3)
-#define OR_r_rm		0x0b
-#define OR_EAX_i32	0x0d
-#define OR_rm_r		0x09
-#define OR_rm8_r8	0x08
-#define POP_r		0x58
-#define POP_rm		0x8f
-#define POPF		0x9d
-#define PREFETCH	0x18
-#define PUSH_i32	0x68
-#define PUSH_r		0x50
-#define PUSH_rm		(/* GROUP_FF */ 6 << 3)
-#define PUSHF		0x9c
-#define ROL		(/* SHIFT */ 0 << 3)
-#define ROR		(/* SHIFT */ 1 << 3)
-#define RET_near	0xc3
-#define RET_i16		0xc2
-#define SBB		(/* BINARY */ 3 << 3)
-#define SBB_EAX_i32	0x1d
-#define SBB_r_rm	0x1b
-#define SBB_rm_r	0x19
-#define SAR		(/* SHIFT */ 7 << 3)
-#define SHL		(/* SHIFT */ 4 << 3)
-#define SHLD		(/* GROUP_0F */ 0xa5)
-#define SHRD		(/* GROUP_0F */ 0xad)
-#define SHR		(/* SHIFT */ 5 << 3)
-#define SUB		(/* BINARY */ 5 << 3)
-#define SUB_EAX_i32	0x2d
-#define SUB_r_rm	0x2b
-#define SUB_rm_r	0x29
-#define SUBSD_x_xm	0x5c
-#define TEST_EAX_i32	0xa9
-#define TEST_rm_r	0x85
-#define TZCNT_r_rm	(/* GROUP_F3 */ /* GROUP_0F */ 0xbc)
-#define UCOMISD_x_xm	0x2e
-#define UNPCKLPD_x_xm	0x14
-#define XCHG_EAX_r	0x90
-#define XCHG_r_rm	0x87
-#define XOR		(/* BINARY */ 6 << 3)
-#define XOR_EAX_i32	0x35
-#define XOR_r_rm	0x33
-#define XOR_rm_r	0x31
-#define XORPD_x_xm	0x57
-
-#define GROUP_0F	0x0f
-#define GROUP_F3	0xf3
-#define GROUP_F7	0xf7
-#define GROUP_FF	0xff
-#define GROUP_BINARY_81	0x81
-#define GROUP_BINARY_83	0x83
-#define GROUP_SHIFT_1	0xd1
-#define GROUP_SHIFT_N	0xc1
-#define GROUP_SHIFT_CL	0xd3
-
-#define MOD_REG		0xc0
-#define MOD_DISP8	0x40
-
-#define INC_SIZE(s)			(*inst++ = U8(s), compiler->size += (s))
-
-#define PUSH_REG(r)			(*inst++ = U8(PUSH_r + (r)))
-#define POP_REG(r)			(*inst++ = U8(POP_r + (r)))
-#define RET()				(*inst++ = RET_near)
-#define RET_I16(n)			(*inst++ = RET_i16, *inst++ = U8(n), *inst++ = 0)
+#define ADD			(/* BINARY */ 0 << 3)
+#define ADD_EAX_i32		0x05
+#define ADD_r_rm		0x03
+#define ADD_rm_r		0x01
+#define ADDSD_x_xm		0x58
+#define ADC			(/* BINARY */ 2 << 3)
+#define ADC_EAX_i32		0x15
+#define ADC_r_rm		0x13
+#define ADC_rm_r		0x11
+#define AND			(/* BINARY */ 4 << 3)
+#define AND_EAX_i32		0x25
+#define AND_r_rm		0x23
+#define AND_rm_r		0x21
+#define ANDPD_x_xm		0x54
+#define BSR_r_rm		(/* GROUP_0F */ 0xbd)
+#define BSF_r_rm		(/* GROUP_0F */ 0xbc)
+#define BSWAP_r			(/* GROUP_0F */ 0xc8)
+#define CALL_i32		0xe8
+#define CALL_rm			(/* GROUP_FF */ 2 << 3)
+#define CDQ			0x99
+#define CMOVE_r_rm		(/* GROUP_0F */ 0x44)
+#define CMP			(/* BINARY */ 7 << 3)
+#define CMP_EAX_i32		0x3d
+#define CMP_r_rm		0x3b
+#define CMP_rm_r		0x39
+#define CMPS_x_xm		0xc2
+#define CMPXCHG_rm_r		0xb1
+#define CMPXCHG_rm8_r		0xb0
+#define CVTPD2PS_x_xm		0x5a
+#define CVTPS2PD_x_xm		0x5a
+#define CVTSI2SD_x_rm		0x2a
+#define CVTTSD2SI_r_xm		0x2c
+#define DIV			(/* GROUP_F7 */ 6 << 3)
+#define DIVSD_x_xm		0x5e
+#define EXTRACTPS_x_xm		0x17
+#define FLDS			0xd9
+#define FLDL			0xdd
+#define FSTPS			0xd9
+#define FSTPD			0xdd
+#define INSERTPS_x_xm		0x21
+#define INT3			0xcc
+#define IDIV			(/* GROUP_F7 */ 7 << 3)
+#define IMUL			(/* GROUP_F7 */ 5 << 3)
+#define IMUL_r_rm		(/* GROUP_0F */ 0xaf)
+#define IMUL_r_rm_i8		0x6b
+#define IMUL_r_rm_i32		0x69
+#define JL_i8			0x7c
+#define JE_i8			0x74
+#define JNC_i8			0x73
+#define JNE_i8			0x75
+#define JMP_i8			0xeb
+#define JMP_i32			0xe9
+#define JMP_rm			(/* GROUP_FF */ 4 << 3)
+#define LEA_r_m			0x8d
+#define LOOP_i8			0xe2
+#define LZCNT_r_rm		(/* GROUP_F3 */ /* GROUP_0F */ 0xbd)
+#define MOV_r_rm		0x8b
+#define MOV_r_i32		0xb8
+#define MOV_rm_r		0x89
+#define MOV_rm_i32		0xc7
+#define MOV_rm8_i8		0xc6
+#define MOV_rm8_r8		0x88
+#define MOVAPS_x_xm		0x28
+#define MOVAPS_xm_x		0x29
+#define MOVD_x_rm		0x6e
+#define MOVD_rm_x		0x7e
+#define MOVDDUP_x_xm		0x12
+#define MOVDQA_x_xm		0x6f
+#define MOVDQA_xm_x		0x7f
+#define MOVHLPS_x_x		0x12
+#define MOVHPD_m_x		0x17
+#define MOVHPD_x_m		0x16
+#define MOVLHPS_x_x		0x16
+#define MOVLPD_m_x		0x13
+#define MOVLPD_x_m		0x12
+#define MOVMSKPS_r_x		(/* GROUP_0F */ 0x50)
+#define MOVQ_x_xm		(/* GROUP_0F */ 0x7e)
+#define MOVSD_x_xm		0x10
+#define MOVSD_xm_x		0x11
+#define MOVSHDUP_x_xm		0x16
+#define MOVSXD_r_rm		0x63
+#define MOVSX_r_rm8		(/* GROUP_0F */ 0xbe)
+#define MOVSX_r_rm16		(/* GROUP_0F */ 0xbf)
+#define MOVUPS_x_xm		0x10
+#define MOVZX_r_rm8		(/* GROUP_0F */ 0xb6)
+#define MOVZX_r_rm16		(/* GROUP_0F */ 0xb7)
+#define MUL			(/* GROUP_F7 */ 4 << 3)
+#define MULSD_x_xm		0x59
+#define NEG_rm			(/* GROUP_F7 */ 3 << 3)
+#define NOP			0x90
+#define NOT_rm			(/* GROUP_F7 */ 2 << 3)
+#define OR			(/* BINARY */ 1 << 3)
+#define OR_r_rm			0x0b
+#define OR_EAX_i32		0x0d
+#define OR_rm_r			0x09
+#define OR_rm8_r8		0x08
+#define ORPD_x_xm		0x56
+#define PACKSSWB_x_xm		(/* GROUP_0F */ 0x63)
+#define PAND_x_xm		0xdb
+#define PCMPEQD_x_xm		0x76
+#define PINSRB_x_rm_i8		0x20
+#define PINSRW_x_rm_i8		0xc4
+#define PINSRD_x_rm_i8		0x22
+#define PEXTRB_rm_x_i8		0x14
+#define PEXTRW_rm_x_i8		0x15
+#define PEXTRD_rm_x_i8		0x16
+#define PMOVMSKB_r_x		(/* GROUP_0F */ 0xd7)
+#define PMOVSXBD_x_xm		0x21
+#define PMOVSXBQ_x_xm		0x22
+#define PMOVSXBW_x_xm		0x20
+#define PMOVSXDQ_x_xm		0x25
+#define PMOVSXWD_x_xm		0x23
+#define PMOVSXWQ_x_xm		0x24
+#define PMOVZXBD_x_xm		0x31
+#define PMOVZXBQ_x_xm		0x32
+#define PMOVZXBW_x_xm		0x30
+#define PMOVZXDQ_x_xm		0x35
+#define PMOVZXWD_x_xm		0x33
+#define PMOVZXWQ_x_xm		0x34
+#define POP_r			0x58
+#define POP_rm			0x8f
+#define POPF			0x9d
+#define POR_x_xm		0xeb
+#define PREFETCH		0x18
+#define PSHUFB_x_xm		0x00
+#define PSHUFD_x_xm		0x70
+#define PSHUFLW_x_xm		0x70
+#define PSRLDQ_x		0x73
+#define PSLLD_x_i8		0x72
+#define PSLLQ_x_i8		0x73
+#define PUSH_i32		0x68
+#define PUSH_r			0x50
+#define PUSH_rm			(/* GROUP_FF */ 6 << 3)
+#define PUSHF			0x9c
+#define PXOR_x_xm		0xef
+#define ROL			(/* SHIFT */ 0 << 3)
+#define ROR			(/* SHIFT */ 1 << 3)
+#define RET_near		0xc3
+#define RET_i16			0xc2
+#define SBB			(/* BINARY */ 3 << 3)
+#define SBB_EAX_i32		0x1d
+#define SBB_r_rm		0x1b
+#define SBB_rm_r		0x19
+#define SAR			(/* SHIFT */ 7 << 3)
+#define SHL			(/* SHIFT */ 4 << 3)
+#define SHLD			(/* GROUP_0F */ 0xa5)
+#define SHRD			(/* GROUP_0F */ 0xad)
+#define SHR			(/* SHIFT */ 5 << 3)
+#define SHUFPS_x_xm		0xc6
+#define SUB			(/* BINARY */ 5 << 3)
+#define SUB_EAX_i32		0x2d
+#define SUB_r_rm		0x2b
+#define SUB_rm_r		0x29
+#define SUBSD_x_xm		0x5c
+#define TEST_EAX_i32		0xa9
+#define TEST_rm_r		0x85
+#define TZCNT_r_rm		(/* GROUP_F3 */ /* GROUP_0F */ 0xbc)
+#define UCOMISD_x_xm		0x2e
+#define UNPCKLPD_x_xm		0x14
+#define UNPCKLPS_x_xm		0x14
+#define VBROADCASTSD_x_xm	0x19
+#define VBROADCASTSS_x_xm	0x18
+#define VEXTRACTF128_x_ym	0x19
+#define VEXTRACTI128_x_ym	0x39
+#define VINSERTF128_y_y_xm	0x18
+#define VINSERTI128_y_y_xm	0x38
+#define VPBROADCASTB_x_xm	0x78
+#define VPBROADCASTD_x_xm	0x58
+#define VPBROADCASTQ_x_xm	0x59
+#define VPBROADCASTW_x_xm	0x79
+#define VPERMPD_y_ym		0x01
+#define VPERMQ_y_ym		0x00
+#define XCHG_EAX_r		0x90
+#define XCHG_r_rm		0x87
+#define XOR			(/* BINARY */ 6 << 3)
+#define XOR_EAX_i32		0x35
+#define XOR_r_rm		0x33
+#define XOR_rm_r		0x31
+#define XORPD_x_xm		0x57
+
+#define GROUP_0F		0x0f
+#define GROUP_66		0x66
+#define GROUP_F3		0xf3
+#define GROUP_F7		0xf7
+#define GROUP_FF		0xff
+#define GROUP_BINARY_81		0x81
+#define GROUP_BINARY_83		0x83
+#define GROUP_SHIFT_1		0xd1
+#define GROUP_SHIFT_N		0xc1
+#define GROUP_SHIFT_CL		0xd3
+#define GROUP_LOCK		0xf0
+
+#define MOD_REG			0xc0
+#define MOD_DISP8		0x40
+
+#define INC_SIZE(s)		(*inst++ = U8(s), compiler->size += (s))
+
+#define PUSH_REG(r)		(*inst++ = U8(PUSH_r + (r)))
+#define POP_REG(r)		(*inst++ = U8(POP_r + (r)))
+#define RET()			(*inst++ = RET_near)
+#define RET_I16(n)		(*inst++ = RET_i16, *inst++ = U8(n), *inst++ = 0)
 
 /* Multithreading does not affect these static variables, since they store
    built-in CPU features. Therefore they can be overwritten by different threads
@@ -297,9 +386,12 @@ static const sljit_u8 freg_lmap[SLJIT_NU
 #if (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2)
 #define CPU_FEATURE_SSE2		0x002
 #endif
-#define CPU_FEATURE_LZCNT		0x004
-#define CPU_FEATURE_TZCNT		0x008
-#define CPU_FEATURE_CMOV		0x010
+#define CPU_FEATURE_SSE41		0x004
+#define CPU_FEATURE_LZCNT		0x008
+#define CPU_FEATURE_TZCNT		0x010
+#define CPU_FEATURE_CMOV		0x020
+#define CPU_FEATURE_AVX			0x040
+#define CPU_FEATURE_AVX2		0x080
 
 static sljit_u32 cpu_feature_list = 0;
 
@@ -332,124 +424,124 @@ static SLJIT_INLINE void sljit_unaligned
 /*    Utility functions                               */
 /******************************************************/
 
-static void get_cpu_features(void)
+static void execute_cpu_id(sljit_u32 info[4])
 {
-	sljit_u32 feature_list = CPU_FEATURE_DETECTED;
-	sljit_u32 value;
-
 #if defined(_MSC_VER) && _MSC_VER >= 1400
 
-	int CPUInfo[4];
-
-	__cpuid(CPUInfo, 0);
-	if (CPUInfo[0] >= 7) {
-		__cpuidex(CPUInfo, 7, 0);
-		if (CPUInfo[1] & 0x8)
-			feature_list |= CPU_FEATURE_TZCNT;
-	}
-
-	__cpuid(CPUInfo, (int)0x80000001);
-	if (CPUInfo[2] & 0x20)
-		feature_list |= CPU_FEATURE_LZCNT;
-
-	__cpuid(CPUInfo, 1);
-	value = (sljit_u32)CPUInfo[3];
+	__cpuidex((int*)info, (int)info[0], (int)info[2]);
 
-#elif defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__SUNPRO_C)
+#elif defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__SUNPRO_C) || defined(__TINYC__)
 
 	/* AT&T syntax. */
 	__asm__ (
-		"movl $0x0, %%eax\n"
-		"lzcnt %%eax, %%eax\n"
-		"setnz %%al\n"
-		"movl %%eax, %0\n"
-		: "=g" (value)
-		:
-#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-		: "eax"
-#else
-		: "rax"
-#endif
-	);
-
-	if (value & 0x1)
-		feature_list |= CPU_FEATURE_LZCNT;
-
-	__asm__ (
-		"movl $0x0, %%eax\n"
-		"tzcnt %%eax, %%eax\n"
-		"setnz %%al\n"
-		"movl %%eax, %0\n"
-		: "=g" (value)
-		:
-#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-		: "eax"
-#else
-		: "rax"
-#endif
-	);
-
-	if (value & 0x1)
-		feature_list |= CPU_FEATURE_TZCNT;
-
-	__asm__ (
-		"movl $0x1, %%eax\n"
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-		/* On x86-32, there is no red zone, so this
-		   should work (no need for a local variable). */
-		"push %%ebx\n"
-#endif
+		"movl %0, %%esi\n"
+		"movl (%%esi), %%eax\n"
+		"movl 8(%%esi), %%ecx\n"
+		"pushl %%ebx\n"
 		"cpuid\n"
-#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-		"pop %%ebx\n"
-#endif
-		"movl %%edx, %0\n"
-		: "=g" (value)
+		"movl %%eax, (%%esi)\n"
+		"movl %%ebx, 4(%%esi)\n"
+		"popl %%ebx\n"
+		"movl %%ecx, 8(%%esi)\n"
+		"movl %%edx, 12(%%esi)\n"
+#else /* !SLJIT_CONFIG_X86_32 */
+		"movq %0, %%rsi\n"
+		"movl (%%rsi), %%eax\n"
+		"movl 8(%%rsi), %%ecx\n"
+		"cpuid\n"
+		"movl %%eax, (%%rsi)\n"
+		"movl %%ebx, 4(%%rsi)\n"
+		"movl %%ecx, 8(%%rsi)\n"
+		"movl %%edx, 12(%%rsi)\n"
+#endif /* SLJIT_CONFIG_X86_32 */
 		:
+		: "r" (info)
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-		: "%eax", "%ecx", "%edx"
-#else
-		: "%rax", "%rbx", "%rcx", "%rdx"
-#endif
+		: "memory", "eax", "ecx", "edx", "esi"
+#else /* !SLJIT_CONFIG_X86_32 */
+		: "memory", "rax", "rbx", "rcx", "rdx", "rsi"
+#endif /* SLJIT_CONFIG_X86_32 */
 	);
 
-#else /* _MSC_VER && _MSC_VER >= 1400 */
+#else /* _MSC_VER < 1400 */
 
 	/* Intel syntax. */
 	__asm {
-		mov eax, 0
-		lzcnt eax, eax
-		setnz al
-		mov value, eax
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+		mov esi, info
+		mov eax, [esi]
+		mov ecx, [esi + 8]
+		cpuid
+		mov [esi], eax
+		mov [esi + 4], ebx
+		mov [esi + 8], ecx
+		mov [esi + 12], edx
+#else /* !SLJIT_CONFIG_X86_32 */
+		mov rsi, info
+		mov eax, [rsi]
+		mov ecx, [rsi + 8]
+		cpuid
+		mov [rsi], eax
+		mov [rsi + 4], ebx
+		mov [rsi + 8], ecx
+		mov [rsi + 12], edx
+#endif /* SLJIT_CONFIG_X86_32 */
 	}
 
-	if (value & 0x1)
-		feature_list |= CPU_FEATURE_LZCNT;
+#endif /* _MSC_VER && _MSC_VER >= 1400 */
 
-	__asm {
-		mov eax, 0
-		tzcnt eax, eax
-		setnz al
-		mov value, eax
-	}
+#if defined(__has_feature)
+#if __has_feature(memory_sanitizer)
+__msan_unpoison(info, 4 * sizeof(sljit_u32));
+#endif /* __has_feature(memory_sanitizer) */
+#endif /* defined(__has_feature) */
 
-	if (value & 0x1)
-		feature_list |= CPU_FEATURE_TZCNT;
+}
 
-	__asm {
-		mov eax, 1
-		cpuid
-		mov value, edx
-	}
+static void get_cpu_features(void)
+{
+	sljit_u32 feature_list = CPU_FEATURE_DETECTED;
+	sljit_u32 info[4];
+	sljit_u32 max_id;
 
-#endif /* _MSC_VER && _MSC_VER >= 1400 */
+	info[0] = 0;
+	execute_cpu_id(info);
+	max_id = info[0];
+
+	if (max_id >= 7) {
+		info[0] = 7;
+		info[2] = 0;
+		execute_cpu_id(info);
+
+		if (info[1] & 0x8)
+			feature_list |= CPU_FEATURE_TZCNT;
+		if (info[1] & 0x20)
+			feature_list |= CPU_FEATURE_AVX2;
+	}
 
+	if (max_id >= 1) {
+		info[0] = 1;
+		execute_cpu_id(info);
+
+		if (info[2] & 0x80000)
+			feature_list |= CPU_FEATURE_SSE41;
+		if (info[2] & 0x10000000)
+			feature_list |= CPU_FEATURE_AVX;
 #if (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2)
-	if (value & 0x4000000)
-		feature_list |= CPU_FEATURE_SSE2;
+		if (info[3] & 0x4000000)
+			feature_list |= CPU_FEATURE_SSE2;
 #endif
-	if (value & 0x8000)
-		feature_list |= CPU_FEATURE_CMOV;
+		if (info[3] & 0x8000)
+			feature_list |= CPU_FEATURE_CMOV;
+	}
+
+	info[0] = 0x80000001;
+	info[2] = 0; /* Silences an incorrect compiler warning. */
+	execute_cpu_id(info);
+
+	if (info[2] & 0x20)
+		feature_list |= CPU_FEATURE_LZCNT;
 
 	cpu_feature_list = feature_list;
 }
@@ -458,15 +550,15 @@ static sljit_u8 get_jump_code(sljit_uw t
 {
 	switch (type) {
 	case SLJIT_EQUAL:
+	case SLJIT_ATOMIC_STORED:
 	case SLJIT_F_EQUAL:
 	case SLJIT_UNORDERED_OR_EQUAL:
-	case SLJIT_ORDERED_EQUAL: /* Not supported. */
 		return 0x84 /* je */;
 
 	case SLJIT_NOT_EQUAL:
+	case SLJIT_ATOMIC_NOT_STORED:
 	case SLJIT_F_NOT_EQUAL:
 	case SLJIT_ORDERED_NOT_EQUAL:
-	case SLJIT_UNORDERED_OR_NOT_EQUAL: /* Not supported. */
 		return 0x85 /* jne */;
 
 	case SLJIT_LESS:
@@ -514,9 +606,11 @@ static sljit_u8 get_jump_code(sljit_uw t
 		return 0x81 /* jno */;
 
 	case SLJIT_UNORDERED:
+	case SLJIT_ORDERED_EQUAL: /* NaN. */
 		return 0x8a /* jp */;
 
 	case SLJIT_ORDERED:
+	case SLJIT_UNORDERED_OR_NOT_EQUAL: /* Not NaN. */
 		return 0x8b /* jpo */;
 	}
 	return 0;
@@ -541,7 +635,7 @@ static sljit_u8* generate_near_jump_code
 		label_addr = jump->u.target - (sljit_uw)executable_offset;
 
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-	if ((sljit_sw)(label_addr - (jump->addr + 1)) > HALFWORD_MAX || (sljit_sw)(label_addr - (jump->addr + 1)) < HALFWORD_MIN)
+	if ((sljit_sw)(label_addr - (jump->addr + 2)) > HALFWORD_MAX || (sljit_sw)(label_addr - (jump->addr + 6)) < HALFWORD_MIN)
 		return generate_far_jump_code(jump, code_ptr);
 #endif
 
@@ -737,7 +831,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	switch (feature_type) {
 	case SLJIT_HAS_FPU:
 #ifdef SLJIT_IS_FPU_AVAILABLE
-		return SLJIT_IS_FPU_AVAILABLE;
+		return (SLJIT_IS_FPU_AVAILABLE) != 0;
 #elif (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2)
 		if (cpu_feature_list == 0)
 			get_cpu_features();
@@ -768,19 +862,28 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			get_cpu_features();
 		return (cpu_feature_list & CPU_FEATURE_CMOV) != 0;
 
+	case SLJIT_HAS_REV:
 	case SLJIT_HAS_ROT:
 	case SLJIT_HAS_PREFETCH:
+	case SLJIT_HAS_COPY_F32:
+	case SLJIT_HAS_COPY_F64:
+	case SLJIT_HAS_ATOMIC:
 		return 1;
 
-	case SLJIT_HAS_SSE2:
-#if (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2)
+#if !(defined SLJIT_IS_FPU_AVAILABLE) || SLJIT_IS_FPU_AVAILABLE
+	case SLJIT_HAS_AVX:
 		if (cpu_feature_list == 0)
 			get_cpu_features();
-		return (cpu_feature_list & CPU_FEATURE_SSE2) != 0;
-#else /* !SLJIT_DETECT_SSE2 */
-		return 1;
-#endif /* SLJIT_DETECT_SSE2 */
-
+		return (cpu_feature_list & CPU_FEATURE_AVX) != 0;
+	case SLJIT_HAS_AVX2:
+		if (cpu_feature_list == 0)
+			get_cpu_features();
+		return (cpu_feature_list & CPU_FEATURE_AVX2) != 0;
+	case SLJIT_HAS_SIMD:
+		if (cpu_feature_list == 0)
+			get_cpu_features();
+		return (cpu_feature_list & CPU_FEATURE_SSE41) != 0;
+#endif /* SLJIT_IS_FPU_AVAILABLE */
 	default:
 		return 0;
 	}
@@ -788,16 +891,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type)
 {
-	if (type < SLJIT_UNORDERED || type > SLJIT_ORDERED_LESS_EQUAL)
-		return 0;
-
 	switch (type) {
 	case SLJIT_ORDERED_EQUAL:
 	case SLJIT_UNORDERED_OR_NOT_EQUAL:
-		return 0;
+		return 2;
 	}
 
-	return 1;
+	return 0;
 }
 
 /* --------------------------------------------------------------------- */
@@ -841,6 +941,15 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 #endif /* SLJIT_CONFIG_X86_64 */
 
+static sljit_s32 emit_byte(struct sljit_compiler *compiler, sljit_u8 byte)
+{
+	sljit_u8 *inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
+	FAIL_IF(!inst);
+	INC_SIZE(1);
+	*inst = byte;
+	return SLJIT_SUCCESS;
+}
+
 static sljit_s32 emit_mov(struct sljit_compiler *compiler,
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 src, sljit_sw srcw);
@@ -848,6 +957,14 @@ static sljit_s32 emit_mov(struct sljit_c
 #define EMIT_MOV(compiler, dst, dstw, src, srcw) \
 	FAIL_IF(emit_mov(compiler, dst, dstw, src, srcw));
 
+static sljit_s32 emit_groupf(struct sljit_compiler *compiler,
+	sljit_uw op,
+	sljit_s32 dst, sljit_s32 src, sljit_sw srcw);
+
+static sljit_s32 emit_groupf_ext(struct sljit_compiler *compiler,
+	sljit_uw op,
+	sljit_s32 dst, sljit_s32 src, sljit_sw srcw);
+
 static SLJIT_INLINE sljit_s32 emit_sse2_store(struct sljit_compiler *compiler,
 	sljit_s32 single, sljit_s32 dst, sljit_sw dstw, sljit_s32 src);
 
@@ -858,6 +975,10 @@ static sljit_s32 emit_cmp_binary(struct
 	sljit_s32 src1, sljit_sw src1w,
 	sljit_s32 src2, sljit_sw src2w);
 
+static sljit_s32 emit_cmov_generic(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_reg,
+	sljit_s32 src, sljit_sw srcw);
+
 static SLJIT_INLINE sljit_s32 emit_endbranch(struct sljit_compiler *compiler)
 {
 #if (defined SLJIT_CONFIG_X86_CET && SLJIT_CONFIG_X86_CET)
@@ -866,14 +987,14 @@ static SLJIT_INLINE sljit_s32 emit_endbr
 	inst = (sljit_u8*)ensure_buf(compiler, 1 + 4);
 	FAIL_IF(!inst);
 	INC_SIZE(4);
-	*inst++ = 0xf3;
-	*inst++ = 0x0f;
-	*inst++ = 0x1e;
+	inst[0] = GROUP_F3;
+	inst[1] = GROUP_0F;
+	inst[2] = 0x1e;
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-	*inst = 0xfb;
-#else
-	*inst = 0xfa;
-#endif
+	inst[3] = 0xfb;
+#else /* !SLJIT_CONFIG_X86_32 */
+	inst[3] = 0xfa;
+#endif /* SLJIT_CONFIG_X86_32 */
 #else /* !SLJIT_CONFIG_X86_CET */
 	SLJIT_UNUSED_ARG(compiler);
 #endif /* SLJIT_CONFIG_X86_CET */
@@ -896,13 +1017,17 @@ static SLJIT_INLINE sljit_s32 emit_rdssp
 	inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
 	FAIL_IF(!inst);
 	INC_SIZE(size);
-	*inst++ = 0xf3;
+	*inst++ = GROUP_F3;
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 	*inst++ = REX_W | (reg_map[reg] <= 7 ? 0 : REX_B);
 #endif
-	*inst++ = 0x0f;
-	*inst++ = 0x1e;
-	*inst = (0x3 << 6) | (0x1 << 3) | (reg_map[reg] & 0x7);
+	inst[0] = GROUP_0F;
+	inst[1] = 0x1e;
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	inst[2] = U8(MOD_REG | (0x1 << 3) | reg_lmap[reg]);
+#else
+	inst[2] = U8(MOD_REG | (0x1 << 3) | reg_map[reg]);
+#endif
 	return SLJIT_SUCCESS;
 }
 
@@ -920,13 +1045,13 @@ static SLJIT_INLINE sljit_s32 emit_incss
 	inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
 	FAIL_IF(!inst);
 	INC_SIZE(size);
-	*inst++ = 0xf3;
+	*inst++ = GROUP_F3;
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 	*inst++ = REX_W | (reg_map[reg] <= 7 ? 0 : REX_B);
 #endif
-	*inst++ = 0x0f;
-	*inst++ = 0xae;
-	*inst = (0x3 << 6) | (0x5 << 3) | (reg_map[reg] & 0x7);
+	inst[0] = GROUP_0F;
+	inst[1] = 0xae;
+	inst[2] = (0x3 << 6) | (0x5 << 3) | (reg_map[reg] & 0x7);
 	return SLJIT_SUCCESS;
 }
 
@@ -954,19 +1079,7 @@ static SLJIT_INLINE sljit_s32 adjust_sha
 	FAIL_IF(emit_rdssp(compiler, TMP_REG1));
 
 	/* Load return address on shadow stack into TMP_REG1. */
-#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-	SLJIT_ASSERT(reg_map[TMP_REG1] == 5);
-
-	/* Hand code unsupported "mov 0x0(%ebp),%ebp". */
-	inst = (sljit_u8*)ensure_buf(compiler, 1 + 3);
-	FAIL_IF(!inst);
-	INC_SIZE(3);
-	*inst++ = 0x8b;
-	*inst++ = 0x6d;
-	*inst = 0;
-#else /* !SLJIT_CONFIG_X86_32 */
 	EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(TMP_REG1), 0);
-#endif /* SLJIT_CONFIG_X86_32 */
 
 	/* Compare return address against TMP_REG1. */
 	FAIL_IF(emit_cmp_binary (compiler, TMP_REG1, 0, src, srcw));
@@ -994,8 +1107,8 @@ static SLJIT_INLINE sljit_s32 adjust_sha
 	inst = (sljit_u8*)ensure_buf(compiler, 1 + 2);
 	FAIL_IF(!inst);
 	INC_SIZE(2);
-	*inst++ = JMP_i8;
-	*inst = size_before_rdssp_inst - compiler->size;
+	inst[0] = JMP_i8;
+	inst[1] = size_before_rdssp_inst - compiler->size;
 
 	*jz_after_cmp_inst = compiler->size - size_jz_after_cmp_inst;
 #else /* !SLJIT_CONFIG_X86_CET || !__SHSTK__ */
@@ -1024,7 +1137,8 @@ static sljit_s32 emit_mov(struct sljit_c
 		*inst = MOV_rm_r;
 		return SLJIT_SUCCESS;
 	}
-	if (src & SLJIT_IMM) {
+
+	if (src == SLJIT_IMM) {
 		if (FAST_IS_REG(dst)) {
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
 			return emit_do_imm(compiler, MOV_r_i32 | reg_map[dst], srcw);
@@ -1071,6 +1185,27 @@ static sljit_s32 emit_mov(struct sljit_c
 	return SLJIT_SUCCESS;
 }
 
+static sljit_s32 emit_cmov_generic(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_reg,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_u8* inst;
+	sljit_uw size;
+
+	SLJIT_ASSERT(type >= SLJIT_EQUAL && type <= SLJIT_ORDERED_LESS_EQUAL);
+
+	inst = (sljit_u8*)ensure_buf(compiler, 1 + 2);
+	FAIL_IF(!inst);
+	INC_SIZE(2);
+	inst[0] = U8(get_jump_code((sljit_uw)type ^ 0x1) - 0x10);
+
+	size = compiler->size;
+	EMIT_MOV(compiler, dst_reg, 0, src, srcw);
+
+	inst[1] = U8(compiler->size - size);
+	return SLJIT_SUCCESS;
+}
+
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
 {
 	sljit_u8 *inst;
@@ -1083,17 +1218,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	switch (GET_OPCODE(op)) {
 	case SLJIT_BREAKPOINT:
-		inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
-		FAIL_IF(!inst);
-		INC_SIZE(1);
-		*inst = INT3;
-		break;
+		return emit_byte(compiler, INT3);
 	case SLJIT_NOP:
-		inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
-		FAIL_IF(!inst);
-		INC_SIZE(1);
-		*inst = NOP;
-		break;
+		return emit_byte(compiler, NOP);
 	case SLJIT_LMUL_UW:
 	case SLJIT_LMUL_SW:
 	case SLJIT_DIVMOD_UW:
@@ -1134,23 +1261,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #endif
 
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-			inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
-			FAIL_IF(!inst);
-			INC_SIZE(1);
-			*inst = CDQ;
+			FAIL_IF(emit_byte(compiler, CDQ));
 #else
-			if (compiler->mode32) {
-				inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
-				FAIL_IF(!inst);
-				INC_SIZE(1);
-				*inst = CDQ;
-			} else {
+			if (!compiler->mode32) {
 				inst = (sljit_u8*)ensure_buf(compiler, 1 + 2);
 				FAIL_IF(!inst);
 				INC_SIZE(2);
-				*inst++ = REX_W;
-				*inst = CDQ;
-			}
+				inst[0] = REX_W;
+				inst[1] = CDQ;
+			} else
+				FAIL_IF(emit_byte(compiler, CDQ));
 #endif
 		}
 
@@ -1158,14 +1278,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		inst = (sljit_u8*)ensure_buf(compiler, 1 + 2);
 		FAIL_IF(!inst);
 		INC_SIZE(2);
-		*inst++ = GROUP_F7;
-		*inst = MOD_REG | ((op >= SLJIT_DIVMOD_UW) ? reg_map[TMP_REG1] : reg_map[SLJIT_R1]);
-#else
+		inst[0] = GROUP_F7;
+		inst[1] = MOD_REG | ((op >= SLJIT_DIVMOD_UW) ? reg_map[TMP_REG1] : reg_map[SLJIT_R1]);
+#else /* !SLJIT_CONFIG_X86_32 */
 #ifdef _WIN64
 		size = (!compiler->mode32 || op >= SLJIT_DIVMOD_UW) ? 3 : 2;
-#else
+#else /* !_WIN64 */
 		size = (!compiler->mode32) ? 3 : 2;
-#endif
+#endif /* _WIN64 */
 		inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
 		FAIL_IF(!inst);
 		INC_SIZE(size);
@@ -1174,29 +1294,29 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			*inst++ = REX_W | ((op >= SLJIT_DIVMOD_UW) ? REX_B : 0);
 		else if (op >= SLJIT_DIVMOD_UW)
 			*inst++ = REX_B;
-		*inst++ = GROUP_F7;
-		*inst = MOD_REG | ((op >= SLJIT_DIVMOD_UW) ? reg_lmap[TMP_REG1] : reg_lmap[SLJIT_R1]);
-#else
+		inst[0] = GROUP_F7;
+		inst[1] = MOD_REG | ((op >= SLJIT_DIVMOD_UW) ? reg_lmap[TMP_REG1] : reg_lmap[SLJIT_R1]);
+#else /* !_WIN64 */
 		if (!compiler->mode32)
 			*inst++ = REX_W;
-		*inst++ = GROUP_F7;
-		*inst = MOD_REG | reg_map[SLJIT_R1];
-#endif
-#endif
+		inst[0] = GROUP_F7;
+		inst[1] = MOD_REG | reg_map[SLJIT_R1];
+#endif /* _WIN64 */
+#endif /* SLJIT_CONFIG_X86_32 */
 		switch (op) {
 		case SLJIT_LMUL_UW:
-			*inst |= MUL;
+			inst[1] |= MUL;
 			break;
 		case SLJIT_LMUL_SW:
-			*inst |= IMUL;
+			inst[1] |= IMUL;
 			break;
 		case SLJIT_DIVMOD_UW:
 		case SLJIT_DIV_UW:
-			*inst |= DIV;
+			inst[1] |= DIV;
 			break;
 		case SLJIT_DIVMOD_SW:
 		case SLJIT_DIV_SW:
-			*inst |= IDIV;
+			inst[1] |= IDIV;
 			break;
 		}
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && !defined(_WIN64)
@@ -1216,29 +1336,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
-#define ENCODE_PREFIX(prefix) \
-	do { \
-		inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); \
-		FAIL_IF(!inst); \
-		INC_SIZE(1); \
-		*inst = U8(prefix); \
-	} while (0)
-
 static sljit_s32 emit_mov_byte(struct sljit_compiler *compiler, sljit_s32 sign,
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 src, sljit_sw srcw)
 {
 	sljit_u8* inst;
 	sljit_s32 dst_r;
-#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-	sljit_s32 work_r;
-#endif
 
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 	compiler->mode32 = 0;
 #endif
 
-	if (src & SLJIT_IMM) {
+	if (src == SLJIT_IMM) {
 		if (FAST_IS_REG(dst)) {
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
 			return emit_do_imm(compiler, MOV_r_i32 | reg_map[dst], srcw);
@@ -1267,100 +1376,33 @@ static sljit_s32 emit_mov_byte(struct sl
 #else
 		dst_r = src;
 #endif
-	}
+	} else {
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-	else if (FAST_IS_REG(src) && reg_map[src] >= 4) {
-		/* src, dst are registers. */
-		SLJIT_ASSERT(FAST_IS_REG(dst));
-		if (reg_map[dst] < 4) {
-			if (dst != src)
-				EMIT_MOV(compiler, dst, 0, src, 0);
-			inst = emit_x86_instruction(compiler, 2, dst, 0, dst, 0);
-			FAIL_IF(!inst);
-			*inst++ = GROUP_0F;
-			*inst = sign ? MOVSX_r_rm8 : MOVZX_r_rm8;
-		}
-		else {
-			if (dst != src)
-				EMIT_MOV(compiler, dst, 0, src, 0);
-			if (sign) {
-				/* shl reg, 24 */
-				inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 24, dst, 0);
-				FAIL_IF(!inst);
-				*inst |= SHL;
-				/* sar reg, 24 */
-				inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 24, dst, 0);
-				FAIL_IF(!inst);
-				*inst |= SAR;
-			}
-			else {
+		if (FAST_IS_REG(src) && reg_map[src] >= 4) {
+			/* Both src and dst are registers. */
+			SLJIT_ASSERT(FAST_IS_REG(dst));
+
+			if (src == dst && !sign) {
 				inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, 0xff, dst, 0);
 				FAIL_IF(!inst);
 				*(inst + 1) |= AND;
+				return SLJIT_SUCCESS;
 			}
+
+			EMIT_MOV(compiler, TMP_REG1, 0, src, 0);
+			src = TMP_REG1;
+			srcw = 0;
 		}
-		return SLJIT_SUCCESS;
-	}
-#endif
-	else {
+#endif /* !SLJIT_CONFIG_X86_32 */
+
 		/* src can be memory addr or reg_map[src] < 4 on x86_32 architectures. */
-		inst = emit_x86_instruction(compiler, 2, dst_r, 0, src, srcw);
-		FAIL_IF(!inst);
-		*inst++ = GROUP_0F;
-		*inst = sign ? MOVSX_r_rm8 : MOVZX_r_rm8;
+		FAIL_IF(emit_groupf(compiler, sign ? MOVSX_r_rm8 : MOVZX_r_rm8, dst_r, src, srcw));
 	}
 
 	if (dst & SLJIT_MEM) {
-#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-		if (dst_r == TMP_REG1) {
-			/* Find a non-used register, whose reg_map[src] < 4. */
-			if ((dst & REG_MASK) == SLJIT_R0) {
-				if ((dst & OFFS_REG_MASK) == TO_OFFS_REG(SLJIT_R1))
-					work_r = SLJIT_R2;
-				else
-					work_r = SLJIT_R1;
-			}
-			else {
-				if ((dst & OFFS_REG_MASK) != TO_OFFS_REG(SLJIT_R0))
-					work_r = SLJIT_R0;
-				else if ((dst & REG_MASK) == SLJIT_R1)
-					work_r = SLJIT_R2;
-				else
-					work_r = SLJIT_R1;
-			}
-
-			if (work_r == SLJIT_R0) {
-				ENCODE_PREFIX(XCHG_EAX_r | reg_map[TMP_REG1]);
-			}
-			else {
-				inst = emit_x86_instruction(compiler, 1, work_r, 0, dst_r, 0);
-				FAIL_IF(!inst);
-				*inst = XCHG_r_rm;
-			}
-
-			inst = emit_x86_instruction(compiler, 1, work_r, 0, dst, dstw);
-			FAIL_IF(!inst);
-			*inst = MOV_rm8_r8;
-
-			if (work_r == SLJIT_R0) {
-				ENCODE_PREFIX(XCHG_EAX_r | reg_map[TMP_REG1]);
-			}
-			else {
-				inst = emit_x86_instruction(compiler, 1, work_r, 0, dst_r, 0);
-				FAIL_IF(!inst);
-				*inst = XCHG_r_rm;
-			}
-		}
-		else {
-			inst = emit_x86_instruction(compiler, 1, dst_r, 0, dst, dstw);
-			FAIL_IF(!inst);
-			*inst = MOV_rm8_r8;
-		}
-#else
 		inst = emit_x86_instruction(compiler, 1 | EX86_REX | EX86_NO_REXW, dst_r, 0, dst, dstw);
 		FAIL_IF(!inst);
 		*inst = MOV_rm8_r8;
-#endif
 	}
 
 	return SLJIT_SUCCESS;
@@ -1377,15 +1419,15 @@ static sljit_s32 emit_prefetch(struct sl
 
 	inst = emit_x86_instruction(compiler, 2, 0, 0, src, srcw);
 	FAIL_IF(!inst);
-	*inst++ = GROUP_0F;
-	*inst++ = PREFETCH;
+	inst[0] = GROUP_0F;
+	inst[1] = PREFETCH;
 
 	if (op == SLJIT_PREFETCH_L1)
-		*inst |= (1 << 3);
+		inst[2] |= (1 << 3);
 	else if (op == SLJIT_PREFETCH_L2)
-		*inst |= (2 << 3);
+		inst[2] |= (2 << 3);
 	else if (op == SLJIT_PREFETCH_L3)
-		*inst |= (3 << 3);
+		inst[2] |= (3 << 3);
 
 	return SLJIT_SUCCESS;
 }
@@ -1401,7 +1443,7 @@ static sljit_s32 emit_mov_half(struct sl
 	compiler->mode32 = 0;
 #endif
 
-	if (src & SLJIT_IMM) {
+	if (src == SLJIT_IMM) {
 		if (FAST_IS_REG(dst)) {
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
 			return emit_do_imm(compiler, MOV_r_i32 | reg_map[dst], srcw);
@@ -1422,12 +1464,8 @@ static sljit_s32 emit_mov_half(struct sl
 
 	if ((dst & SLJIT_MEM) && FAST_IS_REG(src))
 		dst_r = src;
-	else {
-		inst = emit_x86_instruction(compiler, 2, dst_r, 0, src, srcw);
-		FAIL_IF(!inst);
-		*inst++ = GROUP_0F;
-		*inst = sign ? MOVSX_r_rm16 : MOVZX_r_rm16;
-	}
+	else
+		FAIL_IF(emit_groupf(compiler, sign ? MOVSX_r_rm16 : MOVZX_r_rm16, dst_r, src, srcw));
 
 	if (dst & SLJIT_MEM) {
 		inst = emit_x86_instruction(compiler, 1 | EX86_NO_REXW | EX86_PREF_66, dst_r, 0, dst, dstw);
@@ -1448,55 +1486,25 @@ static sljit_s32 emit_unary(struct sljit
 		/* Same input and output */
 		inst = emit_x86_instruction(compiler, 1, 0, 0, dst, dstw);
 		FAIL_IF(!inst);
-		*inst++ = GROUP_F7;
-		*inst |= opcode;
-		return SLJIT_SUCCESS;
-	}
-
-	if (FAST_IS_REG(dst)) {
-		EMIT_MOV(compiler, dst, 0, src, srcw);
-		inst = emit_x86_instruction(compiler, 1, 0, 0, dst, 0);
-		FAIL_IF(!inst);
-		*inst++ = GROUP_F7;
-		*inst |= opcode;
+		inst[0] = GROUP_F7;
+		inst[1] |= opcode;
 		return SLJIT_SUCCESS;
 	}
 
-	EMIT_MOV(compiler, TMP_REG1, 0, src, srcw);
-	inst = emit_x86_instruction(compiler, 1, 0, 0, TMP_REG1, 0);
-	FAIL_IF(!inst);
-	*inst++ = GROUP_F7;
-	*inst |= opcode;
-	EMIT_MOV(compiler, dst, dstw, TMP_REG1, 0);
-	return SLJIT_SUCCESS;
-}
-
-static sljit_s32 emit_not_with_flags(struct sljit_compiler *compiler,
-	sljit_s32 dst, sljit_sw dstw,
-	sljit_s32 src, sljit_sw srcw)
-{
-	sljit_u8* inst;
-
 	if (FAST_IS_REG(dst)) {
 		EMIT_MOV(compiler, dst, 0, src, srcw);
 		inst = emit_x86_instruction(compiler, 1, 0, 0, dst, 0);
 		FAIL_IF(!inst);
-		*inst++ = GROUP_F7;
-		*inst |= NOT_rm;
-		inst = emit_x86_instruction(compiler, 1, dst, 0, dst, 0);
-		FAIL_IF(!inst);
-		*inst = OR_r_rm;
+		inst[0] = GROUP_F7;
+		inst[1] |= opcode;
 		return SLJIT_SUCCESS;
 	}
 
 	EMIT_MOV(compiler, TMP_REG1, 0, src, srcw);
 	inst = emit_x86_instruction(compiler, 1, 0, 0, TMP_REG1, 0);
 	FAIL_IF(!inst);
-	*inst++ = GROUP_F7;
-	*inst |= NOT_rm;
-	inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, TMP_REG1, 0);
-	FAIL_IF(!inst);
-	*inst = OR_r_rm;
+	inst[0] = GROUP_F7;
+	inst[1] |= opcode;
 	EMIT_MOV(compiler, dst, dstw, TMP_REG1, 0);
 	return SLJIT_SUCCESS;
 }
@@ -1514,32 +1522,19 @@ static sljit_s32 emit_clz_ctz(struct slj
 	sljit_s32 dst_r;
 	sljit_sw max;
 
-	if (cpu_feature_list == 0)
-		get_cpu_features();
+	SLJIT_ASSERT(cpu_feature_list != 0);
 
 	dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
 
 	if (is_clz ? (cpu_feature_list & CPU_FEATURE_LZCNT) : (cpu_feature_list & CPU_FEATURE_TZCNT)) {
-		/* Group prefix added separately. */
-		inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
-		FAIL_IF(!inst);
-		INC_SIZE(1);
-		*inst++ = GROUP_F3;
-
-		inst = emit_x86_instruction(compiler, 2, dst_r, 0, src, srcw);
-		FAIL_IF(!inst);
-		*inst++ = GROUP_0F;
-		*inst = is_clz ? LZCNT_r_rm : TZCNT_r_rm;
+		FAIL_IF(emit_groupf(compiler, (is_clz ? LZCNT_r_rm : TZCNT_r_rm) | EX86_PREF_F3, dst_r, src, srcw));
 
 		if (dst & SLJIT_MEM)
 			EMIT_MOV(compiler, dst, dstw, TMP_REG1, 0);
 		return SLJIT_SUCCESS;
 	}
 
-	inst = emit_x86_instruction(compiler, 2, dst_r, 0, src, srcw);
-	FAIL_IF(!inst);
-	*inst++ = GROUP_0F;
-	*inst = is_clz ? BSR_r_rm : BSF_r_rm;
+	FAIL_IF(emit_groupf(compiler, is_clz ? BSR_r_rm : BSF_r_rm, dst_r, src, srcw));
 
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
 	max = is_clz ? (32 + 31) : 32;
@@ -1553,11 +1548,11 @@ static sljit_s32 emit_clz_ctz(struct slj
 			inst = emit_x86_instruction(compiler, 2, dst_r, 0, SLJIT_MEM0(), is_clz ? (sljit_sw)&emit_clz_arg : (sljit_sw)&emit_ctz_arg);
 
 		FAIL_IF(!inst);
-		*inst++ = GROUP_0F;
-		*inst = CMOVE_r_rm;
+		inst[0] = GROUP_0F;
+		inst[1] = CMOVE_r_rm;
 	}
 	else
-		FAIL_IF(sljit_emit_cmov_generic(compiler, SLJIT_EQUAL, dst_r, SLJIT_IMM, max));
+		FAIL_IF(emit_cmov_generic(compiler, SLJIT_EQUAL, dst_r, SLJIT_IMM, max));
 
 	if (is_clz) {
 		inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, 31, dst_r, 0);
@@ -1572,14 +1567,9 @@ static sljit_s32 emit_clz_ctz(struct slj
 
 	if (cpu_feature_list & CPU_FEATURE_CMOV) {
 		EMIT_MOV(compiler, TMP_REG2, 0, SLJIT_IMM, max);
-
-		inst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0);
-		FAIL_IF(!inst);
-		*inst++ = GROUP_0F;
-		*inst = CMOVE_r_rm;
-	}
-	else
-		FAIL_IF(sljit_emit_cmov_generic(compiler, SLJIT_EQUAL, dst_r, SLJIT_IMM, max));
+		FAIL_IF(emit_groupf(compiler, CMOVE_r_rm, dst_r, TMP_REG2, 0));
+	} else
+		FAIL_IF(emit_cmov_generic(compiler, SLJIT_EQUAL, dst_r, SLJIT_IMM, max));
 
 	if (is_clz) {
 		inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, max >> 1, dst_r, 0);
@@ -1593,14 +1583,109 @@ static sljit_s32 emit_clz_ctz(struct slj
 	return SLJIT_SUCCESS;
 }
 
+static sljit_s32 emit_bswap(struct sljit_compiler *compiler,
+	sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_u8 *inst;
+	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
+	sljit_uw size;
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	sljit_u8 rex = 0;
+#else /* !SLJIT_CONFIG_X86_64 */
+	sljit_s32 dst_is_ereg = op & SLJIT_32;
+#endif /* SLJIT_CONFIG_X86_64 */
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	if (op == SLJIT_REV_U32 || op == SLJIT_REV_S32)
+		compiler->mode32 = 1;
+#else /* !SLJIT_CONFIG_X86_64 */
+	op &= ~SLJIT_32;
+#endif /* SLJIT_CONFIG_X86_64 */
+
+	if (src != dst_r) {
+		/* Only the lower 16 bit is read for eregs. */
+		if (op == SLJIT_REV_U16 || op == SLJIT_REV_S16)
+			FAIL_IF(emit_mov_half(compiler, 0, dst_r, 0, src, srcw));
+		else
+			EMIT_MOV(compiler, dst_r, 0, src, srcw);
+	}
+
+	size = 2;
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	if (!compiler->mode32)
+		rex = REX_W;
+
+	if (reg_map[dst_r] >= 8)
+		rex |= REX_B;
+
+	if (rex != 0)
+		size++;
+#endif /* SLJIT_CONFIG_X86_64 */
+
+	inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
+	FAIL_IF(!inst);
+	INC_SIZE(size);
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	if (rex != 0)
+		*inst++ = rex;
+
+	inst[0] = GROUP_0F;
+	inst[1] = BSWAP_r | reg_lmap[dst_r];
+#else /* !SLJIT_CONFIG_X86_64 */
+	inst[0] = GROUP_0F;
+	inst[1] = BSWAP_r | reg_map[dst_r];
+#endif /* SLJIT_CONFIG_X86_64 */
+
+	if (op == SLJIT_REV_U16 || op == SLJIT_REV_S16) {
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+		size = compiler->mode32 ? 16 : 48;
+#else /* !SLJIT_CONFIG_X86_64 */
+		size = 16;
+#endif /* SLJIT_CONFIG_X86_64 */
+
+		inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, (sljit_sw)size, dst_r, 0);
+		FAIL_IF(!inst);
+		if (op == SLJIT_REV_U16)
+			inst[1] |= SHR;
+		else
+			inst[1] |= SAR;
+	}
+
+	if (dst & SLJIT_MEM) {
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+		if (dst_is_ereg)
+			op = SLJIT_REV;
+#endif /* SLJIT_CONFIG_X86_32 */
+		if (op == SLJIT_REV_U16 || op == SLJIT_REV_S16)
+			return emit_mov_half(compiler, 0, dst, dstw, TMP_REG1, 0);
+
+		return emit_mov(compiler, dst, dstw, TMP_REG1, 0);
+	}
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	if (op == SLJIT_REV_S32) {
+		compiler->mode32 = 0;
+		inst = emit_x86_instruction(compiler, 1, dst, 0, dst, 0);
+		FAIL_IF(!inst);
+		*inst = MOVSXD_r_rm;
+	}
+#endif /* SLJIT_CONFIG_X86_64 */
+
+	return SLJIT_SUCCESS;
+}
+
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 src, sljit_sw srcw)
 {
-	sljit_s32 op_flags = GET_ALL_FLAGS(op);
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
 	sljit_s32 dst_is_ereg = 0;
-#endif
+#else /* !SLJIT_CONFIG_X86_32 */
+	sljit_s32 op_flags = GET_ALL_FLAGS(op);
+#endif /* SLJIT_CONFIG_X86_32 */
 
 	CHECK_ERROR();
 	CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
@@ -1611,14 +1696,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	CHECK_EXTRA_REGS(src, srcw, (void)0);
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 	compiler->mode32 = op_flags & SLJIT_32;
-#endif
+#endif /* SLJIT_CONFIG_X86_64 */
 
 	op = GET_OPCODE(op);
 
 	if (op >= SLJIT_MOV && op <= SLJIT_MOV_P) {
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 		compiler->mode32 = 0;
-#endif
+#endif /* SLJIT_CONFIG_X86_64 */
 
 		if (FAST_IS_REG(src) && src == dst) {
 			if (!TYPE_CAST_NEEDED(op))
@@ -1631,14 +1716,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 				if (op == SLJIT_MOV_S32)
 					op = SLJIT_MOV_U32;
 			}
-			else if (src & SLJIT_IMM) {
+			else if (src == SLJIT_IMM) {
 				if (op == SLJIT_MOV_U32)
 					op = SLJIT_MOV_S32;
 			}
 		}
-#endif
+#endif /* SLJIT_CONFIG_X86_64 */
 
-		if (src & SLJIT_IMM) {
+		if (src == SLJIT_IMM) {
 			switch (op) {
 			case SLJIT_MOV_U8:
 				srcw = (sljit_u8)srcw;
@@ -1659,12 +1744,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			case SLJIT_MOV_S32:
 				srcw = (sljit_s32)srcw;
 				break;
-#endif
+#endif /* SLJIT_CONFIG_X86_64 */
 			}
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
 			if (SLJIT_UNLIKELY(dst_is_ereg))
 				return emit_mov(compiler, dst, dstw, src, srcw);
-#endif
+#endif /* SLJIT_CONFIG_X86_32 */
 		}
 
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
@@ -1672,7 +1757,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			SLJIT_ASSERT(dst == SLJIT_MEM1(SLJIT_SP));
 			dst = TMP_REG1;
 		}
-#endif
+#endif /* SLJIT_CONFIG_X86_32 */
 
 		switch (op) {
 		case SLJIT_MOV:
@@ -1681,7 +1766,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		case SLJIT_MOV_U32:
 		case SLJIT_MOV_S32:
 		case SLJIT_MOV32:
-#endif
+#endif /* SLJIT_CONFIG_X86_32 */
 			EMIT_MOV(compiler, dst, dstw, src, srcw);
 			break;
 		case SLJIT_MOV_U8:
@@ -1708,25 +1793,30 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			EMIT_MOV(compiler, dst, dstw, src, srcw);
 			compiler->mode32 = 0;
 			break;
-#endif
+#endif /* SLJIT_CONFIG_X86_64 */
 		}
 
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
 		if (SLJIT_UNLIKELY(dst_is_ereg) && dst == TMP_REG1)
 			return emit_mov(compiler, SLJIT_MEM1(SLJIT_SP), dstw, TMP_REG1, 0);
-#endif
+#endif /* SLJIT_CONFIG_X86_32 */
 		return SLJIT_SUCCESS;
 	}
 
 	switch (op) {
-	case SLJIT_NOT:
-		if (SLJIT_UNLIKELY(op_flags & SLJIT_SET_Z))
-			return emit_not_with_flags(compiler, dst, dstw, src, srcw);
-		return emit_unary(compiler, NOT_rm, dst, dstw, src, srcw);
-
 	case SLJIT_CLZ:
 	case SLJIT_CTZ:
 		return emit_clz_ctz(compiler, (op == SLJIT_CLZ), dst, dstw, src, srcw);
+	case SLJIT_REV:
+	case SLJIT_REV_U16:
+	case SLJIT_REV_S16:
+	case SLJIT_REV_U32:
+	case SLJIT_REV_S32:
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+		if (dst_is_ereg)
+			op |= SLJIT_32;
+#endif /* SLJIT_CONFIG_X86_32 */
+		return emit_bswap(compiler, op, dst, dstw, src, srcw);
 	}
 
 	return SLJIT_SUCCESS;
@@ -1745,7 +1835,7 @@ static sljit_s32 emit_cum_binary(struct
 	sljit_u8 op_imm = U8(op_types & 0xff);
 
 	if (dst == src1 && dstw == src1w) {
-		if (src2 & SLJIT_IMM) {
+		if (src2 == SLJIT_IMM) {
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 			if ((dst == SLJIT_R0) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) {
 #else
@@ -1779,7 +1869,7 @@ static sljit_s32 emit_cum_binary(struct
 
 	/* Only for cumulative operations. */
 	if (dst == src2 && dstw == src2w) {
-		if (src1 & SLJIT_IMM) {
+		if (src1 == SLJIT_IMM) {
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 			if ((dst == SLJIT_R0) && (src1w > 127 || src1w < -128) && (compiler->mode32 || IS_HALFWORD(src1w))) {
 #else
@@ -1813,7 +1903,7 @@ static sljit_s32 emit_cum_binary(struct
 	/* General version. */
 	if (FAST_IS_REG(dst)) {
 		EMIT_MOV(compiler, dst, 0, src1, src1w);
-		if (src2 & SLJIT_IMM) {
+		if (src2 == SLJIT_IMM) {
 			BINARY_IMM(op_imm, op_mr, src2w, dst, 0);
 		}
 		else {
@@ -1825,7 +1915,7 @@ static sljit_s32 emit_cum_binary(struct
 	else {
 		/* This version requires less memory writing. */
 		EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);
-		if (src2 & SLJIT_IMM) {
+		if (src2 == SLJIT_IMM) {
 			BINARY_IMM(op_imm, op_mr, src2w, TMP_REG1, 0);
 		}
 		else {
@@ -1852,7 +1942,7 @@ static sljit_s32 emit_non_cum_binary(str
 	sljit_u8 op_imm = U8(op_types & 0xff);
 
 	if (dst == src1 && dstw == src1w) {
-		if (src2 & SLJIT_IMM) {
+		if (src2 == SLJIT_IMM) {
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 			if ((dst == SLJIT_R0) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) {
 #else
@@ -1886,7 +1976,7 @@ static sljit_s32 emit_non_cum_binary(str
 	/* General version. */
 	if (FAST_IS_REG(dst) && dst != src2) {
 		EMIT_MOV(compiler, dst, 0, src1, src1w);
-		if (src2 & SLJIT_IMM) {
+		if (src2 == SLJIT_IMM) {
 			BINARY_IMM(op_imm, op_mr, src2w, dst, 0);
 		}
 		else {
@@ -1898,7 +1988,7 @@ static sljit_s32 emit_non_cum_binary(str
 	else {
 		/* This version requires less memory writing. */
 		EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);
-		if (src2 & SLJIT_IMM) {
+		if (src2 == SLJIT_IMM) {
 			BINARY_IMM(op_imm, op_mr, src2w, TMP_REG1, 0);
 		}
 		else {
@@ -1921,20 +2011,12 @@ static sljit_s32 emit_mul(struct sljit_c
 	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
 
 	/* Register destination. */
-	if (dst_r == src1 && !(src2 & SLJIT_IMM)) {
-		inst = emit_x86_instruction(compiler, 2, dst_r, 0, src2, src2w);
-		FAIL_IF(!inst);
-		*inst++ = GROUP_0F;
-		*inst = IMUL_r_rm;
-	}
-	else if (dst_r == src2 && !(src1 & SLJIT_IMM)) {
-		inst = emit_x86_instruction(compiler, 2, dst_r, 0, src1, src1w);
-		FAIL_IF(!inst);
-		*inst++ = GROUP_0F;
-		*inst = IMUL_r_rm;
-	}
-	else if (src1 & SLJIT_IMM) {
-		if (src2 & SLJIT_IMM) {
+	if (dst_r == src1 && src2 != SLJIT_IMM) {
+		FAIL_IF(emit_groupf(compiler, IMUL_r_rm, dst_r, src2, src2w));
+	} else if (dst_r == src2 && src1 != SLJIT_IMM) {
+		FAIL_IF(emit_groupf(compiler, IMUL_r_rm, dst_r, src1, src1w));
+	} else if (src1 == SLJIT_IMM) {
+		if (src2 == SLJIT_IMM) {
 			EMIT_MOV(compiler, dst_r, 0, SLJIT_IMM, src2w);
 			src2 = dst_r;
 			src2w = 0;
@@ -1944,10 +2026,8 @@ static sljit_s32 emit_mul(struct sljit_c
 			inst = emit_x86_instruction(compiler, 1, dst_r, 0, src2, src2w);
 			FAIL_IF(!inst);
 			*inst = IMUL_r_rm_i8;
-			inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
-			FAIL_IF(!inst);
-			INC_SIZE(1);
-			*inst = U8(src1w);
+
+			FAIL_IF(emit_byte(compiler, U8(src1w)));
 		}
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
 		else {
@@ -1973,30 +2053,26 @@ static sljit_s32 emit_mul(struct sljit_c
 			if (dst_r != src2)
 				EMIT_MOV(compiler, dst_r, 0, src2, src2w);
 			FAIL_IF(emit_load_imm64(compiler, TMP_REG2, src1w));
-			inst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0);
-			FAIL_IF(!inst);
-			*inst++ = GROUP_0F;
-			*inst = IMUL_r_rm;
+			FAIL_IF(emit_groupf(compiler, IMUL_r_rm, dst_r, TMP_REG2, 0));
 		}
 #endif
 	}
-	else if (src2 & SLJIT_IMM) {
+	else if (src2 == SLJIT_IMM) {
 		/* Note: src1 is NOT immediate. */
 
 		if (src2w <= 127 && src2w >= -128) {
 			inst = emit_x86_instruction(compiler, 1, dst_r, 0, src1, src1w);
 			FAIL_IF(!inst);
 			*inst = IMUL_r_rm_i8;
-			inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
-			FAIL_IF(!inst);
-			INC_SIZE(1);
-			*inst = U8(src2w);
+
+			FAIL_IF(emit_byte(compiler, U8(src2w)));
 		}
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
 		else {
 			inst = emit_x86_instruction(compiler, 1, dst_r, 0, src1, src1w);
 			FAIL_IF(!inst);
 			*inst = IMUL_r_rm_i32;
+
 			inst = (sljit_u8*)ensure_buf(compiler, 1 + 4);
 			FAIL_IF(!inst);
 			INC_SIZE(4);
@@ -2007,31 +2083,24 @@ static sljit_s32 emit_mul(struct sljit_c
 			inst = emit_x86_instruction(compiler, 1, dst_r, 0, src1, src1w);
 			FAIL_IF(!inst);
 			*inst = IMUL_r_rm_i32;
+
 			inst = (sljit_u8*)ensure_buf(compiler, 1 + 4);
 			FAIL_IF(!inst);
 			INC_SIZE(4);
 			sljit_unaligned_store_s32(inst, (sljit_s32)src2w);
-		}
-		else {
+		} else {
 			if (dst_r != src1)
 				EMIT_MOV(compiler, dst_r, 0, src1, src1w);
 			FAIL_IF(emit_load_imm64(compiler, TMP_REG2, src2w));
-			inst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0);
-			FAIL_IF(!inst);
-			*inst++ = GROUP_0F;
-			*inst = IMUL_r_rm;
+			FAIL_IF(emit_groupf(compiler, IMUL_r_rm, dst_r, TMP_REG2, 0));
 		}
 #endif
-	}
-	else {
+	} else {
 		/* Neither argument is immediate. */
 		if (ADDRESSING_DEPENDS_ON(src2, dst_r))
 			dst_r = TMP_REG1;
 		EMIT_MOV(compiler, dst_r, 0, src1, src1w);
-		inst = emit_x86_instruction(compiler, 2, dst_r, 0, src2, src2w);
-		FAIL_IF(!inst);
-		*inst++ = GROUP_0F;
-		*inst = IMUL_r_rm;
+		FAIL_IF(emit_groupf(compiler, IMUL_r_rm, dst_r, src2, src2w));
 	}
 
 	if (dst & SLJIT_MEM)
@@ -2064,10 +2133,10 @@ static sljit_s32 emit_lea_binary(struct
 			done = 1;
 		}
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-		if ((src2 & SLJIT_IMM) && (compiler->mode32 || IS_HALFWORD(src2w))) {
+		if (src2 == SLJIT_IMM && (compiler->mode32 || IS_HALFWORD(src2w))) {
 			inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src1), (sljit_s32)src2w);
 #else
-		if (src2 & SLJIT_IMM) {
+		if (src2 == SLJIT_IMM) {
 			inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src1), src2w);
 #endif
 			FAIL_IF(!inst);
@@ -2077,10 +2146,10 @@ static sljit_s32 emit_lea_binary(struct
 	}
 	else if (FAST_IS_REG(src2)) {
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-		if ((src1 & SLJIT_IMM) && (compiler->mode32 || IS_HALFWORD(src1w))) {
+		if (src1 == SLJIT_IMM && (compiler->mode32 || IS_HALFWORD(src1w))) {
 			inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src2), (sljit_s32)src1w);
 #else
-		if (src1 & SLJIT_IMM) {
+		if (src1 == SLJIT_IMM) {
 			inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src2), src1w);
 #endif
 			FAIL_IF(!inst);
@@ -2104,16 +2173,16 @@ static sljit_s32 emit_cmp_binary(struct
 	sljit_u8* inst;
 
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-	if (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) {
+	if (src1 == SLJIT_R0 && src2 == SLJIT_IMM && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) {
 #else
-	if (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128)) {
+	if (src1 == SLJIT_R0 && src2 == SLJIT_IMM && (src2w > 127 || src2w < -128)) {
 #endif
 		BINARY_EAX_IMM(CMP_EAX_i32, src2w);
 		return SLJIT_SUCCESS;
 	}
 
 	if (FAST_IS_REG(src1)) {
-		if (src2 & SLJIT_IMM) {
+		if (src2 == SLJIT_IMM) {
 			BINARY_IMM(CMP, CMP_rm_r, src2w, src1, 0);
 		}
 		else {
@@ -2124,15 +2193,15 @@ static sljit_s32 emit_cmp_binary(struct
 		return SLJIT_SUCCESS;
 	}
 
-	if (FAST_IS_REG(src2) && !(src1 & SLJIT_IMM)) {
+	if (FAST_IS_REG(src2) && src1 != SLJIT_IMM) {
 		inst = emit_x86_instruction(compiler, 1, src2, 0, src1, src1w);
 		FAIL_IF(!inst);
 		*inst = CMP_rm_r;
 		return SLJIT_SUCCESS;
 	}
 
-	if (src2 & SLJIT_IMM) {
-		if (src1 & SLJIT_IMM) {
+	if (src2 == SLJIT_IMM) {
+		if (src1 == SLJIT_IMM) {
 			EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);
 			src1 = TMP_REG1;
 			src1w = 0;
@@ -2155,25 +2224,25 @@ static sljit_s32 emit_test_binary(struct
 	sljit_u8* inst;
 
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-	if (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) {
+	if (src1 == SLJIT_R0 && src2 == SLJIT_IMM && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) {
 #else
-	if (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128)) {
+	if (src1 == SLJIT_R0 && src2 == SLJIT_IMM && (src2w > 127 || src2w < -128)) {
 #endif
 		BINARY_EAX_IMM(TEST_EAX_i32, src2w);
 		return SLJIT_SUCCESS;
 	}
 
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-	if (src2 == SLJIT_R0 && (src1 & SLJIT_IMM) && (src1w > 127 || src1w < -128) && (compiler->mode32 || IS_HALFWORD(src1w))) {
+	if (src2 == SLJIT_R0 && src1 == SLJIT_IMM && (src1w > 127 || src1w < -128) && (compiler->mode32 || IS_HALFWORD(src1w))) {
 #else
-	if (src2 == SLJIT_R0 && (src1 & SLJIT_IMM) && (src1w > 127 || src1w < -128)) {
+	if (src2 == SLJIT_R0 && src1 == SLJIT_IMM && (src1w > 127 || src1w < -128)) {
 #endif
 		BINARY_EAX_IMM(TEST_EAX_i32, src1w);
 		return SLJIT_SUCCESS;
 	}
 
-	if (!(src1 & SLJIT_IMM)) {
-		if (src2 & SLJIT_IMM) {
+	if (src1 != SLJIT_IMM) {
+		if (src2 == SLJIT_IMM) {
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 			if (IS_HALFWORD(src2w) || compiler->mode32) {
 				inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, src1, src1w);
@@ -2201,8 +2270,8 @@ static sljit_s32 emit_test_binary(struct
 		}
 	}
 
-	if (!(src2 & SLJIT_IMM)) {
-		if (src1 & SLJIT_IMM) {
+	if (src2 != SLJIT_IMM) {
+		if (src1 == SLJIT_IMM) {
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 			if (IS_HALFWORD(src1w) || compiler->mode32) {
 				inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src1w, src2, src2w);
@@ -2231,7 +2300,7 @@ static sljit_s32 emit_test_binary(struct
 	}
 
 	EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);
-	if (src2 & SLJIT_IMM) {
+	if (src2 == SLJIT_IMM) {
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 		if (IS_HALFWORD(src2w) || compiler->mode32) {
 			inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, TMP_REG1, 0);
@@ -2269,18 +2338,18 @@ static sljit_s32 emit_shift(struct sljit
 #endif
 	sljit_u8* inst;
 
-	if ((src2 & SLJIT_IMM) || (src2 == SLJIT_PREF_SHIFT_REG)) {
+	if (src2 == SLJIT_IMM || src2 == SLJIT_PREF_SHIFT_REG) {
 		if (dst == src1 && dstw == src1w) {
 			inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, dst, dstw);
 			FAIL_IF(!inst);
-			*inst |= mode;
+			inst[1] |= mode;
 			return SLJIT_SUCCESS;
 		}
 		if (dst == SLJIT_PREF_SHIFT_REG && src2 == SLJIT_PREF_SHIFT_REG) {
 			EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);
 			inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0);
 			FAIL_IF(!inst);
-			*inst |= mode;
+			inst[1] |= mode;
 			EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0);
 			return SLJIT_SUCCESS;
 		}
@@ -2288,14 +2357,14 @@ static sljit_s32 emit_shift(struct sljit
 			EMIT_MOV(compiler, dst, 0, src1, src1w);
 			inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, dst, 0);
 			FAIL_IF(!inst);
-			*inst |= mode;
+			inst[1] |= mode;
 			return SLJIT_SUCCESS;
 		}
 
 		EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);
 		inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, TMP_REG1, 0);
 		FAIL_IF(!inst);
-		*inst |= mode;
+		inst[1] |= mode;
 		EMIT_MOV(compiler, dst, dstw, TMP_REG1, 0);
 		return SLJIT_SUCCESS;
 	}
@@ -2305,7 +2374,7 @@ static sljit_s32 emit_shift(struct sljit
 		EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w);
 		inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0);
 		FAIL_IF(!inst);
-		*inst |= mode;
+		inst[1] |= mode;
 		return emit_mov(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0);
 	}
 
@@ -2323,7 +2392,7 @@ static sljit_s32 emit_shift(struct sljit
 		EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w);
 		inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, dst, 0);
 		FAIL_IF(!inst);
-		*inst |= mode;
+		inst[1] |= mode;
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 		compiler->mode32 = 0;
 #endif
@@ -2349,7 +2418,7 @@ static sljit_s32 emit_shift(struct sljit
 	EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w);
 	inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0);
 	FAIL_IF(!inst);
-	*inst |= mode;
+	inst[1] |= mode;
 
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
 	EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, SLJIT_MEM1(SLJIT_SP), 0);
@@ -2372,7 +2441,7 @@ static sljit_s32 emit_shift_with_flags(s
 	sljit_s32 src2, sljit_sw src2w)
 {
 	/* The CPU does not set flags if the shift count is 0. */
-	if (src2 & SLJIT_IMM) {
+	if (src2 == SLJIT_IMM) {
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 		src2w &= compiler->mode32 ? 0x1f : 0x3f;
 #else /* !SLJIT_CONFIG_X86_64 */
@@ -2437,7 +2506,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			return emit_unary(compiler, NEG_rm, dst, dstw, src2, src2w);
 
 		if (!HAS_FLAGS(op)) {
-			if ((src2 & SLJIT_IMM) && emit_lea_binary(compiler, dst, dstw, src1, src1w, SLJIT_IMM, -src2w) != SLJIT_ERR_UNSUPPORTED)
+			if (src2 == SLJIT_IMM && emit_lea_binary(compiler, dst, dstw, src1, src1w, SLJIT_IMM, -src2w) != SLJIT_ERR_UNSUPPORTED)
 				return compiler->error;
 			if (FAST_IS_REG(dst) && src2 == dst) {
 				FAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB), dst, 0, dst, 0, src1, src1w));
@@ -2459,6 +2528,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		return emit_cum_binary(compiler, BINARY_OPCODE(OR),
 			dst, dstw, src1, src1w, src2, src2w);
 	case SLJIT_XOR:
+		if (!HAS_FLAGS(op)) {
+			if (src2 == SLJIT_IMM && src2w == -1)
+				return emit_unary(compiler, NOT_rm, dst, dstw, src1, src1w);
+			if (src1 == SLJIT_IMM && src1w == -1)
+				return emit_unary(compiler, NOT_rm, dst, dstw, src2, src2w);
+		}
+
 		return emit_cum_binary(compiler, BINARY_OPCODE(XOR),
 			dst, dstw, src1, src1w, src2, src2w);
 	case SLJIT_SHL:
@@ -2514,117 +2590,192 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op,
-	sljit_s32 src_dst,
-	sljit_s32 src1, sljit_sw src1w,
-	sljit_s32 src2, sljit_sw src2w)
+	sljit_s32 dst_reg,
+	sljit_s32 src1_reg,
+	sljit_s32 src2_reg,
+	sljit_s32 src3, sljit_sw src3w)
 {
-	sljit_s32 restore_ecx = 0;
-	sljit_s32 is_rotate, is_left;
+	sljit_s32 is_rotate, is_left, move_src1;
 	sljit_u8* inst;
+	sljit_sw src1w = 0;
 	sljit_sw dstw = 0;
+	/* The whole register must be saved even for 32 bit operations. */
+	sljit_u8 restore_ecx = 0;
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-	sljit_s32 tmp2 = SLJIT_MEM1(SLJIT_SP);
-#else /* !SLJIT_CONFIG_X86_32 */
-	sljit_s32 tmp2 = TMP_REG2;
+	sljit_sw src2w = 0;
+	sljit_s32 restore_sp4 = 0;
 #endif /* SLJIT_CONFIG_X86_32 */
 
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_shift_into(compiler, op, src_dst, src1, src1w, src2, src2w));
-	ADJUST_LOCAL_OFFSET(src1, src1w);
-	ADJUST_LOCAL_OFFSET(src2, src2w);
+	CHECK(check_sljit_emit_shift_into(compiler, op, dst_reg, src1_reg, src2_reg, src3, src3w));
+	ADJUST_LOCAL_OFFSET(src3, src3w);
 
-	CHECK_EXTRA_REGS(src1, src1w, (void)0);
-	CHECK_EXTRA_REGS(src2, src2w, (void)0);
+	CHECK_EXTRA_REGS(dst_reg, dstw, (void)0);
+	CHECK_EXTRA_REGS(src3, src3w, (void)0);
 
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 	compiler->mode32 = op & SLJIT_32;
-#endif
+#endif /* SLJIT_CONFIG_X86_64 */
 
-	if (src2 & SLJIT_IMM) {
+	if (src3 == SLJIT_IMM) {
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-		src2w &= 0x1f;
+		src3w &= 0x1f;
 #else /* !SLJIT_CONFIG_X86_32 */
-		src2w &= (op & SLJIT_32) ? 0x1f : 0x3f;
+		src3w &= (op & SLJIT_32) ? 0x1f : 0x3f;
 #endif /* SLJIT_CONFIG_X86_32 */
 
-		if (src2w == 0)
+		if (src3w == 0)
 			return SLJIT_SUCCESS;
 	}
 
 	is_left = (GET_OPCODE(op) == SLJIT_SHL || GET_OPCODE(op) == SLJIT_MSHL);
 
-	is_rotate = (src_dst == src1);
-	CHECK_EXTRA_REGS(src_dst, dstw, (void)0);
+	is_rotate = (src1_reg == src2_reg);
+	CHECK_EXTRA_REGS(src1_reg, src1w, (void)0);
+	CHECK_EXTRA_REGS(src2_reg, src2w, (void)0);
 
 	if (is_rotate)
-		return emit_shift(compiler, is_left ? ROL : ROR, src_dst, dstw, src1, src1w, src2, src2w);
+		return emit_shift(compiler, is_left ? ROL : ROR, dst_reg, dstw, src1_reg, src1w, src3, src3w);
 
-	if ((src2 & SLJIT_IMM) || src2 == SLJIT_PREF_SHIFT_REG) {
-		if (!FAST_IS_REG(src1)) {
-			EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);
-			src1 = TMP_REG1;
-		}
-	} else if (FAST_IS_REG(src1)) {
-#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-		compiler->mode32 = 0;
-#endif
-		EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_PREF_SHIFT_REG, 0);
-#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-		compiler->mode32 = op & SLJIT_32;
-#endif
-		EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w);
-
-		if (src1 == SLJIT_PREF_SHIFT_REG)
-			src1 = TMP_REG1;
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+	if (src2_reg & SLJIT_MEM) {
+		EMIT_MOV(compiler, TMP_REG1, 0, src2_reg, src2w);
+		src2_reg = TMP_REG1;
+	}
+#endif /* SLJIT_CONFIG_X86_32 */
 
-		if (src_dst == SLJIT_PREF_SHIFT_REG)
-			src_dst = TMP_REG1;
+	if (dst_reg == SLJIT_PREF_SHIFT_REG && src3 != SLJIT_IMM && (src3 != SLJIT_PREF_SHIFT_REG || src1_reg != SLJIT_PREF_SHIFT_REG)) {
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+		EMIT_MOV(compiler, TMP_REG1, 0, src1_reg, src1w);
+		src1_reg = TMP_REG1;
+		src1w = 0;
+#else /* !SLJIT_CONFIG_X86_64 */
+		if (src2_reg != TMP_REG1) {
+			EMIT_MOV(compiler, TMP_REG1, 0, src1_reg, src1w);
+			src1_reg = TMP_REG1;
+			src1w = 0;
+		} else if ((src1_reg & SLJIT_MEM) || src1_reg == SLJIT_PREF_SHIFT_REG) {
+			restore_sp4 = (src3 == SLJIT_R0) ? SLJIT_R1 : SLJIT_R0;
+			EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_s32), restore_sp4, 0);
+			EMIT_MOV(compiler, restore_sp4, 0, src1_reg, src1w);
+			src1_reg = restore_sp4;
+			src1w = 0;
+		} else {
+			EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_s32), src1_reg, 0);
+			restore_sp4 = src1_reg;
+		}
+#endif /* SLJIT_CONFIG_X86_64 */
 
-		restore_ecx = 1;
+		if (src3 != SLJIT_PREF_SHIFT_REG)
+			EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src3, src3w);
 	} else {
-		EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);
+		if (src2_reg == SLJIT_PREF_SHIFT_REG && src3 != SLJIT_IMM && src3 != SLJIT_PREF_SHIFT_REG) {
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-		compiler->mode32 = 0;
-#endif
-		EMIT_MOV(compiler, tmp2, 0, SLJIT_PREF_SHIFT_REG, 0);
+			compiler->mode32 = 0;
+#endif /* SLJIT_CONFIG_X86_64 */
+			EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_PREF_SHIFT_REG, 0);
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-		compiler->mode32 = op & SLJIT_32;
-#endif
-		EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w);
+			compiler->mode32 = op & SLJIT_32;
+#endif /* SLJIT_CONFIG_X86_64 */
+			src2_reg = TMP_REG1;
+			restore_ecx = 1;
+		}
 
-		src1 = TMP_REG1;
+		move_src1 = 0;
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+		if (dst_reg != src1_reg) {
+			if (dst_reg != src3) {
+				EMIT_MOV(compiler, dst_reg, 0, src1_reg, src1w);
+				src1_reg = dst_reg;
+				src1w = 0;
+			} else
+				move_src1 = 1;
+		}
+#else /* !SLJIT_CONFIG_X86_64 */
+		if (dst_reg & SLJIT_MEM) {
+			if (src2_reg != TMP_REG1) {
+				EMIT_MOV(compiler, TMP_REG1, 0, src1_reg, src1w);
+				src1_reg = TMP_REG1;
+				src1w = 0;
+			} else if ((src1_reg & SLJIT_MEM) || src1_reg == SLJIT_PREF_SHIFT_REG) {
+				restore_sp4 = (src3 == SLJIT_R0) ? SLJIT_R1 : SLJIT_R0;
+				EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_s32), restore_sp4, 0);
+				EMIT_MOV(compiler, restore_sp4, 0, src1_reg, src1w);
+				src1_reg = restore_sp4;
+				src1w = 0;
+			} else {
+				EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_s32), src1_reg, 0);
+				restore_sp4 = src1_reg;
+			}
+		} else if (dst_reg != src1_reg) {
+			if (dst_reg != src3) {
+				EMIT_MOV(compiler, dst_reg, 0, src1_reg, src1w);
+				src1_reg = dst_reg;
+				src1w = 0;
+			} else
+				move_src1 = 1;
+		}
+#endif /* SLJIT_CONFIG_X86_64 */
 
-		if (src_dst == SLJIT_PREF_SHIFT_REG) {
-			src_dst = tmp2;
-			SLJIT_ASSERT(dstw == 0);
+		if (src3 != SLJIT_IMM && src3 != SLJIT_PREF_SHIFT_REG) {
+			if (!restore_ecx) {
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+				compiler->mode32 = 0;
+				EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_PREF_SHIFT_REG, 0);
+				compiler->mode32 = op & SLJIT_32;
+				restore_ecx = 1;
+#else /* !SLJIT_CONFIG_X86_64 */
+				if (src1_reg != TMP_REG1 && src2_reg != TMP_REG1) {
+					EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_PREF_SHIFT_REG, 0);
+					restore_ecx = 1;
+				} else {
+					EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_PREF_SHIFT_REG, 0);
+					restore_ecx = 2;
+				}
+#endif /* SLJIT_CONFIG_X86_64 */
+			}
+			EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src3, src3w);
 		}
 
-		restore_ecx = 2;
+		if (move_src1) {
+			EMIT_MOV(compiler, dst_reg, 0, src1_reg, src1w);
+			src1_reg = dst_reg;
+			src1w = 0;
+		}
 	}
 
-	inst = emit_x86_instruction(compiler, 2, src1, 0, src_dst, dstw);
+	inst = emit_x86_instruction(compiler, 2, src2_reg, 0, src1_reg, src1w);
 	FAIL_IF(!inst);
 	inst[0] = GROUP_0F;
 
-	if (src2 & SLJIT_IMM) {
+	if (src3 == SLJIT_IMM) {
 		inst[1] = U8((is_left ? SHLD : SHRD) - 1);
 
-		/* Immedate argument is added separately. */
-		inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
-		FAIL_IF(!inst);
-		INC_SIZE(1);
-		*inst = U8(src2w);
+		/* Immediate argument is added separately. */
+		FAIL_IF(emit_byte(compiler, U8(src3w)));
 	} else
 		inst[1] = U8(is_left ? SHLD : SHRD);
 
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-	compiler->mode32 = 0;
-#endif
+	if (restore_ecx) {
+		compiler->mode32 = 0;
+		EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0);
+	}
 
-	if (restore_ecx == 1)
-		return emit_mov(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0);
-	if (restore_ecx == 2)
-		return emit_mov(compiler, SLJIT_PREF_SHIFT_REG, 0, tmp2, 0);
+	if (src1_reg != dst_reg) {
+		compiler->mode32 = op & SLJIT_32;
+		return emit_mov(compiler, dst_reg, dstw, src1_reg, 0);
+	}
+#else /* !SLJIT_CONFIG_X86_64 */
+	if (restore_ecx)
+		EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, restore_ecx == 1 ? TMP_REG1 : SLJIT_MEM1(SLJIT_SP), 0);
+
+	if (src1_reg != dst_reg)
+		EMIT_MOV(compiler, dst_reg, dstw, src1_reg, 0);
+
+	if (restore_sp4)
+		return emit_mov(compiler, restore_sp4, 0, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_s32));
+#endif /* SLJIT_CONFIG_X86_32 */
 
 	return SLJIT_SUCCESS;
 }
@@ -2656,24 +2807,41 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst, sljit_sw dstw)
 {
-	CHECK_REG_INDEX(check_sljit_get_register_index(reg));
-#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-	if (reg >= SLJIT_R3 && reg <= SLJIT_R8)
-		return -1;
-#endif
-	return reg_map[reg];
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_op_dst(compiler, op, dst, dstw));
+	ADJUST_LOCAL_OFFSET(dst, dstw);
+
+	CHECK_EXTRA_REGS(dst, dstw, (void)0);
+
+	switch (op) {
+	case SLJIT_FAST_ENTER:
+		return emit_fast_enter(compiler, dst, dstw);
+	case SLJIT_GET_RETURN_ADDRESS:
+		return sljit_emit_get_return_address(compiler, dst, dstw);
+	}
+
+	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg)
 {
-	CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
+	CHECK_REG_INDEX(check_sljit_get_register_index(type, reg));
+
+	if (type == SLJIT_GP_REGISTER) {
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-	return reg;
-#else
+		if (reg >= SLJIT_R3 && reg <= SLJIT_R8)
+			return -1;
+#endif /* SLJIT_CONFIG_X86_32 */
+		return reg_map[reg];
+	}
+
+	if (type != SLJIT_FLOAT_REGISTER && type != SLJIT_SIMD_REG_128 && type != SLJIT_SIMD_REG_256 && type != SLJIT_SIMD_REG_512)
+		return -1;
+
 	return freg_map[reg];
-#endif
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
@@ -2701,6 +2869,8 @@ static sljit_u32 *sse2_buffer;
 
 static void init_compiler(void)
 {
+	get_cpu_features();
+
 	/* Align to 16 bytes. */
 	sse2_buffer = (sljit_u32*)(((sljit_uw)sse2_data + 15) & ~(sljit_uw)0xf);
 
@@ -2714,58 +2884,60 @@ static void init_compiler(void)
 	sse2_buffer[13] = 0x7fffffff;
 }
 
-static sljit_s32 emit_sse2(struct sljit_compiler *compiler, sljit_u8 opcode,
-	sljit_s32 single, sljit_s32 xmm1, sljit_s32 xmm2, sljit_sw xmm2w)
+static sljit_s32 emit_groupf(struct sljit_compiler *compiler,
+	sljit_uw op,
+	sljit_s32 dst, sljit_s32 src, sljit_sw srcw)
 {
-	sljit_u8 *inst;
-
-	inst = emit_x86_instruction(compiler, 2 | (single ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2, xmm1, 0, xmm2, xmm2w);
+	sljit_u8 *inst = emit_x86_instruction(compiler, 2 | (op & ~(sljit_uw)0xff), dst, 0, src, srcw);
 	FAIL_IF(!inst);
-	*inst++ = GROUP_0F;
-	*inst = opcode;
+	inst[0] = GROUP_0F;
+	inst[1] = op & 0xff;
 	return SLJIT_SUCCESS;
 }
 
-static sljit_s32 emit_sse2_logic(struct sljit_compiler *compiler, sljit_u8 opcode,
-	sljit_s32 pref66, sljit_s32 xmm1, sljit_s32 xmm2, sljit_sw xmm2w)
+static sljit_s32 emit_groupf_ext(struct sljit_compiler *compiler,
+	sljit_uw op,
+	sljit_s32 dst, sljit_s32 src, sljit_sw srcw)
 {
 	sljit_u8 *inst;
 
-	inst = emit_x86_instruction(compiler, 2 | (pref66 ? EX86_PREF_66 : 0) | EX86_SSE2, xmm1, 0, xmm2, xmm2w);
+	SLJIT_ASSERT((op & EX86_SSE2) && ((op & VEX_OP_0F38) || (op & VEX_OP_0F3A)));
+
+	inst = emit_x86_instruction(compiler, 3 | (op & ~((sljit_uw)0xff | VEX_OP_0F38 | VEX_OP_0F3A)), dst, 0, src, srcw);
 	FAIL_IF(!inst);
-	*inst++ = GROUP_0F;
-	*inst = opcode;
+	inst[0] = GROUP_0F;
+	inst[1] = U8((op & VEX_OP_0F38) ? 0x38 : 0x3A);
+	inst[2] = op & 0xff;
 	return SLJIT_SUCCESS;
 }
 
 static SLJIT_INLINE sljit_s32 emit_sse2_load(struct sljit_compiler *compiler,
 	sljit_s32 single, sljit_s32 dst, sljit_s32 src, sljit_sw srcw)
 {
-	return emit_sse2(compiler, MOVSD_x_xm, single, dst, src, srcw);
+	return emit_groupf(compiler, MOVSD_x_xm | (single ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2, dst, src, srcw);
 }
 
 static SLJIT_INLINE sljit_s32 emit_sse2_store(struct sljit_compiler *compiler,
 	sljit_s32 single, sljit_s32 dst, sljit_sw dstw, sljit_s32 src)
 {
-	return emit_sse2(compiler, MOVSD_xm_x, single, src, dst, dstw);
+	return emit_groupf(compiler, MOVSD_xm_x | (single ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2, src, dst, dstw);
 }
 
 static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,
 	sljit_s32 dst, sljit_sw dstw,
 	sljit_s32 src, sljit_sw srcw)
 {
-	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
-	sljit_u8 *inst;
+	sljit_s32 dst_r;
+
+	CHECK_EXTRA_REGS(dst, dstw, (void)0);
+	dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
 
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 	if (GET_OPCODE(op) == SLJIT_CONV_SW_FROM_F64)
 		compiler->mode32 = 0;
 #endif
 
-	inst = emit_x86_instruction(compiler, 2 | ((op & SLJIT_32) ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2_OP2, dst_r, 0, src, srcw);
-	FAIL_IF(!inst);
-	*inst++ = GROUP_0F;
-	*inst = CVTTSD2SI_r_xm;
+	FAIL_IF(emit_groupf(compiler, CVTTSD2SI_r_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2_OP2, dst_r, src, srcw));
 
 	if (dst & SLJIT_MEM)
 		return emit_mov(compiler, dst, dstw, TMP_REG1, 0);
@@ -2777,14 +2949,15 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 	sljit_s32 src, sljit_sw srcw)
 {
 	sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG;
-	sljit_u8 *inst;
+
+	CHECK_EXTRA_REGS(src, srcw, (void)0);
 
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 	if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_SW)
 		compiler->mode32 = 0;
 #endif
 
-	if (src & SLJIT_IMM) {
+	if (src == SLJIT_IMM) {
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 		if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)
 			srcw = (sljit_s32)srcw;
@@ -2794,10 +2967,7 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 		srcw = 0;
 	}
 
-	inst = emit_x86_instruction(compiler, 2 | ((op & SLJIT_32) ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2_OP1, dst_r, 0, src, srcw);
-	FAIL_IF(!inst);
-	*inst++ = GROUP_0F;
-	*inst = CVTSI2SD_x_rm;
+	FAIL_IF(emit_groupf(compiler, CVTSI2SD_x_rm | EX86_SELECT_F2_F3(op) | EX86_SSE2_OP1, dst_r, src, srcw));
 
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 	compiler->mode32 = 1;
@@ -2812,16 +2982,28 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 	sljit_s32 src2, sljit_sw src2w)
 {
 	switch (GET_FLAG_TYPE(op)) {
+	case SLJIT_ORDERED_EQUAL:
+		/* Also: SLJIT_UNORDERED_OR_NOT_EQUAL */
+		FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, TMP_FREG, src1, src1w));
+		FAIL_IF(emit_groupf(compiler, CMPS_x_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2, TMP_FREG, src2, src2w));
+
+		/* EQ */
+		FAIL_IF(emit_byte(compiler, 0));
+
+		src1 = TMP_FREG;
+		src2 = TMP_FREG;
+		src2w = 0;
+		break;
+
 	case SLJIT_ORDERED_LESS:
-	case SLJIT_UNORDERED_OR_GREATER_EQUAL:
 	case SLJIT_UNORDERED_OR_GREATER:
-	case SLJIT_ORDERED_LESS_EQUAL:
+		/* Also: SLJIT_UNORDERED_OR_GREATER_EQUAL, SLJIT_ORDERED_LESS_EQUAL  */
 		if (!FAST_IS_REG(src2)) {
 			FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, TMP_FREG, src2, src2w));
 			src2 = TMP_FREG;
 		}
 
-		return emit_sse2_logic(compiler, UCOMISD_x_xm, !(op & SLJIT_32), src2, src1, src1w);
+		return emit_groupf(compiler, UCOMISD_x_xm | EX86_SELECT_66(op) | EX86_SSE2, src2, src1, src1w);
 	}
 
 	if (!FAST_IS_REG(src1)) {
@@ -2829,7 +3011,7 @@ static SLJIT_INLINE sljit_s32 sljit_emit
 		src1 = TMP_FREG;
 	}
 
-	return emit_sse2_logic(compiler, UCOMISD_x_xm, !(op & SLJIT_32), src1, src2, src2w);
+	return emit_groupf(compiler, UCOMISD_x_xm | EX86_SELECT_66(op) | EX86_SSE2, src1, src2, src2w);
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
@@ -2837,6 +3019,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	sljit_s32 src, sljit_sw srcw)
 {
 	sljit_s32 dst_r;
+	sljit_u8 *inst;
 
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 	compiler->mode32 = 1;
@@ -2860,42 +3043,57 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 			/* We overwrite the high bits of source. From SLJIT point of view,
 			   this is not an issue.
 			   Note: In SSE3, we could also use MOVDDUP and MOVSLDUP. */
-			FAIL_IF(emit_sse2_logic(compiler, UNPCKLPD_x_xm, op & SLJIT_32, src, src, 0));
-		}
-		else {
+			FAIL_IF(emit_groupf(compiler, UNPCKLPD_x_xm | ((op & SLJIT_32) ? EX86_PREF_66 : 0) | EX86_SSE2, src, src, 0));
+		} else {
 			FAIL_IF(emit_sse2_load(compiler, !(op & SLJIT_32), TMP_FREG, src, srcw));
 			src = TMP_FREG;
 		}
 
-		FAIL_IF(emit_sse2_logic(compiler, CVTPD2PS_x_xm, op & SLJIT_32, dst_r, src, 0));
+		FAIL_IF(emit_groupf(compiler, CVTPD2PS_x_xm | ((op & SLJIT_32) ? EX86_PREF_66 : 0) | EX86_SSE2, dst_r, src, 0));
 		if (dst_r == TMP_FREG)
 			return emit_sse2_store(compiler, op & SLJIT_32, dst, dstw, TMP_FREG);
 		return SLJIT_SUCCESS;
 	}
 
 	if (FAST_IS_REG(dst)) {
-		dst_r = dst;
-		if (dst != src)
-			FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, dst_r, src, srcw));
-	}
-	else {
-		dst_r = TMP_FREG;
-		FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, dst_r, src, srcw));
+		dst_r = (dst == src) ? TMP_FREG : dst;
+
+		if (src & SLJIT_MEM)
+			FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, TMP_FREG, src, srcw));
+
+		FAIL_IF(emit_groupf(compiler, PCMPEQD_x_xm | EX86_PREF_66 | EX86_SSE2, dst_r, dst_r, 0));
+
+		inst = emit_x86_instruction(compiler, 2 | EX86_PREF_66 | EX86_SSE2_OP2, 0, 0, dst_r, 0);
+		inst[0] = GROUP_0F;
+		/* Same as PSRLD_x / PSRLQ_x */
+		inst[1] = (op & SLJIT_32) ? PSLLD_x_i8 : PSLLQ_x_i8;
+
+		if (GET_OPCODE(op) == SLJIT_ABS_F64) {
+			inst[2] |= 2 << 3;
+			FAIL_IF(emit_byte(compiler, 1));
+		} else {
+			inst[2] |= 6 << 3;
+			FAIL_IF(emit_byte(compiler, ((op & SLJIT_32) ? 31 : 63)));
+		}
+
+		if (dst_r != TMP_FREG)
+			dst_r = (src & SLJIT_MEM) ? TMP_FREG : src;
+		return emit_groupf(compiler, (GET_OPCODE(op) == SLJIT_NEG_F64 ? XORPD_x_xm : ANDPD_x_xm) | EX86_SSE2, dst, dst_r, 0);
 	}
 
+	FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, TMP_FREG, src, srcw));
+
 	switch (GET_OPCODE(op)) {
 	case SLJIT_NEG_F64:
-		FAIL_IF(emit_sse2_logic(compiler, XORPD_x_xm, 1, dst_r, SLJIT_MEM0(), (sljit_sw)(op & SLJIT_32 ? sse2_buffer : sse2_buffer + 8)));
+		FAIL_IF(emit_groupf(compiler, XORPD_x_xm | EX86_SELECT_66(op) | EX86_SSE2, TMP_FREG, SLJIT_MEM0(), (sljit_sw)((op & SLJIT_32) ? sse2_buffer : sse2_buffer + 8)));
 		break;
 
 	case SLJIT_ABS_F64:
-		FAIL_IF(emit_sse2_logic(compiler, ANDPD_x_xm, 1, dst_r, SLJIT_MEM0(), (sljit_sw)(op & SLJIT_32 ? sse2_buffer + 4 : sse2_buffer + 12)));
+		FAIL_IF(emit_groupf(compiler, ANDPD_x_xm | EX86_SELECT_66(op) | EX86_SSE2, TMP_FREG, SLJIT_MEM0(), (sljit_sw)((op & SLJIT_32) ? sse2_buffer + 4 : sse2_buffer + 12)));
 		break;
 	}
 
-	if (dst_r == TMP_FREG)
-		return emit_sse2_store(compiler, op & SLJIT_32, dst, dstw, TMP_FREG);
-	return SLJIT_SUCCESS;
+	return emit_sse2_store(compiler, op & SLJIT_32, dst, dstw, TMP_FREG);
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,
@@ -2938,19 +3136,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 
 	switch (GET_OPCODE(op)) {
 	case SLJIT_ADD_F64:
-		FAIL_IF(emit_sse2(compiler, ADDSD_x_xm, op & SLJIT_32, dst_r, src2, src2w));
+		FAIL_IF(emit_groupf(compiler, ADDSD_x_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2, dst_r, src2, src2w));
 		break;
 
 	case SLJIT_SUB_F64:
-		FAIL_IF(emit_sse2(compiler, SUBSD_x_xm, op & SLJIT_32, dst_r, src2, src2w));
+		FAIL_IF(emit_groupf(compiler, SUBSD_x_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2, dst_r, src2, src2w));
 		break;
 
 	case SLJIT_MUL_F64:
-		FAIL_IF(emit_sse2(compiler, MULSD_x_xm, op & SLJIT_32, dst_r, src2, src2w));
+		FAIL_IF(emit_groupf(compiler, MULSD_x_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2, dst_r, src2, src2w));
 		break;
 
 	case SLJIT_DIV_F64:
-		FAIL_IF(emit_sse2(compiler, DIVSD_x_xm, op & SLJIT_32, dst_r, src2, src2w));
+		FAIL_IF(emit_groupf(compiler, DIVSD_x_xm | EX86_SELECT_F2_F3(op) | EX86_SSE2, dst_r, src2, src2w));
 		break;
 	}
 
@@ -2959,6 +3157,45 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	return SLJIT_SUCCESS;
 }
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2r(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 dst_freg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2, sljit_sw src2w)
+{
+	sljit_uw pref;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fop2r(compiler, op, dst_freg, src1, src1w, src2, src2w));
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+	ADJUST_LOCAL_OFFSET(src2, src2w);
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	compiler->mode32 = 1;
+#endif
+
+	if (dst_freg == src1) {
+		FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, TMP_FREG, src2, src2w));
+		pref = EX86_SELECT_66(op) | EX86_SSE2;
+		FAIL_IF(emit_groupf(compiler, XORPD_x_xm | pref, TMP_FREG, src1, src1w));
+		FAIL_IF(emit_groupf(compiler, ANDPD_x_xm | pref, TMP_FREG, SLJIT_MEM0(), (sljit_sw)((op & SLJIT_32) ? sse2_buffer : sse2_buffer + 8)));
+		return emit_groupf(compiler, XORPD_x_xm | pref, dst_freg, TMP_FREG, 0);
+	}
+
+	if (src1 & SLJIT_MEM) {
+		FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, TMP_FREG, src1, src1w));
+		src1 = TMP_FREG;
+		src1w = 0;
+	}
+
+	if (dst_freg != src2)
+		FAIL_IF(emit_sse2_load(compiler, op & SLJIT_32, dst_freg, src2, src2w));
+
+	pref = EX86_SELECT_66(op) | EX86_SSE2;
+	FAIL_IF(emit_groupf(compiler, XORPD_x_xm | pref, dst_freg, src1, src1w));
+	FAIL_IF(emit_groupf(compiler, ANDPD_x_xm | pref, dst_freg, SLJIT_MEM0(), (sljit_sw)((op & SLJIT_32) ? sse2_buffer : sse2_buffer + 8)));
+	return emit_groupf(compiler, XORPD_x_xm | pref, dst_freg, src1, src1w);
+}
+
 /* --------------------------------------------------------------------- */
 /*  Conditional instructions                                             */
 /* --------------------------------------------------------------------- */
@@ -2980,9 +3217,8 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_la
 
 	inst = (sljit_u8*)ensure_buf(compiler, 2);
 	PTR_FAIL_IF(!inst);
-
-	*inst++ = 0;
-	*inst++ = 0;
+	inst[0] = 0;
+	inst[1] = 0;
 
 	return label;
 }
@@ -3010,8 +3246,8 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
 	inst = (sljit_u8*)ensure_buf(compiler, 2);
 	PTR_FAIL_IF_NULL(inst);
 
-	*inst++ = 0;
-	*inst++ = 1;
+	inst[0] = 0;
+	inst[1] = 1;
 	return jump;
 }
 
@@ -3042,8 +3278,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		inst = (sljit_u8*)ensure_buf(compiler, 2);
 		FAIL_IF_NULL(inst);
 
-		*inst++ = 0;
-		*inst++ = 1;
+		inst[0] = 0;
+		inst[1] = 1;
 	}
 	else {
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
@@ -3052,8 +3288,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 #endif
 		inst = emit_x86_instruction(compiler, 1, 0, 0, src, srcw);
 		FAIL_IF(!inst);
-		*inst++ = GROUP_FF;
-		*inst = U8(*inst | ((type >= SLJIT_FAST_CALL) ? CALL_rm : JMP_rm));
+		inst[0] = GROUP_FF;
+		inst[1] = U8(inst[1] | ((type >= SLJIT_FAST_CALL) ? CALL_rm : JMP_rm));
 	}
 	return SLJIT_SUCCESS;
 }
@@ -3063,10 +3299,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	sljit_s32 type)
 {
 	sljit_u8 *inst;
-	sljit_u8 cond_set = 0;
+	sljit_u8 cond_set;
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 	sljit_s32 reg;
-#endif
+#endif /* !SLJIT_CONFIG_X86_64 */
 	/* ADJUST_LOCAL_OFFSET and CHECK_EXTRA_REGS might overwrite these values. */
 	sljit_s32 dst_save = dst;
 	sljit_sw dstw_save = dstw;
@@ -3086,13 +3322,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 		FAIL_IF(!inst);
 		INC_SIZE(4 + 3);
 		/* Set low register to conditional flag. */
-		*inst++ = (reg_map[TMP_REG1] <= 7) ? REX : REX_B;
-		*inst++ = GROUP_0F;
-		*inst++ = cond_set;
-		*inst++ = MOD_REG | reg_lmap[TMP_REG1];
-		*inst++ = U8(REX | (reg_map[TMP_REG1] <= 7 ? 0 : REX_R) | (reg_map[dst] <= 7 ? 0 : REX_B));
-		*inst++ = OR_rm8_r8;
-		*inst++ = U8(MOD_REG | (reg_lmap[TMP_REG1] << 3) | reg_lmap[dst]);
+		inst[0] = (reg_map[TMP_REG1] <= 7) ? REX : REX_B;
+		inst[1] = GROUP_0F;
+		inst[2] = cond_set;
+		inst[3] = MOD_REG | reg_lmap[TMP_REG1];
+		inst[4] = U8(REX | (reg_map[TMP_REG1] <= 7 ? 0 : REX_R) | (reg_map[dst] <= 7 ? 0 : REX_B));
+		inst[5] = OR_rm8_r8;
+		inst[6] = U8(MOD_REG | (reg_lmap[TMP_REG1] << 3) | reg_lmap[dst]);
 		return SLJIT_SUCCESS;
 	}
 
@@ -3102,15 +3338,15 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	FAIL_IF(!inst);
 	INC_SIZE(4 + 4);
 	/* Set low register to conditional flag. */
-	*inst++ = (reg_map[reg] <= 7) ? REX : REX_B;
-	*inst++ = GROUP_0F;
-	*inst++ = cond_set;
-	*inst++ = MOD_REG | reg_lmap[reg];
-	*inst++ = REX_W | (reg_map[reg] <= 7 ? 0 : (REX_B | REX_R));
+	inst[0] = (reg_map[reg] <= 7) ? REX : REX_B;
+	inst[1] = GROUP_0F;
+	inst[2] = cond_set;
+	inst[3] = MOD_REG | reg_lmap[reg];
+	inst[4] = REX_W | (reg_map[reg] <= 7 ? 0 : (REX_B | REX_R));
 	/* The movzx instruction does not affect flags. */
-	*inst++ = GROUP_0F;
-	*inst++ = MOVZX_r_rm8;
-	*inst = U8(MOD_REG | (reg_lmap[reg] << 3) | reg_lmap[reg]);
+	inst[5] = GROUP_0F;
+	inst[6] = MOVZX_r_rm8;
+	inst[7] = U8(MOD_REG | (reg_lmap[reg] << 3) | reg_lmap[reg]);
 
 	if (reg != TMP_REG1)
 		return SLJIT_SUCCESS;
@@ -3123,156 +3359,1311 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 	SLJIT_SKIP_CHECKS(compiler);
 	return sljit_emit_op2(compiler, op, dst_save, dstw_save, dst_save, dstw_save, TMP_REG1, 0);
 
-#else
+#else /* !SLJIT_CONFIG_X86_64 */
+	SLJIT_ASSERT(reg_map[TMP_REG1] < 4);
+
 	/* The SLJIT_CONFIG_X86_32 code path starts here. */
-	if (GET_OPCODE(op) < SLJIT_ADD && FAST_IS_REG(dst)) {
-		if (reg_map[dst] <= 4) {
-			/* Low byte is accessible. */
-			inst = (sljit_u8*)ensure_buf(compiler, 1 + 3 + 3);
-			FAIL_IF(!inst);
-			INC_SIZE(3 + 3);
-			/* Set low byte to conditional flag. */
-			*inst++ = GROUP_0F;
-			*inst++ = cond_set;
-			*inst++ = U8(MOD_REG | reg_map[dst]);
-
-			*inst++ = GROUP_0F;
-			*inst++ = MOVZX_r_rm8;
-			*inst = U8(MOD_REG | (reg_map[dst] << 3) | reg_map[dst]);
+	if (GET_OPCODE(op) < SLJIT_ADD && FAST_IS_REG(dst) && reg_map[dst] <= 4) {
+		/* Low byte is accessible. */
+		inst = (sljit_u8*)ensure_buf(compiler, 1 + 3 + 3);
+		FAIL_IF(!inst);
+		INC_SIZE(3 + 3);
+		/* Set low byte to conditional flag. */
+		inst[0] = GROUP_0F;
+		inst[1] = cond_set;
+		inst[2] = U8(MOD_REG | reg_map[dst]);
+
+		inst[3] = GROUP_0F;
+		inst[4] = MOVZX_r_rm8;
+		inst[5] = U8(MOD_REG | (reg_map[dst] << 3) | reg_map[dst]);
+		return SLJIT_SUCCESS;
+	}
+
+	if (GET_OPCODE(op) == SLJIT_OR && !GET_ALL_FLAGS(op) && FAST_IS_REG(dst) && reg_map[dst] <= 4) {
+		inst = (sljit_u8*)ensure_buf(compiler, 1 + 3 + 2);
+		FAIL_IF(!inst);
+		INC_SIZE(3 + 2);
+
+		/* Set low byte to conditional flag. */
+		inst[0] = GROUP_0F;
+		inst[1] = cond_set;
+		inst[2] = U8(MOD_REG | reg_map[TMP_REG1]);
+
+		inst[3] = OR_rm8_r8;
+		inst[4] = U8(MOD_REG | (reg_map[TMP_REG1] << 3) | reg_map[dst]);
+		return SLJIT_SUCCESS;
+	}
+
+	inst = (sljit_u8*)ensure_buf(compiler, 1 + 3 + 3);
+	FAIL_IF(!inst);
+	INC_SIZE(3 + 3);
+	/* Set low byte to conditional flag. */
+	inst[0] = GROUP_0F;
+	inst[1] = cond_set;
+	inst[2] = U8(MOD_REG | reg_map[TMP_REG1]);
+
+	inst[3] = GROUP_0F;
+	inst[4] = MOVZX_r_rm8;
+	inst[5] = U8(MOD_REG | (reg_map[TMP_REG1] << 3) | reg_map[TMP_REG1]);
+
+	if (GET_OPCODE(op) < SLJIT_ADD)
+		return emit_mov(compiler, dst, dstw, TMP_REG1, 0);
+
+	SLJIT_SKIP_CHECKS(compiler);
+	return sljit_emit_op2(compiler, op, dst_save, dstw_save, dst_save, dstw_save, TMP_REG1, 0);
+#endif /* SLJIT_CONFIG_X86_64 */
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_reg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_reg)
+{
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+	sljit_s32 dst = dst_reg;
+	sljit_sw dstw = 0;
+#endif /* SLJIT_CONFIG_X86_32 */
+	sljit_sw src2w = 0;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_select(compiler, type, dst_reg, src1, src1w, src2_reg));
+
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+
+	CHECK_EXTRA_REGS(dst, dstw, (void)0);
+	CHECK_EXTRA_REGS(src1, src1w, (void)0);
+	CHECK_EXTRA_REGS(src2_reg, src2w, (void)0);
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	compiler->mode32 = type & SLJIT_32;
+#endif /* SLJIT_CONFIG_X86_64 */
+	type &= ~SLJIT_32;
+
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+	if (dst & SLJIT_MEM) {
+		if (src1 == SLJIT_IMM || (!(src1 & SLJIT_MEM) && (src2_reg & SLJIT_MEM))) {
+			EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);
+			src1 = src2_reg;
+			src1w = src2w;
+			type ^= 0x1;
+		} else
+			EMIT_MOV(compiler, TMP_REG1, 0, src2_reg, src2w);
+
+		dst_reg = TMP_REG1;
+	} else {
+#endif /* SLJIT_CONFIG_X86_32 */
+		if (dst_reg != src2_reg) {
+			if (dst_reg == src1) {
+				src1 = src2_reg;
+				src1w = src2w;
+				type ^= 0x1;
+			} else {
+				if (ADDRESSING_DEPENDS_ON(src1, dst_reg)) {
+					EMIT_MOV(compiler, dst_reg, 0, src1, src1w);
+					src1 = src2_reg;
+					src1w = src2w;
+					type ^= 0x1;
+				} else
+					EMIT_MOV(compiler, dst_reg, 0, src2_reg, src2w);
+			}
+		}
+
+		if (SLJIT_UNLIKELY(src1 == SLJIT_IMM)) {
+			SLJIT_ASSERT(dst_reg != TMP_REG1);
+			EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);
+			src1 = TMP_REG1;
+			src1w = 0;
+		}
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+	}
+#endif /* SLJIT_CONFIG_X86_32 */
+
+	if (sljit_has_cpu_feature(SLJIT_HAS_CMOV))
+		FAIL_IF(emit_groupf(compiler, U8(get_jump_code((sljit_uw)type) - 0x40), dst_reg, src1, src1w));
+	else
+		FAIL_IF(emit_cmov_generic(compiler, type, dst_reg, src1, src1w));
+
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+	if (dst_reg == TMP_REG1)
+		return emit_mov(compiler, dst, dstw, TMP_REG1, 0);
+#endif /* SLJIT_CONFIG_X86_32 */
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg,
+	sljit_s32 src1, sljit_sw src1w,
+	sljit_s32 src2_freg)
+{
+	sljit_u8* inst;
+	sljit_uw size;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_fselect(compiler, type, dst_freg, src1, src1w, src2_freg));
+
+	ADJUST_LOCAL_OFFSET(src1, src1w);
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	compiler->mode32 = 1;
+#endif /* SLJIT_CONFIG_X86_64 */
+
+	if (dst_freg != src2_freg) {
+		if (dst_freg == src1) {
+			src1 = src2_freg;
+			src1w = 0;
+			type ^= 0x1;
+		} else
+			FAIL_IF(emit_sse2_load(compiler, type & SLJIT_32, dst_freg, src2_freg, 0));
+	}
+
+	inst = (sljit_u8*)ensure_buf(compiler, 1 + 2);
+	FAIL_IF(!inst);
+	INC_SIZE(2);
+	inst[0] = U8(get_jump_code((sljit_uw)(type & ~SLJIT_32) ^ 0x1) - 0x10);
+
+	size = compiler->size;
+	FAIL_IF(emit_sse2_load(compiler, type & SLJIT_32, dst_freg, src1, src1w));
+
+	inst[1] = U8(compiler->size - size);
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 srcdst, sljit_sw srcdstw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_s32 alignment = SLJIT_SIMD_GET_ELEM2_SIZE(type);
+	sljit_uw op;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_mov(compiler, type, freg, srcdst, srcdstw));
+
+	ADJUST_LOCAL_OFFSET(srcdst, srcdstw);
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	compiler->mode32 = 1;
+#endif /* SLJIT_CONFIG_X86_64 */
+
+	switch (reg_size) {
+	case 4:
+		op = EX86_SSE2;
+		break;
+	case 5:
+		if (!(cpu_feature_list & CPU_FEATURE_AVX2))
+			return SLJIT_ERR_UNSUPPORTED;
+		op = EX86_SSE2 | VEX_256;
+		break;
+	default:
+		return SLJIT_ERR_UNSUPPORTED;
+	}
+
+	if (!(srcdst & SLJIT_MEM))
+		alignment = reg_size;
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		if (elem_size == 2 || elem_size == 3) {
+			op |= alignment >= reg_size ? MOVAPS_x_xm : MOVUPS_x_xm;
+
+			if (elem_size == 3)
+				op |= EX86_PREF_66;
+
+			if (type & SLJIT_SIMD_STORE)
+				op += 1;
+		} else
+			return SLJIT_ERR_UNSUPPORTED;
+	} else {
+		op |= ((type & SLJIT_SIMD_STORE) ? MOVDQA_xm_x : MOVDQA_x_xm)
+			| (alignment >= reg_size ? EX86_PREF_66 : EX86_PREF_F3);
+	}
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (op & VEX_256)
+		return emit_vex_instruction(compiler, op, freg, 0, srcdst, srcdstw);
+
+	return emit_groupf(compiler, op, freg, srcdst, srcdstw);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_u8 *inst;
+	sljit_u8 opcode = 0;
+	sljit_uw size;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_replicate(compiler, type, freg, src, srcw));
+
+	ADJUST_LOCAL_OFFSET(src, srcw);
+
+	if (!(type & SLJIT_SIMD_FLOAT)) {
+		CHECK_EXTRA_REGS(src, srcw, (void)0);
+	}
+
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+	if ((type & SLJIT_SIMD_FLOAT) ? (elem_size < 2 || elem_size > 3) : (elem_size > 2))
+		return SLJIT_ERR_UNSUPPORTED;
+#else /* !SLJIT_CONFIG_X86_32 */
+	compiler->mode32 = 1;
+
+	if (elem_size > 3 || ((type & SLJIT_SIMD_FLOAT) && elem_size < 2))
+		return SLJIT_ERR_UNSUPPORTED;
+#endif /* SLJIT_CONFIG_X86_32 */
+
+	if (cpu_feature_list & CPU_FEATURE_AVX2) {
+		if (reg_size < 4 || reg_size > 5)
+			return SLJIT_ERR_UNSUPPORTED;
+
+		if (src != SLJIT_IMM && (reg_size == 5 || elem_size < 3 || !(type & SLJIT_SIMD_FLOAT))) {
+			if (type & SLJIT_SIMD_TEST)
+				return SLJIT_SUCCESS;
+
+			if (!(src & SLJIT_MEM) && !(type & SLJIT_SIMD_FLOAT)) {
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+				if (elem_size >= 3)
+					compiler->mode32 = 0;
+#endif /* SLJIT_CONFIG_X86_64 */
+				FAIL_IF(emit_groupf(compiler, MOVD_x_rm | EX86_PREF_66 | EX86_SSE2_OP1, freg, src, srcw));
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+				compiler->mode32 = 1;
+#endif /* SLJIT_CONFIG_X86_64 */
+				src = freg;
+				srcw = 0;
+			}
+
+			switch (elem_size) {
+			case 0:
+				size = VPBROADCASTB_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2;
+				break;
+			case 1:
+				size = VPBROADCASTW_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2;
+				break;
+			case 2:
+				size = ((type & SLJIT_SIMD_FLOAT) ? VBROADCASTSS_x_xm : VPBROADCASTD_x_xm) | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2;
+				break;
+			default:
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+				size = VBROADCASTSD_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2;
+#else /* !SLJIT_CONFIG_X86_32 */
+				size = ((type & SLJIT_SIMD_FLOAT) ? VBROADCASTSD_x_xm : VPBROADCASTQ_x_xm) | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2;
+#endif /* SLJIT_CONFIG_X86_32 */
+				break;
+			}
+
+			if (reg_size == 5)
+				size |= VEX_256;
+
+			return emit_vex_instruction(compiler, size, freg, 0, src, srcw);
+		}
+	} else if (reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		if (src == SLJIT_IMM) {
+			if (reg_size == 5)
+				return emit_vex_instruction(compiler, XORPD_x_xm | VEX_256 | (elem_size == 3 ? EX86_PREF_66 : 0) | EX86_SSE2 | VEX_SSE2_OPV, freg, freg, freg, 0);
+
+			return emit_groupf(compiler, XORPD_x_xm | (elem_size == 3 ? EX86_PREF_66 : 0) | EX86_SSE2, freg, freg, 0);
+		}
+
+		if (elem_size == 2 && freg != src) {
+			FAIL_IF(emit_sse2_load(compiler, 1, freg, src, srcw));
+			src = freg;
+			srcw = 0;
+		}
+
+		FAIL_IF(emit_groupf(compiler, (elem_size == 2 ? SHUFPS_x_xm : MOVDDUP_x_xm) | (elem_size == 2 ? 0 : EX86_PREF_F2) | EX86_SSE2, freg, src, srcw));
+
+		if (elem_size == 2)
+			return emit_byte(compiler, 0);
+		return SLJIT_SUCCESS;
+	}
+
+	if (src == SLJIT_IMM) {
+		if (elem_size == 0) {
+			srcw = (sljit_u8)srcw;
+			srcw |= srcw << 8;
+			srcw |= srcw << 16;
+			elem_size = 2;
+		} else if (elem_size == 1) {
+			srcw = (sljit_u16)srcw;
+			srcw |= srcw << 16;
+			elem_size = 2;
+		}
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+		if (elem_size == 2 && (sljit_s32)srcw == -1)
+			srcw = -1;
+#endif /* SLJIT_CONFIG_X86_64 */
+
+		if (srcw == 0 || srcw == -1) {
+			if (reg_size == 5)
+				return emit_vex_instruction(compiler, (srcw == 0 ? PXOR_x_xm : PCMPEQD_x_xm) | VEX_256 | EX86_PREF_66 | EX86_SSE2 | VEX_SSE2_OPV, freg, freg, freg, 0);
+
+			return emit_groupf(compiler, (srcw == 0 ? PXOR_x_xm : PCMPEQD_x_xm) | EX86_PREF_66 | EX86_SSE2, freg, freg, 0);
+		}
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+		if (elem_size == 3)
+			FAIL_IF(emit_load_imm64(compiler, TMP_REG1, srcw));
+		else
+#endif /* SLJIT_CONFIG_X86_64 */
+			EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, srcw);
+
+		src = TMP_REG1;
+		srcw = 0;
+	}
+
+	size = 2;
+	opcode = MOVD_x_rm;
+
+	switch (elem_size) {
+	case 0:
+		if (!FAST_IS_REG(src)) {
+			opcode = 0x3a /* Prefix of PINSRB_x_rm_i8. */;
+			size = 3;
+		}
+		break;
+	case 1:
+		if (!FAST_IS_REG(src))
+			opcode = PINSRW_x_rm_i8;
+		break;
+	case 2:
+		break;
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	case 3:
+		/* MOVQ */
+		compiler->mode32 = 0;
+		break;
+#endif /* SLJIT_CONFIG_X86_64 */
+	}
+
+	inst = emit_x86_instruction(compiler, size | EX86_PREF_66 | EX86_SSE2_OP1, freg, 0, src, srcw);
+	FAIL_IF(!inst);
+	inst[0] = GROUP_0F;
+	inst[1] = opcode;
+
+	if (reg_size == 5) {
+		SLJIT_ASSERT(opcode == MOVD_x_rm);
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+		size = VPBROADCASTD_x_xm;
+#else /* !SLJIT_CONFIG_X86_32 */
+		size = (elem_size == 3) ? VPBROADCASTQ_x_xm : VPBROADCASTD_x_xm;
+#endif /* SLJIT_CONFIG_X86_32 */
+		return emit_vex_instruction(compiler, size | VEX_256 | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, 0, freg, 0);
+	}
+
+	if (size == 3) {
+		SLJIT_ASSERT(opcode == 0x3a);
+		inst[2] = PINSRB_x_rm_i8;
+	}
+
+	if (opcode != MOVD_x_rm)
+		FAIL_IF(emit_byte(compiler, 0));
+
+	switch (elem_size) {
+	case 0:
+		FAIL_IF(emit_groupf(compiler, PXOR_x_xm | EX86_PREF_66 | EX86_SSE2, TMP_FREG, TMP_FREG, 0));
+		return emit_groupf_ext(compiler, PSHUFB_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, TMP_FREG, 0);
+	case 1:
+		FAIL_IF(emit_groupf(compiler, PSHUFLW_x_xm | EX86_PREF_F2 | EX86_SSE2, freg, freg, 0));
+		FAIL_IF(emit_byte(compiler, 0));
+		/* fallthrough */
+	default:
+		FAIL_IF(emit_groupf(compiler, PSHUFD_x_xm | EX86_PREF_66 | EX86_SSE2, freg, freg, 0));
+		return emit_byte(compiler, 0);
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	case 3:
+		compiler->mode32 = 1;
+		FAIL_IF(emit_groupf(compiler, PSHUFD_x_xm | EX86_PREF_66 | EX86_SSE2, freg, freg, 0));
+		return emit_byte(compiler, 0x44);
+#endif /* SLJIT_CONFIG_X86_64 */
+	}
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg, sljit_s32 lane_index,
+	sljit_s32 srcdst, sljit_sw srcdstw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_u8 *inst;
+	sljit_u8 opcode = 0;
+	sljit_uw size;
+	sljit_s32 freg_orig = freg;
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+	sljit_s32 srcdst_is_ereg = 0;
+	sljit_s32 srcdst_orig = 0;
+	sljit_sw srcdstw_orig = 0;
+#endif /* SLJIT_CONFIG_X86_32 */
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_lane_mov(compiler, type, freg, lane_index, srcdst, srcdstw));
+
+	ADJUST_LOCAL_OFFSET(srcdst, srcdstw);
+
+	if (reg_size == 5) {
+		if (!(cpu_feature_list & CPU_FEATURE_AVX2))
+			return SLJIT_ERR_UNSUPPORTED;
+	} else if (reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+	if ((type & SLJIT_SIMD_FLOAT) ? (elem_size < 2 || elem_size > 3) : elem_size > 2)
+		return SLJIT_ERR_UNSUPPORTED;
+#else /* SLJIT_CONFIG_X86_32 */
+	if (elem_size > 3 || ((type & SLJIT_SIMD_FLOAT) && elem_size < 2))
+		return SLJIT_ERR_UNSUPPORTED;
+#endif /* SLJIT_CONFIG_X86_32 */
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	compiler->mode32 = 1;
+#else /* !SLJIT_CONFIG_X86_64 */
+	if (!(type & SLJIT_SIMD_FLOAT)) {
+		CHECK_EXTRA_REGS(srcdst, srcdstw, srcdst_is_ereg = 1);
+
+		if ((type & SLJIT_SIMD_STORE) && ((srcdst_is_ereg && elem_size < 2) || (elem_size == 0 && (type & SLJIT_SIMD_LANE_SIGNED) && FAST_IS_REG(srcdst) && reg_map[srcdst] >= 4))) {
+			srcdst_orig = srcdst;
+			srcdstw_orig = srcdstw;
+			srcdst = TMP_REG1;
+			srcdstw = 0;
+		}
+	}
+#endif /* SLJIT_CONFIG_X86_64 */
+
+	if (type & SLJIT_SIMD_LANE_ZERO) {
+		if (lane_index == 0) {
+			if (!(type & SLJIT_SIMD_FLOAT)) {
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+				if (elem_size == 3) {
+					compiler->mode32 = 0;
+					elem_size = 2;
+				}
+#endif /* SLJIT_CONFIG_X86_64 */
+				if (srcdst == SLJIT_IMM) {
+					if (elem_size == 0)
+						srcdstw = (sljit_u8)srcdstw;
+					else if (elem_size == 1)
+						srcdstw = (sljit_u16)srcdstw;
+
+					EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, srcdstw);
+					srcdst = TMP_REG1;
+					srcdstw = 0;
+					elem_size = 2;
+				}
+
+				if (elem_size == 2) {
+					if (reg_size == 4)
+						return emit_groupf(compiler, MOVD_x_rm | EX86_PREF_66 | EX86_SSE2_OP1, freg, srcdst, srcdstw);
+					return emit_vex_instruction(compiler, MOVD_x_rm | VEX_AUTO_W | EX86_PREF_66 | EX86_SSE2_OP1, freg, 0, srcdst, srcdstw);
+				}
+			} else if (srcdst & SLJIT_MEM) {
+				SLJIT_ASSERT(elem_size == 2 || elem_size == 3);
+
+				if (reg_size == 4)
+					return emit_groupf(compiler, MOVSD_x_xm | (elem_size == 2 ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2, freg, srcdst, srcdstw);
+				return emit_vex_instruction(compiler, MOVSD_x_xm | (elem_size == 2 ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2, freg, 0, srcdst, srcdstw);
+			} else if (elem_size == 3) {
+				if (reg_size == 4)
+					return emit_groupf(compiler, MOVQ_x_xm | EX86_PREF_F3 | EX86_SSE2, freg, srcdst, 0);
+				return emit_vex_instruction(compiler, MOVQ_x_xm | EX86_PREF_F3 | EX86_SSE2, freg, 0, srcdst, 0);
+			}
+		}
+
+		if (reg_size == 5 && lane_index >= (1 << (4 - elem_size))) {
+			freg = TMP_FREG;
+			lane_index -= (1 << (4 - elem_size));
+		} else if ((type & SLJIT_SIMD_FLOAT) && freg == srcdst) {
+			FAIL_IF(emit_sse2_load(compiler, elem_size == 2, TMP_FREG, srcdst, srcdstw));
+			srcdst = TMP_FREG;
+			srcdstw = 0;
+		}
+
+		size = ((!(type & SLJIT_SIMD_FLOAT) || elem_size != 2) ? EX86_PREF_66 : 0)
+			| ((type & SLJIT_SIMD_FLOAT) ? XORPD_x_xm : PXOR_x_xm) | EX86_SSE2;
+
+		if (reg_size == 5)
+			FAIL_IF(emit_vex_instruction(compiler,  size | VEX_256 | VEX_SSE2_OPV, freg, freg, freg, 0));
+		else
+			FAIL_IF(emit_groupf(compiler, size, freg, freg, 0));
+	} else if (reg_size == 5 && lane_index >= (1 << (4 - elem_size))) {
+		FAIL_IF(emit_vex_instruction(compiler, ((type & SLJIT_SIMD_FLOAT) ? VEXTRACTF128_x_ym : VEXTRACTI128_x_ym) | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2, freg, 0, TMP_FREG, 0));
+		FAIL_IF(emit_byte(compiler, 1));
+
+		freg = TMP_FREG;
+		lane_index -= (1 << (4 - elem_size));
+	}
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		if (elem_size == 3) {
+			if (srcdst & SLJIT_MEM) {
+				if (type & SLJIT_SIMD_STORE)
+					size = lane_index == 0 ? MOVLPD_m_x : MOVHPD_m_x;
+				else
+					size = lane_index == 0 ? MOVLPD_x_m : MOVHPD_x_m;
+
+				FAIL_IF(emit_groupf(compiler, size | EX86_PREF_66 | EX86_SSE2, freg, srcdst, srcdstw));
+
+				/* In case of store, freg is not TMP_FREG. */
+			} else if (type & SLJIT_SIMD_STORE) {
+				if (lane_index == 1)
+					return emit_groupf(compiler, MOVHLPS_x_x | EX86_SSE2, srcdst, freg, 0);
+				return emit_sse2_load(compiler, 0, srcdst, freg, 0);
+			} else {
+				if (lane_index == 1)
+					FAIL_IF(emit_groupf(compiler, MOVLHPS_x_x | EX86_SSE2, freg, srcdst, 0));
+				else
+					FAIL_IF(emit_sse2_store(compiler, 0, freg, 0, srcdst));
+			}
+		} else if (type & SLJIT_SIMD_STORE) {
+			if (lane_index == 0)
+				return emit_sse2_store(compiler, 1, srcdst, srcdstw, freg);
+
+			if (srcdst & SLJIT_MEM) {
+				FAIL_IF(emit_groupf_ext(compiler, EXTRACTPS_x_xm | EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2, freg, srcdst, srcdstw));
+				return emit_byte(compiler, U8(lane_index));
+			}
+
+			if (srcdst == freg)
+				size = SHUFPS_x_xm | EX86_SSE2;
+			else {
+				if (cpu_feature_list & CPU_FEATURE_AVX) {
+					FAIL_IF(emit_vex_instruction(compiler, SHUFPS_x_xm | EX86_SSE2 | VEX_SSE2_OPV, srcdst, freg, freg, 0));
+					return emit_byte(compiler, U8(lane_index));
+				}
+
+				switch (lane_index) {
+				case 1:
+					size = MOVSHDUP_x_xm | EX86_PREF_F3 | EX86_SSE2;
+					break;
+				case 2:
+					size = MOVHLPS_x_x | EX86_SSE2;
+					break;
+				default:
+					SLJIT_ASSERT(lane_index == 3);
+					size = PSHUFD_x_xm | EX86_PREF_66 | EX86_SSE2;
+					break;
+				}
+			}
+
+			FAIL_IF(emit_groupf(compiler, size, srcdst, freg, 0));
+
+			size &= 0xff;
+			if (size == SHUFPS_x_xm || size == PSHUFD_x_xm)
+				return emit_byte(compiler, U8(lane_index));
+
 			return SLJIT_SUCCESS;
+		} else {
+			if (lane_index != 0 || (srcdst & SLJIT_MEM)) {
+				FAIL_IF(emit_groupf_ext(compiler, INSERTPS_x_xm | EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2, freg, srcdst, srcdstw));
+				FAIL_IF(emit_byte(compiler, U8(lane_index << 4)));
+			} else
+				FAIL_IF(emit_sse2_store(compiler, 1, freg, 0, srcdst));
 		}
 
-		/* Low byte is not accessible. */
-		if (cpu_feature_list == 0)
-			get_cpu_features();
+		if (freg != TMP_FREG || (type & SLJIT_SIMD_STORE))
+			return SLJIT_SUCCESS;
+
+		SLJIT_ASSERT(reg_size == 5);
+
+		if (type & SLJIT_SIMD_LANE_ZERO) {
+			FAIL_IF(emit_vex_instruction(compiler, VPERMPD_y_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | VEX_W | EX86_SSE2, freg_orig, 0, TMP_FREG, 0));
+			return emit_byte(compiler, 0x4e);
+		}
+
+		FAIL_IF(emit_vex_instruction(compiler, VINSERTF128_y_y_xm | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2 | VEX_SSE2_OPV, freg_orig, freg_orig, TMP_FREG, 0));
+		return emit_byte(compiler, 1);
+	}
+
+	if (srcdst == SLJIT_IMM) {
+		EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, srcdstw);
+		srcdst = TMP_REG1;
+		srcdstw = 0;
+	}
+
+	size = 3;
+
+	switch (elem_size) {
+	case 0:
+		opcode = (type & SLJIT_SIMD_STORE) ? PEXTRB_rm_x_i8 : PINSRB_x_rm_i8;
+		break;
+	case 1:
+		if (!(type & SLJIT_SIMD_STORE)) {
+			size = 2;
+			opcode = PINSRW_x_rm_i8;
+		} else
+			opcode = PEXTRW_rm_x_i8;
+		break;
+	case 2:
+		opcode = (type & SLJIT_SIMD_STORE) ? PEXTRD_rm_x_i8 : PINSRD_x_rm_i8;
+		break;
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	case 3:
+		/* PINSRQ / PEXTRQ */
+		opcode = (type & SLJIT_SIMD_STORE) ? PEXTRD_rm_x_i8 : PINSRD_x_rm_i8;
+		compiler->mode32 = 0;
+		break;
+#endif /* SLJIT_CONFIG_X86_64 */
+	}
 
-		if (cpu_feature_list & CPU_FEATURE_CMOV) {
-			EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, 1);
-			/* a xor reg, reg operation would overwrite the flags. */
-			EMIT_MOV(compiler, dst, 0, SLJIT_IMM, 0);
-
-			inst = (sljit_u8*)ensure_buf(compiler, 1 + 3);
-			FAIL_IF(!inst);
-			INC_SIZE(3);
-
-			*inst++ = GROUP_0F;
-			/* cmovcc = setcc - 0x50. */
-			*inst++ = U8(cond_set - 0x50);
-			*inst++ = U8(MOD_REG | (reg_map[dst] << 3) | reg_map[TMP_REG1]);
+	inst = emit_x86_instruction(compiler, size | EX86_PREF_66 | EX86_SSE2_OP1, freg, 0, srcdst, srcdstw);
+	FAIL_IF(!inst);
+	inst[0] = GROUP_0F;
+
+	if (size == 3) {
+		inst[1] = 0x3a;
+		inst[2] = opcode;
+	} else
+		inst[1] = opcode;
+
+	FAIL_IF(emit_byte(compiler, U8(lane_index)));
+
+	if (!(type & SLJIT_SIMD_LANE_SIGNED) || (srcdst & SLJIT_MEM)) {
+		if (freg == TMP_FREG && !(type & SLJIT_SIMD_STORE)) {
+			SLJIT_ASSERT(reg_size == 5);
+
+			if (type & SLJIT_SIMD_LANE_ZERO) {
+				FAIL_IF(emit_vex_instruction(compiler, VPERMQ_y_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | VEX_W | EX86_SSE2, freg_orig, 0, TMP_FREG, 0));
+				return emit_byte(compiler, 0x4e);
+			}
+
+			FAIL_IF(emit_vex_instruction(compiler, VINSERTI128_y_y_xm | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2 | VEX_SSE2_OPV, freg_orig, freg_orig, TMP_FREG, 0));
+			return emit_byte(compiler, 1);
+		}
+
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+		if (srcdst_orig & SLJIT_MEM)
+			return emit_mov(compiler, srcdst_orig, srcdstw_orig, TMP_REG1, 0);
+#endif /* SLJIT_CONFIG_X86_32 */
+		return SLJIT_SUCCESS;
+	}
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	if (elem_size >= 3)
+		return SLJIT_SUCCESS;
+
+	compiler->mode32 = (type & SLJIT_32);
+
+	size = 2;
+
+	if (elem_size == 0)
+		size |= EX86_REX;
+
+	if (elem_size == 2) {
+		if (type & SLJIT_32)
+			return SLJIT_SUCCESS;
+
+		SLJIT_ASSERT(!(compiler->mode32));
+		size = 1;
+	}
+
+	inst = emit_x86_instruction(compiler, size, srcdst, 0, srcdst, 0);
+	FAIL_IF(!inst);
+
+	if (size != 1) {
+		inst[0] = GROUP_0F;
+		inst[1] = U8((elem_size == 0) ? MOVSX_r_rm8 : MOVSX_r_rm16);
+	} else
+		inst[0] = MOVSXD_r_rm;
+#else /* !SLJIT_CONFIG_X86_64 */
+	if (elem_size >= 2)
+		return SLJIT_SUCCESS;
+
+	FAIL_IF(emit_groupf(compiler, (elem_size == 0) ? MOVSX_r_rm8 : MOVSX_r_rm16,
+		(srcdst_orig != 0 && FAST_IS_REG(srcdst_orig)) ? srcdst_orig : srcdst, srcdst, 0));
+
+	if (srcdst_orig & SLJIT_MEM)
+		return emit_mov(compiler, srcdst_orig, srcdstw_orig, TMP_REG1, 0);
+#endif /* SLJIT_CONFIG_X86_64 */
+	return SLJIT_SUCCESS;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_s32 src_lane_index)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_uw pref;
+	sljit_u8 byte;
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+	sljit_s32 opcode3 = TMP_REG1;
+#else /* !SLJIT_CONFIG_X86_32 */
+	sljit_s32 opcode3 = SLJIT_S0;
+#endif /* SLJIT_CONFIG_X86_32 */
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_lane_replicate(compiler, type, freg, src, src_lane_index));
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	compiler->mode32 = 1;
+#endif /* SLJIT_CONFIG_X86_64 */
+	SLJIT_ASSERT(reg_map[opcode3] == 3);
+
+	if (reg_size == 5) {
+		if (!(cpu_feature_list & CPU_FEATURE_AVX2))
+			return SLJIT_ERR_UNSUPPORTED;
+	} else if (reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		pref = 0;
+		byte = U8(src_lane_index);
+
+		if (elem_size == 3) {
+			if (type & SLJIT_SIMD_TEST)
+				return SLJIT_SUCCESS;
+
+			if (reg_size == 5) {
+				if (src_lane_index == 0)
+					return emit_vex_instruction(compiler, VBROADCASTSD_x_xm | VEX_256 | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, 0, src, 0);
+
+				FAIL_IF(emit_vex_instruction(compiler, VPERMPD_y_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | VEX_W | EX86_SSE2, freg, 0, src, 0));
+
+				byte = U8(byte | (byte << 2));
+				return emit_byte(compiler, U8(byte | (byte << 4)));
+			}
+
+			if (src_lane_index == 0)
+				return emit_groupf(compiler, MOVDDUP_x_xm | EX86_PREF_F2 | EX86_SSE2, freg, src, 0);
+
+			/* Changes it to SHUFPD_x_xm. */
+			pref = EX86_PREF_66;
+		} else if (elem_size != 2)
+			return SLJIT_ERR_UNSUPPORTED;
+		else if (type & SLJIT_SIMD_TEST)
 			return SLJIT_SUCCESS;
+
+		if (reg_size == 5) {
+			SLJIT_ASSERT(elem_size == 2);
+
+			if (src_lane_index == 0)
+				return emit_vex_instruction(compiler, VBROADCASTSS_x_xm | VEX_256 | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, 0, src, 0);
+
+			FAIL_IF(emit_vex_instruction(compiler, VPERMPD_y_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | VEX_W | EX86_SSE2, freg, 0, src, 0));
+
+			byte = 0x44;
+			if (src_lane_index >= 4) {
+				byte = 0xee;
+				src_lane_index -= 4;
+			}
+
+			FAIL_IF(emit_byte(compiler, byte));
+			FAIL_IF(emit_vex_instruction(compiler, SHUFPS_x_xm | VEX_256 | pref | EX86_SSE2 | VEX_SSE2_OPV, freg, freg, freg, 0));
+			byte = U8(src_lane_index);
+		} else if (freg != src && (cpu_feature_list & CPU_FEATURE_AVX)) {
+			FAIL_IF(emit_vex_instruction(compiler, SHUFPS_x_xm | pref | EX86_SSE2 | VEX_SSE2_OPV, freg, src, src, 0));
+		} else {
+			if (freg != src)
+				FAIL_IF(emit_groupf(compiler, MOVAPS_x_xm | pref | EX86_SSE2, freg, src, 0));
+
+			FAIL_IF(emit_groupf(compiler, SHUFPS_x_xm | pref | EX86_SSE2, freg, freg, 0));
 		}
 
-		inst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 3 + 3 + 1);
-		FAIL_IF(!inst);
-		INC_SIZE(1 + 3 + 3 + 1);
-		*inst++ = U8(XCHG_EAX_r | reg_map[TMP_REG1]);
-		/* Set al to conditional flag. */
-		*inst++ = GROUP_0F;
-		*inst++ = cond_set;
-		*inst++ = MOD_REG | 0 /* eax */;
-
-		*inst++ = GROUP_0F;
-		*inst++ = MOVZX_r_rm8;
-		*inst++ = U8(MOD_REG | (reg_map[dst] << 3) | 0 /* eax */);
-		*inst++ = U8(XCHG_EAX_r | reg_map[TMP_REG1]);
+		if (elem_size == 2) {
+			byte = U8(byte | (byte << 2));
+			byte = U8(byte | (byte << 4));
+		} else
+			byte = U8(byte | (byte << 1));
+
+		return emit_byte(compiler, U8(byte));
+	}
+
+	if (type & SLJIT_SIMD_TEST)
 		return SLJIT_SUCCESS;
+
+	if (elem_size == 0) {
+		if (reg_size == 5 && src_lane_index >= 16) {
+			FAIL_IF(emit_vex_instruction(compiler, VPERMQ_y_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | VEX_W | EX86_SSE2, freg, 0, src, 0));
+			FAIL_IF(emit_byte(compiler, src_lane_index >= 24 ? 0xff : 0xaa));
+			src_lane_index &= 0x7;
+			src = freg;
+		}
+
+		if ((freg != src && !(cpu_feature_list & CPU_FEATURE_AVX2)) || src_lane_index != 0) {
+			pref = 0;
+
+			if ((src_lane_index & 0x3) == 0) {
+				pref = EX86_PREF_66;
+				byte = U8(src_lane_index >> 2);
+			} else if (src_lane_index < 8 && (src_lane_index & 0x1) == 0) {
+				pref = EX86_PREF_F2;
+				byte = U8(src_lane_index >> 1);
+			} else {
+				if (freg == src || !(cpu_feature_list & CPU_FEATURE_AVX2)) {
+					if (freg != src)
+						FAIL_IF(emit_groupf(compiler, MOVDQA_x_xm | EX86_PREF_66 | EX86_SSE2, freg, src, 0));
+
+					FAIL_IF(emit_groupf(compiler, PSRLDQ_x | EX86_PREF_66 | EX86_SSE2_OP2, opcode3, freg, 0));
+				} else
+					FAIL_IF(emit_vex_instruction(compiler, PSRLDQ_x | EX86_PREF_66 | EX86_SSE2_OP2 | VEX_SSE2_OPV, opcode3, freg, src, 0));
+
+				FAIL_IF(emit_byte(compiler, U8(src_lane_index)));
+			}
+
+			if (pref != 0) {
+				FAIL_IF(emit_groupf(compiler, PSHUFLW_x_xm | pref | EX86_SSE2, freg, src, 0));
+				FAIL_IF(emit_byte(compiler, byte));
+			}
+
+			src = freg;
+		}
+
+		if (cpu_feature_list & CPU_FEATURE_AVX2)
+			return emit_vex_instruction(compiler, VPBROADCASTB_x_xm | (reg_size == 5 ? VEX_256 : 0) | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, 0, src, 0);
+
+		SLJIT_ASSERT(reg_size == 4);
+		FAIL_IF(emit_groupf(compiler, PXOR_x_xm | EX86_PREF_66 | EX86_SSE2, TMP_FREG, TMP_FREG, 0));
+		return emit_groupf_ext(compiler, PSHUFB_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, TMP_FREG, 0);
 	}
 
-	if (GET_OPCODE(op) == SLJIT_OR && !GET_ALL_FLAGS(op) && FAST_IS_REG(dst) && reg_map[dst] <= 4) {
-		SLJIT_ASSERT(reg_map[SLJIT_R0] == 0);
+	if ((cpu_feature_list & CPU_FEATURE_AVX2) && src_lane_index == 0 && elem_size <= 3) {
+		switch (elem_size) {
+		case 1:
+			pref = VPBROADCASTW_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2;
+			break;
+		case 2:
+			pref = VPBROADCASTD_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2;
+			break;
+		default:
+			pref = VPBROADCASTQ_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2;
+			break;
+		}
 
-		if (dst != SLJIT_R0) {
-			inst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 3 + 2 + 1);
-			FAIL_IF(!inst);
-			INC_SIZE(1 + 3 + 2 + 1);
-			/* Set low register to conditional flag. */
-			*inst++ = U8(XCHG_EAX_r | reg_map[TMP_REG1]);
-			*inst++ = GROUP_0F;
-			*inst++ = cond_set;
-			*inst++ = MOD_REG | 0 /* eax */;
-			*inst++ = OR_rm8_r8;
-			*inst++ = MOD_REG | (0 /* eax */ << 3) | reg_map[dst];
-			*inst++ = U8(XCHG_EAX_r | reg_map[TMP_REG1]);
+		if (reg_size == 5)
+			pref |= VEX_256;
+
+		return emit_vex_instruction(compiler, pref, freg, 0, src, 0);
+	}
+
+	if (reg_size == 5) {
+		switch (elem_size) {
+		case 1:
+			byte = U8(src_lane_index & 0x3);
+			src_lane_index >>= 2;
+			pref = PSHUFLW_x_xm | VEX_256 | ((src_lane_index & 1) == 0 ? EX86_PREF_F2 : EX86_PREF_F3) | EX86_SSE2;
+			break;
+		case 2:
+			byte = U8(src_lane_index & 0x3);
+			src_lane_index >>= 1;
+			pref = PSHUFD_x_xm | VEX_256 | EX86_PREF_66 | EX86_SSE2;
+			break;
+		case 3:
+			pref = 0;
+			break;
+		default:
+			FAIL_IF(emit_vex_instruction(compiler, VPERMQ_y_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | VEX_W | EX86_SSE2, freg, 0, src, 0));
+			return emit_byte(compiler, U8(src_lane_index == 0 ? 0x44 : 0xee));
 		}
-		else {
-			inst = (sljit_u8*)ensure_buf(compiler, 1 + 2 + 3 + 2 + 2);
+
+		if (pref != 0) {
+			FAIL_IF(emit_vex_instruction(compiler, pref, freg, 0, src, 0));
+			byte = U8(byte | (byte << 2));
+			FAIL_IF(emit_byte(compiler, U8(byte | (byte << 4))));
+
+			if (src_lane_index == 0)
+				return emit_vex_instruction(compiler, VPBROADCASTQ_x_xm | VEX_256 | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, 0, freg, 0);
+
+			src = freg;
+		}
+
+		FAIL_IF(emit_vex_instruction(compiler, VPERMQ_y_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | VEX_W | EX86_SSE2, freg, 0, src, 0));
+		byte = U8(src_lane_index);
+		byte = U8(byte | (byte << 2));
+		return emit_byte(compiler, U8(byte | (byte << 4)));
+	}
+
+	switch (elem_size) {
+	case 1:
+		byte = U8(src_lane_index & 0x3);
+		src_lane_index >>= 1;
+		pref = (src_lane_index & 2) == 0 ? EX86_PREF_F2 : EX86_PREF_F3;
+
+		FAIL_IF(emit_groupf(compiler, PSHUFLW_x_xm | pref | EX86_SSE2, freg, src, 0));
+		byte = U8(byte | (byte << 2));
+		FAIL_IF(emit_byte(compiler, U8(byte | (byte << 4))));
+
+		if ((cpu_feature_list & CPU_FEATURE_AVX2) && pref == EX86_PREF_F2)
+			return emit_vex_instruction(compiler, VPBROADCASTD_x_xm | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, 0, freg, 0);
+
+		src = freg;
+		/* fallthrough */
+	case 2:
+		byte = U8(src_lane_index);
+		byte = U8(byte | (byte << 2));
+		break;
+	default:
+		byte = U8(src_lane_index << 1);
+		byte = U8(byte | (byte << 2) | 0x4);
+		break;
+	}
+
+	FAIL_IF(emit_groupf(compiler, PSHUFD_x_xm | EX86_PREF_66 | EX86_SSE2, freg, src, 0));
+	return emit_byte(compiler, U8(byte | (byte << 4)));
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 src, sljit_sw srcw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_s32 elem2_size = SLJIT_SIMD_GET_ELEM2_SIZE(type);
+	sljit_u8 opcode;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_extend(compiler, type, freg, src, srcw));
+
+	ADJUST_LOCAL_OFFSET(src, srcw);
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	compiler->mode32 = 1;
+#endif /* SLJIT_CONFIG_X86_64 */
+
+	if (reg_size == 5) {
+		if (!(cpu_feature_list & CPU_FEATURE_AVX2))
+			return SLJIT_ERR_UNSUPPORTED;
+	} else if (reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (type & SLJIT_SIMD_FLOAT) {
+		if (elem_size != 2 || elem2_size != 3)
+			return SLJIT_ERR_UNSUPPORTED;
+
+		if (type & SLJIT_SIMD_TEST)
+			return SLJIT_SUCCESS;
+
+		if (reg_size == 4)
+			return emit_groupf(compiler, CVTPS2PD_x_xm | EX86_SSE2, freg, src, srcw);
+		return emit_vex_instruction(compiler, CVTPS2PD_x_xm | VEX_256 | EX86_SSE2, freg, 0, src, srcw);
+	}
+
+	switch (elem_size) {
+	case 0:
+		if (elem2_size == 1)
+			opcode = (type & SLJIT_SIMD_EXTEND_SIGNED) ? PMOVSXBW_x_xm : PMOVZXBW_x_xm;
+		else if (elem2_size == 2)
+			opcode = (type & SLJIT_SIMD_EXTEND_SIGNED) ? PMOVSXBD_x_xm : PMOVZXBD_x_xm;
+		else if (elem2_size == 3)
+			opcode = (type & SLJIT_SIMD_EXTEND_SIGNED) ? PMOVSXBQ_x_xm : PMOVZXBQ_x_xm;
+		else
+			return SLJIT_ERR_UNSUPPORTED;
+		break;
+	case 1:
+		if (elem2_size == 2)
+			opcode = (type & SLJIT_SIMD_EXTEND_SIGNED) ? PMOVSXWD_x_xm : PMOVZXWD_x_xm;
+		else if (elem2_size == 3)
+			opcode = (type & SLJIT_SIMD_EXTEND_SIGNED) ? PMOVSXWQ_x_xm : PMOVZXWQ_x_xm;
+		else
+			return SLJIT_ERR_UNSUPPORTED;
+		break;
+	case 2:
+		if (elem2_size == 3)
+			opcode = (type & SLJIT_SIMD_EXTEND_SIGNED) ? PMOVSXDQ_x_xm : PMOVZXDQ_x_xm;
+		else
+			return SLJIT_ERR_UNSUPPORTED;
+		break;
+	default:
+		return SLJIT_ERR_UNSUPPORTED;
+	}
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	if (reg_size == 4)
+		return emit_groupf_ext(compiler, opcode | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, src, srcw);
+	return emit_vex_instruction(compiler, opcode | VEX_256 | EX86_PREF_66 | VEX_OP_0F38 | EX86_SSE2, freg, 0, src, srcw);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 freg,
+	sljit_s32 dst, sljit_sw dstw)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_s32 dst_r;
+	sljit_uw pref;
+	sljit_u8 *inst;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_sign(compiler, type, freg, dst, dstw));
+
+	ADJUST_LOCAL_OFFSET(dst, dstw);
+
+	CHECK_EXTRA_REGS(dst, dstw, (void)0);
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	compiler->mode32 = 1;
+#endif /* SLJIT_CONFIG_X86_64 */
+
+	if (elem_size > 3 || ((type & SLJIT_SIMD_FLOAT) && elem_size < 2))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if (reg_size == 4) {
+		if (type & SLJIT_SIMD_TEST)
+			return SLJIT_SUCCESS;
+
+		pref = EX86_PREF_66 | EX86_SSE2_OP2;
+
+		switch (elem_size) {
+		case 1:
+			FAIL_IF(emit_groupf(compiler, PACKSSWB_x_xm | EX86_PREF_66 | EX86_SSE2, TMP_FREG, freg, 0));
+			freg = TMP_FREG;
+			break;
+		case 2:
+			pref = EX86_SSE2_OP2;
+			break;
+		}
+
+		dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
+		FAIL_IF(emit_groupf(compiler, (elem_size < 2 ? PMOVMSKB_r_x : MOVMSKPS_r_x) | pref, dst_r, freg, 0));
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+		compiler->mode32 = type & SLJIT_32;
+#endif /* SLJIT_CONFIG_X86_64 */
+
+		if (elem_size == 1) {
+			inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 8, dst_r, 0);
 			FAIL_IF(!inst);
-			INC_SIZE(2 + 3 + 2 + 2);
-			/* Set low register to conditional flag. */
-			*inst++ = XCHG_r_rm;
-			*inst++ = U8(MOD_REG | (1 /* ecx */ << 3) | reg_map[TMP_REG1]);
-			*inst++ = GROUP_0F;
-			*inst++ = cond_set;
-			*inst++ = MOD_REG | 1 /* ecx */;
-			*inst++ = OR_rm8_r8;
-			*inst++ = MOD_REG | (1 /* ecx */ << 3) | 0 /* eax */;
-			*inst++ = XCHG_r_rm;
-			*inst++ = U8(MOD_REG | (1 /* ecx */ << 3) | reg_map[TMP_REG1]);
+			inst[1] |= SHR;
 		}
+
+		if (dst_r == TMP_REG1)
+			return emit_mov(compiler, dst, dstw, TMP_REG1, 0);
+
 		return SLJIT_SUCCESS;
 	}
 
-	/* Set TMP_REG1 to the bit. */
-	inst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 3 + 3 + 1);
-	FAIL_IF(!inst);
-	INC_SIZE(1 + 3 + 3 + 1);
-	*inst++ = U8(XCHG_EAX_r | reg_map[TMP_REG1]);
-	/* Set al to conditional flag. */
-	*inst++ = GROUP_0F;
-	*inst++ = cond_set;
-	*inst++ = MOD_REG | 0 /* eax */;
-
-	*inst++ = GROUP_0F;
-	*inst++ = MOVZX_r_rm8;
-	*inst++ = MOD_REG | (0 << 3) /* eax */ | 0 /* eax */;
+	if (reg_size != 5 || !(cpu_feature_list & CPU_FEATURE_AVX2))
+		return SLJIT_ERR_UNSUPPORTED;
 
-	*inst++ = U8(XCHG_EAX_r | reg_map[TMP_REG1]);
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
 
-	if (GET_OPCODE(op) < SLJIT_ADD)
+	dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
+
+	if (elem_size == 1) {
+		FAIL_IF(emit_vex_instruction(compiler, VEXTRACTI128_x_ym | VEX_256 | EX86_PREF_66 | VEX_OP_0F3A | EX86_SSE2, freg, 0, TMP_FREG, 0));
+		FAIL_IF(emit_byte(compiler, 1));
+		FAIL_IF(emit_vex_instruction(compiler, PACKSSWB_x_xm | VEX_256 | EX86_PREF_66 | EX86_SSE2 | VEX_SSE2_OPV, TMP_FREG, freg, TMP_FREG, 0));
+		FAIL_IF(emit_groupf(compiler, PMOVMSKB_r_x | EX86_PREF_66 | EX86_SSE2_OP2, dst_r, TMP_FREG, 0));
+	} else {
+		pref = MOVMSKPS_r_x | VEX_256 | EX86_SSE2_OP2;
+
+		if (elem_size == 0)
+			pref = PMOVMSKB_r_x | VEX_256 | EX86_PREF_66 | EX86_SSE2_OP2;
+		else if (elem_size == 3)
+			pref |= EX86_PREF_66;
+
+		FAIL_IF(emit_vex_instruction(compiler, pref, dst_r, 0, freg, 0));
+	}
+
+	if (dst_r == TMP_REG1) {
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+		compiler->mode32 = type & SLJIT_32;
+#endif /* SLJIT_CONFIG_X86_64 */
 		return emit_mov(compiler, dst, dstw, TMP_REG1, 0);
+	}
 
-	SLJIT_SKIP_CHECKS(compiler);
-	return sljit_emit_op2(compiler, op, dst_save, dstw_save, dst_save, dstw_save, TMP_REG1, 0);
+	return SLJIT_SUCCESS;
+}
+
+static sljit_s32 emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg, sljit_s32 src_freg)
+{
+	sljit_uw op = ((type & SLJIT_SIMD_FLOAT) ? MOVAPS_x_xm : MOVDQA_x_xm) | EX86_SSE2;
+
+	SLJIT_ASSERT(SLJIT_SIMD_GET_REG_SIZE(type) == 4);
+
+	if (!(type & SLJIT_SIMD_FLOAT) || SLJIT_SIMD_GET_ELEM_SIZE(type) == 3)
+		op |= EX86_PREF_66;
+
+	return emit_groupf(compiler, op, dst_freg, src_freg, 0);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type,
+	sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg)
+{
+	sljit_s32 reg_size = SLJIT_SIMD_GET_REG_SIZE(type);
+	sljit_s32 elem_size = SLJIT_SIMD_GET_ELEM_SIZE(type);
+	sljit_s32 needs_move = 0;
+	sljit_uw op = 0;
+
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_simd_op2(compiler, type, dst_freg, src1_freg, src2_freg));
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	compiler->mode32 = 1;
 #endif /* SLJIT_CONFIG_X86_64 */
+
+	if (reg_size == 5) {
+		if (!(cpu_feature_list & CPU_FEATURE_AVX2))
+			return SLJIT_ERR_UNSUPPORTED;
+	} else if (reg_size != 4)
+		return SLJIT_ERR_UNSUPPORTED;
+
+	if ((type & SLJIT_SIMD_FLOAT) && (elem_size < 2 || elem_size > 3))
+		return SLJIT_ERR_UNSUPPORTED;
+
+	switch (SLJIT_SIMD_GET_OPCODE(type)) {
+	case SLJIT_SIMD_OP2_AND:
+		op = (type & SLJIT_SIMD_FLOAT) ? ANDPD_x_xm : PAND_x_xm;
+
+		if (!(type & SLJIT_SIMD_FLOAT) || elem_size == 3)
+			op |= EX86_PREF_66;
+		break;
+	case SLJIT_SIMD_OP2_OR:
+		op = (type & SLJIT_SIMD_FLOAT) ? ORPD_x_xm : POR_x_xm;
+
+		if (!(type & SLJIT_SIMD_FLOAT) || elem_size == 3)
+			op |= EX86_PREF_66;
+		break;
+	case SLJIT_SIMD_OP2_XOR:
+		op = (type & SLJIT_SIMD_FLOAT) ? XORPD_x_xm : PXOR_x_xm;
+
+		if (!(type & SLJIT_SIMD_FLOAT) || elem_size == 3)
+			op |= EX86_PREF_66;
+		break;
+	}
+
+	if (type & SLJIT_SIMD_TEST)
+		return SLJIT_SUCCESS;
+
+	needs_move = dst_freg != src1_freg && dst_freg != src2_freg;
+
+	if (reg_size == 5 || (needs_move && (cpu_feature_list & CPU_FEATURE_AVX2))) {
+		if (reg_size == 5)
+			op |= VEX_256;
+
+		return emit_vex_instruction(compiler, op | EX86_SSE2 | VEX_SSE2_OPV, dst_freg, src1_freg, src2_freg, 0);
+	}
+
+	if (needs_move) {
+		FAIL_IF(emit_simd_mov(compiler, type, dst_freg, src1_freg));
+	} else if (dst_freg != src1_freg) {
+		SLJIT_ASSERT(dst_freg == src2_freg);
+		src2_freg = src1_freg;
+	}
+
+	FAIL_IF(emit_groupf(compiler, op | EX86_SSE2, dst_freg, src2_freg, 0));
+	return SLJIT_SUCCESS;
 }
 
-SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op,
 	sljit_s32 dst_reg,
-	sljit_s32 src, sljit_sw srcw)
+	sljit_s32 mem_reg)
 {
-	sljit_u8* inst;
+	CHECK_ERROR();
+	CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg));
+
+	SLJIT_SKIP_CHECKS(compiler);
+	return sljit_emit_op1(compiler, op, dst_reg, 0, SLJIT_MEM1(mem_reg), 0);
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op,
+	sljit_s32 src_reg,
+	sljit_s32 mem_reg,
+	sljit_s32 temp_reg)
+{
+	sljit_uw pref;
+	sljit_s32 free_reg = TMP_REG1;
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+	sljit_sw srcw = 0;
+	sljit_sw tempw = 0;
+#endif /* SLJIT_CONFIG_X86_32 */
 
 	CHECK_ERROR();
-	CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));
+	CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg));
+	CHECK_EXTRA_REGS(src_reg, srcw, (void)0);
+	CHECK_EXTRA_REGS(temp_reg, tempw, (void)0);
+
+	SLJIT_ASSERT(FAST_IS_REG(src_reg) || src_reg == SLJIT_MEM1(SLJIT_SP));
+	SLJIT_ASSERT(FAST_IS_REG(temp_reg) || temp_reg == SLJIT_MEM1(SLJIT_SP));
 
+	op = GET_OPCODE(op);
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-	type &= ~SLJIT_32;
+	if ((src_reg & SLJIT_MEM) || (op == SLJIT_MOV_U8 && reg_map[src_reg] >= 4)) {
+		/* Src is virtual register or its low byte is not accessible. */
+		SLJIT_ASSERT(src_reg != SLJIT_R1);
+		free_reg = src_reg;
 
-	if (!sljit_has_cpu_feature(SLJIT_HAS_CMOV) || (dst_reg >= SLJIT_R3 && dst_reg <= SLJIT_S3))
-		return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);
-#else
-	if (!sljit_has_cpu_feature(SLJIT_HAS_CMOV))
-		return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);
-#endif
+		EMIT_MOV(compiler, TMP_REG1, 0, src_reg, srcw);
+		src_reg = TMP_REG1;
 
-	/* ADJUST_LOCAL_OFFSET is not needed. */
-	CHECK_EXTRA_REGS(src, srcw, (void)0);
+		if (mem_reg == src_reg)
+			mem_reg = TMP_REG1;
+	}
+#endif /* SLJIT_CONFIG_X86_32 */
 
+	if (temp_reg != SLJIT_R0) {
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-	compiler->mode32 = type & SLJIT_32;
-	type &= ~SLJIT_32;
-#endif
+		compiler->mode32 = 0;
 
-	if (SLJIT_UNLIKELY(src & SLJIT_IMM)) {
-		EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, srcw);
-		src = TMP_REG1;
-		srcw = 0;
+		EMIT_MOV(compiler, free_reg, 0, SLJIT_R0, 0);
+		EMIT_MOV(compiler, SLJIT_R0, 0, temp_reg, 0);
+
+		if (src_reg == SLJIT_R0)
+			src_reg = free_reg;
+		if (mem_reg == SLJIT_R0)
+			mem_reg = free_reg;
+#else /* !SLJIT_CONFIG_X86_64 */
+		if (src_reg == TMP_REG1 && mem_reg == SLJIT_R0 && (free_reg & SLJIT_MEM)) {
+			EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_R1, 0);
+			EMIT_MOV(compiler, SLJIT_R1, 0, SLJIT_R0, 0);
+			EMIT_MOV(compiler, SLJIT_R0, 0, temp_reg, tempw);
+
+			mem_reg = SLJIT_R1;
+			free_reg = SLJIT_R1;
+		} else {
+			EMIT_MOV(compiler, free_reg, 0, SLJIT_R0, 0);
+			EMIT_MOV(compiler, SLJIT_R0, 0, temp_reg, tempw);
+
+			if (src_reg == SLJIT_R0)
+				src_reg = free_reg;
+			if (mem_reg == SLJIT_R0)
+				mem_reg = free_reg;
+		}
+#endif /* SLJIT_CONFIG_X86_64 */
 	}
 
-	inst = emit_x86_instruction(compiler, 2, dst_reg, 0, src, srcw);
-	FAIL_IF(!inst);
-	*inst++ = GROUP_0F;
-	*inst = U8(get_jump_code((sljit_uw)type) - 0x40);
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	compiler->mode32 = op != SLJIT_MOV && op != SLJIT_MOV_P;
+#endif /* SLJIT_CONFIG_X86_64 */
+
+	/* Lock prefix. */
+	FAIL_IF(emit_byte(compiler, GROUP_LOCK));
+
+	pref = 0;
+	if (op == SLJIT_MOV_U16)
+		pref = EX86_HALF_ARG | EX86_PREF_66;
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+	if (op == SLJIT_MOV_U8)
+		pref = EX86_REX;
+#endif /* SLJIT_CONFIG_X86_64 */
+
+	FAIL_IF(emit_groupf(compiler, (op == SLJIT_MOV_U8 ? CMPXCHG_rm8_r : CMPXCHG_rm_r) | pref, src_reg, SLJIT_MEM1(mem_reg), 0));
+
+	if (temp_reg != SLJIT_R0) {
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+		compiler->mode32 = 0;
+		return emit_mov(compiler, SLJIT_R0, 0, TMP_REG1, 0);
+#else /* !SLJIT_CONFIG_X86_64 */
+		EMIT_MOV(compiler, SLJIT_R0, 0, free_reg, 0);
+		if (free_reg != TMP_REG1)
+			return emit_mov(compiler, free_reg, 0, (free_reg == SLJIT_R1) ? SLJIT_MEM1(SLJIT_SP) : TMP_REG1, 0);
+#endif /* SLJIT_CONFIG_X86_64 */
+	}
 	return SLJIT_SUCCESS;
 }
 
@@ -3339,8 +4730,8 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_co
 	inst = (sljit_u8*)ensure_buf(compiler, 2);
 	PTR_FAIL_IF(!inst);
 
-	*inst++ = 0;
-	*inst++ = 2;
+	inst[0] = 0;
+	inst[1] = 2;
 
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 	if (dst & SLJIT_MEM)
@@ -3393,8 +4784,8 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_pu
 	inst = (sljit_u8*)ensure_buf(compiler, 2);
 	PTR_FAIL_IF(!inst);
 
-	*inst++ = 0;
-	*inst++ = 3;
+	inst[0] = 0;
+	inst[1] = 3;
 
 	return put_label;
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/import_from_zlib_tarball.sh 5.15.17+dfsg-1/src/3rdparty/zlib/import_from_zlib_tarball.sh
--- 5.15.15+dfsg-2/src/3rdparty/zlib/import_from_zlib_tarball.sh	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/import_from_zlib_tarball.sh	2024-11-20 13:56:33.000000000 +0000
@@ -46,8 +46,9 @@ if [ $# -ne 2 ]; then
     exit 1
 fi
 
-ZLIB_DIR=$1
-TARGET_DIR=$2
+# Name the arguments, omitting trailing slashes as we'll add where needed.
+ZLIB_DIR="${1%/}"
+TARGET_DIR="${2%/}"
 
 if [ ! -d "$ZLIB_DIR" -o ! -r "$ZLIB_DIR" -o ! -d "$TARGET_DIR" -o ! -w "$TARGET_DIR" ]; then
     echo "Either the zlib source dir or the target dir do not exist,"
@@ -71,7 +72,7 @@ copy_file() {
     fi
 
     mkdir -p "$TARGET_DIR/$(dirname "$SOURCE_FILE")"
-    cp "$ZLIB_DIR/$SOURCE_FILE" "$TARGET_DIR/$DEST_FILE"
+    cp -v "$ZLIB_DIR/$SOURCE_FILE" "$TARGET_DIR/$DEST_FILE"
 }
 
 FILES="
@@ -110,3 +111,18 @@ FILES="
 for i in $FILES; do
     copy_file "$i" "src/$i"
 done
+
+cat << EOF
+
+Please do not forget to patch qtpatches.diff
+The usual routine after this script is:
+  1. Create commit to clean staging
+  2. Apply qtpatches.diff with:
+       patch -p1 < qtpatches.diff
+  3. Update the version in: ChangeLog and src/zlib.h
+  4. Validate all changes and create new qtpatches.diff with:
+       git diff --relative > qtpatches.diff
+  5. Add changed files and amend the commit with these files.
+
+If you want to revert the diff use: patch -p1 -Ri qtpatches.diff
+EOF
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/qt_attribution.json 5.15.17+dfsg-1/src/3rdparty/zlib/qt_attribution.json
--- 5.15.15+dfsg-2/src/3rdparty/zlib/qt_attribution.json	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/qt_attribution.json	2024-11-20 13:56:33.000000000 +0000
@@ -6,10 +6,11 @@
 
     "Description": "zlib is a general purpose data compression library.",
     "Homepage": "https://zlib.net/",
-    "Version": "1.2.13",
+    "Version": "1.3.1",
+    "DownloadLocation": "https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.gz",
 
     "License": "zlib License",
     "LicenseId": "Zlib",
     "LicenseFile": "LICENSE",
-    "Copyright": "(C) 1995-2022 Jean-loup Gailly and Mark Adler"
+    "Copyright": "(C) 1995-2024 Jean-loup Gailly and Mark Adler"
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/qtpatches.diff 5.15.17+dfsg-1/src/3rdparty/zlib/qtpatches.diff
--- 5.15.15+dfsg-2/src/3rdparty/zlib/qtpatches.diff	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/qtpatches.diff	2024-11-20 13:56:33.000000000 +0000
@@ -1,45 +1,41 @@
-diff -ruN orig/ChangeLog src/ChangeLog
---- orig/ChangeLog
-+++ src/ChangeLog
+diff --git a/src/ChangeLog b/src/ChangeLog
+index b801a1031ec..686283a2aec 100644
+--- a/src/ChangeLog
++++ b/src/ChangeLog
 @@ -1,6 +1,10 @@
  
                  ChangeLog file for zlib
  
-+Changes in 1.2.13 (Qt) (14 Nov 2022)
++Changes in 1.3.1 (Qt) (23 Jan 2024)
 +- This is a stripped down copy of zlib that contains patches to
 +  make it compile as part of Qt. See also "qtpatches.diff".
 +
- Changes in 1.2.13 (13 Oct 2022)
- - Fix configure issue that discarded provided CC definition
- - Correct incorrect inputs provided to the CRC functions
-diff -ruN orig/gzguts.h src/gzguts.h
---- orig/gzguts.h
-+++ src/gzguts.h
-@@ -3,6 +3,25 @@
-  * For conditions of distribution and use, see copyright notice in zlib.h
-  */
+ Changes in 1.3.1 (22 Jan 2024)
+ - Reject overflows of zip header fields in minizip
+ - Fix bug in inflateSync() for data held in bit buffer
+diff --git a/src/README b/src/README
+index c5f917540b6..af6b4f32bf5 100644
+--- a/src/README
++++ b/src/README
+@@ -6,6 +6,9 @@ thread safe.  The data format used by the zlib library is described by RFCs
+ http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
+ rfc1952 (gzip format).
  
-+#ifdef _MSC_VER
-+#  ifndef _CRT_SECURE_NO_DEPRECATE
-+#    define _CRT_SECURE_NO_DEPRECATE
-+#  endif
-+#  ifndef _CRT_NONSTDC_NO_DEPRECATE
-+#    define _CRT_NONSTDC_NO_DEPRECATE
-+#  endif
-+// disable warnings like '=': conversion from 'size_t' to 'unsigned int', possible loss of data
-+#  pragma warning(disable: 4267; disable: 4244)
-+#endif
++This is a stripped down copy of zlib that contains patches to make it compile
++as part of Qt. See also "qtpatches.diff".
 +
- #ifdef _LARGEFILE64_SOURCE
- #  ifndef _LARGEFILE_SOURCE
- #    define _LARGEFILE_SOURCE 1
-@@ -12,6 +21,15 @@
- #  endif
- #endif
+ All functions of the compression library are documented in the file zlib.h
+ (volunteer to write man pages welcome, contact zlib@gzip.org).  A usage example
+ of the library is given in the file test/example.c which also tests that
+diff --git a/src/gzguts.h b/src/gzguts.h
+index eba72085bb7..5bf6b7d4813 100644
+--- a/src/gzguts.h
++++ b/src/gzguts.h
+@@ -3,6 +3,12 @@
+  * For conditions of distribution and use, see copyright notice in zlib.h
+  */
  
-+#ifndef QT_BOOTSTRAPPED
-+#  include <qconfig.h>
-+#endif
++#include <qconfig.h>
 +
 +#ifdef QT_VISIBILITY_AVAILABLE
 +#define HAVE_HIDDEN
@@ -48,22 +44,10 @@ diff -ruN orig/gzguts.h src/gzguts.h
  #ifdef _LARGEFILE64_SOURCE
  #  ifndef _LARGEFILE_SOURCE
  #    define _LARGEFILE_SOURCE 1
-diff -ruN orig/README src/README
---- orig/README
-+++ src/README
-@@ -6,6 +6,9 @@
- http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
- rfc1952 (gzip format).
- 
-+This is a stripped down copy of zlib that contains patches to make it compile
-+as part of Qt. See also "qtpatches.diff".
-+
- All functions of the compression library are documented in the file zlib.h
- (volunteer to write man pages welcome, contact zlib@gzip.org).  A usage example
- of the library is given in the file test/example.c which also tests that
-diff -ruN orig/zconf.h src/zconf.h
---- orig/zconf.h
-+++ src/zconf.h
+diff --git a/src/zconf.h b/src/zconf.h
+index 62adc8d8431..4e14507a22d 100644
+--- a/src/zconf.h
++++ b/src/zconf.h
 @@ -8,6 +8,9 @@
  #ifndef ZCONF_H
  #define ZCONF_H
@@ -74,17 +58,7 @@ diff -ruN orig/zconf.h src/zconf.h
  /*
   * If you *really* need a unique prefix for all types and library functions,
   * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
-@@ -38,6 +41,9 @@
- #  define crc32                 z_crc32
- #  define crc32_combine         z_crc32_combine
- #  define crc32_combine64       z_crc32_combine64
-+#  define crc32_combine_gen     z_crc32_combine_gen
-+#  define crc32_combine_gen64   z_crc32_combine_gen64
-+#  define crc32_combine_op      z_crc32_combine_op
- #  define crc32_z               z_crc32_z
- #  define deflate               z_deflate
- #  define deflateBound          z_deflateBound
-@@ -136,6 +142,7 @@
+@@ -139,6 +142,7 @@
  #  endif
  #  define zlibCompileFlags      z_zlibCompileFlags
  #  define zlibVersion           z_zlibVersion
@@ -92,7 +66,7 @@ diff -ruN orig/zconf.h src/zconf.h
  
  /* all zlib typedefs in zlib.h and zconf.h */
  #  define Byte                  z_Byte
-@@ -431,7 +438,7 @@
+@@ -433,7 +437,7 @@ typedef uLong FAR uLongf;
     typedef unsigned long z_crc_t;
  #endif
  
@@ -101,9 +75,10 @@ diff -ruN orig/zconf.h src/zconf.h
  #  define Z_HAVE_UNISTD_H
  #endif
  
-diff -ruN orig/zlib.h src/zlib.h
---- orig/zlib.h
-+++ src/zlib.h
+diff --git a/src/zlib.h b/src/zlib.h
+index 8d4b932eaf6..2cff72ee865 100644
+--- a/src/zlib.h
++++ b/src/zlib.h
 @@ -33,11 +33,15 @@
  
  #include "zconf.h"
@@ -116,21 +91,20 @@ diff -ruN orig/zlib.h src/zlib.h
  extern "C" {
  #endif
  
--#define ZLIB_VERSION "1.2.13"
-+#define ZLIB_VERSION "1.2.13 (Qt)"
- #define ZLIB_VERNUM 0x12c0
+-#define ZLIB_VERSION "1.3.1"
++#define ZLIB_VERSION "1.3.1 (Qt)"
+ #define ZLIB_VERNUM 0x1310
  #define ZLIB_VER_MAJOR 1
- #define ZLIB_VER_MINOR 2
-diff -ruN orig/zutil.h src/zutil.h
---- orig/zutil.h
-+++ src/zutil.h
-@@ -13,6 +13,14 @@
+ #define ZLIB_VER_MINOR 3
+diff --git a/src/zutil.h b/src/zutil.h
+index 48dd7febae6..71dd616ab8d 100644
+--- a/src/zutil.h
++++ b/src/zutil.h
+@@ -13,6 +13,12 @@
  #ifndef ZUTIL_H
  #define ZUTIL_H
  
-+#ifndef QT_BOOTSTRAPPED
-+#  include <qconfig.h>
-+#endif
++#include <qconfig.h>
 +
 +#ifdef QT_VISIBILITY_AVAILABLE
 +#define HAVE_HIDDEN
@@ -139,19 +113,7 @@ diff -ruN orig/zutil.h src/zutil.h
  #ifdef HAVE_HIDDEN
  #  define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
  #else
-@@ -143,6 +151,11 @@
- #    if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
- #      include <unix.h> /* for fdopen */
- #    else
-+//     We need to include stdio.h here because zlib.h will include TargetConditionals.h
-+//     This will define TARGET_OS_MAC that leads to this check.
-+//     Since zutil.h will include gzguts.h and gzguts.h includes stdio.h
-+//     AFTER check for fdopen we need to include stdio.h directly
-+#      include <stdio.h>
- #      ifndef fdopen
- #        define fdopen(fd,mode) NULL /* No fdopen() */
- #      endif
-@@ -166,7 +179,7 @@
+@@ -157,7 +163,7 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
  #  define OS_CODE 18
  #endif
  
@@ -159,4 +121,4 @@ diff -ruN orig/zutil.h src/zutil.h
 +#if defined(__APPLE__) && !defined(OS_CODE)
  #  define OS_CODE 19
  #endif
- 
+ 
\ No newline at end of file
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/ChangeLog 5.15.17+dfsg-1/src/3rdparty/zlib/src/ChangeLog
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/ChangeLog	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/ChangeLog	2024-11-20 13:56:33.000000000 +0000
@@ -1,10 +1,38 @@
 
                 ChangeLog file for zlib
 
-Changes in 1.2.13 (Qt) (14 Nov 2022)
+Changes in 1.3.1 (Qt) (23 Jan 2024)
 - This is a stripped down copy of zlib that contains patches to
   make it compile as part of Qt. See also "qtpatches.diff".
 
+Changes in 1.3.1 (22 Jan 2024)
+- Reject overflows of zip header fields in minizip
+- Fix bug in inflateSync() for data held in bit buffer
+- Add LIT_MEM define to use more memory for a small deflate speedup
+- Fix decision on the emission of Zip64 end records in minizip
+- Add bounds checking to ERR_MSG() macro, used by zError()
+- Neutralize zip file traversal attacks in miniunz
+- Fix a bug in ZLIB_DEBUG compiles in check_match()
+- Various portability and appearance improvements
+
+Changes in 1.3 (18 Aug 2023)
+- Remove K&R function definitions and zlib2ansi
+- Fix bug in deflateBound() for level 0 and memLevel 9
+- Fix bug when gzungetc() is used immediately after gzopen()
+- Fix bug when using gzflush() with a very small buffer
+- Fix crash when gzsetparams() attempted for transparent write
+- Fix test/example.c to work with FORCE_STORED
+- Rewrite of zran in examples (see zran.c version history)
+- Fix minizip to allow it to open an empty zip file
+- Fix reading disk number start on zip64 files in minizip
+- Fix logic error in minizip argument processing
+- Add minizip testing to Makefile
+- Read multiple bytes instead of byte-by-byte in minizip unzip.c
+- Add memory sanitizer to configure (--memory)
+- Various portability improvements
+- Various documentation improvements
+- Various spelling and typo corrections
+
 Changes in 1.2.13 (13 Oct 2022)
 - Fix configure issue that discarded provided CC definition
 - Correct incorrect inputs provided to the CRC functions
@@ -1449,7 +1477,7 @@ Changes in 0.99 (27 Jan 96)
 - fix typo in Make_vms.com (f$trnlnm -> f$getsyi)
 - in fcalloc, normalize pointer if size > 65520 bytes
 - don't use special fcalloc for 32 bit Borland C++
-- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc...
+- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc.
 - use Z_BINARY instead of BINARY
 - document that gzclose after gzdopen will close the file
 - allow "a" as mode in gzopen
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/README 5.15.17+dfsg-1/src/3rdparty/zlib/src/README
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/README	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/README	2024-11-20 13:56:33.000000000 +0000
@@ -1,6 +1,6 @@
 ZLIB DATA COMPRESSION LIBRARY
 
-zlib 1.2.13 is a general purpose data compression library.  All the code is
+zlib 1.3.1 is a general purpose data compression library.  All the code is
 thread safe.  The data format used by the zlib library is described by RFCs
 (Request for Comments) 1950 to 1952 in the files
 http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
@@ -32,18 +32,17 @@ PLEASE read the zlib FAQ http://zlib.net
 
 Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan.  1997
 issue of Dr.  Dobb's Journal; a copy of the article is available at
-http://marknelson.us/1997/01/01/zlib-engine/ .
+https://marknelson.us/posts/1997/01/01/zlib-engine.html .
 
-The changes made in version 1.2.13 are documented in the file ChangeLog.
+The changes made in version 1.3.1 are documented in the file ChangeLog.
 
 Unsupported third party contributions are provided in directory contrib/ .
 
-zlib is available in Java using the java.util.zip package, documented at
-http://java.sun.com/developer/technicalArticles/Programming/compression/ .
+zlib is available in Java using the java.util.zip package. Follow the API
+Documentation link at: https://docs.oracle.com/search/?q=java.util.zip .
 
-A Perl interface to zlib written by Paul Marquess <pmqs@cpan.org> is available
-at CPAN (Comprehensive Perl Archive Network) sites, including
-http://search.cpan.org/~pmqs/IO-Compress-Zlib/ .
+A Perl interface to zlib and bzip2 written by Paul Marquess <pmqs@cpan.org>
+can be found at https://github.com/pmqs/IO-Compress .
 
 A Python interface to zlib written by A.M. Kuchling <amk@amk.ca> is
 available in Python 1.5 and later versions, see
@@ -67,7 +66,7 @@ Notes for some targets:
 - zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works
   when compiled with cc.
 
-- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is
+- On Digital Unix 4.0D (formerly OSF/1) on AlphaServer, the cc option -std1 is
   necessary to get gzprintf working correctly. This is done by configure.
 
 - zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with
@@ -87,7 +86,7 @@ Acknowledgments:
 
 Copyright notice:
 
- (C) 1995-2022 Jean-loup Gailly and Mark Adler
+ (C) 1995-2024 Jean-loup Gailly and Mark Adler
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/adler32.c 5.15.17+dfsg-1/src/3rdparty/zlib/src/adler32.c
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/adler32.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/adler32.c	2024-11-20 13:56:33.000000000 +0000
@@ -7,8 +7,6 @@
 
 #include "zutil.h"
 
-local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));
-
 #define BASE 65521U     /* largest prime smaller than 65536 */
 #define NMAX 5552
 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
@@ -60,11 +58,7 @@ local uLong adler32_combine_ OF((uLong a
 #endif
 
 /* ========================================================================= */
-uLong ZEXPORT adler32_z(adler, buf, len)
-    uLong adler;
-    const Bytef *buf;
-    z_size_t len;
-{
+uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, z_size_t len) {
     unsigned long sum2;
     unsigned n;
 
@@ -131,20 +125,12 @@ uLong ZEXPORT adler32_z(adler, buf, len)
 }
 
 /* ========================================================================= */
-uLong ZEXPORT adler32(adler, buf, len)
-    uLong adler;
-    const Bytef *buf;
-    uInt len;
-{
+uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len) {
     return adler32_z(adler, buf, len);
 }
 
 /* ========================================================================= */
-local uLong adler32_combine_(adler1, adler2, len2)
-    uLong adler1;
-    uLong adler2;
-    z_off64_t len2;
-{
+local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2) {
     unsigned long sum1;
     unsigned long sum2;
     unsigned rem;
@@ -169,18 +155,10 @@ local uLong adler32_combine_(adler1, adl
 }
 
 /* ========================================================================= */
-uLong ZEXPORT adler32_combine(adler1, adler2, len2)
-    uLong adler1;
-    uLong adler2;
-    z_off_t len2;
-{
+uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, z_off_t len2) {
     return adler32_combine_(adler1, adler2, len2);
 }
 
-uLong ZEXPORT adler32_combine64(adler1, adler2, len2)
-    uLong adler1;
-    uLong adler2;
-    z_off64_t len2;
-{
+uLong ZEXPORT adler32_combine64(uLong adler1, uLong adler2, z_off64_t len2) {
     return adler32_combine_(adler1, adler2, len2);
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/compress.c 5.15.17+dfsg-1/src/3rdparty/zlib/src/compress.c
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/compress.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/compress.c	2024-11-20 13:56:33.000000000 +0000
@@ -19,13 +19,8 @@
    memory, Z_BUF_ERROR if there was not enough room in the output buffer,
    Z_STREAM_ERROR if the level parameter is invalid.
 */
-int ZEXPORT compress2(dest, destLen, source, sourceLen, level)
-    Bytef *dest;
-    uLongf *destLen;
-    const Bytef *source;
-    uLong sourceLen;
-    int level;
-{
+int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source,
+                      uLong sourceLen, int level) {
     z_stream stream;
     int err;
     const uInt max = (uInt)-1;
@@ -65,12 +60,8 @@ int ZEXPORT compress2(dest, destLen, sou
 
 /* ===========================================================================
  */
-int ZEXPORT compress(dest, destLen, source, sourceLen)
-    Bytef *dest;
-    uLongf *destLen;
-    const Bytef *source;
-    uLong sourceLen;
-{
+int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source,
+                     uLong sourceLen) {
     return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
 }
 
@@ -78,9 +69,7 @@ int ZEXPORT compress(dest, destLen, sour
      If the default memLevel or windowBits for deflateInit() is changed, then
    this function needs to be updated.
  */
-uLong ZEXPORT compressBound(sourceLen)
-    uLong sourceLen;
-{
+uLong ZEXPORT compressBound(uLong sourceLen) {
     return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
            (sourceLen >> 25) + 13;
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/crc32.c 5.15.17+dfsg-1/src/3rdparty/zlib/src/crc32.c
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/crc32.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/crc32.c	2024-11-20 13:56:33.000000000 +0000
@@ -103,19 +103,6 @@
 #  define ARMCRC32
 #endif
 
-/* Local functions. */
-local z_crc_t multmodp OF((z_crc_t a, z_crc_t b));
-local z_crc_t x2nmodp OF((z_off64_t n, unsigned k));
-
-#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE))
-    local z_word_t byte_swap OF((z_word_t word));
-#endif
-
-#if defined(W) && !defined(ARMCRC32)
-    local z_crc_t crc_word OF((z_word_t data));
-    local z_word_t crc_word_big OF((z_word_t data));
-#endif
-
 #if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE))
 /*
   Swap the bytes in a z_word_t to convert between little and big endian. Any
@@ -123,9 +110,7 @@ local z_crc_t x2nmodp OF((z_off64_t n, u
   instruction, if one is available. This assumes that word_t is either 32 bits
   or 64 bits.
  */
-local z_word_t byte_swap(word)
-    z_word_t word;
-{
+local z_word_t byte_swap(z_word_t word) {
 #  if W == 8
     return
         (word & 0xff00000000000000) >> 56 |
@@ -146,24 +131,77 @@ local z_word_t byte_swap(word)
 }
 #endif
 
+#ifdef DYNAMIC_CRC_TABLE
+/* =========================================================================
+ * Table of powers of x for combining CRC-32s, filled in by make_crc_table()
+ * below.
+ */
+   local z_crc_t FAR x2n_table[32];
+#else
+/* =========================================================================
+ * Tables for byte-wise and braided CRC-32 calculations, and a table of powers
+ * of x for combining CRC-32s, all made by make_crc_table().
+ */
+#  include "crc32.h"
+#endif
+
 /* CRC polynomial. */
 #define POLY 0xedb88320         /* p(x) reflected, with x^32 implied */
 
-#ifdef DYNAMIC_CRC_TABLE
+/*
+  Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial,
+  reflected. For speed, this requires that a not be zero.
+ */
+local z_crc_t multmodp(z_crc_t a, z_crc_t b) {
+    z_crc_t m, p;
+
+    m = (z_crc_t)1 << 31;
+    p = 0;
+    for (;;) {
+        if (a & m) {
+            p ^= b;
+            if ((a & (m - 1)) == 0)
+                break;
+        }
+        m >>= 1;
+        b = b & 1 ? (b >> 1) ^ POLY : b >> 1;
+    }
+    return p;
+}
 
+/*
+  Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been
+  initialized.
+ */
+local z_crc_t x2nmodp(z_off64_t n, unsigned k) {
+    z_crc_t p;
+
+    p = (z_crc_t)1 << 31;           /* x^0 == 1 */
+    while (n) {
+        if (n & 1)
+            p = multmodp(x2n_table[k & 31], p);
+        n >>= 1;
+        k++;
+    }
+    return p;
+}
+
+#ifdef DYNAMIC_CRC_TABLE
+/* =========================================================================
+ * Build the tables for byte-wise and braided CRC-32 calculations, and a table
+ * of powers of x for combining CRC-32s.
+ */
 local z_crc_t FAR crc_table[256];
-local z_crc_t FAR x2n_table[32];
-local void make_crc_table OF((void));
 #ifdef W
    local z_word_t FAR crc_big_table[256];
    local z_crc_t FAR crc_braid_table[W][256];
    local z_word_t FAR crc_braid_big_table[W][256];
-   local void braid OF((z_crc_t [][256], z_word_t [][256], int, int));
+   local void braid(z_crc_t [][256], z_word_t [][256], int, int);
 #endif
 #ifdef MAKECRCH
-   local void write_table OF((FILE *, const z_crc_t FAR *, int));
-   local void write_table32hi OF((FILE *, const z_word_t FAR *, int));
-   local void write_table64 OF((FILE *, const z_word_t FAR *, int));
+   local void write_table(FILE *, const z_crc_t FAR *, int);
+   local void write_table32hi(FILE *, const z_word_t FAR *, int);
+   local void write_table64(FILE *, const z_word_t FAR *, int);
 #endif /* MAKECRCH */
 
 /*
@@ -176,7 +214,6 @@ local void make_crc_table OF((void));
 
 /* Definition of once functionality. */
 typedef struct once_s once_t;
-local void once OF((once_t *, void (*)(void)));
 
 /* Check for the availability of atomics. */
 #if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \
@@ -196,10 +233,7 @@ struct once_s {
   invoke once() at the same time. The state must be a once_t initialized with
   ONCE_INIT.
  */
-local void once(state, init)
-    once_t *state;
-    void (*init)(void);
-{
+local void once(once_t *state, void (*init)(void)) {
     if (!atomic_load(&state->done)) {
         if (atomic_flag_test_and_set(&state->begun))
             while (!atomic_load(&state->done))
@@ -222,10 +256,7 @@ struct once_s {
 
 /* Test and set. Alas, not atomic, but tries to minimize the period of
    vulnerability. */
-local int test_and_set OF((int volatile *));
-local int test_and_set(flag)
-    int volatile *flag;
-{
+local int test_and_set(int volatile *flag) {
     int was;
 
     was = *flag;
@@ -234,10 +265,7 @@ local int test_and_set(flag)
 }
 
 /* Run the provided init() function once. This is not thread-safe. */
-local void once(state, init)
-    once_t *state;
-    void (*init)(void);
-{
+local void once(once_t *state, void (*init)(void)) {
     if (!state->done) {
         if (test_and_set(&state->begun))
             while (!state->done)
@@ -279,8 +307,7 @@ local once_t made = ONCE_INIT;
   combinations of CRC register values and incoming bytes.
  */
 
-local void make_crc_table()
-{
+local void make_crc_table(void) {
     unsigned i, j, n;
     z_crc_t p;
 
@@ -447,11 +474,7 @@ local void make_crc_table()
    Write the 32-bit values in table[0..k-1] to out, five per line in
    hexadecimal separated by commas.
  */
-local void write_table(out, table, k)
-    FILE *out;
-    const z_crc_t FAR *table;
-    int k;
-{
+local void write_table(FILE *out, const z_crc_t FAR *table, int k) {
     int n;
 
     for (n = 0; n < k; n++)
@@ -464,11 +487,7 @@ local void write_table(out, table, k)
    Write the high 32-bits of each value in table[0..k-1] to out, five per line
    in hexadecimal separated by commas.
  */
-local void write_table32hi(out, table, k)
-FILE *out;
-const z_word_t FAR *table;
-int k;
-{
+local void write_table32hi(FILE *out, const z_word_t FAR *table, int k) {
     int n;
 
     for (n = 0; n < k; n++)
@@ -484,11 +503,7 @@ int k;
   bits. If not, then the type cast and format string can be adjusted
   accordingly.
  */
-local void write_table64(out, table, k)
-    FILE *out;
-    const z_word_t FAR *table;
-    int k;
-{
+local void write_table64(FILE *out, const z_word_t FAR *table, int k) {
     int n;
 
     for (n = 0; n < k; n++)
@@ -498,8 +513,7 @@ local void write_table64(out, table, k)
 }
 
 /* Actually do the deed. */
-int main()
-{
+int main(void) {
     make_crc_table();
     return 0;
 }
@@ -511,12 +525,7 @@ int main()
   Generate the little and big-endian braid tables for the given n and z_word_t
   size w. Each array must have room for w blocks of 256 elements.
  */
-local void braid(ltl, big, n, w)
-    z_crc_t ltl[][256];
-    z_word_t big[][256];
-    int n;
-    int w;
-{
+local void braid(z_crc_t ltl[][256], z_word_t big[][256], int n, int w) {
     int k;
     z_crc_t i, p, q;
     for (k = 0; k < w; k++) {
@@ -531,69 +540,13 @@ local void braid(ltl, big, n, w)
 }
 #endif
 
-#else /* !DYNAMIC_CRC_TABLE */
-/* ========================================================================
- * Tables for byte-wise and braided CRC-32 calculations, and a table of powers
- * of x for combining CRC-32s, all made by make_crc_table().
- */
-#include "crc32.h"
 #endif /* DYNAMIC_CRC_TABLE */
 
-/* ========================================================================
- * Routines used for CRC calculation. Some are also required for the table
- * generation above.
- */
-
-/*
-  Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial,
-  reflected. For speed, this requires that a not be zero.
- */
-local z_crc_t multmodp(a, b)
-    z_crc_t a;
-    z_crc_t b;
-{
-    z_crc_t m, p;
-
-    m = (z_crc_t)1 << 31;
-    p = 0;
-    for (;;) {
-        if (a & m) {
-            p ^= b;
-            if ((a & (m - 1)) == 0)
-                break;
-        }
-        m >>= 1;
-        b = b & 1 ? (b >> 1) ^ POLY : b >> 1;
-    }
-    return p;
-}
-
-/*
-  Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been
-  initialized.
- */
-local z_crc_t x2nmodp(n, k)
-    z_off64_t n;
-    unsigned k;
-{
-    z_crc_t p;
-
-    p = (z_crc_t)1 << 31;           /* x^0 == 1 */
-    while (n) {
-        if (n & 1)
-            p = multmodp(x2n_table[k & 31], p);
-        n >>= 1;
-        k++;
-    }
-    return p;
-}
-
 /* =========================================================================
  * This function can be used by asm versions of crc32(), and to force the
  * generation of the CRC tables in a threaded application.
  */
-const z_crc_t FAR * ZEXPORT get_crc_table()
-{
+const z_crc_t FAR * ZEXPORT get_crc_table(void) {
 #ifdef DYNAMIC_CRC_TABLE
     once(&made, make_crc_table);
 #endif /* DYNAMIC_CRC_TABLE */
@@ -619,11 +572,8 @@ const z_crc_t FAR * ZEXPORT get_crc_tabl
 #define Z_BATCH_ZEROS 0xa10d3d0c    /* computed from Z_BATCH = 3990 */
 #define Z_BATCH_MIN 800             /* fewest words in a final batch */
 
-unsigned long ZEXPORT crc32_z(crc, buf, len)
-    unsigned long crc;
-    const unsigned char FAR *buf;
-    z_size_t len;
-{
+unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,
+                              z_size_t len) {
     z_crc_t val;
     z_word_t crc1, crc2;
     const z_word_t *word;
@@ -723,18 +673,14 @@ unsigned long ZEXPORT crc32_z(crc, buf,
   least-significant byte of the word as the first byte of data, without any pre
   or post conditioning. This is used to combine the CRCs of each braid.
  */
-local z_crc_t crc_word(data)
-    z_word_t data;
-{
+local z_crc_t crc_word(z_word_t data) {
     int k;
     for (k = 0; k < W; k++)
         data = (data >> 8) ^ crc_table[data & 0xff];
     return (z_crc_t)data;
 }
 
-local z_word_t crc_word_big(data)
-    z_word_t data;
-{
+local z_word_t crc_word_big(z_word_t data) {
     int k;
     for (k = 0; k < W; k++)
         data = (data << 8) ^
@@ -745,11 +691,8 @@ local z_word_t crc_word_big(data)
 #endif
 
 /* ========================================================================= */
-unsigned long ZEXPORT crc32_z(crc, buf, len)
-    unsigned long crc;
-    const unsigned char FAR *buf;
-    z_size_t len;
-{
+unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,
+                              z_size_t len) {
     /* Return initial CRC, if requested. */
     if (buf == Z_NULL) return 0;
 
@@ -781,8 +724,8 @@ unsigned long ZEXPORT crc32_z(crc, buf,
         words = (z_word_t const *)buf;
 
         /* Do endian check at execution time instead of compile time, since ARM
-           processors can change the endianess at execution time. If the
-           compiler knows what the endianess will be, it can optimize out the
+           processors can change the endianness at execution time. If the
+           compiler knows what the endianness will be, it can optimize out the
            check and the unused branch. */
         endian = 1;
         if (*(unsigned char *)&endian) {
@@ -1069,20 +1012,13 @@ unsigned long ZEXPORT crc32_z(crc, buf,
 #endif
 
 /* ========================================================================= */
-unsigned long ZEXPORT crc32(crc, buf, len)
-    unsigned long crc;
-    const unsigned char FAR *buf;
-    uInt len;
-{
+unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf,
+                            uInt len) {
     return crc32_z(crc, buf, len);
 }
 
 /* ========================================================================= */
-uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
-    uLong crc1;
-    uLong crc2;
-    z_off64_t len2;
-{
+uLong ZEXPORT crc32_combine64(uLong crc1, uLong crc2, z_off64_t len2) {
 #ifdef DYNAMIC_CRC_TABLE
     once(&made, make_crc_table);
 #endif /* DYNAMIC_CRC_TABLE */
@@ -1090,18 +1026,12 @@ uLong ZEXPORT crc32_combine64(crc1, crc2
 }
 
 /* ========================================================================= */
-uLong ZEXPORT crc32_combine(crc1, crc2, len2)
-    uLong crc1;
-    uLong crc2;
-    z_off_t len2;
-{
+uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2) {
     return crc32_combine64(crc1, crc2, (z_off64_t)len2);
 }
 
 /* ========================================================================= */
-uLong ZEXPORT crc32_combine_gen64(len2)
-    z_off64_t len2;
-{
+uLong ZEXPORT crc32_combine_gen64(z_off64_t len2) {
 #ifdef DYNAMIC_CRC_TABLE
     once(&made, make_crc_table);
 #endif /* DYNAMIC_CRC_TABLE */
@@ -1109,17 +1039,11 @@ uLong ZEXPORT crc32_combine_gen64(len2)
 }
 
 /* ========================================================================= */
-uLong ZEXPORT crc32_combine_gen(len2)
-    z_off_t len2;
-{
+uLong ZEXPORT crc32_combine_gen(z_off_t len2) {
     return crc32_combine_gen64((z_off64_t)len2);
 }
 
 /* ========================================================================= */
-uLong ZEXPORT crc32_combine_op(crc1, crc2, op)
-    uLong crc1;
-    uLong crc2;
-    uLong op;
-{
+uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op) {
     return multmodp(op, crc1) ^ (crc2 & 0xffffffff);
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/deflate.c 5.15.17+dfsg-1/src/3rdparty/zlib/src/deflate.c
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/deflate.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/deflate.c	2024-11-20 13:56:33.000000000 +0000
@@ -1,5 +1,5 @@
 /* deflate.c -- compress data using the deflation algorithm
- * Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
+ * Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -52,7 +52,7 @@
 #include "deflate.h"
 
 const char deflate_copyright[] =
-   " deflate 1.2.13 Copyright 1995-2022 Jean-loup Gailly and Mark Adler ";
+   " deflate 1.3.1 Copyright 1995-2024 Jean-loup Gailly and Mark Adler ";
 /*
   If you use the zlib library in a product, an acknowledgment is welcome
   in the documentation of your product. If for some reason you cannot
@@ -60,9 +60,6 @@ const char deflate_copyright[] =
   copyright string in the executable of your product.
  */
 
-/* ===========================================================================
- *  Function prototypes.
- */
 typedef enum {
     need_more,      /* block not completed, need more input or more output */
     block_done,     /* block flush performed */
@@ -70,29 +67,16 @@ typedef enum {
     finish_done     /* finish done, accept no more input or output */
 } block_state;
 
-typedef block_state (*compress_func) OF((deflate_state *s, int flush));
+typedef block_state (*compress_func)(deflate_state *s, int flush);
 /* Compression function. Returns the block state after the call. */
 
-local int deflateStateCheck      OF((z_streamp strm));
-local void slide_hash     OF((deflate_state *s));
-local void fill_window    OF((deflate_state *s));
-local block_state deflate_stored OF((deflate_state *s, int flush));
-local block_state deflate_fast   OF((deflate_state *s, int flush));
+local block_state deflate_stored(deflate_state *s, int flush);
+local block_state deflate_fast(deflate_state *s, int flush);
 #ifndef FASTEST
-local block_state deflate_slow   OF((deflate_state *s, int flush));
-#endif
-local block_state deflate_rle    OF((deflate_state *s, int flush));
-local block_state deflate_huff   OF((deflate_state *s, int flush));
-local void lm_init        OF((deflate_state *s));
-local void putShortMSB    OF((deflate_state *s, uInt b));
-local void flush_pending  OF((z_streamp strm));
-local unsigned read_buf   OF((z_streamp strm, Bytef *buf, unsigned size));
-local uInt longest_match  OF((deflate_state *s, IPos cur_match));
-
-#ifdef ZLIB_DEBUG
-local  void check_match OF((deflate_state *s, IPos start, IPos match,
-                            int length));
+local block_state deflate_slow(deflate_state *s, int flush);
 #endif
+local block_state deflate_rle(deflate_state *s, int flush);
+local block_state deflate_huff(deflate_state *s, int flush);
 
 /* ===========================================================================
  * Local data
@@ -195,9 +179,12 @@ local const config configuration_table[1
  * bit values at the expense of memory usage). We slide even when level == 0 to
  * keep the hash table consistent if we switch back to level > 0 later.
  */
-local void slide_hash(s)
-    deflate_state *s;
-{
+#if defined(__has_feature)
+#  if __has_feature(memory_sanitizer)
+     __attribute__((no_sanitize("memory")))
+#  endif
+#endif
+local void slide_hash(deflate_state *s) {
     unsigned n, m;
     Posf *p;
     uInt wsize = s->w_size;
@@ -221,30 +208,177 @@ local void slide_hash(s)
 #endif
 }
 
+/* ===========================================================================
+ * Read a new buffer from the current input stream, update the adler32
+ * and total number of bytes read.  All deflate() input goes through
+ * this function so some applications may wish to modify it to avoid
+ * allocating a large strm->next_in buffer and copying from it.
+ * (See also flush_pending()).
+ */
+local unsigned read_buf(z_streamp strm, Bytef *buf, unsigned size) {
+    unsigned len = strm->avail_in;
+
+    if (len > size) len = size;
+    if (len == 0) return 0;
+
+    strm->avail_in  -= len;
+
+    zmemcpy(buf, strm->next_in, len);
+    if (strm->state->wrap == 1) {
+        strm->adler = adler32(strm->adler, buf, len);
+    }
+#ifdef GZIP
+    else if (strm->state->wrap == 2) {
+        strm->adler = crc32(strm->adler, buf, len);
+    }
+#endif
+    strm->next_in  += len;
+    strm->total_in += len;
+
+    return len;
+}
+
+/* ===========================================================================
+ * Fill the window when the lookahead becomes insufficient.
+ * Updates strstart and lookahead.
+ *
+ * IN assertion: lookahead < MIN_LOOKAHEAD
+ * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
+ *    At least one byte has been read, or avail_in == 0; reads are
+ *    performed for at least two bytes (required for the zip translate_eol
+ *    option -- not supported here).
+ */
+local void fill_window(deflate_state *s) {
+    unsigned n;
+    unsigned more;    /* Amount of free space at the end of the window. */
+    uInt wsize = s->w_size;
+
+    Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
+
+    do {
+        more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
+
+        /* Deal with !@#$% 64K limit: */
+        if (sizeof(int) <= 2) {
+            if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
+                more = wsize;
+
+            } else if (more == (unsigned)(-1)) {
+                /* Very unlikely, but possible on 16 bit machine if
+                 * strstart == 0 && lookahead == 1 (input done a byte at time)
+                 */
+                more--;
+            }
+        }
+
+        /* If the window is almost full and there is insufficient lookahead,
+         * move the upper half to the lower one to make room in the upper half.
+         */
+        if (s->strstart >= wsize + MAX_DIST(s)) {
+
+            zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more);
+            s->match_start -= wsize;
+            s->strstart    -= wsize; /* we now have strstart >= MAX_DIST */
+            s->block_start -= (long) wsize;
+            if (s->insert > s->strstart)
+                s->insert = s->strstart;
+            slide_hash(s);
+            more += wsize;
+        }
+        if (s->strm->avail_in == 0) break;
+
+        /* If there was no sliding:
+         *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
+         *    more == window_size - lookahead - strstart
+         * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
+         * => more >= window_size - 2*WSIZE + 2
+         * In the BIG_MEM or MMAP case (not yet supported),
+         *   window_size == input_size + MIN_LOOKAHEAD  &&
+         *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
+         * Otherwise, window_size == 2*WSIZE so more >= 2.
+         * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
+         */
+        Assert(more >= 2, "more < 2");
+
+        n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
+        s->lookahead += n;
+
+        /* Initialize the hash value now that we have some input: */
+        if (s->lookahead + s->insert >= MIN_MATCH) {
+            uInt str = s->strstart - s->insert;
+            s->ins_h = s->window[str];
+            UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
+#if MIN_MATCH != 3
+            Call UPDATE_HASH() MIN_MATCH-3 more times
+#endif
+            while (s->insert) {
+                UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
+#ifndef FASTEST
+                s->prev[str & s->w_mask] = s->head[s->ins_h];
+#endif
+                s->head[s->ins_h] = (Pos)str;
+                str++;
+                s->insert--;
+                if (s->lookahead + s->insert < MIN_MATCH)
+                    break;
+            }
+        }
+        /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
+         * but this is not important since only literal bytes will be emitted.
+         */
+
+    } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
+
+    /* If the WIN_INIT bytes after the end of the current data have never been
+     * written, then zero those bytes in order to avoid memory check reports of
+     * the use of uninitialized (or uninitialised as Julian writes) bytes by
+     * the longest match routines.  Update the high water mark for the next
+     * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
+     * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
+     */
+    if (s->high_water < s->window_size) {
+        ulg curr = s->strstart + (ulg)(s->lookahead);
+        ulg init;
+
+        if (s->high_water < curr) {
+            /* Previous high water mark below current data -- zero WIN_INIT
+             * bytes or up to end of window, whichever is less.
+             */
+            init = s->window_size - curr;
+            if (init > WIN_INIT)
+                init = WIN_INIT;
+            zmemzero(s->window + curr, (unsigned)init);
+            s->high_water = curr + init;
+        }
+        else if (s->high_water < (ulg)curr + WIN_INIT) {
+            /* High water mark at or above current data, but below current data
+             * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
+             * to end of window, whichever is less.
+             */
+            init = (ulg)curr + WIN_INIT - s->high_water;
+            if (init > s->window_size - s->high_water)
+                init = s->window_size - s->high_water;
+            zmemzero(s->window + s->high_water, (unsigned)init);
+            s->high_water += init;
+        }
+    }
+
+    Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+           "not enough room for search");
+}
+
 /* ========================================================================= */
-int ZEXPORT deflateInit_(strm, level, version, stream_size)
-    z_streamp strm;
-    int level;
-    const char *version;
-    int stream_size;
-{
+int ZEXPORT deflateInit_(z_streamp strm, int level, const char *version,
+                         int stream_size) {
     return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
                          Z_DEFAULT_STRATEGY, version, stream_size);
     /* To do: ignore strm->next_in if we use it as window */
 }
 
 /* ========================================================================= */
-int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
-                  version, stream_size)
-    z_streamp strm;
-    int  level;
-    int  method;
-    int  windowBits;
-    int  memLevel;
-    int  strategy;
-    const char *version;
-    int stream_size;
-{
+int ZEXPORT deflateInit2_(z_streamp strm, int level, int method,
+                          int windowBits, int memLevel, int strategy,
+                          const char *version, int stream_size) {
     deflate_state *s;
     int wrap = 1;
     static const char my_version[] = ZLIB_VERSION;
@@ -359,7 +493,7 @@ int ZEXPORT deflateInit2_(strm, level, m
      * symbols from which it is being constructed.
      */
 
-    s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4);
+    s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, LIT_BUFS);
     s->pending_buf_size = (ulg)s->lit_bufsize * 4;
 
     if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
@@ -369,8 +503,14 @@ int ZEXPORT deflateInit2_(strm, level, m
         deflateEnd (strm);
         return Z_MEM_ERROR;
     }
+#ifdef LIT_MEM
+    s->d_buf = (ushf *)(s->pending_buf + (s->lit_bufsize << 1));
+    s->l_buf = s->pending_buf + (s->lit_bufsize << 2);
+    s->sym_end = s->lit_bufsize - 1;
+#else
     s->sym_buf = s->pending_buf + s->lit_bufsize;
     s->sym_end = (s->lit_bufsize - 1) * 3;
+#endif
     /* We avoid equality with lit_bufsize*3 because of wraparound at 64K
      * on 16 bit machines and because stored blocks are restricted to
      * 64K-1 bytes.
@@ -386,9 +526,7 @@ int ZEXPORT deflateInit2_(strm, level, m
 /* =========================================================================
  * Check for a valid deflate stream state. Return 0 if ok, 1 if not.
  */
-local int deflateStateCheck(strm)
-    z_streamp strm;
-{
+local int deflateStateCheck(z_streamp strm) {
     deflate_state *s;
     if (strm == Z_NULL ||
         strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
@@ -409,11 +547,8 @@ local int deflateStateCheck(strm)
 }
 
 /* ========================================================================= */
-int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength)
-    z_streamp strm;
-    const Bytef *dictionary;
-    uInt  dictLength;
-{
+int ZEXPORT deflateSetDictionary(z_streamp strm, const Bytef *dictionary,
+                                 uInt  dictLength) {
     deflate_state *s;
     uInt str, n;
     int wrap;
@@ -478,11 +613,8 @@ int ZEXPORT deflateSetDictionary(strm, d
 }
 
 /* ========================================================================= */
-int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength)
-    z_streamp strm;
-    Bytef *dictionary;
-    uInt  *dictLength;
-{
+int ZEXPORT deflateGetDictionary(z_streamp strm, Bytef *dictionary,
+                                 uInt *dictLength) {
     deflate_state *s;
     uInt len;
 
@@ -500,9 +632,7 @@ int ZEXPORT deflateGetDictionary(strm, d
 }
 
 /* ========================================================================= */
-int ZEXPORT deflateResetKeep(strm)
-    z_streamp strm;
-{
+int ZEXPORT deflateResetKeep(z_streamp strm) {
     deflate_state *s;
 
     if (deflateStateCheck(strm)) {
@@ -537,10 +667,32 @@ int ZEXPORT deflateResetKeep(strm)
     return Z_OK;
 }
 
+/* ===========================================================================
+ * Initialize the "longest match" routines for a new zlib stream
+ */
+local void lm_init(deflate_state *s) {
+    s->window_size = (ulg)2L*s->w_size;
+
+    CLEAR_HASH(s);
+
+    /* Set the default configuration parameters:
+     */
+    s->max_lazy_match   = configuration_table[s->level].max_lazy;
+    s->good_match       = configuration_table[s->level].good_length;
+    s->nice_match       = configuration_table[s->level].nice_length;
+    s->max_chain_length = configuration_table[s->level].max_chain;
+
+    s->strstart = 0;
+    s->block_start = 0L;
+    s->lookahead = 0;
+    s->insert = 0;
+    s->match_length = s->prev_length = MIN_MATCH-1;
+    s->match_available = 0;
+    s->ins_h = 0;
+}
+
 /* ========================================================================= */
-int ZEXPORT deflateReset(strm)
-    z_streamp strm;
-{
+int ZEXPORT deflateReset(z_streamp strm) {
     int ret;
 
     ret = deflateResetKeep(strm);
@@ -550,10 +702,7 @@ int ZEXPORT deflateReset(strm)
 }
 
 /* ========================================================================= */
-int ZEXPORT deflateSetHeader(strm, head)
-    z_streamp strm;
-    gz_headerp head;
-{
+int ZEXPORT deflateSetHeader(z_streamp strm, gz_headerp head) {
     if (deflateStateCheck(strm) || strm->state->wrap != 2)
         return Z_STREAM_ERROR;
     strm->state->gzhead = head;
@@ -561,11 +710,7 @@ int ZEXPORT deflateSetHeader(strm, head)
 }
 
 /* ========================================================================= */
-int ZEXPORT deflatePending(strm, pending, bits)
-    unsigned *pending;
-    int *bits;
-    z_streamp strm;
-{
+int ZEXPORT deflatePending(z_streamp strm, unsigned *pending, int *bits) {
     if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
     if (pending != Z_NULL)
         *pending = strm->state->pending;
@@ -575,19 +720,21 @@ int ZEXPORT deflatePending(strm, pending
 }
 
 /* ========================================================================= */
-int ZEXPORT deflatePrime(strm, bits, value)
-    z_streamp strm;
-    int bits;
-    int value;
-{
+int ZEXPORT deflatePrime(z_streamp strm, int bits, int value) {
     deflate_state *s;
     int put;
 
     if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
     s = strm->state;
+#ifdef LIT_MEM
+    if (bits < 0 || bits > 16 ||
+        (uchf *)s->d_buf < s->pending_out + ((Buf_size + 7) >> 3))
+        return Z_BUF_ERROR;
+#else
     if (bits < 0 || bits > 16 ||
         s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3))
         return Z_BUF_ERROR;
+#endif
     do {
         put = Buf_size - s->bi_valid;
         if (put > bits)
@@ -602,11 +749,7 @@ int ZEXPORT deflatePrime(strm, bits, val
 }
 
 /* ========================================================================= */
-int ZEXPORT deflateParams(strm, level, strategy)
-    z_streamp strm;
-    int level;
-    int strategy;
-{
+int ZEXPORT deflateParams(z_streamp strm, int level, int strategy) {
     deflate_state *s;
     compress_func func;
 
@@ -651,13 +794,8 @@ int ZEXPORT deflateParams(strm, level, s
 }
 
 /* ========================================================================= */
-int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)
-    z_streamp strm;
-    int good_length;
-    int max_lazy;
-    int nice_length;
-    int max_chain;
-{
+int ZEXPORT deflateTune(z_streamp strm, int good_length, int max_lazy,
+                        int nice_length, int max_chain) {
     deflate_state *s;
 
     if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
@@ -693,10 +831,7 @@ int ZEXPORT deflateTune(strm, good_lengt
  *
  * Shifts are used to approximate divisions, for speed.
  */
-uLong ZEXPORT deflateBound(strm, sourceLen)
-    z_streamp strm;
-    uLong sourceLen;
-{
+uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen) {
     deflate_state *s;
     uLong fixedlen, storelen, wraplen;
 
@@ -752,7 +887,8 @@ uLong ZEXPORT deflateBound(strm, sourceL
 
     /* if not default parameters, return one of the conservative bounds */
     if (s->w_bits != 15 || s->hash_bits != 8 + 7)
-        return (s->w_bits <= s->hash_bits ? fixedlen : storelen) + wraplen;
+        return (s->w_bits <= s->hash_bits && s->level ? fixedlen : storelen) +
+               wraplen;
 
     /* default settings: return tight bound for that case -- ~0.03% overhead
        plus a small constant */
@@ -765,10 +901,7 @@ uLong ZEXPORT deflateBound(strm, sourceL
  * IN assertion: the stream state is correct and there is enough room in
  * pending_buf.
  */
-local void putShortMSB(s, b)
-    deflate_state *s;
-    uInt b;
-{
+local void putShortMSB(deflate_state *s, uInt b) {
     put_byte(s, (Byte)(b >> 8));
     put_byte(s, (Byte)(b & 0xff));
 }
@@ -779,9 +912,7 @@ local void putShortMSB(s, b)
  * applications may wish to modify it to avoid allocating a large
  * strm->next_out buffer and copying into it. (See also read_buf()).
  */
-local void flush_pending(strm)
-    z_streamp strm;
-{
+local void flush_pending(z_streamp strm) {
     unsigned len;
     deflate_state *s = strm->state;
 
@@ -812,10 +943,7 @@ local void flush_pending(strm)
     } while (0)
 
 /* ========================================================================= */
-int ZEXPORT deflate(strm, flush)
-    z_streamp strm;
-    int flush;
-{
+int ZEXPORT deflate(z_streamp strm, int flush) {
     int old_flush; /* value of flush param for previous deflate call */
     deflate_state *s;
 
@@ -1127,9 +1255,7 @@ int ZEXPORT deflate(strm, flush)
 }
 
 /* ========================================================================= */
-int ZEXPORT deflateEnd(strm)
-    z_streamp strm;
-{
+int ZEXPORT deflateEnd(z_streamp strm) {
     int status;
 
     if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
@@ -1153,11 +1279,10 @@ int ZEXPORT deflateEnd(strm)
  * To simplify the source, this is not supported for 16-bit MSDOS (which
  * doesn't have enough memory anyway to duplicate compression states).
  */
-int ZEXPORT deflateCopy(dest, source)
-    z_streamp dest;
-    z_streamp source;
-{
+int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) {
 #ifdef MAXSEG_64K
+    (void)dest;
+    (void)source;
     return Z_STREAM_ERROR;
 #else
     deflate_state *ds;
@@ -1181,7 +1306,7 @@ int ZEXPORT deflateCopy(dest, source)
     ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
     ds->prev   = (Posf *)  ZALLOC(dest, ds->w_size, sizeof(Pos));
     ds->head   = (Posf *)  ZALLOC(dest, ds->hash_size, sizeof(Pos));
-    ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4);
+    ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, LIT_BUFS);
 
     if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
         ds->pending_buf == Z_NULL) {
@@ -1192,10 +1317,15 @@ int ZEXPORT deflateCopy(dest, source)
     zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
     zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));
     zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));
-    zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
+    zmemcpy(ds->pending_buf, ss->pending_buf, ds->lit_bufsize * LIT_BUFS);
 
     ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
+#ifdef LIT_MEM
+    ds->d_buf = (ushf *)(ds->pending_buf + (ds->lit_bufsize << 1));
+    ds->l_buf = ds->pending_buf + (ds->lit_bufsize << 2);
+#else
     ds->sym_buf = ds->pending_buf + ds->lit_bufsize;
+#endif
 
     ds->l_desc.dyn_tree = ds->dyn_ltree;
     ds->d_desc.dyn_tree = ds->dyn_dtree;
@@ -1205,66 +1335,6 @@ int ZEXPORT deflateCopy(dest, source)
 #endif /* MAXSEG_64K */
 }
 
-/* ===========================================================================
- * Read a new buffer from the current input stream, update the adler32
- * and total number of bytes read.  All deflate() input goes through
- * this function so some applications may wish to modify it to avoid
- * allocating a large strm->next_in buffer and copying from it.
- * (See also flush_pending()).
- */
-local unsigned read_buf(strm, buf, size)
-    z_streamp strm;
-    Bytef *buf;
-    unsigned size;
-{
-    unsigned len = strm->avail_in;
-
-    if (len > size) len = size;
-    if (len == 0) return 0;
-
-    strm->avail_in  -= len;
-
-    zmemcpy(buf, strm->next_in, len);
-    if (strm->state->wrap == 1) {
-        strm->adler = adler32(strm->adler, buf, len);
-    }
-#ifdef GZIP
-    else if (strm->state->wrap == 2) {
-        strm->adler = crc32(strm->adler, buf, len);
-    }
-#endif
-    strm->next_in  += len;
-    strm->total_in += len;
-
-    return len;
-}
-
-/* ===========================================================================
- * Initialize the "longest match" routines for a new zlib stream
- */
-local void lm_init(s)
-    deflate_state *s;
-{
-    s->window_size = (ulg)2L*s->w_size;
-
-    CLEAR_HASH(s);
-
-    /* Set the default configuration parameters:
-     */
-    s->max_lazy_match   = configuration_table[s->level].max_lazy;
-    s->good_match       = configuration_table[s->level].good_length;
-    s->nice_match       = configuration_table[s->level].nice_length;
-    s->max_chain_length = configuration_table[s->level].max_chain;
-
-    s->strstart = 0;
-    s->block_start = 0L;
-    s->lookahead = 0;
-    s->insert = 0;
-    s->match_length = s->prev_length = MIN_MATCH-1;
-    s->match_available = 0;
-    s->ins_h = 0;
-}
-
 #ifndef FASTEST
 /* ===========================================================================
  * Set match_start to the longest match starting at the given string and
@@ -1275,10 +1345,7 @@ local void lm_init(s)
  *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
  * OUT assertion: the match length is not greater than s->lookahead.
  */
-local uInt longest_match(s, cur_match)
-    deflate_state *s;
-    IPos cur_match;                             /* current match */
-{
+local uInt longest_match(deflate_state *s, IPos cur_match) {
     unsigned chain_length = s->max_chain_length;/* max hash chain length */
     register Bytef *scan = s->window + s->strstart; /* current string */
     register Bytef *match;                      /* matched string */
@@ -1426,10 +1493,7 @@ local uInt longest_match(s, cur_match)
 /* ---------------------------------------------------------------------------
  * Optimized version for FASTEST only
  */
-local uInt longest_match(s, cur_match)
-    deflate_state *s;
-    IPos cur_match;                             /* current match */
-{
+local uInt longest_match(deflate_state *s, IPos cur_match) {
     register Bytef *scan = s->window + s->strstart; /* current string */
     register Bytef *match;                       /* matched string */
     register int len;                           /* length of current match */
@@ -1490,19 +1554,23 @@ local uInt longest_match(s, cur_match)
 /* ===========================================================================
  * Check that the match at match_start is indeed a match.
  */
-local void check_match(s, start, match, length)
-    deflate_state *s;
-    IPos start, match;
-    int length;
-{
+local void check_match(deflate_state *s, IPos start, IPos match, int length) {
     /* check that the match is indeed a match */
-    if (zmemcmp(s->window + match,
-                s->window + start, length) != EQUAL) {
-        fprintf(stderr, " start %u, match %u, length %d\n",
-                start, match, length);
+    Bytef *back = s->window + (int)match, *here = s->window + start;
+    IPos len = length;
+    if (match == (IPos)-1) {
+        /* match starts one byte before the current window -- just compare the
+           subsequent length-1 bytes */
+        back++;
+        here++;
+        len--;
+    }
+    if (zmemcmp(back, here, len) != EQUAL) {
+        fprintf(stderr, " start %u, match %d, length %d\n",
+                start, (int)match, length);
         do {
-            fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
-        } while (--length != 0);
+            fprintf(stderr, "(%02x %02x)", *back++, *here++);
+        } while (--len != 0);
         z_error("invalid match");
     }
     if (z_verbose > 1) {
@@ -1515,137 +1583,6 @@ local void check_match(s, start, match,
 #endif /* ZLIB_DEBUG */
 
 /* ===========================================================================
- * Fill the window when the lookahead becomes insufficient.
- * Updates strstart and lookahead.
- *
- * IN assertion: lookahead < MIN_LOOKAHEAD
- * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
- *    At least one byte has been read, or avail_in == 0; reads are
- *    performed for at least two bytes (required for the zip translate_eol
- *    option -- not supported here).
- */
-local void fill_window(s)
-    deflate_state *s;
-{
-    unsigned n;
-    unsigned more;    /* Amount of free space at the end of the window. */
-    uInt wsize = s->w_size;
-
-    Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
-
-    do {
-        more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
-
-        /* Deal with !@#$% 64K limit: */
-        if (sizeof(int) <= 2) {
-            if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
-                more = wsize;
-
-            } else if (more == (unsigned)(-1)) {
-                /* Very unlikely, but possible on 16 bit machine if
-                 * strstart == 0 && lookahead == 1 (input done a byte at time)
-                 */
-                more--;
-            }
-        }
-
-        /* If the window is almost full and there is insufficient lookahead,
-         * move the upper half to the lower one to make room in the upper half.
-         */
-        if (s->strstart >= wsize + MAX_DIST(s)) {
-
-            zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more);
-            s->match_start -= wsize;
-            s->strstart    -= wsize; /* we now have strstart >= MAX_DIST */
-            s->block_start -= (long) wsize;
-            if (s->insert > s->strstart)
-                s->insert = s->strstart;
-            slide_hash(s);
-            more += wsize;
-        }
-        if (s->strm->avail_in == 0) break;
-
-        /* If there was no sliding:
-         *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
-         *    more == window_size - lookahead - strstart
-         * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
-         * => more >= window_size - 2*WSIZE + 2
-         * In the BIG_MEM or MMAP case (not yet supported),
-         *   window_size == input_size + MIN_LOOKAHEAD  &&
-         *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
-         * Otherwise, window_size == 2*WSIZE so more >= 2.
-         * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
-         */
-        Assert(more >= 2, "more < 2");
-
-        n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
-        s->lookahead += n;
-
-        /* Initialize the hash value now that we have some input: */
-        if (s->lookahead + s->insert >= MIN_MATCH) {
-            uInt str = s->strstart - s->insert;
-            s->ins_h = s->window[str];
-            UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
-#if MIN_MATCH != 3
-            Call UPDATE_HASH() MIN_MATCH-3 more times
-#endif
-            while (s->insert) {
-                UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
-#ifndef FASTEST
-                s->prev[str & s->w_mask] = s->head[s->ins_h];
-#endif
-                s->head[s->ins_h] = (Pos)str;
-                str++;
-                s->insert--;
-                if (s->lookahead + s->insert < MIN_MATCH)
-                    break;
-            }
-        }
-        /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
-         * but this is not important since only literal bytes will be emitted.
-         */
-
-    } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
-
-    /* If the WIN_INIT bytes after the end of the current data have never been
-     * written, then zero those bytes in order to avoid memory check reports of
-     * the use of uninitialized (or uninitialised as Julian writes) bytes by
-     * the longest match routines.  Update the high water mark for the next
-     * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
-     * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
-     */
-    if (s->high_water < s->window_size) {
-        ulg curr = s->strstart + (ulg)(s->lookahead);
-        ulg init;
-
-        if (s->high_water < curr) {
-            /* Previous high water mark below current data -- zero WIN_INIT
-             * bytes or up to end of window, whichever is less.
-             */
-            init = s->window_size - curr;
-            if (init > WIN_INIT)
-                init = WIN_INIT;
-            zmemzero(s->window + curr, (unsigned)init);
-            s->high_water = curr + init;
-        }
-        else if (s->high_water < (ulg)curr + WIN_INIT) {
-            /* High water mark at or above current data, but below current data
-             * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
-             * to end of window, whichever is less.
-             */
-            init = (ulg)curr + WIN_INIT - s->high_water;
-            if (init > s->window_size - s->high_water)
-                init = s->window_size - s->high_water;
-            zmemzero(s->window + s->high_water, (unsigned)init);
-            s->high_water += init;
-        }
-    }
-
-    Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
-           "not enough room for search");
-}
-
-/* ===========================================================================
  * Flush the current block, with given end-of-file flag.
  * IN assertion: strstart is set to the end of the current match.
  */
@@ -1687,10 +1624,7 @@ local void fill_window(s)
  * copied. It is most efficient with large input and output buffers, which
  * maximizes the opportunities to have a single copy from next_in to next_out.
  */
-local block_state deflate_stored(s, flush)
-    deflate_state *s;
-    int flush;
-{
+local block_state deflate_stored(deflate_state *s, int flush) {
     /* Smallest worthy block size when not flushing or finishing. By default
      * this is 32K. This can be as small as 507 bytes for memLevel == 1. For
      * large input and output buffers, the stored block size will be larger.
@@ -1874,10 +1808,7 @@ local block_state deflate_stored(s, flus
  * new strings in the dictionary only for unmatched strings or for short
  * matches. It is used only for the fast compression options.
  */
-local block_state deflate_fast(s, flush)
-    deflate_state *s;
-    int flush;
-{
+local block_state deflate_fast(deflate_state *s, int flush) {
     IPos hash_head;       /* head of the hash chain */
     int bflush;           /* set if current block must be flushed */
 
@@ -1976,10 +1907,7 @@ local block_state deflate_fast(s, flush)
  * evaluation for matches: a match is finally adopted only if there is
  * no better match at the next window position.
  */
-local block_state deflate_slow(s, flush)
-    deflate_state *s;
-    int flush;
-{
+local block_state deflate_slow(deflate_state *s, int flush) {
     IPos hash_head;          /* head of hash chain */
     int bflush;              /* set if current block must be flushed */
 
@@ -2107,10 +2035,7 @@ local block_state deflate_slow(s, flush)
  * one.  Do not maintain a hash table.  (It will be regenerated if this run of
  * deflate switches away from Z_RLE.)
  */
-local block_state deflate_rle(s, flush)
-    deflate_state *s;
-    int flush;
-{
+local block_state deflate_rle(deflate_state *s, int flush) {
     int bflush;             /* set if current block must be flushed */
     uInt prev;              /* byte at distance one to match */
     Bytef *scan, *strend;   /* scan goes up to strend for length of run */
@@ -2181,10 +2106,7 @@ local block_state deflate_rle(s, flush)
  * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.
  * (It will be regenerated if this run of deflate switches away from Huffman.)
  */
-local block_state deflate_huff(s, flush)
-    deflate_state *s;
-    int flush;
-{
+local block_state deflate_huff(deflate_state *s, int flush) {
     int bflush;             /* set if current block must be flushed */
 
     for (;;) {
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/deflate.h 5.15.17+dfsg-1/src/3rdparty/zlib/src/deflate.h
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/deflate.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/deflate.h	2024-11-20 13:56:33.000000000 +0000
@@ -1,5 +1,5 @@
 /* deflate.h -- internal compression state
- * Copyright (C) 1995-2018 Jean-loup Gailly
+ * Copyright (C) 1995-2024 Jean-loup Gailly
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -23,6 +23,10 @@
 #  define GZIP
 #endif
 
+/* define LIT_MEM to slightly increase the speed of deflate (order 1% to 2%) at
+   the cost of a larger memory footprint */
+/* #define LIT_MEM */
+
 /* ===========================================================================
  * Internal compression state.
  */
@@ -217,7 +221,14 @@ typedef struct internal_state {
     /* Depth of each subtree used as tie breaker for trees of equal frequency
      */
 
+#ifdef LIT_MEM
+#   define LIT_BUFS 5
+    ushf *d_buf;          /* buffer for distances */
+    uchf *l_buf;          /* buffer for literals/lengths */
+#else
+#   define LIT_BUFS 4
     uchf *sym_buf;        /* buffer for distances and literals/lengths */
+#endif
 
     uInt  lit_bufsize;
     /* Size of match buffer for literals/lengths.  There are 4 reasons for
@@ -239,7 +250,7 @@ typedef struct internal_state {
      *   - I can't count above 4
      */
 
-    uInt sym_next;      /* running index in sym_buf */
+    uInt sym_next;      /* running index in symbol buffer */
     uInt sym_end;       /* symbol table full when sym_next reaches this */
 
     ulg opt_len;        /* bit length of current block with optimal trees */
@@ -291,14 +302,14 @@ typedef struct internal_state {
    memory checker errors from longest match routines */
 
         /* in trees.c */
-void ZLIB_INTERNAL _tr_init OF((deflate_state *s));
-int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
-void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf,
-                        ulg stored_len, int last));
-void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s));
-void ZLIB_INTERNAL _tr_align OF((deflate_state *s));
-void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
-                        ulg stored_len, int last));
+void ZLIB_INTERNAL _tr_init(deflate_state *s);
+int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc);
+void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf,
+                                   ulg stored_len, int last);
+void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s);
+void ZLIB_INTERNAL _tr_align(deflate_state *s);
+void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf,
+                                    ulg stored_len, int last);
 
 #define d_code(dist) \
    ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
@@ -318,6 +329,25 @@ void ZLIB_INTERNAL _tr_stored_block OF((
   extern const uch ZLIB_INTERNAL _dist_code[];
 #endif
 
+#ifdef LIT_MEM
+# define _tr_tally_lit(s, c, flush) \
+  { uch cc = (c); \
+    s->d_buf[s->sym_next] = 0; \
+    s->l_buf[s->sym_next++] = cc; \
+    s->dyn_ltree[cc].Freq++; \
+    flush = (s->sym_next == s->sym_end); \
+   }
+# define _tr_tally_dist(s, distance, length, flush) \
+  { uch len = (uch)(length); \
+    ush dist = (ush)(distance); \
+    s->d_buf[s->sym_next] = dist; \
+    s->l_buf[s->sym_next++] = len; \
+    dist--; \
+    s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
+    s->dyn_dtree[d_code(dist)].Freq++; \
+    flush = (s->sym_next == s->sym_end); \
+  }
+#else
 # define _tr_tally_lit(s, c, flush) \
   { uch cc = (c); \
     s->sym_buf[s->sym_next++] = 0; \
@@ -337,6 +367,7 @@ void ZLIB_INTERNAL _tr_stored_block OF((
     s->dyn_dtree[d_code(dist)].Freq++; \
     flush = (s->sym_next == s->sym_end); \
   }
+#endif
 #else
 # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
 # define _tr_tally_dist(s, distance, length, flush) \
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/gzclose.c 5.15.17+dfsg-1/src/3rdparty/zlib/src/gzclose.c
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/gzclose.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/gzclose.c	2024-11-20 13:56:33.000000000 +0000
@@ -8,9 +8,7 @@
 /* gzclose() is in a separate file so that it is linked in only if it is used.
    That way the other gzclose functions can be used instead to avoid linking in
    unneeded compression or decompression routines. */
-int ZEXPORT gzclose(file)
-    gzFile file;
-{
+int ZEXPORT gzclose(gzFile file) {
 #ifndef NO_GZCOMPRESS
     gz_statep state;
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/gzguts.h 5.15.17+dfsg-1/src/3rdparty/zlib/src/gzguts.h
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/gzguts.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/gzguts.h	2024-11-20 13:56:33.000000000 +0000
@@ -1,5 +1,5 @@
 /* gzguts.h -- zlib internal header definitions for gz* operations
- * Copyright (C) 2004-2019 Mark Adler
+ * Copyright (C) 2004-2024 Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -26,9 +26,8 @@
 #  ifndef _LARGEFILE_SOURCE
 #    define _LARGEFILE_SOURCE 1
 #  endif
-#  ifdef _FILE_OFFSET_BITS
-#    undef _FILE_OFFSET_BITS
-#  endif
+#  undef _FILE_OFFSET_BITS
+#  undef _TIME_BITS
 #endif
 
 #ifdef HAVE_HIDDEN
@@ -138,8 +137,8 @@
 
 /* gz* functions always use library allocation functions */
 #ifndef STDC
-  extern voidp  malloc OF((uInt size));
-  extern void   free   OF((voidpf ptr));
+  extern voidp  malloc(uInt size);
+  extern void   free(voidpf ptr);
 #endif
 
 /* get errno and strerror definition */
@@ -157,10 +156,10 @@
 
 /* provide prototypes for these when building zlib without LFS */
 #if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0
-    ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
-    ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
-    ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
-    ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
+    ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *);
+    ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int);
+    ZEXTERN z_off64_t ZEXPORT gztell64(gzFile);
+    ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile);
 #endif
 
 /* default memLevel */
@@ -222,17 +221,13 @@ typedef struct {
 typedef gz_state FAR *gz_statep;
 
 /* shared functions */
-void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *));
+void ZLIB_INTERNAL gz_error(gz_statep, int, const char *);
 #if defined UNDER_CE
-char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error));
+char ZLIB_INTERNAL *gz_strwinerror(DWORD error);
 #endif
 
 /* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
    value -- needed when comparing unsigned to z_off64_t, which is signed
    (possible z_off64_t types off_t, off64_t, and long are all signed) */
-#ifdef INT_MAX
-#  define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
-#else
-unsigned ZLIB_INTERNAL gz_intmax OF((void));
-#  define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
-#endif
+unsigned ZLIB_INTERNAL gz_intmax(void);
+#define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/gzlib.c 5.15.17+dfsg-1/src/3rdparty/zlib/src/gzlib.c
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/gzlib.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/gzlib.c	2024-11-20 13:56:33.000000000 +0000
@@ -1,5 +1,5 @@
 /* gzlib.c -- zlib functions common to reading and writing gzip files
- * Copyright (C) 2004-2019 Mark Adler
+ * Copyright (C) 2004-2024 Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -15,10 +15,6 @@
 #endif
 #endif
 
-/* Local functions */
-local void gz_reset OF((gz_statep));
-local gzFile gz_open OF((const void *, int, const char *));
-
 #if defined UNDER_CE
 
 /* Map the Windows error number in ERROR to a locale-dependent error message
@@ -30,9 +26,7 @@ local gzFile gz_open OF((const void *, i
 
    The gz_strwinerror function does not change the current setting of
    GetLastError. */
-char ZLIB_INTERNAL *gz_strwinerror(error)
-     DWORD error;
-{
+char ZLIB_INTERNAL *gz_strwinerror(DWORD error) {
     static char buf[1024];
 
     wchar_t *msgbuf;
@@ -72,9 +66,7 @@ char ZLIB_INTERNAL *gz_strwinerror(error
 #endif /* UNDER_CE */
 
 /* Reset gzip file state */
-local void gz_reset(state)
-    gz_statep state;
-{
+local void gz_reset(gz_statep state) {
     state->x.have = 0;              /* no output data available */
     if (state->mode == GZ_READ) {   /* for reading ... */
         state->eof = 0;             /* not at end of file */
@@ -90,11 +82,7 @@ local void gz_reset(state)
 }
 
 /* Open a gzip file either by name or file descriptor. */
-local gzFile gz_open(path, fd, mode)
-    const void *path;
-    int fd;
-    const char *mode;
-{
+local gzFile gz_open(const void *path, int fd, const char *mode) {
     gz_statep state;
     z_size_t len;
     int oflag;
@@ -269,26 +257,17 @@ local gzFile gz_open(path, fd, mode)
 }
 
 /* -- see zlib.h -- */
-gzFile ZEXPORT gzopen(path, mode)
-    const char *path;
-    const char *mode;
-{
+gzFile ZEXPORT gzopen(const char *path, const char *mode) {
     return gz_open(path, -1, mode);
 }
 
 /* -- see zlib.h -- */
-gzFile ZEXPORT gzopen64(path, mode)
-    const char *path;
-    const char *mode;
-{
+gzFile ZEXPORT gzopen64(const char *path, const char *mode) {
     return gz_open(path, -1, mode);
 }
 
 /* -- see zlib.h -- */
-gzFile ZEXPORT gzdopen(fd, mode)
-    int fd;
-    const char *mode;
-{
+gzFile ZEXPORT gzdopen(int fd, const char *mode) {
     char *path;         /* identifier for error messages */
     gzFile gz;
 
@@ -306,19 +285,13 @@ gzFile ZEXPORT gzdopen(fd, mode)
 
 /* -- see zlib.h -- */
 #ifdef WIDECHAR
-gzFile ZEXPORT gzopen_w(path, mode)
-    const wchar_t *path;
-    const char *mode;
-{
+gzFile ZEXPORT gzopen_w(const wchar_t *path, const char *mode) {
     return gz_open(path, -2, mode);
 }
 #endif
 
 /* -- see zlib.h -- */
-int ZEXPORT gzbuffer(file, size)
-    gzFile file;
-    unsigned size;
-{
+int ZEXPORT gzbuffer(gzFile file, unsigned size) {
     gz_statep state;
 
     /* get internal structure and check integrity */
@@ -335,16 +308,14 @@ int ZEXPORT gzbuffer(file, size)
     /* check and set requested size */
     if ((size << 1) < size)
         return -1;              /* need to be able to double it */
-    if (size < 2)
-        size = 2;               /* need two bytes to check magic header */
+    if (size < 8)
+        size = 8;               /* needed to behave well with flushing */
     state->want = size;
     return 0;
 }
 
 /* -- see zlib.h -- */
-int ZEXPORT gzrewind(file)
-    gzFile file;
-{
+int ZEXPORT gzrewind(gzFile file) {
     gz_statep state;
 
     /* get internal structure */
@@ -365,11 +336,7 @@ int ZEXPORT gzrewind(file)
 }
 
 /* -- see zlib.h -- */
-z_off64_t ZEXPORT gzseek64(file, offset, whence)
-    gzFile file;
-    z_off64_t offset;
-    int whence;
-{
+z_off64_t ZEXPORT gzseek64(gzFile file, z_off64_t offset, int whence) {
     unsigned n;
     z_off64_t ret;
     gz_statep state;
@@ -442,11 +409,7 @@ z_off64_t ZEXPORT gzseek64(file, offset,
 }
 
 /* -- see zlib.h -- */
-z_off_t ZEXPORT gzseek(file, offset, whence)
-    gzFile file;
-    z_off_t offset;
-    int whence;
-{
+z_off_t ZEXPORT gzseek(gzFile file, z_off_t offset, int whence) {
     z_off64_t ret;
 
     ret = gzseek64(file, (z_off64_t)offset, whence);
@@ -454,9 +417,7 @@ z_off_t ZEXPORT gzseek(file, offset, whe
 }
 
 /* -- see zlib.h -- */
-z_off64_t ZEXPORT gztell64(file)
-    gzFile file;
-{
+z_off64_t ZEXPORT gztell64(gzFile file) {
     gz_statep state;
 
     /* get internal structure and check integrity */
@@ -471,9 +432,7 @@ z_off64_t ZEXPORT gztell64(file)
 }
 
 /* -- see zlib.h -- */
-z_off_t ZEXPORT gztell(file)
-    gzFile file;
-{
+z_off_t ZEXPORT gztell(gzFile file) {
     z_off64_t ret;
 
     ret = gztell64(file);
@@ -481,9 +440,7 @@ z_off_t ZEXPORT gztell(file)
 }
 
 /* -- see zlib.h -- */
-z_off64_t ZEXPORT gzoffset64(file)
-    gzFile file;
-{
+z_off64_t ZEXPORT gzoffset64(gzFile file) {
     z_off64_t offset;
     gz_statep state;
 
@@ -504,9 +461,7 @@ z_off64_t ZEXPORT gzoffset64(file)
 }
 
 /* -- see zlib.h -- */
-z_off_t ZEXPORT gzoffset(file)
-    gzFile file;
-{
+z_off_t ZEXPORT gzoffset(gzFile file) {
     z_off64_t ret;
 
     ret = gzoffset64(file);
@@ -514,9 +469,7 @@ z_off_t ZEXPORT gzoffset(file)
 }
 
 /* -- see zlib.h -- */
-int ZEXPORT gzeof(file)
-    gzFile file;
-{
+int ZEXPORT gzeof(gzFile file) {
     gz_statep state;
 
     /* get internal structure and check integrity */
@@ -531,10 +484,7 @@ int ZEXPORT gzeof(file)
 }
 
 /* -- see zlib.h -- */
-const char * ZEXPORT gzerror(file, errnum)
-    gzFile file;
-    int *errnum;
-{
+const char * ZEXPORT gzerror(gzFile file, int *errnum) {
     gz_statep state;
 
     /* get internal structure and check integrity */
@@ -552,9 +502,7 @@ const char * ZEXPORT gzerror(file, errnu
 }
 
 /* -- see zlib.h -- */
-void ZEXPORT gzclearerr(file)
-    gzFile file;
-{
+void ZEXPORT gzclearerr(gzFile file) {
     gz_statep state;
 
     /* get internal structure and check integrity */
@@ -578,11 +526,7 @@ void ZEXPORT gzclearerr(file)
    memory).  Simply save the error message as a static string.  If there is an
    allocation failure constructing the error message, then convert the error to
    out of memory. */
-void ZLIB_INTERNAL gz_error(state, err, msg)
-    gz_statep state;
-    int err;
-    const char *msg;
-{
+void ZLIB_INTERNAL gz_error(gz_statep state, int err, const char *msg) {
     /* free previously allocated message and clear */
     if (state->msg != NULL) {
         if (state->err != Z_MEM_ERROR)
@@ -619,21 +563,20 @@ void ZLIB_INTERNAL gz_error(state, err,
 #endif
 }
 
-#ifndef INT_MAX
 /* portably return maximum value for an int (when limits.h presumed not
    available) -- we need to do this to cover cases where 2's complement not
    used, since C standard permits 1's complement and sign-bit representations,
    otherwise we could just use ((unsigned)-1) >> 1 */
-unsigned ZLIB_INTERNAL gz_intmax()
-{
-    unsigned p, q;
-
-    p = 1;
+unsigned ZLIB_INTERNAL gz_intmax(void) {
+#ifdef INT_MAX
+    return INT_MAX;
+#else
+    unsigned p = 1, q;
     do {
         q = p;
         p <<= 1;
         p++;
     } while (p > q);
     return q >> 1;
-}
 #endif
+}
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/gzread.c 5.15.17+dfsg-1/src/3rdparty/zlib/src/gzread.c
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/gzread.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/gzread.c	2024-11-20 13:56:33.000000000 +0000
@@ -5,25 +5,12 @@
 
 #include "gzguts.h"
 
-/* Local functions */
-local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *));
-local int gz_avail OF((gz_statep));
-local int gz_look OF((gz_statep));
-local int gz_decomp OF((gz_statep));
-local int gz_fetch OF((gz_statep));
-local int gz_skip OF((gz_statep, z_off64_t));
-local z_size_t gz_read OF((gz_statep, voidp, z_size_t));
-
 /* Use read() to load a buffer -- return -1 on error, otherwise 0.  Read from
    state->fd, and update state->eof, state->err, and state->msg as appropriate.
    This function needs to loop on read(), since read() is not guaranteed to
    read the number of bytes requested, depending on the type of descriptor. */
-local int gz_load(state, buf, len, have)
-    gz_statep state;
-    unsigned char *buf;
-    unsigned len;
-    unsigned *have;
-{
+local int gz_load(gz_statep state, unsigned char *buf, unsigned len,
+                  unsigned *have) {
     int ret;
     unsigned get, max = ((unsigned)-1 >> 2) + 1;
 
@@ -53,9 +40,7 @@ local int gz_load(state, buf, len, have)
    If strm->avail_in != 0, then the current data is moved to the beginning of
    the input buffer, and then the remainder of the buffer is loaded with the
    available data from the input file. */
-local int gz_avail(state)
-    gz_statep state;
-{
+local int gz_avail(gz_statep state) {
     unsigned got;
     z_streamp strm = &(state->strm);
 
@@ -88,9 +73,7 @@ local int gz_avail(state)
    case, all further file reads will be directly to either the output buffer or
    a user buffer.  If decompressing, the inflate state will be initialized.
    gz_look() will return 0 on success or -1 on failure. */
-local int gz_look(state)
-    gz_statep state;
-{
+local int gz_look(gz_statep state) {
     z_streamp strm = &(state->strm);
 
     /* allocate read buffers and inflate memory */
@@ -170,9 +153,7 @@ local int gz_look(state)
    data.  If the gzip stream completes, state->how is reset to LOOK to look for
    the next gzip stream or raw data, once state->x.have is depleted.  Returns 0
    on success, -1 on failure. */
-local int gz_decomp(state)
-    gz_statep state;
-{
+local int gz_decomp(gz_statep state) {
     int ret = Z_OK;
     unsigned had;
     z_streamp strm = &(state->strm);
@@ -224,9 +205,7 @@ local int gz_decomp(state)
    looked for to determine whether to copy or decompress.  Returns -1 on error,
    otherwise 0.  gz_fetch() will leave state->how as COPY or GZIP unless the
    end of the input file has been reached and all data has been processed.  */
-local int gz_fetch(state)
-    gz_statep state;
-{
+local int gz_fetch(gz_statep state) {
     z_streamp strm = &(state->strm);
 
     do {
@@ -254,10 +233,7 @@ local int gz_fetch(state)
 }
 
 /* Skip len uncompressed bytes of output.  Return -1 on error, 0 on success. */
-local int gz_skip(state, len)
-    gz_statep state;
-    z_off64_t len;
-{
+local int gz_skip(gz_statep state, z_off64_t len) {
     unsigned n;
 
     /* skip over len bytes or reach end-of-file, whichever comes first */
@@ -289,11 +265,7 @@ local int gz_skip(state, len)
    input.  Return the number of bytes read.  If zero is returned, either the
    end of file was reached, or there was an error.  state->err must be
    consulted in that case to determine which. */
-local z_size_t gz_read(state, buf, len)
-    gz_statep state;
-    voidp buf;
-    z_size_t len;
-{
+local z_size_t gz_read(gz_statep state, voidp buf, z_size_t len) {
     z_size_t got;
     unsigned n;
 
@@ -370,11 +342,7 @@ local z_size_t gz_read(state, buf, len)
 }
 
 /* -- see zlib.h -- */
-int ZEXPORT gzread(file, buf, len)
-    gzFile file;
-    voidp buf;
-    unsigned len;
-{
+int ZEXPORT gzread(gzFile file, voidp buf, unsigned len) {
     gz_statep state;
 
     /* get internal structure */
@@ -406,12 +374,7 @@ int ZEXPORT gzread(file, buf, len)
 }
 
 /* -- see zlib.h -- */
-z_size_t ZEXPORT gzfread(buf, size, nitems, file)
-    voidp buf;
-    z_size_t size;
-    z_size_t nitems;
-    gzFile file;
-{
+z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems, gzFile file) {
     z_size_t len;
     gz_statep state;
 
@@ -442,9 +405,7 @@ z_size_t ZEXPORT gzfread(buf, size, nite
 #else
 #  undef gzgetc
 #endif
-int ZEXPORT gzgetc(file)
-    gzFile file;
-{
+int ZEXPORT gzgetc(gzFile file) {
     unsigned char buf[1];
     gz_statep state;
 
@@ -469,17 +430,12 @@ int ZEXPORT gzgetc(file)
     return gz_read(state, buf, 1) < 1 ? -1 : buf[0];
 }
 
-int ZEXPORT gzgetc_(file)
-gzFile file;
-{
+int ZEXPORT gzgetc_(gzFile file) {
     return gzgetc(file);
 }
 
 /* -- see zlib.h -- */
-int ZEXPORT gzungetc(c, file)
-    int c;
-    gzFile file;
-{
+int ZEXPORT gzungetc(int c, gzFile file) {
     gz_statep state;
 
     /* get internal structure */
@@ -487,6 +443,10 @@ int ZEXPORT gzungetc(c, file)
         return -1;
     state = (gz_statep)file;
 
+    /* in case this was just opened, set up the input buffer */
+    if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0)
+        (void)gz_look(state);
+
     /* check that we're reading and that there's no (serious) error */
     if (state->mode != GZ_READ ||
         (state->err != Z_OK && state->err != Z_BUF_ERROR))
@@ -536,11 +496,7 @@ int ZEXPORT gzungetc(c, file)
 }
 
 /* -- see zlib.h -- */
-char * ZEXPORT gzgets(file, buf, len)
-    gzFile file;
-    char *buf;
-    int len;
-{
+char * ZEXPORT gzgets(gzFile file, char *buf, int len) {
     unsigned left, n;
     char *str;
     unsigned char *eol;
@@ -600,9 +556,7 @@ char * ZEXPORT gzgets(file, buf, len)
 }
 
 /* -- see zlib.h -- */
-int ZEXPORT gzdirect(file)
-    gzFile file;
-{
+int ZEXPORT gzdirect(gzFile file) {
     gz_statep state;
 
     /* get internal structure */
@@ -620,9 +574,7 @@ int ZEXPORT gzdirect(file)
 }
 
 /* -- see zlib.h -- */
-int ZEXPORT gzclose_r(file)
-    gzFile file;
-{
+int ZEXPORT gzclose_r(gzFile file) {
     int ret, err;
     gz_statep state;
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/gzwrite.c 5.15.17+dfsg-1/src/3rdparty/zlib/src/gzwrite.c
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/gzwrite.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/gzwrite.c	2024-11-20 13:56:33.000000000 +0000
@@ -5,18 +5,10 @@
 
 #include "gzguts.h"
 
-/* Local functions */
-local int gz_init OF((gz_statep));
-local int gz_comp OF((gz_statep, int));
-local int gz_zero OF((gz_statep, z_off64_t));
-local z_size_t gz_write OF((gz_statep, voidpc, z_size_t));
-
 /* Initialize state for writing a gzip file.  Mark initialization by setting
    state->size to non-zero.  Return -1 on a memory allocation failure, or 0 on
    success. */
-local int gz_init(state)
-    gz_statep state;
-{
+local int gz_init(gz_statep state) {
     int ret;
     z_streamp strm = &(state->strm);
 
@@ -70,10 +62,7 @@ local int gz_init(state)
    deflate() flush value.  If flush is Z_FINISH, then the deflate() state is
    reset to start a new gzip stream.  If gz->direct is true, then simply write
    to the output file without compressing, and ignore flush. */
-local int gz_comp(state, flush)
-    gz_statep state;
-    int flush;
-{
+local int gz_comp(gz_statep state, int flush) {
     int ret, writ;
     unsigned have, put, max = ((unsigned)-1 >> 2) + 1;
     z_streamp strm = &(state->strm);
@@ -151,10 +140,7 @@ local int gz_comp(state, flush)
 
 /* Compress len zeros to output.  Return -1 on a write error or memory
    allocation failure by gz_comp(), or 0 on success. */
-local int gz_zero(state, len)
-    gz_statep state;
-    z_off64_t len;
-{
+local int gz_zero(gz_statep state, z_off64_t len) {
     int first;
     unsigned n;
     z_streamp strm = &(state->strm);
@@ -184,11 +170,7 @@ local int gz_zero(state, len)
 
 /* Write len bytes from buf to file.  Return the number of bytes written.  If
    the returned value is less than len, then there was an error. */
-local z_size_t gz_write(state, buf, len)
-    gz_statep state;
-    voidpc buf;
-    z_size_t len;
-{
+local z_size_t gz_write(gz_statep state, voidpc buf, z_size_t len) {
     z_size_t put = len;
 
     /* if len is zero, avoid unnecessary operations */
@@ -252,11 +234,7 @@ local z_size_t gz_write(state, buf, len)
 }
 
 /* -- see zlib.h -- */
-int ZEXPORT gzwrite(file, buf, len)
-    gzFile file;
-    voidpc buf;
-    unsigned len;
-{
+int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len) {
     gz_statep state;
 
     /* get internal structure */
@@ -280,12 +258,8 @@ int ZEXPORT gzwrite(file, buf, len)
 }
 
 /* -- see zlib.h -- */
-z_size_t ZEXPORT gzfwrite(buf, size, nitems, file)
-    voidpc buf;
-    z_size_t size;
-    z_size_t nitems;
-    gzFile file;
-{
+z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, z_size_t nitems,
+                          gzFile file) {
     z_size_t len;
     gz_statep state;
 
@@ -310,10 +284,7 @@ z_size_t ZEXPORT gzfwrite(buf, size, nit
 }
 
 /* -- see zlib.h -- */
-int ZEXPORT gzputc(file, c)
-    gzFile file;
-    int c;
-{
+int ZEXPORT gzputc(gzFile file, int c) {
     unsigned have;
     unsigned char buf[1];
     gz_statep state;
@@ -358,10 +329,7 @@ int ZEXPORT gzputc(file, c)
 }
 
 /* -- see zlib.h -- */
-int ZEXPORT gzputs(file, s)
-    gzFile file;
-    const char *s;
-{
+int ZEXPORT gzputs(gzFile file, const char *s) {
     z_size_t len, put;
     gz_statep state;
 
@@ -388,8 +356,7 @@ int ZEXPORT gzputs(file, s)
 #include <stdarg.h>
 
 /* -- see zlib.h -- */
-int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va)
-{
+int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) {
     int len;
     unsigned left;
     char *next;
@@ -460,8 +427,7 @@ int ZEXPORTVA gzvprintf(gzFile file, con
     return len;
 }
 
-int ZEXPORTVA gzprintf(gzFile file, const char *format, ...)
-{
+int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) {
     va_list va;
     int ret;
 
@@ -474,13 +440,10 @@ int ZEXPORTVA gzprintf(gzFile file, cons
 #else /* !STDC && !Z_HAVE_STDARG_H */
 
 /* -- see zlib.h -- */
-int ZEXPORTVA gzprintf(file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
-                       a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
-    gzFile file;
-    const char *format;
-    int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
-        a11, a12, a13, a14, a15, a16, a17, a18, a19, a20;
-{
+int ZEXPORTVA gzprintf(gzFile file, const char *format, int a1, int a2, int a3,
+                       int a4, int a5, int a6, int a7, int a8, int a9, int a10,
+                       int a11, int a12, int a13, int a14, int a15, int a16,
+                       int a17, int a18, int a19, int a20) {
     unsigned len, left;
     char *next;
     gz_statep state;
@@ -562,10 +525,7 @@ int ZEXPORTVA gzprintf(file, format, a1,
 #endif
 
 /* -- see zlib.h -- */
-int ZEXPORT gzflush(file, flush)
-    gzFile file;
-    int flush;
-{
+int ZEXPORT gzflush(gzFile file, int flush) {
     gz_statep state;
 
     /* get internal structure */
@@ -594,11 +554,7 @@ int ZEXPORT gzflush(file, flush)
 }
 
 /* -- see zlib.h -- */
-int ZEXPORT gzsetparams(file, level, strategy)
-    gzFile file;
-    int level;
-    int strategy;
-{
+int ZEXPORT gzsetparams(gzFile file, int level, int strategy) {
     gz_statep state;
     z_streamp strm;
 
@@ -609,7 +565,7 @@ int ZEXPORT gzsetparams(file, level, str
     strm = &(state->strm);
 
     /* check that we're writing and that there's no error */
-    if (state->mode != GZ_WRITE || state->err != Z_OK)
+    if (state->mode != GZ_WRITE || state->err != Z_OK || state->direct)
         return Z_STREAM_ERROR;
 
     /* if no change is requested, then do nothing */
@@ -636,9 +592,7 @@ int ZEXPORT gzsetparams(file, level, str
 }
 
 /* -- see zlib.h -- */
-int ZEXPORT gzclose_w(file)
-    gzFile file;
-{
+int ZEXPORT gzclose_w(gzFile file) {
     int ret = Z_OK;
     gz_statep state;
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/infback.c 5.15.17+dfsg-1/src/3rdparty/zlib/src/infback.c
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/infback.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/infback.c	2024-11-20 13:56:33.000000000 +0000
@@ -15,9 +15,6 @@
 #include "inflate.h"
 #include "inffast.h"
 
-/* function prototypes */
-local void fixedtables OF((struct inflate_state FAR *state));
-
 /*
    strm provides memory allocation functions in zalloc and zfree, or
    Z_NULL to use the library memory allocation functions.
@@ -25,13 +22,9 @@ local void fixedtables OF((struct inflat
    windowBits is in the range 8..15, and window is a user-supplied
    window and output buffer that is 2**windowBits bytes.
  */
-int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size)
-z_streamp strm;
-int windowBits;
-unsigned char FAR *window;
-const char *version;
-int stream_size;
-{
+int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits,
+                             unsigned char FAR *window, const char *version,
+                             int stream_size) {
     struct inflate_state FAR *state;
 
     if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
@@ -80,9 +73,7 @@ int stream_size;
    used for threaded applications, since the rewriting of the tables and virgin
    may not be thread-safe.
  */
-local void fixedtables(state)
-struct inflate_state FAR *state;
-{
+local void fixedtables(struct inflate_state FAR *state) {
 #ifdef BUILDFIXED
     static int virgin = 1;
     static code *lenfix, *distfix;
@@ -248,13 +239,8 @@ struct inflate_state FAR *state;
    inflateBack() can also return Z_STREAM_ERROR if the input parameters
    are not correct, i.e. strm is Z_NULL or the state was not initialized.
  */
-int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc)
-z_streamp strm;
-in_func in;
-void FAR *in_desc;
-out_func out;
-void FAR *out_desc;
-{
+int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
+                        out_func out, void FAR *out_desc) {
     struct inflate_state FAR *state;
     z_const unsigned char FAR *next;    /* next input */
     unsigned char FAR *put;     /* next output */
@@ -632,9 +618,7 @@ void FAR *out_desc;
     return ret;
 }
 
-int ZEXPORT inflateBackEnd(strm)
-z_streamp strm;
-{
+int ZEXPORT inflateBackEnd(z_streamp strm) {
     if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
         return Z_STREAM_ERROR;
     ZFREE(strm, strm->state);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/inffast.c 5.15.17+dfsg-1/src/3rdparty/zlib/src/inffast.c
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/inffast.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/inffast.c	2024-11-20 13:56:33.000000000 +0000
@@ -47,10 +47,7 @@
       requires strm->avail_out >= 258 for each loop to avoid checking for
       output space.
  */
-void ZLIB_INTERNAL inflate_fast(strm, start)
-z_streamp strm;
-unsigned start;         /* inflate()'s starting value for strm->avail_out */
-{
+void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start) {
     struct inflate_state FAR *state;
     z_const unsigned char FAR *in;      /* local strm->next_in */
     z_const unsigned char FAR *last;    /* have enough input while in < last */
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/inffast.h 5.15.17+dfsg-1/src/3rdparty/zlib/src/inffast.h
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/inffast.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/inffast.h	2024-11-20 13:56:33.000000000 +0000
@@ -8,4 +8,4 @@
    subject to change. Applications should only use zlib.h.
  */
 
-void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start));
+void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/inflate.c 5.15.17+dfsg-1/src/3rdparty/zlib/src/inflate.c
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/inflate.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/inflate.c	2024-11-20 13:56:33.000000000 +0000
@@ -91,20 +91,7 @@
 #  endif
 #endif
 
-/* function prototypes */
-local int inflateStateCheck OF((z_streamp strm));
-local void fixedtables OF((struct inflate_state FAR *state));
-local int updatewindow OF((z_streamp strm, const unsigned char FAR *end,
-                           unsigned copy));
-#ifdef BUILDFIXED
-   void makefixed OF((void));
-#endif
-local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf,
-                              unsigned len));
-
-local int inflateStateCheck(strm)
-z_streamp strm;
-{
+local int inflateStateCheck(z_streamp strm) {
     struct inflate_state FAR *state;
     if (strm == Z_NULL ||
         strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
@@ -116,9 +103,7 @@ z_streamp strm;
     return 0;
 }
 
-int ZEXPORT inflateResetKeep(strm)
-z_streamp strm;
-{
+int ZEXPORT inflateResetKeep(z_streamp strm) {
     struct inflate_state FAR *state;
 
     if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
@@ -142,9 +127,7 @@ z_streamp strm;
     return Z_OK;
 }
 
-int ZEXPORT inflateReset(strm)
-z_streamp strm;
-{
+int ZEXPORT inflateReset(z_streamp strm) {
     struct inflate_state FAR *state;
 
     if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
@@ -155,10 +138,7 @@ z_streamp strm;
     return inflateResetKeep(strm);
 }
 
-int ZEXPORT inflateReset2(strm, windowBits)
-z_streamp strm;
-int windowBits;
-{
+int ZEXPORT inflateReset2(z_streamp strm, int windowBits) {
     int wrap;
     struct inflate_state FAR *state;
 
@@ -195,12 +175,8 @@ int windowBits;
     return inflateReset(strm);
 }
 
-int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)
-z_streamp strm;
-int windowBits;
-const char *version;
-int stream_size;
-{
+int ZEXPORT inflateInit2_(z_streamp strm, int windowBits,
+                          const char *version, int stream_size) {
     int ret;
     struct inflate_state FAR *state;
 
@@ -239,22 +215,17 @@ int stream_size;
     return ret;
 }
 
-int ZEXPORT inflateInit_(strm, version, stream_size)
-z_streamp strm;
-const char *version;
-int stream_size;
-{
+int ZEXPORT inflateInit_(z_streamp strm, const char *version,
+                         int stream_size) {
     return inflateInit2_(strm, DEF_WBITS, version, stream_size);
 }
 
-int ZEXPORT inflatePrime(strm, bits, value)
-z_streamp strm;
-int bits;
-int value;
-{
+int ZEXPORT inflatePrime(z_streamp strm, int bits, int value) {
     struct inflate_state FAR *state;
 
     if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
+    if (bits == 0)
+        return Z_OK;
     state = (struct inflate_state FAR *)strm->state;
     if (bits < 0) {
         state->hold = 0;
@@ -278,9 +249,7 @@ int value;
    used for threaded applications, since the rewriting of the tables and virgin
    may not be thread-safe.
  */
-local void fixedtables(state)
-struct inflate_state FAR *state;
-{
+local void fixedtables(struct inflate_state FAR *state) {
 #ifdef BUILDFIXED
     static int virgin = 1;
     static code *lenfix, *distfix;
@@ -342,7 +311,7 @@ struct inflate_state FAR *state;
 
     a.out > inffixed.h
  */
-void makefixed()
+void makefixed(void)
 {
     unsigned low, size;
     struct inflate_state state;
@@ -396,11 +365,7 @@ void makefixed()
    output will fall in the output data, making match copies simpler and faster.
    The advantage may be dependent on the size of the processor's data caches.
  */
-local int updatewindow(strm, end, copy)
-z_streamp strm;
-const Bytef *end;
-unsigned copy;
-{
+local int updatewindow(z_streamp strm, const Bytef *end, unsigned copy) {
     struct inflate_state FAR *state;
     unsigned dist;
 
@@ -622,10 +587,7 @@ unsigned copy;
    will return Z_BUF_ERROR if it has not reached the end of the stream.
  */
 
-int ZEXPORT inflate(strm, flush)
-z_streamp strm;
-int flush;
-{
+int ZEXPORT inflate(z_streamp strm, int flush) {
     struct inflate_state FAR *state;
     z_const unsigned char FAR *next;    /* next input */
     unsigned char FAR *put;     /* next output */
@@ -1301,9 +1263,7 @@ int flush;
     return ret;
 }
 
-int ZEXPORT inflateEnd(strm)
-z_streamp strm;
-{
+int ZEXPORT inflateEnd(z_streamp strm) {
     struct inflate_state FAR *state;
     if (inflateStateCheck(strm))
         return Z_STREAM_ERROR;
@@ -1315,11 +1275,8 @@ z_streamp strm;
     return Z_OK;
 }
 
-int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength)
-z_streamp strm;
-Bytef *dictionary;
-uInt *dictLength;
-{
+int ZEXPORT inflateGetDictionary(z_streamp strm, Bytef *dictionary,
+                                 uInt *dictLength) {
     struct inflate_state FAR *state;
 
     /* check state */
@@ -1338,11 +1295,8 @@ uInt *dictLength;
     return Z_OK;
 }
 
-int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
-z_streamp strm;
-const Bytef *dictionary;
-uInt dictLength;
-{
+int ZEXPORT inflateSetDictionary(z_streamp strm, const Bytef *dictionary,
+                                 uInt dictLength) {
     struct inflate_state FAR *state;
     unsigned long dictid;
     int ret;
@@ -1373,10 +1327,7 @@ uInt dictLength;
     return Z_OK;
 }
 
-int ZEXPORT inflateGetHeader(strm, head)
-z_streamp strm;
-gz_headerp head;
-{
+int ZEXPORT inflateGetHeader(z_streamp strm, gz_headerp head) {
     struct inflate_state FAR *state;
 
     /* check state */
@@ -1401,11 +1352,8 @@ gz_headerp head;
    called again with more data and the *have state.  *have is initialized to
    zero for the first call.
  */
-local unsigned syncsearch(have, buf, len)
-unsigned FAR *have;
-const unsigned char FAR *buf;
-unsigned len;
-{
+local unsigned syncsearch(unsigned FAR *have, const unsigned char FAR *buf,
+                          unsigned len) {
     unsigned got;
     unsigned next;
 
@@ -1424,9 +1372,7 @@ unsigned len;
     return next;
 }
 
-int ZEXPORT inflateSync(strm)
-z_streamp strm;
-{
+int ZEXPORT inflateSync(z_streamp strm) {
     unsigned len;               /* number of bytes to look at or looked at */
     int flags;                  /* temporary to save header status */
     unsigned long in, out;      /* temporary to save total_in and total_out */
@@ -1441,7 +1387,7 @@ z_streamp strm;
     /* if first time, start search in bit buffer */
     if (state->mode != SYNC) {
         state->mode = SYNC;
-        state->hold <<= state->bits & 7;
+        state->hold >>= state->bits & 7;
         state->bits -= state->bits & 7;
         len = 0;
         while (state->bits >= 8) {
@@ -1482,9 +1428,7 @@ z_streamp strm;
    block. When decompressing, PPP checks that at the end of input packet,
    inflate is waiting for these length bytes.
  */
-int ZEXPORT inflateSyncPoint(strm)
-z_streamp strm;
-{
+int ZEXPORT inflateSyncPoint(z_streamp strm) {
     struct inflate_state FAR *state;
 
     if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
@@ -1492,10 +1436,7 @@ z_streamp strm;
     return state->mode == STORED && state->bits == 0;
 }
 
-int ZEXPORT inflateCopy(dest, source)
-z_streamp dest;
-z_streamp source;
-{
+int ZEXPORT inflateCopy(z_streamp dest, z_streamp source) {
     struct inflate_state FAR *state;
     struct inflate_state FAR *copy;
     unsigned char FAR *window;
@@ -1539,10 +1480,7 @@ z_streamp source;
     return Z_OK;
 }
 
-int ZEXPORT inflateUndermine(strm, subvert)
-z_streamp strm;
-int subvert;
-{
+int ZEXPORT inflateUndermine(z_streamp strm, int subvert) {
     struct inflate_state FAR *state;
 
     if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
@@ -1557,10 +1495,7 @@ int subvert;
 #endif
 }
 
-int ZEXPORT inflateValidate(strm, check)
-z_streamp strm;
-int check;
-{
+int ZEXPORT inflateValidate(z_streamp strm, int check) {
     struct inflate_state FAR *state;
 
     if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
@@ -1572,9 +1507,7 @@ int check;
     return Z_OK;
 }
 
-long ZEXPORT inflateMark(strm)
-z_streamp strm;
-{
+long ZEXPORT inflateMark(z_streamp strm) {
     struct inflate_state FAR *state;
 
     if (inflateStateCheck(strm))
@@ -1585,9 +1518,7 @@ z_streamp strm;
             (state->mode == MATCH ? state->was - state->length : 0));
 }
 
-unsigned long ZEXPORT inflateCodesUsed(strm)
-z_streamp strm;
-{
+unsigned long ZEXPORT inflateCodesUsed(z_streamp strm) {
     struct inflate_state FAR *state;
     if (inflateStateCheck(strm)) return (unsigned long)-1;
     state = (struct inflate_state FAR *)strm->state;
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/inftrees.c 5.15.17+dfsg-1/src/3rdparty/zlib/src/inftrees.c
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/inftrees.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/inftrees.c	2024-11-20 13:56:33.000000000 +0000
@@ -1,5 +1,5 @@
 /* inftrees.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995-2022 Mark Adler
+ * Copyright (C) 1995-2024 Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -9,7 +9,7 @@
 #define MAXBITS 15
 
 const char inflate_copyright[] =
-   " inflate 1.2.13 Copyright 1995-2022 Mark Adler ";
+   " inflate 1.3.1 Copyright 1995-2024 Mark Adler ";
 /*
   If you use the zlib library in a product, an acknowledgment is welcome
   in the documentation of your product. If for some reason you cannot
@@ -29,14 +29,9 @@ const char inflate_copyright[] =
    table index bits.  It will differ if the request is greater than the
    longest code or if it is less than the shortest code.
  */
-int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work)
-codetype type;
-unsigned short FAR *lens;
-unsigned codes;
-code FAR * FAR *table;
-unsigned FAR *bits;
-unsigned short FAR *work;
-{
+int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens,
+                                unsigned codes, code FAR * FAR *table,
+                                unsigned FAR *bits, unsigned short FAR *work) {
     unsigned len;               /* a code's length in bits */
     unsigned sym;               /* index of code symbols */
     unsigned min, max;          /* minimum and maximum code lengths */
@@ -62,7 +57,7 @@ unsigned short FAR *work;
         35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
     static const unsigned short lext[31] = { /* Length codes 257..285 extra */
         16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
-        19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 194, 65};
+        19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 203, 77};
     static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
         1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
         257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/inftrees.h 5.15.17+dfsg-1/src/3rdparty/zlib/src/inftrees.h
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/inftrees.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/inftrees.h	2024-11-20 13:56:33.000000000 +0000
@@ -41,8 +41,8 @@ typedef struct {
    examples/enough.c found in the zlib distribution.  The arguments to that
    program are the number of symbols, the initial root table size, and the
    maximum bit length of a code.  "enough 286 9 15" for literal/length codes
-   returns returns 852, and "enough 30 6 15" for distance codes returns 592.
-   The initial root table size (9 or 6) is found in the fifth argument of the
+   returns 852, and "enough 30 6 15" for distance codes returns 592. The
+   initial root table size (9 or 6) is found in the fifth argument of the
    inflate_table() calls in inflate.c and infback.c.  If the root table size is
    changed, then these maximum sizes would be need to be recalculated and
    updated. */
@@ -57,6 +57,6 @@ typedef enum {
     DISTS
 } codetype;
 
-int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens,
-                             unsigned codes, code FAR * FAR *table,
-                             unsigned FAR *bits, unsigned short FAR *work));
+int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens,
+                                unsigned codes, code FAR * FAR *table,
+                                unsigned FAR *bits, unsigned short FAR *work);
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/trees.c 5.15.17+dfsg-1/src/3rdparty/zlib/src/trees.c
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/trees.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/trees.c	2024-11-20 13:56:33.000000000 +0000
@@ -1,5 +1,5 @@
 /* trees.c -- output deflated data using Huffman coding
- * Copyright (C) 1995-2021 Jean-loup Gailly
+ * Copyright (C) 1995-2024 Jean-loup Gailly
  * detect_data_type() function provided freely by Cosmin Truta, 2006
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
@@ -122,39 +122,116 @@ struct static_tree_desc_s {
     int     max_length;          /* max bit length for the codes */
 };
 
-local const static_tree_desc  static_l_desc =
+#ifdef NO_INIT_GLOBAL_POINTERS
+#  define TCONST
+#else
+#  define TCONST const
+#endif
+
+local TCONST static_tree_desc static_l_desc =
 {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
 
-local const static_tree_desc  static_d_desc =
+local TCONST static_tree_desc static_d_desc =
 {static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS};
 
-local const static_tree_desc  static_bl_desc =
+local TCONST static_tree_desc static_bl_desc =
 {(const ct_data *)0, extra_blbits, 0,   BL_CODES, MAX_BL_BITS};
 
 /* ===========================================================================
- * Local (static) routines in this file.
+ * Output a short LSB first on the stream.
+ * IN assertion: there is enough room in pendingBuf.
+ */
+#define put_short(s, w) { \
+    put_byte(s, (uch)((w) & 0xff)); \
+    put_byte(s, (uch)((ush)(w) >> 8)); \
+}
+
+/* ===========================================================================
+ * Reverse the first len bits of a code, using straightforward code (a faster
+ * method would use a table)
+ * IN assertion: 1 <= len <= 15
  */
+local unsigned bi_reverse(unsigned code, int len) {
+    register unsigned res = 0;
+    do {
+        res |= code & 1;
+        code >>= 1, res <<= 1;
+    } while (--len > 0);
+    return res >> 1;
+}
 
-local void tr_static_init OF((void));
-local void init_block     OF((deflate_state *s));
-local void pqdownheap     OF((deflate_state *s, ct_data *tree, int k));
-local void gen_bitlen     OF((deflate_state *s, tree_desc *desc));
-local void gen_codes      OF((ct_data *tree, int max_code, ushf *bl_count));
-local void build_tree     OF((deflate_state *s, tree_desc *desc));
-local void scan_tree      OF((deflate_state *s, ct_data *tree, int max_code));
-local void send_tree      OF((deflate_state *s, ct_data *tree, int max_code));
-local int  build_bl_tree  OF((deflate_state *s));
-local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
-                              int blcodes));
-local void compress_block OF((deflate_state *s, const ct_data *ltree,
-                              const ct_data *dtree));
-local int  detect_data_type OF((deflate_state *s));
-local unsigned bi_reverse OF((unsigned code, int len));
-local void bi_windup      OF((deflate_state *s));
-local void bi_flush       OF((deflate_state *s));
+/* ===========================================================================
+ * Flush the bit buffer, keeping at most 7 bits in it.
+ */
+local void bi_flush(deflate_state *s) {
+    if (s->bi_valid == 16) {
+        put_short(s, s->bi_buf);
+        s->bi_buf = 0;
+        s->bi_valid = 0;
+    } else if (s->bi_valid >= 8) {
+        put_byte(s, (Byte)s->bi_buf);
+        s->bi_buf >>= 8;
+        s->bi_valid -= 8;
+    }
+}
+
+/* ===========================================================================
+ * Flush the bit buffer and align the output on a byte boundary
+ */
+local void bi_windup(deflate_state *s) {
+    if (s->bi_valid > 8) {
+        put_short(s, s->bi_buf);
+    } else if (s->bi_valid > 0) {
+        put_byte(s, (Byte)s->bi_buf);
+    }
+    s->bi_buf = 0;
+    s->bi_valid = 0;
+#ifdef ZLIB_DEBUG
+    s->bits_sent = (s->bits_sent + 7) & ~7;
+#endif
+}
+
+/* ===========================================================================
+ * Generate the codes for a given tree and bit counts (which need not be
+ * optimal).
+ * IN assertion: the array bl_count contains the bit length statistics for
+ * the given tree and the field len is set for all tree elements.
+ * OUT assertion: the field code is set for all tree elements of non
+ *     zero code length.
+ */
+local void gen_codes(ct_data *tree, int max_code, ushf *bl_count) {
+    ush next_code[MAX_BITS+1]; /* next code value for each bit length */
+    unsigned code = 0;         /* running code value */
+    int bits;                  /* bit index */
+    int n;                     /* code index */
+
+    /* The distribution counts are first used to generate the code values
+     * without bit reversal.
+     */
+    for (bits = 1; bits <= MAX_BITS; bits++) {
+        code = (code + bl_count[bits - 1]) << 1;
+        next_code[bits] = (ush)code;
+    }
+    /* Check that the bit counts in bl_count are consistent. The last code
+     * must be all ones.
+     */
+    Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1,
+            "inconsistent bit counts");
+    Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
+
+    for (n = 0;  n <= max_code; n++) {
+        int len = tree[n].Len;
+        if (len == 0) continue;
+        /* Now reverse the bits */
+        tree[n].Code = (ush)bi_reverse(next_code[len]++, len);
+
+        Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
+            n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1));
+    }
+}
 
 #ifdef GEN_TREES_H
-local void gen_trees_header OF((void));
+local void gen_trees_header(void);
 #endif
 
 #ifndef ZLIB_DEBUG
@@ -168,26 +245,11 @@ local void gen_trees_header OF((void));
 #endif
 
 /* ===========================================================================
- * Output a short LSB first on the stream.
- * IN assertion: there is enough room in pendingBuf.
- */
-#define put_short(s, w) { \
-    put_byte(s, (uch)((w) & 0xff)); \
-    put_byte(s, (uch)((ush)(w) >> 8)); \
-}
-
-/* ===========================================================================
  * Send a value on a given number of bits.
  * IN assertion: length <= 16 and value fits in length bits.
  */
 #ifdef ZLIB_DEBUG
-local void send_bits      OF((deflate_state *s, int value, int length));
-
-local void send_bits(s, value, length)
-    deflate_state *s;
-    int value;  /* value to send */
-    int length; /* number of bits */
-{
+local void send_bits(deflate_state *s, int value, int length) {
     Tracevv((stderr," l %2d v %4x ", length, value));
     Assert(length > 0 && length <= 15, "invalid length");
     s->bits_sent += (ulg)length;
@@ -229,8 +291,7 @@ local void send_bits(s, value, length)
 /* ===========================================================================
  * Initialize the various 'constant' tables.
  */
-local void tr_static_init()
-{
+local void tr_static_init(void) {
 #if defined(GEN_TREES_H) || !defined(STDC)
     static int static_init_done = 0;
     int n;        /* iterates over tree elements */
@@ -323,8 +384,7 @@ local void tr_static_init()
       ((i) == (last)? "\n};\n\n" :    \
        ((i) % (width) == (width) - 1 ? ",\n" : ", "))
 
-void gen_trees_header()
-{
+void gen_trees_header(void) {
     FILE *header = fopen("trees.h", "w");
     int i;
 
@@ -374,11 +434,25 @@ void gen_trees_header()
 #endif /* GEN_TREES_H */
 
 /* ===========================================================================
+ * Initialize a new block.
+ */
+local void init_block(deflate_state *s) {
+    int n; /* iterates over tree elements */
+
+    /* Initialize the trees. */
+    for (n = 0; n < L_CODES;  n++) s->dyn_ltree[n].Freq = 0;
+    for (n = 0; n < D_CODES;  n++) s->dyn_dtree[n].Freq = 0;
+    for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
+
+    s->dyn_ltree[END_BLOCK].Freq = 1;
+    s->opt_len = s->static_len = 0L;
+    s->sym_next = s->matches = 0;
+}
+
+/* ===========================================================================
  * Initialize the tree data structures for a new zlib stream.
  */
-void ZLIB_INTERNAL _tr_init(s)
-    deflate_state *s;
-{
+void ZLIB_INTERNAL _tr_init(deflate_state *s) {
     tr_static_init();
 
     s->l_desc.dyn_tree = s->dyn_ltree;
@@ -401,24 +475,6 @@ void ZLIB_INTERNAL _tr_init(s)
     init_block(s);
 }
 
-/* ===========================================================================
- * Initialize a new block.
- */
-local void init_block(s)
-    deflate_state *s;
-{
-    int n; /* iterates over tree elements */
-
-    /* Initialize the trees. */
-    for (n = 0; n < L_CODES;  n++) s->dyn_ltree[n].Freq = 0;
-    for (n = 0; n < D_CODES;  n++) s->dyn_dtree[n].Freq = 0;
-    for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
-
-    s->dyn_ltree[END_BLOCK].Freq = 1;
-    s->opt_len = s->static_len = 0L;
-    s->sym_next = s->matches = 0;
-}
-
 #define SMALLEST 1
 /* Index within the heap array of least frequent node in the Huffman tree */
 
@@ -448,11 +504,7 @@ local void init_block(s)
  * when the heap property is re-established (each father smaller than its
  * two sons).
  */
-local void pqdownheap(s, tree, k)
-    deflate_state *s;
-    ct_data *tree;  /* the tree to restore */
-    int k;               /* node to move down */
-{
+local void pqdownheap(deflate_state *s, ct_data *tree, int k) {
     int v = s->heap[k];
     int j = k << 1;  /* left son of k */
     while (j <= s->heap_len) {
@@ -483,10 +535,7 @@ local void pqdownheap(s, tree, k)
  *     The length opt_len is updated; static_len is also updated if stree is
  *     not null.
  */
-local void gen_bitlen(s, desc)
-    deflate_state *s;
-    tree_desc *desc;    /* the tree descriptor */
-{
+local void gen_bitlen(deflate_state *s, tree_desc *desc) {
     ct_data *tree        = desc->dyn_tree;
     int max_code         = desc->max_code;
     const ct_data *stree = desc->stat_desc->static_tree;
@@ -561,48 +610,9 @@ local void gen_bitlen(s, desc)
     }
 }
 
-/* ===========================================================================
- * Generate the codes for a given tree and bit counts (which need not be
- * optimal).
- * IN assertion: the array bl_count contains the bit length statistics for
- * the given tree and the field len is set for all tree elements.
- * OUT assertion: the field code is set for all tree elements of non
- *     zero code length.
- */
-local void gen_codes(tree, max_code, bl_count)
-    ct_data *tree;             /* the tree to decorate */
-    int max_code;              /* largest code with non zero frequency */
-    ushf *bl_count;            /* number of codes at each bit length */
-{
-    ush next_code[MAX_BITS+1]; /* next code value for each bit length */
-    unsigned code = 0;         /* running code value */
-    int bits;                  /* bit index */
-    int n;                     /* code index */
-
-    /* The distribution counts are first used to generate the code values
-     * without bit reversal.
-     */
-    for (bits = 1; bits <= MAX_BITS; bits++) {
-        code = (code + bl_count[bits - 1]) << 1;
-        next_code[bits] = (ush)code;
-    }
-    /* Check that the bit counts in bl_count are consistent. The last code
-     * must be all ones.
-     */
-    Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1,
-            "inconsistent bit counts");
-    Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
-
-    for (n = 0;  n <= max_code; n++) {
-        int len = tree[n].Len;
-        if (len == 0) continue;
-        /* Now reverse the bits */
-        tree[n].Code = (ush)bi_reverse(next_code[len]++, len);
-
-        Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
-            n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1));
-    }
-}
+#ifdef DUMP_BL_TREE
+#  include <stdio.h>
+#endif
 
 /* ===========================================================================
  * Construct one Huffman tree and assigns the code bit strings and lengths.
@@ -612,10 +622,7 @@ local void gen_codes(tree, max_code, bl_
  *     and corresponding code. The length opt_len is updated; static_len is
  *     also updated if stree is not null. The field max_code is set.
  */
-local void build_tree(s, desc)
-    deflate_state *s;
-    tree_desc *desc; /* the tree descriptor */
-{
+local void build_tree(deflate_state *s, tree_desc *desc) {
     ct_data *tree         = desc->dyn_tree;
     const ct_data *stree  = desc->stat_desc->static_tree;
     int elems             = desc->stat_desc->elems;
@@ -700,11 +707,7 @@ local void build_tree(s, desc)
  * Scan a literal or distance tree to determine the frequencies of the codes
  * in the bit length tree.
  */
-local void scan_tree(s, tree, max_code)
-    deflate_state *s;
-    ct_data *tree;   /* the tree to be scanned */
-    int max_code;    /* and its largest code of non zero frequency */
-{
+local void scan_tree(deflate_state *s, ct_data *tree, int max_code) {
     int n;                     /* iterates over all tree elements */
     int prevlen = -1;          /* last emitted length */
     int curlen;                /* length of current code */
@@ -745,11 +748,7 @@ local void scan_tree(s, tree, max_code)
  * Send a literal or distance tree in compressed form, using the codes in
  * bl_tree.
  */
-local void send_tree(s, tree, max_code)
-    deflate_state *s;
-    ct_data *tree; /* the tree to be scanned */
-    int max_code;       /* and its largest code of non zero frequency */
-{
+local void send_tree(deflate_state *s, ct_data *tree, int max_code) {
     int n;                     /* iterates over all tree elements */
     int prevlen = -1;          /* last emitted length */
     int curlen;                /* length of current code */
@@ -796,9 +795,7 @@ local void send_tree(s, tree, max_code)
  * Construct the Huffman tree for the bit lengths and return the index in
  * bl_order of the last bit length code to send.
  */
-local int build_bl_tree(s)
-    deflate_state *s;
-{
+local int build_bl_tree(deflate_state *s) {
     int max_blindex;  /* index of last bit length code of non zero freq */
 
     /* Determine the bit length frequencies for literal and distance trees */
@@ -831,10 +828,8 @@ local int build_bl_tree(s)
  * lengths of the bit length codes, the literal tree and the distance tree.
  * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
  */
-local void send_all_trees(s, lcodes, dcodes, blcodes)
-    deflate_state *s;
-    int lcodes, dcodes, blcodes; /* number of codes for each tree */
-{
+local void send_all_trees(deflate_state *s, int lcodes, int dcodes,
+                          int blcodes) {
     int rank;                    /* index in bl_order */
 
     Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
@@ -860,12 +855,8 @@ local void send_all_trees(s, lcodes, dco
 /* ===========================================================================
  * Send a stored block
  */
-void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)
-    deflate_state *s;
-    charf *buf;       /* input block */
-    ulg stored_len;   /* length of input block */
-    int last;         /* one if this is the last block for a file */
-{
+void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf,
+                                    ulg stored_len, int last) {
     send_bits(s, (STORED_BLOCK<<1) + last, 3);  /* send block type */
     bi_windup(s);        /* align on byte boundary */
     put_short(s, (ush)stored_len);
@@ -884,9 +875,7 @@ void ZLIB_INTERNAL _tr_stored_block(s, b
 /* ===========================================================================
  * Flush the bits in the bit buffer to pending output (leaves at most 7 bits)
  */
-void ZLIB_INTERNAL _tr_flush_bits(s)
-    deflate_state *s;
-{
+void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s) {
     bi_flush(s);
 }
 
@@ -894,9 +883,7 @@ void ZLIB_INTERNAL _tr_flush_bits(s)
  * Send one empty static block to give enough lookahead for inflate.
  * This takes 10 bits, of which 7 may remain in the bit buffer.
  */
-void ZLIB_INTERNAL _tr_align(s)
-    deflate_state *s;
-{
+void ZLIB_INTERNAL _tr_align(deflate_state *s) {
     send_bits(s, STATIC_TREES<<1, 3);
     send_code(s, END_BLOCK, static_ltree);
 #ifdef ZLIB_DEBUG
@@ -906,15 +893,107 @@ void ZLIB_INTERNAL _tr_align(s)
 }
 
 /* ===========================================================================
+ * Send the block data compressed using the given Huffman trees
+ */
+local void compress_block(deflate_state *s, const ct_data *ltree,
+                          const ct_data *dtree) {
+    unsigned dist;      /* distance of matched string */
+    int lc;             /* match length or unmatched char (if dist == 0) */
+    unsigned sx = 0;    /* running index in symbol buffers */
+    unsigned code;      /* the code to send */
+    int extra;          /* number of extra bits to send */
+
+    if (s->sym_next != 0) do {
+#ifdef LIT_MEM
+        dist = s->d_buf[sx];
+        lc = s->l_buf[sx++];
+#else
+        dist = s->sym_buf[sx++] & 0xff;
+        dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8;
+        lc = s->sym_buf[sx++];
+#endif
+        if (dist == 0) {
+            send_code(s, lc, ltree); /* send a literal byte */
+            Tracecv(isgraph(lc), (stderr," '%c' ", lc));
+        } else {
+            /* Here, lc is the match length - MIN_MATCH */
+            code = _length_code[lc];
+            send_code(s, code + LITERALS + 1, ltree);   /* send length code */
+            extra = extra_lbits[code];
+            if (extra != 0) {
+                lc -= base_length[code];
+                send_bits(s, lc, extra);       /* send the extra length bits */
+            }
+            dist--; /* dist is now the match distance - 1 */
+            code = d_code(dist);
+            Assert (code < D_CODES, "bad d_code");
+
+            send_code(s, code, dtree);       /* send the distance code */
+            extra = extra_dbits[code];
+            if (extra != 0) {
+                dist -= (unsigned)base_dist[code];
+                send_bits(s, dist, extra);   /* send the extra distance bits */
+            }
+        } /* literal or match pair ? */
+
+        /* Check for no overlay of pending_buf on needed symbols */
+#ifdef LIT_MEM
+        Assert(s->pending < 2 * (s->lit_bufsize + sx), "pendingBuf overflow");
+#else
+        Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow");
+#endif
+
+    } while (sx < s->sym_next);
+
+    send_code(s, END_BLOCK, ltree);
+}
+
+/* ===========================================================================
+ * Check if the data type is TEXT or BINARY, using the following algorithm:
+ * - TEXT if the two conditions below are satisfied:
+ *    a) There are no non-portable control characters belonging to the
+ *       "block list" (0..6, 14..25, 28..31).
+ *    b) There is at least one printable character belonging to the
+ *       "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
+ * - BINARY otherwise.
+ * - The following partially-portable control characters form a
+ *   "gray list" that is ignored in this detection algorithm:
+ *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
+ * IN assertion: the fields Freq of dyn_ltree are set.
+ */
+local int detect_data_type(deflate_state *s) {
+    /* block_mask is the bit mask of block-listed bytes
+     * set bits 0..6, 14..25, and 28..31
+     * 0xf3ffc07f = binary 11110011111111111100000001111111
+     */
+    unsigned long block_mask = 0xf3ffc07fUL;
+    int n;
+
+    /* Check for non-textual ("block-listed") bytes. */
+    for (n = 0; n <= 31; n++, block_mask >>= 1)
+        if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0))
+            return Z_BINARY;
+
+    /* Check for textual ("allow-listed") bytes. */
+    if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0
+            || s->dyn_ltree[13].Freq != 0)
+        return Z_TEXT;
+    for (n = 32; n < LITERALS; n++)
+        if (s->dyn_ltree[n].Freq != 0)
+            return Z_TEXT;
+
+    /* There are no "block-listed" or "allow-listed" bytes:
+     * this stream either is empty or has tolerated ("gray-listed") bytes only.
+     */
+    return Z_BINARY;
+}
+
+/* ===========================================================================
  * Determine the best encoding for the current block: dynamic trees, static
  * trees or store, and write out the encoded block.
  */
-void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
-    deflate_state *s;
-    charf *buf;       /* input block, or NULL if too old */
-    ulg stored_len;   /* length of input block */
-    int last;         /* one if this is the last block for a file */
-{
+void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf,
+                                   ulg stored_len, int last) {
     ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
     int max_blindex = 0;  /* index of last bit length code of non zero freq */
 
@@ -1011,14 +1090,15 @@ void ZLIB_INTERNAL _tr_flush_block(s, bu
  * Save the match info and tally the frequency counts. Return true if
  * the current block must be flushed.
  */
-int ZLIB_INTERNAL _tr_tally(s, dist, lc)
-    deflate_state *s;
-    unsigned dist;  /* distance of matched string */
-    unsigned lc;    /* match length - MIN_MATCH or unmatched char (dist==0) */
-{
+int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc) {
+#ifdef LIT_MEM
+    s->d_buf[s->sym_next] = (ush)dist;
+    s->l_buf[s->sym_next++] = (uch)lc;
+#else
     s->sym_buf[s->sym_next++] = (uch)dist;
     s->sym_buf[s->sym_next++] = (uch)(dist >> 8);
     s->sym_buf[s->sym_next++] = (uch)lc;
+#endif
     if (dist == 0) {
         /* lc is the unmatched char */
         s->dyn_ltree[lc].Freq++;
@@ -1035,147 +1115,3 @@ int ZLIB_INTERNAL _tr_tally(s, dist, lc)
     }
     return (s->sym_next == s->sym_end);
 }
-
-/* ===========================================================================
- * Send the block data compressed using the given Huffman trees
- */
-local void compress_block(s, ltree, dtree)
-    deflate_state *s;
-    const ct_data *ltree; /* literal tree */
-    const ct_data *dtree; /* distance tree */
-{
-    unsigned dist;      /* distance of matched string */
-    int lc;             /* match length or unmatched char (if dist == 0) */
-    unsigned sx = 0;    /* running index in sym_buf */
-    unsigned code;      /* the code to send */
-    int extra;          /* number of extra bits to send */
-
-    if (s->sym_next != 0) do {
-        dist = s->sym_buf[sx++] & 0xff;
-        dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8;
-        lc = s->sym_buf[sx++];
-        if (dist == 0) {
-            send_code(s, lc, ltree); /* send a literal byte */
-            Tracecv(isgraph(lc), (stderr," '%c' ", lc));
-        } else {
-            /* Here, lc is the match length - MIN_MATCH */
-            code = _length_code[lc];
-            send_code(s, code + LITERALS + 1, ltree);   /* send length code */
-            extra = extra_lbits[code];
-            if (extra != 0) {
-                lc -= base_length[code];
-                send_bits(s, lc, extra);       /* send the extra length bits */
-            }
-            dist--; /* dist is now the match distance - 1 */
-            code = d_code(dist);
-            Assert (code < D_CODES, "bad d_code");
-
-            send_code(s, code, dtree);       /* send the distance code */
-            extra = extra_dbits[code];
-            if (extra != 0) {
-                dist -= (unsigned)base_dist[code];
-                send_bits(s, dist, extra);   /* send the extra distance bits */
-            }
-        } /* literal or match pair ? */
-
-        /* Check that the overlay between pending_buf and sym_buf is ok: */
-        Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow");
-
-    } while (sx < s->sym_next);
-
-    send_code(s, END_BLOCK, ltree);
-}
-
-/* ===========================================================================
- * Check if the data type is TEXT or BINARY, using the following algorithm:
- * - TEXT if the two conditions below are satisfied:
- *    a) There are no non-portable control characters belonging to the
- *       "block list" (0..6, 14..25, 28..31).
- *    b) There is at least one printable character belonging to the
- *       "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
- * - BINARY otherwise.
- * - The following partially-portable control characters form a
- *   "gray list" that is ignored in this detection algorithm:
- *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
- * IN assertion: the fields Freq of dyn_ltree are set.
- */
-local int detect_data_type(s)
-    deflate_state *s;
-{
-    /* block_mask is the bit mask of block-listed bytes
-     * set bits 0..6, 14..25, and 28..31
-     * 0xf3ffc07f = binary 11110011111111111100000001111111
-     */
-    unsigned long block_mask = 0xf3ffc07fUL;
-    int n;
-
-    /* Check for non-textual ("block-listed") bytes. */
-    for (n = 0; n <= 31; n++, block_mask >>= 1)
-        if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0))
-            return Z_BINARY;
-
-    /* Check for textual ("allow-listed") bytes. */
-    if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0
-            || s->dyn_ltree[13].Freq != 0)
-        return Z_TEXT;
-    for (n = 32; n < LITERALS; n++)
-        if (s->dyn_ltree[n].Freq != 0)
-            return Z_TEXT;
-
-    /* There are no "block-listed" or "allow-listed" bytes:
-     * this stream either is empty or has tolerated ("gray-listed") bytes only.
-     */
-    return Z_BINARY;
-}
-
-/* ===========================================================================
- * Reverse the first len bits of a code, using straightforward code (a faster
- * method would use a table)
- * IN assertion: 1 <= len <= 15
- */
-local unsigned bi_reverse(code, len)
-    unsigned code; /* the value to invert */
-    int len;       /* its bit length */
-{
-    register unsigned res = 0;
-    do {
-        res |= code & 1;
-        code >>= 1, res <<= 1;
-    } while (--len > 0);
-    return res >> 1;
-}
-
-/* ===========================================================================
- * Flush the bit buffer, keeping at most 7 bits in it.
- */
-local void bi_flush(s)
-    deflate_state *s;
-{
-    if (s->bi_valid == 16) {
-        put_short(s, s->bi_buf);
-        s->bi_buf = 0;
-        s->bi_valid = 0;
-    } else if (s->bi_valid >= 8) {
-        put_byte(s, (Byte)s->bi_buf);
-        s->bi_buf >>= 8;
-        s->bi_valid -= 8;
-    }
-}
-
-/* ===========================================================================
- * Flush the bit buffer and align the output on a byte boundary
- */
-local void bi_windup(s)
-    deflate_state *s;
-{
-    if (s->bi_valid > 8) {
-        put_short(s, s->bi_buf);
-    } else if (s->bi_valid > 0) {
-        put_byte(s, (Byte)s->bi_buf);
-    }
-    s->bi_buf = 0;
-    s->bi_valid = 0;
-#ifdef ZLIB_DEBUG
-    s->bits_sent = (s->bits_sent + 7) & ~7;
-#endif
-}
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/uncompr.c 5.15.17+dfsg-1/src/3rdparty/zlib/src/uncompr.c
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/uncompr.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/uncompr.c	2024-11-20 13:56:33.000000000 +0000
@@ -24,12 +24,8 @@
    Z_DATA_ERROR if the input data was corrupted, including if the input data is
    an incomplete zlib stream.
 */
-int ZEXPORT uncompress2(dest, destLen, source, sourceLen)
-    Bytef *dest;
-    uLongf *destLen;
-    const Bytef *source;
-    uLong *sourceLen;
-{
+int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source,
+                        uLong *sourceLen) {
     z_stream stream;
     int err;
     const uInt max = (uInt)-1;
@@ -83,11 +79,7 @@ int ZEXPORT uncompress2(dest, destLen, s
            err;
 }
 
-int ZEXPORT uncompress(dest, destLen, source, sourceLen)
-    Bytef *dest;
-    uLongf *destLen;
-    const Bytef *source;
-    uLong sourceLen;
-{
+int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, const Bytef *source,
+                       uLong sourceLen) {
     return uncompress2(dest, destLen, source, &sourceLen);
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/zconf.h 5.15.17+dfsg-1/src/3rdparty/zlib/src/zconf.h
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/zconf.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/zconf.h	2024-11-20 13:56:33.000000000 +0000
@@ -1,5 +1,5 @@
 /* zconf.h -- configuration of the zlib compression library
- * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
+ * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -245,7 +245,11 @@
 #endif
 
 #ifdef Z_SOLO
-   typedef unsigned long z_size_t;
+#  ifdef _WIN64
+     typedef unsigned long long z_size_t;
+#  else
+     typedef unsigned long z_size_t;
+#  endif
 #else
 #  define z_longlong long long
 #  if defined(NO_SIZE_T)
@@ -300,14 +304,6 @@
 #  endif
 #endif
 
-#ifndef Z_ARG /* function prototypes for stdarg */
-#  if defined(STDC) || defined(Z_HAVE_STDARG_H)
-#    define Z_ARG(args)  args
-#  else
-#    define Z_ARG(args)  ()
-#  endif
-#endif
-
 /* The following definitions for FAR are needed only for MSDOS mixed
  * model programming (small or medium model with some far allocations).
  * This was tested only with MSC; for other MSDOS compilers you may have
@@ -524,7 +520,7 @@ typedef uLong FAR uLongf;
 #if !defined(_WIN32) && defined(Z_LARGE64)
 #  define z_off64_t off64_t
 #else
-#  if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)
+#  if defined(_WIN32) && !defined(__GNUC__)
 #    define z_off64_t __int64
 #  else
 #    define z_off64_t z_off_t
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/zlib.h 5.15.17+dfsg-1/src/3rdparty/zlib/src/zlib.h
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/zlib.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/zlib.h	2024-11-20 13:56:33.000000000 +0000
@@ -1,7 +1,7 @@
 /* zlib.h -- interface of the 'zlib' general purpose compression library
-  version 1.2.13, October 13th, 2022
+  version 1.3.1, January 22nd, 2024
 
-  Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
+  Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -41,11 +41,11 @@
 extern "C" {
 #endif
 
-#define ZLIB_VERSION "1.2.13 (Qt)"
-#define ZLIB_VERNUM 0x12d0
+#define ZLIB_VERSION "1.3.1 (Qt)"
+#define ZLIB_VERNUM 0x1310
 #define ZLIB_VER_MAJOR 1
-#define ZLIB_VER_MINOR 2
-#define ZLIB_VER_REVISION 13
+#define ZLIB_VER_MINOR 3
+#define ZLIB_VER_REVISION 1
 #define ZLIB_VER_SUBREVISION 0
 
 /*
@@ -82,8 +82,8 @@ extern "C" {
   even in the case of corrupted input.
 */
 
-typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
-typedef void   (*free_func)  OF((voidpf opaque, voidpf address));
+typedef voidpf (*alloc_func)(voidpf opaque, uInt items, uInt size);
+typedef void   (*free_func)(voidpf opaque, voidpf address);
 
 struct internal_state;
 
@@ -221,7 +221,7 @@ typedef gz_header FAR *gz_headerp;
 
                         /* basic functions */
 
-ZEXTERN const char * ZEXPORT zlibVersion OF((void));
+ZEXTERN const char * ZEXPORT zlibVersion(void);
 /* The application can compare zlibVersion and ZLIB_VERSION for consistency.
    If the first character differs, the library code actually used is not
    compatible with the zlib.h header file used by the application.  This check
@@ -229,12 +229,12 @@ ZEXTERN const char * ZEXPORT zlibVersion
  */
 
 /*
-ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
+ZEXTERN int ZEXPORT deflateInit(z_streamp strm, int level);
 
      Initializes the internal stream state for compression.  The fields
    zalloc, zfree and opaque must be initialized before by the caller.  If
    zalloc and zfree are set to Z_NULL, deflateInit updates them to use default
-   allocation functions.
+   allocation functions.  total_in, total_out, adler, and msg are initialized.
 
      The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
    1 gives best speed, 9 gives best compression, 0 gives no compression at all
@@ -251,7 +251,7 @@ ZEXTERN int ZEXPORT deflateInit OF((z_st
 */
 
 
-ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
+ZEXTERN int ZEXPORT deflate(z_streamp strm, int flush);
 /*
     deflate compresses as much data as possible, and stops when the input
   buffer becomes empty or the output buffer becomes full.  It may introduce
@@ -324,8 +324,8 @@ ZEXTERN int ZEXPORT deflate OF((z_stream
   with the same value of the flush parameter and more output space (updated
   avail_out), until the flush is complete (deflate returns with non-zero
   avail_out).  In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
-  avail_out is greater than six to avoid repeated flush markers due to
-  avail_out == 0 on return.
+  avail_out is greater than six when the flush marker begins, in order to avoid
+  repeated flush markers upon calling deflate() again when avail_out == 0.
 
     If the parameter flush is set to Z_FINISH, pending input is processed,
   pending output is flushed and deflate returns with Z_STREAM_END if there was
@@ -364,7 +364,7 @@ ZEXTERN int ZEXPORT deflate OF((z_stream
 */
 
 
-ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
+ZEXTERN int ZEXPORT deflateEnd(z_streamp strm);
 /*
      All dynamically allocated data structures for this stream are freed.
    This function discards any unprocessed input and does not flush any pending
@@ -379,7 +379,7 @@ ZEXTERN int ZEXPORT deflateEnd OF((z_str
 
 
 /*
-ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
+ZEXTERN int ZEXPORT inflateInit(z_streamp strm);
 
      Initializes the internal stream state for decompression.  The fields
    next_in, avail_in, zalloc, zfree and opaque must be initialized before by
@@ -387,7 +387,8 @@ ZEXTERN int ZEXPORT inflateInit OF((z_st
    read or consumed.  The allocation of a sliding window will be deferred to
    the first call of inflate (if the decompression does not complete on the
    first call).  If zalloc and zfree are set to Z_NULL, inflateInit updates
-   them to use default allocation functions.
+   them to use default allocation functions.  total_in, total_out, adler, and
+   msg are initialized.
 
      inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
    memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
@@ -401,7 +402,7 @@ ZEXTERN int ZEXPORT inflateInit OF((z_st
 */
 
 
-ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
+ZEXTERN int ZEXPORT inflate(z_streamp strm, int flush);
 /*
     inflate decompresses as much data as possible, and stops when the input
   buffer becomes empty or the output buffer becomes full.  It may introduce
@@ -521,7 +522,7 @@ ZEXTERN int ZEXPORT inflate OF((z_stream
 */
 
 
-ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
+ZEXTERN int ZEXPORT inflateEnd(z_streamp strm);
 /*
      All dynamically allocated data structures for this stream are freed.
    This function discards any unprocessed input and does not flush any pending
@@ -539,12 +540,12 @@ ZEXTERN int ZEXPORT inflateEnd OF((z_str
 */
 
 /*
-ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
-                                     int  level,
-                                     int  method,
-                                     int  windowBits,
-                                     int  memLevel,
-                                     int  strategy));
+ZEXTERN int ZEXPORT deflateInit2(z_streamp strm,
+                                 int level,
+                                 int method,
+                                 int windowBits,
+                                 int memLevel,
+                                 int strategy);
 
      This is another version of deflateInit with more compression options.  The
    fields zalloc, zfree and opaque must be initialized before by the caller.
@@ -611,9 +612,9 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_s
    compression: this will be done by deflate().
 */
 
-ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
-                                             const Bytef *dictionary,
-                                             uInt  dictLength));
+ZEXTERN int ZEXPORT deflateSetDictionary(z_streamp strm,
+                                         const Bytef *dictionary,
+                                         uInt  dictLength);
 /*
      Initializes the compression dictionary from the given byte sequence
    without producing any compressed output.  When using the zlib format, this
@@ -655,9 +656,9 @@ ZEXTERN int ZEXPORT deflateSetDictionary
    not perform any compression: this will be done by deflate().
 */
 
-ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm,
-                                             Bytef *dictionary,
-                                             uInt  *dictLength));
+ZEXTERN int ZEXPORT deflateGetDictionary(z_streamp strm,
+                                         Bytef *dictionary,
+                                         uInt  *dictLength);
 /*
      Returns the sliding dictionary being maintained by deflate.  dictLength is
    set to the number of bytes in the dictionary, and that many bytes are copied
@@ -677,8 +678,8 @@ ZEXTERN int ZEXPORT deflateGetDictionary
    stream state is inconsistent.
 */
 
-ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
-                                    z_streamp source));
+ZEXTERN int ZEXPORT deflateCopy(z_streamp dest,
+                                z_streamp source);
 /*
      Sets the destination stream as a complete copy of the source stream.
 
@@ -695,20 +696,20 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_st
    destination.
 */
 
-ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
+ZEXTERN int ZEXPORT deflateReset(z_streamp strm);
 /*
      This function is equivalent to deflateEnd followed by deflateInit, but
    does not free and reallocate the internal compression state.  The stream
    will leave the compression level and any other attributes that may have been
-   set unchanged.
+   set unchanged.  total_in, total_out, adler, and msg are initialized.
 
      deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
    stream state was inconsistent (such as zalloc or state being Z_NULL).
 */
 
-ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
-                                      int level,
-                                      int strategy));
+ZEXTERN int ZEXPORT deflateParams(z_streamp strm,
+                                  int level,
+                                  int strategy);
 /*
      Dynamically update the compression level and compression strategy.  The
    interpretation of level and strategy is as in deflateInit2().  This can be
@@ -733,7 +734,7 @@ ZEXTERN int ZEXPORT deflateParams OF((z_
    Then no more input data should be provided before the deflateParams() call.
    If this is done, the old level and strategy will be applied to the data
    compressed before deflateParams(), and the new level and strategy will be
-   applied to the the data compressed after deflateParams().
+   applied to the data compressed after deflateParams().
 
      deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream
    state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if
@@ -744,11 +745,11 @@ ZEXTERN int ZEXPORT deflateParams OF((z_
    retried with more output space.
 */
 
-ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
-                                    int good_length,
-                                    int max_lazy,
-                                    int nice_length,
-                                    int max_chain));
+ZEXTERN int ZEXPORT deflateTune(z_streamp strm,
+                                int good_length,
+                                int max_lazy,
+                                int nice_length,
+                                int max_chain);
 /*
      Fine tune deflate's internal compression parameters.  This should only be
    used by someone who understands the algorithm used by zlib's deflate for
@@ -761,8 +762,8 @@ ZEXTERN int ZEXPORT deflateTune OF((z_st
    returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
  */
 
-ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
-                                       uLong sourceLen));
+ZEXTERN uLong ZEXPORT deflateBound(z_streamp strm,
+                                   uLong sourceLen);
 /*
      deflateBound() returns an upper bound on the compressed size after
    deflation of sourceLen bytes.  It must be called after deflateInit() or
@@ -776,9 +777,9 @@ ZEXTERN uLong ZEXPORT deflateBound OF((z
    than Z_FINISH or Z_NO_FLUSH are used.
 */
 
-ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm,
-                                       unsigned *pending,
-                                       int *bits));
+ZEXTERN int ZEXPORT deflatePending(z_streamp strm,
+                                   unsigned *pending,
+                                   int *bits);
 /*
      deflatePending() returns the number of bytes and bits of output that have
    been generated, but not yet provided in the available output.  The bytes not
@@ -791,9 +792,9 @@ ZEXTERN int ZEXPORT deflatePending OF((z
    stream state was inconsistent.
  */
 
-ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
-                                     int bits,
-                                     int value));
+ZEXTERN int ZEXPORT deflatePrime(z_streamp strm,
+                                 int bits,
+                                 int value);
 /*
      deflatePrime() inserts bits in the deflate output stream.  The intent
    is that this function is used to start off the deflate output with the bits
@@ -808,8 +809,8 @@ ZEXTERN int ZEXPORT deflatePrime OF((z_s
    source stream state was inconsistent.
 */
 
-ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
-                                         gz_headerp head));
+ZEXTERN int ZEXPORT deflateSetHeader(z_streamp strm,
+                                     gz_headerp head);
 /*
      deflateSetHeader() provides gzip header information for when a gzip
    stream is requested by deflateInit2().  deflateSetHeader() may be called
@@ -825,16 +826,17 @@ ZEXTERN int ZEXPORT deflateSetHeader OF(
    gzip file" and give up.
 
      If deflateSetHeader is not used, the default gzip header has text false,
-   the time set to zero, and os set to 255, with no extra, name, or comment
-   fields.  The gzip header is returned to the default state by deflateReset().
+   the time set to zero, and os set to the current operating system, with no
+   extra, name, or comment fields.  The gzip header is returned to the default
+   state by deflateReset().
 
      deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
    stream state was inconsistent.
 */
 
 /*
-ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
-                                     int  windowBits));
+ZEXTERN int ZEXPORT inflateInit2(z_streamp strm,
+                                 int windowBits);
 
      This is another version of inflateInit with an extra parameter.  The
    fields next_in, avail_in, zalloc, zfree and opaque must be initialized
@@ -887,9 +889,9 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_s
    deferred until inflate() is called.
 */
 
-ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
-                                             const Bytef *dictionary,
-                                             uInt  dictLength));
+ZEXTERN int ZEXPORT inflateSetDictionary(z_streamp strm,
+                                         const Bytef *dictionary,
+                                         uInt  dictLength);
 /*
      Initializes the decompression dictionary from the given uncompressed byte
    sequence.  This function must be called immediately after a call of inflate,
@@ -910,9 +912,9 @@ ZEXTERN int ZEXPORT inflateSetDictionary
    inflate().
 */
 
-ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,
-                                             Bytef *dictionary,
-                                             uInt  *dictLength));
+ZEXTERN int ZEXPORT inflateGetDictionary(z_streamp strm,
+                                         Bytef *dictionary,
+                                         uInt  *dictLength);
 /*
      Returns the sliding dictionary being maintained by inflate.  dictLength is
    set to the number of bytes in the dictionary, and that many bytes are copied
@@ -925,7 +927,7 @@ ZEXTERN int ZEXPORT inflateGetDictionary
    stream state is inconsistent.
 */
 
-ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
+ZEXTERN int ZEXPORT inflateSync(z_streamp strm);
 /*
      Skips invalid compressed data until a possible full flush point (see above
    for the description of deflate with Z_FULL_FLUSH) can be found, or until all
@@ -938,14 +940,14 @@ ZEXTERN int ZEXPORT inflateSync OF((z_st
      inflateSync returns Z_OK if a possible full flush point has been found,
    Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point
    has been found, or Z_STREAM_ERROR if the stream structure was inconsistent.
-   In the success case, the application may save the current current value of
-   total_in which indicates where valid compressed data was found.  In the
-   error case, the application may repeatedly call inflateSync, providing more
-   input each time, until success or end of the input data.
+   In the success case, the application may save the current value of total_in
+   which indicates where valid compressed data was found.  In the error case,
+   the application may repeatedly call inflateSync, providing more input each
+   time, until success or end of the input data.
 */
 
-ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
-                                    z_streamp source));
+ZEXTERN int ZEXPORT inflateCopy(z_streamp dest,
+                                z_streamp source);
 /*
      Sets the destination stream as a complete copy of the source stream.
 
@@ -960,18 +962,19 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_st
    destination.
 */
 
-ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
+ZEXTERN int ZEXPORT inflateReset(z_streamp strm);
 /*
      This function is equivalent to inflateEnd followed by inflateInit,
    but does not free and reallocate the internal decompression state.  The
    stream will keep attributes that may have been set by inflateInit2.
+   total_in, total_out, adler, and msg are initialized.
 
      inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
    stream state was inconsistent (such as zalloc or state being Z_NULL).
 */
 
-ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,
-                                      int windowBits));
+ZEXTERN int ZEXPORT inflateReset2(z_streamp strm,
+                                  int windowBits);
 /*
      This function is the same as inflateReset, but it also permits changing
    the wrap and window size requests.  The windowBits parameter is interpreted
@@ -984,9 +987,9 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_
    the windowBits parameter is invalid.
 */
 
-ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
-                                     int bits,
-                                     int value));
+ZEXTERN int ZEXPORT inflatePrime(z_streamp strm,
+                                 int bits,
+                                 int value);
 /*
      This function inserts bits in the inflate input stream.  The intent is
    that this function is used to start inflating at a bit position in the
@@ -1005,7 +1008,7 @@ ZEXTERN int ZEXPORT inflatePrime OF((z_s
    stream state was inconsistent.
 */
 
-ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));
+ZEXTERN long ZEXPORT inflateMark(z_streamp strm);
 /*
      This function returns two values, one in the lower 16 bits of the return
    value, and the other in the remaining upper bits, obtained by shifting the
@@ -1033,8 +1036,8 @@ ZEXTERN long ZEXPORT inflateMark OF((z_s
    source stream state was inconsistent.
 */
 
-ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
-                                         gz_headerp head));
+ZEXTERN int ZEXPORT inflateGetHeader(z_streamp strm,
+                                     gz_headerp head);
 /*
      inflateGetHeader() requests that gzip header information be stored in the
    provided gz_header structure.  inflateGetHeader() may be called after
@@ -1074,8 +1077,8 @@ ZEXTERN int ZEXPORT inflateGetHeader OF(
 */
 
 /*
-ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
-                                        unsigned char FAR *window));
+ZEXTERN int ZEXPORT inflateBackInit(z_streamp strm, int windowBits,
+                                    unsigned char FAR *window);
 
      Initialize the internal stream state for decompression using inflateBack()
    calls.  The fields zalloc, zfree and opaque in strm must be initialized
@@ -1095,13 +1098,13 @@ ZEXTERN int ZEXPORT inflateBackInit OF((
    the version of the header file.
 */
 
-typedef unsigned (*in_func) OF((void FAR *,
-                                z_const unsigned char FAR * FAR *));
-typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
-
-ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
-                                    in_func in, void FAR *in_desc,
-                                    out_func out, void FAR *out_desc));
+typedef unsigned (*in_func)(void FAR *,
+                            z_const unsigned char FAR * FAR *);
+typedef int (*out_func)(void FAR *, unsigned char FAR *, unsigned);
+
+ZEXTERN int ZEXPORT inflateBack(z_streamp strm,
+                                in_func in, void FAR *in_desc,
+                                out_func out, void FAR *out_desc);
 /*
      inflateBack() does a raw inflate with a single call using a call-back
    interface for input and output.  This is potentially more efficient than
@@ -1169,7 +1172,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_st
    cannot return Z_OK.
 */
 
-ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
+ZEXTERN int ZEXPORT inflateBackEnd(z_streamp strm);
 /*
      All memory allocated by inflateBackInit() is freed.
 
@@ -1177,7 +1180,7 @@ ZEXTERN int ZEXPORT inflateBackEnd OF((z
    state was inconsistent.
 */
 
-ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
+ZEXTERN uLong ZEXPORT zlibCompileFlags(void);
 /* Return flags indicating compile-time options.
 
     Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
@@ -1230,8 +1233,8 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags O
    you need special options.
 */
 
-ZEXTERN int ZEXPORT compress OF((Bytef *dest,   uLongf *destLen,
-                                 const Bytef *source, uLong sourceLen));
+ZEXTERN int ZEXPORT compress(Bytef *dest,   uLongf *destLen,
+                             const Bytef *source, uLong sourceLen);
 /*
      Compresses the source buffer into the destination buffer.  sourceLen is
    the byte length of the source buffer.  Upon entry, destLen is the total size
@@ -1245,9 +1248,9 @@ ZEXTERN int ZEXPORT compress OF((Bytef *
    buffer.
 */
 
-ZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,
-                                  const Bytef *source, uLong sourceLen,
-                                  int level));
+ZEXTERN int ZEXPORT compress2(Bytef *dest,   uLongf *destLen,
+                              const Bytef *source, uLong sourceLen,
+                              int level);
 /*
      Compresses the source buffer into the destination buffer.  The level
    parameter has the same meaning as in deflateInit.  sourceLen is the byte
@@ -1261,15 +1264,15 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef
    Z_STREAM_ERROR if the level parameter is invalid.
 */
 
-ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));
+ZEXTERN uLong ZEXPORT compressBound(uLong sourceLen);
 /*
      compressBound() returns an upper bound on the compressed size after
    compress() or compress2() on sourceLen bytes.  It would be used before a
    compress() or compress2() call to allocate the destination buffer.
 */
 
-ZEXTERN int ZEXPORT uncompress OF((Bytef *dest,   uLongf *destLen,
-                                   const Bytef *source, uLong sourceLen));
+ZEXTERN int ZEXPORT uncompress(Bytef *dest,   uLongf *destLen,
+                               const Bytef *source, uLong sourceLen);
 /*
      Decompresses the source buffer into the destination buffer.  sourceLen is
    the byte length of the source buffer.  Upon entry, destLen is the total size
@@ -1286,8 +1289,8 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef
    buffer with the uncompressed data up to that point.
 */
 
-ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest,   uLongf *destLen,
-                                    const Bytef *source, uLong *sourceLen));
+ZEXTERN int ZEXPORT uncompress2(Bytef *dest,   uLongf *destLen,
+                                const Bytef *source, uLong *sourceLen);
 /*
      Same as uncompress, except that sourceLen is a pointer, where the
    length of the source is *sourceLen.  On return, *sourceLen is the number of
@@ -1306,7 +1309,7 @@ ZEXTERN int ZEXPORT uncompress2 OF((Byte
 typedef struct gzFile_s *gzFile;    /* semi-opaque gzip file descriptor */
 
 /*
-ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
+ZEXTERN gzFile ZEXPORT gzopen(const char *path, const char *mode);
 
      Open the gzip (.gz) file at path for reading and decompressing, or
    compressing and writing.  The mode parameter is as in fopen ("rb" or "wb")
@@ -1343,7 +1346,7 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const
    file could not be opened.
 */
 
-ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
+ZEXTERN gzFile ZEXPORT gzdopen(int fd, const char *mode);
 /*
      Associate a gzFile with the file descriptor fd.  File descriptors are
    obtained from calls like open, dup, creat, pipe or fileno (if the file has
@@ -1366,7 +1369,7 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int f
    will not detect if fd is invalid (unless fd is -1).
 */
 
-ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
+ZEXTERN int ZEXPORT gzbuffer(gzFile file, unsigned size);
 /*
      Set the internal buffer size used by this library's functions for file to
    size.  The default buffer size is 8192 bytes.  This function must be called
@@ -1382,7 +1385,7 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile
    too late.
 */
 
-ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
+ZEXTERN int ZEXPORT gzsetparams(gzFile file, int level, int strategy);
 /*
      Dynamically update the compression level and strategy for file.  See the
    description of deflateInit2 for the meaning of these parameters. Previously
@@ -1393,7 +1396,7 @@ ZEXTERN int ZEXPORT gzsetparams OF((gzFi
    or Z_MEM_ERROR if there is a memory allocation error.
 */
 
-ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
+ZEXTERN int ZEXPORT gzread(gzFile file, voidp buf, unsigned len);
 /*
      Read and decompress up to len uncompressed bytes from file into buf.  If
    the input file is not in gzip format, gzread copies the given number of
@@ -1423,8 +1426,8 @@ ZEXTERN int ZEXPORT gzread OF((gzFile fi
    Z_STREAM_ERROR.
 */
 
-ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems,
-                                     gzFile file));
+ZEXTERN z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems,
+                                 gzFile file);
 /*
      Read and decompress up to nitems items of size size from file into buf,
    otherwise operating as gzread() does.  This duplicates the interface of
@@ -1449,14 +1452,14 @@ ZEXTERN z_size_t ZEXPORT gzfread OF((voi
    file, resetting and retrying on end-of-file, when size is not 1.
 */
 
-ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len));
+ZEXTERN int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len);
 /*
      Compress and write the len uncompressed bytes at buf to file. gzwrite
    returns the number of uncompressed bytes written or 0 in case of error.
 */
 
-ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size,
-                                      z_size_t nitems, gzFile file));
+ZEXTERN z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size,
+                                  z_size_t nitems, gzFile file);
 /*
      Compress and write nitems items of size size from buf to file, duplicating
    the interface of stdio's fwrite(), with size_t request and return types.  If
@@ -1469,7 +1472,7 @@ ZEXTERN z_size_t ZEXPORT gzfwrite OF((vo
    is returned, and the error state is set to Z_STREAM_ERROR.
 */
 
-ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));
+ZEXTERN int ZEXPORTVA gzprintf(gzFile file, const char *format, ...);
 /*
      Convert, format, compress, and write the arguments (...) to file under
    control of the string format, as in fprintf.  gzprintf returns the number of
@@ -1484,7 +1487,7 @@ ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gz
    This can be determined using zlibCompileFlags().
 */
 
-ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
+ZEXTERN int ZEXPORT gzputs(gzFile file, const char *s);
 /*
      Compress and write the given null-terminated string s to file, excluding
    the terminating null character.
@@ -1492,7 +1495,7 @@ ZEXTERN int ZEXPORT gzputs OF((gzFile fi
      gzputs returns the number of characters written, or -1 in case of error.
 */
 
-ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
+ZEXTERN char * ZEXPORT gzgets(gzFile file, char *buf, int len);
 /*
      Read and decompress bytes from file into buf, until len-1 characters are
    read, or until a newline character is read and transferred to buf, or an
@@ -1506,13 +1509,13 @@ ZEXTERN char * ZEXPORT gzgets OF((gzFile
    buf are indeterminate.
 */
 
-ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
+ZEXTERN int ZEXPORT gzputc(gzFile file, int c);
 /*
      Compress and write c, converted to an unsigned char, into file.  gzputc
    returns the value that was written, or -1 in case of error.
 */
 
-ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
+ZEXTERN int ZEXPORT gzgetc(gzFile file);
 /*
      Read and decompress one byte from file.  gzgetc returns this byte or -1
    in case of end of file or error.  This is implemented as a macro for speed.
@@ -1521,7 +1524,7 @@ ZEXTERN int ZEXPORT gzgetc OF((gzFile fi
    points to has been clobbered or not.
 */
 
-ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
+ZEXTERN int ZEXPORT gzungetc(int c, gzFile file);
 /*
      Push c back onto the stream for file to be read as the first character on
    the next read.  At least one character of push-back is always allowed.
@@ -1533,7 +1536,7 @@ ZEXTERN int ZEXPORT gzungetc OF((int c,
    gzseek() or gzrewind().
 */
 
-ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
+ZEXTERN int ZEXPORT gzflush(gzFile file, int flush);
 /*
      Flush all pending output to file.  The parameter flush is as in the
    deflate() function.  The return value is the zlib error number (see function
@@ -1549,8 +1552,8 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile f
 */
 
 /*
-ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
-                                   z_off_t offset, int whence));
+ZEXTERN z_off_t ZEXPORT gzseek(gzFile file,
+                               z_off_t offset, int whence);
 
      Set the starting position to offset relative to whence for the next gzread
    or gzwrite on file.  The offset represents a number of bytes in the
@@ -1568,7 +1571,7 @@ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFil
    would be before the current position.
 */
 
-ZEXTERN int ZEXPORT    gzrewind OF((gzFile file));
+ZEXTERN int ZEXPORT    gzrewind(gzFile file);
 /*
      Rewind file. This function is supported only for reading.
 
@@ -1576,7 +1579,7 @@ ZEXTERN int ZEXPORT    gzrewind OF((gzFi
 */
 
 /*
-ZEXTERN z_off_t ZEXPORT    gztell OF((gzFile file));
+ZEXTERN z_off_t ZEXPORT    gztell(gzFile file);
 
      Return the starting position for the next gzread or gzwrite on file.
    This position represents a number of bytes in the uncompressed data stream,
@@ -1587,7 +1590,7 @@ ZEXTERN z_off_t ZEXPORT    gztell OF((gz
 */
 
 /*
-ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));
+ZEXTERN z_off_t ZEXPORT gzoffset(gzFile file);
 
      Return the current compressed (actual) read or write offset of file.  This
    offset includes the count of bytes that precede the gzip stream, for example
@@ -1596,7 +1599,7 @@ ZEXTERN z_off_t ZEXPORT gzoffset OF((gzF
    be used for a progress indicator.  On error, gzoffset() returns -1.
 */
 
-ZEXTERN int ZEXPORT gzeof OF((gzFile file));
+ZEXTERN int ZEXPORT gzeof(gzFile file);
 /*
      Return true (1) if the end-of-file indicator for file has been set while
    reading, false (0) otherwise.  Note that the end-of-file indicator is set
@@ -1611,7 +1614,7 @@ ZEXTERN int ZEXPORT gzeof OF((gzFile fil
    has grown since the previous end of file was detected.
 */
 
-ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
+ZEXTERN int ZEXPORT gzdirect(gzFile file);
 /*
      Return true (1) if file is being copied directly while reading, or false
    (0) if file is a gzip stream being decompressed.
@@ -1632,7 +1635,7 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile
    gzip file reading and decompression, which may not be desired.)
 */
 
-ZEXTERN int ZEXPORT    gzclose OF((gzFile file));
+ZEXTERN int ZEXPORT    gzclose(gzFile file);
 /*
      Flush all pending output for file, if necessary, close file and
    deallocate the (de)compression state.  Note that once file is closed, you
@@ -1645,8 +1648,8 @@ ZEXTERN int ZEXPORT    gzclose OF((gzFil
    last read ended in the middle of a gzip stream, or Z_OK on success.
 */
 
-ZEXTERN int ZEXPORT gzclose_r OF((gzFile file));
-ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));
+ZEXTERN int ZEXPORT gzclose_r(gzFile file);
+ZEXTERN int ZEXPORT gzclose_w(gzFile file);
 /*
      Same as gzclose(), but gzclose_r() is only for use when reading, and
    gzclose_w() is only for use when writing or appending.  The advantage to
@@ -1657,7 +1660,7 @@ ZEXTERN int ZEXPORT gzclose_w OF((gzFile
    zlib library.
 */
 
-ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
+ZEXTERN const char * ZEXPORT gzerror(gzFile file, int *errnum);
 /*
      Return the error message for the last error which occurred on file.
    errnum is set to zlib error number.  If an error occurred in the file system
@@ -1673,7 +1676,7 @@ ZEXTERN const char * ZEXPORT gzerror OF(
    functions above that do not distinguish those cases in their return values.
 */
 
-ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
+ZEXTERN void ZEXPORT gzclearerr(gzFile file);
 /*
      Clear the error and end-of-file flags for file.  This is analogous to the
    clearerr() function in stdio.  This is useful for continuing to read a gzip
@@ -1690,7 +1693,7 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFi
    library.
 */
 
-ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
+ZEXTERN uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len);
 /*
      Update a running Adler-32 checksum with the bytes buf[0..len-1] and
    return the updated checksum. An Adler-32 value is in the range of a 32-bit
@@ -1710,15 +1713,15 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong
      if (adler != original_adler) error();
 */
 
-ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf,
-                                    z_size_t len));
+ZEXTERN uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf,
+                                z_size_t len);
 /*
      Same as adler32(), but with a size_t length.
 */
 
 /*
-ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
-                                          z_off_t len2));
+ZEXTERN uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2,
+                                      z_off_t len2);
 
      Combine two Adler-32 checksums into one.  For two sequences of bytes, seq1
    and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
@@ -1728,7 +1731,7 @@ ZEXTERN uLong ZEXPORT adler32_combine OF
    negative, the result has no meaning or utility.
 */
 
-ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
+ZEXTERN uLong ZEXPORT crc32(uLong crc, const Bytef *buf, uInt len);
 /*
      Update a running CRC-32 with the bytes buf[0..len-1] and return the
    updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer.
@@ -1746,30 +1749,30 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong cr
      if (crc != original_crc) error();
 */
 
-ZEXTERN uLong ZEXPORT crc32_z OF((uLong crc, const Bytef *buf,
-                                  z_size_t len));
+ZEXTERN uLong ZEXPORT crc32_z(uLong crc, const Bytef *buf,
+                              z_size_t len);
 /*
      Same as crc32(), but with a size_t length.
 */
 
 /*
-ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
+ZEXTERN uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2);
 
      Combine two CRC-32 check values into one.  For two sequences of bytes,
    seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
    calculated for each, crc1 and crc2.  crc32_combine() returns the CRC-32
    check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
-   len2.
+   len2. len2 must be non-negative.
 */
 
 /*
-ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t len2));
+ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t len2);
 
      Return the operator corresponding to length len2, to be used with
-   crc32_combine_op().
+   crc32_combine_op(). len2 must be non-negative.
 */
 
-ZEXTERN uLong ZEXPORT crc32_combine_op OF((uLong crc1, uLong crc2, uLong op));
+ZEXTERN uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op);
 /*
      Give the same result as crc32_combine(), using op in place of len2. op is
    is generated from len2 by crc32_combine_gen(). This will be faster than
@@ -1782,20 +1785,20 @@ ZEXTERN uLong ZEXPORT crc32_combine_op O
 /* deflateInit and inflateInit are macros to allow checking the zlib version
  * and the compiler's view of z_stream:
  */
-ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
-                                     const char *version, int stream_size));
-ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
-                                     const char *version, int stream_size));
-ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int  level, int  method,
-                                      int windowBits, int memLevel,
-                                      int strategy, const char *version,
-                                      int stream_size));
-ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int  windowBits,
-                                      const char *version, int stream_size));
-ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
-                                         unsigned char FAR *window,
-                                         const char *version,
-                                         int stream_size));
+ZEXTERN int ZEXPORT deflateInit_(z_streamp strm, int level,
+                                 const char *version, int stream_size);
+ZEXTERN int ZEXPORT inflateInit_(z_streamp strm,
+                                 const char *version, int stream_size);
+ZEXTERN int ZEXPORT deflateInit2_(z_streamp strm, int  level, int  method,
+                                  int windowBits, int memLevel,
+                                  int strategy, const char *version,
+                                  int stream_size);
+ZEXTERN int ZEXPORT inflateInit2_(z_streamp strm, int  windowBits,
+                                  const char *version, int stream_size);
+ZEXTERN int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits,
+                                     unsigned char FAR *window,
+                                     const char *version,
+                                     int stream_size);
 #ifdef Z_PREFIX_SET
 #  define z_deflateInit(strm, level) \
           deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))
@@ -1840,7 +1843,7 @@ struct gzFile_s {
     unsigned char *next;
     z_off64_t pos;
 };
-ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file));  /* backward compatibility */
+ZEXTERN int ZEXPORT gzgetc_(gzFile file);       /* backward compatibility */
 #ifdef Z_PREFIX_SET
 #  undef z_gzgetc
 #  define z_gzgetc(g) \
@@ -1857,13 +1860,13 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile f
  * without large file support, _LFS64_LARGEFILE must also be true
  */
 #ifdef Z_LARGE64
-   ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
-   ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
-   ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
-   ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
-   ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));
-   ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));
-   ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off64_t));
+   ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *);
+   ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int);
+   ZEXTERN z_off64_t ZEXPORT gztell64(gzFile);
+   ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile);
+   ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off64_t);
+   ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off64_t);
+   ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off64_t);
 #endif
 
 #if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)
@@ -1885,50 +1888,50 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile f
 #    define crc32_combine_gen crc32_combine_gen64
 #  endif
 #  ifndef Z_LARGE64
-     ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
-     ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int));
-     ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile));
-     ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile));
-     ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
-     ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
-     ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t));
+     ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *);
+     ZEXTERN z_off_t ZEXPORT gzseek64(gzFile, z_off_t, int);
+     ZEXTERN z_off_t ZEXPORT gztell64(gzFile);
+     ZEXTERN z_off_t ZEXPORT gzoffset64(gzFile);
+     ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t);
+     ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t);
+     ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t);
 #  endif
 #else
-   ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));
-   ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int));
-   ZEXTERN z_off_t ZEXPORT gztell OF((gzFile));
-   ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));
-   ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
-   ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
-   ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t));
+   ZEXTERN gzFile ZEXPORT gzopen(const char *, const char *);
+   ZEXTERN z_off_t ZEXPORT gzseek(gzFile, z_off_t, int);
+   ZEXTERN z_off_t ZEXPORT gztell(gzFile);
+   ZEXTERN z_off_t ZEXPORT gzoffset(gzFile);
+   ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t);
+   ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t);
+   ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t);
 #endif
 
 #else /* Z_SOLO */
 
-   ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
-   ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
-   ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t));
+   ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t);
+   ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t);
+   ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t);
 
 #endif /* !Z_SOLO */
 
 /* undocumented functions */
-ZEXTERN const char   * ZEXPORT zError           OF((int));
-ZEXTERN int            ZEXPORT inflateSyncPoint OF((z_streamp));
-ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table    OF((void));
-ZEXTERN int            ZEXPORT inflateUndermine OF((z_streamp, int));
-ZEXTERN int            ZEXPORT inflateValidate OF((z_streamp, int));
-ZEXTERN unsigned long  ZEXPORT inflateCodesUsed OF((z_streamp));
-ZEXTERN int            ZEXPORT inflateResetKeep OF((z_streamp));
-ZEXTERN int            ZEXPORT deflateResetKeep OF((z_streamp));
+ZEXTERN const char   * ZEXPORT zError(int);
+ZEXTERN int            ZEXPORT inflateSyncPoint(z_streamp);
+ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table(void);
+ZEXTERN int            ZEXPORT inflateUndermine(z_streamp, int);
+ZEXTERN int            ZEXPORT inflateValidate(z_streamp, int);
+ZEXTERN unsigned long  ZEXPORT inflateCodesUsed(z_streamp);
+ZEXTERN int            ZEXPORT inflateResetKeep(z_streamp);
+ZEXTERN int            ZEXPORT deflateResetKeep(z_streamp);
 #if defined(_WIN32) && !defined(Z_SOLO)
-ZEXTERN gzFile         ZEXPORT gzopen_w OF((const wchar_t *path,
-                                            const char *mode));
+ZEXTERN gzFile         ZEXPORT gzopen_w(const wchar_t *path,
+                                        const char *mode);
 #endif
 #if defined(STDC) || defined(Z_HAVE_STDARG_H)
 #  ifndef Z_SOLO
-ZEXTERN int            ZEXPORTVA gzvprintf Z_ARG((gzFile file,
-                                                  const char *format,
-                                                  va_list va));
+ZEXTERN int            ZEXPORTVA gzvprintf(gzFile file,
+                                           const char *format,
+                                           va_list va);
 #  endif
 #endif
 
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/zutil.c 5.15.17+dfsg-1/src/3rdparty/zlib/src/zutil.c
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/zutil.c	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/zutil.c	2024-11-20 13:56:33.000000000 +0000
@@ -24,13 +24,11 @@ z_const char * const z_errmsg[10] = {
 };
 
 
-const char * ZEXPORT zlibVersion()
-{
+const char * ZEXPORT zlibVersion(void) {
     return ZLIB_VERSION;
 }
 
-uLong ZEXPORT zlibCompileFlags()
-{
+uLong ZEXPORT zlibCompileFlags(void) {
     uLong flags;
 
     flags = 0;
@@ -121,9 +119,7 @@ uLong ZEXPORT zlibCompileFlags()
 #  endif
 int ZLIB_INTERNAL z_verbose = verbose;
 
-void ZLIB_INTERNAL z_error(m)
-    char *m;
-{
+void ZLIB_INTERNAL z_error(char *m) {
     fprintf(stderr, "%s\n", m);
     exit(1);
 }
@@ -132,9 +128,7 @@ void ZLIB_INTERNAL z_error(m)
 /* exported to allow conversion of error code to string for compress() and
  * uncompress()
  */
-const char * ZEXPORT zError(err)
-    int err;
-{
+const char * ZEXPORT zError(int err) {
     return ERR_MSG(err);
 }
 
@@ -148,22 +142,14 @@ const char * ZEXPORT zError(err)
 
 #ifndef HAVE_MEMCPY
 
-void ZLIB_INTERNAL zmemcpy(dest, source, len)
-    Bytef* dest;
-    const Bytef* source;
-    uInt  len;
-{
+void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len) {
     if (len == 0) return;
     do {
         *dest++ = *source++; /* ??? to be unrolled */
     } while (--len != 0);
 }
 
-int ZLIB_INTERNAL zmemcmp(s1, s2, len)
-    const Bytef* s1;
-    const Bytef* s2;
-    uInt  len;
-{
+int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len) {
     uInt j;
 
     for (j = 0; j < len; j++) {
@@ -172,10 +158,7 @@ int ZLIB_INTERNAL zmemcmp(s1, s2, len)
     return 0;
 }
 
-void ZLIB_INTERNAL zmemzero(dest, len)
-    Bytef* dest;
-    uInt  len;
-{
+void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len) {
     if (len == 0) return;
     do {
         *dest++ = 0;  /* ??? to be unrolled */
@@ -216,8 +199,7 @@ local ptr_table table[MAX_PTR];
  * a protected system like OS/2. Use Microsoft C instead.
  */
 
-voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size)
-{
+voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) {
     voidpf buf;
     ulg bsize = (ulg)items*size;
 
@@ -242,8 +224,7 @@ voidpf ZLIB_INTERNAL zcalloc(voidpf opaq
     return buf;
 }
 
-void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
-{
+void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
     int n;
 
     (void)opaque;
@@ -279,14 +260,12 @@ void ZLIB_INTERNAL zcfree(voidpf opaque,
 #  define _hfree   hfree
 #endif
 
-voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size)
-{
+voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) {
     (void)opaque;
     return _halloc((long)items, size);
 }
 
-void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
-{
+void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
     (void)opaque;
     _hfree(ptr);
 }
@@ -299,25 +278,18 @@ void ZLIB_INTERNAL zcfree(voidpf opaque,
 #ifndef MY_ZCALLOC /* Any system without a special alloc function */
 
 #ifndef STDC
-extern voidp  malloc OF((uInt size));
-extern voidp  calloc OF((uInt items, uInt size));
-extern void   free   OF((voidpf ptr));
+extern voidp malloc(uInt size);
+extern voidp calloc(uInt items, uInt size);
+extern void free(voidpf ptr);
 #endif
 
-voidpf ZLIB_INTERNAL zcalloc(opaque, items, size)
-    voidpf opaque;
-    unsigned items;
-    unsigned size;
-{
+voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) {
     (void)opaque;
     return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
                               (voidpf)calloc(items, size);
 }
 
-void ZLIB_INTERNAL zcfree(opaque, ptr)
-    voidpf opaque;
-    voidpf ptr;
-{
+void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
     (void)opaque;
     free(ptr);
 }
diff -pruN 5.15.15+dfsg-2/src/3rdparty/zlib/src/zutil.h 5.15.17+dfsg-1/src/3rdparty/zlib/src/zutil.h
--- 5.15.15+dfsg-2/src/3rdparty/zlib/src/zutil.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/3rdparty/zlib/src/zutil.h	2024-11-20 13:56:33.000000000 +0000
@@ -1,5 +1,5 @@
 /* zutil.h -- internal interface and configuration of the compression library
- * Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler
+ * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -64,7 +64,7 @@ typedef unsigned long  ulg;
 extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
 /* (size given to avoid silly warnings with Visual C++) */
 
-#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
+#define ERR_MSG(err) z_errmsg[(err) < -6 || (err) > 2 ? 9 : 2 - (err)]
 
 #define ERR_RETURN(strm,err) \
   return (strm->msg = ERR_MSG(err), (err))
@@ -145,22 +145,8 @@ extern z_const char * const z_errmsg[10]
 #  endif
 #endif
 
-#if defined(MACOS) || defined(TARGET_OS_MAC)
+#if defined(MACOS)
 #  define OS_CODE  7
-#  ifndef Z_SOLO
-#    if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
-#      include <unix.h> /* for fdopen */
-#    else
-//     We need to include stdio.h here because zlib.h will include TargetConditionals.h
-//     This will define TARGET_OS_MAC that leads to this check.
-//     Since zutil.h will include gzguts.h and gzguts.h includes stdio.h
-//     AFTER check for fdopen we need to include stdio.h directly
-#      include <stdio.h>
-#      ifndef fdopen
-#        define fdopen(fd,mode) NULL /* No fdopen() */
-#      endif
-#    endif
-#  endif
 #endif
 
 #ifdef __acorn
@@ -183,18 +169,6 @@ extern z_const char * const z_errmsg[10]
 #  define OS_CODE 19
 #endif
 
-#if defined(_BEOS_) || defined(RISCOS)
-#  define fdopen(fd,mode) NULL /* No fdopen() */
-#endif
-
-#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX
-#  if defined(_WIN32_WCE)
-#    define fdopen(fd,mode) NULL /* No fdopen() */
-#  else
-#    define fdopen(fd,type)  _fdopen(fd,type)
-#  endif
-#endif
-
 #if defined(__BORLANDC__) && !defined(MSDOS)
   #pragma warn -8004
   #pragma warn -8008
@@ -204,9 +178,9 @@ extern z_const char * const z_errmsg[10]
 /* provide prototypes for these when building zlib without LFS */
 #if !defined(_WIN32) && \
     (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
-    ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
-    ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
-    ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t));
+    ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t);
+    ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t);
+    ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t);
 #endif
 
         /* common defaults */
@@ -245,16 +219,16 @@ extern z_const char * const z_errmsg[10]
 #    define zmemzero(dest, len) memset(dest, 0, len)
 #  endif
 #else
-   void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));
-   int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));
-   void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len));
+   void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len);
+   int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len);
+   void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len);
 #endif
 
 /* Diagnostic functions */
 #ifdef ZLIB_DEBUG
 #  include <stdio.h>
    extern int ZLIB_INTERNAL z_verbose;
-   extern void ZLIB_INTERNAL z_error OF((char *m));
+   extern void ZLIB_INTERNAL z_error(char *m);
 #  define Assert(cond,msg) {if(!(cond)) z_error(msg);}
 #  define Trace(x) {if (z_verbose>=0) fprintf x ;}
 #  define Tracev(x) {if (z_verbose>0) fprintf x ;}
@@ -271,9 +245,9 @@ extern z_const char * const z_errmsg[10]
 #endif
 
 #ifndef Z_SOLO
-   voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items,
-                                    unsigned size));
-   void ZLIB_INTERNAL zcfree  OF((voidpf opaque, voidpf ptr));
+   voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items,
+                                unsigned size);
+   void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr);
 #endif
 
 #define ZALLOC(strm, items, size) \
diff -pruN 5.15.15+dfsg-2/src/corelib/corelib.pro 5.15.17+dfsg-1/src/corelib/corelib.pro
--- 5.15.15+dfsg-2/src/corelib/corelib.pro	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/corelib.pro	2024-11-20 13:56:33.000000000 +0000
@@ -29,6 +29,16 @@ ANDROID_PERMISSIONS = \
     android.permission.INTERNET \
     android.permission.WRITE_EXTERNAL_STORAGE
 
+current = Qt_$$QT_MAJOR_VERSION
+isEmpty(QT_NAMESPACE): tag_symbol = qt_version_tag
+else: tag_symbol = qt_version_tag_$$QT_NAMESPACE
+for(i, 0..$$QT_MINOR_VERSION) {
+   previous = $$current
+   current = Qt_$${QT_MAJOR_VERSION}.$$i
+   equals(i, $$QT_MINOR_VERSION): MODULE_VERSCRIPT_CONTENT_EXT += "$$current { $$tag_symbol; } $$previous;"
+   else: MODULE_VERSCRIPT_CONTENT_EXT += "$$current {} $$previous;"
+}
+
 # QtCore can't be compiled with -Wl,-no-undefined because it uses the "environ"
 # variable and on FreeBSD and OpenBSD, this variable is in the final executable itself.
 # OpenBSD 6.0 will include environ in libc.
diff -pruN 5.15.15+dfsg-2/src/corelib/doc/snippets/code/doc_src_qalgorithms.cpp 5.15.17+dfsg-1/src/corelib/doc/snippets/code/doc_src_qalgorithms.cpp
--- 5.15.15+dfsg-2/src/corelib/doc/snippets/code/doc_src_qalgorithms.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/doc/snippets/code/doc_src_qalgorithms.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -181,15 +181,6 @@ qCount(list.begin(), list.end(), 7, coun
 //! [9]
 
 
-//! [10]
-double pi = 3.14;
-double e = 2.71;
-
-qSwap(pi, e);
-// pi == 2.71, e == 3.14
-//! [10]
-
-
 //! [11]
 QList<int> list;
 list << 33 << 12 << 68 << 6 << 12;
diff -pruN 5.15.15+dfsg-2/src/corelib/doc/src/includes/models.qdocinc 5.15.17+dfsg-1/src/corelib/doc/src/includes/models.qdocinc
--- 5.15.15+dfsg-2/src/corelib/doc/src/includes/models.qdocinc	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/doc/src/includes/models.qdocinc	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,14 @@
+//! [thread-safety-section1]
+\section1 Thread safety
+
+Being a \l {Accessing QObject Subclasses from Other Threads}{subclass of
+QObject}, \1 is not \l {Reentrancy and Thread-Safety}{thread-safe}. Any \1
+model-related API should only be called from the thread the model object lives
+in. If the \1 is connected with a view, that means the GUI thread, as that is
+where the view lives, and it will call into the model from the GUI thread.
+Using a background thread to populate or modify the contents of a model is
+possible, but requires care, as the background thread cannot call any
+model-related API directly. Instead, you should queue the updates and apply
+them in the main thread. This can be done with \l {Signals and Slots Across
+Threads}{queued connections}.
+//! [thread-safety-section1]
diff -pruN 5.15.15+dfsg-2/src/corelib/global/qcompilerdetection.h 5.15.17+dfsg-1/src/corelib/global/qcompilerdetection.h
--- 5.15.15+dfsg-2/src/corelib/global/qcompilerdetection.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/global/qcompilerdetection.h	2024-11-20 13:56:33.000000000 +0000
@@ -110,8 +110,10 @@
 #  endif
 #  define Q_DECL_EXPORT __declspec(dllexport)
 #  define Q_DECL_IMPORT __declspec(dllimport)
-#  define QT_MAKE_UNCHECKED_ARRAY_ITERATOR(x) stdext::make_unchecked_array_iterator(x) // Since _MSC_VER >= 1800
-#  define QT_MAKE_CHECKED_ARRAY_ITERATOR(x, N) stdext::make_checked_array_iterator(x, size_t(N)) // Since _MSC_VER >= 1500
+#  if _MSC_VER < 1938 // stdext is deprecated since VS 2022 17.8
+#    define QT_MAKE_UNCHECKED_ARRAY_ITERATOR(x) stdext::make_unchecked_array_iterator(x) // Since _MSC_VER >= 1800
+#    define QT_MAKE_CHECKED_ARRAY_ITERATOR(x, N) stdext::make_checked_array_iterator(x, size_t(N)) // Since _MSC_VER >= 1500
+#  endif
 /* Intel C++ disguising as Visual C++: the `using' keyword avoids warnings */
 #  if defined(__INTEL_COMPILER)
 #    undef Q_CC_MSVC_ONLY
@@ -1065,6 +1067,11 @@
 // Also disable <atomic>, since it's clearly not there
 #  undef Q_COMPILER_ATOMICS
 # endif
+# if defined(Q_CC_CLANG) && defined(Q_OS_MAC) && defined(__cpp_lib_memory_resource) \
+   && ((defined(__MAC_OS_X_VERSION_MIN_REQUIRED)  && __MAC_OS_X_VERSION_MIN_REQUIRED  < 140000) \
+    || (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 170000))
+#  undef __cpp_lib_memory_resource // Only supported on macOS 14 and iOS 17
+# endif
 # if defined(Q_CC_CLANG) && defined(Q_CC_INTEL) && Q_CC_INTEL >= 1500
 // ICC 15.x and 16.0 have their own implementation of std::atomic, which is activated when in Clang mode
 // (probably because libc++'s <atomic> on OS X failed to compile), but they're missing some
diff -pruN 5.15.15+dfsg-2/src/corelib/global/qendian.cpp 5.15.17+dfsg-1/src/corelib/global/qendian.cpp
--- 5.15.15+dfsg-2/src/corelib/global/qendian.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/global/qendian.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -480,8 +480,8 @@ QT_BEGIN_NAMESPACE
     The template parameter \c T must be a C++ integer type:
     \list
        \li 8-bit: char, signed char, unsigned char, qint8, quint8
-       \li 16-bit: short, unsigned short, qint16, quint16, char16_t (C++11)
-       \li 32-bit: int, unsigned int, qint32, quint32, char32_t (C++11)
+       \li 16-bit: short, unsigned short, qint16, quint16, char16_t
+       \li 32-bit: int, unsigned int, qint32, quint32, char32_t
        \li 64-bit: long long, unsigned long long, qint64, quint64
        \li platform-specific size: long, unsigned long
        \li pointer size: qintptr, quintptr, qptrdiff
diff -pruN 5.15.15+dfsg-2/src/corelib/global/qglobal.h 5.15.17+dfsg-1/src/corelib/global/qglobal.h
--- 5.15.15+dfsg-2/src/corelib/global/qglobal.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/global/qglobal.h	2024-11-20 13:56:33.000000000 +0000
@@ -307,6 +307,8 @@ typedef double qreal;
 #  define QT_DEPRECATED_CONSTRUCTOR
 #  undef Q_DECL_ENUMERATOR_DEPRECATED
 #  define Q_DECL_ENUMERATOR_DEPRECATED
+#  undef Q_DECL_ENUMERATOR_DEPRECATED_X
+#  define Q_DECL_ENUMERATOR_DEPRECATED_X(ignored)
 #endif
 
 #ifndef QT_DEPRECATED_WARNINGS_SINCE
diff -pruN 5.15.15+dfsg-2/src/corelib/io/qsettings.cpp 5.15.17+dfsg-1/src/corelib/io/qsettings.cpp
--- 5.15.15+dfsg-2/src/corelib/io/qsettings.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/io/qsettings.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -2241,8 +2241,8 @@ void QConfFileSettingsPrivate::ensureSec
     following files are used by default:
 
     \list 1
-    \li \c{$HOME/.config/MySoft/Star Runner.conf} (Qt for Embedded Linux: \c{$HOME/Settings/MySoft/Star Runner.conf})
-    \li \c{$HOME/.config/MySoft.conf} (Qt for Embedded Linux: \c{$HOME/Settings/MySoft.conf})
+    \li \c{$HOME/.config/MySoft/Star Runner.conf}
+    \li \c{$HOME/.config/MySoft.conf}
     \li for each directory <dir> in $XDG_CONFIG_DIRS: \c{<dir>/MySoft/Star Runner.conf}
     \li for each directory <dir> in $XDG_CONFIG_DIRS: \c{<dir>/MySoft.conf}
     \endlist
@@ -2279,8 +2279,8 @@ void QConfFileSettingsPrivate::ensureSec
     used on Unix, \macos, and iOS:
 
     \list 1
-    \li \c{$HOME/.config/MySoft/Star Runner.ini} (Qt for Embedded Linux: \c{$HOME/Settings/MySoft/Star Runner.ini})
-    \li \c{$HOME/.config/MySoft.ini} (Qt for Embedded Linux: \c{$HOME/Settings/MySoft.ini})
+    \li \c{$HOME/.config/MySoft/Star Runner.ini}
+    \li \c{$HOME/.config/MySoft.ini}
     \li for each directory <dir> in $XDG_CONFIG_DIRS: \c{<dir>/MySoft/Star Runner.ini}
     \li for each directory <dir> in $XDG_CONFIG_DIRS: \c{<dir>/MySoft.ini}
     \endlist
@@ -3498,8 +3498,6 @@ void QSettings::setUserIniPath(const QSt
     \row                                                        \li SystemScope \li \c FOLDERID_ProgramData
     \row    \li{1,2} Unix        \li{1,2} NativeFormat, IniFormat \li UserScope   \li \c $HOME/.config
     \row                                                        \li SystemScope \li \c /etc/xdg
-    \row    \li{1,2} Qt for Embedded Linux \li{1,2} NativeFormat, IniFormat \li UserScope   \li \c $HOME/Settings
-    \row                                                        \li SystemScope \li \c /etc/xdg
     \row    \li{1,2} \macos and iOS   \li{1,2} IniFormat               \li UserScope   \li \c $HOME/.config
     \row                                                        \li SystemScope \li \c /etc/xdg
     \endtable
diff -pruN 5.15.15+dfsg-2/src/corelib/io/qt_attribution.json 5.15.17+dfsg-1/src/corelib/io/qt_attribution.json
--- 5.15.15+dfsg-2/src/corelib/io/qt_attribution.json	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/io/qt_attribution.json	2024-11-20 13:56:33.000000000 +0000
@@ -20,7 +20,7 @@ supported by Qt (by the QNetworkCookieJa
 
     "Homepage": "Consult https://github.com/publicsuffix/list for the sha1 but download from ...",
     "Homepage": "http://publicsuffix.org/",
-    "Version": "4e6c53ca9c667b74a7d332d1512d2c362af91516, fetched on 2023-07-31",
+    "Version": "883ced078a83f9d79a98933145425c221a5e51f0, fetched on 2024-01-30",
     "License": "Mozilla Public License 2.0",
     "LicenseFile": "PSL-LICENSE.txt",
     "LicenseId": "MPL-2.0",
diff -pruN 5.15.15+dfsg-2/src/corelib/io/qurltlds_p.h 5.15.17+dfsg-1/src/corelib/io/qurltlds_p.h
--- 5.15.15+dfsg-2/src/corelib/io/qurltlds_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/io/qurltlds_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -54,14817 +54,15686 @@
 
 #include <QtCore/private/qglobal_p.h>
 
-QT_BEGIN_NAMESPACE
-
 // note to maintainer:
 // this file should be updated before each release ->
 // for instructions see the program at
 // util/corelib/qurl-generateTLDs/
 
-static const quint16 tldCount = 9106;
+QT_BEGIN_NAMESPACE
+
+static const quint16 tldCount = 9562;
 static const quint32 tldIndices[] = {
 0,
-18,
-18,
-34,
-34,
-34,
+17,
+33,
 42,
-51,
-51,
-84,
-97,
-115,
-125,
-125,
-143,
-170,
-170,
-220,
-220,
-233,
-253,
-253,
-265,
-280,
-305,
-339,
-339,
-339,
-366,
+57,
+57,
+57,
+82,
+82,
+82,
+82,
+82,
+121,
+121,
+162,
+173,
+182,
+182,
+195,
+209,
+292,
+303,
+308,
+355,
+368,
+377,
 388,
 388,
-403,
-408,
-436,
-446,
-446,
-457,
-457,
-457,
-457,
-457,
-509,
-534,
-566,
-566,
-600,
-609,
-616,
-616,
+388,
+400,
+400,
+425,
+460,
+460,
+460,
+488,
+502,
+502,
+560,
+570,
+570,
+570,
+570,
+570,
+579,
+585,
+585,
+606,
 616,
 616,
-626,
-635,
-644,
-668,
-691,
-699,
-734,
-742,
-763,
-769,
-787,
-797,
-797,
-797,
-797,
-804,
-849,
-849,
-849,
-875,
-912,
-950,
-950,
-950,
-957,
-989,
-989,
-989,
-995,
-1015,
-1054,
-1059,
-1059,
-1063,
-1088,
-1097,
-1104,
-1118,
-1128,
-1128,
-1171,
-1171,
-1181,
-1201,
-1230,
-1230,
-1242,
-1257,
-1271,
+634,
+650,
+670,
+670,
+680,
+680,
+710,
+716,
+720,
+732,
+743,
+743,
+775,
+801,
+814,
+833,
+833,
+873,
+873,
+915,
+925,
+942,
+962,
+962,
+972,
+972,
+972,
+993,
+1000,
+1000,
+1000,
+1019,
+1032,
+1042,
+1053,
+1111,
+1123,
+1161,
+1232,
+1232,
+1239,
+1246,
+1253,
+1253,
+1260,
 1278,
 1278,
-1324,
-1347,
-1347,
-1347,
-1347,
-1378,
+1285,
+1298,
+1298,
+1309,
+1309,
+1330,
+1364,
 1378,
-1395,
-1401,
-1431,
-1431,
-1431,
-1431,
-1431,
-1443,
-1443,
-1443,
-1471,
-1480,
-1480,
-1480,
-1485,
-1497,
-1497,
-1502,
-1522,
-1522,
-1535,
-1542,
-1559,
-1575,
-1575,
-1582,
-1582,
-1582,
-1601,
-1629,
-1629,
-1645,
-1645,
-1645,
-1645,
-1651,
-1658,
-1658,
-1672,
-1672,
+1397,
+1413,
+1413,
+1429,
+1473,
+1493,
+1526,
+1536,
+1536,
+1569,
+1576,
+1583,
+1583,
+1583,
+1590,
+1597,
+1604,
+1604,
+1604,
+1670,
+1687,
 1694,
-1701,
-1720,
-1720,
-1733,
-1733,
-1743,
-1743,
-1743,
-1743,
-1743,
-1743,
-1743,
 1760,
-1812,
-1821,
-1826,
-1836,
-1844,
-1874,
-1874,
+1771,
+1771,
+1778,
+1798,
+1811,
+1834,
 1874,
-1883,
-1892,
-1927,
-1951,
-1975,
-1994,
-1994,
-1994,
-1994,
-1994,
-1994,
-2007,
-2047,
-2047,
-2075,
-2075,
-2105,
-2105,
-2115,
-2120,
-2161,
-2161,
-2182,
-2182,
-2189,
-2189,
-2208,
-2232,
-2248,
+1891,
+1891,
+1891,
+1970,
+1970,
+2009,
+2009,
+2016,
+2024,
+2030,
+2030,
+2037,
+2037,
+2044,
+2044,
+2050,
+2072,
+2079,
+2079,
+2117,
+2129,
+2136,
+2136,
+2136,
+2150,
+2150,
+2176,
+2187,
+2204,
+2221,
+2239,
 2256,
 2256,
-2256,
-2256,
-2256,
-2261,
-2278,
-2297,
-2313,
-2345,
-2345,
-2345,
-2356,
-2364,
-2421,
-2438,
-2450,
-2450,
-2450,
-2450,
-2450,
-2450,
-2489,
-2517,
-2533,
-2551,
-2551,
+2270,
+2295,
+2307,
+2342,
+2348,
+2381,
+2395,
+2402,
+2402,
+2402,
+2448,
+2448,
+2454,
+2484,
+2516,
+2516,
+2568,
+2586,
 2593,
-2593,
-2610,
-2635,
-2635,
-2651,
-2658,
-2681,
-2708,
-2708,
-2708,
-2736,
-2743,
-2743,
-2770,
-2770,
-2798,
-2821,
-2828,
-2838,
-2838,
-2853,
-2853,
-2896,
-2926,
-2937,
-2952,
-2962,
-2986,
-2990,
-3000,
-3000,
-3000,
-3000,
-3027,
-3027,
-3045,
-3087,
-3099,
-3099,
-3115,
-3123,
-3123,
-3123,
-3123,
-3163,
-3171,
-3171,
-3181,
-3193,
-3213,
-3213,
-3213,
-3230,
-3249,
-3249,
-3268,
-3268,
-3272,
+2611,
+2618,
+2618,
+2636,
+2647,
+2647,
+2654,
+2677,
+2705,
+2705,
+2728,
+2728,
+2741,
+2741,
+2781,
+2824,
+2840,
+2879,
+2879,
+2898,
+2909,
+2916,
+2957,
+2996,
+3014,
+3014,
+3031,
+3031,
+3037,
+3037,
+3079,
+3119,
+3119,
+3119,
+3137,
+3166,
+3166,
+3172,
+3208,
+3221,
+3246,
+3246,
+3246,
+3261,
+3274,
+3281,
+3281,
 3295,
 3295,
 3295,
-3300,
-3317,
-3317,
-3330,
-3330,
-3330,
-3375,
-3375,
-3390,
-3390,
-3390,
-3390,
-3390,
-3402,
-3402,
-3402,
-3402,
-3402,
-3402,
-3413,
-3428,
-3456,
-3456,
-3481,
-3481,
-3530,
-3530,
-3563,
-3585,
-3585,
-3585,
-3595,
-3604,
-3604,
-3648,
-3667,
-3689,
-3689,
-3689,
-3738,
-3784,
-3790,
+3301,
+3301,
+3301,
+3309,
+3334,
+3338,
+3361,
+3395,
+3401,
+3401,
+3433,
+3445,
+3445,
+3452,
+3452,
+3471,
+3471,
+3497,
+3517,
+3517,
+3517,
+3517,
+3541,
+3541,
+3547,
+3554,
+3574,
+3602,
+3602,
+3602,
+3602,
+3609,
+3638,
+3651,
+3676,
+3683,
+3719,
+3733,
+3751,
+3759,
 3790,
-3811,
-3818,
-3818,
-3818,
-3861,
-3861,
-3861,
-3861,
-3877,
-3877,
-3877,
-3888,
-3899,
-3899,
-3904,
-3911,
-3911,
-3911,
-3911,
-3911,
-3921,
-3921,
-3921,
-3921,
-3921,
-3948,
-3965,
-3982,
-3990,
-3990,
+3797,
+3822,
+3839,
+3839,
+3846,
+3865,
+3865,
+3894,
+3901,
+3905,
+3912,
+3966,
+3966,
+3966,
 4004,
-4048,
-4048,
-4064,
-4064,
-4064,
-4083,
-4083,
-4083,
-4093,
-4093,
-4093,
-4093,
-4093,
-4104,
-4104,
-4104,
-4111,
-4124,
-4124,
-4148,
-4155,
-4177,
-4192,
-4192,
-4192,
-4192,
-4192,
-4220,
-4228,
-4248,
-4248,
-4257,
-4289,
-4299,
-4299,
-4306,
-4306,
-4306,
-4319,
-4319,
-4319,
-4356,
-4356,
-4356,
-4356,
-4361,
-4383,
-4411,
-4420,
-4458,
-4458,
-4473,
-4489,
-4519,
-4531,
-4531,
-4555,
-4577,
-4577,
-4577,
-4582,
-4594,
-4617,
-4617,
-4617,
-4640,
-4659,
-4659,
-4666,
-4677,
-4711,
-4725,
-4725,
-4725,
+4028,
+4038,
+4038,
+4051,
+4066,
+4073,
+4087,
+4114,
+4153,
+4167,
+4174,
+4185,
+4199,
+4199,
+4213,
+4213,
+4213,
+4213,
+4238,
+4244,
+4263,
+4305,
+4311,
+4355,
+4359,
+4359,
+4366,
+4366,
+4366,
+4413,
+4439,
+4445,
+4465,
+4472,
+4502,
+4511,
+4511,
+4534,
+4534,
+4544,
+4562,
+4568,
+4568,
+4630,
+4637,
+4637,
+4669,
+4669,
+4669,
+4676,
+4687,
+4713,
+4720,
+4748,
 4757,
-4779,
-4852,
-4852,
-4876,
-4876,
-4890,
-4925,
-4942,
-4942,
-4964,
-4964,
-4980,
-4989,
-5009,
-5009,
-5019,
-5019,
-5045,
-5045,
-5086,
-5098,
-5104,
-5104,
-5104,
-5104,
-5139,
-5146,
-5201,
-5216,
-5216,
-5221,
-5221,
-5233,
-5248,
-5253,
-5265,
-5272,
-5278,
-5278,
-5278,
-5285,
-5300,
-5300,
-5321,
-5321,
-5359,
-5359,
-5380,
-5380,
-5397,
-5407,
-5414,
+4791,
+4801,
+4808,
+4808,
+4822,
+4853,
+4885,
+4885,
+4935,
+4941,
+4941,
+4977,
+5011,
+5079,
+5093,
+5109,
+5109,
+5109,
+5116,
+5122,
+5122,
+5122,
+5171,
+5171,
+5207,
+5234,
+5250,
+5257,
+5270,
+5326,
+5333,
+5385,
+5399,
+5406,
+5418,
+5418,
 5430,
-5430,
-5443,
-5443,
-5443,
+5445,
+5460,
 5460,
-5468,
-5475,
-5489,
-5526,
-5543,
-5562,
-5562,
-5562,
-5562,
-5562,
-5572,
-5620,
-5631,
-5631,
-5631,
-5643,
-5643,
-5661,
-5670,
-5670,
-5675,
-5691,
-5691,
-5691,
-5730,
-5730,
-5757,
-5757,
-5764,
-5764,
-5768,
-5805,
-5805,
-5844,
-5844,
-5844,
-5896,
-5917,
-5917,
-5948,
-5962,
-5987,
-5998,
-5998,
-6015,
-6020,
-6057,
-6100,
-6107,
-6107,
-6107,
-6107,
-6130,
-6163,
-6186,
-6199,
-6211,
-6211,
-6225,
-6225,
-6252,
+5467,
+5487,
+5498,
+5516,
+5523,
+5548,
+5557,
+5563,
+5592,
+5599,
+5612,
+5635,
+5648,
+5663,
+5688,
+5710,
+5733,
+5758,
+5765,
+5799,
+5799,
+5806,
+5812,
+5812,
+5824,
+5830,
+5837,
+5857,
+5864,
+5881,
+5881,
+5881,
+5893,
+5893,
+5899,
+5899,
+5919,
+5919,
+5957,
+5957,
+5957,
+5957,
+5971,
+5978,
+5984,
+6009,
+6047,
+6065,
+6093,
+6104,
+6153,
+6169,
+6169,
+6169,
+6176,
+6180,
+6196,
+6202,
+6202,
+6228,
+6241,
+6264,
+6264,
+6264,
+6264,
 6274,
-6289,
-6308,
-6327,
-6343,
-6352,
-6363,
-6378,
-6378,
-6378,
-6378,
-6378,
-6406,
-6406,
-6437,
-6445,
-6451,
-6451,
-6469,
-6478,
-6496,
-6496,
-6496,
-6496,
-6519,
-6519,
-6539,
-6562,
-6578,
-6602,
-6602,
-6602,
-6602,
-6609,
-6638,
-6638,
-6638,
-6653,
-6653,
-6681,
-6698,
-6698,
-6698,
-6698,
-6698,
-6735,
-6749,
-6749,
-6783,
-6793,
-6793,
-6793,
-6793,
-6793,
-6793,
-6805,
-6839,
-6846,
-6846,
-6846,
-6865,
-6884,
-6884,
-6884,
-6893,
-6893,
-6908,
-6908,
-6908,
-6916,
-6916,
-6931,
-6985,
-6985,
-7016,
-7016,
-7044,
-7044,
-7088,
-7124,
-7169,
-7180,
-7197,
-7215,
-7215,
-7247,
-7247,
-7251,
-7265,
+6284,
+6299,
+6306,
+6318,
+6325,
+6393,
+6393,
+6393,
+6443,
+6463,
+6475,
+6475,
+6475,
+6475,
+6475,
+6514,
+6549,
+6574,
+6591,
+6605,
+6624,
+6636,
+6684,
+6684,
+6696,
+6696,
+6696,
+6696,
+6696,
+6696,
+6700,
+6707,
+6714,
+6714,
+6714,
+6714,
+6714,
+6721,
+6740,
+6740,
+6753,
+6782,
+6794,
+6828,
+6841,
+6874,
+6874,
+6881,
+6881,
+6881,
+6917,
+6950,
+6963,
+6963,
+6963,
+6970,
+6970,
+7003,
+7003,
+7048,
+7060,
+7067,
+7089,
+7089,
+7089,
+7127,
+7179,
+7179,
+7198,
+7203,
+7203,
+7223,
+7223,
+7223,
+7231,
+7231,
+7237,
+7237,
 7284,
-7324,
-7352,
-7383,
-7383,
-7383,
-7431,
-7431,
-7436,
-7436,
-7436,
-7436,
-7449,
-7470,
-7499,
-7516,
-7543,
-7543,
-7543,
-7543,
-7585,
-7592,
-7592,
-7592,
+7298,
+7298,
+7298,
+7298,
+7305,
+7327,
+7327,
+7339,
+7339,
+7386,
+7406,
+7422,
+7440,
+7440,
+7440,
+7446,
+7446,
+7453,
+7477,
+7488,
+7517,
+7527,
+7560,
+7565,
+7565,
 7592,
-7608,
-7608,
-7616,
-7616,
-7643,
-7643,
-7643,
-7643,
-7643,
-7654,
-7661,
-7665,
-7697,
-7697,
-7697,
-7754,
-7771,
-7782,
-7798,
-7816,
-7820,
-7820,
-7837,
-7837,
-7843,
-7855,
-7879,
-7879,
-7879,
-7895,
-7895,
-7895,
-7895,
-7895,
-7912,
-7912,
-7912,
-7919,
-7936,
-7936,
-7940,
-7963,
-7978,
-8006,
-8032,
-8032,
-8032,
-8043,
-8056,
-8066,
-8081,
-8081,
-8081,
-8085,
-8101,
-8121,
-8125,
-8125,
-8125,
-8125,
-8131,
+7599,
+7604,
+7655,
+7655,
+7663,
+7663,
+7715,
+7715,
+7715,
+7722,
+7722,
+7722,
+7738,
+7738,
+7738,
+7803,
+7828,
+7828,
+7834,
+7841,
+7877,
+7887,
+7892,
+7905,
+7905,
+7905,
+7905,
+7905,
+7924,
+7976,
+7976,
+8023,
+8035,
+8045,
+8077,
+8077,
+8096,
+8096,
+8096,
+8096,
+8096,
+8124,
+8124,
+8124,
 8142,
-8182,
-8182,
-8182,
-8182,
-8209,
-8209,
-8209,
-8209,
-8225,
-8225,
-8225,
-8237,
-8244,
-8244,
-8244,
-8275,
-8294,
-8310,
-8310,
-8310,
-8317,
-8317,
-8332,
-8332,
-8332,
-8361,
-8361,
-8370,
-8374,
-8374,
-8418,
+8142,
+8163,
+8163,
+8163,
+8163,
+8181,
+8195,
+8195,
+8205,
+8219,
+8219,
+8219,
+8219,
+8260,
+8271,
+8286,
+8295,
+8295,
+8295,
+8301,
+8301,
+8301,
+8301,
+8301,
+8323,
+8333,
+8343,
+8351,
+8351,
+8351,
+8364,
+8369,
+8381,
+8381,
+8386,
+8386,
+8386,
+8406,
+8426,
+8442,
+8442,
+8449,
 8454,
-8487,
-8497,
-8497,
-8509,
-8542,
-8542,
-8542,
-8566,
-8606,
-8642,
-8647,
-8647,
-8651,
-8651,
-8651,
-8681,
-8681,
-8681,
-8681,
-8692,
-8701,
-8714,
-8714,
-8739,
-8749,
-8760,
-8779,
-8789,
-8796,
-8807,
-8807,
-8807,
-8813,
-8813,
-8813,
-8813,
-8813,
-8820,
-8826,
-8826,
-8844,
-8860,
-8881,
-8881,
-8881,
-8893,
-8913,
-8935,
-8935,
-8935,
-8942,
-8957,
-8967,
-8967,
-8985,
-8985,
-9021,
-9021,
-9032,
-9032,
-9045,
-9045,
-9045,
-9054,
-9085,
-9104,
-9157,
-9157,
-9171,
-9195,
-9195,
-9205,
-9205,
-9238,
-9248,
-9248,
-9301,
-9301,
-9320,
-9320,
-9320,
-9320,
-9331,
-9350,
-9350,
-9360,
-9379,
-9379,
-9388,
-9388,
-9404,
-9404,
-9422,
-9438,
-9438,
-9467,
-9479,
-9493,
-9493,
-9502,
-9502,
-9552,
-9552,
+8454,
+8462,
+8491,
+8498,
+8505,
+8512,
+8512,
+8522,
+8555,
+8614,
+8620,
+8668,
+8668,
+8668,
+8668,
+8668,
+8685,
+8696,
+8746,
+8752,
+8801,
+8810,
+8839,
+8846,
+8864,
+8864,
+8897,
+8910,
+8959,
+8968,
+8992,
+8996,
+9002,
+9016,
+9016,
+9048,
+9048,
+9061,
+9061,
+9061,
+9068,
+9080,
+9080,
+9080,
+9080,
+9098,
+9117,
+9117,
+9135,
+9135,
+9135,
+9142,
+9142,
+9142,
+9142,
+9168,
+9168,
+9187,
+9187,
+9187,
+9199,
+9208,
+9244,
+9244,
+9263,
+9270,
+9270,
+9281,
+9321,
+9356,
+9373,
+9385,
+9405,
+9447,
+9447,
+9447,
+9447,
+9458,
+9466,
+9471,
+9505,
+9505,
+9505,
+9518,
+9518,
+9527,
 9552,
-9562,
-9572,
-9608,
-9608,
-9608,
-9608,
-9620,
-9631,
-9649,
+9559,
+9568,
+9615,
+9615,
+9615,
+9630,
+9635,
+9635,
 9649,
-9661,
-9677,
-9695,
-9695,
-9704,
-9704,
-9704,
-9704,
-9725,
-9725,
-9725,
-9725,
-9725,
-9725,
-9725,
-9725,
-9725,
-9765,
-9765,
-9772,
-9810,
-9810,
-9829,
-9829,
-9829,
-9829,
-9836,
-9852,
-9862,
-9872,
-9872,
-9893,
-9929,
-9966,
-9982,
-10014,
-10036,
-10043,
-10077,
-10077,
-10096,
-10096,
-10096,
-10103,
-10140,
-10140,
-10163,
-10163,
-10189,
-10204,
-10218,
-10218,
-10218,
-10218,
-10247,
-10279,
-10299,
-10307,
-10322,
-10333,
-10344,
-10401,
-10401,
+9664,
+9706,
+9706,
+9706,
+9719,
+9726,
+9726,
+9726,
+9726,
+9726,
+9760,
+9760,
+9760,
+9774,
+9781,
+9781,
+9790,
+9844,
+9844,
+9861,
+9877,
+9887,
+9887,
+9887,
+9918,
+9976,
+9976,
+9988,
+9988,
+9988,
+10006,
+10023,
+10061,
+10072,
+10091,
+10121,
+10134,
+10171,
+10179,
+10179,
+10222,
+10222,
+10243,
+10263,
+10263,
+10263,
+10306,
+10319,
+10319,
+10358,
+10390,
+10397,
+10406,
 10412,
-10416,
-10425,
-10456,
-10471,
-10494,
-10494,
-10501,
-10508,
-10508,
-10508,
-10508,
-10529,
-10529,
-10541,
-10585,
-10609,
-10615,
-10635,
-10658,
-10696,
+10412,
+10412,
+10431,
+10437,
+10458,
+10464,
+10522,
+10522,
+10522,
+10532,
+10590,
+10590,
+10629,
+10665,
+10665,
+10694,
+10694,
+10694,
+10714,
 10714,
-10751,
-10751,
-10770,
-10777,
-10805,
-10805,
-10805,
-10829,
-10829,
-10829,
-10885,
-10912,
-10912,
-10919,
-10919,
-10958,
-10958,
-10958,
-10958,
-10983,
-10983,
-10993,
-11003,
-11003,
-11008,
-11037,
-11083,
-11083,
-11083,
-11090,
-11104,
-11104,
-11131,
-11138,
-11145,
-11145,
-11171,
-11197,
-11197,
-11222,
-11222,
-11222,
-11222,
-11235,
-11252,
-11252,
-11266,
-11266,
-11266,
+10721,
+10721,
+10721,
+10775,
+10795,
+10795,
+10809,
+10861,
+10861,
+10880,
+10880,
+10880,
+10880,
+10909,
+10965,
+10971,
+10971,
+10971,
+10981,
+10995,
+10995,
+10995,
+11047,
+11082,
+11097,
+11122,
+11136,
+11152,
+11152,
+11187,
+11210,
+11220,
+11220,
 11271,
-11278,
-11278,
-11285,
-11285,
-11303,
-11321,
-11321,
-11321,
-11321,
-11335,
-11366,
-11373,
-11380,
-11399,
-11399,
-11399,
-11409,
+11312,
+11324,
+11324,
+11331,
+11331,
+11331,
+11331,
+11349,
+11384,
+11384,
+11404,
+11404,
 11431,
-11444,
-11472,
-11472,
-11497,
-11497,
-11497,
-11518,
-11541,
-11560,
-11572,
-11572,
-11601,
-11601,
-11614,
-11614,
-11614,
-11627,
-11638,
-11638,
-11652,
-11668,
-11696,
-11696,
-11712,
-11719,
-11724,
-11729,
-11744,
-11751,
-11751,
-11764,
-11775,
-11775,
-11775,
-11804,
-11823,
-11823,
-11836,
-11854,
-11861,
-11874,
-11874,
-11874,
-11891,
-11898,
-11904,
-11934,
-11959,
-11966,
-11966,
-11972,
-12022,
-12022,
-12022,
-12038,
-12045,
-12058,
-12094,
-12101,
-12108,
-12115,
-12149,
-12156,
-12180,
-12194,
+11460,
+11475,
+11475,
+11475,
+11475,
+11475,
+11489,
+11489,
+11520,
+11538,
+11547,
+11547,
+11554,
+11575,
+11587,
+11604,
+11630,
+11634,
+11634,
+11666,
+11676,
+11702,
+11725,
+11725,
+11725,
+11725,
+11725,
+11742,
+11742,
+11742,
+11763,
+11763,
+11774,
+11781,
+11781,
+11793,
+11793,
+11793,
+11793,
+11843,
+11853,
+11897,
+11897,
+11926,
+11926,
+11926,
+11926,
+11936,
+11952,
+11952,
+11965,
+11965,
+11965,
+11977,
+11977,
+11981,
+11998,
+12013,
+12056,
+12056,
+12056,
+12065,
+12065,
+12065,
+12074,
+12074,
+12081,
+12081,
+12100,
+12111,
+12111,
+12122,
+12127,
+12127,
+12127,
+12150,
+12186,
+12193,
+12223,
 12232,
-12238,
-12251,
-12270,
-12285,
-12285,
-12298,
-12305,
-12347,
-12354,
-12374,
-12388,
-12424,
-12431,
-12474,
-12483,
-12490,
-12496,
-12504,
-12559,
-12566,
-12566,
-12573,
-12583,
-12639,
-12656,
-12656,
-12656,
-12661,
-12661,
-12669,
-12669,
-12682,
-12701,
-12701,
-12719,
-12733,
-12740,
-12744,
-12744,
-12750,
-12750,
-12768,
-12768,
-12775,
-12775,
-12814,
-12866,
-12873,
-12880,
-12938,
-12957,
-12971,
-12978,
-12985,
-12992,
-13049,
-13049,
-13063,
-13082,
-13082,
-13103,
-13103,
-13123,
-13135,
-13135,
-13154,
-13176,
-13183,
-13183,
-13216,
-13238,
-13263,
-13290,
-13316,
-13328,
-13337,
-13344,
-13354,
-13354,
-13364,
-13371,
-13371,
-13371,
-13386,
-13393,
-13417,
-13443,
-13450,
+12243,
+12247,
+12275,
+12296,
+12296,
+12316,
+12321,
+12343,
+12343,
+12355,
+12373,
+12373,
+12382,
+12382,
+12392,
+12392,
+12392,
+12392,
+12409,
+12409,
+12428,
+12428,
+12438,
+12445,
+12471,
+12479,
+12479,
+12493,
+12493,
+12503,
+12503,
+12533,
+12533,
+12533,
+12549,
+12549,
+12560,
+12581,
+12581,
+12602,
+12616,
+12632,
+12647,
+12647,
+12647,
+12647,
+12659,
+12674,
+12674,
+12686,
+12686,
+12705,
+12705,
+12728,
+12735,
+12735,
+12777,
+12793,
+12810,
+12817,
+12826,
+12846,
+12890,
+12906,
+12920,
+12936,
+12936,
+12949,
+12962,
+12973,
+13013,
+13017,
+13032,
+13067,
+13067,
+13067,
+13067,
+13085,
+13124,
+13124,
+13167,
+13180,
+13180,
+13180,
+13180,
+13180,
+13180,
+13207,
+13228,
+13228,
+13236,
+13249,
+13254,
+13276,
+13294,
+13294,
+13301,
+13311,
+13333,
+13366,
+13400,
+13426,
+13426,
+13467,
 13485,
-13510,
-13524,
-13553,
-13572,
-13572,
-13572,
-13586,
-13611,
-13611,
-13618,
-13624,
-13630,
-13686,
-13693,
-13693,
-13697,
-13703,
-13716,
-13745,
-13752,
-13777,
-13777,
-13815,
-13822,
-13849,
-13867,
-13885,
-13892,
-13921,
-13921,
-13934,
-13934,
-13963,
-13989,
-14010,
-14023,
-14036,
-14054,
-14087,
-14092,
-14110,
-14130,
-14139,
-14162,
-14162,
-14176,
-14189,
-14208,
-14234,
-14265,
-14289,
-14300,
-14305,
-14309,
-14309,
-14322,
-14349,
-14415,
-14427,
-14427,
-14436,
+13531,
+13569,
+13569,
+13580,
+13585,
+13594,
+13614,
+13614,
+13635,
+13705,
+13705,
+13719,
+13727,
+13731,
+13731,
+13731,
+13758,
+13758,
+13792,
+13802,
+13802,
+13812,
+13840,
+13840,
+13895,
+13895,
+13906,
+13906,
+13928,
+13949,
+13978,
+13978,
+13986,
+13986,
+13986,
+14024,
+14033,
+14046,
+14046,
+14058,
+14058,
+14070,
+14070,
+14083,
+14127,
+14158,
+14158,
+14177,
+14177,
+14177,
+14194,
+14211,
+14225,
+14327,
+14373,
+14386,
+14401,
+14411,
+14411,
+14422,
+14422,
 14447,
-14465,
-14505,
-14524,
-14550,
-14560,
-14577,
-14588,
-14596,
-14596,
-14605,
-14605,
-14627,
-14654,
-14665,
-14675,
-14686,
-14686,
-14693,
-14716,
-14734,
-14771,
-14777,
-14777,
-14817,
-14817,
-14831,
-14851,
-14859,
-14859,
-14859,
-14867,
-14867,
-14867,
-14898,
-14911,
-14911,
-14911,
-14916,
-14944,
-14944,
-14944,
-14951,
-14982,
-14982,
-14982,
-14996,
-14996,
-14996,
-15010,
-15016,
-15081,
-15104,
-15111,
-15111,
-15111,
-15124,
+14461,
+14461,
+14483,
+14483,
+14502,
+14539,
+14539,
+14539,
+14557,
+14557,
+14557,
+14566,
+14566,
+14575,
+14618,
+14628,
+14643,
+14643,
+14684,
+14684,
+14714,
+14714,
+14725,
+14750,
+14762,
+14770,
+14789,
+14801,
+14822,
+14826,
+14826,
+14826,
+14856,
+14892,
+14912,
+14941,
+14941,
+14948,
+14969,
+14969,
+14969,
+14969,
+14987,
+14992,
+15013,
+15023,
+15030,
+15079,
+15102,
 15140,
-15166,
-15203,
-15203,
-15210,
-15226,
-15226,
-15226,
-15226,
-15232,
-15238,
-15245,
-15245,
-15260,
-15297,
-15297,
-15317,
-15317,
-15317,
-15317,
-15324,
-15331,
-15331,
-15331,
-15331,
-15331,
-15331,
-15338,
-15366,
-15382,
-15421,
-15428,
-15433,
-15457,
-15473,
-15482,
-15511,
-15521,
-15521,
-15544,
-15565,
-15582,
-15582,
-15598,
-15611,
-15623,
-15623,
-15661,
-15694,
-15694,
-15694,
-15719,
-15738,
-15760,
-15806,
-15812,
-15830,
-15830,
-15851,
-15870,
-15907,
-15921,
-15921,
-15921,
-15961,
-15979,
-16002,
-16013,
-16013,
-16032,
-16053,
-16053,
-16053,
-16053,
-16071,
-16071,
+15145,
+15155,
+15155,
+15155,
+15155,
+15155,
+15172,
+15192,
+15207,
+15283,
+15298,
+15313,
+15319,
+15319,
+15352,
+15352,
+15370,
+15370,
+15383,
+15470,
+15490,
+15490,
+15490,
+15500,
+15592,
+15607,
+15648,
+15679,
+15683,
+15687,
+15693,
+15736,
+15736,
+15745,
+15745,
+15745,
+15745,
+15792,
+15823,
+15823,
+15823,
+15836,
+15866,
+15879,
+15901,
+15965,
 16071,
 16071,
 16071,
-16077,
-16126,
-16151,
-16157,
-16191,
-16219,
-16226,
-16226,
-16226,
-16226,
-16226,
-16243,
-16255,
-16264,
-16288,
-16326,
-16337,
-16337,
-16387,
-16407,
-16407,
-16453,
-16453,
-16459,
-16470,
-16470,
-16476,
-16516,
-16516,
-16516,
-16516,
-16516,
-16516,
-16531,
-16550,
-16550,
-16550,
-16561,
-16574,
-16574,
-16574,
-16593,
-16597,
-16623,
-16633,
-16633,
-16642,
-16642,
-16672,
-16680,
-16696,
-16705,
-16705,
-16739,
-16739,
-16789,
-16789,
-16823,
-16823,
-16839,
-16839,
-16857,
-16857,
-16857,
-16857,
-16857,
-16871,
-16912,
-16912,
-16922,
-16965,
-16978,
-17001,
-17072,
-17085,
-17109,
-17175,
-17175,
-17188,
-17188,
-17188,
-17195,
-17202,
-17202,
-17202,
-17202,
-17215,
+16096,
+16096,
+16110,
+16122,
+16148,
+16152,
+16166,
+16166,
+16166,
+16193,
+16299,
+16299,
+16321,
+16331,
+16340,
+16340,
+16347,
+16374,
+16386,
+16386,
+16464,
+16508,
+16508,
+16508,
+16512,
+16512,
+16512,
+16533,
+16555,
+16555,
+16584,
+16584,
+16584,
+16584,
+16584,
+16584,
+16602,
+16602,
+16602,
+16612,
+16627,
+16641,
+16641,
+16659,
+16659,
+16695,
+16695,
+16712,
+16770,
+16787,
+16807,
+16807,
+16821,
+16821,
+16826,
+16826,
+16826,
+16861,
+16874,
+16874,
+16884,
+16884,
+16947,
+16959,
+16959,
+16976,
+16976,
+16990,
+16990,
+17067,
+17088,
+17101,
+17101,
+17111,
+17122,
+17156,
+17163,
+17163,
+17187,
 17238,
-17247,
-17268,
-17285,
-17285,
-17285,
-17292,
-17299,
-17320,
-17332,
+17260,
+17271,
+17271,
+17271,
+17271,
+17271,
+17271,
+17271,
+17293,
+17310,
+17310,
+17310,
+17322,
+17322,
 17339,
-17346,
-17353,
-17360,
-17389,
-17421,
-17428,
-17447,
-17454,
-17473,
-17499,
-17522,
-17533,
-17562,
-17569,
-17581,
-17599,
-17599,
-17628,
-17635,
-17668,
-17678,
-17691,
-17707,
-17748,
-17755,
-17790,
-17808,
-17845,
-17852,
-17852,
-17852,
-17852,
-17872,
-17888,
-17895,
-17916,
-17916,
-17920,
-17964,
-17964,
-17982,
-17992,
-17999,
-17999,
-18012,
-18019,
-18019,
-18019,
-18033,
+17351,
+17351,
+17351,
+17351,
+17351,
+17351,
+17351,
+17392,
+17400,
+17416,
+17416,
+17441,
+17458,
+17468,
+17478,
+17537,
+17537,
+17545,
+17545,
+17554,
+17554,
+17566,
+17592,
+17592,
+17604,
+17616,
+17645,
+17682,
+17690,
+17690,
+17690,
+17724,
+17724,
+17749,
+17749,
+17749,
+17799,
+17799,
+17819,
+17819,
+17830,
+17839,
+17839,
+17853,
+17871,
+17871,
+17902,
+17912,
+17922,
+17930,
+17977,
+17983,
+18032,
+18044,
 18051,
-18065,
-18082,
-18082,
-18082,
-18089,
+18051,
+18061,
+18061,
+18071,
+18071,
+18071,
+18071,
 18100,
-18106,
-18106,
-18118,
-18124,
-18163,
-18170,
-18170,
-18204,
-18234,
-18251,
-18251,
-18270,
-18270,
-18280,
-18315,
-18315,
-18322,
-18369,
-18376,
-18383,
-18408,
-18408,
-18425,
-18445,
-18451,
-18480,
-18480,
-18487,
-18487,
-18528,
-18537,
-18560,
-18567,
-18583,
-18590,
-18595,
+18144,
+18144,
+18179,
+18192,
+18192,
+18208,
+18220,
+18220,
+18226,
+18226,
+18265,
+18265,
+18275,
+18275,
+18275,
+18275,
+18288,
+18288,
+18288,
+18314,
+18314,
+18354,
+18367,
+18384,
+18384,
+18384,
+18394,
+18414,
+18437,
+18458,
+18474,
+18474,
+18499,
+18499,
+18505,
+18505,
+18509,
+18521,
+18521,
+18533,
+18554,
+18554,
+18554,
+18565,
+18565,
+18585,
+18585,
+18585,
 18612,
-18623,
-18652,
-18658,
-18669,
-18676,
-18676,
-18710,
-18710,
-18710,
-18719,
-18748,
-18755,
-18755,
-18755,
-18773,
-18786,
-18843,
-18864,
-18891,
-18898,
-18905,
-18925,
-18925,
-18939,
-18946,
-18983,
-18983,
-18990,
-18990,
-18990,
-19008,
-19008,
-19026,
-19036,
-19060,
-19076,
-19076,
-19112,
-19112,
-19118,
-19154,
-19163,
-19163,
-19170,
-19170,
-19194,
-19228,
-19235,
-19250,
-19250,
-19250,
-19264,
-19315,
-19341,
-19396,
-19441,
-19448,
-19480,
-19497,
-19517,
-19566,
-19573,
-19606,
-19631,
-19710,
-19750,
-19750,
-19771,
-19796,
-19823,
-19871,
-19885,
-19892,
-19899,
-19899,
-19913,
-19927,
-19937,
-19957,
-19967,
-20013,
-20030,
-20037,
-20040,
-20065,
-20082,
-20104,
-20136,
-20152,
-20183,
-20267,
-20280,
-20330,
-20347,
-20357,
-20384,
-20394,
-20407,
-20413,
-20441,
-20470,
+18634,
+18643,
+18666,
+18666,
+18686,
+18686,
+18728,
+18745,
+18756,
+18772,
+18800,
+18800,
+18800,
+18800,
+18800,
+18806,
+18862,
+18880,
+18922,
+18936,
+18936,
+18942,
+18959,
+18959,
+18964,
+18964,
+19012,
+19012,
+19012,
+19017,
+19021,
+19030,
+19030,
+19030,
+19035,
+19044,
+19044,
+19052,
+19052,
+19052,
+19052,
+19074,
+19099,
+19106,
+19139,
+19139,
+19155,
+19155,
+19174,
+19221,
+19239,
+19251,
+19271,
+19290,
+19320,
+19366,
+19366,
+19373,
+19389,
+19402,
+19402,
+19418,
+19438,
+19438,
+19438,
+19438,
+19438,
+19438,
+19438,
+19438,
+19458,
+19466,
+19466,
+19484,
+19484,
+19494,
+19494,
+19510,
+19510,
+19521,
+19521,
+19536,
+19543,
+19543,
+19550,
+19550,
+19556,
+19556,
+19603,
+19603,
+19611,
+19622,
+19646,
+19675,
+19696,
+19696,
+19735,
+19747,
+19747,
+19763,
+19763,
+19763,
+19780,
+19780,
+19792,
+19798,
+19798,
+19808,
+19824,
+19863,
+19863,
+19975,
+19975,
+19983,
+19999,
+20006,
+20006,
+20006,
+20022,
+20036,
+20043,
+20043,
+20050,
+20110,
+20110,
+20110,
+20145,
+20145,
+20145,
+20145,
+20161,
+20161,
+20161,
+20161,
+20184,
+20198,
+20219,
+20219,
+20230,
+20236,
+20236,
+20261,
+20283,
+20283,
+20298,
+20314,
+20314,
+20321,
+20352,
+20361,
+20361,
+20361,
+20375,
+20422,
+20433,
+20433,
+20457,
+20457,
+20457,
+20457,
+20457,
+20457,
+20476,
+20476,
+20482,
+20488,
+20488,
 20488,
-20513,
-20523,
-20562,
-20580,
-20580,
-20596,
-20623,
-20629,
-20639,
-20639,
-20652,
-20670,
-20691,
-20704,
-20707,
-20714,
-20724,
-20734,
-20745,
-20748,
-20816,
-20834,
-20844,
+20488,
+20542,
+20548,
+20548,
+20548,
+20555,
+20574,
+20584,
+20618,
+20627,
+20641,
+20683,
+20683,
+20736,
+20740,
+20740,
+20740,
+20740,
+20750,
+20750,
+20795,
+20795,
+20795,
+20854,
 20862,
-20896,
-20915,
-20933,
-20967,
-21040,
-21043,
+20869,
+20869,
+20874,
+20874,
+20895,
+20895,
+20895,
+20911,
+20927,
+20927,
+20939,
+20946,
+20962,
+20962,
+20962,
+21018,
+21018,
+21018,
 21056,
-21059,
-21106,
-21123,
-21156,
-21184,
-21198,
-21215,
-21252,
-21259,
-21275,
-21305,
-21312,
-21321,
-21343,
-21343,
-21353,
-21363,
-21389,
-21408,
-21431,
-21442,
-21458,
-21471,
-21479,
+21077,
+21077,
+21077,
+21077,
+21095,
+21134,
+21134,
+21160,
+21171,
+21214,
+21214,
+21214,
+21214,
+21221,
+21221,
+21221,
+21221,
+21317,
+21317,
+21325,
+21342,
+21342,
+21370,
+21386,
+21405,
+21418,
+21438,
+21441,
+21447,
+21469,
 21489,
-21492,
-21504,
-21511,
-21542,
-21542,
-21545,
+21533,
+21557,
 21568,
-21591,
-21632,
-21687,
-21714,
+21586,
+21596,
+21596,
+21636,
+21648,
+21671,
+21700,
+21706,
+21716,
+21722,
+21728,
 21731,
-21738,
-21755,
-21761,
-21794,
-21804,
-21807,
-21824,
-21827,
-21869,
-21889,
-21896,
-21924,
-21958,
-21992,
-22003,
-22027,
-22097,
-22100,
-22124,
-22127,
-22170,
-22180,
-22206,
-22222,
-22256,
-22292,
-22310,
-22327,
-22327,
-22337,
-22347,
-22354,
-22385,
-22392,
-22401,
-22415,
-22439,
-22465,
-22482,
-22489,
-22496,
-22518,
-22525,
-22544,
-22547,
-22550,
-22578,
-22616,
-22616,
-22649,
-22659,
-22669,
-22709,
-22742,
-22749,
-22792,
-22792,
-22807,
-22821,
-22828,
-22828,
-22854,
-22914,
-22944,
-22967,
-22989,
-22993,
-23000,
-23019,
-23038,
-23055,
-23065,
-23075,
-23078,
-23090,
-23097,
-23121,
+21753,
+21753,
+21765,
+21811,
+21826,
+21829,
+21840,
+21853,
+21856,
+21898,
+21904,
+21904,
+21933,
+21990,
+21993,
+21999,
+22023,
+22050,
+22094,
+22113,
+22131,
+22148,
+22225,
+22284,
+22301,
+22342,
+22361,
+22380,
+22414,
+22441,
+22444,
+22447,
+22491,
+22503,
+22520,
+22548,
+22569,
+22617,
+22617,
+22642,
+22657,
+22660,
+22660,
+22670,
+22705,
+22718,
+22768,
+22784,
+22817,
+22817,
+22836,
+22851,
+22863,
+22863,
+22863,
+22863,
+22863,
+22876,
+22918,
+22963,
+22974,
+22974,
+22980,
+22983,
+22999,
+22999,
+22999,
+23037,
+23037,
+23066,
+23080,
+23083,
+23096,
+23115,
+23118,
+23133,
 23146,
-23163,
-23189,
-23199,
-23216,
-23229,
-23240,
-23253,
-23268,
-23268,
-23271,
-23309,
-23321,
-23348,
-23402,
-23417,
-23417,
-23450,
-23489,
-23489,
-23515,
-23518,
-23524,
-23547,
-23560,
+23149,
+23207,
+23224,
+23224,
+23224,
+23235,
+23265,
+23274,
+23290,
+23313,
+23326,
+23329,
+23347,
+23368,
+23371,
+23375,
+23378,
+23390,
+23431,
+23452,
+23455,
+23455,
+23470,
+23490,
+23533,
+23537,
+23537,
 23563,
-23566,
-23569,
-23594,
-23620,
-23667,
-23692,
-23706,
-23723,
-23726,
-23760,
-23776,
-23779,
-23805,
-23815,
-23846,
-23870,
-23944,
-23947,
-23967,
+23575,
+23587,
+23593,
+23612,
+23612,
+23612,
+23625,
+23625,
+23666,
+23669,
+23682,
+23685,
+23688,
+23688,
+23699,
+23739,
+23742,
+23745,
+23756,
+23756,
+23770,
+23800,
+23811,
+23832,
+23879,
+23926,
+23950,
 23977,
-23984,
-24027,
-24043,
-24043,
-24081,
-24081,
+23986,
+24007,
+24020,
+24020,
+24066,
+24066,
+24082,
+24082,
+24085,
+24085,
+24088,
 24088,
-24098,
-24105,
-24105,
-24108,
-24108,
-24108,
-24126,
-24126,
-24129,
-24129,
-24199,
-24202,
-24202,
-24208,
-24208,
-24239,
-24266,
-24292,
-24302,
-24320,
-24332,
+24139,
+24139,
+24157,
+24160,
+24174,
+24177,
+24180,
+24220,
+24232,
+24232,
+24232,
+24232,
+24253,
+24269,
+24275,
+24295,
+24328,
+24328,
+24335,
+24335,
+24335,
+24335,
 24338,
+24352,
 24370,
-24377,
-24384,
-24401,
-24420,
-24436,
-24439,
-24456,
-24466,
-24475,
-24495,
-24498,
-24528,
-24557,
-24576,
-24595,
-24595,
-24610,
-24625,
-24632,
-24661,
-24677,
-24684,
-24713,
-24720,
-24737,
-24787,
-24787,
-24799,
-24837,
+24432,
+24442,
+24453,
+24520,
+24540,
+24543,
+24562,
+24565,
+24583,
+24602,
+24605,
+24608,
+24650,
+24715,
+24718,
+24724,
+24754,
 24857,
-24864,
-24880,
-24895,
-24909,
-24909,
-24936,
-24936,
-24936,
-24952,
-24971,
-24993,
-25026,
-25039,
-25042,
-25048,
-25054,
-25060,
-25079,
-25093,
-25096,
-25122,
-25147,
-25168,
-25184,
-25218,
-25244,
-25251,
-25280,
-25296,
-25302,
-25325,
-25338,
-25359,
-25433,
-25444,
+24863,
+24869,
+24913,
+24925,
+24928,
+25011,
+25014,
+25014,
+25030,
+25033,
+25033,
+25043,
+25062,
+25062,
+25084,
+25158,
+25173,
+25230,
+25230,
+25253,
+25305,
+25315,
+25315,
+25336,
+25336,
+25336,
+25371,
+25374,
+25374,
+25394,
+25394,
+25397,
+25406,
+25406,
+25409,
+25409,
+25409,
+25412,
 25450,
-25453,
-25496,
+25465,
+25473,
+25473,
+25473,
+25489,
 25506,
-25509,
-25512,
-25512,
-25531,
-25534,
+25522,
+25525,
+25525,
 25561,
-25581,
-25581,
-25603,
-25621,
-25638,
-25638,
-25641,
-25665,
-25676,
-25709,
-25709,
-25709,
-25759,
-25774,
-25790,
-25796,
-25796,
-25831,
-25850,
-25853,
-25861,
-25883,
-25886,
-25886,
-25894,
-25914,
-25955,
-25964,
-25983,
-26008,
-26008,
-26016,
-26024,
-26027,
-26043,
-26080,
-26080,
-26087,
-26115,
-26115,
-26115,
+25579,
+25579,
+25582,
+25607,
+25607,
+25636,
+25661,
+25661,
+25680,
+25701,
+25712,
+25712,
+25726,
+25726,
+25729,
+25736,
+25747,
+25747,
+25747,
+25776,
+25783,
+25807,
+25820,
+25829,
+25839,
+25859,
+25862,
+25881,
+25911,
+25928,
+25934,
+25934,
+25968,
+25986,
+26029,
+26055,
+26066,
+26105,
+26123,
 26133,
-26133,
-26133,
-26133,
-26146,
-26146,
-26168,
-26168,
-26175,
-26175,
-26191,
-26191,
-26199,
-26265,
-26265,
-26299,
-26307,
-26315,
-26315,
-26315,
-26315,
-26338,
-26338,
-26356,
-26359,
-26376,
-26376,
-26376,
-26388,
-26399,
-26452,
-26452,
-26456,
-26468,
-26480,
-26510,
+26188,
+26188,
+26205,
+26223,
+26236,
+26268,
+26282,
+26296,
+26346,
+26365,
+26381,
+26420,
+26508,
+26535,
 26538,
-26544,
-26544,
-26547,
-26555,
-26563,
-26563,
-26563,
-26569,
-26569,
-26569,
-26583,
-26601,
-26601,
-26601,
-26601,
-26624,
-26665,
-26672,
-26692,
-26692,
-26692,
+26550,
+26574,
+26596,
+26625,
+26628,
+26647,
+26656,
+26669,
+26680,
 26710,
-26710,
-26720,
-26720,
-26742,
-26762,
-26768,
-26778,
-26778,
-26794,
-26794,
-26823,
-26886,
-26886,
-26916,
-26934,
-26964,
-26988,
-26988,
-26988,
-27034,
-27050,
-27050,
-27079,
-27079,
-27114,
-27114,
-27125,
-27176,
-27176,
-27188,
-27188,
-27205,
-27222,
-27238,
-27249,
-27300,
-27312,
+26743,
+26750,
+26770,
+26773,
+26773,
+26787,
+26787,
+26799,
+26816,
+26831,
+26831,
+26859,
+26875,
+26937,
+26952,
+26992,
+27011,
+27027,
+27030,
+27030,
+27046,
+27053,
+27080,
+27080,
+27080,
+27080,
+27123,
+27123,
+27130,
+27140,
+27156,
+27215,
+27226,
+27246,
+27270,
+27278,
+27278,
 27312,
-27341,
-27341,
-27356,
-27356,
-27356,
-27356,
-27396,
+27343,
+27350,
+27350,
+27362,
+27369,
+27379,
 27407,
-27445,
-27533,
-27533,
-27533,
-27533,
-27549,
-27549,
-27586,
-27606,
-27629,
-27640,
-27640,
-27658,
-27658,
-27692,
-27692,
-27716,
-27726,
-27742,
-27742,
-27742,
-27747,
-27747,
-27767,
-27767,
-27846,
-27876,
-27885,
-27885,
-27890,
-27897,
+27407,
+27431,
+27448,
+27455,
+27455,
+27462,
+27484,
+27516,
+27522,
+27529,
+27545,
+27545,
+27584,
+27625,
+27632,
+27639,
+27649,
+27660,
+27679,
+27686,
+27686,
+27709,
+27709,
+27727,
+27746,
+27753,
+27775,
+27781,
+27788,
+27793,
+27811,
+27873,
+27873,
 27910,
-27927,
-27938,
-27945,
-27961,
-27961,
-27985,
-28010,
-28014,
-28014,
-28022,
-28047,
-28057,
-28067,
-28090,
-28111,
-28111,
-28111,
-28111,
-28111,
-28135,
-28139,
-28139,
-28139,
-28149,
-28149,
-28159,
-28159,
-28159,
-28159,
-28159,
-28182,
-28182,
+27917,
+27955,
+27979,
+27979,
+27994,
+28036,
+28046,
+28053,
+28110,
+28120,
+28120,
+28141,
+28189,
 28196,
-28205,
-28205,
-28211,
-28233,
-28246,
-28266,
-28266,
-28266,
-28266,
+28196,
+28241,
+28244,
 28266,
-28318,
-28325,
-28325,
-28384,
-28384,
-28399,
-28399,
-28399,
-28406,
-28433,
-28446,
-28465,
-28465,
-28465,
-28465,
-28517,
-28522,
-28522,
-28522,
-28529,
-28546,
-28550,
-28550,
-28567,
-28567,
-28588,
-28595,
-28607,
-28630,
-28630,
-28643,
-28654,
-28679,
-28679,
-28726,
-28726,
-28739,
-28743,
-28754,
-28754,
-28754,
-28760,
-28760,
-28806,
-28806,
-28806,
-28823,
-28856,
-28873,
-28873,
-28883,
-28895,
-28904,
-28954,
+28308,
+28345,
+28345,
+28352,
+28380,
+28380,
+28395,
+28395,
+28415,
+28436,
+28443,
+28469,
+28476,
+28499,
+28506,
+28531,
+28545,
+28552,
+28559,
+28585,
+28612,
+28618,
+28618,
+28642,
+28659,
+28659,
+28666,
+28691,
+28714,
+28714,
+28729,
+28767,
+28801,
+28832,
+28839,
+28875,
+28905,
+28905,
+28917,
+28936,
+28963,
 28963,
-28980,
-28980,
-29015,
-29030,
+28979,
+28979,
+28986,
+29039,
 29049,
-29074,
-29074,
-29080,
-29092,
-29112,
-29112,
-29118,
-29127,
-29139,
-29139,
-29139,
-29139,
-29146,
-29159,
-29198,
-29230,
-29241,
-29241,
-29246,
-29246,
-29246,
-29265,
-29265,
-29265,
-29265,
-29265,
-29275,
-29275,
-29287,
-29287,
-29287,
-29301,
-29310,
-29326,
-29337,
-29352,
-29364,
-29364,
-29364,
-29364,
-29370,
-29388,
-29388,
-29388,
-29395,
-29395,
-29410,
-29430,
-29453,
-29457,
-29457,
-29475,
-29490,
-29490,
-29490,
-29510,
-29510,
-29510,
-29520,
-29568,
-29568,
-29597,
-29608,
-29608,
-29608,
-29622,
+29077,
+29084,
+29115,
+29142,
+29152,
+29208,
+29222,
+29229,
+29250,
+29264,
+29289,
+29303,
+29318,
+29318,
+29342,
+29342,
+29342,
+29362,
+29369,
+29369,
+29405,
+29405,
+29436,
+29436,
+29464,
+29464,
+29464,
+29464,
+29471,
+29471,
+29476,
+29483,
+29488,
+29500,
+29543,
+29556,
+29561,
+29576,
+29593,
+29613,
+29620,
+29620,
+29627,
+29627,
+29627,
 29634,
-29640,
-29640,
-29659,
-29659,
-29670,
-29670,
-29680,
-29680,
-29680,
-29680,
-29686,
-29686,
-29700,
-29710,
-29720,
-29730,
-29730,
-29762,
-29793,
-29814,
-29814,
-29814,
-29814,
-29850,
-29850,
-29860,
-29860,
-29860,
-29888,
-29888,
-29888,
-29913,
-29920,
-29934,
-29934,
-29943,
-29957,
-29981,
-30011,
-30011,
-30029,
-30040,
-30047,
-30047,
-30081,
-30081,
-30096,
-30110,
-30110,
-30110,
-30110,
-30115,
-30115,
-30133,
-30137,
-30150,
-30167,
-30174,
-30184,
-30184,
-30199,
-30209,
-30253,
-30253,
-30253,
-30253,
-30253,
-30253,
-30306,
+29641,
+29651,
+29658,
+29675,
+29748,
+29783,
+29800,
+29807,
+29829,
+29829,
+29874,
+29890,
+29911,
+29918,
+29918,
+29937,
+29949,
+29949,
+29967,
+30032,
+30066,
+30076,
+30104,
+30104,
+30104,
+30121,
+30154,
+30154,
+30177,
+30193,
+30193,
+30208,
+30222,
+30272,
+30272,
+30279,
 30315,
-30347,
-30347,
-30347,
-30359,
-30379,
-30379,
-30409,
-30416,
-30447,
-30465,
-30465,
-30465,
-30479,
-30497,
-30514,
-30514,
-30541,
-30555,
-30582,
-30591,
-30591,
-30602,
-30639,
-30652,
-30665,
-30689,
-30697,
+30355,
+30362,
+30376,
+30413,
+30438,
+30457,
+30516,
+30523,
+30533,
+30612,
+30621,
+30648,
+30656,
+30685,
 30697,
-30705,
-30705,
-30705,
-30718,
-30730,
-30764,
-30764,
-30785,
-30785,
-30827,
-30870,
-30874,
-30874,
-30874,
-30874,
-30883,
-30923,
-30930,
-30942,
-30942,
-30942,
-30942,
-30984,
-31011,
-31011,
-31021,
-31021,
-31037,
-31037,
-31072,
-31123,
-31123,
-31123,
-31141,
-31141,
-31141,
-31147,
-31147,
-31162,
-31179,
-31179,
-31190,
-31211,
-31227,
-31273,
-31294,
-31294,
-31322,
-31322,
-31333,
+30715,
+30732,
+30784,
+30848,
+30855,
+30877,
+30888,
+30888,
+30905,
+30932,
+30946,
+30978,
+30978,
+31032,
+31039,
+31053,
+31060,
+31082,
+31128,
+31128,
+31155,
+31155,
+31155,
+31195,
+31195,
+31195,
+31195,
+31202,
+31202,
+31222,
+31222,
+31230,
+31241,
+31241,
+31241,
+31308,
+31320,
+31327,
+31327,
+31327,
 31354,
-31381,
-31381,
-31385,
-31385,
-31404,
-31404,
-31420,
-31436,
-31457,
-31457,
-31457,
-31481,
-31514,
-31522,
-31541,
-31548,
-31548,
-31548,
-31558,
-31576,
-31588,
-31630,
-31630,
-31634,
-31634,
-31666,
-31666,
-31666,
-31666,
-31684,
-31700,
-31718,
-31735,
-31735,
-31753,
-31767,
-31767,
-31767,
-31771,
-31771,
-31789,
-31789,
-31789,
-31808,
+31375,
+31399,
+31424,
+31431,
+31448,
+31469,
+31469,
+31476,
+31487,
+31504,
+31534,
+31534,
+31593,
+31593,
+31593,
+31593,
+31593,
+31593,
+31598,
+31619,
+31632,
+31647,
+31658,
+31705,
+31731,
+31752,
+31759,
+31780,
+31817,
+31817,
+31821,
 31825,
-31851,
-31877,
-31895,
-31909,
-31909,
+31830,
+31830,
+31830,
+31830,
+31836,
+31860,
+31869,
+31869,
+31887,
+31887,
+31887,
+31887,
+31894,
 31919,
-31943,
-31974,
-31984,
-31984,
-31990,
-31990,
-32017,
-32017,
-32017,
-32039,
-32039,
-32039,
-32055,
-32055,
-32092,
-32116,
-32138,
-32138,
-32138,
-32155,
-32176,
-32176,
-32183,
-32183,
-32225,
-32225,
-32232,
-32232,
-32253,
-32253,
-32253,
-32295,
-32311,
-32326,
-32338,
-32338,
-32370,
-32419,
-32440,
-32459,
-32487,
-32487,
-32508,
-32508,
-32508,
-32515,
-32536,
-32567,
-32574,
-32627,
-32634,
-32634,
-32634,
-32634,
-32672,
-32672,
-32672,
-32676,
-32685,
-32685,
-32685,
-32708,
-32719,
-32719,
-32753,
-32766,
-32766,
-32766,
-32778,
+31924,
+31924,
+31924,
+31958,
+31968,
+31968,
+31977,
+31989,
+32000,
+32000,
+32007,
+32024,
+32038,
+32064,
+32069,
+32069,
+32085,
+32085,
+32096,
+32118,
+32118,
+32130,
+32137,
+32165,
+32165,
+32204,
+32217,
+32234,
+32242,
+32264,
+32314,
+32327,
+32334,
+32334,
+32343,
+32343,
+32359,
+32359,
+32385,
+32385,
+32385,
+32420,
+32420,
+32420,
+32420,
+32468,
+32468,
+32506,
+32506,
+32506,
+32523,
+32569,
+32569,
+32569,
+32576,
+32576,
+32576,
+32576,
+32604,
+32612,
+32612,
+32632,
+32666,
+32683,
+32728,
+32749,
+32749,
+32749,
+32756,
+32756,
+32765,
+32807,
+32807,
 32807,
-32814,
-32865,
-32896,
-32896,
-32911,
-32924,
-32948,
-32955,
-32955,
-32955,
-32955,
-32959,
-32975,
-32975,
-32975,
-32975,
-33004,
-33004,
-33030,
-33078,
-33095,
-33095,
-33095,
-33111,
-33130,
-33147,
-33147,
-33163,
-33179,
-33189,
-33189,
-33235,
-33235,
-33235,
-33242,
-33269,
-33321,
-33343,
-33382,
-33396,
-33396,
-33396,
-33407,
-33407,
-33423,
-33444,
-33444,
-33456,
-33456,
-33486,
-33504,
-33504,
-33539,
+32817,
+32837,
+32837,
+32856,
+32875,
+32875,
+32875,
+32914,
+32914,
+32914,
+32921,
+32921,
+32938,
+32956,
+33021,
+33021,
+33050,
+33064,
+33075,
+33102,
+33102,
+33102,
+33102,
+33109,
+33109,
+33122,
+33145,
+33164,
+33164,
+33171,
+33171,
+33171,
+33171,
+33187,
+33187,
+33187,
+33195,
+33195,
+33268,
+33277,
+33277,
+33277,
+33281,
+33281,
+33297,
+33297,
+33297,
+33297,
+33313,
+33320,
+33320,
+33320,
+33333,
+33333,
+33368,
+33387,
+33409,
+33413,
+33417,
+33430,
+33430,
+33446,
+33455,
+33467,
+33472,
+33498,
+33498,
+33527,
+33537,
 33547,
-33563,
-33623,
+33565,
+33602,
+33602,
+33617,
+33617,
 33633,
-33648,
-33648,
-33648,
-33691,
+33645,
+33662,
+33673,
+33681,
 33698,
-33731,
-33745,
-33745,
+33698,
+33705,
+33719,
+33726,
+33754,
 33754,
-33774,
-33774,
-33774,
-33791,
-33808,
-33808,
-33808,
-33814,
-33847,
-33855,
-33855,
-33862,
-33887,
-33894,
-33905,
-33905,
-33932,
-33938,
-33973,
-34011,
-34011,
-34034,
-34051,
-34076,
-34083,
-34102,
-34102,
-34134,
-34134,
-34134,
-34155,
-34174,
-34186,
-34186,
-34186,
-34216,
-34248,
-34264,
-34305,
-34312,
-34312,
-34319,
-34346,
-34346,
-34360,
-34375,
-34375,
-34382,
-34415,
-34422,
-34452,
-34452,
-34459,
-34466,
+33783,
+33793,
+33843,
+33868,
+33868,
+33876,
+33876,
+33876,
+33925,
+33936,
+33947,
+33947,
+33947,
+33965,
+33986,
+33986,
+33986,
+33986,
+34050,
+34089,
+34089,
+34098,
+34112,
+34124,
+34128,
+34173,
+34173,
+34173,
+34173,
+34194,
+34209,
+34209,
+34228,
+34263,
+34267,
+34275,
+34282,
+34353,
+34376,
+34400,
+34428,
+34441,
+34441,
 34512,
-34522,
-34534,
-34534,
-34559,
-34594,
-34624,
-34624,
-34661,
-34668,
-34675,
-34682,
-34682,
-34682,
-34712,
-34720,
-34759,
-34797,
-34825,
-34832,
-34832,
-34885,
-34885,
-34903,
-34903,
-34916,
-34934,
-34955,
-34955,
-34983,
-34983,
-34990,
-34990,
-35001,
-35040,
-35069,
-35078,
-35084,
-35091,
-35091,
-35091,
-35091,
-35098,
+34549,
+34549,
+34567,
+34567,
+34577,
+34598,
+34616,
+34627,
+34635,
+34635,
+34657,
+34657,
+34666,
+34671,
+34678,
+34678,
+34678,
+34678,
+34685,
+34706,
+34746,
+34751,
+34751,
+34774,
+34774,
+34784,
+34807,
+34819,
+34819,
+34835,
+34835,
+34913,
+34913,
+34913,
+34932,
+34951,
+34951,
+34956,
+34974,
+34974,
+34992,
+35003,
+35026,
+35031,
+35053,
+35059,
 35098,
-35098,
-35110,
-35110,
-35116,
-35138,
-35138,
+35108,
+35114,
+35139,
+35149,
+35162,
 35181,
 35181,
-35206,
-35210,
-35230,
-35267,
-35267,
-35274,
-35291,
-35291,
-35315,
-35319,
-35338,
-35355,
-35355,
+35190,
+35209,
+35222,
+35222,
+35222,
+35222,
+35222,
+35226,
+35226,
+35226,
+35226,
+35251,
+35251,
+35302,
+35302,
+35302,
+35302,
+35351,
+35351,
+35387,
+35387,
+35387,
+35387,
+35391,
 35424,
-35474,
-35489,
-35497,
-35504,
-35548,
-35558,
-35565,
-35585,
-35603,
-35607,
-35630,
-35630,
-35651,
-35651,
-35674,
-35707,
-35724,
-35732,
-35748,
-35755,
-35782,
-35802,
-35825,
-35844,
-35870,
-35895,
-35902,
-35910,
-35925,
-35937,
-35971,
-35978,
-36002,
-36010,
-36017,
-36017,
-36017,
-36037,
-36048,
-36072,
-36079,
-36079,
-36115,
-36132,
-36184,
-36201,
-36201,
-36208,
-36208,
-36224,
-36234,
-36243,
-36243,
-36243,
-36243,
-36282,
-36291,
-36330,
-36352,
-36364,
-36403,
-36403,
-36427,
-36427,
-36451,
-36458,
-36458,
-36480,
-36528,
-36528,
-36538,
-36559,
-36604,
-36604,
-36604,
-36625,
-36632,
-36656,
-36682,
-36682,
-36682,
-36701,
-36710,
-36717,
-36724,
-36731,
-36731,
-36731,
-36747,
-36760,
-36814,
-36821,
-36828,
-36835,
-36835,
-36860,
-36887,
-36896,
-36951,
-36958,
-36958,
-36969,
-37006,
-37006,
-37017,
-37024,
-37024,
-37045,
-37045,
+35440,
+35462,
+35462,
+35498,
+35505,
+35505,
+35505,
+35505,
+35520,
+35529,
+35545,
+35545,
+35555,
+35562,
+35562,
+35594,
+35594,
+35621,
+35621,
+35640,
+35646,
+35646,
+35646,
+35659,
+35659,
+35680,
+35744,
+35751,
+35751,
+35777,
+35796,
+35796,
+35796,
+35810,
+35822,
+35836,
+35842,
+35858,
+35858,
+35901,
+35901,
+35901,
+35901,
+35965,
+35965,
+35973,
+35986,
+35986,
+35986,
+36000,
+36006,
+36014,
+36014,
+36031,
+36045,
+36045,
+36045,
+36057,
+36066,
+36066,
+36066,
+36066,
+36083,
+36083,
+36088,
+36088,
+36102,
+36109,
+36120,
+36120,
+36143,
+36147,
+36147,
+36166,
+36177,
+36202,
+36217,
+36242,
+36278,
+36278,
+36278,
+36293,
+36293,
+36322,
+36334,
+36334,
+36334,
+36334,
+36334,
+36334,
+36369,
+36369,
+36376,
+36398,
+36445,
+36469,
+36476,
+36511,
+36518,
+36535,
+36577,
+36584,
+36676,
+36676,
+36676,
+36676,
+36683,
+36706,
+36752,
+36752,
+36784,
+36798,
+36805,
+36812,
+36857,
+36881,
+36881,
+36881,
+36888,
+36895,
+36906,
+36906,
+36916,
+36923,
+36954,
+36961,
+36961,
+36986,
+37011,
+37034,
 37057,
-37104,
-37111,
-37145,
-37159,
-37166,
-37196,
-37203,
-37214,
-37277,
-37295,
-37347,
-37347,
-37369,
+37090,
+37105,
+37146,
+37217,
+37240,
+37284,
+37302,
+37338,
+37352,
+37352,
+37352,
 37375,
-37400,
-37400,
-37400,
-37400,
-37407,
-37423,
-37423,
-37441,
-37448,
-37448,
-37448,
+37391,
+37398,
+37402,
+37409,
+37420,
+37455,
 37455,
-37468,
-37468,
-37468,
-37494,
-37494,
-37500,
-37500,
-37507,
-37537,
-37537,
-37561,
-37568,
-37568,
-37582,
-37596,
-37596,
-37603,
-37625,
-37643,
-37657,
-37683,
-37690,
-37697,
-37709,
-37723,
-37786,
-37796,
-37803,
-37841,
-37841,
-37841,
-37841,
-37841,
-37858,
-37858,
-37858,
-37858,
-37872,
-37903,
-37903,
-37908,
-37947,
-37971,
-37981,
-37981,
-38016,
-38033,
-38037,
-38053,
-38064,
-38064,
-38071,
-38085,
-38092,
-38103,
-38110,
-38110,
-38124,
-38138,
-38167,
-38167,
-38167,
-38174,
-38174,
-38174,
-38205,
-38224,
-38234,
-38267,
-38295,
-38302,
-38308,
-38340,
-38356,
-38363,
-38380,
-38387,
-38387,
-38405,
-38419,
-38433,
-38440,
-38457,
-38464,
-38479,
-38516,
-38545,
-38571,
-38571,
-38585,
-38592,
-38592,
-38592,
-38615,
-38615,
-38635,
-38635,
-38647,
-38665,
-38680,
+37472,
+37504,
+37523,
+37551,
+37567,
+37567,
+37620,
+37620,
+37627,
+37645,
+37671,
+37699,
+37699,
+37727,
+37743,
+37743,
+37781,
+37781,
+37781,
+37781,
+37781,
+37792,
+37799,
+37816,
+37816,
+37816,
+37822,
+37822,
+37834,
+37847,
+37852,
+37887,
+37894,
+37894,
+37905,
+37909,
+37909,
+37916,
+37916,
+37923,
+37936,
+37951,
+37963,
+37970,
+38017,
+38022,
+38022,
+38070,
+38070,
+38087,
+38087,
+38094,
+38101,
+38119,
+38126,
+38146,
+38153,
+38153,
+38171,
+38171,
+38178,
+38193,
+38200,
+38206,
+38218,
+38225,
+38225,
+38225,
+38238,
+38245,
+38296,
+38303,
+38352,
+38352,
+38358,
+38370,
+38370,
+38421,
+38421,
+38421,
+38435,
+38442,
+38455,
+38467,
+38484,
+38503,
+38536,
+38540,
+38540,
+38540,
+38540,
+38556,
+38556,
+38556,
+38556,
+38572,
+38618,
+38618,
+38634,
+38634,
+38634,
+38634,
+38654,
+38661,
+38710,
 38710,
 38717,
-38717,
-38724,
-38724,
-38731,
-38754,
-38775,
-38809,
-38809,
-38818,
-38836,
-38853,
-38870,
-38877,
-38894,
-38894,
-38915,
-38924,
-38938,
-38950,
-38964,
-38982,
-39010,
-39073,
-39095,
-39095,
-39095,
-39113,
-39118,
-39134,
-39150,
-39157,
-39178,
-39178,
-39190,
-39197,
-39197,
-39206,
-39218,
-39231,
-39231,
-39231,
-39238,
-39267,
-39284,
-39303,
-39314,
+38752,
+38771,
+38771,
+38785,
+38785,
+38808,
+38832,
+38871,
+38878,
+38891,
+38898,
+38905,
+38923,
+38923,
+38923,
+38930,
+38961,
+38968,
+38994,
+39018,
+39018,
+39062,
+39076,
+39086,
+39097,
+39109,
+39122,
+39132,
+39132,
+39132,
+39139,
+39152,
+39152,
+39176,
+39202,
+39209,
+39237,
+39237,
+39244,
+39251,
+39251,
+39258,
+39258,
+39265,
+39272,
+39285,
+39299,
+39328,
+39342,
 39364,
-39371,
-39371,
-39378,
-39392,
-39397,
-39397,
-39406,
-39424,
-39424,
-39428,
-39435,
-39456,
-39465,
-39465,
-39472,
-39531,
-39545,
-39577,
-39601,
-39647,
-39654,
-39654,
-39654,
-39664,
-39693,
+39401,
+39401,
+39405,
+39405,
+39411,
+39438,
+39480,
+39480,
+39507,
+39513,
+39513,
+39513,
+39541,
+39553,
+39553,
+39587,
+39609,
+39609,
+39615,
+39680,
 39697,
-39704,
-39759,
-39759,
-39763,
-39763,
-39763,
-39768,
-39768,
-39768,
-39783,
-39783,
-39804,
-39813,
-39829,
-39854,
-39854,
-39854,
-39871,
-39883,
-39883,
-39883,
-39926,
-39945,
-39953,
-39953,
-39953,
-39953,
-39953,
-39960,
-39960,
-39971,
-40017,
-40023,
-40039,
-40074,
-40081,
-40089,
-40089,
-40138,
-40138,
-40149,
-40165,
-40165,
-40182,
-40182,
-40191,
-40191,
-40229,
-40241,
-40254,
-40265,
-40265,
-40274,
-40304,
-40304,
-40304,
-40339,
-40343,
-40359,
-40378,
-40378,
-40416,
-40425,
-40456,
-40483,
+39726,
+39737,
+39750,
+39775,
+39775,
+39811,
+39818,
+39857,
+39866,
+39873,
+39886,
+39916,
+39923,
+39930,
+39947,
+39982,
+39988,
+39988,
+40011,
+40018,
+40044,
+40051,
+40057,
+40072,
+40072,
+40072,
+40090,
+40090,
+40106,
+40106,
+40146,
+40146,
+40210,
+40210,
+40225,
+40238,
+40238,
+40245,
+40252,
+40258,
+40258,
+40286,
+40296,
+40306,
+40313,
+40313,
+40351,
+40351,
+40358,
+40403,
+40410,
+40417,
+40424,
+40431,
+40463,
+40476,
 40483,
-40483,
-40499,
-40523,
-40555,
-40590,
-40612,
-40650,
-40664,
-40664,
-40682,
-40737,
-40737,
-40737,
-40750,
-40778,
+40525,
+40595,
+40629,
+40629,
+40656,
+40656,
+40673,
+40690,
+40709,
+40709,
+40715,
+40745,
+40774,
 40778,
-40790,
-40825,
-40844,
-40860,
-40889,
-40907,
-40907,
-40907,
-40907,
-40926,
-40926,
-40926,
+40785,
+40827,
+40843,
+40861,
+40885,
+40892,
+40892,
+40899,
+40912,
+40919,
+40924,
+40931,
 40938,
-40953,
-40969,
-40983,
-40983,
-40999,
-41006,
-41006,
-41012,
-41037,
-41037,
-41063,
-41096,
-41111,
-41129,
-41129,
-41129,
-41129,
-41145,
-41169,
-41177,
-41209,
-41253,
-41253,
-41253,
-41253,
-41268,
-41299,
-41317,
-41317,
-41337,
-41375,
-41403,
-41425,
-41449,
-41466,
-41466,
-41466,
-41466,
-41484,
-41511,
-41511,
-41537,
-41554,
-41589,
-41589,
-41589,
+41047,
+41076,
+41076,
+41091,
+41105,
+41105,
+41131,
+41162,
+41174,
+41181,
+41190,
+41190,
+41194,
+41225,
+41225,
+41262,
+41295,
+41295,
+41319,
+41319,
+41319,
+41328,
+41342,
+41349,
+41360,
+41360,
+41377,
+41396,
+41396,
+41424,
+41456,
+41456,
+41468,
+41508,
+41525,
+41543,
+41543,
+41552,
+41552,
+41552,
+41552,
+41552,
+41552,
+41552,
+41552,
+41567,
+41577,
+41577,
 41596,
 41603,
-41610,
-41624,
-41649,
-41663,
-41674,
-41698,
-41723,
-41742,
-41765,
-41774,
-41774,
-41825,
-41825,
-41832,
-41832,
-41832,
-41832,
-41844,
-41851,
-41851,
-41914,
-41914,
-41929,
-41946,
-41946,
-41946,
-41958,
-41980,
-41980,
+41603,
+41603,
+41621,
+41639,
+41639,
+41659,
+41659,
+41659,
+41659,
+41659,
+41692,
+41692,
+41692,
+41692,
+41692,
+41712,
+41730,
+41751,
+41751,
+41770,
+41770,
+41770,
+41783,
+41801,
+41809,
+41816,
+41834,
+41853,
+41853,
+41853,
+41866,
+41866,
+41866,
+41866,
+41902,
+41943,
+41975,
+41975,
+41975,
 41996,
-42015,
-42047,
-42070,
-42086,
-42094,
-42094,
-42118,
-42154,
-42176,
-42191,
-42202,
-42222,
-42228,
-42228,
-42228,
-42228,
-42228,
-42228,
-42240,
-42254,
-42271,
-42271,
-42290,
-42297,
-42309,
-42362,
-42379,
-42379,
-42379,
-42390,
-42390,
-42405,
-42405,
-42405,
-42434,
-42450,
-42450,
-42450,
-42450,
-42463,
-42502,
-42520,
-42534,
-42534,
-42565,
-42573,
-42588,
-42609,
-42609,
+42013,
+42040,
+42051,
+42064,
+42087,
+42087,
+42087,
+42106,
+42126,
+42182,
+42196,
+42203,
+42203,
+42246,
+42253,
+42272,
+42272,
+42298,
+42343,
+42343,
+42343,
+42372,
+42419,
+42456,
+42462,
+42480,
+42493,
+42518,
+42529,
+42535,
+42535,
+42535,
+42535,
+42555,
+42567,
+42581,
+42616,
+42616,
 42626,
-42633,
-42639,
-42639,
-42639,
-42639,
-42648,
-42648,
-42648,
-42660,
-42678,
-42713,
-42721,
-42737,
-42756,
-42770,
-42770,
-42788,
-42795,
-42808,
-42808,
-42845,
-42872,
-42895,
-42902,
-42930,
-42935,
-42942,
-42948,
-42973,
-42980,
-43020,
-43027,
-43039,
-43039,
-43062,
-43062,
-43079,
-43093,
-43093,
-43093,
-43114,
-43140,
-43157,
-43164,
-43174,
-43189,
-43194,
-43214,
-43214,
+42662,
+42685,
+42685,
+42740,
+42740,
+42766,
+42794,
+42798,
+42798,
+42798,
+42809,
+42839,
+42839,
+42839,
+42844,
+42854,
+42854,
+42869,
+42879,
+42929,
+42988,
+42997,
+43003,
+43014,
+43025,
+43059,
+43059,
+43108,
+43108,
+43108,
+43118,
+43136,
+43152,
+43168,
+43185,
+43219,
+43234,
 43234,
-43242,
-43264,
-43270,
-43270,
-43311,
-43338,
-43338,
-43364,
-43398,
-43398,
-43437,
-43437,
-43437,
-43443,
-43455,
-43481,
-43481,
-43481,
-43481,
-43498,
-43498,
-43509,
+43241,
+43241,
+43241,
+43253,
+43253,
+43257,
+43257,
+43257,
+43257,
+43257,
+43267,
+43285,
+43295,
+43361,
+43361,
+43361,
+43378,
+43397,
+43397,
+43397,
+43418,
+43418,
+43418,
+43428,
+43428,
+43428,
+43436,
+43451,
+43456,
+43488,
+43488,
+43488,
+43488,
+43488,
+43504,
+43504,
+43522,
+43522,
 43540,
-43551,
-43551,
-43551,
-43551,
-43557,
-43557,
-43567,
-43567,
-43602,
-43620,
-43626,
-43651,
-43651,
-43651,
-43662,
-43706,
-43743,
-43743,
-43743,
-43743,
-43750,
-43750,
-43772,
-43808,
-43808,
-43808,
-43818,
-43839,
-43852,
-43852,
-43863,
-43863,
-43870,
-43877,
-43877,
-43882,
-43916,
-43945,
-43945,
+43547,
+43547,
+43570,
+43570,
+43570,
+43570,
+43576,
+43583,
+43590,
+43618,
+43618,
+43629,
+43643,
+43663,
+43670,
+43709,
+43744,
+43759,
+43787,
+43879,
+43885,
+43934,
+43934,
+43940,
 43945,
 43965,
-43965,
-43965,
-43984,
-44014,
-44042,
-44049,
-44075,
-44075,
-44075,
-44093,
-44093,
-44117,
-44123,
-44130,
-44155,
-44204,
-44204,
-44204,
-44204,
-44210,
-44210,
-44247,
-44265,
-44265,
-44265,
-44271,
-44271,
-44271,
-44271,
-44344,
-44365,
-44365,
-44365,
-44373,
-44373,
-44373,
-44391,
-44399,
-44399,
-44399,
-44413,
-44413,
-44430,
-44430,
-44430,
-44430,
-44436,
-44445,
-44461,
-44475,
-44485,
-44485,
-44502,
-44519,
-44519,
-44519,
-44519,
-44525,
-44525,
-44525,
-44536,
-44542,
-44542,
-44552,
-44552,
-44576,
-44583,
-44605,
-44626,
-44642,
-44642,
-44652,
-44652,
-44686,
-44728,
-44728,
-44742,
-44742,
-44762,
-44771,
-44776,
-44783,
-44804,
-44804,
-44804,
-44811,
-44811,
-44811,
-44860,
-44882,
-44882,
-44882,
-44924,
-44953,
-44953,
-44966,
-44986,
-44986,
-45009,
-45009,
-45035,
-45035,
-45035,
-45053,
-45063,
-45063,
-45063,
-45079,
-45098,
-45105,
-45105,
-45115,
-45115,
-45138,
-45145,
-45145,
-45145,
-45156,
-45156,
-45156,
-45177,
-45177,
-45177,
-45207,
-45216,
-45222,
-45235,
-45243,
-45261,
-45268,
-45283,
-45283,
-45316,
-45316,
-45355,
-45361,
-45373,
-45418,
-45428,
-45428,
-45428,
-45428,
-45446,
-45446,
-45446,
-45452,
-45503,
-45508,
-45508,
-45508,
-45541,
-45556,
-45575,
-45592,
-45592,
-45592,
-45631,
-45631,
-45648,
-45663,
-45663,
-45670,
-45670,
-45670,
-45670,
-45670,
-45697,
-45729,
-45740,
-45757,
-45757,
-45757,
-45757,
-45818,
-45834,
-45869,
+43972,
+43998,
+43998,
+44015,
+44031,
+44057,
+44057,
+44057,
+44057,
+44073,
+44073,
+44086,
+44137,
+44189,
+44196,
+44215,
+44215,
+44260,
+44260,
+44260,
+44260,
+44264,
+44270,
+44270,
+44313,
+44324,
+44354,
+44379,
+44379,
+44386,
+44408,
+44458,
+44481,
+44481,
+44481,
+44481,
+44481,
+44481,
+44481,
+44481,
+44488,
+44520,
+44538,
+44571,
+44571,
+44591,
+44598,
+44604,
+44615,
+44625,
+44638,
+44638,
+44638,
+44657,
+44674,
+44692,
+44692,
+44692,
+44737,
+44758,
+44758,
+44775,
+44784,
+44801,
+44801,
+44801,
+44812,
+44826,
+44834,
+44852,
+44864,
+44864,
+44879,
+44886,
+44886,
+44886,
+44886,
+44893,
+44893,
+44897,
+44897,
+44942,
+44961,
+44968,
+44975,
+44996,
+44996,
+45003,
+45003,
+45016,
+45016,
+45016,
+45080,
+45093,
+45093,
+45108,
+45108,
+45143,
+45152,
+45159,
+45159,
+45171,
+45184,
+45211,
+45248,
+45255,
+45255,
+45295,
+45310,
+45317,
+45352,
+45412,
+45412,
+45426,
+45471,
+45495,
+45495,
+45511,
+45518,
+45523,
+45529,
+45535,
+45535,
+45552,
+45558,
+45583,
+45583,
+45583,
+45606,
+45612,
+45641,
+45659,
+45659,
+45659,
+45714,
+45714,
+45752,
+45766,
+45776,
+45789,
+45789,
+45789,
+45805,
+45842,
+45886,
+45886,
+45886,
 45886,
 45886,
-45896,
-45896,
-45922,
-45922,
-45955,
-45961,
-45968,
-45968,
-45976,
-45985,
-45992,
-45992,
-45992,
+45898,
+45916,
+45930,
+45951,
+45969,
+45969,
+45999,
+46011,
 46024,
 46024,
-46036,
-46036,
-46056,
-46056,
-46076,
-46076,
-46082,
-46101,
-46119,
-46119,
-46125,
-46125,
-46156,
-46156,
-46169,
-46169,
-46185,
-46202,
-46222,
-46222,
-46222,
-46230,
-46230,
-46236,
-46246,
-46265,
-46265,
-46265,
-46265,
-46280,
-46280,
-46280,
-46288,
-46288,
-46288,
-46318,
-46326,
-46330,
-46336,
-46364,
-46384,
-46449,
-46449,
-46471,
-46471,
-46471,
-46471,
-46508,
-46508,
-46530,
-46538,
-46550,
-46550,
-46561,
-46568,
-46602,
-46602,
-46602,
-46622,
-46622,
-46622,
-46649,
-46649,
-46667,
-46667,
-46704,
-46720,
-46731,
-46731,
+46042,
+46073,
+46080,
+46080,
+46080,
+46080,
+46111,
+46131,
+46141,
+46190,
+46213,
+46226,
+46226,
+46226,
+46226,
+46226,
+46245,
+46245,
+46245,
+46272,
+46279,
+46334,
+46371,
+46432,
+46453,
+46453,
+46459,
+46484,
+46498,
+46498,
+46498,
+46506,
+46506,
+46506,
+46523,
+46523,
+46523,
+46542,
+46549,
+46573,
+46579,
+46593,
+46600,
+46600,
+46616,
+46640,
+46640,
+46647,
+46681,
+46693,
+46703,
+46719,
+46719,
+46730,
 46747,
-46754,
-46777,
-46777,
-46777,
-46777,
-46777,
-46777,
-46789,
-46789,
-46797,
-46812,
-46829,
-46829,
-46855,
-46855,
-46871,
-46898,
-46898,
-46911,
-46930,
-46930,
+46747,
+46761,
+46761,
+46809,
+46809,
+46828,
+46828,
+46828,
+46828,
+46828,
+46838,
+46838,
+46838,
+46838,
+46860,
+46860,
+46899,
+46923,
+46923,
+46923,
+46923,
 46930,
-46945,
-46945,
-46954,
-46960,
-46960,
-46960,
-46960,
-46960,
-46960,
-46972,
-46972,
-46972,
-46972,
-46998,
-46998,
-46998,
-47014,
-47025,
-47025,
-47031,
-47069,
-47102,
-47169,
-47188,
-47199,
-47232,
-47239,
-47252,
-47252,
-47271,
-47271,
-47283,
-47283,
-47295,
-47295,
-47295,
-47295,
-47312,
-47322,
-47351,
-47351,
-47351,
-47351,
-47367,
-47367,
-47420,
-47430,
-47430,
-47457,
-47457,
-47503,
-47520,
-47533,
-47560,
-47560,
+46939,
+46939,
+46956,
+46999,
+47084,
+47084,
+47084,
+47091,
+47091,
+47099,
+47110,
+47110,
+47125,
+47142,
+47201,
+47201,
+47224,
+47268,
+47268,
+47279,
+47279,
+47279,
+47310,
+47344,
+47344,
+47348,
+47364,
+47402,
+47413,
+47429,
+47443,
+47461,
+47496,
+47496,
+47512,
+47512,
+47550,
 47571,
-47588,
-47588,
-47602,
+47615,
 47625,
-47637,
-47646,
-47660,
-47660,
-47660,
-47707,
-47721,
-47734,
-47734,
-47752,
-47764,
-47764,
-47774,
-47774,
-47774,
-47774,
-47774,
-47778,
-47778,
-47802,
-47867,
-47867,
-47867,
-47888,
-47922,
-47922,
-47926,
-47926,
-47932,
-47932,
-47937,
-47956,
-47956,
-47985,
-47989,
-48010,
-48014,
-48014,
-48014,
-48031,
-48050,
-48086,
-48086,
-48097,
-48097,
-48097,
-48113,
-48113,
+47638,
+47669,
+47676,
+47683,
+47695,
+47719,
+47814,
+47845,
+47862,
+47874,
+47874,
+47887,
+47898,
+47898,
+47933,
+47940,
+47940,
+47940,
+47981,
+47995,
+48002,
+48020,
+48041,
+48041,
+48048,
+48048,
+48103,
 48113,
-48121,
-48121,
-48135,
-48135,
-48135,
-48135,
-48153,
-48163,
-48207,
-48207,
-48207,
-48217,
-48217,
-48223,
-48239,
+48120,
+48127,
+48141,
+48180,
+48234,
+48234,
+48241,
+48241,
+48253,
 48260,
 48260,
-48300,
-48340,
-48340,
-48340,
-48347,
+48278,
+48315,
+48315,
+48334,
 48354,
 48354,
-48380,
-48402,
-48402,
-48402,
-48420,
-48420,
-48446,
-48446,
-48446,
-48468,
-48468,
-48495,
+48354,
+48361,
+48368,
+48375,
+48386,
+48397,
+48412,
+48462,
+48483,
+48483,
 48516,
-48523,
-48537,
-48573,
-48577,
-48599,
-48627,
-48657,
-48697,
-48697,
-48704,
-48724,
-48724,
-48724,
-48749,
-48760,
-48783,
-48787,
-48806,
-48806,
-48818,
-48818,
-48824,
-48824,
-48830,
-48859,
-48888,
-48888,
-48888,
-48902,
-48902,
-48928,
-48939,
-48939,
-48962,
-48967,
-48967,
-48974,
-48974,
-48998,
-48998,
-48998,
-49012,
-49012,
-49057,
-49057,
-49103,
-49110,
-49110,
-49116,
-49128,
-49128,
-49128,
-49128,
-49158,
-49167,
-49173,
-49189,
-49236,
-49236,
-49272,
-49272,
-49287,
-49287,
-49338,
-49338,
-49354,
-49370,
-49386,
-49386,
-49404,
-49415,
-49415,
-49415,
-49415,
-49415,
-49424,
-49424,
-49446,
-49452,
-49473,
-49473,
-49483,
-49505,
-49505,
-49515,
-49532,
-49532,
-49532,
-49557,
+48578,
+48578,
+48603,
+48636,
+48636,
+48673,
+48673,
+48673,
+48682,
+48682,
+48744,
+48754,
+48762,
+48804,
+48855,
+48878,
+48885,
+48896,
+48896,
+48896,
+48896,
+48917,
+48973,
+48985,
+48985,
+48996,
+48996,
+48996,
+48996,
+48996,
+49010,
+49042,
+49042,
+49042,
+49042,
+49042,
+49042,
+49053,
+49053,
+49064,
+49092,
+49106,
+49106,
+49106,
+49106,
+49123,
+49142,
+49184,
+49211,
+49221,
+49221,
+49221,
+49228,
+49250,
+49250,
+49266,
+49266,
+49266,
+49285,
+49316,
+49316,
+49316,
+49316,
+49332,
+49339,
+49368,
+49384,
+49384,
+49384,
+49403,
+49420,
+49420,
+49428,
+49466,
+49489,
+49489,
+49547,
+49563,
 49563,
 49563,
-49594,
-49646,
-49663,
-49663,
-49681,
-49681,
-49681,
+49563,
+49598,
+49603,
+49614,
+49614,
+49614,
+49635,
+49635,
+49644,
+49654,
+49668,
+49668,
+49687,
 49687,
-49723,
-49734,
-49745,
-49745,
-49745,
-49745,
-49745,
-49790,
-49790,
-49790,
-49841,
-49869,
-49869,
-49880,
-49917,
-49927,
-49927,
-49953,
+49693,
+49693,
+49698,
+49739,
+49771,
+49780,
+49780,
+49803,
+49822,
+49822,
+49822,
+49822,
+49822,
+49840,
+49873,
+49873,
+49885,
+49900,
+49900,
+49912,
+49912,
+49926,
+49926,
 49961,
-49968,
-50017,
-50017,
-50017,
-50017,
-50017,
-50017,
-50031,
-50037,
-50037,
-50043,
-50043,
-50043,
-50063,
-50063,
-50078,
-50078,
-50101,
-50114,
-50135,
-50145,
-50175,
-50175,
-50175,
-50175,
-50175,
+49974,
+49974,
+49980,
+49980,
+49989,
+50006,
+50011,
+50018,
+50018,
+50018,
+50073,
+50073,
+50091,
+50091,
+50155,
+50182,
 50191,
-50191,
-50191,
-50191,
-50191,
-50209,
-50209,
-50209,
-50209,
-50209,
-50237,
-50237,
-50252,
-50295,
-50306,
-50306,
-50314,
-50341,
+50211,
+50211,
+50231,
+50231,
+50231,
+50254,
+50270,
+50270,
+50270,
+50290,
+50301,
+50301,
+50301,
+50301,
+50301,
+50323,
+50345,
+50345,
+50370,
+50370,
 50399,
 50399,
-50403,
-50420,
-50464,
-50493,
-50500,
-50506,
-50520,
-50547,
-50554,
-50568,
-50582,
-50599,
-50606,
-50620,
-50684,
-50716,
-50760,
-50760,
-50767,
-50789,
-50809,
-50855,
-50855,
-50855,
-50876,
-50918,
-50976,
-50982,
-50982,
-50989,
-51006,
-51038,
-51038,
-51077,
-51091,
-51119,
-51133,
-51154,
-51167,
-51188,
-51195,
-51209,
-51223,
-51269,
-51269,
-51307,
-51336,
-51355,
-51392,
-51406,
-51413,
-51431,
-51461,
-51490,
-51511,
-51511,
-51518,
-51518,
-51529,
+50417,
+50417,
+50433,
+50433,
+50433,
+50459,
+50459,
+50498,
+50515,
+50590,
+50590,
+50594,
+50594,
+50658,
+50690,
+50690,
+50697,
+50697,
+50722,
+50733,
+50733,
+50765,
+50790,
+50806,
+50821,
+50831,
+50866,
+50885,
+50907,
+50907,
+50971,
+50978,
+50978,
+51005,
+51022,
+51022,
+51022,
+51043,
+51049,
+51110,
+51110,
+51117,
+51142,
+51214,
+51243,
+51243,
+51272,
+51279,
+51295,
+51295,
+51330,
+51351,
+51366,
+51393,
+51400,
+51410,
+51410,
+51410,
+51436,
+51468,
+51468,
+51468,
+51516,
+51524,
+51524,
 51529,
 51529,
-51535,
-51542,
-51603,
-51610,
-51623,
-51646,
-51646,
-51658,
-51684,
-51684,
-51704,
-51704,
-51704,
-51704,
-51704,
-51704,
-51704,
-51721,
-51782,
-51791,
-51791,
-51791,
-51802,
+51553,
+51567,
+51567,
+51577,
+51595,
+51595,
+51595,
+51629,
+51643,
+51676,
+51676,
+51676,
+51676,
+51699,
+51714,
+51741,
+51741,
+51771,
+51779,
+51779,
+51779,
+51779,
+51806,
 51815,
-51832,
-51832,
-51845,
-51871,
-51905,
-51905,
-51915,
-51915,
-51945,
-51972,
-52007,
-52022,
-52022,
-52113,
-52120,
-52139,
-52157,
-52213,
-52227,
-52227,
-52251,
-52251,
+51853,
+51874,
+51890,
+51910,
+51929,
+51962,
+51962,
+51970,
+52037,
+52064,
+52115,
+52148,
+52169,
+52194,
+52218,
+52218,
+52245,
+52261,
+52271,
+52271,
+52279,
+52279,
+52305,
+52305,
+52305,
+52305,
+52305,
 52321,
-52344,
+52321,
+52321,
+52348,
+52377,
+52377,
+52377,
 52377,
+52377,
+52386,
 52403,
-52425,
-52432,
-52448,
-52448,
-52471,
-52478,
-52478,
-52490,
-52490,
-52490,
-52504,
-52504,
-52524,
+52428,
+52428,
+52469,
+52469,
+52469,
 52524,
-52540,
-52540,
-52547,
-52580,
-52594,
-52594,
-52609,
-52609,
-52629,
-52629,
-52648,
-52655,
-52685,
-52721,
-52744,
-52751,
-52766,
-52773,
-52773,
-52773,
-52773,
-52773,
-52773,
-52808,
-52831,
-52838,
-52870,
-52892,
-52899,
-52906,
-52906,
-52915,
-52915,
-52923,
-52971,
-52984,
+52539,
+52539,
+52553,
+52558,
+52569,
+52569,
+52581,
+52598,
+52614,
+52614,
+52619,
+52619,
+52631,
+52639,
+52650,
+52657,
+52657,
+52657,
+52671,
+52671,
+52691,
+52691,
+52691,
+52713,
+52799,
+52816,
+52816,
+52816,
+52869,
+52919,
+52934,
+52953,
+52953,
+52953,
 53006,
-53045,
-53051,
-53082,
-53082,
-53132,
-53132,
-53203,
-53203,
-53203,
-53215,
-53222,
-53229,
-53261,
-53265,
-53265,
-53265,
-53334,
-53334,
-53355,
-53387,
-53410,
-53417,
-53427,
-53448,
-53458,
-53458,
-53458,
-53486,
-53503,
-53526,
-53575,
-53595,
-53622,
-53622,
-53629,
-53671,
-53678,
-53716,
-53716,
-53716,
-53723,
-53723,
-53730,
-53797,
-53804,
-53811,
-53825,
-53839,
+53048,
+53124,
+53144,
+53152,
+53152,
+53152,
+53152,
+53159,
+53216,
+53221,
+53221,
+53232,
+53271,
+53287,
+53287,
+53287,
+53292,
+53309,
+53309,
+53316,
+53350,
+53401,
+53422,
+53422,
+53451,
+53456,
+53465,
+53481,
+53491,
+53491,
+53491,
+53491,
+53521,
+53532,
+53541,
+53541,
+53559,
+53566,
+53566,
+53583,
+53602,
+53611,
+53623,
+53637,
+53666,
+53685,
+53685,
+53692,
+53692,
+53725,
+53725,
+53779,
+53779,
+53800,
+53813,
+53813,
+53834,
+53841,
+53841,
 53862,
-53902,
-53916,
-53916,
-53916,
-53916,
-53916,
-53929,
-53935,
-53945,
+53898,
+53905,
+53905,
+53925,
+53943,
+53963,
 53963,
-53970,
-54004,
-54011,
-54011,
-54011,
-54011,
-54050,
-54050,
-54056,
-54072,
-54078,
-54085,
-54118,
-54118,
-54127,
-54134,
-54134,
-54134,
-54134,
-54141,
-54159,
-54159,
-54183,
+53968,
+53980,
+53995,
+54024,
+54024,
+54033,
+54051,
+54051,
+54051,
+54091,
+54091,
+54091,
+54091,
+54108,
+54126,
+54184,
+54194,
 54210,
-54217,
-54224,
-54248,
-54258,
-54273,
+54210,
+54226,
 54284,
-54307,
-54314,
-54328,
-54364,
-54378,
-54378,
+54299,
+54299,
+54312,
+54337,
+54361,
 54394,
-54406,
 54412,
-54424,
-54431,
-54447,
-54447,
-54454,
-54454,
-54454,
-54454,
-54468,
-54468,
-54519,
-54537,
-54556,
-54566,
-54581,
-54627,
-54643,
-54653,
-54676,
-54727,
-54759,
-54777,
+54412,
+54412,
+54423,
+54456,
+54498,
+54498,
+54498,
+54498,
+54510,
+54510,
+54510,
+54510,
+54510,
+54531,
+54531,
+54551,
+54577,
+54586,
+54586,
+54630,
+54639,
+54654,
+54654,
+54664,
+54684,
+54684,
+54717,
+54717,
+54724,
+54742,
+54762,
+54778,
+54778,
 54794,
-54806,
-54813,
-54837,
-54844,
-54862,
-54876,
-54876,
-54898,
-54905,
-54915,
-54958,
-54958,
-55012,
-55023,
-55061,
-55072,
-55078,
-55078,
-55082,
-55089,
-55110,
-55110,
-55117,
-55117,
-55117,
-55124,
-55131,
-55131,
-55167,
-55174,
-55181,
-55188,
-55188,
-55223,
-55230,
-55230,
-55249,
+54807,
+54807,
+54826,
+54826,
+54831,
+54831,
+54831,
+54831,
+54850,
+54850,
+54850,
+54850,
+54850,
+54850,
+54850,
+54870,
+54920,
+54920,
+54920,
+54971,
+54971,
+54971,
+54971,
+54971,
+54971,
+54978,
+54978,
+54978,
+54978,
+54992,
+55016,
+55016,
+55058,
+55075,
+55090,
+55123,
+55133,
+55133,
+55133,
+55146,
+55182,
+55209,
+55216,
+55240,
+55258,
+55258,
+55274,
+55289,
 55289,
-55326,
-55361,
-55361,
-55384,
-55413,
-55432,
-55432,
-55432,
-55432,
+55325,
+55337,
+55344,
+55344,
+55348,
+55357,
+55376,
+55416,
+55431,
+55436,
+55453,
 55453,
-55485,
-55497,
-55513,
-55520,
+55480,
+55508,
+55535,
+55542,
+55542,
 55542,
-55563,
-55582,
-55602,
-55602,
-55626,
-55633,
-55664,
-55673,
-55673,
-55680,
-55680,
-55680,
-55704,
-55704,
-55704,
-55720,
-55734,
-55745,
-55745,
-55761,
-55784,
-55804,
-55819,
-55833,
-55846,
-55846,
-55865,
-55881,
-55881,
-55887,
-55899,
-55924,
-55935,
-55958,
-55958,
-55958,
-55958,
+55572,
+55572,
+55611,
+55621,
+55650,
+55650,
+55669,
+55674,
+55681,
+55688,
+55688,
+55694,
+55705,
+55714,
+55735,
+55735,
+55735,
+55744,
+55744,
+55744,
+55744,
+55780,
+55854,
+55884,
+55914,
+55919,
+55919,
+55950,
+55960,
+55960,
+55960,
 55968,
-55976,
-55984,
-56007,
-56022,
+55981,
+55981,
+55998,
+55998,
+56018,
 56059,
-56059,
-56067,
-56081,
-56089,
-56089,
-56096,
-56096,
-56096,
-56096,
-56101,
-56123,
-56144,
-56159,
-56159,
-56198,
-56205,
-56205,
-56270,
-56291,
-56291,
-56297,
-56297,
-56297,
-56322,
-56322,
-56335,
-56341,
-56356,
-56373,
-56380,
-56392,
-56392,
-56406,
-56406,
-56422,
-56422,
-56462,
-56462,
-56478,
-56490,
-56490,
-56490,
-56514,
-56532,
-56532,
-56585,
-56585,
-56639,
-56639,
-56646,
-56672,
-56672,
-56672,
-56672,
-56692,
-56692,
-56700,
-56709,
-56709,
-56724,
-56740,
-56740,
-56750,
+56065,
+56083,
+56083,
+56110,
+56139,
+56139,
+56211,
+56211,
+56211,
+56211,
+56228,
+56240,
+56260,
+56260,
+56294,
+56294,
+56294,
+56306,
+56338,
+56407,
+56426,
+56437,
+56437,
+56443,
+56453,
+56509,
+56509,
+56509,
+56509,
+56515,
+56539,
+56546,
+56546,
+56546,
+56584,
+56602,
+56602,
+56622,
+56634,
+56652,
+56660,
+56674,
+56674,
+56729,
+56729,
+56729,
 56750,
-56766,
-56766,
-56791,
-56791,
-56798,
-56798,
-56798,
-56836,
-56871,
-56880,
-56900,
-56900,
-56936,
-56989,
-57025,
-57038,
-57048,
-57056,
-57075,
-57075,
-57095,
-57095,
+56788,
+56788,
+56793,
+56793,
+56793,
+56793,
+56813,
+56835,
+56873,
+56896,
+56944,
+56980,
+57001,
+57032,
+57051,
+57061,
+57061,
+57073,
+57073,
+57082,
+57092,
+57092,
+57092,
+57104,
+57115,
 57115,
-57129,
-57148,
-57148,
-57155,
-57162,
-57162,
-57192,
-57192,
-57192,
-57251,
+57115,
+57121,
+57133,
+57133,
+57133,
+57153,
+57183,
+57198,
+57198,
+57216,
+57232,
+57248,
+57259,
+57296,
 57316,
 57316,
-57328,
-57340,
-57365,
-57392,
-57400,
-57418,
-57430,
-57430,
-57450,
-57469,
-57478,
-57514,
-57533,
-57541,
-57541,
-57560,
-57570,
-57576,
-57576,
-57643,
-57643,
-57663,
+57322,
+57333,
+57351,
+57367,
+57375,
+57419,
+57419,
+57431,
+57441,
+57441,
+57460,
+57476,
+57495,
+57495,
+57511,
+57511,
+57521,
+57521,
+57521,
+57531,
+57558,
+57603,
+57603,
+57603,
+57609,
+57627,
+57662,
+57668,
 57677,
-57683,
-57712,
-57712,
-57731,
-57731,
-57731,
-57731,
-57737,
-57768,
-57785,
-57806,
-57806,
-57829,
-57829,
-57845,
-57892,
-57892,
-57908,
-57915,
-57936,
-57968,
-57986,
-57986,
-58028,
-58028,
-58050,
-58088,
-58088,
-58088,
-58088,
-58097,
-58097,
-58112,
-58112,
-58118,
-58118,
-58155,
-58155,
-58155,
-58155,
-58155,
-58155,
-58155,
-58155,
-58172,
-58188,
-58245,
-58245,
-58255,
-58255,
-58255,
-58255,
+57677,
+57685,
+57685,
+57696,
+57711,
+57721,
+57743,
+57765,
+57782,
+57782,
+57789,
+57789,
+57789,
+57789,
+57811,
+57811,
+57811,
+57828,
+57844,
+57844,
+57844,
+57886,
+57891,
+57918,
+57918,
+57918,
+57918,
+57926,
+57930,
+57967,
+57967,
+57973,
+57973,
+58001,
+58036,
+58070,
+58070,
+58070,
+58076,
+58084,
+58084,
+58098,
+58124,
+58140,
+58147,
+58166,
+58183,
+58230,
+58238,
+58238,
 58255,
-58262,
-58262,
-58274,
-58274,
-58314,
-58314,
-58314,
-58392,
-58392,
-58418,
-58431,
-58431,
-58431,
-58431,
-58439,
-58487,
-58487,
-58502,
-58502,
-58522,
-58522,
-58522,
-58539,
-58539,
-58549,
-58549,
-58549,
-58549,
-58549,
-58568,
+58267,
+58292,
+58302,
+58320,
+58320,
+58335,
+58335,
+58372,
+58372,
+58372,
+58401,
+58421,
+58432,
+58444,
+58450,
+58468,
+58468,
+58486,
+58486,
+58520,
+58535,
+58535,
+58535,
+58535,
+58545,
+58554,
 58568,
+58617,
+58617,
 58630,
-58642,
-58649,
-58649,
-58649,
-58649,
-58649,
-58668,
-58688,
-58698,
-58698,
-58698,
-58704,
-58715,
-58766,
-58766,
-58773,
-58783,
-58798,
-58810,
-58821,
-58821,
-58834,
-58834,
-58856,
-58868,
-58886,
-58886,
-58897,
-58897,
-58907,
-58915,
-58915,
-58915,
-58929,
-58929,
-58929,
-58929,
-58929,
-58935,
-58935,
-58935,
+58678,
+58684,
+58701,
+58701,
+58701,
+58701,
+58701,
+58739,
+58739,
+58739,
+58746,
+58746,
+58803,
+58823,
+58823,
+58823,
+58853,
+58871,
 58952,
-58987,
-58987,
-58987,
-58995,
-58995,
-59011,
-59023,
-59028,
-59028,
-59028,
-59040,
-59040,
-59040,
-59040,
-59040,
-59040,
-59040,
-59056,
-59068,
-59075,
-59075,
-59086,
-59132,
-59166,
-59166,
-59166,
-59170,
-59180,
-59208,
-59208,
-59218,
-59244,
+58963,
+58963,
+58970,
+58970,
+58988,
+58997,
+59013,
+59018,
+59025,
+59025,
+59031,
+59044,
+59063,
+59069,
+59069,
+59127,
+59146,
+59146,
+59146,
+59168,
+59168,
+59179,
+59179,
+59191,
+59207,
+59219,
 59258,
-59273,
-59292,
-59296,
-59323,
-59338,
-59338,
-59338,
-59346,
-59346,
-59354,
-59361,
-59372,
-59388,
-59400,
-59400,
-59427,
-59437,
-59449,
-59506,
-59553,
-59567,
-59579,
-59579,
-59599,
-59611,
-59623,
-59623,
-59650,
-59702,
-59712,
-59725,
-59725,
-59738,
-59759,
-59771,
-59771,
-59771,
-59771,
-59771,
-59781,
-59781,
-59789,
-59789,
-59789,
-59789,
-59789,
+59265,
+59315,
+59315,
+59315,
+59320,
+59320,
+59320,
+59320,
+59350,
+59367,
+59377,
+59423,
+59423,
+59438,
+59488,
+59488,
+59494,
+59494,
+59507,
+59540,
+59540,
+59540,
+59540,
+59540,
+59540,
+59578,
+59618,
+59630,
+59639,
+59639,
+59733,
+59733,
+59751,
+59751,
+59766,
+59783,
+59783,
+59790,
 59798,
-59798,
-59805,
-59815,
-59833,
-59862,
-59877,
-59901,
-59901,
-59915,
-59959,
-59959,
-59978,
-59978,
-60043,
-60043,
-60052,
-60063,
-60093,
-60112,
-60129,
-60129,
-60129,
-60153,
-60177,
-60189,
-60210,
-60210,
-60222,
-60280,
-60292,
-60317,
-60337,
-60364,
-60364,
-60373,
-60389,
+59804,
+59854,
+59854,
+59869,
+59869,
+59875,
+59875,
+59895,
+59895,
+59934,
+59961,
+59961,
+59961,
+59967,
+59973,
+59973,
+59999,
+60008,
+60008,
+60008,
+60036,
+60036,
+60036,
+60046,
+60060,
+60060,
+60060,
+60068,
+60086,
+60086,
+60096,
+60096,
+60117,
+60159,
+60204,
+60228,
+60228,
+60241,
+60241,
+60297,
+60313,
+60319,
+60319,
 60389,
-60402,
-60475,
-60493,
-60532,
-60550,
+60396,
+60396,
+60396,
+60396,
+60412,
+60412,
+60452,
+60452,
+60477,
+60489,
+60509,
+60509,
+60521,
+60541,
 60550,
-60556,
-60568,
-60568,
-60573,
-60573,
-60583,
-60604,
-60604,
-60604,
-60626,
-60626,
-60626,
-60626,
-60626,
-60626,
-60626,
-60649,
-60649,
-60675,
-60684,
-60690,
-60714,
-60750,
-60759,
-60771,
-60771,
-60783,
-60793,
-60826,
-60833,
-60843,
-60843,
-60859,
-60869,
-60869,
-60876,
-60889,
-60889,
-60900,
-60912,
+60559,
+60559,
+60571,
+60597,
+60631,
+60646,
+60657,
+60663,
+60663,
+60672,
+60701,
+60701,
+60709,
+60715,
+60715,
+60757,
+60768,
+60768,
+60768,
+60768,
+60795,
+60805,
+60805,
+60805,
+60805,
+60805,
+60852,
+60867,
+60867,
+60867,
+60867,
+60867,
+60882,
+60898,
+60898,
+60913,
+60913,
 60932,
-60943,
-60949,
-60949,
-60982,
-60982,
-60982,
-60982,
-60982,
-60982,
-61028,
-61034,
-61046,
-61046,
-61046,
-61046,
-61066,
-61066,
-61066,
-61080,
-61087,
-61087,
-61109,
-61109,
-61161,
-61179,
-61237,
-61237,
-61246,
-61258,
-61305,
-61312,
-61318,
-61318,
-61318,
-61318,
-61318,
-61361,
-61382,
-61432,
+61031,
+61047,
+61064,
+61064,
+61078,
+61078,
+61110,
+61142,
+61142,
+61142,
+61167,
+61167,
+61167,
+61167,
+61199,
+61218,
+61218,
+61247,
+61254,
+61290,
+61290,
+61290,
+61290,
+61301,
+61301,
+61301,
+61301,
+61301,
+61336,
+61342,
+61342,
+61349,
+61349,
+61370,
+61370,
+61393,
+61425,
 61442,
-61450,
-61450,
-61456,
-61492,
-61492,
-61515,
+61442,
+61468,
+61496,
+61502,
+61502,
+61502,
+61512,
+61525,
 61525,
-61580,
-61605,
-61605,
-61605,
-61605,
-61605,
-61646,
-61667,
-61695,
-61695,
-61746,
-61746,
-61746,
-61762,
-61771,
-61771,
-61805,
-61825,
-61841,
-61846,
-61846,
-61858,
-61858,
-61868,
-61868,
-61884,
-61920,
-61931,
-61964,
-61988,
-62013,
-62013,
-62013,
-62024,
-62073,
-62073,
-62106,
-62106,
-62106,
-62106,
-62106,
-62112,
-62112,
-62123,
-62131,
-62131,
-62155,
-62164,
-62187,
-62196,
-62196,
-62196,
-62217,
-62235,
-62235,
-62255,
-62274,
-62274,
-62274,
-62284,
-62284,
-62284,
-62328,
-62328,
-62335,
-62364,
-62364,
-62389,
-62434,
-62434,
-62450,
-62450,
-62450,
-62450,
-62473,
-62473,
-62473,
-62485,
-62523,
-62539,
-62539,
+61542,
+61595,
+61640,
+61684,
+61710,
+61710,
+61737,
+61750,
+61786,
+61786,
+61803,
+61889,
+61889,
+61889,
+61908,
+61914,
+61938,
+61953,
+61972,
+62009,
+62033,
+62039,
+62039,
+62057,
+62063,
+62074,
+62093,
+62113,
+62113,
+62119,
+62119,
+62125,
+62125,
+62146,
+62159,
+62159,
+62165,
+62199,
+62216,
+62225,
+62225,
+62231,
+62237,
+62237,
+62237,
+62237,
+62265,
+62278,
+62317,
+62323,
+62323,
+62323,
+62323,
+62323,
+62339,
+62359,
+62388,
+62394,
+62394,
+62394,
+62400,
+62406,
+62416,
+62416,
+62447,
+62447,
+62475,
+62475,
+62491,
+62491,
+62531,
+62531,
+62531,
+62531,
 62559,
-62580,
-62592,
-62592,
-62592,
-62604,
-62604,
-62630,
-62630,
-62630,
-62641,
-62650,
-62711,
-62711,
-62711,
-62711,
-62711,
-62747,
-62747,
-62759,
-62792,
-62801,
-62843,
-62862,
-62862,
-62895,
-62901,
-62915,
-62915,
-62958,
-62958,
-62975,
-62987,
-62999,
-62999,
-62999,
-63025,
-63055,
-63067,
-63067,
-63067,
-63067,
-63089,
-63089,
-63101,
-63101,
-63116,
-63135,
-63135,
-63151,
-63194,
-63194,
-63198,
-63206,
-63206,
+62572,
+62586,
+62601,
+62601,
+62601,
+62625,
+62635,
+62658,
+62658,
+62670,
+62682,
+62703,
+62703,
+62709,
+62716,
+62736,
+62775,
+62785,
+62790,
+62796,
+62796,
+62813,
+62828,
+62845,
+62853,
+62853,
+62853,
+62874,
+62887,
+62893,
+62909,
+62922,
+62971,
+62971,
+63013,
+63013,
+63021,
+63021,
+63053,
+63087,
+63150,
+63150,
+63150,
+63160,
+63166,
+63166,
+63166,
+63177,
 63212,
-63212,
-63245,
-63282,
-63282,
-63282,
-63282,
-63294,
-63304,
-63304,
-63304,
-63318,
-63318,
-63340,
-63359,
-63359,
-63376,
-63376,
-63395,
-63405,
-63405,
-63405,
-63405,
-63433,
-63433,
-63433,
-63433,
-63446,
-63454,
-63486,
-63486,
-63486,
-63486,
-63486,
-63508,
-63508,
-63508,
-63508,
-63508,
-63508,
-63534,
-63547,
-63554,
-63554,
-63561,
-63561,
-63561,
-63565,
-63575,
-63575,
-63575,
-63575,
-63605,
-63619,
-63619,
-63638,
-63648,
-63674,
-63674,
-63674,
-63699,
-63707,
-63752,
-63769,
-63781,
-63793,
-63793,
-63842,
-63842,
-63856,
-63890,
-63890,
-63890,
-63898,
-63916,
-63916,
-63932,
-63932,
-63953,
-63953,
-63953,
-63972,
-63972,
-63972,
-63987,
-64032,
-64064,
-64064,
-64136,
-64145,
-64145,
-64175,
-64175,
-64175,
-64202,
-64216,
-64216,
-64243,
-64268,
-64279,
-64279,
-64307,
-64341,
-64350,
-64350,
-64350,
-64350,
-64365,
-64380,
-64380,
-64428,
-64428,
-64428,
-64435,
-64470,
-64470,
-64470,
-64483,
-64483,
-64483,
-64506,
-64513,
-64533,
-64533,
-64533,
-64553,
-64572,
-64572,
-64572,
-64572,
-64582,
-64613,
-64620,
-64644,
-64663,
+63243,
+63243,
+63243,
+63243,
+63243,
+63243,
+63243,
+63243,
+63252,
+63263,
+63269,
+63269,
+63269,
+63275,
+63289,
+63301,
+63301,
+63316,
+63316,
+63316,
+63316,
+63335,
+63391,
+63413,
+63439,
+63445,
+63445,
+63457,
+63457,
+63472,
+63472,
+63472,
+63494,
+63500,
+63545,
+63545,
+63557,
+63557,
+63580,
+63676,
+63682,
+63711,
+63718,
+63731,
+63750,
+63750,
+63771,
+63799,
+63822,
+63822,
+63849,
+63880,
+63903,
+63910,
+63929,
+63929,
+63936,
+63942,
+63955,
+63955,
+63955,
+64014,
+64020,
+64020,
+64040,
+64051,
+64067,
+64082,
+64104,
+64104,
+64110,
+64141,
+64141,
+64152,
+64159,
+64208,
+64231,
+64231,
+64231,
+64286,
+64286,
+64310,
+64329,
+64360,
+64360,
+64391,
+64391,
+64397,
+64397,
+64410,
+64410,
+64427,
+64434,
+64434,
+64454,
+64454,
+64454,
+64454,
+64454,
+64463,
+64463,
+64469,
+64469,
+64492,
+64492,
+64521,
+64532,
+64590,
+64605,
+64633,
 64663,
-64693,
-64693,
-64704,
-64739,
-64775,
-64775,
-64820,
-64832,
-64837,
-64850,
-64850,
-64850,
-64867,
-64867,
-64915,
-64928,
-64928,
-64938,
-64938,
-64948,
+64695,
+64701,
+64707,
+64707,
+64720,
+64745,
+64752,
+64766,
+64776,
+64791,
+64791,
+64813,
+64823,
+64823,
+64823,
+64829,
+64853,
+64853,
+64884,
+64884,
+64884,
+64884,
+64893,
+64903,
+64925,
+64934,
 64958,
 64958,
 64958,
-64966,
-64966,
-64966,
-64966,
-64966,
-64995,
-64995,
-65024,
-65024,
-65024,
+64965,
+64978,
+64999,
+65018,
 65024,
-65024,
-65024,
-65053,
-65053,
-65090,
-65090,
-65090,
-65096,
-65116,
-65128,
-65153,
-65153,
-65169,
-65183,
-65233,
-65233,
-65233,
-65233,
-65245,
-65255,
-65255,
+65031,
+65046,
+65061,
+65095,
+65114,
+65114,
+65137,
+65148,
+65148,
+65209,
+65226,
+65226,
 65264,
-65295,
-65295,
-65295,
-65321,
-65353,
+65275,
+65286,
+65292,
+65292,
+65305,
+65305,
+65315,
+65315,
+65338,
+65338,
+65354,
+65361,
+65361,
+65361,
+65361,
+65373,
+65373,
 65382,
-65386,
-65400,
-65438,
-65451,
-65451,
-65451,
-65451,
-65451,
-65471,
-65471,
-65471,
-65471,
-65476,
-65505,
-65505,
-65505,
-65505,
-65512,
-65539,
-65548,
-65599,
-65599,
-65599,
-65610,
-65632,
-65632,
-65632,
-65632,
+65397,
+65404,
+65431,
+65437,
+65454,
+65454,
+65472,
+65486,
+65486,
+65492,
+65510,
+65516,
+65516,
+65516,
+65541,
+65541,
+65541,
+65541,
+65550,
+65591,
+65591,
+65591,
+65612,
+65643,
+65666,
 65666,
-65674,
-65683,
-65683,
-65701,
-65732,
-65761,
-65761,
-65781,
-65781,
-65798,
-65814,
-65820,
-65829,
-65836,
-65848,
-65867,
-65877,
-65896,
-65896,
-65906,
-65906,
-65906,
-65917,
-65917,
-65917,
-65917,
-65917,
-65924,
-65924,
-65944,
-65944,
-65944,
-65957,
-65977,
-66005,
-66040,
-66040,
-66053,
-66053,
-66053,
-66064,
-66083,
-66083,
-66100,
-66100,
-66100,
-66116,
-66116,
-66116,
-66145,
-66145,
-66179,
-66190,
-66190,
-66190,
-66200,
-66200,
-66200,
-66222,
-66222,
-66222,
-66240,
-66248,
-66275,
-66292,
-66292,
-66292,
-66292,
-66312,
-66312,
-66312,
-66328,
-66328,
-66347,
-66355,
-66372,
-66393,
-66416,
-66435,
-66435,
-66435,
-66457,
-66484,
-66502,
-66502,
-66517,
-66537,
-66549,
-66561,
-66573,
-66573,
-66590,
+65685,
+65685,
+65691,
+65691,
+65703,
+65713,
+65727,
+65733,
+65749,
+65749,
+65759,
+65839,
+65870,
+65885,
+65891,
+65918,
+65937,
+65951,
+65951,
+65967,
+65973,
+65979,
+65979,
+66030,
+66079,
+66088,
+66088,
+66088,
+66107,
+66113,
+66129,
+66184,
+66184,
+66184,
+66207,
+66255,
+66271,
+66313,
+66313,
+66323,
+66340,
+66350,
+66370,
+66370,
+66404,
+66404,
+66404,
+66411,
+66427,
+66438,
+66438,
+66438,
+66438,
+66448,
+66462,
+66473,
+66473,
+66501,
+66501,
+66501,
+66536,
+66536,
+66536,
+66536,
+66536,
+66536,
+66536,
+66536,
+66536,
+66536,
+66536,
+66582,
+66582,
 66599,
-66613,
-66621,
-66621,
-66621,
-66621,
-66634,
+66608,
+66624,
+66624,
+66624,
+66631,
 66656,
 66656,
-66673,
-66673,
-66673,
-66673,
-66704,
-66748,
-66748,
-66748,
-66748,
-66748,
-66748,
-66748,
-66760,
-66760,
-66760,
-66760,
-66775,
-66775,
-66796,
-66796,
-66820,
-66832,
-66832,
-66854,
-66854,
-66864,
-66864,
-66893,
-66915,
-66932,
-66932,
-66943,
-66943,
-66957,
-66957,
-66957,
-67012,
-67012,
-67033,
-67033,
-67041,
-67051,
-67063,
+66679,
+66679,
+66701,
+66728,
+66751,
+66758,
+66792,
+66814,
+66814,
+66814,
+66860,
+66903,
+66903,
+66903,
+66919,
+66919,
+66919,
+66926,
+66989,
+67022,
 67074,
-67074,
-67096,
-67116,
-67116,
-67116,
-67122,
-67129,
-67129,
-67129,
-67143,
-67150,
-67150,
-67160,
-67174,
-67184,
-67192,
-67192,
-67218,
-67218,
-67232,
+67090,
+67121,
+67121,
+67121,
+67132,
+67197,
+67197,
+67205,
+67224,
 67250,
-67257,
-67257,
-67265,
-67265,
-67277,
-67277,
-67277,
-67331,
-67349,
-67349,
-67372,
-67392,
-67392,
-67402,
-67402,
-67439,
-67439,
-67466,
-67474,
-67474,
-67474,
-67481,
-67496,
-67532,
-67553,
-67559,
-67597,
-67603,
-67610,
-67610,
-67616,
-67616,
-67616,
-67641,
-67641,
-67641,
-67641,
-67687,
-67697,
-67728,
-67755,
-67770,
-67787,
-67812,
-67883,
-67893,
-67902,
-67902,
-67911,
-67930,
-67950,
-67967,
-67967,
-67967,
-67988,
-68008,
-68018,
-68018,
-68026,
-68026,
-68033,
-68033,
-68055,
-68070,
-68070,
-68075,
-68082,
-68082,
-68087,
-68087,
-68087,
-68087,
-68108,
-68165,
-68165,
-68165,
-68186,
-68218,
-68236,
-68273,
-68273,
-68293,
-68293,
-68308,
-68308,
-68322,
-68322,
-68352,
-68352,
-68397,
-68403,
-68459,
-68469,
-68487,
-68487,
-68487,
-68529,
-68536,
-68548,
-68548,
-68557,
-68564,
-68586,
-68603,
-68625,
-68625,
-68650,
-68668,
-68676,
-68696,
-68709,
-68709,
-68709,
-68709,
-68718,
-68718,
-68732,
-68732,
-68732,
-68732,
-68739,
-68739,
-68739,
-68764,
-68764,
-68784,
-68784,
-68784,
-68852,
-68871,
-68871,
-68871,
-68871,
-68871,
-68876,
-68901,
-68911,
-68949,
-68960,
-69003,
-69022,
+67266,
+67282,
+67282,
+67282,
+67295,
+67295,
+67311,
+67322,
+67322,
+67329,
+67348,
+67348,
+67348,
+67348,
+67368,
+67395,
+67395,
+67419,
+67428,
+67428,
+67449,
+67463,
+67463,
+67470,
+67487,
+67515,
+67534,
+67534,
+67534,
+67576,
+67576,
+67590,
+67609,
+67632,
+67632,
+67632,
+67642,
+67675,
+67688,
+67693,
+67700,
+67713,
+67713,
+67744,
+67771,
+67797,
+67816,
+67824,
+67824,
+67831,
+67851,
+67851,
+67851,
+67856,
+67869,
+67880,
+67890,
+67890,
+67890,
+67914,
+67914,
+67968,
+67968,
+67975,
+67985,
+67997,
+67997,
+68012,
+68012,
+68012,
+68062,
+68062,
+68094,
+68094,
+68128,
+68137,
+68153,
+68153,
+68178,
+68190,
+68190,
+68190,
+68190,
+68200,
+68241,
+68241,
+68260,
+68260,
+68260,
+68260,
+68270,
+68270,
+68270,
+68270,
+68286,
+68318,
+68318,
+68318,
+68325,
+68349,
+68349,
+68358,
+68376,
+68376,
+68402,
+68439,
+68481,
+68490,
+68490,
+68490,
+68508,
+68508,
+68521,
+68534,
+68574,
+68606,
+68606,
+68606,
+68644,
+68644,
+68672,
+68691,
+68713,
+68742,
+68742,
+68752,
+68752,
+68752,
+68752,
+68752,
+68789,
+68789,
+68789,
+68837,
+68837,
+68837,
+68837,
+68847,
+68883,
+68934,
+68955,
+68955,
+68972,
+68972,
+68972,
+68982,
+68982,
+69000,
+69012,
+69026,
+69026,
+69031,
 69051,
-69083,
-69119,
-69129,
-69196,
-69196,
-69228,
-69237,
-69237,
-69237,
-69254,
-69293,
-69293,
-69293,
-69303,
-69323,
-69341,
-69341,
-69373,
-69373,
-69394,
-69416,
-69430,
-69434,
-69441,
-69453,
-69482,
-69501,
-69511,
-69517,
+69071,
+69071,
+69071,
+69071,
+69109,
+69109,
+69109,
+69109,
+69109,
+69125,
+69133,
+69133,
+69133,
+69133,
+69133,
+69133,
+69189,
+69197,
+69197,
+69235,
+69247,
+69247,
+69259,
+69294,
+69294,
+69294,
+69314,
+69325,
+69377,
+69399,
+69420,
+69431,
 69536,
-69546,
-69546,
-69552,
-69580,
-69622,
-69622,
-69622,
-69629,
-69629,
-69650,
-69666,
-69666,
-69666,
-69697,
-69705,
-69733,
-69754,
-69775,
-69780,
-69780,
-69792,
-69819,
-69830,
-69865,
-69880,
-69899,
-69953,
-69953,
-69968,
-69985,
+69547,
+69547,
+69547,
+69559,
+69559,
+69559,
+69582,
+69582,
+69582,
+69582,
+69599,
+69638,
+69638,
+69648,
+69648,
+69667,
+69667,
+69687,
+69721,
+69721,
+69748,
+69748,
+69748,
+69748,
+69777,
+69798,
+69798,
+69807,
+69822,
+69832,
+69832,
+69840,
+69847,
+69847,
+69847,
+69855,
+69855,
+69863,
+69863,
+69863,
+69875,
+69875,
+69908,
+69927,
+69927,
+69932,
+69932,
+69932,
+69932,
+69932,
+69960,
+69960,
+69976,
+69990,
+69997,
 69997,
-70012,
-70049,
-70049,
-70073,
-70090,
-70100,
-70100,
-70100,
-70100,
-70100,
-70100,
-70108,
-70114,
-70114,
-70152,
-70152,
-70152,
-70152,
-70199,
-70212,
-70226,
-70226,
-70226,
-70226,
-70302,
-70311,
-70311,
-70311,
-70311,
-70311,
-70311,
-70311,
-70323,
-70337,
-70337,
-70343,
-70378,
-70378,
-70378,
-70388,
-70426,
-70438,
-70438,
-70454,
-70454,
-70454,
-70454,
-70479,
-70500,
-70500,
-70510,
+69997,
+70008,
+70031,
+70052,
+70052,
+70066,
+70102,
+70102,
+70111,
+70111,
+70127,
+70127,
+70151,
+70151,
+70168,
+70175,
+70196,
+70214,
+70260,
+70300,
+70309,
+70309,
+70309,
+70318,
+70318,
+70318,
+70325,
+70354,
+70368,
+70379,
+70400,
+70420,
+70429,
+70449,
+70449,
+70465,
+70491,
+70507,
+70507,
+70538,
 70538,
-70550,
-70550,
-70560,
-70566,
-70566,
-70581,
-70594,
-70594,
-70615,
-70638,
-70655,
-70671,
-70692,
-70692,
-70692,
-70709,
-70736,
-70772,
-70813,
-70813,
-70813,
-70823,
-70823,
-70823,
-70836,
-70836,
-70852,
-70852,
-70858,
-70886,
-70895,
-70914,
-70914,
-70914,
-70914,
-70914,
-70920,
-70941,
-70950,
-70957,
-70976,
-70982,
-70999,
-71033,
-71033,
-71040,
-71053,
-71060,
-71081,
-71081,
-71091,
-71104,
-71119,
-71129,
-71129,
-71129,
-71144,
-71165,
-71197,
-71219,
-71225,
-71225,
-71225,
-71250,
-71268,
-71268,
-71306,
-71341,
-71341,
-71347,
-71354,
-71354,
-71362,
-71362,
-71384,
-71392,
-71404,
-71429,
-71455,
-71455,
-71472,
-71472,
-71497,
-71506,
-71524,
-71524,
-71524,
-71545,
-71545,
-71553,
-71553,
-71553,
-71559,
-71574,
-71574,
-71585,
-71585,
-71585,
-71595,
-71612,
-71626,
-71626,
-71626,
-71632,
-71632,
-71632,
-71652,
-71652,
-71675,
-71675,
-71695,
-71695,
-71732,
-71746,
-71761,
-71794,
-71811,
-71831,
-71864,
-71892,
-71916,
-71926,
-71947,
-71947,
-71984,
-71997,
-71997,
-72002,
-72002,
-72002,
-72008,
-72031,
-72031,
-72057,
-72057,
-72065,
-72086,
-72106,
-72134,
-72148,
-72194,
-72202,
-72214,
-72214,
-72227,
+70571,
+70571,
+70571,
+70601,
+70601,
+70601,
+70601,
+70601,
+70613,
+70613,
+70674,
+70674,
+70732,
+70732,
+70779,
+70814,
+70861,
+70861,
+70918,
+70931,
+70974,
+70974,
+70974,
+70986,
+71001,
+71039,
+71044,
+71062,
+71127,
+71139,
+71146,
+71177,
+71177,
+71193,
+71193,
+71215,
+71215,
+71215,
+71231,
+71231,
+71236,
+71236,
+71248,
+71248,
+71248,
+71248,
+71300,
+71337,
+71361,
+71386,
+71420,
+71420,
+71420,
+71453,
+71453,
+71453,
+71488,
+71507,
+71515,
+71527,
+71537,
+71537,
+71537,
+71589,
+71589,
+71608,
+71631,
+71631,
+71631,
+71643,
+71649,
+71688,
+71700,
+71715,
+71715,
+71715,
+71715,
+71715,
+71715,
+71715,
+71715,
+71745,
+71745,
+71745,
+71750,
+71750,
+71750,
+71750,
+71750,
+71768,
+71818,
+71833,
+71861,
+71861,
+71873,
+71873,
+71873,
+71889,
+71889,
+71908,
+71908,
+71914,
+71942,
+71942,
+71953,
+71953,
+71976,
+71991,
+71991,
+72003,
+72003,
+72003,
+72019,
+72033,
+72069,
+72069,
+72085,
+72129,
+72129,
+72161,
+72205,
 72240,
-72261,
-72261,
-72318,
-72355,
-72355,
-72355,
-72390,
-72395,
+72290,
+72322,
+72334,
+72346,
+72346,
 72395,
-72405,
-72423,
-72423,
-72430,
-72430,
-72450,
-72450,
-72450,
-72450,
-72456,
-72465,
-72465,
-72476,
-72476,
-72476,
-72487,
-72487,
-72504,
-72514,
-72514,
-72526,
-72558,
-72558,
+72437,
+72437,
+72437,
+72458,
+72513,
+72520,
+72520,
+72533,
+72533,
+72545,
+72545,
 72558,
-72568,
-72587,
-72603,
-72618,
-72640,
-72640,
-72648,
-72668,
-72684,
-72684,
-72694,
-72694,
-72694,
-72750,
-72750,
-72771,
-72784,
-72798,
-72798,
-72808,
-72808,
-72808,
-72815,
-72815,
-72831,
-72855,
-72855,
-72875,
-72908,
-72908,
-72918,
-72938,
-72938,
-72938,
-72952,
-72952,
-72952,
-72983,
-72996,
-73009,
-73017,
-73041,
-73068,
-73112,
-73112,
-73164,
-73180,
-73214,
-73214,
-73214,
-73232,
-73247,
-73266,
-73266,
-73273,
-73273,
-73273,
-73273,
-73273,
-73280,
-73285,
-73285,
-73285,
-73300,
-73310,
-73310,
-73310,
-73331,
-73339,
-73352,
-73368,
-73390,
-73390,
-73438,
-73451,
-73451,
+72565,
+72565,
+72565,
+72565,
+72565,
+72585,
+72590,
+72590,
+72608,
+72608,
+72608,
+72608,
+72664,
+72677,
+72682,
+72711,
+72721,
+72730,
+72730,
+72752,
+72752,
+72775,
+72787,
+72794,
+72794,
+72838,
+72864,
+72891,
+72891,
+72907,
+72922,
+72935,
+72935,
+72966,
+72991,
+72991,
+72991,
+72991,
+72998,
+73031,
+73057,
+73062,
+73071,
+73097,
+73113,
+73127,
+73127,
+73127,
+73140,
+73140,
+73173,
+73183,
+73193,
+73217,
+73229,
+73229,
+73236,
+73254,
+73254,
+73262,
+73262,
+73262,
+73262,
+73274,
+73274,
+73291,
+73291,
+73291,
+73298,
+73316,
+73316,
+73343,
+73350,
+73350,
+73359,
+73359,
+73359,
+73398,
+73405,
+73430,
+73430,
 73457,
-73493,
-73513,
-73513,
-73513,
-73522,
-73522,
-73533,
-73543,
-73553,
-73559,
-73604,
-73604,
-73604,
-73604,
-73604,
-73613,
-73613,
-73627,
-73627,
-73627,
-73640,
-73664,
-73664,
-73682,
-73682,
-73696,
-73696,
-73705,
-73705,
-73760,
-73760,
-73760,
-73770,
-73770,
-73788,
-73808,
-73827,
-73827,
-73827,
-73840,
-73845,
-73845,
-73859,
-73859,
-73881,
-73881,
-73881,
-73881,
-73881,
-73889,
-73889,
-73900,
-73900,
-73920,
-73927,
+73472,
+73495,
+73495,
+73515,
+73551,
+73551,
+73563,
+73571,
+73571,
+73606,
+73612,
+73647,
+73647,
+73674,
+73683,
+73703,
+73727,
+73747,
+73763,
+73782,
+73782,
+73793,
+73834,
+73834,
+73844,
+73863,
+73863,
+73863,
+73875,
+73894,
 73927,
 73936,
-73946,
-73967,
-73967,
-73967,
-73967,
-73967,
-73978,
-73990,
-74015,
-74043,
-74065,
-74102,
-74149,
-74156,
+73955,
+73955,
+73988,
+74023,
+74039,
+74051,
+74051,
+74051,
+74051,
+74058,
+74069,
+74087,
+74099,
+74137,
+74137,
+74137,
 74156,
-74172,
-74172,
-74179,
-74179,
-74179,
-74188,
-74188,
-74193,
-74215,
+74175,
+74186,
+74198,
+74209,
 74225,
-74259,
-74259,
-74280,
-74280,
-74280,
-74297,
-74321,
-74321,
-74363,
-74368,
-74368,
-74375,
-74375,
-74375,
-74375,
-74389,
-74420,
-74426,
-74440,
-74455,
-74455,
-74455,
-74475,
-74475,
-74475,
-74475,
-74497,
-74542,
-74550,
+74235,
+74266,
+74294,
+74304,
+74304,
+74324,
+74366,
+74366,
+74429,
+74429,
+74447,
+74490,
+74490,
+74513,
+74513,
+74539,
 74571,
-74609,
-74617,
-74637,
-74637,
-74675,
-74675,
-74675,
-74675,
-74675,
-74675,
-74692,
-74708,
-74708,
-74708,
-74708,
-74726,
-74726,
-74726,
-74744,
-74781,
+74593,
+74625,
+74646,
+74657,
+74657,
+74657,
+74671,
+74671,
+74680,
+74690,
+74721,
+74731,
+74760,
+74767,
+74782,
 74810,
-74819,
-74819,
-74831,
-74847,
-74847,
-74847,
-74871,
-74871,
-74871,
-74871,
-74871,
-74889,
-74889,
-74889,
-74910,
-74910,
-74916,
-74916,
-74916,
-74916,
-74916,
-74916,
-74932,
-74951,
-75001,
-75001,
-75010,
-75010,
-75010,
-75010,
-75020,
-75020,
-75027,
-75027,
-75045,
-75058,
-75063,
-75083,
-75096,
-75108,
-75147,
-75153,
-75153,
-75179,
-75179,
-75212,
-75212,
-75224,
-75224,
-75285,
-75322,
-75337,
-75345,
-75369,
-75445,
-75512,
-75518,
-75540,
-75553,
-75563,
-75593,
-75593,
-75600,
-75634,
-75688,
-75688,
-75688,
-75688,
-75694,
-75713,
-75713,
-75760,
-75766,
-75787,
-75816,
-75816,
-75831,
-75831,
-75858,
-75858,
-75870,
-75897,
-75909,
-75964,
-75964,
-75964,
-75975,
-75975,
+74878,
+74878,
+74878,
+74885,
+74905,
+74905,
+74928,
+74928,
+74957,
+74976,
+74976,
+74983,
+74990,
+75002,
+75002,
+75015,
+75049,
+75049,
+75066,
+75066,
+75073,
+75073,
+75085,
+75085,
+75085,
+75091,
+75091,
+75133,
+75163,
+75177,
+75177,
+75177,
+75177,
+75177,
+75198,
+75198,
+75235,
+75248,
+75288,
+75294,
+75310,
+75330,
+75330,
+75355,
+75355,
+75355,
+75375,
+75394,
+75412,
+75412,
+75412,
+75424,
+75448,
+75484,
+75484,
+75495,
+75495,
+75507,
+75517,
+75524,
+75524,
+75570,
+75577,
+75577,
+75599,
+75623,
+75623,
+75680,
+75680,
+75720,
+75734,
+75750,
+75750,
+75785,
+75785,
+75796,
+75796,
+75806,
+75822,
+75828,
+75861,
+75861,
+75898,
+75898,
+75904,
+75904,
+75904,
+75968,
 75981,
-76000,
-76000,
-76000,
-76007,
-76007,
-76020,
-76020,
-76032,
-76055,
-76067,
-76067,
-76113,
-76120,
-76120,
-76130,
-76156,
-76171,
-76176,
-76215,
-76227,
-76264,
-76283,
-76300,
-76300,
-76325,
-76359,
-76372,
-76378,
-76378,
-76384,
-76384,
-76384,
-76384,
-76384,
-76384,
-76405,
-76416,
-76462,
-76472,
-76472,
-76498,
-76517,
-76517,
-76527,
-76527,
-76539,
-76539,
-76545,
-76545,
-76545,
-76571,
-76596,
-76620,
-76630,
-76630,
-76630,
-76691,
-76691,
-76691,
-76696,
-76716,
-76716,
-76716,
-76730,
-76730,
-76735,
-76735,
-76750,
-76766,
-76778,
-76790,
-76790,
-76810,
-76810,
-76820,
+75991,
+76028,
+76028,
+76057,
+76057,
+76068,
+76075,
+76102,
+76118,
+76118,
+76126,
+76126,
+76146,
+76151,
+76151,
+76151,
+76163,
+76181,
+76181,
+76210,
+76229,
+76234,
+76234,
+76248,
+76271,
+76302,
+76341,
+76341,
+76364,
+76403,
+76403,
+76411,
+76418,
+76428,
+76470,
+76490,
+76497,
+76534,
+76589,
+76601,
+76601,
+76601,
+76622,
+76637,
+76676,
+76702,
+76719,
+76719,
+76719,
+76741,
+76741,
+76741,
+76782,
+76799,
+76812,
+76819,
+76826,
 76826,
-76836,
-76836,
-76836,
-76836,
-76849,
-76849,
-76849,
-76860,
-76860,
-76860,
-76877,
-76888,
-76912,
-76918,
-76935,
-76942,
-76942,
-76955,
-76971,
-76971,
-76988,
-77003,
-77003,
+76826,
+76853,
+76859,
+76884,
+76884,
+76884,
+76899,
+76899,
+76909,
+76909,
+76917,
+76924,
+76948,
+77011,
+77011,
+77011,
+77011,
+77018,
 77018,
-77029,
-77044,
-77044,
-77044,
-77059,
-77065,
-77075,
-77086,
-77086,
-77106,
-77106,
-77115,
-77115,
-77126,
-77126,
-77141,
+77018,
+77025,
+77041,
+77054,
+77082,
+77082,
+77082,
+77092,
+77109,
+77119,
+77119,
+77119,
 77158,
-77168,
-77182,
+77177,
+77183,
 77193,
-77202,
-77222,
-77255,
-77271,
-77284,
-77284,
-77284,
-77346,
-77346,
-77346,
-77359,
-77367,
-77374,
-77401,
-77412,
-77418,
-77431,
-77431,
-77441,
-77506,
-77527,
-77527,
+77238,
+77268,
+77268,
+77274,
+77274,
+77280,
+77280,
+77280,
+77301,
+77301,
+77309,
+77319,
+77319,
+77319,
+77319,
+77340,
+77385,
+77385,
+77385,
+77404,
+77437,
+77437,
+77453,
+77453,
+77453,
+77453,
+77463,
+77463,
+77489,
+77499,
+77499,
+77515,
 77537,
-77574,
-77582,
-77582,
-77582,
-77598,
-77619,
-77619,
-77639,
-77649,
-77679,
-77701,
-77701,
-77747,
-77747,
+77537,
+77596,
+77596,
+77616,
+77621,
+77656,
+77656,
+77673,
+77673,
+77697,
+77697,
+77697,
+77702,
+77702,
+77708,
+77731,
+77731,
+77731,
+77731,
+77731,
+77738,
 77747,
-77763,
-77775,
-77805,
-77815,
-77815,
-77815,
-77815,
-77821,
-77866,
-77866,
-77866,
-77908,
-77917,
-77927,
-77927,
-77954,
-77954,
-77954,
-77954,
-77969,
-77969,
-77980,
-77980,
-77991,
-78001,
-78001,
-78047,
+77765,
+77771,
+77771,
+77781,
+77802,
+77802,
+77831,
+77831,
+77845,
+77877,
+77877,
+77895,
+77945,
+77955,
+77955,
+77976,
+77976,
+77997,
+77997,
+78020,
+78020,
 78047,
+78055,
+78055,
+78064,
+78070,
 78076,
 78076,
-78089,
-78102,
+78128,
 78154,
-78154,
-78154,
-78154,
-78160,
-78167,
-78234,
-78234,
-78234,
-78247,
-78247,
-78267,
-78272,
-78278,
-78278,
-78278,
-78278,
-78278,
-78292,
-78314,
-78321,
-78331,
-78331,
-78331,
-78331,
-78331,
-78331,
-78331,
-78331,
-78331,
-78355,
-78378,
-78398,
-78411,
-78417,
-78424,
-78448,
-78448,
-78478,
-78478,
-78478,
-78497,
-78517,
-78517,
-78523,
-78536,
+78198,
+78198,
+78198,
+78215,
+78215,
+78226,
+78241,
+78241,
+78279,
+78294,
+78294,
+78294,
+78294,
+78319,
+78319,
+78335,
+78352,
+78372,
+78372,
+78389,
+78389,
+78405,
+78405,
+78405,
+78419,
+78419,
+78463,
+78463,
+78463,
+78480,
+78493,
+78493,
+78535,
 78552,
-78575,
-78575,
-78575,
-78617,
-78617,
-78617,
-78638,
-78677,
-78717,
-78734,
-78743,
-78743,
-78770,
-78770,
-78770,
-78796,
-78806,
-78856,
-78856,
-78856,
-78869,
-78879,
-78884,
-78906,
-78920,
-78920,
-78953,
-78953,
-78953,
-78975,
-78988,
-79007,
-79019,
-79027,
-79027,
-79027,
-79027,
+78552,
+78587,
+78593,
+78624,
+78624,
+78624,
+78624,
+78660,
+78670,
+78680,
+78693,
+78708,
+78716,
+78750,
+78750,
+78765,
+78778,
+78795,
+78804,
+78817,
+78817,
+78817,
+78840,
+78850,
+78850,
+78861,
+78878,
+78893,
+78893,
+78909,
+78947,
+78985,
+78985,
+78985,
+78999,
+79018,
 79027,
-79038,
-79038,
-79053,
-79053,
+79035,
+79035,
 79053,
-79053,
-79065,
-79065,
-79072,
-79091,
-79091,
-79100,
-79100,
-79100,
-79113,
-79149,
-79159,
-79186,
-79186,
-79210,
-79210,
-79215,
-79226,
-79226,
-79234,
-79249,
-79249,
-79249,
-79267,
-79267,
-79291,
-79321,
-79321,
-79321,
-79321,
-79321,
-79321,
-79343,
-79343,
-79359,
-79378,
-79378,
-79392,
-79392,
-79397,
-79418,
-79434,
-79447,
-79466,
-79499,
-79499,
-79499,
-79499,
-79499,
-79499,
-79517,
-79517,
-79517,
-79517,
-79517,
-79517,
-79517,
-79517,
-79517,
-79526,
-79547,
-79559,
-79568,
-79568,
-79587,
-79587,
-79605,
-79605,
-79618,
-79625,
-79625,
-79625,
-79625,
-79625,
-79645,
-79655,
-79655,
-79655,
-79655,
-79676,
-79682,
-79682,
-79695,
-79695,
-79706,
-79706,
-79706,
-79706,
+79066,
+79066,
+79066,
+79084,
+79084,
+79084,
+79101,
+79101,
+79119,
+79133,
+79140,
+79162,
+79162,
+79162,
+79206,
+79206,
+79216,
+79276,
+79303,
+79303,
+79303,
+79303,
+79303,
+79303,
+79303,
+79315,
+79315,
+79347,
+79356,
+79370,
+79370,
+79370,
+79376,
+79376,
+79376,
+79376,
+79391,
+79391,
+79391,
+79391,
+79403,
+79403,
+79415,
+79455,
+79461,
+79461,
+79474,
+79494,
+79500,
+79500,
+79500,
+79523,
+79535,
+79535,
+79535,
+79558,
+79591,
+79591,
+79591,
+79591,
+79601,
+79601,
+79608,
+79608,
+79621,
+79621,
+79621,
+79621,
+79621,
+79628,
+79634,
+79634,
+79644,
+79662,
+79696,
 79712,
 79712,
-79756,
-79756,
-79788,
-79788,
-79818,
-79818,
-79840,
-79850,
-79850,
-79850,
-79850,
-79856,
-79870,
-79870,
-79881,
-79893,
-79948,
-79956,
-79956,
-79990,
-80006,
-80017,
-80033,
-80033,
-80039,
-80047,
-80047,
-80069,
-80069,
-80069,
-80124,
-80124,
-80143,
-80143,
-80150,
-80161,
-80179,
-80179,
-80210,
-80210,
-80217,
-80217,
-80234,
-80234,
-80240,
-80240,
-80254,
-80323,
-80341,
-80341,
-80385,
-80385,
-80411,
-80428,
-80446,
-80446,
-80461,
-80468,
-80478,
-80485,
-80490,
-80517,
-80522,
-80522,
-80522,
-80522,
-80556,
-80556,
-80556,
-80556,
-80564,
-80571,
-80571,
-80571,
-80589,
-80601,
-80612,
-80612,
-80643,
-80643,
-80668,
-80668,
-80681,
-80681,
-80696,
-80701,
-80761,
-80768,
-80785,
-80795,
-80801,
-80801,
-80801,
-80812,
-80844,
-80863,
-80881,
-80887,
-80887,
-80887,
-80887,
-80901,
-80921,
-80930,
-80930,
-80930,
-80945,
-80962,
-80993,
-80999,
-81017,
+79746,
+79772,
+79812,
+79822,
+79822,
+79834,
+79834,
+79834,
+79877,
+79896,
+79896,
+79896,
+79896,
+79896,
+79910,
+79910,
+79910,
+80002,
+80027,
+80042,
+80042,
+80042,
+80042,
+80051,
+80064,
+80073,
+80094,
+80114,
+80114,
+80114,
+80114,
+80114,
+80114,
+80141,
+80181,
+80181,
+80208,
+80218,
+80241,
+80241,
+80241,
+80246,
+80252,
+80294,
+80300,
+80308,
+80308,
+80308,
+80308,
+80308,
+80318,
+80318,
+80318,
+80318,
+80340,
+80340,
+80366,
+80366,
+80366,
+80366,
+80366,
+80366,
+80366,
+80384,
+80403,
+80430,
+80430,
+80430,
+80436,
+80436,
+80436,
+80448,
+80460,
+80460,
+80492,
+80503,
+80503,
+80544,
+80544,
+80555,
+80555,
+80578,
+80578,
+80591,
+80591,
+80591,
+80614,
+80614,
+80625,
+80632,
+80662,
+80662,
+80675,
+80697,
+80721,
+80771,
+80771,
+80776,
+80783,
+80783,
+80783,
+80783,
+80783,
+80814,
+80828,
+80834,
+80842,
+80856,
+80856,
+80904,
+80920,
+80938,
+80958,
+80958,
+80989,
+80996,
+81003,
 81017,
 81017,
-81027,
-81104,
-81104,
-81104,
+81054,
+81061,
+81068,
+81090,
 81104,
 81104,
-81119,
-81173,
-81173,
+81114,
+81127,
+81134,
+81141,
+81148,
+81166,
+81166,
+81179,
 81194,
-81194,
-81194,
-81205,
-81228,
-81238,
-81238,
-81248,
-81263,
-81263,
-81263,
-81271,
-81271,
-81271,
-81285,
-81285,
-81336,
-81336,
-81336,
-81341,
-81341,
-81341,
-81361,
-81373,
-81373,
-81381,
-81381,
+81230,
+81230,
+81265,
+81297,
+81316,
+81323,
+81330,
+81375,
 81387,
-81387,
-81409,
-81409,
-81420,
-81420,
-81437,
-81446,
-81452,
+81422,
+81422,
+81422,
+81422,
 81458,
-81477,
-81483,
-81496,
-81568,
-81584,
-81644,
-81675,
-81693,
-81693,
-81705,
-81705,
-81710,
-81722,
-81722,
-81728,
-81746,
-81758,
-81764,
-81764,
-81777,
-81786,
-81826,
-81826,
-81833,
-81868,
-81889,
-81889,
-81889,
-81909,
-81909,
-81923,
-81933,
-81988,
-82023,
-82023,
-82033,
-82061,
-82114,
-82114,
-82114,
-82114,
-82114,
-82114,
-82133,
-82133,
-82133,
-82169,
-82169,
+81469,
+81488,
+81506,
+81506,
+81540,
+81594,
+81600,
+81626,
+81645,
+81652,
+81652,
+81671,
+81678,
+81695,
+81701,
+81720,
+81726,
+81736,
+81742,
+81742,
+81771,
+81805,
+81829,
+81829,
+81829,
+81829,
+81829,
+81829,
+81829,
+81829,
+81829,
+81843,
+81843,
+81843,
+81861,
+81887,
+81904,
+81904,
+81911,
+81924,
+81924,
+81939,
+81966,
+82029,
+82029,
+82062,
+82089,
+82101,
+82117,
+82161,
+82168,
+82174,
 82187,
-82199,
-82199,
-82199,
-82199,
-82199,
-82246,
-82270,
-82270,
-82284,
-82293,
-82293,
-82303,
-82330,
-82330,
-82330,
-82347,
-82373,
-82383,
-82383,
-82383,
-82383,
-82392,
-82421,
-82428,
-82428,
-82428,
-82428,
-82440,
-82450,
-82450,
-82467,
-82477,
-82477,
-82477,
-82477,
-82477,
-82503,
-82508,
-82545,
-82545,
-82557,
-82557,
-82575,
-82581,
-82581,
-82581,
-82595,
-82595,
-82605,
-82620,
-82620,
-82659,
-82678,
-82678,
-82678,
+82187,
+82203,
+82217,
+82234,
+82259,
+82259,
+82273,
+82273,
+82286,
+82316,
+82316,
+82323,
+82323,
+82349,
+82355,
+82355,
+82381,
+82394,
+82438,
+82448,
+82448,
+82461,
+82489,
+82489,
+82502,
+82502,
+82561,
+82568,
+82601,
+82601,
+82608,
+82608,
+82615,
+82622,
+82672,
+82672,
 82678,
-82701,
-82707,
-82707,
-82707,
-82725,
-82744,
-82760,
-82760,
-82784,
-82784,
-82784,
-82784,
-82784,
-82784,
-82784,
-82800,
-82807,
-82807,
-82842,
-82866,
-82866,
-82893,
-82905,
-82911,
-82911,
-82911,
-82911,
-82945,
-82963,
-82963,
-82963,
-82975,
-82987,
-82996,
-82996,
-83005,
-83005,
-83005,
-83023,
-83023,
-83036,
-83036,
-83036,
-83053,
-83053,
-83053,
-83071,
-83071,
-83071,
-83077,
-83077,
-83086,
-83086,
-83096,
-83096,
-83112,
-83112,
-83112,
-83125,
-83141,
-83161,
+82710,
+82746,
+82752,
+82785,
+82785,
+82816,
+82847,
+82861,
+82861,
+82879,
+82897,
+82914,
+82914,
+82965,
+82965,
+82972,
+82972,
+82979,
+82991,
+82991,
+83029,
+83047,
+83093,
+83093,
+83100,
+83130,
+83137,
+83153,
+83153,
+83153,
 83171,
-83171,
-83182,
-83203,
-83209,
-83209,
-83209,
-83226,
-83237,
-83237,
-83249,
+83178,
+83178,
+83185,
+83212,
+83219,
+83236,
 83276,
-83285,
-83297,
-83314,
-83328,
-83333,
-83342,
-83342,
-83342,
-83361,
-83368,
-83368,
-83378,
+83276,
+83276,
+83276,
+83276,
+83289,
+83335,
+83351,
+83371,
 83378,
-83383,
-83383,
-83393,
-83401,
-83401,
-83407,
-83422,
-83422,
-83440,
-83449,
-83494,
-83494,
-83494,
-83503,
-83503,
-83503,
-83536,
-83536,
-83565,
-83565,
-83565,
-83593,
-83600,
-83618,
-83638,
-83656,
-83677,
-83677,
-83704,
-83740,
-83749,
-83765,
-83765,
-83765,
-83776,
-83800,
-83800,
-83821,
-83821,
-83840,
-83840,
-83876,
-83876,
-83876,
-83876,
-83876,
-83888,
-83888,
-83897,
-83920,
-83929,
-83929,
-83929,
-83929,
-83941,
-83964,
-83964,
-84009,
-84009,
-84037,
-84037,
-84037,
-84050,
-84058,
-84082,
-84082,
-84082,
-84082,
-84082,
-84082,
-84100,
-84107,
-84114,
-84164,
-84198,
-84198,
-84198,
-84210,
-84227,
-84235,
-84235,
-84235,
-84252,
-84252,
-84260,
-84260,
-84260,
-84260,
-84267,
-84306,
+83400,
+83412,
+83468,
+83480,
+83487,
+83501,
+83528,
+83563,
+83579,
+83579,
+83588,
+83588,
+83603,
+83616,
+83616,
+83623,
+83650,
+83657,
+83671,
+83678,
+83678,
+83715,
+83727,
+83767,
+83808,
+83815,
+83828,
+83835,
+83848,
+83848,
+83885,
+83885,
+83902,
+83921,
+83921,
+83921,
+83921,
+83921,
+83934,
+83953,
+83967,
+83982,
+84007,
+84017,
+84027,
+84044,
+84051,
+84079,
+84079,
+84115,
+84115,
+84136,
+84150,
+84194,
+84194,
+84230,
+84230,
+84230,
+84237,
+84244,
+84251,
+84258,
+84258,
+84278,
+84293,
+84293,
+84300,
 84306,
-84306,
-84306,
-84306,
-84317,
-84317,
-84317,
-84317,
-84348,
-84348,
-84348,
-84348,
-84379,
-84425,
-84435,
-84444,
-84460,
+84312,
+84321,
+84321,
+84339,
+84378,
+84378,
+84419,
+84431,
+84431,
+84431,
+84431,
+84431,
+84437,
+84459,
+84469,
 84488,
-84520,
-84555,
-84604,
-84604,
-84604,
-84604,
-84628,
-84628,
-84640,
-84640,
-84640,
-84668,
-84668,
-84668,
-84696,
-84696,
-84716,
-84737,
+84497,
+84497,
+84522,
+84528,
+84528,
+84528,
+84545,
+84573,
+84587,
+84594,
+84607,
+84627,
+84643,
+84643,
+84643,
+84643,
+84648,
+84655,
+84655,
+84662,
+84715,
+84715,
+84715,
+84731,
+84738,
+84763,
 84770,
-84781,
-84781,
-84792,
-84792,
-84792,
-84809,
-84809,
-84825,
-84833,
-84863,
-84863,
-84889,
-84900,
-84955,
-84960,
-84977,
-84977,
-84995,
-85010,
-85037,
-85051,
-85051,
-85061,
-85102,
-85122,
-85122,
-85137,
-85167,
-85179,
-85179,
-85191,
-85191,
-85208,
+84777,
+84795,
+84795,
+84850,
+84857,
+84857,
+84857,
+84873,
+84892,
+84911,
+84911,
+84918,
+84949,
+84958,
+85013,
+85013,
+85046,
+85058,
+85081,
+85108,
+85108,
+85118,
+85139,
+85189,
+85189,
+85198,
+85216,
 85222,
-85280,
-85308,
-85343,
-85349,
-85425,
-85459,
-85474,
-85489,
-85504,
-85513,
-85531,
-85566,
-85582,
-85582,
-85582,
-85594,
-85612,
-85612,
-85625,
-85632,
-85639,
-85639,
-85656,
-85656,
-85656,
-85667,
-85667,
-85667,
-85667,
-85667,
-85683,
-85683,
-85723,
-85743,
-85763,
-85763,
-85763,
-85783,
-85783,
-85798,
-85827,
-85827,
-85859,
-85900,
-85900,
-85910,
-85910,
-85930,
-85930,
+85233,
+85240,
+85240,
+85247,
+85289,
+85324,
+85324,
+85331,
+85340,
+85340,
+85368,
+85374,
+85410,
+85452,
+85468,
+85486,
+85507,
+85550,
+85585,
+85609,
+85609,
+85615,
+85615,
+85637,
+85637,
+85637,
+85646,
+85688,
+85688,
+85727,
+85727,
+85749,
+85790,
+85877,
+85877,
+85877,
+85893,
+85921,
+85943,
+85943,
+85951,
+85951,
+85951,
 85959,
-85969,
-85995,
-85995,
-85995,
-86008,
-86025,
-86025,
-86065,
-86065,
-86115,
-86115,
-86115,
-86115,
-86125,
-86148,
-86181,
-86188,
-86188,
-86198,
-86208,
-86251,
-86251,
-86263,
+85980,
+85991,
+85991,
+85991,
+86002,
+86010,
+86010,
+86017,
+86024,
+86024,
+86024,
+86071,
+86077,
+86077,
+86092,
+86102,
+86102,
+86108,
+86108,
+86120,
+86141,
+86157,
+86157,
+86167,
+86199,
+86199,
+86217,
+86217,
+86254,
+86265,
+86273,
+86280,
 86299,
-86317,
-86317,
-86370,
-86370,
-86384,
-86384,
-86390,
-86390,
-86426,
-86426,
-86457,
-86457,
-86471,
-86471,
-86471,
-86496,
-86522,
-86528,
-86536,
-86542,
-86565,
-86565,
-86571,
-86577,
-86577,
-86600,
-86617,
-86617,
-86617,
-86617,
-86627,
-86627,
-86627,
-86627,
-86636,
-86636,
-86636,
-86636,
-86636,
-86656,
-86688,
-86688,
-86695,
-86695,
-86705,
-86705,
-86740,
-86740,
-86740,
-86758,
-86758,
-86769,
-86776,
-86776,
-86776,
-86824,
-86824,
-86824,
-86844,
-86870,
-86870,
-86870,
-86890,
-86898,
-86910,
-86975,
-86985,
-86991,
-86999,
-87015,
-87042,
-87051,
-87051,
-87051,
-87056,
-87064,
-87117,
-87129,
-87129,
-87141,
-87178,
-87178,
-87207,
-87217,
-87238,
-87244,
-87265,
-87271,
-87271,
-87271,
-87271,
-87300,
-87300,
-87300,
-87321,
-87321,
-87321,
-87341,
-87341,
-87341,
-87341,
-87360,
-87360,
-87379,
-87406,
-87406,
-87416,
-87452,
-87467,
-87467,
+86315,
+86315,
+86331,
+86342,
+86358,
+86373,
+86396,
+86405,
+86432,
+86453,
+86458,
+86488,
+86488,
+86504,
+86511,
+86511,
+86546,
+86569,
+86583,
+86583,
+86583,
+86596,
+86596,
+86612,
+86634,
+86662,
+86671,
+86671,
+86676,
+86707,
+86707,
+86745,
+86745,
+86745,
+86745,
+86789,
+86805,
+86805,
+86805,
+86812,
+86812,
+86812,
+86841,
+86841,
+86841,
+86878,
+86878,
+86878,
+86878,
+86878,
+86886,
+86921,
+86931,
+86931,
+86931,
+86939,
+86946,
+86992,
+86998,
+86998,
+86998,
+87020,
+87020,
+87040,
+87040,
+87040,
+87053,
+87053,
+87068,
+87076,
+87076,
+87076,
+87076,
+87076,
+87093,
+87126,
+87133,
+87133,
+87149,
+87149,
+87156,
+87180,
+87195,
+87215,
+87229,
+87260,
+87312,
+87335,
+87392,
+87414,
+87427,
+87427,
+87441,
+87441,
+87451,
+87451,
+87451,
 87467,
-87480,
-87480,
-87480,
-87493,
-87493,
-87499,
-87499,
-87514,
-87563,
-87573,
-87578,
-87588,
-87588,
-87602,
-87602,
-87602,
-87602,
-87629,
-87651,
-87651,
-87651,
-87651,
-87681,
-87681,
-87699,
-87699,
-87737,
-87742,
-87742,
-87796,
-87796,
-87806,
-87818,
-87834,
-87834,
-87834,
-87854,
-87854,
-87854,
-87854,
-87854,
-87854,
-87873,
-87885,
-87885,
-87891,
-87891,
-87891,
-87891,
-87914,
-87914,
-87914,
-87914,
-87920,
-87936,
-87936,
-87936,
-87954,
-87954,
-87968,
-87990,
-87990,
-88011,
-88011,
-88028,
-88028,
-88044,
-88044,
-88053,
-88077,
-88094,
-88144,
-88144,
-88144,
-88150,
-88180,
-88180,
-88199,
-88212,
-88234,
-88234,
-88254,
-88264,
-88264,
-88274,
-88274,
-88281,
-88281,
-88281,
-88289,
-88289,
-88301,
-88301,
-88301,
-88301,
-88301,
-88322,
-88351,
-88367,
-88382,
-88425,
-88425,
-88445,
-88451,
-88451,
-88471,
+87472,
+87472,
+87488,
+87488,
+87488,
+87508,
+87508,
+87508,
+87508,
+87539,
+87549,
+87566,
+87620,
+87638,
+87648,
+87648,
+87673,
+87708,
+87719,
+87738,
+87738,
+87758,
+87758,
+87767,
+87789,
+87789,
+87789,
+87789,
+87797,
+87807,
+87807,
+87823,
+87823,
+87829,
+87898,
+87912,
+87912,
+87912,
+87912,
+87950,
+87950,
+87957,
+87973,
+87973,
+87973,
+88006,
+88006,
+88006,
+88006,
+88006,
+88006,
+88022,
+88062,
+88093,
+88093,
+88093,
+88103,
+88103,
+88114,
+88122,
+88122,
+88130,
+88182,
+88191,
+88207,
+88207,
+88238,
+88257,
+88257,
+88278,
+88309,
+88325,
+88344,
+88361,
+88361,
+88361,
+88361,
+88361,
+88361,
+88361,
+88375,
+88380,
+88380,
+88380,
+88385,
+88399,
+88418,
+88436,
+88436,
+88446,
+88458,
+88479,
 88489,
-88503,
-88509,
-88534,
-88534,
-88534,
-88551,
-88576,
-88576,
-88576,
-88576,
-88588,
-88588,
-88597,
-88597,
-88627,
-88639,
-88639,
-88645,
-88645,
-88666,
-88697,
+88489,
+88512,
+88520,
+88566,
+88590,
+88595,
+88595,
+88595,
+88626,
+88626,
+88643,
+88643,
+88663,
+88684,
+88684,
+88699,
+88715,
 88724,
 88724,
-88782,
-88782,
-88792,
-88804,
-88821,
-88842,
-88860,
-88860,
-88884,
-88894,
-88894,
-88894,
-88919,
-88919,
-88947,
-88956,
-88956,
-88956,
-88982,
-88982,
-88991,
-88991,
-88991,
-89024,
-89034,
-89034,
-89034,
-89034,
-89034,
-89059,
-89077,
-89077,
-89077,
-89077,
-89091,
-89091,
-89105,
-89120,
-89132,
-89142,
-89151,
-89167,
-89167,
-89183,
-89195,
-89195,
-89195,
-89195,
-89240,
-89251,
-89265,
-89265,
-89265,
-89265,
-89275,
-89303,
-89315,
-89315,
-89332,
-89345,
-89378,
-89378,
-89378,
-89378,
-89378,
-89378,
-89402,
-89402,
-89402,
-89402,
-89402,
-89423,
-89443,
-89453,
-89453,
-89489,
-89519,
-89535,
-89535,
-89540,
-89540,
-89565,
-89571,
-89571,
-89595,
-89595,
-89595,
+88740,
+88740,
+88748,
+88748,
+88805,
+88805,
+88815,
+88815,
+88825,
+88835,
+88835,
+88856,
+88856,
+88866,
+88898,
+88967,
+88976,
+89007,
+89035,
+89043,
+89055,
+89063,
+89095,
+89103,
+89129,
+89165,
+89165,
+89179,
+89218,
+89239,
+89337,
+89337,
+89342,
+89342,
+89384,
+89384,
+89395,
+89408,
+89418,
+89439,
+89439,
+89458,
+89458,
+89546,
+89575,
 89595,
 89602,
-89613,
-89613,
-89645,
-89661,
-89661,
-89661,
-89680,
-89680,
-89696,
-89742,
-89742,
-89742,
-89742,
-89742,
-89742,
-89742,
-89742,
-89753,
-89767,
-89767,
-89767,
-89776,
-89776,
-89776,
-89776,
-89795,
-89804,
-89826,
-89826,
-89847,
-89847,
-89879,
+89621,
+89621,
+89639,
+89681,
+89705,
+89715,
+89739,
+89749,
+89749,
+89802,
+89809,
+89837,
+89845,
+89853,
+89853,
+89873,
+89873,
+89873,
 89879,
-89890,
-89930,
-89930,
-89930,
-89930,
-89954,
-89954,
-89954,
-89954,
-90005,
-90016,
-90016,
-90063,
-90063,
-90098,
-90118,
-90136,
-90173,
-90173,
-90173,
-90189,
-90189,
-90228,
-90228,
-90228,
-90228,
-90247,
-90275,
-90314,
-90321,
-90336,
-90352,
-90352,
-90352,
-90352,
-90352,
-90358,
-90394,
-90394,
-90394,
+89935,
+89942,
+89942,
+90006,
+90032,
+90032,
+90041,
+90041,
+90041,
+90089,
+90089,
+90094,
+90102,
+90102,
+90110,
+90144,
+90152,
+90160,
+90172,
+90191,
+90200,
+90200,
+90221,
+90231,
+90287,
+90287,
+90309,
+90328,
+90328,
+90346,
+90346,
+90353,
+90375,
 90404,
-90404,
-90411,
-90427,
-90427,
-90427,
-90427,
-90427,
-90473,
-90473,
-90473,
-90473,
-90491,
-90491,
-90508,
-90508,
-90508,
-90522,
-90530,
-90536,
-90569,
-90569,
-90588,
-90600,
-90600,
-90613,
-90640,
-90640,
-90660,
-90681,
-90681,
-90681,
-90707,
-90731,
-90731,
-90731,
-90731,
-90747,
-90747,
-90747,
-90773,
-90779,
-90796,
-90796,
-90796,
-90796,
-90796,
-90796,
-90812,
-90812,
-90812,
-90833,
-90863,
-90876,
-90876,
-90885,
-90898,
-90921,
-90946,
-90946,
-90951,
-90951,
-90994,
-91012,
-91030,
-91030,
-91043,
-91053,
-91060,
-91060,
-91079,
-91105,
-91105,
-91105,
-91105,
-91120,
-91120,
-91126,
-91160,
-91179,
-91191,
-91207,
-91207,
-91207,
-91213,
-91213,
-91213,
-91224,
-91224,
-91243,
-91274,
-91282,
-91282,
-91303,
-91303,
-91337,
-91352,
-91366,
-91378,
-91392,
-91411,
-91411,
-91421,
-91431,
-91431,
-91439,
-91449,
-91458,
-91475,
-91480,
-91511,
-91511,
-91511,
-91521,
-91542,
-91542,
-91549,
-91564,
-91582,
-91582,
-91593,
-91603,
-91657,
-91668,
-91668,
-91692,
-91699,
-91706,
-91719,
-91719,
-91733,
-91758,
-91758,
-91763,
-91763,
-91763,
-91809,
-91809,
-91838,
-91838,
-91872,
-91899,
-91899,
-91899,
-91918,
-91956,
-91956,
-91966,
-91966,
-91977,
-91977,
-91990,
+90441,
+90452,
+90549,
+90568,
+90638,
+90659,
+90696,
+90696,
+90696,
+90696,
+90706,
+90732,
+90834,
+90848,
+90857,
+90878,
+90878,
+90903,
+90914,
+90924,
+90978,
+90985,
+91009,
+91042,
+91042,
+91070,
+91087,
+91087,
+91107,
+91107,
+91139,
+91153,
+91180,
+91180,
+91230,
+91230,
+91244,
+91252,
+91262,
+91270,
+91278,
+91278,
+91278,
+91291,
+91304,
+91320,
+91370,
+91381,
+91394,
+91394,
+91428,
+91453,
+91470,
+91477,
+91477,
+91477,
+91485,
+91505,
+91505,
+91505,
+91523,
+91523,
+91523,
+91571,
+91571,
+91607,
+91615,
+91643,
+91643,
+91643,
+91660,
+91660,
+91674,
+91688,
+91703,
+91703,
+91739,
+91767,
+91767,
+91799,
+91818,
+91829,
+91829,
+91829,
+91837,
+91843,
+91843,
+91868,
+91868,
+91868,
+91868,
+91868,
+91888,
+91888,
+91888,
+91888,
+91919,
+91954,
+91954,
+91954,
+91970,
+91979,
+91984,
+91984,
+92001,
+92001,
 92026,
 92026,
-92042,
-92042,
-92042,
-92042,
-92042,
-92042,
-92042,
-92054,
+92038,
+92055,
+92055,
 92072,
-92081,
-92081,
-92081,
-92112,
-92150,
-92150,
-92150,
-92168,
-92168,
-92176,
-92176,
-92193,
-92206,
-92231,
-92231,
-92247,
-92269,
-92292,
-92292,
-92292,
-92300,
-92319,
-92348,
-92348,
-92348,
-92361,
-92374,
-92388,
-92415,
-92415,
-92415,
-92425,
-92435,
-92453,
-92453,
-92469,
-92485,
-92485,
-92509,
-92520,
-92520,
-92538,
-92548,
-92560,
-92560,
+92077,
+92083,
+92091,
+92140,
+92140,
+92181,
+92188,
+92208,
+92279,
+92284,
+92294,
+92294,
+92327,
+92327,
+92337,
+92392,
+92392,
+92419,
+92427,
+92455,
+92461,
+92461,
+92461,
+92479,
+92505,
+92505,
+92531,
+92531,
 92560,
-92578,
-92578,
-92613,
-92623,
-92623,
-92632,
-92660,
-92719,
-92719,
-92733,
-92764,
-92764,
-92764,
-92764,
-92773,
-92773,
-92773,
-92783,
-92799,
-92813,
-92813,
-92821,
-92821,
-92845,
-92845,
-92845,
+92577,
+92577,
+92586,
+92595,
+92595,
+92622,
+92653,
+92665,
+92685,
+92696,
+92696,
+92738,
+92738,
+92758,
+92807,
+92818,
+92836,
+92836,
+92836,
+92844,
+92844,
+92856,
+92856,
 92856,
-92884,
-92892,
-92901,
-92913,
-92920,
-92920,
-92927,
-92937,
-92937,
-92949,
-92959,
-92959,
-92975,
-92975,
-92975,
-92987,
-92998,
-93015,
-93033,
-93045,
-93074,
-93086,
-93092,
-93116,
-93116,
-93131,
-93152,
-93152,
-93176,
-93176,
-93176,
-93176,
-93200,
-93212,
-93212,
-93212,
-93229,
-93238,
-93244,
-93256,
-93280,
-93280,
-93288,
-93288,
-93288,
-93304,
-93325,
-93337,
-93373,
-93389,
-93408,
-93408,
-93432,
-93432,
-93439,
-93459,
-93465,
-93479,
-93479,
-93496,
-93528,
-93528,
-93528,
-93550,
-93566,
-93577,
-93591,
-93601,
-93601,
+92862,
+92862,
+92880,
+92880,
+92929,
+92968,
+92991,
+92991,
+92991,
+92991,
+93005,
+93005,
+93005,
+93023,
+93030,
+93066,
+93096,
+93096,
+93096,
+93115,
+93145,
+93159,
+93187,
+93211,
+93226,
+93251,
+93251,
+93251,
+93251,
+93260,
+93267,
+93282,
+93282,
+93282,
+93282,
+93345,
+93350,
+93350,
+93364,
+93372,
+93393,
+93393,
+93406,
+93425,
+93425,
+93425,
+93431,
+93442,
+93468,
+93468,
+93468,
+93530,
+93530,
+93530,
+93560,
+93570,
+93579,
+93600,
+93616,
+93616,
+93616,
 93638,
-93645,
-93657,
-93657,
-93657,
-93675,
-93683,
+93646,
+93646,
+93646,
+93653,
+93653,
+93661,
+93661,
+93691,
 93714,
-93730,
-93730,
-93755,
-93776,
-93785,
-93806,
-93832,
-93860,
-93860,
-93893,
-93909,
-93937,
-93937,
-93937,
-93948,
-93948,
-93948,
-93964,
-93964,
-93964,
-93964,
+93714,
+93714,
+93714,
+93714,
+93751,
+93799,
+93826,
+93826,
+93826,
+93826,
+93826,
+93849,
+93855,
+93861,
+93894,
+93929,
+93935,
+93935,
+93935,
+93947,
+93947,
+93947,
+93960,
 93979,
-94000,
-94000,
-94000,
-94000,
-94000,
-94043,
-94082,
+93985,
+94004,
+94023,
+94055,
+94072,
 94092,
 94092,
-94112,
-94112,
-94146,
-94146,
-94151,
-94205,
-94226,
-94251,
-94260,
-94260,
-94277,
-94277,
-94283,
-94293,
-94321,
-94330,
-94330,
-94350,
-94350,
-94373,
-94373,
-94373,
-94373,
-94373,
-94390,
-94390,
-94407,
-94407,
-94425,
-94435,
-94435,
-94452,
-94459,
-94492,
-94521,
-94574,
-94589,
-94595,
-94595,
-94595,
-94613,
-94634,
-94634,
-94634,
-94634,
-94634,
-94634,
-94641,
-94641,
-94653,
-94670,
-94678,
-94678,
-94699,
-94699,
-94699,
-94721,
-94721,
-94735,
-94746,
-94746,
-94746,
-94746,
-94758,
-94758,
-94768,
-94768,
-94768,
-94787,
-94787,
-94796,
-94796,
-94826,
-94848,
-94867,
-94867,
-94867,
-94867,
-94867,
-94875,
-94875,
-94875,
-94907,
-94958,
-94964,
-94974,
-94994,
-95022,
-95022,
+94102,
+94113,
+94122,
+94122,
+94148,
+94156,
+94171,
+94236,
+94236,
+94236,
+94257,
+94257,
+94310,
+94317,
+94322,
+94322,
+94322,
+94329,
+94337,
+94360,
+94360,
+94383,
+94395,
+94445,
+94465,
+94465,
+94465,
+94465,
+94483,
+94502,
+94531,
+94593,
+94593,
+94599,
+94618,
+94624,
+94654,
+94665,
+94686,
+94712,
+94712,
+94743,
+94766,
+94766,
+94774,
+94774,
+94801,
+94828,
+94828,
+94845,
+94845,
+94845,
+94880,
+94894,
+94894,
+94901,
+94901,
+94917,
+94924,
+94989,
+94989,
+94989,
+94989,
+95014,
 95038,
-95094,
-95111,
-95129,
-95129,
-95159,
-95159,
-95179,
-95191,
-95209,
-95219,
-95235,
-95246,
-95274,
-95274,
-95274,
-95274,
-95293,
-95293,
-95306,
-95321,
-95321,
-95326,
-95340,
-95340,
-95360,
-95360,
-95360,
-95366,
-95380,
-95380,
-95380,
-95380,
-95390,
-95390,
-95390,
-95401,
-95422,
-95422,
-95436,
-95450,
-95464,
-95487,
-95506,
-95506,
-95523,
-95539,
-95561,
-95568,
-95599,
-95599,
-95609,
-95609,
-95630,
-95644,
-95644,
-95673,
-95703,
-95703,
-95713,
-95727,
-95767,
-95767,
-95767,
-95845,
-95845,
-95873,
-95873,
-95873,
-95873,
-95889,
-95907,
-95907,
-95907,
-95907,
-95914,
-95914,
-95914,
-95914,
-95948,
-95948,
-95963,
-95969,
-95991,
-96008,
-96041,
+95038,
+95068,
+95076,
+95097,
+95153,
+95165,
+95215,
+95221,
+95250,
+95281,
+95281,
+95337,
+95352,
+95373,
+95385,
+95385,
+95402,
+95402,
+95402,
+95402,
+95425,
+95446,
+95452,
+95478,
+95486,
+95486,
+95486,
+95486,
+95492,
+95508,
+95528,
+95528,
+95555,
+95566,
+95566,
+95566,
+95575,
+95591,
+95665,
+95665,
+95677,
+95685,
+95704,
+95704,
+95704,
+95710,
+95710,
+95725,
+95725,
+95725,
+95765,
+95765,
+95785,
+95815,
+95828,
+95828,
+95877,
+95902,
+95919,
+95919,
+95953,
+95953,
+96013,
+96013,
 96041,
-96056,
-96085,
-96092,
-96092,
-96092,
-96132,
-96152,
-96152,
-96171,
-96171,
-96195,
-96212,
-96251,
-96261,
-96285,
-96328,
-96335,
-96335,
-96335,
-96344,
-96344,
-96344,
-96358,
-96358,
-96366,
-96378,
-96396,
-96412,
-96412,
-96412,
-96419,
-96434,
-96434,
-96449,
-96449,
-96449,
-96449,
-96466,
-96466,
-96466,
-96466,
-96474,
-96501,
-96572,
-96572,
-96582,
+96053,
+96053,
+96093,
+96093,
+96106,
+96106,
+96112,
+96218,
+96234,
+96255,
+96255,
+96255,
+96255,
+96310,
+96331,
+96331,
+96331,
+96371,
+96387,
+96404,
+96421,
+96440,
+96440,
+96445,
+96461,
+96492,
+96492,
+96504,
+96504,
+96504,
+96521,
+96553,
+96576,
+96576,
+96583,
+96583,
+96583,
+96599,
+96619,
 96619,
-96639,
-96650,
-96650,
-96650,
-96650,
-96673,
-96682,
-96689,
-96717,
-96717,
-96735,
-96763,
-96792,
-96792,
-96830,
-96867,
-96882,
+96637,
+96646,
+96646,
+96696,
+96719,
+96719,
+96719,
+96727,
+96727,
+96727,
+96757,
+96757,
+96779,
+96779,
+96779,
+96796,
+96816,
+96822,
+96822,
+96822,
+96822,
+96828,
+96859,
+96859,
+96859,
 96920,
-96925,
-96925,
-96940,
-96940,
-96940,
-96968,
-97014,
-97014,
-97014,
-97038,
-97061,
-97078,
-97078,
-97083,
-97093,
-97093,
-97109,
-97118,
-97126,
-97136,
-97147,
-97147,
-97147,
-97164,
-97164,
-97194,
-97194,
-97227,
-97254,
-97261,
-97261,
-97269,
-97278,
-97299,
-97336,
-97336,
-97351,
-97351,
-97366,
-97389,
-97389,
-97389,
-97389,
-97389,
-97438,
-97502,
-97518,
-97525,
-97525,
-97525,
-97525,
-97539,
-97569,
-97583,
-97583,
-97594,
-97594,
-97594,
-97626,
-97626,
-97626,
-97637,
-97649,
-97649,
-97649,
-97659,
-97659,
-97673,
-97684,
-97691,
-97711,
-97711,
-97711,
-97711,
-97722,
-97736,
-97752,
-97761,
-97761,
-97767,
-97796,
-97819,
-97819,
-97819,
-97850,
-97860,
-97871,
-97871,
-97880,
-97880,
-97885,
-97936,
-97936,
-97936,
-97936,
-97936,
-97936,
-97936,
-97936,
-97960,
-97960,
-97979,
-97979,
-97979,
-97979,
-97979,
-97979,
-97979,
-97979,
+96927,
+96941,
+96952,
+96952,
+96999,
+97024,
+97036,
+97036,
+97049,
+97049,
+97049,
+97049,
+97065,
+97100,
+97108,
+97108,
+97108,
+97108,
+97121,
+97157,
+97207,
+97242,
+97242,
+97248,
+97248,
+97328,
+97337,
+97337,
+97348,
+97386,
+97409,
+97421,
+97441,
+97465,
+97465,
+97465,
+97465,
+97512,
+97529,
+97529,
+97529,
+97529,
+97529,
+97563,
+97581,
+97600,
+97621,
+97621,
+97621,
+97631,
+97631,
+97631,
+97652,
+97660,
+97660,
+97660,
+97666,
+97677,
+97677,
+97677,
+97677,
+97689,
+97723,
+97734,
+97744,
+97750,
+97769,
+97784,
+97828,
+97867,
+97887,
+97901,
+97901,
+97919,
+97950,
+97956,
+97976,
+97976,
+97998,
+97998,
 98005,
-98016,
-98016,
-98016,
-98026,
-98037,
-98054,
-98054,
-98054,
-98066,
-98066,
-98126,
-98126,
-98135,
-98135,
-98145,
-98175,
-98209,
-98209,
-98219,
-98230,
-98230,
-98251,
-98263,
-98263,
-98263,
+98033,
+98033,
+98039,
+98039,
+98093,
+98093,
+98093,
+98127,
+98167,
+98167,
+98181,
+98181,
+98181,
+98217,
+98224,
+98249,
+98249,
 98283,
-98296,
-98296,
-98306,
-98306,
-98306,
-98322,
-98322,
-98332,
-98346,
-98346,
-98346,
-98346,
-98358,
-98358,
-98373,
-98373,
-98373,
-98373,
-98373,
-98373,
-98373,
-98373,
-98373,
-98429,
-98429,
-98429,
-98429,
-98429,
-98440,
-98440,
-98453,
-98460,
-98460,
-98467,
-98472,
-98472,
-98472,
+98319,
+98343,
+98404,
+98414,
+98432,
+98452,
+98461,
+98477,
+98477,
 98488,
 98488,
-98535,
-98535,
-98541,
-98541,
-98541,
-98557,
-98575,
-98585,
-98585,
-98597,
-98597,
-98597,
-98654,
-98690,
-98704,
-98704,
-98717,
-98752,
-98752,
-98752,
-98773,
-98773,
-98773,
-98773,
-98773,
-98781,
-98781,
-98791,
-98791,
-98796,
-98810,
-98814,
-98814,
-98830,
-98830,
-98836,
-98867,
-98867,
-98867,
-98867,
-98867,
-98910,
-98927,
-98933,
-98996,
-98996,
-99002,
-99023,
-99033,
-99052,
-99069,
-99075,
-99105,
-99119,
-99137,
-99137,
-99137,
-99151,
-99157,
-99168,
-99198,
-99219,
-99257,
-99257,
-99257,
-99268,
-99289,
-99325,
-99325,
-99331,
-99331,
-99331,
-99352,
-99358,
-99358,
-99358,
-99385,
-99400,
-99417,
-99417,
-99434,
-99434,
-99452,
-99452,
-99459,
-99459,
-99484,
-99490,
-99504,
-99515,
-99537,
-99551,
-99574,
-99599,
-99628,
-99634,
-99650,
-99667,
-99667,
-99667,
-99667,
-99678,
-99697,
-99715,
+98525,
+98536,
+98558,
+98603,
+98603,
+98615,
+98647,
+98663,
+98663,
+98681,
+98697,
+98697,
+98707,
+98707,
+98707,
+98714,
+98714,
+98718,
+98759,
+98759,
+98779,
+98779,
+98779,
+98787,
+98808,
+98815,
+98815,
+98837,
+98837,
+98851,
+98851,
+98851,
+98909,
+98923,
+98938,
+98951,
+98984,
+99030,
+99050,
+99050,
+99056,
+99060,
+99060,
+99074,
+99112,
+99112,
+99133,
+99133,
+99145,
+99145,
+99163,
+99163,
+99181,
+99181,
+99204,
+99204,
+99217,
+99217,
+99223,
+99230,
+99241,
+99303,
+99323,
+99398,
+99424,
+99424,
+99424,
+99424,
+99431,
+99442,
+99480,
+99543,
+99543,
+99550,
+99564,
+99581,
+99651,
+99658,
+99665,
+99665,
+99679,
 99723,
 99730,
-99749,
-99756,
-99762,
-99811,
-99842,
-99856,
-99869,
-99881,
-99928,
-99928,
-99928,
-99935,
-99958,
-99964,
-100005,
-100005,
-100009,
-100030,
-100074,
-100091,
-100091,
-100091,
-100100,
-100105,
-100126,
-100142,
-100142,
-100142,
-100206,
-100206,
-100228,
-100228,
-100228,
-100228,
-100242,
-100258,
-100279,
+99739,
+99739,
+99754,
+99767,
+99793,
+99837,
+99850,
+99857,
+99864,
+99902,
+99915,
+99939,
+99939,
+99957,
+100043,
+100050,
+100050,
+100057,
+100064,
+100071,
+100078,
+100078,
+100139,
+100139,
+100147,
+100166,
+100191,
+100225,
+100236,
+100260,
 100286,
-100304,
-100312,
-100312,
-100322,
-100329,
-100354,
-100354,
-100354,
-100361,
-100361,
-100388,
-100388,
-100418,
-100439,
-100439,
-100467,
-100486,
-100523,
-100523,
-100551,
-100551,
-100585,
-100607,
-100607,
-100624,
-100642,
-100648,
-100661,
-100661,
-100741,
-100747,
-100759,
-100778,
-100790,
-100790,
-100804,
-100813,
-100826,
-100833,
-100843,
-100854,
-100854,
-100863,
-100881,
-100897,
-100897,
-100918,
-100918,
-100925,
-100944,
-100944,
-100951,
-100961,
-100961,
-100993,
-101011,
-101011,
-101019,
-101019,
-101019,
-101030,
-101030,
-101046,
-101052,
-101062,
-101070,
-101086,
-101093,
-101119,
-101119,
-101119,
-101129,
-101147,
-101147,
-101147,
-101170,
+100311,
+100319,
+100319,
+100326,
+100363,
+100382,
+100403,
+100403,
+100403,
+100410,
+100420,
+100451,
+100462,
+100518,
+100524,
+100560,
+100583,
+100583,
+100601,
+100610,
+100610,
+100610,
+100610,
+100610,
+100623,
+100623,
+100650,
+100650,
+100650,
+100650,
+100650,
+100696,
+100703,
+100703,
+100710,
+100717,
+100734,
+100837,
+100846,
+100846,
+100853,
+100853,
+100876,
+100917,
+100917,
+100924,
+100931,
+100938,
+100952,
+100971,
+100971,
+100977,
+101000,
+101000,
+101000,
+101000,
+101015,
+101015,
+101015,
+101032,
+101048,
+101067,
+101073,
+101080,
+101098,
+101115,
+101138,
+101138,
+101150,
+101150,
+101150,
+101150,
 101170,
-101195,
-101206,
-101223,
-101223,
-101238,
-101267,
-101285,
-101285,
-101295,
-101295,
-101295,
-101295,
-101295,
-101313,
-101313,
-101331,
-101337,
-101409,
-101409,
-101428,
+101178,
+101197,
+101204,
+101228,
+101277,
+101305,
+101372,
+101386,
+101405,
+101412,
+101420,
+101427,
+101427,
 101434,
-101448,
-101454,
-101460,
-101501,
-101507,
-101507,
-101513,
-101541,
+101471,
+101478,
+101514,
+101525,
+101557,
 101561,
-101575,
-101592,
-101592,
-101611,
-101611,
-101626,
-101639,
-101669,
-101683,
-101688,
-101695,
-101701,
-101724,
-101742,
-101753,
-101757,
-101799,
-101820,
-101833,
-101833,
-101839,
-101879,
-101893,
-101900,
-101908,
-101924,
-101924,
-101924,
-101924,
-101947,
-101947,
-101969,
-102037,
-102047,
-102071,
-102087,
-102109,
-102153,
-102165,
-102165,
-102171,
-102197,
-102206,
-102221,
-102221,
-102221,
-102227,
-102227,
-102232,
-102242,
-102242,
-102259,
-102259,
-102274,
-102278,
-102278,
-102317,
-102381,
-102381,
-102381,
-102381,
-102400,
-102400,
+101588,
+101630,
+101641,
+101657,
+101672,
+101715,
+101722,
+101722,
+101729,
+101740,
+101746,
+101779,
+101779,
+101779,
+101803,
+101803,
+101821,
+101831,
+101838,
+101859,
+101869,
+101877,
+101919,
+101926,
+101957,
+101981,
+101996,
+102003,
+102010,
+102018,
+102040,
+102062,
+102069,
+102069,
+102069,
+102094,
+102101,
+102140,
+102150,
+102150,
+102155,
+102163,
+102191,
+102228,
+102243,
+102250,
+102282,
+102289,
+102296,
+102296,
+102334,
+102334,
+102384,
 102400,
-102406,
-102443,
-102443,
-102443,
-102449,
-102465,
-102483,
-102515,
-102521,
-102521,
-102537,
+102408,
+102433,
+102448,
+102448,
+102462,
+102511,
+102518,
 102545,
-102545,
-102564,
-102573,
-102578,
-102599,
-102603,
-102603,
-102632,
-102632,
-102658,
-102719,
-102719,
-102730,
-102754,
-102754,
-102777,
-102777,
-102812,
-102825,
-102825,
-102825,
-102835,
-102841,
-102841,
-102853,
-102859,
-102859,
-102869,
-102875,
-102875,
-102891,
-102897,
-102924,
-102924,
-102924,
-102943,
-102943,
-102943,
-102943,
-102966,
-102972,
-102993,
-102999,
-103026,
-103026,
-103043,
-103049,
-103077,
-103115,
-103122,
-103152,
-103158,
-103169,
-103201,
-103220,
-103220,
-103241,
-103277,
-103298,
-103298,
-103316,
+102566,
+102579,
+102598,
+102617,
+102675,
+102682,
+102688,
+102712,
+102721,
+102721,
+102721,
+102745,
+102745,
+102752,
+102752,
+102774,
+102808,
+102828,
+102828,
+102844,
+102892,
+102892,
+102912,
+102928,
+102953,
+102973,
+103000,
+103000,
+103012,
+103021,
+103021,
+103031,
+103031,
+103031,
+103031,
+103056,
+103063,
+103063,
+103079,
+103086,
+103086,
+103097,
+103142,
+103142,
+103154,
+103179,
+103205,
+103228,
+103238,
+103238,
+103238,
+103264,
+103288,
+103288,
+103306,
+103306,
+103306,
+103306,
+103315,
+103339,
 103339,
 103339,
-103360,
-103366,
-103366,
-103468,
-103484,
-103492,
-103499,
-103499,
-103515,
-103540,
-103547,
-103551,
-103551,
-103563,
-103581,
-103587,
-103606,
-103631,
-103631,
-103643,
-103662,
-103662,
-103683,
+103362,
+103372,
+103428,
+103438,
+103461,
+103471,
+103471,
+103471,
+103480,
+103480,
+103524,
+103524,
+103524,
+103524,
+103568,
+103610,
+103634,
+103651,
+103680,
+103680,
 103694,
-103709,
-103709,
-103735,
-103735,
-103739,
-103765,
-103765,
-103799,
-103799,
-103808,
-103816,
-103816,
-103853,
-103853,
-103853,
-103901,
-103922,
-103929,
-103981,
-103981,
-104040,
-104040,
-104059,
-104059,
-104077,
-104093,
-104141,
-104147,
-104155,
-104176,
-104193,
-104202,
-104202,
-104202,
-104202,
-104248,
-104259,
-104265,
-104265,
-104275,
+103701,
+103701,
+103701,
+103775,
+103782,
+103801,
+103826,
+103850,
+103850,
+103886,
+103886,
+103909,
+103918,
+103926,
+103926,
+103931,
+103982,
+103993,
+104000,
+104044,
+104051,
+104095,
+104102,
+104109,
+104127,
+104134,
+104162,
+104162,
+104183,
+104261,
+104261,
+104268,
 104275,
-104275,
-104286,
-104286,
-104286,
-104286,
-104325,
-104339,
-104347,
-104367,
-104383,
-104383,
-104383,
-104383,
-104390,
-104395,
-104402,
-104420,
-104429,
-104442,
-104442,
-104449,
-104456,
-104472,
-104472,
-104472,
-104480,
-104491,
-104491,
-104491,
-104491,
-104491,
-104516,
-104516,
-104516,
-104559,
-104569,
-104569,
-104576,
-104595,
-104602,
-104602,
-104602,
-104652,
-104666,
-104687,
-104687,
-104703,
-104703,
-104703,
-104725,
-104725,
-104725,
-104732,
-104732,
-104739,
-104739,
-104739,
-104750,
-104760,
-104760,
-104773,
-104773,
-104782,
-104802,
-104817,
-104835,
-104835,
-104835,
-104851,
-104868,
-104872,
-104872,
-104872,
-104900,
-104908,
-104912,
-104912,
-104946,
-104946,
-104957,
-104963,
-104963,
-104963,
-104978,
-104999,
-105006,
-105024,
-105057,
-105057,
-105076,
-105076,
-105076,
-105076,
-105122,
-105150,
-105150,
-105189,
-105216,
-105228,
-105232,
-105243,
-105243,
-105243,
-105260,
-105269,
-105273,
-105296,
-105300,
-105321,
-105334,
-105343,
-105361,
-105361,
-105361,
-105367,
-105410,
-105429,
-105453,
+104280,
+104297,
+104304,
+104337,
+104351,
+104363,
+104363,
+104373,
+104441,
+104453,
+104460,
+104493,
+104617,
+104617,
+104653,
+104653,
+104715,
+104715,
+104715,
+104752,
+104784,
+104798,
+104798,
+104798,
+104814,
+104814,
+104814,
+104814,
+104833,
+104833,
+104859,
+104859,
+104859,
+104859,
+104907,
+104926,
+104933,
+104943,
+104943,
+104943,
+104986,
+105042,
+105049,
+105068,
+105095,
+105095,
+105103,
+105120,
+105120,
+105129,
+105136,
+105136,
+105140,
+105140,
+105140,
+105158,
+105162,
+105162,
+105162,
+105162,
+105169,
+105169,
+105175,
+105193,
+105193,
+105193,
+105193,
+105206,
+105206,
+105215,
+105215,
+105215,
+105268,
+105279,
+105311,
+105324,
+105333,
+105333,
+105355,
+105375,
+105401,
+105413,
+105413,
+105436,
+105443,
+105447,
+105447,
+105447,
+105447,
+105462,
+105473,
+105473,
+105473,
+105473,
 105480,
-105487,
-105487,
-105531,
-105551,
-105567,
-105593,
-105599,
-105599,
-105606,
-105606,
-105606,
-105616,
-105626,
-105644,
-105705,
+105501,
+105501,
+105524,
+105529,
+105548,
+105558,
+105558,
+105580,
+105592,
+105592,
+105592,
+105592,
+105613,
+105623,
+105672,
+105686,
+105696,
 105712,
-105728,
-105728,
-105735,
-105735,
-105757,
-105757,
-105777,
-105777,
-105790,
-105804,
-105804,
+105720,
+105749,
+105774,
+105774,
+105800,
 105811,
 105811,
-105818,
-105818,
-105841,
-105841,
-105848,
-105856,
-105866,
-105866,
-105891,
-105903,
-105911,
-105925,
-105925,
-105938,
-105938,
-105971,
-105992,
-106002,
-106006,
-106031,
-106044,
-106044,
-106091,
-106095,
-106095,
-106095,
-106103,
-106103,
-106121,
-106129,
-106129,
-106129,
-106157,
-106157,
-106157,
-106177,
-106197,
-106205,
-106205,
-106220,
-106220,
-106220,
-106242,
-106242,
-106258,
-106295,
-106295,
-106355,
-106362,
-106362,
-106362,
-106381,
-106381,
-106399,
-106417,
-106424,
-106465,
-106472,
-106472,
-106491,
-106505,
-106570,
-106594,
-106601,
-106615,
-106615,
-106615,
-106615,
-106615,
-106615,
-106645,
-106645,
-106653,
-106660,
-106660,
-106676,
-106676,
-106676,
-106690,
-106696,
-106706,
-106712,
-106727,
-106744,
-106744,
-106783,
-106783,
-106783,
-106793,
-106793,
-106793,
-106797,
-106810,
-106848,
-106855,
-106881,
-106881,
-106906,
-106913,
-106937,
-106951,
-106961,
-106961,
-106961,
-107022,
-107029,
-107029,
-107039,
-107039,
-107046,
-107056,
+105816,
+105849,
+105857,
+105857,
+105868,
+105894,
+105931,
+105966,
+106016,
+106016,
+106016,
+106022,
+106029,
+106041,
+106062,
+106109,
+106120,
+106133,
+106149,
+106170,
+106211,
+106211,
+106239,
+106239,
+106239,
+106273,
+106280,
+106280,
+106291,
+106298,
+106298,
+106310,
+106324,
+106371,
+106371,
+106398,
+106409,
+106426,
+106477,
+106477,
+106477,
+106477,
+106477,
+106477,
+106498,
+106498,
+106511,
+106511,
+106516,
+106548,
+106558,
+106558,
+106558,
+106558,
+106590,
+106609,
+106658,
+106658,
+106683,
+106725,
+106732,
+106736,
+106736,
+106736,
+106736,
+106736,
+106746,
+106746,
+106755,
+106766,
+106809,
+106809,
+106821,
+106821,
+106821,
+106821,
+106821,
+106841,
+106841,
+106841,
+106877,
+106877,
+106877,
+106915,
+106939,
+106939,
+106955,
+106955,
+106955,
+106981,
+106991,
+106991,
+107025,
+107049,
+107049,
+107049,
+107049,
+107049,
+107049,
+107065,
 107065,
-107086,
-107105,
-107119,
-107119,
-107119,
-107140,
-107140,
-107140,
-107155,
-107162,
-107162,
-107192,
-107201,
-107201,
-107201,
-107219,
-107219,
-107260,
-107260,
-107302,
-107327,
-107327,
-107332,
-107332,
-107345,
-107345,
-107355,
-107355,
-107355,
-107382,
-107382,
-107382,
-107382,
-107397,
-107397,
-107403,
-107417,
-107417,
-107432,
-107450,
-107464,
-107464,
-107471,
-107471,
-107471,
-107471,
-107521,
-107549,
-107559,
+107065,
+107072,
+107081,
+107103,
+107103,
+107103,
+107103,
+107103,
+107120,
+107120,
+107120,
+107120,
+107131,
+107166,
+107179,
+107190,
+107190,
+107199,
+107199,
+107207,
+107220,
+107234,
+107244,
+107249,
+107249,
+107249,
+107249,
+107262,
+107286,
+107300,
+107300,
+107300,
+107300,
+107310,
+107338,
+107348,
+107358,
+107408,
+107408,
+107451,
+107513,
+107555,
 107566,
-107584,
-107592,
-107604,
-107604,
-107613,
-107613,
-107626,
-107661,
-107669,
-107676,
-107676,
-107696,
-107696,
+107566,
+107566,
+107566,
+107582,
+107597,
+107597,
+107597,
+107597,
+107597,
+107628,
+107638,
+107646,
+107660,
+107673,
+107673,
+107685,
+107685,
+107685,
+107691,
+107691,
 107696,
-107700,
-107714,
-107736,
-107754,
-107758,
-107758,
-107758,
-107778,
-107786,
-107786,
-107792,
-107815,
-107833,
-107852,
-107852,
-107862,
-107862,
+107728,
+107728,
+107728,
+107728,
+107728,
+107797,
+107806,
+107806,
+107806,
+107822,
+107838,
+107838,
 107862,
-107862,
-107883,
-107892,
-107924,
-107935,
-107966,
-107966,
-107989,
-108030,
-108079,
-108090,
-108118,
-108125,
+107889,
+107889,
+107905,
+107914,
+107927,
+107934,
+107934,
+107947,
+107947,
+107947,
+107947,
+107947,
+107956,
+107956,
+107961,
+107971,
+107978,
+107978,
+107995,
+107995,
+108006,
+108024,
+108060,
+108069,
+108069,
+108069,
+108069,
+108082,
+108091,
 108125,
 108125,
-108125,
-108125,
-108135,
-108140,
-108158,
-108158,
-108158,
-108192,
-108201,
-108212,
-108250,
-108262,
-108262,
-108289,
-108299,
-108299,
-108305,
-108305,
-108322,
-108322,
-108350,
-108354,
-108354,
-108354,
-108354,
-108373,
-108385,
-108392,
-108399,
-108399,
-108399,
-108418,
-108418,
-108418,
-108418,
-108433,
-108449,
-108462,
-108468,
-108477,
-108513,
-108531,
-108547,
+108157,
+108219,
+108232,
+108242,
+108248,
+108260,
+108278,
+108290,
+108302,
+108306,
+108323,
+108323,
+108323,
+108332,
+108332,
+108332,
+108374,
+108421,
+108451,
+108451,
+108473,
+108473,
+108516,
+108534,
+108534,
+108534,
+108550,
+108550,
+108567,
+108567,
+108574,
 108574,
 108574,
-108614,
-108631,
-108631,
-108631,
-108631,
-108631,
-108646,
-108675,
-108679,
-108679,
-108689
+108574,
+108579,
+108579,
+108596,
+108596,
+108596,
+108596,
+108596,
+108596,
+108611,
+108611,
+108618,
+108618,
+108618,
+108632,
+108683,
+108687,
+108707,
+108717,
+108717,
+108730,
+108750,
+108750,
+108750,
+108764,
+108785,
+108789,
+108831,
+108846,
+108881,
+108881,
+108906,
+108906,
+108906,
+108906,
+108926,
+108926,
+108926,
+108972,
+108972,
+108972,
+108986,
+108986,
+108986,
+109077,
+109102,
+109131,
+109216,
+109216,
+109236,
+109297,
+109297,
+109319,
+109319,
+109319,
+109319,
+109319,
+109330,
+109351,
+109351,
+109377,
+109377,
+109377,
+109395,
+109395,
+109418,
+109418,
+109418,
+109418,
+109441,
+109441,
+109441,
+109451,
+109470,
+109470,
+109470,
+109470,
+109474,
+109474,
+109509,
+109509,
+109509,
+109509,
+109588,
+109597,
+109625,
+109625,
+109639,
+109655,
+109655,
+109664,
+109680,
+109680,
+109728,
+109760,
+109760,
+109772,
+109772,
+109772,
+109798,
+109810,
+109817,
+109825,
+109825,
+109825,
+109842,
+109859,
+109859,
+109864,
+109908,
+109908,
+109923,
+109934,
+109934,
+109934,
+109963,
+109963,
+109977,
+110007,
+110007,
+110026,
+110026,
+110076,
+110094,
+110094,
+110104,
+110104,
+110115,
+110115,
+110122,
+110147,
+110147,
+110160,
+110187,
+110187,
+110187,
+110187,
+110199,
+110199,
+110220,
+110229,
+110241,
+110301,
+110322,
+110326,
+110326,
+110336,
+110341,
+110341,
+110341,
+110360,
+110360,
+110360,
+110360,
+110360,
+110365,
+110391,
+110441,
+110441,
+110463,
+110475,
+110475,
+110475,
+110488,
+110498,
+110504,
+110504,
+110539,
+110565,
+110565,
+110581,
+110588,
+110588,
+110595,
+110595,
+110602,
+110645,
+110661,
+110690,
+110711,
+110711,
+110711,
+110711,
+110726,
+110726,
+110738,
+110738,
+110746,
+110754,
+110796,
+110817,
+110843,
+110892,
+110892,
+110900,
+110921,
+110921,
+110939,
+110949,
+110955,
+110955,
+110981,
+111018,
+111034,
+111034,
+111048,
+111057,
+111057,
+111057,
+111086,
+111092,
+111112,
+111112,
+111112,
+111128,
+111144,
+111153,
+111170,
+111203,
+111232,
+111232,
+111272,
+111276,
+111290,
+111300,
+111338,
+111345,
+111354,
+111367,
+111367,
+111399,
+111407,
+111447,
+111480,
+111487,
+111501,
+111594,
+111630,
+111636,
+111657,
+111657,
+111681,
+111691,
+111691,
+111691,
+111705,
+111733,
+111733,
+111733,
+111756,
+111765,
+111765,
+111819,
+111855,
+111855,
+111868,
+111874,
+111874,
+111914,
+111914,
+111914,
+111934,
+111967,
+111993,
+112002,
+112031,
+112031,
+112068,
+112075,
+112082,
+112082,
+112137,
+112137,
+112156,
+112186,
+112186,
+112186,
+112186,
+112213,
+112231,
+112231,
+112231,
+112239,
+112268,
+112268,
+112279,
+112298,
+112298,
+112309,
+112321,
+112336,
+112336,
+112336,
+112346,
+112350,
+112361,
+112361,
+112361,
+112369,
+112377,
+112377,
+112418,
+112418,
+112418,
+112468,
+112468,
+112468,
+112488,
+112488,
+112502,
+112509,
+112526,
+112554,
+112554,
+112554,
+112592,
+112596,
+112613,
+112627,
+112696,
+112781,
+112804,
+112873,
+112913,
+112913,
+112920,
+112931,
+112931,
+112947,
+112976,
+112991,
+112997,
+112997,
+113022,
+113073,
+113103,
+113114,
+113123,
+113123,
+113130,
+113153,
+113221,
+113221,
+113255,
+113271,
+113290,
+113290,
+113290,
+113290,
+113309,
+113368,
+113368,
+113368,
+113411,
+113423,
+113445,
+113445,
+113445,
+113553,
+113564,
+113576,
+113598,
+113650,
+113677,
+113677,
+113677,
+113677,
+113687,
+113693,
+113693,
+113698,
+113698,
+113698,
+113711,
+113728,
+113743,
+113753,
+113753,
+113753,
+113753,
+113753,
+113753,
+113764,
+113779,
+113786,
+113786,
+113792,
+113798,
+113798,
+113798,
+113798,
+113798,
+113804,
+113819,
+113819,
+113819,
+113819,
+113843,
+113843,
+113843,
+113894,
+113919,
+113928,
+113940,
+113959,
+113959,
+113977,
+113977,
+113983,
+113983,
+114005,
+114005,
+114005,
+114021,
+114035,
+114077,
+114093,
+114093,
+114131,
+114131,
+114131,
+114131,
+114137,
+114169,
+114182,
+114182,
+114196,
+114196,
+114196,
+114215,
+114230,
+114243,
+114250,
+114250,
+114269,
+114269,
+114331,
+114331,
+114331,
+114331,
+114331,
+114331,
+114331,
+114331,
+114331,
+114343,
+114358,
+114358,
+114364,
+114392,
+114417,
+114433,
+114439,
+114446,
+114454,
+114472,
+114484,
+114490,
+114553,
+114560,
+114604,
+114604,
+114613,
+114613,
+114623,
+114623,
+114623,
+114623,
+114635,
+114660,
+114660,
+114660,
+114718,
+114724,
+114724,
+114743,
+114756,
+114776,
+114790,
+114790,
+114790,
+114810,
+114897,
+114897,
+114906,
+114906,
+114917,
+114923,
+114923,
+114953,
+114962,
+114999,
+114999,
+114999,
+114999,
+115005,
+115012,
+115012,
+115030,
+115030,
+115040,
+115060,
+115104,
+115112,
+115136,
+115171,
+115171,
+115191,
+115209,
+115227,
+115262,
+115276,
+115284,
+115284,
+115319,
+115319,
+115338,
+115388,
+115388,
+115388,
+115388,
+115403,
+115415,
+115415,
+115415,
+115432,
+115485,
+115502,
+115502,
+115502,
+115502,
+115502,
+115502,
+115502,
+115502,
+115502,
+115519,
+115528,
+115528,
+115534,
+115565,
+115586,
+115664,
+115685,
+115685,
+115748,
+115748,
+115763,
+115768,
+115768,
+115768,
+115825,
+115839,
+115839,
+115848,
+115854,
+115869,
+115869,
+115892,
+115900,
+115900,
+115900,
+115908,
+115942,
+115950,
+115950,
+115976,
+115982,
+115999,
+116021,
+116021,
+116021,
+116041,
+116041,
+116041,
+116060,
+116088,
+116088,
+116088,
+116088,
+116104,
+116143,
+116143,
+116143,
+116143,
+116165,
+116169,
+116183,
+116183,
+116194,
+116194,
+116219,
+116219,
+116244,
+116254,
+116254,
+116254,
+116254,
+116275,
+116292,
+116292,
+116299,
+116350,
+116395,
+116395,
+116422,
+116422,
+116442,
+116450,
+116467,
+116476,
+116482,
+116492,
+116492,
+116492,
+116512,
+116512,
+116566,
+116594,
+116604,
+116640,
+116665,
+116712,
+116712,
+116720,
+116733,
+116733,
+116733,
+116749,
+116749,
+116761,
+116782,
+116802,
+116802,
+116802,
+116802,
+116825,
+116831,
+116841,
+116879,
+116879,
+116885,
+116885,
+116885,
+116901,
+116901,
+116901,
+116907,
+116923,
+116933,
+116942,
+116968,
+116968,
+117006,
+117006,
+117006,
+117006,
+117006,
+117027,
+117048,
+117064,
+117093,
+117167,
+117167,
+117175,
+117193,
+117202,
+117213,
+117213,
+117252,
+117294,
+117294,
+117307,
+117307,
+117325,
+117341,
+117351,
+117358,
+117358,
+117366,
+117366,
+117378,
+117378,
+117378,
+117390,
+117426,
+117477,
+117485,
+117526,
+117547,
+117556,
+117556,
+117565,
+117565,
+117607,
+117631,
+117631,
+117631,
+117631,
+117649,
+117682,
+117682,
+117682,
+117682,
+117692,
+117711,
+117711,
+117741,
+117746,
+117778,
+117778,
+117791,
+117791,
+117791,
+117791,
+117809,
+117819,
+117819,
+117819,
+117844,
+117949,
+117974,
+118018,
+118057,
+118057,
+118065,
+118065,
+118065,
+118075,
+118087,
+118092,
+118092,
+118098,
+118115,
+118121,
+118144,
+118168,
+118180,
+118180,
+118221,
+118271,
+118309,
+118322,
+118322,
+118322,
+118328,
+118328,
+118347,
+118347,
+118378,
+118388,
+118392,
+118404,
+118404,
+118425,
+118425,
+118425,
+118435,
+118485,
+118514,
+118524,
+118535,
+118549,
+118549,
+118549,
+118562,
+118562,
+118599,
+118599,
+118606,
+118606,
+118610,
+118610,
+118610,
+118652,
+118656,
+118665,
+118684,
+118736,
+118746,
+118746,
+118746,
+118752,
+118752,
+118756,
+118792,
+118792,
+118796,
+118833,
+118856,
+118918,
+118952,
+118952,
+118977,
+118994,
+119012,
+119012,
+119037,
+119037,
+119037,
+119049,
+119049,
+119086,
+119086,
+119086,
+119091,
+119091,
+119102,
+119126,
+119126,
+119126,
+119133,
+119133,
+119148,
+119161,
+119200,
+119200,
+119200,
+119200,
+119200,
+119221,
+119268,
+119268,
+119268,
+119282,
+119314,
+119320,
+119351,
+119368,
+119368,
+119381,
+119381,
+119462,
+119462,
+119462,
+119512,
+119512,
+119516,
+119516,
+119516,
+119516,
+119516,
+119526,
+119544,
+119544,
+119544,
+119615,
+119615,
+119629,
+119666,
+119678,
+119687,
+119720,
+119720,
+119737,
+119737,
+119747,
+119755,
+119755,
+119755,
+119787,
+119787,
+119787,
+119812,
+119844,
+119855,
+119855,
+119855,
+119862,
+119862,
+119862,
+119862,
+119862,
+119885,
+119920,
+119920,
+119929,
+119929,
+119973,
+119995,
+120013,
+120013,
+120019,
+120019,
+120036,
+120036,
+120036,
+120056,
+120077,
+120077,
+120105,
+120105,
+120105,
+120119,
+120119,
+120172,
+120176,
+120188,
+120194,
+120201,
+120201,
+120212,
+120229,
+120229,
+120229,
+120250,
+120264,
+120264,
+120302,
+120302,
+120337,
+120337,
+120337,
+120345,
+120357,
+120357,
+120357,
+120373,
+120373,
+120373,
+120373,
+120406,
+120421,
+120421,
+120421,
+120421,
+120431,
+120450,
+120459,
+120475,
+120475,
+120475,
+120529,
+120548,
+120560,
+120569,
+120595,
+120595,
+120607,
+120607,
+120611,
+120633,
+120633,
+120692,
+120692,
+120702,
+120702,
+120702,
+120742,
+120749,
+120758,
+120778,
+120827,
+120827,
+120863,
+120863,
+120871,
+120890,
+120936,
+120936,
+120965,
+120978,
+121038,
+121038,
+121038,
+121038,
+121042,
+121042,
+121042,
+121042,
+121050,
+121057,
+121064,
+121064,
+121076,
+121126,
+121126,
+121126,
+121157,
+121157,
+121162,
+121162,
+121162,
+121170,
+121170,
+121198,
+121217,
+121217,
+121217,
+121231,
+121241,
+121260,
+121260,
+121284,
+121289,
+121289,
+121289,
+121289,
+121348,
+121352,
+121361,
+121368,
+121378,
+121382,
+121427,
+121495,
+121508,
+121517,
+121534,
+121550,
+121550,
+121550,
+121550,
+121557,
+121566,
+121634,
+121634,
+121634,
+121642,
+121642,
+121650,
+121667,
+121700,
+121706,
+121706,
+121742,
+121742,
+121756,
+121774,
+121805,
+121815,
+121815,
+121815,
+121815,
+121829,
+121885,
+121885,
+121885,
+121929,
+121929,
+121939,
+121949,
+121961,
+122011,
+122011,
+122011,
+122015,
+122037,
+122053,
+122089,
+122089,
+122102,
+122125,
+122144,
+122178,
+122219,
+122253,
+122288,
+122288,
+122315,
+122315,
+122315,
+122325,
+122339,
+122393,
+122420,
+122427,
+122437,
+122447,
+122468,
+122468,
+122505,
+122505,
+122505,
+122523,
+122523,
+122523,
+122523,
+122523,
+122523,
+122545,
+122563,
+122563,
+122583,
+122583,
+122608,
+122608,
+122608,
+122608,
+122608,
+122615,
+122632,
+122632,
+122632,
+122642,
+122652,
+122652,
+122652,
+122670,
+122706,
+122722,
+122742,
+122761,
+122795,
+122795,
+122810,
+122815,
+122846,
+122906,
+122906,
+122918,
+122931,
+122931,
+122937,
+122956,
+122989,
+122989,
+123038,
+123038,
+123064,
+123101,
+123140,
+123150,
+123150,
+123150,
+123175,
+123224,
+123224,
+123224,
+123251,
+123251,
+123251,
+123301,
+123301,
+123312,
+123312,
+123348,
+123348,
+123372,
+123372,
+123372,
+123372,
+123390,
+123390,
+123445,
+123445,
+123452,
+123458,
+123458,
+123490,
+123490,
+123490,
+123490,
+123490,
+123505,
+123505,
+123512,
+123544,
+123554,
+123575,
+123596,
+123629,
+123629,
+123656,
+123756,
+123760,
+123760,
+123760,
+123820,
+123820,
+123829,
+123843,
+123843,
+123843,
+123853,
+123873,
+123885,
+123885,
+123902,
+123902,
+123902,
+123902,
+123930,
+123930,
+123950,
+123950,
+123980,
+123980,
+124002,
+124024,
+124043,
+124112,
+124112,
+124128,
+124139,
+124163,
+124174,
+124209,
+124209,
+124209,
+124258,
+124285,
+124290,
+124290,
+124290,
+124297,
+124309,
+124309,
+124355,
+124371,
+124371,
+124379,
+124379,
+124379,
+124426,
+124426,
+124438,
+124479,
+124504,
+124521,
+124521,
+124546,
+124546,
+124556,
+124589,
+124589,
+124589,
+124589,
+124631,
+124642,
+124664,
+124664,
+124664,
+124664,
+124664,
+124678,
+124702,
+124702,
+124702,
+124748,
+124753,
+124773,
+124773,
+124785,
+124785,
+124785,
+124817,
+124841,
+124841,
+124855,
+124855,
+124895,
+124895,
+124895,
+124895,
+124910,
+124920,
+124920,
+124920,
+124945,
+124991,
+125024,
+125033,
+125033,
+125049,
+125064,
+125087,
+125087,
+125087,
+125109,
+125120,
+125128,
+125138,
+125138,
+125148,
+125160,
+125171,
+125171,
+125181,
+125181,
+125181,
+125191,
+125197,
+125217,
+125217,
+125227,
+125227,
+125242,
+125250,
+125262,
+125312,
+125346,
+125373,
+125381,
+125396,
+125413,
+125418,
+125418,
+125426,
+125426,
+125468,
+125468,
+125468,
+125484,
+125484,
+125484,
+125484,
+125506,
+125510,
+125510,
+125510,
+125530,
+125530,
+125545,
+125545,
+125545,
+125545,
+125555,
+125569,
+125594,
+125594,
+125603,
+125603,
+125645,
+125674,
+125719,
+125731,
+125750,
+125779,
+125779,
+125789,
+125832,
+125842,
+125842,
+125842,
+125842,
+125855,
+125855,
+125855,
+125855,
+125855,
+125873,
+125873,
+125940,
+125957,
+125978,
+125978,
+125978,
+125978,
+126000,
+126009,
+126009,
+126028,
+126028,
+126036,
+126057,
+126078,
+126097,
+126111,
+126128,
+126128,
+126134,
+126134,
+126153,
+126166,
+126166,
+126173,
+126195,
+126216,
+126216,
+126216,
+126216,
+126286,
+126286,
+126292,
+126292,
+126292,
+126316,
+126316,
+126326,
+126326,
+126366,
+126387,
+126387,
+126451,
+126460,
+126460,
+126460,
+126460,
+126467,
+126503,
+126529,
+126529,
+126551,
+126567,
+126567,
+126567,
+126597,
+126597,
+126597,
+126602,
+126621,
+126628,
+126628,
+126639,
+126675,
+126686,
+126686,
+126686,
+126695,
+126751,
+126762,
+126762,
+126806,
+126857,
+126874,
+126886,
+126948,
+126948,
+126948,
+126956,
+126956,
+126984,
+126984,
+127001,
+127015,
+127027,
+127046,
+127046
 };
 
 static const char *tldData[] = {
-"\xe5\xbe\xb3\xe5\xb3\xb6.jp\0channel\0"
-"asso.dz\0port.fr\0"
-"blog.vu\0"
-"ulsan.kr\0"
-"kuroiso.tochigi.jp\0simplesite.gr\0"
-"servemp3.com\0"
-"*.bzz.dapps.earth\0"
-"lohmus.me\0"
-"barsyonline.co.uk\0"
-"kanmaki.nara.jp\0cloudns.in\0"
-"\xe7\x9f\xb3\xe5\xb7\x9d.jp\0kitaura.miyazaki.jp\0dev\0\xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xa0\xe0\xa4\xa8\0"
-"crafting.xyz\0"
-"est-a-la-maison.com\0"
-"medicina.bo\0"
-"alessandria.it\0"
-"sevastopol.ua\0lug.org.uk\0"
-"imabari.ehime.jp\0nagawa.nagano.jp\0"
-"v\xc3\xa5ler.\xc3\xb8stfold.no\0fujitsu\0"
-"noshiro.akita.jp\0deal\0"
-"\xd1\x81\xd0\xb0\xd0\xb9\xd1\x82\0eu.ax\0"
-"\xd0\xb1\xd0\xb3\0"
-"odo.br\0tachiarai.fukuoka.jp\0"
-"meland.no\0"
-"cloudns.cc\0"
-"kariya.aichi.jp\0miyada.nagano.jp\0ichikai.tochigi.jp\0"
-"w.bg\0k12.wy.us\0lib.vi.us\0"
-"yakumo.hokkaido.jp\0taiki.mie.jp\0"
-"versus.jp\0pub.instances.scw.cloud\0"
-"hamar.no\0"
-"pol.tr\0"
-"palmas.br\0"
-"cc.ny.us\0"
-"rieti.it\0"
-"b\xc3\xa1jddar.no\0vladimir.su\0"
-"sekigahara.gifu.jp\0dhl\0"
-"careers\0"
-"atsuma.hokkaido.jp\0malbork.pl\0sncf\0"
-"!www.ck\0"
-"toyotomi.hokkaido.jp\0"
-"aetna\0"
-"kasuya.fukuoka.jp\0"
-"il.eu.org\0"
-"\xd9\x82\xd8\xb7\xd8\xb1\0"
-"bifuka.hokkaido.jp\0oguni.kumamoto.jp\0flap.id\0"
-"mus.mi.us\0is-a-player.com\0"
-"ama.aichi.jp\0matsushige.tokushima.jp\0"
-"\xd8\xaa\xd9\x88\xd9\x86\xd8\xb3\0shiftcrypto.io\0small-web.org\0"
-"select\0"
-"c.bg\0gjovik.no\0homegoods\0office\0"
-"ju.mp\0"
-"bjarkoy.no\0sochi.su\0"
-"ozora.hokkaido.jp\0yabu.hyogo.jp\0yandex\0"
-"vana\0"
-"diy\0"
-"seihi.nagasaki.jp\0mormon\0"
-"cc.ne.us\0"
-"pya.jp\0"
-"krodsherad.no\0"
-"ce.leg.br\0"
-"bio.br\0toyota.aichi.jp\0kushiro.hokkaido.jp\0"
-"maceio.br\0"
-"hu.eu.org\0ie.eu.org\0"
-"kiyosato.hokkaido.jp\0agro.pl\0"
-"backdrop.jp\0"
-"grp.lk\0storage\0"
-"moonscale.net\0"
-"shw.io\0"
-"karasjohka.no\0vladimir.ru\0outsystemscloud.com\0"
-"homelinux.net\0flier.jp\0"
-"yawatahama.ehime.jp\0wiw.gov.pl\0"
-"monza-brianza.it\0"
-"weibo\0"
-"inf.br\0genoa.it\0""123siteweb.fr\0"
-"engineering\0"
-"tj.cn\0nanmoku.gunma.jp\0band\0"
-"cc.ma.us\0"
-"\xd0\xb5\xd1\x8e\0"
-"dyn-ip24.de\0"
-"bank\0"
-"odawara.kanagawa.jp\0"
-"yamaguchi.jp\0"
-"inf.cu\0"
-"miyota.nagano.jp\0"
-"lcube-server.de\0"
-"col.ng\0"
-"amami.kagoshima.jp\0"
-"washtenaw.mi.us\0ashgabad.su\0"
-"airtraffic.aero\0"
-"tokyo\0"
-"imb.br\0"
-"simplesite.pl\0"
-"sakuragawa.ibaraki.jp\0"
-"\xe5\x95\x86\xe5\xba\x97\0"
-"kaisei.kanagawa.jp\0"
-"vr.it\0flickr\0"
-"fe.it\0dnp\0"
-"hm.no\0circle\0dog\0"
-"toya.hokkaido.jp\0kamikawa.hyogo.jp\0szkola.pl\0virgin\0"
-"brussels\0"
-"arab\0"
-"pramerica\0"
-"pupu.jp\0"
-"s3-ca-central-1.amazonaws.com\0"
-"padua.it\0"
-"lighting\0"
-"mashike.hokkaido.jp\0taketa.oita.jp\0"
-"utsira.no\0novecore.site\0"
-"gyokuto.kumamoto.jp\0dot\0"
-"ky.us\0vps.mcdir.ru\0"
-"leadpages.co\0"
-"oshino.yamanashi.jp\0edgekey-staging.net\0"
-"kisarazu.chiba.jp\0ngrok.dev\0"
-"kochi.jp\0tokamachi.niigata.jp\0"
-"arezzo.it\0"
-"fido\0"
-"tabuse.yamaguchi.jp\0pisz.pl\0zachpomor.pl\0"
-"gose.nara.jp\0lapy.pl\0"
-"adv.br\0"
-"satosho.okayama.jp\0"
-"flakstad.no\0brasilia.me\0"
-"kadoma.osaka.jp\0"
-"blog.kg\0"
-"dell\0"
-"gs.fm.no\0asso.re\0"
-"eat\0*.banzai.cloud\0"
-"is-a-lawyer.com\0"
-"shikama.miyagi.jp\0is-a-chef.net\0"
-"cloudns.us\0"
-"schmidt\0"
-"orkdal.no\0webview-assets.cloud9.eu-north-1.amazonaws.com\0"
-"kunisaki.oita.jp\0"
-"hoyanger.no\0"
-"reserve-online.com\0hotelwithflight.com\0"
-"shiga.jp\0fuchu.hiroshima.jp\0"
-"broadway\0cya.gg\0"
-"tagawa.fukuoka.jp\0"
-"ato.br\0umi.fukuoka.jp\0katsushika.tokyo.jp\0"
-"ujiie.tochigi.jp\0"
-"c.la\0is-with-theband.com\0"
-"is-a-techie.com\0"
-"poa.br\0"
-"eco\0kaluga.su\0kapsi.fi\0"
-"kosei.shiga.jp\0parasite.jp\0"
-"gs.vf.no\0demo.datacenter.fi\0"
-"hiphop\0"
-"ogawara.miyagi.jp\0rulez.jp\0"
-"sakae.nagano.jp\0myamaze.net\0"
-"bukhara.su\0*.dweb.link\0"
-"swatch\0"
-"k12.pa.us\0"
-"*.moonscale.io\0"
-"ltda\0noticeable.news\0eu.pythonanywhere.com\0"
-"matsuda.kanagawa.jp\0leczna.pl\0"
-"syno-ds.de\0"
-"hara.nagano.jp\0"
-"gr.eu.org\0"
-"minamioguni.kumamoto.jp\0"
-"edu\0"
-"bi.it\0dtv\0"
-"construction\0mytabit.co.il\0"
-"\xd7\xa6\xd7\x94\xd7\x9c.\xd7\x99\xd7\xa9\xd7\xa8\xd7\x90\xd7\x9c\0"
-"e12.ve\0s3-website.us-east-2.amazonaws.com\0"
-"vapor.cloud\0"
-"mitane.akita.jp\0"
-"asso.nc\0"
-"gs.tr.no\0royken.no\0mysecuritycamera.org\0"
-"beep.pl\0"
-"\xe7\xa6\x8f\xe5\xb2\xa1.jp\0"
-"nf.ca\0gives\0"
-"mishima.shizuoka.jp\0"
-"inf.mk\0lib.me.us\0"
-"friuli-vegiulia.it\0"
-"assabu.hokkaido.jp\0"
-"dvr\0"
-"bestbuy\0miniserver.com\0"
-"\xd1\x80\xd1\x84\0"
-"*.cns.joyent.com\0"
-"mjondalen.no\0"
-"gujo.gifu.jp\0kaizuka.osaka.jp\0for-better.biz\0"
-"bookonline.app\0"
-"porsangu.no\0"
-"barsy.menu\0"
-"saijo.ehime.jp\0"
-"mb.ca\0wv.us\0pantheonsite.io\0"
-"w.se\0wpenginepowered.com\0"
-"lib.ky.us\0desi\0softbank\0rag-cloud-ch.hosteur.com\0"
-"film\0ssl.origin.cdn77-secure.org\0"
-"tabayama.yamanashi.jp\0"
-"co.events\0"
-"barefoot\0"
-"pn.it\0muroto.kochi.jp\0narusawa.yamanashi.jp\0"
-"cloudsite.builders\0"
-"nakatane.kagoshima.jp\0"
-"beiarn.no\0dyndns-wiki.com\0id.firewalledreplit.co\0"
-"shirakawa.gifu.jp\0ichikawamisato.yamanashi.jp\0"
-"sf.no\0"
-"city.hu\0cloud66.zone\0"
-"locker\0"
-"snaase.no\0sondre-land.no\0is-an-actress.com\0"
-"hostyhosting.io\0"
-"gniezno.pl\0"
-"rennebu.no\0"
-"c.se\0"
-"social\0"
-"bamble.no\0"
-"kutchan.hokkaido.jp\0\xe1\x83\x92\xe1\x83\x94\0"
-"asso.km\0cc.de.us\0"
-"oarai.ibaraki.jp\0"
-"amli.no\0"
-"aktyubinsk.su\0"
-"global.ssl.fastly.net\0custom.metacentrum.cz\0"
-"shoo.okayama.jp\0"
-"stavern.no\0rentals\0"
-"zapto.xyz\0"
-"vaapste.no\0"
-"adv.mz\0"
-"asso.mc\0army\0"
-"lib.ia.us\0jprs\0ngrok.io\0"
-"dental\0"
-"sokndal.no\0in-vpn.org\0"
-"hasama.oita.jp\0"
-"filegear-jp.me\0familyds.com\0"
-"de.cool\0"
-"cc.ca.us\0cloudns.pw\0"
-"stryn.no\0"
-"nagaoka.niigata.jp\0\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa7\xb0\xe0\xa6\xa4\0"
-"us.eu.org\0"
-"inf.ua\0"
-"zgorzelec.pl\0"
-"arpa\0fire\0pymnt.uk\0git-pages.rit.edu\0"
-"sohu\0"
-"wiih.gov.pl\0go.leg.br\0"
-"tjeldsund.no\0framer.website\0"
-"capetown\0"
-"s3-website.ca-central-1.amazonaws.com\0"
-"h\xc3\xa6gebostad.no\0"
-"instantcloud.cn\0"
-"lib.gu.us\0firewall-gateway.de\0"
-"jaworzno.pl\0"
-"friulivenezia-giulia.it\0"
-"trade\0*.vps.myjino.ru\0"
-"fish\0"
-"notaires.km\0"
-"mb.it\0shingo.aomori.jp\0"
-"rv.ua\0stuff-4-sale.org\0"
-"sasebo.nagasaki.jp\0"
-"jaguar\0"
-"b\xc3\xa1l\xc3\xa1t.no\0"
-"suzu.ishikawa.jp\0ogimi.okinawa.jp\0"
-"hammerfest.no\0"
-"kagamino.okayama.jp\0quangnam.vn\0"
-"alpha.bounty-full.com\0"
-"itayanagi.aomori.jp\0onga.fukuoka.jp\0sobetsu.hokkaido.jp\0tatsuno.hyogo.jp\0"
-"ariake.saga.jp\0sejny.pl\0"
-"onavstack.net\0"
-"s3-website-us-west-2.amazonaws.com\0"
-"muika.niigata.jp\0"
-"ise.mie.jp\0gangwon.kr\0"
-"hichiso.gifu.jp\0"
-"bradesco\0"
-"minamiboso.chiba.jp\0"
-"africa.bj\0"
-"fot.br\0katsuyama.fukui.jp\0"
-"equipment\0fan\0cloud.jelastic.open.tim.it\0"
-"krager\xc3\xb8.no\0"
-"hb.cn\0"
-"carraramassa.it\0otake.hiroshima.jp\0"
-"\xe7\x82\xb9\xe7\x9c\x8b\0"
-"lucca.it\0higashimatsushima.miyagi.jp\0koeln\0dscloud.biz\0"
-"aerobatic.aero\0"
-"asda\0"
-"from-or.com\0"
-"rifu.miyagi.jp\0"
-"arte\0"
-"halfmoon.jp\0"
-"ryukyu\0"
-"iz.hr\0"
-"tienda\0"
-"konan.aichi.jp\0"
-"ouda.nara.jp\0cricket\0"
-"uchinomi.kagawa.jp\0heteml.net\0jeez.jp\0"
-"tsuchiura.ibaraki.jp\0"
-"vall\xc3\xa9""e-aoste.it\0"
-"hvaler.no\0"
-"idf.il\0"
-"song\0\xd9\x87\xd9\x85\xd8\xb1\xd8\xa7\xd9\x87\0"
-"cc.or.us\0esq\0"
-"toyoake.aichi.jp\0"
-"myds.me\0"
-"the.br\0"
-"xen.prgmr.com\0"
-"matsuno.ehime.jp\0nakagawa.fukuoka.jp\0"
-"bbva\0ngrok.pizza\0"
-"\xd8\xa7\xd9\x84\xd9\x8a\xd9\x85\xd9\x86\0walmart\0"
-"myjino.ru\0"
-"kamogawa.chiba.jp\0shobara.hiroshima.jp\0\xd8\xb9\xd8\xb1\xd8\xa7\xd9\x82\0"
-"reise\0sony\0"
-"fireweb.app\0"
-"eniwa.hokkaido.jp\0"
-"deloitte\0"
-"l.bg\0"
-"yono.saitama.jp\0"
-"reklam.hu\0k\xc3\xa1r\xc3\xa1\xc5\xa1johka.no\0cloudns.pro\0"
-"spjelkavik.no\0\xe9\x9b\xbb\xe8\xa8\x8a\xe7\x9b\x88\xe7\xa7\x91\0"
-"br.com\0"
-"eus\0"
-"yugawa.fukushima.jp\0minokamo.gifu.jp\0"
-"katagami.akita.jp\0mombetsu.hokkaido.jp\0"
-"oster\xc3\xb8y.no\0webcam\0mayfirst.org\0*.azurecontainer.io\0"
-"kanazawa.ishikawa.jp\0"
-"sakura.chiba.jp\0iida.nagano.jp\0"
-"snillfjord.no\0"
-"laspezia.it\0ninhthuan.vn\0"
-"lelux.site\0"
-"fuossko.no\0guide\0"
-"meet\0"
-"pilot.aero\0trading.aero\0vevelstad.no\0"
-"kagoshima.kagoshima.jp\0yoshinogari.saga.jp\0"
-"its.me\0"
-"asia\0is-a-democrat.com\0"
-"val-d-aosta.it\0atami.shizuoka.jp\0"
-"balsfjord.no\0k12.ut.us\0"
-"przeworsk.pl\0"
-"framer.wiki\0"
-"homelinux.org\0"
-"amusement.aero\0badaddja.no\0"
-"fujikawa.yamanashi.jp\0"
-"arkhangelsk.su\0"
-"toyako.hokkaido.jp\0"
-"egersund.no\0reg.dk\0"
-"gr.it\0landrover\0"
-"cleaning\0"
-"skoczow.pl\0"
-"deals\0mortgage\0"
-"itakura.gunma.jp\0republican\0"
-"\xe6\x9d\xb1\xe4\xba\xac.jp\0izumozaki.niigata.jp\0"
-"mycd.eu\0"
-"gr.jp\0"
-"nakamura.kochi.jp\0"
-"odesa.ua\0"
-"shinjo.okayama.jp\0"
-"oamishirasato.chiba.jp\0"
-"naruto.tokushima.jp\0"
-"andasuolo.no\0k12.tx.us\0"
-"ogawa.nagano.jp\0"
-"sande.vestfold.no\0ubank\0"
-"casino\0"
-"shinshinotsu.hokkaido.jp\0fit\0"
-"hobby-site.com\0"
-"konyvelo.hu\0campaign.gov.uk\0"
-"matsudo.chiba.jp\0"
-"kristiansund.no\0is-a-libertarian.com\0"
-"ravpage.co.il\0"
-"ce.gov.br\0sumida.tokyo.jp\0undo.jp\0"
-"stokke.no\0"
-"is-lost.org\0"
-"pharmacien.fr\0sosnowiec.pl\0garden\0"
-"\xd9\x83\xd9\x88\xd9\x85\0"
-"agematsu.nagano.jp\0"
-"0.bg\0test-iserv.de\0"
-"terni.it\0"
-"valle-aosta.it\0"
-"college\0"
-"chtr.k12.ma.us\0"
-"wakkanai.hokkaido.jp\0kawanehon.shizuoka.jp\0catfood.jp\0"
-"\xe5\xae\xae\xe5\xb4\x8e.jp\0yamanouchi.nagano.jp\0"
-"kawagoe.mie.jp\0kolobrzeg.pl\0"
-"trentino-suedtirol.it\0aridagawa.wakayama.jp\0"
-"ap-southeast-1.elasticbeanstalk.com\0"
-"sabae.fukui.jp\0mizunami.gifu.jp\0hita.oita.jp\0"
-"realestate\0"
-"towada.aomori.jp\0"
-"dnipropetrovsk.ua\0"
-"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xd8\xa9\0myfirewall.org\0"
-"fly\0"
-"tarui.gifu.jp\0"
-"vardo.no\0myvnc.com\0"
-"aizubange.fukushima.jp\0yaese.okinawa.jp\0"
-"dgca.aero\0is-into-games.com\0"
-"chikushino.fukuoka.jp\0punyu.jp\0"
-"lib.or.us\0freeddns.org\0edu.eu.org\0*.triton.zone\0"
-"meme\0"
-"kv\xc3\xa6""fjord.no\0"
-"funagata.yamagata.jp\0"
-"veterinaire.km\0is-a-geek.com\0"
-"ts.it\0incheon.kr\0"
-"cc.in.us\0space-to-rent.com\0"
-"filegear-gb.me\0git-repos.de\0sakuratan.com\0"
-"kep.tr\0"
-"miyazu.kyoto.jp\0"
-"lomo.jp\0"
-"kyuragi.saga.jp\0selfip.net\0"
-"vestnes.no\0"
-"\xe6\x8b\x9b\xe8\x81\x98\0"
-"foo\0"
-"iwate.iwate.jp\0murata.miyagi.jp\0"
-"lib.nv.us\0menu\0analytics-gateway.us-east-2.amazonaws.com\0"
-"misato.miyagi.jp\0"
-"agdenes.no\0"
-"nerima.tokyo.jp\0"
-"dh.bytemark.co.uk\0"
-"fox\0"
-"kasugai.aichi.jp\0"
-"so.it\0"
-"mordovia.su\0"
-"br.it\0cb.it\0oji.nara.jp\0"
-"if.ua\0richardli\0"
-"naie.hokkaido.jp\0"
-"hof.no\0"
-"nanjo.okinawa.jp\0"
-"gal\0"
-"tranby.no\0hoylandet.no\0"
-"veterinaire.fr\0"
-"br\xc3\xb8nn\xc3\xb8ysund.no\0extraspace\0"
-"utsunomiya.tochigi.jp\0gap\0"
-"storj.farm\0"
-"ando.nara.jp\0"
-"lib.nj.us\0"
-"tamba.hyogo.jp\0"
-"gay\0"
-"elementor.cloud\0"
-"baidu\0\xd0\xb1\xd0\xb8\xd0\xb7.\xd1\x80\xd1\x83\xd1\x81\0"
-"frl\0"
-"an.it\0"
-"natural.bo\0"
-"andriabarlettatrani.it\0ohira.tochigi.jp\0"
-"abc.br\0\xd7\x9e\xd7\x9e\xd7\xa9\xd7\x9c.\xd7\x99\xd7\xa9\xd7\xa8\xd7\x90\xd7\x9c\0"
-"katano.osaka.jp\0"
-"mordovia.ru\0"
-"kaufen\0"
-"eu-west-3.elasticbeanstalk.com\0"
-"marumori.miyagi.jp\0"
-"os.hordaland.no\0"
-"madrid\0"
-"abiko.chiba.jp\0"
-"trainer.aero\0is-a-knight.org\0"
-"exchange\0"
-"gdn\0"
-"aomori.aomori.jp\0kumatori.osaka.jp\0blush.jp\0"
-"gea\0ru.com\0ip.linodeusercontent.com\0"
-"nagareyama.chiba.jp\0ftr\0staba.jp\0"
-"fr.eu.org\0"
-"cloudns.org\0"
-"!city.kobe.jp\0kayabe.hokkaido.jp\0"
-"cyon.site\0co.technology\0"
-"chita.aichi.jp\0discover\0platter-app.dev\0"
-"s3-fips-us-gov-west-1.amazonaws.com\0"
-"spot\0"
-"fun\0"
-"s3.eu-central-1.amazonaws.com\0"
-"cuisinella\0"
-"bytom.pl\0"
-"suli.hu\0l.se\0"
-"romsa.no\0qualifioapp.com\0"
-"on-web.fr\0"
-"etnedal.no\0"
-"yatsuka.shimane.jp\0"
-"club.aero\0"
-"\xe8\xb0\xb7\xe6\xad\x8c\0"
-"kafjord.no\0"
-"pc.it\0"
-"\xd9\x85\xd8\xb5\xd8\xb1\0"
-"build\0"
-"chuo.yamanashi.jp\0"
-"b\xc3\xa1hcavuotna.no\0"
-"trentinoaltoadige.it\0"
-"broker.aero\0"
-"hirata.fukushima.jp\0"
-"x443.pw\0mein-vigor.de\0"
-"doctor\0"
-"b\xc3\xa5""d\xc3\xa5""ddj\xc3\xa5.no\0"
-"wegrow.pl\0"
-"sera.hiroshima.jp\0"
-"bozen.it\0takko.aomori.jp\0nhlfan.net\0"
-"beskidy.pl\0"
-"obu.aichi.jp\0"
-"somna.no\0"
-"asakuchi.okayama.jp\0hra.health\0"
-"luxe\0is-a-geek.org\0"
-"js.cn\0no.it\0\xd8\xa7\xd9\x85\xd8\xa7\xd8\xb1\xd8\xa7\xd8\xaa\0ecommerce-shop.pl\0digick.jp\0"
-"*.kawasaki.jp\0"
-"synology-diskstation.de\0"
-"cv.ua\0fyi\0"
-"strand.no\0boldlygoingnowhere.org\0"
-"\xe9\xa6\x99\xe5\xb7\x9d.jp\0"
-"mito.ibaraki.jp\0auction\0eu.encoway.cloud\0sunnyday.jp\0"
-"okoppe.hokkaido.jp\0"
-"bambina.jp\0"
-"grondar.za\0markets\0"
-"algard.no\0"
-"serveminecraft.net\0"
-"hippy.jp\0"
-"valled-aosta.it\0"
-"ikusaka.nagano.jp\0"
-"dyndns-home.com\0"
-"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xdb\x83\0c.cdn77.org\0"
-"notaires.fr\0"
-"servehttp.com\0"
-"cc.sc.us\0"
-"m\xc3\xa1tta-v\xc3\xa1rjjat.no\0sa-east-1.elasticbeanstalk.com\0"
-"uw.gov.pl\0"
-"fldrv.com\0"
-"akashi.hyogo.jp\0gotemba.shizuoka.jp\0"
-"shizuoka.jp\0"
-"gotdns.org\0"
-"hyuga.miyazaki.jp\0"
-"ravendb.run\0"
-"gle\0mydatto.com\0"
-"kofu.yamanashi.jp\0"
-"kutno.pl\0"
-"venice.it\0hasura.app\0"
-"gov.ac\0skedsmokorset.no\0\xd1\x81\xd0\xbe\xd1\x87\xd0\xb8.\xd1\x80\xd1\x83\xd1\x81\0"
-"gov.ae\0"
-"gov.af\0hk.cn\0london.cloudapps.digital\0"
-"pc.pl\0akamaihd.net\0"
-"gov.al\0"
-"gmo\0paris\0radio\0"
-"mypsx.net\0"
-"mc.eu.org\0"
-"gov.ba\0dnsupdater.de\0"
-"gov.ar\0gov.bb\0lg.jp\0zombie.jp\0gg.ax\0"
-"gov.as\0mer\xc3\xa5ker.no\0ravendb.community\0"
-"anpachi.gifu.jp\0"
-"gov.au\0*.digitaloceanspaces.com\0"
-"gov.bf\0kwp.gov.pl\0gmx\0"
-"fet.no\0"
-"gov.bh\0principe.st\0dattolocal.net\0"
-"gov.az\0ugim.gov.pl\0"
-"gov.bm\0"
-"gov.bn\0prato.it\0sakegawa.yamagata.jp\0"
-"go.gov.br\0soc.srcf.net\0"
-"gov.br\0shimoji.okinawa.jp\0"
-"gov.bs\0origins\0"
-"gov.bt\0gov.cd\0"
-"vix.br\0""1.azurestaticapps.net\0"
-"gov.by\0is-a-personaltrainer.com\0"
-"gov.bz\0\xe7\xbb\x84\xe7\xbb\x87\xe6\x9c\xba\xe6\x9e\x84\0"
-"frogans\0"
-"gov.cl\0""16-b.it\0"
-"gov.cm\0goo\0"
-"gov.cn\0gop\0"
-"gov.co\0s3-website-ap-southeast-2.amazonaws.com\0lt.eu.org\0"
-"r\xc3\xa5holt.no\0"
-"got\0"
-"catholic\0"
-"gob.ar\0gov\0kumano.mie.jp\0es.ax\0"
-"gov.cu\0organic\0"
-"shinanomachi.nagano.jp\0"
-"gov.cx\0"
-"gov.cy\0"
-"gov.dm\0kilatiron.com\0"
-"u.bg\0gov.do\0"
-"peewee.jp\0in-vpn.net\0direct.quickconnect.cn\0"
-"gob.bo\0gaular.no\0eu.com\0"
-"xx.gl\0"
-"gov.ec\0*.advisor.ws\0"
-"io.in\0ogano.saitama.jp\0"
-"gov.ee\0s3-us-gov-west-1.amazonaws.com\0"
-"saka.hiroshima.jp\0"
-"airport.aero\0gov.eg\0enebakk.no\0tools\0"
-"berlevag.no\0aramco\0"
-"gov.dz\0"
-"blogspot.com\0dnsiskinky.com\0"
-"gob.cl\0kurotaki.nara.jp\0"
-"talk\0webview-assets.cloud9.ap-northeast-3.amazonaws.com\0"
-"rep.br\0\xd8\xa8\xda\xbe\xd8\xa7\xd8\xb1\xd8\xaa\0noop.app\0"
-"gov.et\0"
-"miharu.fukushima.jp\0tochigi.tochigi.jp\0"
-"gov.fj\0tendo.yamagata.jp\0"
-"\xe5\xba\x83\xe5\xb3\xb6.jp\0"
-"hbo\0io.kg\0"
-"audi\0"
-"firenze.it\0tatsuno.nagano.jp\0"
-"a.bg\0gob.do\0eu-central-1.elasticbeanstalk.com\0"
-"gov.gd\0"
-"gob.ec\0gov.ge\0"
-"magazine.aero\0tr\xc3\xb8gstad.no\0"
-"gov.gh\0"
-"gov.gi\0"
-"rost.no\0cc.ms.us\0cc.nc.us\0"
-"matera.it\0in-the-band.net\0"
-"gov.gn\0vallee-d-aoste.it\0"
-"gov.gr\0actor\0"
-"bci.dnstrace.pro\0"
-"gob.es\0gov.gu\0"
-"beer\0"
-"gov.gy\0"
-"gov.hk\0"
-"sellsyourhome.org\0"
-"ushiku.ibaraki.jp\0"
-"muko.kyoto.jp\0"
-"lib.sc.us\0nfshost.com\0""180r.com\0"
-"ind.br\0"
-"gov.ie\0"
-"funabashi.chiba.jp\0"
-"pgfog.com\0"
-"kamitonda.wakayama.jp\0"
-"industria.bo\0"
-"sx.cn\0gov.il\0aisho.shiga.jp\0"
-"gov.in\0azumino.nagano.jp\0"
-"gov.iq\0mk.ua\0oldnavy\0"
-"gov.ir\0sumita.iwate.jp\0"
-"gov.is\0from-md.com\0"
-"gov.it\0flir\0"
-"caxias.br\0gob.gt\0witd.gov.pl\0"
-"krellian.net\0"
-"hyllestad.no\0"
-"ostroda.pl\0"
-"typedream.app\0"
-"gov.jo\0no-ip.ca\0"
-"nom.ad\0log.br\0gob.hn\0\xe6\x89\x8b\xe6\x9c\xba\0"
-"nagara.chiba.jp\0"
-"nom.ag\0"
-"host\0"
-"9.bg\0"
-"como.it\0school\0"
-"gov.kg\0"
-"ac.ae\0gov.ki\0"
-"goiania.br\0"
-"gov.km\0\xd8\xa8\xd9\x8a\xd8\xaa\xd9\x83\0gentapps.com\0"
-"sd.cn\0gov.kn\0nikon\0"
-"fc.it\0gov.kp\0"
-"gov.la\0iveland.no\0"
-"gov.lb\0"
-"gov.lc\0lg.ua\0"
-"toshima.tokyo.jp\0"
-"gov.kw\0"
-"ac.at\0"
-"insurance.aero\0ac.be\0tunk.org\0"
-"inami.wakayama.jp\0gov.kz\0"
-"gov.lk\0"
-"parts\0"
-"showa.yamanashi.jp\0functions.fnc.fr-par.scw.cloud\0"
-"gov.ma\0catering\0"
-"gov.lr\0"
-"gov.ls\0party\0"
-"*.sendai.jp\0gov.lt\0*.northflank.app\0"
-"gov.me\0"
-"gov.lv\0"
-"gov.mg\0"
-"kawahara.tottori.jp\0bitbridge.net\0"
-"gov.ly\0"
-"higashikagawa.kagawa.jp\0"
-"nom.co\0gov.mk\0"
-"takahashi.okayama.jp\0gov.ml\0elblag.pl\0"
-"ac.ci\0"
-"es.kr\0gov.mn\0"
-"gov.mo\0surnadal.no\0"
-"shopselect.net\0"
-"ac.cn\0gov.mr\0"
-"gov.ms\0"
-"fortal.br\0gyeongnam.kr\0hiv\0knx-server.net\0"
-"gov.mu\0"
-"ac.cr\0ind.gt\0gov.mv\0"
-"gov.mw\0gov.ng\0"
-"sakura.tochigi.jp\0shioya.tochigi.jp\0"
-"gov.my\0"
-"yamagata.nagano.jp\0arakawa.tokyo.jp\0gov.mz\0"
-"mckinsey\0"
-"gov.nl\0"
-"ac.cy\0"
-"clubmed\0"
-"webview-assets.aws-cloud9.ap-northeast-1.amazonaws.com\0"
-"rep.kp\0"
-"gov.nr\0"
-"\xe3\x82\xbb\xe3\x83\xbc\xe3\x83\xab\0"
-"nakasatsunai.hokkaido.jp\0setouchi.okayama.jp\0vlaanderen\0"
-"official.academy\0"
-"diet\0"
-"dentist\0"
-"\xe9\xb9\xbf\xe5\x85\x90\xe5\xb3\xb6.jp\0"
-"gov.om\0from-fl.com\0"
-"nom.es\0alesund.no\0"
-"ind.in\0author\0"
-"fie.ee\0"
-"hkt\0"
-"crown\0"
-"moriyama.shiga.jp\0"
-"gov.ph\0"
-"tozawa.yamagata.jp\0gob.mx\0shoparena.pl\0"
-"gob.ni\0flesberg.no\0gov.pk\0is-a-financialadvisor.com\0"
-"gov.pl\0"
-"\xec\x82\xbc\xec\x84\xb1\0"
-"ac.fj\0nom.fr\0musashimurayama.tokyo.jp\0gov.pn\0siteleaf.net\0"
-"\xe3\x83\x95\xe3\x82\xa1\xe3\x83\x83\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\0"
-"suzuka.mie.jp\0"
-"gov.qa\0"
-"gov.pr\0"
-"gov.ps\0"
-"owani.aomori.jp\0toyooka.hyogo.jp\0iwama.ibaraki.jp\0gov.pt\0"
-"toon.ehime.jp\0"
-"revista.bo\0jpn.org\0"
-"ullensaker.no\0gov.py\0"
-"lib.ms.us\0lib.nc.us\0"
-"oirm.gov.pl\0"
-"saikai.nagasaki.jp\0"
-"taxi\0mk.eu.org\0lab.ms\0"
-"sub.jp\0"
-"ac.gn\0kijo.miyazaki.jp\0phutho.vn\0"
-"gob.pa\0dattorelay.com\0"
-"nx.cn\0frosinone.it\0io.vn\0"
-"s3-us-east-2.amazonaws.com\0"
-"bg.it\0bandai.fukushima.jp\0"
-"gob.pe\0kddi\0"
-"aosta.it\0"
-"ind.kw\0"
-"allfinanz\0"
-"longan.vn\0"
-"gob.pk\0"
-"kami.miyagi.jp\0"
-"gov.sa\0"
-"ofunato.iwate.jp\0gov.sb\0"
-"gov.rs\0gov.sc\0is-leet.com\0"
-"gov.sd\0"
-"delivery\0travelersinsurance\0gov.ru\0"
-"rovigo.it\0otaki.chiba.jp\0"
-"gov.rw\0gov.sg\0"
-"ac.id\0um.gov.pl\0gov.sh\0irish\0"
-"smola.no\0tec.mi.us\0"
-"gov.sl\0target\0"
-"movimiento.bo\0norddal.no\0"
-"gov.so\0"
-"ac.il\0"
-"ac.im\0"
-"ac.in\0trentinosud-tirol.it\0higashiyodogawa.osaka.jp\0hot\0"
-"gov.ss\0"
-"how\0"
-"ac.ir\0"
-"arvo.network\0"
-"trentinosued-tirol.it\0gov.sx\0"
-"gov.sy\0"
-"bsb.br\0cieszyn.pl\0gov.tj\0"
-"yame.fukuoka.jp\0aoki.nagano.jp\0gov.tl\0"
-"gov.tm\0"
-"trentinsud-tirol.it\0gov.tn\0"
-"gov.to\0lolipop.io\0"
-"tohma.hokkaido.jp\0"
-"gov.ua\0"
-"shimokawa.hokkaido.jp\0gov.tr\0"
-"ac.jp\0gov.tt\0"
-"asuke.aichi.jp\0toei.aichi.jp\0"
-"gov.tw\0claims\0dnsdojo.com\0"
-"fujikawa.shizuoka.jp\0"
-"ac.ke\0nom.km\0"
-"hiroshima.jp\0"
-"gov.uk\0no-ip.info\0"
-"omitama.ibaraki.jp\0zpisdn.gov.pl\0"
-"u.se\0"
-"rebun.hokkaido.jp\0"
-"lu.eu.org\0me.eu.org\0"
-"zarow.pl\0"
-"direct.quickconnect.to\0"
-"gov.vc\0realty\0"
-"t3l3p0rt.net\0"
-"gov.ve\0from-ut.com\0"
-"shunan.yamaguchi.jp\0ac.kr\0"
-"cc.ut.us\0cupcake.is\0int.eu.org\0"
-"gotsu.shimane.jp\0gob.sv\0"
-"barsy.mobi\0"
-"best\0"
-"ibm\0"
-"kraanghke.no\0"
-"slz.br\0gov.vn\0freeboxos.fr\0"
-"ac.lk\0fauske.no\0webview-assets.aws-cloud9.sa-east-1.amazonaws.com\0"
-"chillout.jp\0"
-"konin.pl\0"
-"nom.mg\0ice\0"
-"resto.bj\0nuoro.it\0"
-"ac.ma\0aukra.no\0siellak.no\0auto\0fidelity\0"
-"kawagoe.saitama.jp\0"
-"ac.ls\0est-a-la-masion.com\0"
-"us.gov.pl\0"
-"ac.me\0selfip.org\0"
-"ketrzyn.pl\0"
-"time.no\0"
-"frogn.no\0"
-"nom.nc\0a.se\0lv.eu.org\0"
-"wazuka.kyoto.jp\0akadns.net\0"
-"skedsmo.no\0"
-"ponpes.id\0"
-"gov.ws\0icu\0"
-"nom.ni\0"
-"fujinomiya.shizuoka.jp\0"
-"vic.edu.au\0gob.ve\0"
-"shichinohe.aomori.jp\0nasu.tochigi.jp\0"
-"ac.mu\0"
-"news.hu\0ac.mw\0cc.dc.us\0loans\0mywire.org\0"
-"ac.ni\0bar.pro\0"
-"ac.mz\0is-a-geek.net\0"
-"riik.ee\0"
-"main.jp\0"
-"gov.ye\0*.dev.adobeaemcloud.com\0"
-"serveftp.net\0"
-"cyou\0"
-"viterbo.it\0arai.shizuoka.jp\0"
-"nom.pa\0"
-"hekinan.aichi.jp\0ac.nz\0comcast\0"
-"nom.pe\0gov.za\0"
-"kamo.kyoto.jp\0"
-"ac.pa\0"
-"kashiwa.chiba.jp\0kisosaki.mie.jp\0kawachinagano.osaka.jp\0\xd8\xa8\xd8\xa7\xd8\xb1\xd8\xaa\0"
-"ddns5.com\0*.sys.qcx.io\0"
-"nom.pl\0"
-"floro.no\0ifm\0"
-"mt.it\0es.leg.br\0"
-"\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\xe0\xa4\xae\xe0\xa5\x8d\0gov.zm\0"
-"chuo.fukuoka.jp\0fukuchiyama.kyoto.jp\0"
-"ind.tn\0"
-"ck.ua\0es.eu.org\0"
-"id.au\0"
-"ac.pr\0"
-"gov.zw\0"
-"bahcavuotna.no\0"
-"forlicesena.it\0tsukigata.hokkaido.jp\0"
-"balsan-s\xc3\xbc""dtirol.it\0"
-"leg.br\0"
-"nom.re\0"
-"\xe9\xa3\x9f\xe5\x93\x81\0"
-"trentino-sud-tirol.it\0za.bz\0"
-"\xd9\x85\xd9\x88\xd9\x82\xd8\xb9\0us.com\0"
-"malopolska.pl\0international\0vpndns.net\0"
-"nom.ro\0"
-"dish\0"
-"instance.datadetect.com\0"
-"kozaki.chiba.jp\0"
-"cc.ak.us\0"
-"yamazoe.nara.jp\0broke-it.net\0"
-"wa.gov.au\0"
-"economia.bo\0webhop.org\0"
-"kurashiki.okayama.jp\0"
-"\xd2\x9b\xd0\xb0\xd0\xb7\0dojin.com\0"
-"ac.rs\0ybo.party\0"
-"fastvps.host\0"
-"ac.se\0ac.ru\0"
-"ac.rw\0north-kazakhstan.su\0v-info.info\0"
-"kamaishi.iwate.jp\0*.lclstage.dev\0"
-"gs.nl.no\0davvenj\xc3\xa1rga.no\0"
-"*.sensiosite.cloud\0"
-"b-data.io\0doomdns.org\0"
-"atm.pl\0mazowsze.pl\0nodes.k8s.nl-ams.scw.cloud\0"
-"sd.us\0"
-"yusuhara.kochi.jp\0"
-"teramo.it\0rzeszow.pl\0"
-"ralingen.no\0estate\0"
-"kahoku.ishikawa.jp\0himeshima.oita.jp\0"
-"nom.tm\0racing\0"
-"sumoto.kumamoto.jp\0seika.kyoto.jp\0ac.th\0"
-"drive\0cf-ipfs.com\0"
-"shimane.jp\0ac.sz\0ac.tj\0"
-"africa.com\0"
-"homesecuritypc.com\0"
-"niikappu.hokkaido.jp\0"
-"u.channelsdvr.net\0"
-"ac.ug\0"
-"carrara-massa.it\0obira.hokkaido.jp\0kita.kyoto.jp\0"
-"l\xc3\xb8ten.no\0filegear-sg.me\0"
-"ac.tz\0"
-"nombre.bo\0ac.uk\0audible\0kr.eu.org\0"
-"togo.aichi.jp\0cdn-edges.net\0"
-"nom.ve\0"
-"nakano.nagano.jp\0"
-"omniwe.site\0"
-"*.nom.br\0"
-"politica.bo\0scrysec.com\0"
-"namegata.ibaraki.jp\0azurewebsites.net\0"
-"nflfan.org\0"
-"cisco\0est-le-patron.com\0game-server.cc\0pubtls.org\0"
-"trentins\xc3\xbc""dtirol.it\0"
-"nakagawa.nagano.jp\0museum.tt\0us.reclaim.cloud\0"
-"ac.vn\0"
-"bplaced.de\0"
-"pl.ua\0"
-"tottori.tottori.jp\0kaneyama.yamagata.jp\0"
-"kanan.osaka.jp\0"
-"j.layershift.co.uk\0"
-"isernia.it\0"
-"roros.no\0inc\0"
-"adobeio-static.net\0"
-"ing\0"
-"iwi.nz\0hosting-cluster.nl\0"
-"frosta.no\0"
-"j.bg\0ink\0"
-"mandal.no\0vestby.no\0lib.dc.us\0"
-"univ.bj\0"
-"spb.ru\0navoi.su\0"
-"guardian\0"
-"miasa.nagano.jp\0takaoka.toyama.jp\0"
-"int\0id.ir\0kitaakita.akita.jp\0kawaguchi.saitama.jp\0"
-"brescia.it\0store.nf\0frenchkiss.jp\0"
-"voorloper.cloud\0"
-"motegi.tochigi.jp\0"
-"nom.za\0spb.su\0"
-"kumamoto.kumamoto.jp\0fukuroi.shizuoka.jp\0"
-"olecko.pl\0"
-"ebiz.tw\0vfs.cloud9.eu-west-3.amazonaws.com\0"
-"boyfriend.jp\0"
-"org.ac\0chrome\0mcdir.me\0"
-"ono.fukushima.jp\0westus2.azurestaticapps.net\0atl.jelastic.vps-host.net\0"
-"org.ae\0ac.za\0"
-"org.af\0iheya.okinawa.jp\0"
-"org.ag\0webview-assets.cloud9.ca-central-1.amazonaws.com\0daplie.me\0"
-"org.ai\0oh.us\0"
-"org.al\0"
-"org.am\0"
-"org.ba\0ac.zm\0"
-"org.ar\0org.bb\0belem.br\0"
-"security\0"
-"shikokuchuo.ehime.jp\0"
-"org.au\0orland.no\0"
-"org.bh\0"
-"org.bi\0"
-"org.az\0org.bj\0bib.br\0"
-"ac.zw\0gallo\0"
-"\xe6\x85\x88\xe5\x96\x84\0"
-"org.bm\0"
-"org.bn\0"
-"org.bo\0"
-"hotmail\0nowtv\0\xd8\xa7\xd8\xaa\xd8\xb5\xd8\xa7\xd9\x84\xd8\xa7\xd8\xaa\0"
-"tas.gov.au\0weeklylottery.org.uk\0"
-"org.br\0"
-"org.bs\0productions\0"
-"org.bt\0"
-"jed.wafaicloud.com\0"
-"id.lv\0lamer\0nz.basketball\0"
-"org.bw\0builders\0voting\0"
-"pistoia.it\0"
-"org.ci\0id.ly\0dyndns.ddnss.de\0"
-"org.bz\0"
-"mt.us\0nd.us\0"
-"takayama.gunma.jp\0"
-"org.cn\0fukushima.hokkaido.jp\0"
-"org.co\0"
-"friulive-giulia.it\0mielec.pl\0jcb\0"
-"fi.eu.org\0"
-"netgamers.jp\0"
-"doesntexist.org\0"
-"minamisanriku.miyagi.jp\0tsuga.tochigi.jp\0"
-"org.cu\0"
-"org.cv\0marche.it\0naka.hiroshima.jp\0"
-"ciencia.bo\0org.cw\0"
-"hanawa.fukushima.jp\0ibara.okayama.jp\0"
-"org.cy\0"
-"org.dm\0mydobiss.com\0"
-"cesenaforl\xc3\xac.it\0"
-"org.do\0"
-"matsumae.hokkaido.jp\0"
-"ist\0"
-"leasing.aero\0org.ec\0eidskog.no\0fam.pk\0store\0"
-"org.ee\0eurodir.ru\0"
-"\xe7\xbd\x91\xe7\xbb\x9c.cn\0"
-"org.eg\0"
-"finance\0ollo\0"
-"org.dz\0"
-"g.vbrplsbx.io\0"
-"mizusawa.iwate.jp\0"
-"\xe5\x80\x8b\xe4\xba\xba.\xe9\xa6\x99\xe6\xb8\xaf\0"
-"ukiha.fukuoka.jp\0"
-"org.es\0"
-"org.et\0itv\0"
-"rugby\0"
-"jevnaker.no\0"
-"ve.it\0"
-"civilaviation.aero\0is-a-republican.com\0"
-"org.fj\0"
-"emilia-romagna.it\0susaki.kochi.jp\0"
-"org.fm\0forgeblocks.com\0fin.ci\0"
-"gobo.wakayama.jp\0"
-"tsuwano.shimane.jp\0"
-"museum.mv\0"
-"museum.mw\0alvdal.no\0is-a-green.com\0"
-"org.ge\0"
-"owariasahi.aichi.jp\0lon-1.paas.massivegrid.net\0"
-"org.gg\0"
-"org.gh\0"
-"org.gi\0phone\0from-nj.com\0"
-"museum.no\0qcx.io\0"
-"org.gl\0\xe3\x83\x9d\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88\0"
-"toray\0"
-"org.gn\0czest.pl\0\xe0\xac\xad\xe0\xac\xbe\xe0\xac\xb0\xe0\xac\xa4\0"
-"org.gp\0"
-"org.gr\0nishikatsura.yamanashi.jp\0banamex\0"
-"store.ve\0"
-"org.gt\0adachi.tokyo.jp\0"
-"org.gu\0"
-"fashionstore.jp\0"
-"fin.ec\0"
-"star\0"
-"org.gy\0museum.om\0"
-"homeip.net\0"
-"org.hk\0cc.il.us\0barsy.online\0"
-"ct.it\0"
-"kragero.no\0"
-"org.hn\0"
-"warabi.saitama.jp\0jp.net\0under.jp\0"
-"res.aero\0"
-"org.ht\0shirataka.yamagata.jp\0"
-"org.hu\0"
-"kumiyama.kyoto.jp\0"
-"\xe3\x82\xa2\xe3\x83\x9e\xe3\x82\xbe\xe3\x83\xb3\0"
-"vald-aosta.it\0kashima.ibaraki.jp\0sklep.pl\0us.platform.sh\0"
-"\xe5\x80\x8b\xe4\xba\xba.hk\0erotika.hu\0"
-"org.il\0aibetsu.hokkaido.jp\0"
-"org.im\0"
-"org.in\0"
-"*.elb.amazonaws.com\0"
-"org.iq\0voyage\0"
-"org.ir\0"
-"\xe7\xbd\x91\xe7\xbb\x9c.hk\0org.is\0k12.pr.us\0lib.oh.us\0"
-"org.je\0"
-"hiroo.hokkaido.jp\0"
-"nagai.yamagata.jp\0"
-"lunner.no\0"
-"psp.gov.pl\0dnsalias.net\0"
-"jio\0from-mn.com\0"
-"edu.ac\0org.jo\0davvenjarga.no\0\xd0\xb1\xd0\xb5\xd0\xbb\0"
-"globo\0"
-"edu.af\0uchiko.ehime.jp\0tiengiang.vn\0"
-"mcdir.ru\0"
-"gok.pk\0"
-"org.kg\0is-a-painter.com\0"
-"edu.al\0iwatsuki.saitama.jp\0market\0"
-"org.ki\0"
-"ikawa.akita.jp\0"
-"edu.ba\0org.km\0"
-"edu.ar\0edu.bb\0ora.gunma.jp\0edogawa.tokyo.jp\0org.kn\0"
-"games\0cloudcontrolapp.com\0"
-"nishiaizu.fukushima.jp\0kusatsu.shiga.jp\0org.kp\0kill.jp\0"
-"edu.au\0org.la\0stordal.no\0moscow\0bitbucket.io\0"
-"org.lb\0"
-"org.lc\0stjordalshalsen.no\0id.us\0"
-"edu.bh\0lublin.pl\0"
-"edu.bi\0rackmaze.com\0"
-"edu.az\0edu.bj\0olbia-tempio.it\0reggio-calabria.it\0"
-"org.kw\0"
-"kppsp.gov.pl\0airtel\0lplfinancial\0"
-"edu.bm\0org.ky\0georgia.su\0"
-"edu.bn\0trentinoaadige.it\0natori.miyagi.jp\0ohda.shimane.jp\0org.kz\0freesite.host\0"
-"edu.bo\0org.lk\0afjord.no\0fjaler.no\0boats\0"
-"store.ro\0chimkent.su\0"
-"edu.br\0nm.cn\0ri.it\0id.vn\0"
-"edu.bs\0gjemnes.no\0abudhabi\0"
-"edu.bt\0al.it\0takayama.gifu.jp\0mugi.tokushima.jp\0"
-"org.ma\0csx.cc\0"
-"org.lr\0"
-"org.ls\0"
-"edu.ci\0org.me\0"
-"edu.bz\0org.lv\0"
-"ac\0org.mg\0"
-"ad\0kameoka.kyoto.jp\0"
-"ae\0org.ly\0"
-"af\0edu.cn\0koriyama.fukushima.jp\0ic.gov.pl\0jll\0"
-"ag\0edu.co\0org.mk\0"
-"org.ml\0"
-"ai\0"
-"ichihara.chiba.jp\0org.mn\0"
-"org.mo\0yodobashi\0"
-"al\0higashi.okinawa.jp\0"
-"am\0edu.cu\0org.na\0basicserver.io\0"
-"edu.cv\0store.st\0"
-"ao\0edu.cw\0info.gu\0org.ms\0photo\0"
-"trani-andria-barletta.it\0hirogawa.wakayama.jp\0org.mt\0cn-north-1.eb.amazonaws.com.cn\0"
-"aq\0ba\0org.mu\0"
-"ar\0bb\0tagajo.miyagi.jp\0kainan.tokushima.jp\0org.mv\0"
-"as\0org.mw\0org.ng\0"
-"at\0org.mx\0"
-"au\0be\0edu.dm\0org.my\0org.ni\0"
-"bf\0org.mz\0"
-"aw\0bg\0edu.do\0"
-"ax\0bh\0"
-"bi\0app.os.fedoraproject.org\0"
-"az\0bj\0ohkura.yamagata.jp\0jmp\0"
-"edu.ec\0muos\xc3\xa1t.no\0"
-"pu.it\0nanbu.yamanashi.jp\0"
-"bm\0edu.ee\0"
-"bn\0info.ht\0shintoku.hokkaido.jp\0org.nr\0"
-"bo\0edu.eg\0info.hu\0"
-"ca\0dynalias.com\0"
-"br\0edu.dz\0qpon\0wedeploy.sh\0"
-"bs\0cc\0"
-"bt\0cd\0jnj\0"
-"bv\0cf\0org.nz\0"
-"bw\0cg\0evenassi.no\0"
-"ch\0info.in\0watson.jp\0"
-"by\0ci\0org.om\0"
-"bz\0"
-"edu.es\0"
-"cl\0edu.et\0"
-"cm\0org.pa\0"
-"cn\0info.et\0"
-"co\0"
-"rome.it\0tomakomai.hokkaido.jp\0rawa-maz.pl\0s3.isk02.sakurastorage.jp\0"
-"org.pe\0wi.us\0mini\0"
-"cr\0org.pf\0"
-"fl.us\0photography\0"
-"info.fj\0ashoro.hokkaido.jp\0org.ph\0"
-"cu\0de\0edu.fm\0vodka\0"
-"cv\0miyake.nara.jp\0"
-"cw\0\xc3\xa1laheadju.no\0org.pk\0ybo.trade\0"
-"cx\0sakai.ibaraki.jp\0org.pl\0\xe0\xb8\x97\xe0\xb8\xab\xe0\xb8\xb2\xe0\xb8\xa3.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0*.cloud.metacentrum.cz\0"
-"cy\0"
-"cz\0dj\0org.pn\0"
-"dk\0"
-"edu.gd\0univ.sn\0mint\0nodes.k8s.fr-par.scw.cloud\0"
-"dm\0edu.ge\0org.qa\0"
-"pa.it\0inami.toyama.jp\0org.pr\0jot\0"
-"do\0org.ps\0\xe9\xa6\x99\xe6\xb8\xaf\0draydns.de\0"
-"edu.gh\0org.pt\0"
-"edu.gi\0dyr\xc3\xb8y.no\0"
-"nishiwaki.hyogo.jp\0katsuragi.nara.jp\0"
-"ec\0joy\0"
-"edu.gl\0turek.pl\0"
-"ee\0kr\xc3\xa5""anghke.no\0org.py\0ua.rs\0"
-"edu.gn\0"
-"eg\0al.no\0"
-"edu.gp\0mitsue.nara.jp\0"
-"dz\0edu.gr\0"
-"namsos.no\0"
-"edu.gt\0sakata.yamagata.jp\0"
-"edu.gu\0wmflabs.org\0"
-"yamatokoriyama.nara.jp\0"
-"stranda.no\0"
-"midori.gunma.jp\0"
-"edu.gy\0amfam\0"
-"info.cx\0"
-"es\0edu.hk\0"
-"et\0"
-"eu\0donna.no\0"
-"edu.hn\0"
-"alaheadju.no\0midtre-gauldal.no\0"
-"fi\0"
-"fj\0ichinoseki.iwate.jp\0"
-"nes.buskerud.no\0org.ro\0"
-"edu.ht\0la-spezia.it\0pages.torproject.net\0"
-"info.ec\0fm\0drobak.no\0nordre-land.no\0org.sa\0citic\0ninja\0"
-"wassamu.hokkaido.jp\0org.sb\0"
-"fo\0org.rs\0org.sc\0"
-"org.sd\0"
-"ga\0org.se\0org.ru\0"
-"fr\0gb\0"
-"org.rw\0org.sg\0*.vultrobjects.com\0"
-"gd\0org.sh\0"
-"ge\0"
-"gf\0edu.in\0\xe7\xa7\xbb\xe5\x8a\xa8\0"
-"gg\0"
-"gh\0ito.shizuoka.jp\0org.sl\0""123paginaweb.pt\0"
-"gi\0edu.iq\0d\xc3\xb8nna.no\0"
-"org.sn\0"
-"edu.is\0org.so\0\xd0\xbe\xd1\x80\xd0\xb3.\xd1\x81\xd1\x80\xd0\xb1\0"
-"info.bb\0gl\0edu.it\0toyama.jp\0poker\0"
-"gm\0us-west-1.elasticbeanstalk.com\0"
-"gn\0info.at\0"
-"info.au\0selbu.no\0org.ss\0"
-"gp\0nagano.nagano.jp\0shizuoka.shizuoka.jp\0org.st\0akamaized-staging.net\0"
-"gq\0"
-"gr\0omi.nagano.jp\0org.sv\0"
-"gs\0"
-"info.az\0info.bj\0gt\0west1-us.cloudjiffy.net\0"
-"gu\0org.sy\0"
-"piacenza.it\0org.sz\0org.tj\0"
-"gw\0edu.jo\0ct.us\0"
-"jdf.br\0tuscany.it\0vallee-aoste.it\0"
-"info.bo\0gy\0org.tm\0lib.il.us\0fishing\0"
-"org.tn\0bacninh.vn\0"
-"hk\0\xc3\xa5l.no\0org.to\0"
-"hm\0org.ua\0"
-"hn\0org.tr\0"
-"edu.kg\0"
-"zj.cn\0post.in\0org.tt\0gotdns.ch\0"
-"edu.ki\0"
-"hr\0mi.it\0"
-"org.tw\0org.ug\0"
-"ht\0id\0sugito.saitama.jp\0"
-"hu\0ie\0edu.km\0sm.ua\0nov.ru\0"
-"edu.kn\0icurus.jp\0"
-"org.uk\0"
-"edu.kp\0"
-"info.co\0edu.la\0bib.ve\0"
-"edu.lb\0"
-"edu.lc\0au.ngrok.io\0"
-"il\0"
-"im\0"
-"in\0yokawa.hyogo.jp\0radom.pl\0"
-"io\0edu.kw\0sogndal.no\0org.vc\0hsbc\0icbc\0"
-"iq\0edu.ky\0org.ve\0base.ec\0upli.io\0"
-"ir\0edu.kz\0"
-"is\0edu.lk\0"
-"it\0urbino-pesaro.it\0higashiura.aichi.jp\0"
-"je\0dyroy.no\0org.uy\0org.vi\0nov.su\0"
-"org.uz\0"
-"nsw.edu.au\0heroy.more-og-romsdal.no\0\xe9\xa4\x90\xe5\x8e\x85\0"
+"noshiro.akita.jp\0"
+"k12.dc.us\0rs.ba\0"
+"fbxos.fr\0"
 "\xd8\xa7\xd9\x84\xd8\xac\xd8\xb2\xd8\xa7\xd8\xa6\xd8\xb1\0"
-"edu.lr\0org.vn\0"
-"edu.ls\0"
-"edu.me\0aurskog-h\xc3\xb8land.no\0"
-"geometre-expert.fr\0shiraoi.hokkaido.jp\0edu.lv\0mircloud.host\0"
-"jo\0edu.mg\0*.linodeobjects.com\0"
-"jp\0takamatsu.kagawa.jp\0"
-"edu.ly\0org.vu\0country\0"
-"kfh\0"
-"edu.mk\0"
-"hi.cn\0le.it\0edu.ml\0"
-"ke\0vikna.no\0yachts\0"
-"edu.mn\0education\0"
-"kg\0edu.mo\0"
-"iserv.dev\0"
-"ki\0"
-"topaz.ne.jp\0"
-"edu.ms\0"
-"es.gov.br\0mie.jp\0edu.mt\0"
-"km\0r\xc3\xb8yken.no\0sandnes.no\0"
-"kn\0edu.mv\0fin.tn\0"
-"edu.mw\0edu.ng\0org.ws\0team\0"
-"kp\0edu.mx\0"
-"la\0edu.my\0edu.ni\0"
-"kr\0lb\0edu.mz\0"
-"lc\0flights\0"
-"oita.oita.jp\0"
-"stor-elvdal.no\0"
-"kw\0"
-"kouhoku.saga.jp\0shirahama.wakayama.jp\0"
-"ky\0li\0ri.us\0"
-"morioka.iwate.jp\0kz\0edu.nr\0"
-"lk\0al.us\0lib.wi.us\0vfs.cloud9.sa-east-1.amazonaws.com\0"
-"publ.pt\0\xe6\x94\xbf\xe5\xba\x9c\0"
-"!city.yokohama.jp\0\xd0\xba\xd0\xb0\xd1\x82\xd0\xbe\xd0\xbb\xd0\xb8\xd0\xba\0"
-"hurum.no\0naamesjevuemie.no\0wedeploy.me\0"
-"press.aero\0ma\0org.ye\0zone\0"
-"lr\0"
-"ls\0mc\0"
-"hachijo.tokyo.jp\0lt\0md\0"
-"lu\0me\0edu.om\0"
-"lv\0"
-"mg\0"
-"mh\0"
-"ly\0kr\xc3\xb8""dsherad.no\0edu.pa\0"
-"yamanobe.yamagata.jp\0tech\0"
-"mk\0kia\0vfs.cloud9.ap-southeast-2.amazonaws.com\0"
-"shiriuchi.hokkaido.jp\0ml\0"
-"edu.pe\0org.za\0"
-"mn\0edu.pf\0xihuan\0"
-"mo\0"
-"iizuna.nagano.jp\0mp\0edu.ph\0org.yt\0"
-"mq\0na\0s\xc3\xb8gne.no\0"
-"mr\0"
-"ms\0nc\0kongsberg.no\0edu.pk\0"
-"mt\0edu.pl\0"
-"mu\0ne\0from-de.com\0serveftp.org\0"
-"mv\0nf\0czeladz.pl\0edu.pn\0"
-"mw\0ng\0kim\0toshiba\0s3.dualstack.eu-west-3.amazonaws.com\0*.builder.code.com\0"
-"mx\0"
-"my\0ni\0edu.qa\0org.zm\0"
-"mz\0edu.pr\0"
-"edu.ps\0"
-"gojome.akita.jp\0zama.kanagawa.jp\0nl\0edu.pt\0"
-"s.bg\0karelia.su\0"
-"no\0lyngen.no\0fnwk.site\0point2this.com\0"
-"edu.py\0"
-"nr\0boo.jp\0"
-"org.zw\0"
-"nu\0"
-"im.it\0coolblog.jp\0"
-"nz\0"
-"store.bb\0tomioka.gunma.jp\0wakuya.miyagi.jp\0niimi.okayama.jp\0\xe4\xba\x9a\xe9\xa9\xac\xe9\x80\x8a\0"
-"om\0"
-"autos\0"
-"pa\0athleta\0is-a-linux-user.org\0"
-"takehara.hiroshima.jp\0food\0"
-"cust.testing.thingdust.io\0"
-"lebork.pl\0"
-"pe\0schulserver.de\0"
-"pf\0gonna.jp\0"
-"locus\0"
-"soma.fukushima.jp\0ph\0selfip.biz\0"
-"edu.sa\0"
-"edu.sb\0"
-"pk\0edu.rs\0edu.sc\0"
-"pl\0edu.sd\0computer\0"
-"pm\0pa.us\0edu.ru\0"
-"pn\0"
-"edu.sg\0k12.va.us\0"
-"sakura.tv\0"
-"qa\0cymru\0"
-"kai.yamanashi.jp\0pr\0"
-"ps\0"
-"shikaoi.hokkaido.jp\0pt\0edu.sl\0"
-"reservd.testing.thingdust.io\0"
-"edu.sn\0candypop.jp\0"
-"herad.no\0pw\0edu.so\0"
-"py\0from-wi.com\0"
-"taito.tokyo.jp\0"
-"edu.ss\0"
-"uzs.gov.pl\0edu.st\0webhop.net\0"
-"dyndns-pics.com\0"
-"edu.sv\0"
-"lakas.hu\0is-a-bookkeeper.com\0"
-"seg.br\0"
-"edu.sy\0\xe7\xb6\xb2\xe8\xb7\xaf.tw\0"
-"trentinoalto-adige.it\0edu.tj\0whm.nl-ams.scw.cloud\0"
-"tado.mie.jp\0"
-"sport.hu\0re\0edu.tm\0store.dk\0jambyl.su\0"
-"isahaya.nagasaki.jp\0"
-"edu.to\0"
-"otari.nagano.jp\0"
-"edu.ua\0sandvik\0"
-"edu.tr\0direct\0"
-"sic.it\0seki.gifu.jp\0edu.tt\0"
-"ro\0edu.tw\0nm.us\0"
-"mashiko.tochigi.jp\0"
-"v\xc3\xa6r\xc3\xb8y.no\0sa\0network\0"
-"yazu.tottori.jp\0sb\0ford\0heavy.jp\0"
-"rs\0sc\0cbg.ru\0"
-"sd\0"
-"ru\0se\0"
-"mi.th\0"
-"rw\0sg\0"
-"sh\0discourse.group\0"
-"hamaroy.no\0si\0"
-"sj\0"
-"sk\0edu.vc\0platter-app.com\0"
-"ge.it\0jelenia-gora.pl\0sl\0"
-"sm\0edu.ve\0id.repl.co\0"
-"bialystok.pl\0sn\0"
-"fusa.no\0so\0info.ve\0filegear-de.me\0"
-"umbria.it\0chiryu.aichi.jp\0"
-"edu.uy\0"
-"kitagata.saga.jp\0sr\0encr.app\0"
-"s\xc3\xa1lat.no\0ss\0tc\0"
-"st\0td\0"
-"su\0gitpage.si\0co.place\0"
-"sv\0tf\0edu.vn\0"
-"tg\0isa-hockeynut.com\0"
-"trentinsudtirol.it\0nakama.fukuoka.jp\0semine.miyagi.jp\0sx\0th\0info.vn\0be.ax\0"
-"szex.hu\0sy\0"
-"sz\0tj\0"
-"tk\0"
-"rankoshi.hokkaido.jp\0niigata.niigata.jp\0tl\0"
-"tm\0edu.vu\0"
-"tn\0"
-"to\0"
-"siljan.no\0ua\0mi.us\0"
-"tr\0"
-"7.bg\0rennesoy.no\0lib.ri.us\0"
-"itako.ibaraki.jp\0tt\0"
-"okagaki.fukuoka.jp\0tv\0"
-"sortland.no\0tw\0ug\0"
-"consulado.st\0kpn\0"
-"tz\0"
-"uk\0edu.ws\0go.dyndns.org\0"
-"debian.net\0"
-"loab\xc3\xa1t.no\0stackhero-network.com\0"
-"udi.br\0trieste.it\0matsukawa.nagano.jp\0netlify.app\0"
-"va\0musician.io\0"
-"geisei.kochi.jp\0"
-"us\0vc\0"
-"ve\0ap-south-1.elasticbeanstalk.com\0"
-"katashina.gunma.jp\0"
-"vg\0"
-"info.tn\0"
-"pri.ee\0fjell.no\0uy\0vi\0"
-"uz\0"
-"info.tr\0"
-"edu.ye\0lima-city.de\0"
-"aeroport.fr\0info.tt\0vn\0krd\0lat\0\xe9\xa3\x9e\xe5\x88\xa9\xe6\xb5\xa6\0"
-"sauda.no\0"
-"furano.hokkaido.jp\0"
-"and\xc3\xb8y.no\0osteroy.no\0law\0"
-"game.tw\0"
-"info.tz\0"
-"vu\0"
-"catanzaro.it\0wf\0"
-"k12.ar.us\0s3.eu-west-2.amazonaws.com\0"
-"edu.za\0"
-"\xe5\x85\xb5\xe5\xba\xab.jp\0kasama.ibaraki.jp\0"
-"eero-stage.online\0"
-"blogsyte.com\0"
-"ws\0click\0loginline.io\0"
-"edu.zm\0"
-"oz.au\0\xe7\xbb\x84\xe7\xb9\x94.hk\0"
-"info.ro\0"
-"forli-cesena.it\0miyagi.jp\0sasayama.hyogo.jp\0katsuragi.wakayama.jp\0"
-"matsushima.miyagi.jp\0lima-city.at\0"
-"conf.au\0"
-"info.sd\0"
-"kaminoyama.yamagata.jp\0"
-"urasoe.okinawa.jp\0"
-"ye\0"
-"niiza.saitama.jp\0"
-"wedeploy.io\0"
-"gliwice.pl\0"
-"s3.dualstack.us-east-2.amazonaws.com\0dyndns-free.com\0"
-"lds\0"
-"khanhhoa.vn\0"
-"filegear.me\0"
-"sv.it\0vicenza.it\0lima-city.ch\0"
-"council.aero\0cc.ia.us\0chase\0"
-"ci.it\0"
-"yt\0"
-"info.pk\0"
-"info.pl\0"
-"be.gy\0"
-"info.pr\0total\0"
-"emergency.aero\0zm\0"
-"pagespeedmobilizer.com\0"
-"asahi.chiba.jp\0iwaizumi.iwate.jp\0orx.biz\0"
-"gratis\0"
-"kannami.shizuoka.jp\0"
-"zw\0betainabox.com\0"
-"lib.ne.us\0"
-"info.na\0\xd0\xbe\xd1\x80\xd0\xb3.\xd1\x80\xd1\x83\xd1\x81\0"
-"chikusei.ibaraki.jp\0"
-"of.by\0"
-"ybo.faith\0"
-"info.mv\0info.nf\0"
-"siena.it\0fukumitsu.toyama.jp\0"
-"info.ni\0winners\0webview-assets.cloud9.eu-south-1.amazonaws.com\0"
-"andoy.no\0lund.no\0vestvagoy.no\0"
-"tanohata.iwate.jp\0"
-"leangaviika.no\0filegear-ie.me\0"
-"kaita.hiroshima.jp\0surf\0"
-"bearalvahki.no\0is-a-hard-worker.com\0jp.eu.org\0"
-"info.nr\0mail.pl\0"
-"hanamigawa.chiba.jp\0gov.scot\0"
-"naka.ibaraki.jp\0izumiotsu.osaka.jp\0"
-"toscana.it\0"
-"vfs.cloud9.ap-northeast-1.amazonaws.com\0logoip.com\0"
-"from-nv.com\0"
-"nb.ca\0dyndns1.de\0"
-"fukudomi.saga.jp\0"
-"hi.us\0kozow.com\0"
-"krasnik.pl\0"
-"info.la\0k12.ny.us\0lib.mi.us\0from-hi.com\0selfip.com\0"
-"now-dns.net\0"
-"nl-ams-1.baremetal.scw.cloud\0"
-"tempioolbia.it\0"
-"nagiso.nagano.jp\0dongnai.vn\0edgeapp.net\0"
-"boxfuse.io\0"
-"carbonia-iglesias.it\0chiyoda.gunma.jp\0"
-"accident-investigation.aero\0sveio.no\0bike\0webview-assets.cloud9.sa-east-1.amazonaws.com\0"
-"sells-for-u.com\0"
-"info.ls\0jdevcloud.com\0*.paywhirl.com\0"
-"kushima.miyazaki.jp\0"
-"*.dev-builder.code.com\0"
-"jeonbuk.kr\0"
-"tamano.okayama.jp\0"
-"friulivgiulia.it\0yaita.tochigi.jp\0"
-"nishinoshima.shimane.jp\0"
-"dynns.com\0"
-"kagami.kochi.jp\0"
-"s.se\0"
-"oppdal.no\0k12.nm.us\0"
-"s3-us-west-2.amazonaws.com\0browsersafetymark.io\0homeftp.org\0g\xc3\xbcnstigliefern.de\0"
-"okazaki.aichi.jp\0thruhere.net\0"
-"valle.no\0"
-"teva\0"
-"etc.br\0"
-"nordreisa.no\0"
-"ln.cn\0sdn.gov.pl\0"
-"camdvr.org\0"
-"cri.br\0"
-"odessa.ua\0vn.ua\0"
-"gen.mi.us\0is-a-guru.com\0"
-"koge.tottori.jp\0edu.scot\0"
-"llc\0"
-"info.ke\0"
-"fuchu.toyama.jp\0hacca.jp\0"
-"ris\xc3\xb8r.no\0"
-"\xe3\x81\xbf\xe3\x82\x93\xe3\x81\xaa\0"
-"info.ki\0*.uberspace.de\0"
-"takamori.kumamoto.jp\0"
-"ingatlan.hu\0alstom\0bing\0"
-"llp\0"
-"giize.com\0"
-"k12.la.us\0"
-"higashiyamato.tokyo.jp\0"
-"littlestar.jp\0"
-"cc.tn.us\0"
-"of.je\0"
-"nakagusuku.okinawa.jp\0"
-"dnsalias.org\0"
-"kitamoto.saitama.jp\0"
-"aa.no\0sor-fron.no\0dyndns-ip.com\0tuleap-partners.com\0"
-"tra.kp\0"
-"soka.saitama.jp\0dontexist.net\0fr-par-2.baremetal.scw.cloud\0"
-"oki.fukuoka.jp\0"
-"fhs.no\0"
-"asahi.toyama.jp\0mmafan.biz\0"
-"gaivuotna.no\0"
-"okinawa.okinawa.jp\0"
-"trentinos\xc3\xbc""d-tirol.it\0motobu.okinawa.jp\0blockbuster\0"
-"visa\0"
-"gru.br\0"
-"workisboring.com\0"
-"lol\0"
-"service.gov.scot\0"
-"yanaizu.fukushima.jp\0"
-"sld.do\0"
-"internet.in\0"
-"osoyro.no\0app.lmpm.com\0"
-"ringsaker.no\0"
-"bologna.it\0"
-"sakura\0is-a-musician.com\0"
-"vfs.cloud9.ap-east-1.amazonaws.com\0protonet.io\0"
-"eigersund.no\0"
-"lpl\0"
-"mitsubishi\0"
-"gmail\0"
-"bas.it\0\xe4\xba\xac\xe9\x83\xbd.jp\0privatizehealthinsurance.net\0"
-"paragliding.aero\0"
-"obanazawa.yamagata.jp\0baclieu.vn\0"
-"teaches-yoga.com\0"
-"lib.hi.us\0"
-"contagem.br\0"
-"risor.no\0"
-"hokuryu.hokkaido.jp\0minoh.osaka.jp\0blogspot.co.at\0"
-"graphics\0"
-"man\0rackmaze.net\0"
-"palermo.it\0kumano.hiroshima.jp\0map\0"
-"mba\0gleeze.com\0"
-"numazu.shizuoka.jp\0"
-"ddnsgeek.com\0freeddns.us\0"
-"sb.ua\0"
-"wsse.gov.pl\0"
-"bananarepublic\0viva\0"
-"of.no\0"
-"ddns.net\0"
-"indigena.bo\0"
-"idv.hk\0"
-"shima.mie.jp\0"
-"jelastic.regruhosting.ru\0servegame.com\0"
-"chirurgiens-dentistes.fr\0cal.it\0"
-"qbuser.com\0"
-"vivo\0"
-"yamashina.kyoto.jp\0"
-"rollag.no\0"
-"synology.me\0"
-"ueno.gunma.jp\0"
-"cc.pr.us\0"
-"curitiba.br\0ltd\0"
-"su.paba.se\0"
-"yaotsu.gifu.jp\0"
-"from-ks.com\0"
-"mr.no\0"
-"*.hosting.ovh.net\0"
-"rar.ve\0"
-"tvedestrand.no\0"
-"ozu.ehime.jp\0waw.pl\0"
-"rahkkeravju.no\0conf.se\0"
-"med\0"
-"kawanishi.nara.jp\0"
-"resindevice.io\0"
-"iglesiascarbonia.it\0"
-"k12.ga.us\0"
-"quangninh.vn\0men\0walter\0website.yandexcloud.net\0"
-"sukagawa.fukushima.jp\0travel\0"
+"vr.it\0itano.tokushima.jp\0"
+"execute-api.ca-central-1.amazonaws.com\0"
+"lib.or.us\0s3-us-gov-east-1.amazonaws.com\0"
+"tochigi.jp\0"
+"\xc3\xb8yer.no\0"
+"\xe3\x82\xb0\xe3\x83\xbc\xe3\x82\xb0\xe3\x83\xab\0"
+"misugi.mie.jp\0"
+"auth.eu-central-1.amazoncognito.com\0analytics-gateway.ap-northeast-1.amazonaws.com\0"
+"twmail.net\0"
+"room\0"
+"travel.in\0shimofusa.chiba.jp\0kyowa.hokkaido.jp\0"
+"familyds.com\0"
+"shiga.jp\0"
+"enebakk.no\0"
+"soctrang.vn\0"
+"sc.cn\0bihoro.hokkaido.jp\0"
+"is-a-player.com\0enterprisecloud.nu\0"
+"godo.gifu.jp\0fussa.tokyo.jp\0"
+"gildesk\xc3\xa5l.no\0"
+"s3-accesspoint-fips.dualstack.us-gov-west-1.amazonaws.com\0"
+"vivian.jp\0"
+"salat.no\0"
+"to.gt\0"
+"psc.br\0sango.nara.jp\0"
+"\xe5\x80\x8b\xe4\xba\xba.hk\0"
+"no.com\0api.gov.uk\0"
+"sumita.iwate.jp\0"
+"sorfold.no\0bradesco\0"
+"glass\0inc\0"
+"tv.im\0lib.ny.us\0mein-vigor.de\0"
+"tv.in\0"
+"ing\0"
+"chicappa.jp\0"
 "cloud.goog\0"
-"fuso.aichi.jp\0"
-"definima.io\0"
-"fj.cn\0"
-"yamamoto.miyagi.jp\0"
-"gorizia.it\0"
-"half.host\0"
-"us.ax\0"
-"zao.miyagi.jp\0"
-"bievat.no\0"
-"\xe6\xa0\x83\xe6\x9c\xa8.jp\0"
-"glitch.me\0"
-"penza.su\0servecounterstrike.com\0"
-"kawai.iwate.jp\0misaki.osaka.jp\0"
-"fastly-terrarium.com\0"
-"h.bg\0batsfjord.no\0eng.pro\0k12.vt.us\0"
-"lib.de.us\0"
-"okuma.fukushima.jp\0saarland\0"
-"hs.zone\0myshopblocks.com\0"
-"cri.nz\0"
-"cc.nj.us\0ieee\0"
-"asnes.no\0"
-"konskowola.pl\0"
-"camera\0stage.nodeart.io\0"
-"blogspot.co.id\0bc.platform.sh\0"
-"fujisato.akita.jp\0"
-"royrvik.no\0"
-"rec.br\0"
-"izena.okinawa.jp\0yamada.toyama.jp\0"
-"blogspot.co.il\0"
-"likes-pie.com\0"
-"game\0"
-"idrett.no\0philips\0"
-"mil\0"
-"rec.co\0nv.us\0"
-"asahi.ibaraki.jp\0"
-"hermes\0"
-"ma.gov.br\0"
-"ina.saitama.jp\0"
-"xnbay.com\0"
-"tokyo.jp\0ochi.kochi.jp\0yuu.yamaguchi.jp\0mit\0"
-"5g.in\0barletta-trani-andria.it\0meiwa.mie.jp\0verse.jp\0"
-"loten.no\0"
-"cim.br\0date.fukushima.jp\0\xe9\x9b\x86\xe5\x9b\xa2\0"
-"lugs.org.uk\0"
-"name.hr\0barclaycard\0"
-"kuji.iwate.jp\0toyono.osaka.jp\0"
-"sld.pa\0"
-"saito.miyazaki.jp\0dlugoleka.pl\0"
-"sch.ae\0leirvik.no\0"
-"koto.tokyo.jp\0"
-"builtwithdark.com\0"
-"tsuruga.fukui.jp\0"
-"\xe7\xa6\x8f\xe5\xb3\xb6.jp\0*.ex.ortsinfo.at\0"
-"sk.ca\0info.zm\0"
-"swinoujscie.pl\0mydatto.net\0"
-"games.hu\0"
-"karacol.su\0"
-"money.bj\0name.et\0mlb\0*.migration.run\0"
-"charter.aero\0"
-"homeunix.net\0"
-"bronnoy.no\0is-saved.org\0"
-"gifu.jp\0"
-"name.fj\0"
-"ballangen.no\0"
-"for-the.biz\0"
-"express.aero\0mysecuritycamera.com\0"
-"luster.no\0lyngdal.no\0"
-"dubai\0mma\0freedesktop.org\0paas.beebyte.io\0"
-"furubira.hokkaido.jp\0kaminokawa.tochigi.jp\0"
-"mls\0"
-"press.cy\0"
-"tokashiki.okinawa.jp\0akamai-staging.net\0"
-"\xd7\xa7\xd7\x95\xd7\x9d\0"
-"not.br\0open\0"
-"kawamata.fukushima.jp\0kanegasaki.iwate.jp\0"
-"nissedal.no\0synology-ds.de\0"
-"is.eu.org\0"
-"lib.pr.us\0sucks\0"
-"kvafjord.no\0godaddy\0apps.fbsbx.com\0"
-"us.in\0oketo.hokkaido.jp\0kuwana.mie.jp\0sumomo.ne.jp\0"
-"na4u.ru\0iopsys.se\0"
-"vc.it\0"
-"angry.jp\0to.gt\0"
-"ip6.arpa\0wedding\0"
-"capitalone\0"
-"kudoyama.wakayama.jp\0"
-"torsken.no\0kids\0"
-"wakasa.fukui.jp\0karasuyama.tochigi.jp\0conf.lv\0"
-"name.eg\0*.sch.uk\0moe\0"
-"reservd.disrec.thingdust.io\0"
-"moi\0orange\0"
-"olkusz.pl\0bss.design\0"
-"idv.tw\0myspreadshop.com.au\0"
-"mom\0"
-"songdalen.no\0us.kg\0"
-"qc.ca\0it.eu.org\0"
-"mibu.tochigi.jp\0"
-"agric.za\0from-me.org\0"
-"naganohara.gunma.jp\0mov\0"
-"v\xc3\xa5g\xc3\xa5.no\0homesense\0hepforge.org\0"
-"name.az\0"
-"myspreadshop.co.uk\0"
-"eu.int\0"
-"recht.pro\0"
-"to.it\0kumamoto.jp\0"
-"mytabit.com\0"
-"campidanomedio.it\0cr.it\0minami.fukuoka.jp\0"
-"nab\0"
-"mino.gifu.jp\0shinagawa.tokyo.jp\0"
-"nanao.ishikawa.jp\0"
-"meraker.no\0free\0"
-"sayama.saitama.jp\0"
-"gamvik.no\0africa\0"
-"aurskog-holand.no\0"
-"yoka.hyogo.jp\0"
-"nba\0"
-"vik.no\0avocat.pro\0"
-"toyotsu.fukuoka.jp\0"
-"b\xc3\xa1hccavuotna.no\0"
-"ny-1.paas.massivegrid.net\0"
-"us.na\0sund.no\0from-il.com\0"
-"tarama.okinawa.jp\0"
-"rade.no\0amica\0"
-"marine.ru\0"
-"savona.it\0ogaki.gifu.jp\0"
-"kautokeino.no\0s\xc3\xb8r-varanger.no\0"
-"dynv6.net\0"
-"bn.it\0"
-"sch.id\0miho.ibaraki.jp\0msd\0"
-"diskussionsbereich.de\0"
-"mihama.fukui.jp\0"
-"kumakogen.ehime.jp\0hagi.yamaguchi.jp\0"
-"appspaceusercontent.com\0"
-"kosaka.akita.jp\0to.md\0"
-"schule\0in.eu.org\0"
-"sch.ir\0ginan.gifu.jp\0"
-"rec.nf\0"
-"tateshina.nagano.jp\0matsubushi.saitama.jp\0"
-"\xe3\x82\xb3\xe3\x83\xa0\0"
-"trentinosuedtirol.it\0"
-"s3.dualstack.ap-southeast-2.amazonaws.com\0"
-"gyeonggi.kr\0mtn\0"
-"sch.jo\0kiev.ua\0"
-"pussycat.jp\0"
-"rg.it\0nishihara.kumamoto.jp\0mtr\0"
-"conference.aero\0mj\xc3\xb8ndalen.no\0nec\0blogspot.co.uk\0"
-"nakayama.yamagata.jp\0"
-"fastvps-server.com\0"
-"haebaru.okinawa.jp\0opole.pl\0"
-"kakegawa.shizuoka.jp\0"
-"\xe5\x95\x86\xe6\xa0\x87\0"
-"iglesias-carbonia.it\0"
-"pueblo.bo\0endoftheinternet.org\0"
-"ens.tn\0"
-"s3-eu-west-1.amazonaws.com\0independent-commission.uk\0"
-"elk.pl\0"
-"nomi.ishikawa.jp\0net\0ham-radio-op.net\0"
-"new\0"
-"hotel.tz\0"
-"sch.lk\0servehumour.com\0"
-"eco.bj\0nfl\0"
-"grosseto.it\0gbiz\0flynnhosting.net\0"
-"mytuleap.com\0"
-"homeftp.net\0"
-"pvt.k12.ma.us\0net-freaks.com\0"
-"eco.br\0"
-"os\xc3\xb8yro.no\0\xe3\x82\xaf\xe3\x83\xa9\xe3\x82\xa6\xe3\x83\x89\0boutir.com\0lima-city.rocks\0"
-"akamaiedge.net\0clickrising.net\0"
-"ikata.ehime.jp\0"
-"sch.ly\0tours\0"
-"minamitane.kagoshima.jp\0"
-"supply\0"
-"ngo\0"
-"karatsu.saga.jp\0"
-"asahi.yamagata.jp\0dnsking.ch\0"
-"lazio.it\0chizu.tottori.jp\0"
-"sch.ng\0crimea.ua\0eu-west-2.elasticbeanstalk.com\0"
-"sicily.it\0ts.net\0"
-"h.se\0nhk\0toyota\0"
-"kunitachi.tokyo.jp\0"
-"rec.ro\0k12.md.us\0"
-"firebaseapp.com\0"
-"kashiba.nara.jp\0"
-"dynvpn.de\0"
-"webview-assets.cloud9.eu-west-3.amazonaws.com\0"
-"cci.fr\0"
-"mine.nu\0*.usercontent.goog\0"
-"habikino.osaka.jp\0edgesuite-staging.net\0stripper.jp\0"
-"docs\0postman-echo.com\0"
-"andriatranibarletta.it\0nogi.tochigi.jp\0"
-"namdalseid.no\0"
-"grajewo.pl\0"
-"settsu.osaka.jp\0"
-"dsmynas.org\0panel.gg\0"
-"\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0"
-"\xe3\x82\xb0\xe3\x83\xbc\xe3\x82\xb0\xe3\x83\xab\0traeumtgerade.de\0"
-"tateyama.chiba.jp\0"
-"koga.fukuoka.jp\0tsukuba.ibaraki.jp\0"
-"komatsu\0"
-"chonan.chiba.jp\0"
-"webview-assets.cloud9.af-south-1.amazonaws.com\0sellfy.store\0"
-"\xe5\xa4\xa7\xe5\x88\x86.jp\0"
-"blogspot.co.ke\0"
-"lombardia.it\0matsumoto.kagoshima.jp\0mutual\0"
-"sch.qa\0"
-"kawaba.gunma.jp\0blackbaudcdn.net\0"
-"brumunddal.no\0"
-"\xc3\xa5mot.no\0"
-"kanoya.kagoshima.jp\0"
-"matta-varjjat.no\0"
-"coz.br\0osasco.br\0"
-"cr.ua\0"
-"cesenaforli.it\0yonago.tottori.jp\0"
-"watches\0"
-"no.com\0"
-"kaga.ishikawa.jp\0kitchen\0"
-"rec.ve\0"
-"taranto.it\0"
-"osakikamijima.hiroshima.jp\0"
-"praxi\0"
-"toyokawa.aichi.jp\0koza.wakayama.jp\0"
-"hitra.no\0dyndns-at-home.com\0spdns.org\0"
-"net.ac\0\xe4\xbd\x9b\xe5\xb1\xb1\0spdns.eu\0"
-"name.vn\0sopot.pl\0"
-"net.ae\0schulplattform.de\0"
+"ink\0s3.eu-south-1.amazonaws.com\0"
+"tv.it\0kumejima.okinawa.jp\0"
+"ktistory.com\0"
+"amami.kagoshima.jp\0"
+"ono.fukushima.jp\0anpachi.gifu.jp\0aid.pl\0"
+"emrappui-prod.cn-north-1.amazonaws.com.cn\0"
+"lib.mn.us\0"
+"int\0ama.aichi.jp\0"
+"k12.ar.us\0amsterdam\0"
+"tr\xc3\xa6na.no\0"
+"to.it\0awaji.hyogo.jp\0"
+"\xd0\xbe\xd1\x80\xd0\xb3\0"
+"pp.az\0akamaihd.net\0"
+"studio\0tv.kg\0"
+"danang.vn\0"
+"ivanovo.su\0"
+"fuso.aichi.jp\0minoh.osaka.jp\0hikawa.shimane.jp\0dedibox.fr\0"
+"photography\0"
+"takagi.nagano.jp\0nagasaki.nagasaki.jp\0"
+"net.ac\0vaapste.no\0webview-assets.aws-cloud9.ca-central-1.amazonaws.com\0"
+"net.ae\0"
 "net.af\0"
-"net.ag\0siiites.com\0"
-"net.ai\0sch.sa\0is-a-designer.com\0"
-"net.al\0mokuren.ne.jp\0"
-"net.am\0now-dns.org\0"
-"playstation\0"
-"net.ba\0hotel.lk\0sebastopol.ua\0"
-"net.ar\0net.bb\0tamamura.gunma.jp\0"
-"cc.ar.us\0sa.com\0"
-"miyoshi.hiroshima.jp\0embetsu.hokkaido.jp\0"
-"net.au\0"
-"sch.so\0"
-"net.bh\0moroyama.saitama.jp\0"
-"net.az\0net.bj\0"
-"sch.ss\0hamburg\0"
-"net.bm\0"
-"net.bn\0atsugi.kanagawa.jp\0sch.tf\0"
+"net.ag\0"
+"net.ai\0"
+"hyuga.miyazaki.jp\0"
+"net.al\0"
+"net.am\0pb.ao\0"
+"prvcy.page\0"
+"net.ba\0myasustor.com\0"
+"net.ar\0or.at\0net.bb\0simplesite.gr\0"
+"onfabrica.com\0"
+"ta.it\0\xd8\xa7\xd9\x85\xd8\xa7\xd8\xb1\xd8\xa7\xd8\xaa\0"
+"net.au\0\xd8\xa8\xd9\x8a\xd8\xaa\xd9\x83\0"
+"or.bi\0and\xc3\xb8y.no\0"
+"net.bh\0bando.ibaraki.jp\0scalebook.scw.cloud\0"
+"*.elb.amazonaws.com\0"
+"net.az\0net.bj\0kitaaiki.nagano.jp\0"
+"lib.me.us\0"
+"net.bm\0loten.no\0k12.ak.us\0qcx.io\0"
+"net.bn\0"
 "net.bo\0"
-"hashimoto.wakayama.jp\0name.tj\0"
 "net.br\0"
 "net.bs\0"
-"net.bt\0sardegna.it\0discount\0*.ex.futurecms.at\0"
-"\xe7\xb5\x84\xe7\xbb\x87.hk\0"
-"haugiang.vn\0"
-"omachi.nagano.jp\0name.tr\0"
-"e164.arpa\0net.ci\0page\0serveftp.com\0"
-"net.bz\0name.tt\0blogspot.co.nz\0"
-"hakusan.ishikawa.jp\0user.webaccel.jp\0"
+"net.bt\0"
+"or.ci\0tv.na\0s3-accesspoint.dualstack.ap-southeast-2.amazonaws.com\0"
+"fakefur.jp\0to.md\0"
+"net.ci\0"
+"net.bz\0campidanomedio.it\0hakusan.ishikawa.jp\0kadogawa.miyazaki.jp\0"
+"healthcare\0"
 "net.cm\0"
-"net.cn\0"
-"net.co\0"
-"kumenan.okayama.jp\0nextdirect\0"
-"bentley\0"
-"lc.it\0verbania.it\0kakamigahara.gifu.jp\0"
-"net.cu\0recipes\0*.ocp.customer-oci.com\0"
-"g12.br\0numata.gunma.jp\0read\0"
-"net.cw\0"
-"net.cy\0webview-assets.cloud9.eu-west-2.amazonaws.com\0"
-"aland.fi\0press.se\0"
-"net.dm\0lexus\0"
-"kasuga.fukuoka.jp\0"
-"net.do\0meldal.no\0now\0"
-"crew.aero\0tksat.bo\0lutsk.ua\0"
+"net.cn\0homeunix.net\0"
+"nt.au\0net.co\0"
+"or.cr\0wodzislaw.pl\0jcb\0"
+"s3-website.ap-northeast-2.amazonaws.com\0"
+"ojiya.niigata.jp\0"
+"net.cu\0s3-accesspoint-fips.dualstack.ca-central-1.amazonaws.com\0operaunite.com\0"
+"net.cw\0lib.ks.us\0myactivedirectory.com\0"
+"net.cy\0"
+"asti.it\0"
+"nt.ca\0"
+"net.dm\0"
+"net.do\0"
+"sc.ke\0"
+"takata.fukuoka.jp\0ist\0"
 "net.ec\0"
-"romskog.no\0"
-"kashiwazaki.niigata.jp\0alp1.ae.flow.ch\0"
-"net.eg\0presse.km\0blogdns.org\0"
-"kyoto.jp\0"
-"gc.ca\0"
-"net.dz\0"
-"sch.wf\0"
-"kiwi\0online\0"
-"wales\0"
-"net.et\0linkyard.cloud\0"
-"nieruchomosci.pl\0fr-1.paas.massivegrid.net\0"
-"higashiagatsuma.gunma.jp\0"
-"nra\0"
-"net.fj\0tokushima.jp\0"
-"hotel.hu\0contractors\0kerryproperties\0"
-"net.fm\0"
-"ogawa.ibaraki.jp\0"
-"yokote.akita.jp\0wroc.pl\0"
-"obi\0"
-"\xe6\xb2\x96\xe7\xb8\x84.jp\0download\0"
-"spdns.de\0name.pm\0"
-"net.ge\0jondal.no\0s3.dualstack.ap-south-1.amazonaws.com\0dontexist.org\0"
-"kanzaki.saga.jp\0presse.ml\0tuyenquang.vn\0ma.leg.br\0"
-"net.gg\0name.qa\0"
-"name.pr\0"
-"caa.li\0"
-"higashikagura.hokkaido.jp\0ranzan.saitama.jp\0"
-"myftp.org\0"
+"s3.ap-south-1.amazonaws.com\0grozny.su\0"
+"edgeapp.net\0"
+"net.eg\0"
+"net.dz\0abr.it\0"
+"re.it\0kawajima.saitama.jp\0"
+"aurland.no\0"
+"okinawa.jp\0sc.kr\0"
+"giehtavuoatna.no\0"
+"tagawa.fukuoka.jp\0"
+"guovdageaidnu.no\0"
+"is-a-chef.org\0"
+"net.et\0malopolska.pl\0itv\0"
+"webhop.info\0"
+"nm.cn\0kimitsu.chiba.jp\0chungnam.kr\0"
+"nf.ca\0"
+"tobishima.aichi.jp\0kami.kochi.jp\0"
+"servebeer.com\0"
+"net.fj\0"
+"net.fm\0s3-accesspoint.us-east-2.amazonaws.com\0"
+"sc.ls\0"
+"hakuba.nagano.jp\0embaixada.st\0"
+"s3-ap-northeast-1.amazonaws.com\0"
+"wi.us\0webview-assets.cloud9.us-west-2.amazonaws.com\0"
+"azumino.nagano.jp\0"
+"net.ge\0"
+"kasuya.fukuoka.jp\0"
+"net.gg\0"
+"serveexchange.com\0"
+"re.kr\0fund\0"
 "net.gl\0"
-"q.bg\0discordsez.com\0"
-"net.gn\0pescara.it\0"
-"nrw\0"
-"net.gp\0ikeda.nagano.jp\0"
-"net.gr\0user.srcf.net\0"
-"net.gt\0dabur\0*.stg.dev\0"
-"net.gu\0kv\xc3\xa6nangen.no\0barsy.co.uk\0"
-"azure-mobile.net\0"
-"name.na\0"
-"hino.tottori.jp\0"
-"net.gy\0"
-"minamiawaji.hyogo.jp\0cheap\0"
-"net.hk\0\xd9\x85\xd9\x84\xd9\x8a\xd8\xb3\xd9\x8a\xd8\xa7\0"
-"abeno.osaka.jp\0name.mv\0"
-"name.ng\0pointto.us\0"
-"net.hn\0kawasaki.miyagi.jp\0"
-"plurinacional.bo\0name.my\0"
-"int.ar\0"
-"lacaixa\0"
-"genkai.saga.jp\0"
-"s\xc3\xb8rfold.no\0"
-"net.ht\0net.id\0mashiki.kumamoto.jp\0"
-"sch.zm\0"
-"tsurugashima.saitama.jp\0"
-"fl\xc3\xa5.no\0"
-"int.az\0"
-"fedje.no\0co.network\0"
-"net.il\0ntt\0"
-"int.bo\0casino.hu\0net.im\0"
-"net.in\0"
-"anamizu.ishikawa.jp\0edgecompute.app\0"
-"net.iq\0k12.fl.us\0"
-"net.ir\0florence.it\0shizukuishi.iwate.jp\0stargard.pl\0"
-"net.is\0aejrie.no\0"
-"net.je\0"
-"int.ci\0press.ma\0"
-"mg.gov.br\0"
-"cc.mo.us\0"
-"int.co\0localhost.daplie.me\0my-vigor.de\0"
-"\xd0\xb4\xd0\xb5\xd1\x82\xd0\xb8\0"
-"net.jo\0s3-ap-northeast-1.amazonaws.com\0"
-"shimokitayama.nara.jp\0"
-"aip.ee\0tiaa\0"
-"sowa.ibaraki.jp\0higashikurume.tokyo.jp\0"
-"int.cv\0otaki.saitama.jp\0"
-"higashiizumo.shimane.jp\0"
-"net.kg\0"
-"net.ki\0is-a-llama.com\0"
-"mitou.yamaguchi.jp\0onflashdrive.app\0*.build.run\0"
-"\xe6\xbb\x8b\xe8\xb3\x80.jp\0"
-"vs.mythic-beasts.com\0"
-"yoshioka.gunma.jp\0net.kn\0s3.pl-waw.scw.cloud\0"
-"net.la\0name.mk\0study\0"
-"net.lb\0"
-"net.lc\0ski.no\0lib.ar.us\0"
-"kitashiobara.fukushima.jp\0"
-"net.kw\0nittedal.no\0"
-"daegu.kr\0"
-"net.ky\0"
-"net.kz\0"
+"servecounterstrike.com\0"
+"net.gn\0omihachiman.shiga.jp\0"
+"net.gp\0ikaruga.nara.jp\0"
+"mo.cn\0net.gr\0"
+"net.gt\0fujioka.gunma.jp\0soka.saitama.jp\0"
+"net.gu\0translated.page\0grozny.ru\0lima.zone\0"
+"oguchi.aichi.jp\0"
+"execute-api.eu-central-2.amazonaws.com\0"
+"net.gy\0from-nv.com\0"
+"tv.sd\0gent\0"
+"net.hk\0"
+"otaru.hokkaido.jp\0rikuzentakata.iwate.jp\0"
+"\xe7\xb5\x84\xe7\xb9\x94.hk\0kommunalforbund.se\0jambyl.su\0"
+"net.hn\0vercel.app\0"
+"zama.kanagawa.jp\0"
+"or.id\0"
+"net.ht\0net.id\0pi.it\0shimamaki.hokkaido.jp\0"
+"emrstudio-prod.me-south-1.amazonaws.com\0"
+"yawara.ibaraki.jp\0"
+"rl.no\0from-id.com\0uber.space\0"
+"boats\0"
+"net.il\0umbria.it\0ferrara.it\0neustar\0"
+"net.im\0ut.us\0"
+"net.in\0kasamatsu.gifu.jp\0"
+"net.iq\0lanxess\0"
+"net.ir\0or.it\0"
+"net.is\0"
+"net.je\0spb.ru\0"
+"tv.tr\0"
+"courses\0"
+"namaste.jp\0simplesite.pl\0"
+"jio\0"
+"or.jp\0misawa.aomori.jp\0"
+"net.jo\0dvrcam.info\0read-books.org\0"
+"tv.tz\0"
+"kaita.hiroshima.jp\0ide.kyoto.jp\0"
+"or.ke\0oy.lc\0"
+"spb.su\0"
+"net.kg\0eidsvoll.no\0"
+"net.ki\0kpmg\0is-a-chef.com\0"
+"gotemba.shizuoka.jp\0"
+"resto.bj\0gifu.jp\0net.kn\0"
+"or.kr\0"
+"net.la\0"
+"lombardia.it\0net.lb\0"
+"net.lc\0v\xc3\xa5g\xc3\xa5.no\0su.paba.se\0"
+"net.kw\0"
+"fr-par-1.baremetal.scw.cloud\0"
+"net.ky\0ninja\0"
+"seirou.niigata.jp\0net.kz\0"
 "net.lk\0"
-"misato.akita.jp\0"
-"homeunix.org\0"
-"trentin-s\xc3\xbc""dtirol.it\0okaya.nagano.jp\0ibaraki.osaka.jp\0"
+"ogori.fukuoka.jp\0shinagawa.tokyo.jp\0"
+"kicks-ass.org\0"
+"tomisato.chiba.jp\0"
+"mcpe.me\0"
+"kagawa.jp\0kunitomi.miyazaki.jp\0"
 "net.ma\0"
-"net.lr\0"
-"net.ls\0"
-"name.jo\0net.me\0mosvik.no\0"
-"honai.ehime.jp\0net.lv\0reit\0"
-"feedback\0"
-"balsan-suedtirol.it\0uenohara.yamanashi.jp\0cloudapp.net\0"
+"fujisawa.iwate.jp\0net.lr\0"
+"net.ls\0lib.hi.us\0"
+"net.me\0"
+"net.lv\0zakopane.pl\0"
+"abiko.chiba.jp\0miki.hyogo.jp\0"
 "net.ly\0"
-"net.mk\0nyc\0"
-"shakotan.hokkaido.jp\0net.ml\0perma.jp\0"
-"laichau.vn\0"
-"net.mo\0"
-"bc.ca\0blogspot.co.za\0"
-"5.bg\0net.ms\0"
-"niihama.ehime.jp\0yatsushiro.kumamoto.jp\0net.mt\0"
+"jll\0"
+"net.mk\0"
+"net.ml\0s3-accesspoint.cn-northwest-1.amazonaws.com.cn\0"
+"net.mo\0or.na\0bievat.no\0land-4-sale.us\0"
+"firenze.it\0\xe3\x83\x9d\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88\0"
+"stange.no\0"
+"net.ms\0or.mu\0"
+"net.mt\0caravan\0"
 "net.mu\0"
-"!city.kitakyushu.jp\0net.mv\0net.nf\0"
-"net.mw\0net.ng\0"
-"net.mx\0"
-"net.my\0net.ni\0\xc4\x8d\xc3\xa1hcesuolo.no\0"
+"net.mv\0net.nf\0"
+"net.mw\0net.ng\0kvanangen.no\0"
+"mo.it\0net.mx\0ny-2.paas.massivegrid.net\0"
+"net.my\0net.ni\0"
 "net.mz\0"
-"medecin.km\0"
-"ebino.miyazaki.jp\0minato.tokyo.jp\0\xe0\xb8\xa3\xe0\xb8\xb1\xe0\xb8\x90\xe0\xb8\x9a\xe0\xb8\xb2\xe0\xb8\xa5.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"s\xc3\xb8mna.no\0tana.no\0"
-"trentino-sued-tirol.it\0shimamaki.hokkaido.jp\0intuit\0"
-"kimobetsu.hokkaido.jp\0"
-"ks.ua\0"
-"rel.ht\0net.nr\0jc.neen.it\0"
-"\xeb\x8b\xb7\xec\xbb\xb4\0"
-"pars\0api.gov.uk\0"
-"dnepropetrovsk.ua\0"
+"tran\xc3\xb8y.no\0"
+"taka.hyogo.jp\0"
+"naples.it\0jmp\0"
+"dell-ogliastra.it\0net.nr\0"
+"sc.ug\0"
+"takashima.shiga.jp\0"
+"s3.il-central-1.amazonaws.com\0mytabit.com\0"
+"sc.tz\0"
+"emrstudio-prod.ap-northeast-3.amazonaws.com\0"
+"jnj\0"
 "net.nz\0"
-"net.om\0"
-"ohi.fukui.jp\0"
-"net.pa\0east-kazakhstan.su\0"
-"ks.us\0"
-"net.pe\0"
-"sorocaba.br\0hiranai.aomori.jp\0"
-"hanno.saitama.jp\0net.ph\0"
-"own.pm\0"
-"net.pk\0cruise\0"
-"int.in\0net.pl\0"
-"net.pn\0"
-"fredrikstad.no\0gub.uy\0"
-"cloudycluster.net\0"
-"int.is\0net.qa\0"
-"tateyama.toyama.jp\0net.pr\0"
-"net.ps\0"
+"molde.no\0net.om\0studio.eu-west-3.sagemaker.aws\0"
+"njs.jelastic.vps-host.net\0"
+"sc.us\0"
+"haibara.shizuoka.jp\0"
+"net.pa\0"
+"bifuka.hokkaido.jp\0grajewo.pl\0"
+"delivery\0"
+"nes.buskerud.no\0net.pe\0"
+"wa.edu.au\0"
+"net.ph\0swidnik.pl\0"
+"nt.no\0"
+"net.pk\0news\0webview-assets.aws-cloud9.eu-west-2.amazonaws.com\0"
+"net.pl\0"
+"aisho.shiga.jp\0mielno.pl\0net.pn\0"
+"net.qa\0"
+"net.pr\0jot\0"
+"entertainment.aero\0net.ps\0"
 "net.pt\0"
-"hemsedal.no\0"
-"123website.nl\0"
-"sor-odal.no\0webview-assets.aws-cloud9.ap-south-1.amazonaws.com\0"
-"\xe5\xb2\xa1\xe5\xb1\xb1.jp\0"
+"or.pw\0independent-review.uk\0"
+"encr.app\0"
+"\xc3\xb8ystre-slidre.no\0pp.se\0joy\0pp.ru\0"
+"\xe7\x9f\xb3\xe5\xb7\x9d.jp\0"
 "net.py\0"
-"chosei.chiba.jp\0horokanai.hokkaido.jp\0"
-"tennis\0gitlab.io\0"
-"dyn-berlin.de\0"
-"kinokawa.wakayama.jp\0base.shop\0"
-"rent\0"
-"valer.hedmark.no\0blog\0pro.typeform.com\0"
-"nishiokoppe.hokkaido.jp\0"
-"k12.al.us\0"
-"nordkapp.no\0\xe0\xb0\xad\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\xa4\xe0\xb1\x8d\0hughes\0"
-"gonohe.aomori.jp\0"
-"one\0"
-"hashima.gifu.jp\0"
-"int.la\0ong\0"
-"net.sa\0"
-"des.br\0net.sb\0"
-"net.sc\0"
-"net.sd\0onl\0"
+"dontexist.org\0"
+"next\0sg-1.paas.massivegrid.net\0"
+"avocat.pro\0browsersafetymark.io\0"
+"hamburg\0mex.com\0filegear-jp.me\0jelastic.dogado.eu\0"
+"lc.it\0"
+"vall\xc3\xa9""e-aoste.it\0izumiotsu.osaka.jp\0"
+"nis.za\0*.backyards.banzaicloud.io\0"
+"trentino-s-tirol.it\0handcrafted.jp\0vip.jelastic.cloud\0mydissent.net\0"
+"hb.cldmail.ru\0"
+"sennan.osaka.jp\0"
+"\xed\x95\x9c\xea\xb5\xad\0"
+"hk.cn\0"
+"s3-accesspoint.dualstack.us-east-1.amazonaws.com\0"
+"ap-northeast-2.elasticbeanstalk.com\0"
+"higashichichibu.saitama.jp\0"
+"grong.no\0net.sa\0"
+"net.sb\0"
+"net.sc\0pp.ua\0"
+"net.sd\0cn-northwest-1.eb.amazonaws.com.cn\0lolitapunk.jp\0"
 "net.ru\0"
+"kamikoani.akita.jp\0kozaki.chiba.jp\0*.svc.firenet.ch\0"
 "net.rw\0net.sg\0"
-"net.sh\0berlin\0"
-"nt.au\0int.lk\0s\xc3\xb8ndre-land.no\0"
-"net.sl\0"
-"net.so\0in-brb.de\0""123website.lu\0"
-"trentino-stirol.it\0"
-"\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\x9f\0"
-"ibaraki.jp\0""2.azurestaticapps.net\0"
-"grane.no\0mo\xc3\xa5reke.no\0net.ss\0"
-"net.st\0"
-"nt.ca\0"
-"shimada.shizuoka.jp\0from-co.net\0"
-"kerryhotels\0ooo\0"
+"net.sh\0"
+"sex.hu\0safe\0"
+"konyvelo.hu\0"
+"net.sl\0clubmed\0"
+"filegear-gb.me\0"
+"net.so\0"
+"yanagawa.fukuoka.jp\0"
+"africa.com\0"
+"iwade.wakayama.jp\0"
+"net.ss\0"
+"obama.nagasaki.jp\0net.st\0"
+"andoy.no\0"
+"or.th\0"
+"nissedal.no\0paroch.k12.ma.us\0"
 "net.th\0"
-"net.sy\0pt.eu.org\0"
-"net.tj\0"
-"itoman.okinawa.jp\0"
-"net.tm\0uy.com\0"
-"ggf.br\0net.tn\0"
-"net.to\0"
-"cuneo.it\0schwarz\0"
+"nt.ro\0net.sy\0"
+"9guacu.br\0net.tj\0earth\0"
+"marnardal.no\0"
+"showa.gunma.jp\0"
+"net.tm\0lpages.co\0tcp4.me\0"
+"kanie.aichi.jp\0net.tn\0"
+"catholic.edu.au\0net.to\0"
+"est.pr\0*.bzz.dapps.earth\0"
 "net.ua\0"
-"from.hr\0net.tr\0"
-"s3.dualstack.eu-west-1.amazonaws.com\0"
-"olbiatempio.it\0int.mv\0net.tt\0"
-"int.mw\0sells-for-less.com\0"
-"int.ni\0net.tw\0"
-"mattel\0"
-"net.uk\0site.transip.me\0"
-"lindas.no\0in-dsl.de\0"
-"skiptvet.no\0"
-"tohnosho.chiba.jp\0"
-"simple-url.com\0"
-"higashi.fukushima.jp\0ustka.pl\0"
-"net.vc\0"
-"net.ve\0"
-"mil.ac\0"
-"mp.br\0cesena-forl\xc3\xac.it\0"
-"mil.ae\0net.uy\0net.vi\0"
-"mizumaki.fukuoka.jp\0rel.pl\0net.uz\0"
-"ibxos.it\0"
-"vagsoy.no\0xfinity\0"
-"\xe5\x9f\xbc\xe7\x8e\x89.jp\0net.vn\0"
-"org\0scholarships\0"
-"mil.al\0"
-"pay\0for-our.info\0"
-"v\xc3\xa5gs\xc3\xb8y.no\0cc.vt.us\0"
-"seoul.kr\0"
-"mil.ba\0net.vu\0"
-"mil.ar\0rest\0"
-"nog.community\0"
-"keisen.fukuoka.jp\0"
-"modelling.aero\0framer.media\0"
-"greta.fr\0chiyoda.tokyo.jp\0kurobe.toyama.jp\0jls-sto2.elastx.net\0"
-"st.no\0forgot.his.name\0"
-"mil.az\0klodzko.pl\0"
-"mobi\0"
-"shingu.hyogo.jp\0"
-"\xd0\xba\xd1\x80\xd1\x8b\xd0\xbc.\xd1\x80\xd1\x83\xd1\x81\0"
-"int.pt\0"
-"mil.bo\0net.ws\0taipei\0"
-"blue\0\xe6\xb8\xb8\xe6\x88\x8f\0"
-"mil.br\0"
-"aichi.jp\0"
-"ybo.science\0"
-"familyds.net\0"
-"mil.by\0"
-"turin.it\0uji.kyoto.jp\0imamat\0"
-"123hjemmeside.no\0"
-"mil.cl\0swidnica.pl\0"
-"lind\xc3\xa5s.no\0"
-"mil.cn\0seto.aichi.jp\0hamura.tokyo.jp\0definima.net\0"
-"mil.co\0"
-"net.ye\0"
-"tosa.kochi.jp\0"
-"moda\0"
-"holdings\0"
-"abira.hokkaido.jp\0"
-"ott\0"
-"mil.cy\0"
-"fukui.jp\0supabase.in\0"
-"yombo.me\0"
+"kamimine.saga.jp\0net.tr\0icurus.jp\0"
+"net.tt\0"
+"or.ug\0"
+"net.tw\0play\0"
+"or.tz\0"
+"mod.gi\0"
+"takamatsu.kagawa.jp\0"
+"net.uk\0"
+"oirase.aomori.jp\0"
+"blogdns.org\0"
+"or.us\0"
+"kraanghke.no\0net.vc\0"
+"hitra.no\0net.ve\0graphics\0\xe3\x82\xaf\xe3\x83\xa9\xe3\x82\xa6\xe3\x83\x89\0"
+"net.uy\0net.vi\0"
+"net.uz\0"
+"od.ua\0"
+"obama.fukui.jp\0jcloud.kz\0"
+"notebook.ap-northeast-2.sagemaker.aws\0"
+"net.vn\0nobushi.jp\0"
+"equipment.aero\0ok.us\0us.com\0"
+"krasnik.pl\0"
+"plc.ly\0s3-fips.dualstack.us-east-2.amazonaws.com\0"
+"minami.kyoto.jp\0"
+"net.vu\0"
+"kfh\0"
+"microlight.aero\0"
+"ju.mp\0"
+"tono.iwate.jp\0toba.mie.jp\0"
+"blogsyte.com\0"
+"higashiizu.shizuoka.jp\0"
+"\xe7\xa6\x8f\xe4\xba\x95.jp\0"
+"firestone\0"
+"umaji.kochi.jp\0"
+"net.ws\0"
+"now-dns.top\0"
+"supply\0"
+"itoman.okinawa.jp\0emrnotebooks-prod.cn-northwest-1.amazonaws.com.cn\0"
+"lib.ar.us\0publishproxy.com\0id.firewalledreplit.co\0"
+"trentinosudtirol.it\0"
+"nm.us\0guide\0"
+"oamishirasato.chiba.jp\0nogi.tochigi.jp\0"
+"s3-website.us-east-1.amazonaws.com\0"
+"priv.instances.scw.cloud\0"
+"is-a-caterer.com\0"
+"se.net\0ru.net\0"
+"net.ye\0murmansk.su\0"
+"does-it.net\0"
+"store\0s3.dualstack.ap-southeast-2.amazonaws.com\0"
+"sale\0unicom\0"
+"kia\0"
+"jor.br\0"
 "net.za\0"
-"kurume.fukuoka.jp\0osakasayama.osaka.jp\0ashikaga.tochigi.jp\0"
-"mil.do\0int.ru\0"
-"aogaki.hyogo.jp\0kasuga.hyogo.jp\0"
-"from-ms.com\0from-nc.com\0"
-"higashihiroshima.hiroshima.jp\0sennan.osaka.jp\0"
-"mil.ec\0"
-"pages.dev\0"
-"mil.eg\0pimienta.org\0dedyn.io\0"
-"pet\0"
-"net.zm\0"
-"nakagawa.hokkaido.jp\0miyazaki.miyazaki.jp\0tempurl.host\0"
-"ovh\0"
-"tips\0"
-"sakai.fukui.jp\0"
-"jx.cn\0nysa.pl\0int.tj\0"
-"cc.co.us\0"
+"emr.it\0"
+"overhalla.no\0mo.us\0"
+"arvo.network\0"
+"matsudo.chiba.jp\0warszawa.pl\0"
+"kim\0jpn.com\0"
+"molise.it\0tamba.hyogo.jp\0heavy.jp\0"
+"net.zm\0dance\0"
+"iglesiascarbonia.it\0yufu.oita.jp\0"
+"sex.pl\0"
+"execute-api.us-west-2.amazonaws.com\0"
+"kamiichi.toyama.jp\0mediatech.dev\0"
+"serveftp.com\0"
+"center\0"
+"noboribetsu.hokkaido.jp\0camau.vn\0"
+"higashihiroshima.hiroshima.jp\0eu.platform.sh\0"
+"narviika.no\0"
+"ote.bj\0"
+"bamble.no\0kustanai.ru\0"
+"ibigawa.gifu.jp\0""6.azurestaticapps.net\0"
+"ma.us\0s3-website.dualstack.eu-south-1.amazonaws.com\0"
+"kl\xc3\xa6""bu.no\0rauma.no\0"
+"land\0"
+"manaus.br\0ma.leg.br\0"
+"kvam.no\0"
+"ks.ua\0"
+"pharmaciens.km\0school.za\0kustanai.su\0xnbay.com\0"
+"tarnobrzeg.pl\0"
+"sar.it\0"
+"alpha.bounty-full.com\0"
+"mydrobo.com\0"
+"emrnotebooks-prod.ap-northeast-1.amazonaws.com\0"
+"kutchan.hokkaido.jp\0"
+"lcube-server.de\0"
+"kosai.shizuoka.jp\0"
+"ks.us\0"
+"sec.ps\0"
+"sanuki.kagawa.jp\0gsj.bz\0"
+"university\0"
+"kamikawa.hyogo.jp\0catfood.jp\0"
+"\xe0\xba\xa5\xe0\xba\xb2\xe0\xba\xa7\0"
+"omi.niigata.jp\0uk.primetel.cloud\0"
+"zara\0"
+"bearalvahki.no\0bplaced.com\0"
+"\xe5\x85\xac\xe7\x9b\x8a\0"
+"ggee\0"
+"trentino.it\0andriabarlettatrani.it\0forl\xc3\xac""cesena.it\0"
+"theater\0"
+"shichinohe.aomori.jp\0ayabe.kyoto.jp\0sandvikcoromant\0"
+"plc.uk\0"
+"hamura.tokyo.jp\0"
+"\xe7\xae\x87\xe4\xba\xba.hk\0emrappui-prod.us-east-2.amazonaws.com\0is-a-painter.com\0"
+"bmd.br\0soma.fukushima.jp\0"
+"de.gt\0"
+"\xe5\x95\x86\xe5\xba\x97\0"
+"tachikawa.tokyo.jp\0tabitorder.co.il\0"
+"habmer.no\0"
+"sarl\0"
+"homeunix.org\0"
+"kahoku.ishikawa.jp\0"
+"s3-object-lambda.eu-south-2.amazonaws.com\0spdns.org\0"
+"tranoy.no\0notebook.us-gov-west-1.sagemaker.aws\0"
+"mazowsze.pl\0"
+"cyon.link\0"
+"masaki.ehime.jp\0minato.tokyo.jp\0"
+"nagasu.kumamoto.jp\0"
+"is-an-artist.com\0twmail.org\0"
+"tochio.niigata.jp\0"
+"trentinos\xc3\xbc""dtirol.it\0"
+"kamo.kyoto.jp\0kpn\0"
+"\xd0\xba\xd0\xbe\xd0\xbc.\xd1\x80\xd1\x83\xd1\x81\0"
+"pl.eu.org\0"
+"is-a-chef.net\0"
+"cn.in\0valleedaoste.it\0kawanishi.hyogo.jp\0"
+"fuossko.no\0"
+"tokai.aichi.jp\0"
+"gs.vf.no\0"
+"cn.it\0"
+"cloud.nospamproxy.com\0"
+"avocat.fr\0"
+"ybo.trade\0"
+"krd\0lat\0"
+"cc.wy.us\0law\0"
+"kred\0"
+"medicina.bo\0"
+"save\0"
+"s3.nl-ams.scw.cloud\0"
+"\xe6\x95\x99\xe8\x82\xb2.hk\0rindal.no\0"
+"biz.bb\0tgory.pl\0"
+"biz.at\0"
+"blog\0"
+"conf.au\0"
+"\xd7\x99\xd7\xa9\xd7\x95\xd7\x91.\xd7\x99\xd7\xa9\xd7\xa8\xd7\x90\xd7\x9c\0bihar.in\0"
+"oracle\0"
+"biz.az\0"
+"\xd1\x80\xd1\x83\xd1\x81\0"
+"marketing\0"
+"ofunato.iwate.jp\0ureshino.mie.jp\0"
+"lotte\0webview-assets.cloud9.af-south-1.amazonaws.com\0de.ls\0"
+"de.md\0"
+"home.dyndns.org\0demo.datacenter.fi\0dscloud.mobi\0"
+"baria-vungtau.vn\0"
+"mosjoen.no\0"
+"bi.it\0\xe0\xb8\x97\xe0\xb8\xab\xe0\xb8\xb2\xe0\xb8\xa3.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0k8s.fr-par.scw.cloud\0"
+"lotto\0"
+"tokamachi.niigata.jp\0gehirn.ne.jp\0bookonline.app\0"
+"fidelity\0"
+"inabe.mie.jp\0nerima.tokyo.jp\0"
+"\xe7\xbd\x91\xe5\xba\x97\0"
+"rebun.hokkaido.jp\0"
+"takaharu.miyazaki.jp\0coolblog.jp\0"
+"\xd9\x85\xd9\x84\xd9\x8a\xd8\xb3\xd9\x8a\xd8\xa7\0"
+"laquila.it\0!city.kitakyushu.jp\0ayagawa.kagawa.jp\0"
+"cc.vt.us\0"
+"daito.osaka.jp\0vanguard\0"
+"lds\0"
+"ar.it\0"
+"frogn.no\0saxo\0"
+"biz.cy\0rollag.no\0aramco\0audible\0"
+"fh.se\0biz.dk\0"
+"udi.br\0"
+"is-leet.com\0"
+"v\xc3\xa5ler.hedmark.no\0"
+"nishiarita.saga.jp\0"
+"yusuhara.kochi.jp\0"
+"george\0"
+"independent-commission.uk\0"
+"verm\xc3\xb6gensberatung\0"
+"expert\0imdb\0"
+"varoy.no\0"
+"econo.bj\0biz.et\0murakami.niigata.jp\0"
+"furano.hokkaido.jp\0"
+"c66.me\0"
+"\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa7\0"
+"biz.fj\0koka.shiga.jp\0susono.shizuoka.jp\0"
+"media.aero\0\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa9\0svn-repos.de\0"
+"niimi.okayama.jp\0"
+"*.on-k3s.io\0"
+"ad.jp\0kita.tokyo.jp\0"
+"snillfjord.no\0hotels\0mel.cloudlets.com.au\0"
+"kherson.ua\0"
+"monster\0"
+"plus\0"
+"yawatahama.ehime.jp\0sayo.hyogo.jp\0"
+"austrheim.no\0"
+"cc.tx.us\0"
+"kawanishi.nara.jp\0biz.gl\0"
+"sanofi\0"
+"istanbul\0"
+"studio.me-south-1.sagemaker.aws\0resindevice.io\0"
+"izumi.osaka.jp\0"
+"blue\0"
+"homelinux.com\0"
+"aoki.nagano.jp\0"
+"analytics-gateway.us-west-2.amazonaws.com\0"
+"tara.saga.jp\0"
+"bostik\0"
+"ac.gov.br\0\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86.ir\0\xe9\x9d\x92\xe6\xa3\xae.jp\0"
+"accesscam.org\0"
+"biz.id\0"
+"hotel.tz\0"
+"s3-accesspoint-fips.dualstack.us-west-1.amazonaws.com\0"
+"is-a-teacher.com\0"
 "mizuho.tokyo.jp\0"
-"it.ao\0cruises\0net.eu.org\0"
-"mil.fj\0slupsk.pl\0"
-"from-mi.com\0"
-"campobasso.it\0takanezawa.tochigi.jp\0int.tt\0"
-"pages.wiardweb.com\0"
-"pioneer\0"
-"mil.ge\0"
-"donetsk.ua\0"
-"mil.gh\0sanjo.niigata.jp\0phd\0adobeaemcloud.net\0"
-"tx.us\0"
-"otaki.nagano.jp\0"
-"123website.be\0firewall-gateway.com\0"
-"\xe6\x9c\xba\xe6\x9e\x84\0"
-"ivgu.no\0"
-"presse.ci\0\xc3\xa5s.no\0int.ve\0customer.speedpartner.de\0"
-"mlbfan.org\0"
-"mihara.kochi.jp\0"
-"mil.gt\0miasta.pl\0"
-"fbxos.fr\0"
-"abruzzo.it\0monzabrianza.it\0int.vn\0pid\0"
-"jp.ngrok.io\0"
-"\xe0\xa8\xad\xe0\xa8\xbe\xe0\xa8\xb0\xe0\xa8\xa4\0"
+"loabat.no\0"
+"biz.in\0kagamiishi.fukushima.jp\0"
+"flight.aero\0s3-fips.dualstack.us-gov-east-1.amazonaws.com\0"
+"from-va.com\0"
+"sasayama.hyogo.jp\0"
+"matta-varjjat.no\0"
+"chieti.it\0*.sapporo.jp\0us.platform.sh\0"
+"r\xc3\xb8""d\xc3\xb8y.no\0"
+"shimoji.okinawa.jp\0"
+"championship.aero\0sor-fron.no\0"
+"ozu.ehime.jp\0"
+"*.eu-central-1.airflow.amazonaws.com\0"
+"16-b.it\0"
+"bet.ar\0hisayama.fukuoka.jp\0development.run\0"
+"daknong.vn\0nikita.jp\0"
+"is-with-theband.com\0"
+"ine.kyoto.jp\0kunitachi.tokyo.jp\0gangwon.kr\0"
+"donna.no\0llc\0"
+"emrappui-prod.af-south-1.amazonaws.com\0"
+"aguni.okinawa.jp\0nishi.osaka.jp\0"
+"biz.ki\0"
+"\xd8\xa8\xd8\xa7\xd8\xb1\xd8\xaa\0"
+"cn.ua\0"
+"campidano-medio.it\0"
+"de.us\0"
+"kikugawa.shizuoka.jp\0"
+"pizza\0"
+"imperia.it\0shinshiro.aichi.jp\0makurazaki.kagoshima.jp\0llp\0"
+"vard\xc3\xb8.no\0"
+"business.in\0emrnotebooks-prod.cn-north-1.amazonaws.com.cn\0"
+"flog.br\0bolzano.it\0memorial\0vercel.dev\0"
+"union.aero\0kristiansund.no\0yalta.ua\0"
+"nittedal.no\0vestre-slidre.no\0"
+"jls-sto3.elastx.net\0"
+"imamat\0"
+"biz.ls\0analytics-gateway.ap-southeast-1.amazonaws.com\0"
+"nakagawa.fukuoka.jp\0"
+"wolterskluwer\0"
+"s3-accesspoint.dualstack.eu-central-2.amazonaws.com\0"
+"sells-for-less.com\0"
+"gulen.no\0ezproxy.kuleuven.be\0"
+"toyono.osaka.jp\0yaizu.shizuoka.jp\0global.ssl.fastly.net\0"
+"cn.vu\0"
+"musica.ar\0"
+"namdalseid.no\0"
+"kawaue.gifu.jp\0takinoue.hokkaido.jp\0biz.mv\0zgora.pl\0"
+"qld.gov.au\0museum\0biz.mw\0skj\xc3\xa5k.no\0"
+"ato.br\0vlog.br\0"
+"cargo.aero\0biz.my\0biz.ni\0"
+"sosa.chiba.jp\0"
+"gs.of.no\0\xd1\x81\xd1\x80\xd0\xb1\0"
+"us-gov-west-1.elasticbeanstalk.com\0"
+"boston\0lol\0syncloud.it\0"
+"musica.bo\0"
+"abbvie\0s3-object-lambda.me-central-1.amazonaws.com\0"
+"utazu.kagawa.jp\0biz.nr\0barclaycard\0jetzt\0"
+"kerryhotels\0"
+"reg.dk\0"
+"is-into-anime.com\0"
+"choshi.chiba.jp\0aikawa.kanagawa.jp\0"
+"chitose.hokkaido.jp\0"
+"sagamihara.kanagawa.jp\0lpl\0"
+"cleaning\0immo\0is-a-llama.com\0"
+"ikawa.akita.jp\0"
+"ar.us\0base.ec\0"
+"hotel.lk\0cc.pr.us\0mydobiss.com\0"
+"kurume.fukuoka.jp\0"
+"4lima.de\0"
+"biz.pk\0"
+"mar.it\0biz.pl\0ath.cx\0"
+"unj\xc3\xa1rga.no\0"
+"gonohe.aomori.jp\0"
+"is-saved.org\0wixstudio.io\0"
+"man\0"
+"omotego.fukushima.jp\0biz.pr\0map\0"
+"ak.us\0mba\0"
+"taiki.mie.jp\0saga.saga.jp\0"
+"gok.pk\0theatre\0wanggou\0"
+"aomori.jp\0maison\0"
+"couchpotatofries.org\0"
+"kafjord.no\0"
+"tmp.br\0"
+"oirm.gov.pl\0"
+"treviso.it\0s3-website.cn-north-1.amazonaws.com.cn\0"
+"aejrie.no\0"
+"shiranuka.hokkaido.jp\0shima.mie.jp\0""4lima.at\0"
+"travinh.vn\0flt.cloud.muni.cz\0"
+"iserv.dev\0"
+"vega.no\0charity\0"
+"soundcast.me\0"
+"bplaced.net\0"
+"ltd\0"
+"hlx.page\0conf.se\0"
+"kuleuven.cloud\0"
+"t.bg\0auth.ap-northeast-3.amazoncognito.com\0"
+"4lima.ch\0"
+"cc.nv.us\0"
+"review\0"
+"biz.ss\0from-nj.com\0"
+"en-root.fr\0"
+"ggf.br\0med\0"
+"m.bg\0"
+"biz.tj\0edgecompute.app\0"
+"execute-api.eu-west-3.amazonaws.com\0"
+"tos.it\0"
+"groks-the.info\0is-a-green.com\0"
+"discover\0"
+"no-ip.info\0"
+"men\0"
+"hotel.hu\0eidfjord.no\0biz.ua\0"
+"biz.tr\0pharmacien.fr\0"
+"biz.tt\0tempurl.host\0"
+"f.bg\0"
+"tosu.saga.jp\0gonna.jp\0"
+"siracusa.it\0"
+"is-into-games.com\0"
+"cc.nh.us\0"
+"aseral.no\0"
+"is-very-nice.org\0"
+"naroy.no\0no.eu.org\0"
+"vagsoy.no\0"
+"app.br\0"
+"bargains\0whoswho\0pstmn.io\0"
+"oops.jp\0"
+"onavstack.net\0"
+"mg.leg.br\0"
+"legnica.pl\0biz.vn\0haiduong.vn\0"
+"kerryproperties\0"
+"inderoy.no\0"
+"samukawa.kanagawa.jp\0"
+"nose.osaka.jp\0biz.wf\0"
+"kr\xc3\xa5""anghke.no\0"
+"sayama.osaka.jp\0"
+"coupons\0js.org\0"
+"abkhazia.su\0"
+"motosu.gifu.jp\0"
+"blogdns.net\0"
+"rokunohe.aomori.jp\0"
+"construction\0hicam.net\0"
+"its.me\0"
+"g\xc3\xa1ls\xc3\xa1.no\0studio.eu-west-1.sagemaker.aws\0"
+"happou.akita.jp\0"
+"caa.aero\0booking\0"
+"tsk.tr\0"
+"airforce\0"
+"hokuto.yamanashi.jp\0"
+"emrstudio-prod.ap-southeast-2.amazonaws.com\0"
+"mil\0topaz.ne.jp\0"
+"aland.fi\0info\0"
+"otari.nagano.jp\0"
+"hida.gifu.jp\0"
+"smushcdn.com\0"
+"dnsking.ch\0"
+"\xe5\x98\x89\xe9\x87\x8c\xe5\xa4\xa7\xe9\x85\x92\xe5\xba\x97\0dynalias.com\0mypep.link\0"
+"mit\0"
+"apps.fbsbx.com\0"
+"nakagyo.kyoto.jp\0tainai.niigata.jp\0"
+"maebashi.gunma.jp\0"
+"emrappui-prod.ap-south-1.amazonaws.com\0"
+"nikolaev.ua\0studio.us-east-1.sagemaker.aws\0"
+"feste-ip.net\0"
+"bizen.okayama.jp\0gialai.vn\0"
+"etnedal.no\0lanbib.se\0"
+"film.hu\0"
+"\xe7\xbb\x84\xe7\xbb\x87\xe6\x9c\xba\xe6\x9e\x84\0"
+"nico\0"
+"tanagura.fukushima.jp\0"
+"biz.zm\0tatamotors\0"
+"\xd7\xa7\xd7\x95\xd7\x9d\0"
+"al.gov.br\0"
+"\xc3\xa5lg\xc3\xa5rd.no\0nesset.no\0"
+"chikuzen.fukuoka.jp\0consulado.st\0"
+"nesodden.no\0royken.no\0mydatto.com\0"
+"como.it\0mlb\0\xe5\x85\xab\xe5\x8d\xa6\0app.gp\0"
+"minamiechizen.fukui.jp\0auction\0mypsx.net\0"
+"5.bg\0servep2p.com\0"
+"yamanouchi.nagano.jp\0oshima.tokyo.jp\0\xd1\x81\xd0\xb0\xd0\xb9\xd1\x82\0"
+"k12.mt.us\0office\0endoftheinternet.org\0"
+"bygland.no\0"
+"scot\0"
+"gs.hm.no\0"
+"sasaguri.fukuoka.jp\0"
+"takahata.yamagata.jp\0"
+"aerodrome.aero\0jur.pro\0analytics-gateway.ap-northeast-2.amazonaws.com\0"
+"mma\0nz.eu.org\0"
+"lomo.jp\0"
+"mls\0"
+"parma.it\0kamijima.ehime.jp\0"
+"ueda.nagano.jp\0kumenan.okayama.jp\0"
+"glitch.me\0"
+"myjino.ru\0"
+"mantova.it\0okutama.tokyo.jp\0"
+"etajima.hiroshima.jp\0tottori.tottori.jp\0usercontent.jp\0"
+"barsy.club\0"
+"\xe9\xab\x98\xe7\x9f\xa5.jp\0kiwa.mie.jp\0"
+"fuel.aero\0varggat.no\0"
+"the.br\0oharu.aichi.jp\0dupont\0"
+"conf.lv\0"
+"auth.ap-southeast-3.amazoncognito.com\0"
+"ddns.net\0"
+"rennes\xc3\xb8y.no\0"
+"lavangen.no\0"
+"definima.io\0"
+"kviteseid.no\0"
+"forlicesena.it\0yuu.yamaguchi.jp\0sunnyday.jp\0"
+"ap-east-1.elasticbeanstalk.com\0"
+"amusement.aero\0moe\0"
+"yachiyo.chiba.jp\0"
+"moi\0drayddns.com\0"
+"homelinux.net\0"
+"accountants\0emrappui-prod.eu-central-1.amazonaws.com\0s3-accesspoint.dualstack.eu-west-3.amazonaws.com\0"
+"gift\0clerkstage.app\0privatelink.snowflake.app\0"
+"diamonds\0mom\0"
+"for-better.biz\0"
+"\xe5\x95\x86\xe6\xa5\xad.tw\0"
+"in-vpn.org\0"
+"qld.au\0ilovecollege.info\0"
+"santoandre.br\0"
+"mov\0cloudycluster.net\0"
+"komagane.nagano.jp\0"
+"*.ca-central-1.airflow.amazonaws.com\0"
+"tonosho.kagawa.jp\0"
+"giske.no\0"
+"cc.id.us\0"
+"ishikawa.okinawa.jp\0kotoura.tottori.jp\0nab\0"
+"tysvar.no\0"
+"weatherchannel\0"
+"echizen.fukui.jp\0rishirifuji.hokkaido.jp\0"
+"satosho.okayama.jp\0bambina.jp\0"
+"belluno.it\0"
+"masfjorden.no\0unjarga.no\0"
+"nowaruda.pl\0"
+"wiki.bo\0"
+"wajima.ishikawa.jp\0"
+"certmgr.org\0"
+"wiki.br\0quangninh.vn\0"
+"nba\0"
+"lombardy.it\0miyama.fukuoka.jp\0"
+"s3-fips.us-gov-east-1.amazonaws.com\0"
+"itoigawa.niigata.jp\0"
+"berlevag.no\0*.compute.estate\0"
+"inc.hk\0"
+"aju.br\0omi.nagano.jp\0"
+"atami.shizuoka.jp\0"
+"nike\0"
+"tsuruoka.yamagata.jp\0"
+"ddnss.org\0"
+"vxl.sh\0"
+"hdfcbank\0s3-website.ap-southeast-2.amazonaws.com\0"
+"yachimata.chiba.jp\0msd\0"
+"etne.no\0lib.vt.us\0firewall-gateway.de\0"
+"rsvp\0"
+"ris\xc3\xb8r.no\0"
+"kamioka.akita.jp\0"
+"*.landing.myjino.ru\0"
+"leg.br\0cricket\0"
+"slattum.no\0s3.dualstack.ap-northeast-2.amazonaws.com\0yali.mythic-beasts.com\0"
+"ritto.shiga.jp\0"
+"dyn.cosidns.de\0"
+"za.bz\0"
+"kasukabe.saitama.jp\0kwpsp.gov.pl\0"
+"nanae.hokkaido.jp\0"
+"pomorskie.pl\0"
+"joburg\0emrappui-prod.us-west-1.amazonaws.com\0analytics-gateway.eu-west-1.amazonaws.com\0"
+"yokaichiba.chiba.jp\0"
+"hemnes.no\0"
+"shimamoto.osaka.jp\0hamamatsu.shizuoka.jp\0minami.tokushima.jp\0tabuse.yamaguchi.jp\0bbs.tr\0mtn\0"
+"ferrari\0rogers\0"
+"narashino.chiba.jp\0tokuyama.yamaguchi.jp\0"
+"us-west-1.elasticbeanstalk.com\0"
+"mtr\0"
+"nec\0"
+"xz.cn\0"
+"t.se\0s3-website.me-central-1.amazonaws.com\0"
+"cc.ga.us\0"
+"s3.dualstack.eu-central-1.amazonaws.com\0iki.fi\0"
+"iwate.iwate.jp\0kanmaki.nara.jp\0"
+"spydeberg.no\0"
+"kawachinagano.osaka.jp\0london\0"
+"*.sys.qcx.io\0"
+"utashinai.hokkaido.jp\0"
+"airline.aero\0m.se\0s3-ap-northeast-2.amazonaws.com\0dontexist.com\0"
+"sorocaba.br\0tempioolbia.it\0taishi.hyogo.jp\0nonoichi.ishikawa.jp\0taketa.oita.jp\0net\0barefoot\0\xe5\x85\xac\xe5\x8f\xb8\0in.net\0"
+"control.aero\0godaddy\0new\0"
+"mj\xc3\xb8ndalen.no\0"
+"usa.oita.jp\0"
+"bremanger.no\0cherkassy.ua\0"
+"nfl\0"
+"co.technology\0"
+"lucania.it\0toda.saitama.jp\0"
+"groundhandling.aero\0f.se\0auth.eu-south-1.amazoncognito.com\0emrnotebooks-prod.ap-northeast-3.amazonaws.com\0"
+"fl\xc3\xa5.no\0hasura-app.io\0"
+"sytes.net\0"
+"lutsk.ua\0"
+"aip.ee\0"
+"tsu.mie.jp\0cloudaccess.net\0"
+"*.dweb.link\0"
+"emrnotebooks-prod.us-west-1.amazonaws.com\0s3-fips-us-gov-west-1.amazonaws.com\0"
+"kotohira.kagawa.jp\0chirurgiens-dentistes.fr\0"
+"ngo\0"
+"shakotan.hokkaido.jp\0"
+"lebesby.no\0meraker.no\0"
+"jessheim.no\0k\xc3\xa1r\xc3\xa1\xc5\xa1johka.no\0"
+"nhk\0sakuraweb.com\0"
+"kuokgroup\0"
+"dnsupdate.info\0"
+"ochi.kochi.jp\0"
+"taiki.hokkaido.jp\0"
+"tatsuno.hyogo.jp\0doshi.yamanashi.jp\0"
+"urayasu.chiba.jp\0"
+"trader.aero\0s3-us-west-1.amazonaws.com\0dyndns-at-work.com\0"
+"cri.br\0gdynia.pl\0"
+"l\xc3\xb8ten.no\0k12.ga.us\0"
+"tas.au\0tennis\0"
+"bofa\0"
+"inuyama.aichi.jp\0motoyama.kochi.jp\0"
+"\xe9\xa6\x99\xe6\xa0\xbc\xe9\x87\x8c\xe6\x8b\x89\0"
+"webhop.me\0"
+"zakarpattia.ua\0studio.ap-southeast-3.sagemaker.aws\0dagestan.ru\0"
+"miyazaki.jp\0"
+"\xd1\x83\xd0\xba\xd1\x80\0\xe3\x82\xb9\xe3\x83\x88\xe3\x82\xa2\0"
+"swiebodzin.pl\0"
+"fukushima.hokkaido.jp\0yoka.hyogo.jp\0nishinoshima.shimane.jp\0stargard.pl\0pohl\0"
+"is-into-cartoons.com\0"
+"readymade.jp\0"
+"ntdll.top\0"
 "gausdal.no\0"
-"raisa.no\0"
-"mil.hn\0lecco.it\0""123website.ch\0"
-"s3-website.eu-west-3.amazonaws.com\0"
-"pin\0"
-"blogspot.com.cy\0"
-"mil.id\0cutegirl.jp\0"
-"kitakami.iwate.jp\0ichiba.tokushima.jp\0"
-"gs.ol.no\0"
-"andria-trani-barletta.it\0coach\0"
-"s3.us-east-2.amazonaws.com\0"
-"imizu.toyama.jp\0"
-"off.ai\0community-pro.de\0"
-"mil.in\0shinkamigoto.nagasaki.jp\0"
-"schools.nsw.edu.au\0blogspot.com.ee\0"
-"ashibetsu.hokkaido.jp\0"
-"mil.iq\0blogspot.com.eg\0virtualuser.de\0"
-"otsu.shiga.jp\0"
-"misasa.tottori.jp\0"
-"webview-assets.aws-cloud9.ap-northeast-3.amazonaws.com\0"
-"sells-it.net\0"
-"s3.ap-south-1.amazonaws.com\0"
-"supabase.co\0"
-"shimofusa.chiba.jp\0blogspot.com.ar\0"
-"evje-og-hornnes.no\0"
-"kameyama.mie.jp\0"
-"mil.jo\0nt.no\0blogspot.com.au\0"
-"fukusaki.hyogo.jp\0"
-"higashi.fukuoka.jp\0"
-"mil.kg\0pccw\0"
-"valledaosta.it\0"
-"sor-varanger.no\0"
-"mediatech.dev\0"
-"blogspot.com.br\0"
-"mil.km\0"
-"as.us\0"
-"higashishirakawa.gifu.jp\0"
-"iwaki.fukushima.jp\0mil.kr\0"
-"fedorapeople.org\0blogspot.com.by\0"
-"asago.hyogo.jp\0"
-"swiss\0from-ga.com\0"
-"blogspot.com.co\0"
-"mil.kz\0cloudaccess.host\0"
-"trading\0"
-"medecin.fr\0quangngai.vn\0edu.krd\0"
-"certification.aero\0kvanangen.no\0co.business\0"
-"asker.no\0ox.rs\0"
-"mutsuzawa.chiba.jp\0dsmynas.net\0"
-"cargo.aero\0plc.ly\0"
-"is-an-anarchist.com\0"
-"choshi.chiba.jp\0sakyo.kyoto.jp\0mil.lv\0"
-"mil.mg\0pnc\0""123hjemmeside.dk\0"
-"ntr.br\0saku.nagano.jp\0"
-"from-mt.com\0from-nd.com\0"
-"satte.saitama.jp\0"
-"tsushima.aichi.jp\0"
-"shiksha\0we.bs\0temp-dns.com\0"
-"group.aero\0z.bg\0lib.ut.us\0"
-"mg.leg.br\0ynh.fr\0"
-"is-a-bruinsfan.org\0itcouldbewor.se\0"
-"mil.mv\0"
-"mil.ng\0"
-"skr.jp\0"
-"mil.my\0mil.ni\0"
-"minano.saitama.jp\0mil.mz\0"
-"democracia.bo\0"
-"lovepop.jp\0"
-"aaa.pro\0blogspot.com.es\0"
-"monza-e-della-brianza.it\0"
-"ed.ao\0mil.no\0nt.ro\0"
-"mamurogawa.yamagata.jp\0"
+"masuda.shimane.jp\0*.developer.app\0"
+"comsec\0"
+"engine.aero\0dagestan.su\0"
+"shimodate.ibaraki.jp\0saarland\0*.kunden.ortsinfo.at\0"
+"r\xc3\xb8st.no\0applinzi.com\0"
+"suwalki.pl\0"
+"vefsn.no\0cloudns.asia\0"
+"iwama.ibaraki.jp\0"
+"jp.ngrok.io\0"
+"is-certified.com\0"
+"urown.cloud\0"
+"s3-object-lambda.us-west-2.amazonaws.com\0"
+"pioneer\0"
+"knowsitall.info\0"
+"pages.it.hs-heilbronn.de\0"
+"matsusaka.mie.jp\0"
+"ltd.co.im\0"
+"olkusz.pl\0"
+"s3-accesspoint.il-central-1.amazonaws.com\0dynamic-dns.info\0"
+"leclerc\0"
+"mytis.ru\0"
+"doomdns.org\0"
+"\xe6\x9d\xb1\xe4\xba\xac.jp\0tenkawa.nara.jp\0"
+"salvador.br\0"
+"mordovia.su\0"
+"shitara.aichi.jp\0*.build.run\0"
+"execute-api.ap-south-2.amazonaws.com\0"
+"univ.bj\0"
+"auth.me-south-1.amazoncognito.com\0"
+"paragliding.aero\0tinn.no\0"
+"nishikatsura.yamanashi.jp\0seat\0eating-organic.net\0"
+"komatsu.ishikawa.jp\0"
+"fukuoka.jp\0"
 "vagan.no\0"
-"webview-assets.cloud9.ap-southeast-1.amazonaws.com\0"
-"uwu.ai\0"
-"naustdal.no\0"
-"mil.nz\0"
-"kitakata.fukushima.jp\0iwamizawa.hokkaido.jp\0kainan.wakayama.jp\0"
-"mat.br\0florist\0"
-"wellbeingzone.eu\0"
-"hoplix.shop\0"
-"f.bg\0lib.tx.us\0url.tw\0"
-"grong.no\0mil.pe\0"
-"moriguchi.osaka.jp\0"
-"s3.ap-northeast-2.amazonaws.com\0"
-"mil.ph\0norton\0bar0.net\0"
-"ed.ci\0bergen.no\0"
-"web.app\0"
-"bungoono.oita.jp\0mil.pl\0"
-"s\xc3\xb8r-fron.no\0cc.nh.us\0my-gateway.de\0"
-"\xe5\xaf\x8c\xe5\xb1\xb1.jp\0babyblue.jp\0"
-"withgoogle.com\0"
-"travinh.vn\0"
-"mil.qa\0od.ua\0living\0"
-"ed.cr\0"
-"telebit.app\0"
-"mil.py\0bnr.la\0"
-"nishi.fukuoka.jp\0"
-"kuroishi.aomori.jp\0"
-"events\0"
-"hashbang.sh\0"
-"vestre-slidre.no\0ap-northeast-1.elasticbeanstalk.com\0"
-"j.scaleforce.net\0"
-"pro\0za.com\0"
-"kerrylogistics\0"
-"kmpsp.gov.pl\0brother\0deci.jp\0"
-"pru\0pokrovsk.su\0"
-"journal.aero\0"
-"is.gov.pl\0pinb.gov.pl\0starostwo.gov.pl\0"
-"media.hu\0cc.md.us\0"
-"bialowieza.pl\0"
-"it1.eur.aruba.jenv-aruba.cloud\0"
-"cooking\0"
-"shiwa.iwate.jp\0"
-"\xe5\x85\xac\xe5\x8f\xb8.\xe9\xa6\x99\xe6\xb8\xaf\0mil.ru\0"
-"mil.rw\0*.user.fm\0"
-"mil.sh\0"
+"dnsupdater.de\0"
+"reggiocalabria.it\0"
+"motegi.tochigi.jp\0\xe0\xb2\xad\xe0\xb2\xbe\xe0\xb2\xb0\xe0\xb2\xa4\0"
+"\xe7\xbb\x84\xe7\xbb\x87.hk\0"
+"fbx-os.fr\0"
+"rana.no\0"
+"emrstudio-prod.cn-northwest-1.amazonaws.com.cn\0"
 "tm.cy\0"
-"r\xc3\xa5""de.no\0"
-"blogdns.net\0"
-"agrar.hu\0ardal.no\0"
-"kahoku.yamagata.jp\0""32-b.it\0from.tv\0"
-"repl.co\0"
-"mil.st\0camau.vn\0"
-"dyndns.dappnode.io\0"
-"lowicz.pl\0pub\0"
-"torahime.shiga.jp\0"
-"mil.sy\0"
-"tm.dz\0mil.tj\0"
-"kawazu.shizuoka.jp\0setagaya.tokyo.jp\0"
-"groundhandling.aero\0mil.tm\0"
-"*.elb.amazonaws.com.cn\0"
-"mil.to\0"
-"omigawa.chiba.jp\0saotome.st\0"
-"moto\0"
-"mil.tr\0"
-"archi\0"
-"gyeongbuk.kr\0wuoz.gov.pl\0"
-"plc.uk\0"
-"bulsan-sudtirol.it\0\xe5\xa5\x88\xe8\x89\xaf.jp\0hoabinh.vn\0"
-"mil.tw\0"
-"casacam.net\0"
-"tempio-olbia.it\0mil.tz\0"
-"bizen.okayama.jp\0"
-"123minsida.se\0"
-"varese.it\0management\0"
-"from-nm.com\0servegame.org\0"
-"tm.fr\0angiang.vn\0"
-"mil.vc\0"
-"\xe5\x85\xac\xe5\x8f\xb8.cn\0"
-"film.hu\0mil.ve\0"
-"*.bd\0"
-"pwc\0fastly-edge.com\0"
-"mil.uy\0fastvps.site\0"
-"yamaxun\0"
-"verran.no\0wmcloud.org\0"
-"sport\0"
-"shinyoshitomi.fukuoka.jp\0blogspot.com.mt\0"
-"user.party.eus\0glug.org.uk\0"
-"\xe5\x85\xac\xe5\x8f\xb8.hk\0blogspot.com.ng\0"
-"jampa.br\0va.it\0shinjo.yamagata.jp\0"
-"ah.cn\0higashichichibu.saitama.jp\0sener\0"
-"kh.ua\0"
-"oristano.it\0"
-"komvux.se\0daemon.panel.gg\0"
-"*.ck\0cherkasy.ua\0"
-"bolivia.bo\0"
-"ed.jp\0hidaka.saitama.jp\0maison\0"
-"telebit.io\0"
+"nasushiobara.tochigi.jp\0higashimurayama.tokyo.jp\0"
+"in.ngrok.io\0"
+"\xe6\x97\xb6\xe5\xb0\x9a\0"
+"arezzo.it\0"
+"\xe9\x9d\x99\xe5\xb2\xa1.jp\0"
+"yonago.tottori.jp\0pigboat.jp\0"
+"emrstudio-prod.ap-northeast-2.amazonaws.com\0"
+"\xd0\xbe\xd0\xb1\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0now\0*.amplifyapp.com\0"
+"nara.nara.jp\0"
+"tm.dz\0\xe9\xb3\xa5\xe5\x8f\x96.jp\0"
+"hjartdal.no\0"
+"sa.au\0"
+"clinique\0builtwithdark.com\0mordovia.ru\0"
+"mt.eu.org\0"
+"vevelstad.no\0"
+"sh.cn\0nanporo.hokkaido.jp\0"
+"misato.shimane.jp\0edgesuite-staging.net\0"
+"bitbucket.io\0"
+"liguria.it\0vi.it\0"
+"flor\xc3\xb8.no\0"
+"bond\0schokokeks.net\0"
+"hagebostad.no\0nra\0seek\0"
+"tm.fr\0cloudfront.net\0"
+"ownprovider.com\0"
+"app.os.fedoraproject.org\0"
+"sucks\0"
+"obi\0"
+"sa.cr\0vb.it\0"
+"yamagata.jp\0"
+"firewall-gateway.com\0"
+"wsa.gov.pl\0"
+"uk.in\0oyodo.nara.jp\0"
+"f\xc3\xb8rde.no\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xd8\xa9\0"
+"otoineppu.hokkaido.jp\0"
+"book\0nrw\0"
+"kudamatsu.yamaguchi.jp\0"
+"odawara.kanagawa.jp\0"
+"trentin-suedtirol.it\0tachiarai.fukuoka.jp\0"
+"jevnaker.no\0work\0"
+"ostroda.pl\0"
+"tt.im\0lib.ok.us\0"
+"takikawa.hokkaido.jp\0social\0"
 "tm.hu\0"
-"insurance\0"
-"vfs.cloud9.eu-west-2.amazonaws.com\0"
-"tainai.niigata.jp\0"
-"rocks\0"
-"quangtri.vn\0\xd0\xbc\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0\0"
-"consulting\0"
-"ishikawa.jp\0takino.hyogo.jp\0hirono.iwate.jp\0"
-"accident-prevention.aero\0eaton.mi.us\0"
-"mil.ye\0"
-"myactivedirectory.com\0"
-"takaharu.miyazaki.jp\0suwa.nagano.jp\0"
-"jogasz.hu\0"
-"fund\0blogspot.com.tr\0"
-"skjerv\xc3\xb8y.no\0"
-"farsund.no\0"
-"mil.za\0"
-"ong.br\0"
-"*.er\0"
-"even\xc3\xa1\xc5\xa1\xc5\xa1i.no\0u2-local.xnbay.com\0"
-"namegawa.saitama.jp\0media.pl\0"
-"hosting\0tashkent.su\0"
-"gent\0se.net\0ru.net\0"
-"*.fk\0tm.km\0eidsvoll.no\0mil.zm\0"
-"eastus2.azurestaticapps.net\0"
-"asn.au\0"
-"carboniaiglesias.it\0sharp\0"
-"eu-4.evennode.com\0"
-"author.aero\0orsites.com\0"
-"si.it\0"
-"mil.zw\0"
-"aquila.it\0bl.it\0curv.dev\0"
-"ringebu.no\0vfs.cloud9.ca-central-1.amazonaws.com\0"
-"va.no\0"
-"krokstadelva.no\0elasticbeanstalk.com\0"
-"friulivegiulia.it\0"
-"tm.mc\0"
-"tm.mg\0analytics-gateway.ap-northeast-1.amazonaws.com\0homesecuritymac.com\0"
-"miyashiro.saitama.jp\0"
-"club.tw\0"
-"kanuma.tochigi.jp\0"
-"netbank\0"
-"usuki.oita.jp\0"
-"map.fastlylb.net\0"
-"re.it\0"
-"infiniti\0"
-"frontier\0\xe5\xbe\xae\xe5\x8d\x9a\0"
-"cleverapps.io\0"
-"\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0\0"
-"miyoshi.aichi.jp\0"
-"tm.no\0tatamotors\0"
-"fh.se\0"
-"dyndns.biz\0"
-"ed.pw\0"
-"trysil.no\0"
-"r\xc3\xb8ros.no\0tinn.no\0delta\0"
-"sar.it\0"
-"wy.us\0*.alces.network\0"
-"tsushima.nagasaki.jp\0"
-"*.jm\0z.se\0we.tc\0"
-"k12.mn.us\0"
-"eu-3.evennode.com\0blogspot.com.uy\0"
-"sado.niigata.jp\0privatelink.snowflake.app\0"
-"re.kr\0limited\0"
-"kasukabe.saitama.jp\0"
-"cc.vi.us\0"
-"*.kh\0"
+"ud.it\0gojome.akita.jp\0kagamino.okayama.jp\0bialowieza.pl\0"
+"workinggroup.aero\0"
+"ravpage.co.il\0s3-website.fr-par.scw.cloud\0"
+"h\xc3\xb8ylandet.no\0"
+"uk.kg\0"
+"sakaki.nagano.jp\0"
+"porn\0"
+"mobara.chiba.jp\0akashi.hyogo.jp\0sakae.nagano.jp\0"
+"lego\0"
+"ntt\0"
+"risor.no\0"
+"ruhr\0"
+"deloitte\0"
+"cruises\0"
+"is-a-photographer.com\0"
+"cri.nz\0*.webpaas.ovh.net\0"
+"juegos\0"
+"valled-aosta.it\0sv.it\0weblike.jp\0"
+"post\0framer.app\0"
+"shibukawa.gunma.jp\0"
+"n\xc3\xb8tter\xc3\xb8y.no\0\xd9\x83\xd8\xa7\xd8\xab\xd9\x88\xd9\x84\xd9\x8a\xd9\x83\0ravendb.community\0"
+"mizusawa.iwate.jp\0"
+"badaddja.no\0"
+"shimada.shizuoka.jp\0"
+"firmdale\0al.eu.org\0"
+"kaneyama.yamagata.jp\0jozi.biz\0"
+"tm.km\0execute-api.us-gov-east-1.amazonaws.com\0"
+"energy\0"
+"so.it\0pepper.jp\0"
+"kv\xc3\xa6""fjord.no\0"
+"gotpantheon.com\0"
+"trieste.it\0\xd8\xb9\xd9\x85\xd8\xa7\xd9\x86\0"
+"yonabaru.okinawa.jp\0"
+"shiksha\0"
+"unusualperson.com\0"
+"hareid.no\0"
+"tm.mc\0jele.site\0"
+"gotdns.org\0"
+"tm.mg\0broadway\0"
+"nic.in\0"
+"ppg.br\0"
+"sa.it\0"
+"sakurai.nara.jp\0sakado.saitama.jp\0freeboxos.fr\0"
+"desa.id\0"
+"troitsk.su\0"
+"inawashiro.fukushima.jp\0"
+"economia.bo\0nannestad.no\0nyc\0"
+"ama.shimane.jp\0ricoh\0"
+"studio.cn-northwest-1.sagemaker.com.cn\0"
+"skjervoy.no\0"
+"is-a-hunter.com\0"
+"nishi.fukuoka.jp\0"
+"piacenza.it\0"
+"tm.no\0"
+"nombre.bo\0"
+"onjuku.chiba.jp\0"
+"s3-accesspoint.ap-east-1.amazonaws.com\0"
+"s3-accesspoint.dualstack.ca-central-1.amazonaws.com\0webview-assets.aws-cloud9.eu-north-1.amazonaws.com\0lenug.su\0"
+"science\0"
+"rc.it\0ybo.faith\0"
 "eun.eg\0"
-"ainan.ehime.jp\0tm.pl\0"
-"qc.com\0"
-"*.yokohama.jp\0inzai.chiba.jp\0yonaguni.okinawa.jp\0"
-"ivanovo.su\0obninsk.su\0"
-"soc.dz\0kitagawa.miyazaki.jp\0yasu.shiga.jp\0"
-"baidar.no\0grue.no\0q-a.eu.org\0"
-"homelink.one\0"
-"kunigami.okinawa.jp\0"
-"sanagochi.tokushima.jp\0"
-"roma.it\0yakumo.shimane.jp\0"
-"f.se\0cherkassy.ua\0"
-"\xe6\x84\x9b\xe7\x9f\xa5.jp\0"
-"rissa.no\0bir.ru\0"
-"kamiichi.toyama.jp\0"
-"comsec\0"
-"halden.no\0"
-"j\xc3\xb8rpeland.no\0software\0"
-"olayan\0"
-"*.mm\0tm.ro\0"
-"nishikata.tochigi.jp\0"
-"ah.no\0acct.pro\0tm.se\0allstate\0"
-"deno.dev\0"
-"rodeo\0"
-"polkowice.pl\0"
-"bauhaus\0"
-"shinjuku.tokyo.jp\0"
-"nsn.us\0"
-"tomi.nagano.jp\0"
-"my.id\0brindisi.it\0redirectme.net\0"
-"shari.hokkaido.jp\0kamiizumi.saitama.jp\0"
-"va.us\0"
-"jus.br\0*.np\0"
-"nesoddtangen.no\0aremark.no\0eu-2.evennode.com\0"
-"napoli.it\0"
-"pippu.hokkaido.jp\0"
-"mango\0"
-"far.br\0massacarrara.it\0higashimatsuyama.saitama.jp\0"
-"bofa\0"
-"togane.chiba.jp\0goshiki.hyogo.jp\0"
-"homebuilt.aero\0"
-"pgafan.net\0omg.lol\0"
-"commune.am\0sling\0"
-"forl\xc3\xac-cesena.it\0izunokuni.shizuoka.jp\0"
-"valdaosta.it\0red\0"
-"fitjar.no\0*.pg\0"
-"physio\0"
-"pavia.it\0omura.nagasaki.jp\0"
-"s3-ap-southeast-2.amazonaws.com\0"
-"lel.br\0ren\0"
-"maintenance.aero\0"
-"paroch.k12.ma.us\0hobby-site.org\0jcloud-ver-jpc.ik-server.com\0"
-"izu.shizuoka.jp\0"
-"s3-website-sa-east-1.amazonaws.com\0"
-"me.in\0lezajsk.pl\0"
-"bentre.vn\0"
-"wien.funkfeuer.at\0hiho.jp\0"
-"lu.it\0me.it\0ina.nagano.jp\0asn.lv\0"
-"skype\0"
-"cnt.br\0"
-"pila.pl\0"
-"plumbing\0"
-"sjc.br\0"
-"airkitapps.eu\0is-a-rockstar.com\0"
-"engine.aero\0"
-"j.scaleforce.com.cy\0"
-"investments\0""12hp.de\0"
-"me.ke\0"
-"kashiwara.osaka.jp\0"
-"eu-1.evennode.com\0"
-"press\0"
-"soc.lk\0lib.wy.us\0dontexist.com\0"
-"familyds.org\0"
-"g\xc3\xa1\xc5\x8bgaviika.no\0"
-"koya.wakayama.jp\0"
-"0e.vc\0servepics.com\0"
-"nome.cv\0"
-"he.cn\0"
-"cafjs.com\0"
-"koshu.yamanashi.jp\0"
-"elementor.cool\0"
-"mex.com\0"
-"minamiizu.shizuoka.jp\0""12hp.at\0"
-"voss.no\0"
-"ril\0"
-"tm.za\0"
-"sampa.br\0shibukawa.gunma.jp\0"
-"rio\0forgot.her.name\0"
-"takinoue.hokkaido.jp\0tonami.toyama.jp\0yamanashi.yamanashi.jp\0rip\0"
-"tokuyama.yamaguchi.jp\0"
-"hayakawa.yamanashi.jp\0better-than.tv\0"
-"hitachiota.ibaraki.jp\0"
-"tickets\0"
-"campania.it\0"
-"mantova.it\0"
-"x0.com\0"
-"enf.br\0haboro.hokkaido.jp\0""12hp.ch\0"
-"nsw.au\0stathelle.no\0"
-"aizuwakamatsu.fukushima.jp\0"
-"*.in.futurecms.at\0"
-"fukushima.fukushima.jp\0ikoma.nara.jp\0"
-"journalist.aero\0"
-"wroclaw.pl\0"
-"koga.ibaraki.jp\0"
-"sanofi\0"
-"\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0supabase.net\0"
-"workers.dev\0"
-"realtor\0"
-"o.bg\0k12.wa.us\0"
-"*.svc.firenet.ch\0"
-"ric.jelastic.vps-host.net\0"
-"\xd8\xb3\xd9\x88\xd8\xaf\xd8\xa7\xd9\x86\0bond\0"
-"s3-eu-west-3.amazonaws.com\0"
-"jorpeland.no\0"
-"hasami.nagasaki.jp\0"
-"translate.goog\0"
-"reliance\0"
-"tv.bb\0"
-"square7.net\0"
-"anan.nagano.jp\0olsztyn.pl\0"
-"tv.bo\0name\0book\0"
-"chowder.jp\0"
-"tv.br\0"
-"shouji\0us-east-2.elasticbeanstalk.com\0"
-"ohtawara.tochigi.jp\0\xd8\xa7\xd8\xa8\xd9\x88\xd8\xb8\xd8\xa8\xd9\x8a\0"
-"rendalen.no\0webview-assets.aws-cloud9.ap-southeast-2.amazonaws.com\0"
-"friuli-v-giulia.it\0"
-"l\xc3\xa6rdal.no\0"
-"aioi.hyogo.jp\0kotohira.kagawa.jp\0"
-"\xe4\xb8\xad\xe4\xbf\xa1\0"
-"diadem.cloud\0"
-"kitaaiki.nagano.jp\0"
-"ivory.ne.jp\0"
-"sardinia.it\0"
-"nyuzen.toyama.jp\0"
-"\xe4\xb8\xaa\xe4\xba\xba.hk\0"
-"fuchu.tokyo.jp\0on-the-web.tv\0"
-"psi.br\0jozi.biz\0"
-"iwade.wakayama.jp\0kawanishi.yamagata.jp\0\xe0\xb2\xad\xe0\xb2\xbe\xe0\xb2\xb0\xe0\xb2\xa4\0"
-"pl.eu.org\0"
-"modalen.no\0*.cloudera.site\0"
-"aeroclub.aero\0\xc3\xa1lt\xc3\xa1.no\0bloxcms.com\0my-wan.de\0"
-"unnan.shimane.jp\0"
-"me.so\0tattoo\0"
-"tajimi.gifu.jp\0tonkotsu.jp\0"
-"foundation\0"
-"me.ss\0vote\0me.tc\0"
+"shiftcrypto.dev\0"
 "engineer.aero\0"
-"anani.br\0sosa.chiba.jp\0"
-"tananger.no\0"
-"natal.br\0"
-"transporte.bo\0"
-"nakai.kanagawa.jp\0morotsuka.miyazaki.jp\0rgr.jp\0"
-"cc.ky.us\0voto\0"
-"oga.akita.jp\0"
-"hanamaki.iwate.jp\0"
-"ggee\0zappos\0"
-"\xe7\xb6\xb2\xe7\xbb\x9c.hk\0"
-"sap\0"
-"suedtirol.it\0me.tz\0rich\0"
-"equipment.aero\0me.uk\0sas\0vfs.cloud9.ap-southeast-1.amazonaws.com\0"
-"ryugasaki.ibaraki.jp\0"
-"gs.hm.no\0uzhgorod.ua\0serveirc.com\0"
-"sbi\0"
-"me.us\0"
-"3.bg\0"
-"hioki.kagoshima.jp\0"
-"benevento.it\0ibigawa.gifu.jp\0"
-"sca\0"
-"urawa.saitama.jp\0scb\0"
+"eti.br\0"
+"cim.br\0"
+"emrappui-prod.us-west-2.amazonaws.com\0my.eu.org\0*.frusky.de\0"
+"kosuge.yamanashi.jp\0bc.platform.sh\0"
+"nantan.kyoto.jp\0"
+"tadaoka.osaka.jp\0tm.pl\0"
+"homelinux.org\0"
+"kitagawa.miyazaki.jp\0"
+"pescara.it\0"
+"vodka\0"
+"sphinx.mythic-beasts.com\0"
+"pu.it\0fashionstore.jp\0"
+"honai.ehime.jp\0"
+"firebaseapp.com\0"
+"hu.com\0"
+"karasuyama.tochigi.jp\0staba.jp\0"
+"redstone\0"
+"muko.kyoto.jp\0"
+"webview-assets.cloud9.me-south-1.amazonaws.com\0"
+"angiang.vn\0"
+"pn.it\0cloudapps.digital\0"
+"iwafune.tochigi.jp\0"
+"pg.in\0"
+"vi.us\0"
+"tm.ro\0execute-api.us-east-1.amazonaws.com\0vladimir.su\0"
+"pg.it\0"
+"yachts\0"
+"ibaraki.ibaraki.jp\0"
+"tm.se\0one\0"
+"ichinomiya.aichi.jp\0kita.osaka.jp\0"
+"ong\0zero\0"
+"mytabit.co.il\0"
+"emrnotebooks-prod.ap-east-1.amazonaws.com\0"
+"emrappui-prod.us-east-1.amazonaws.com\0geekgalaxy.com\0"
+"onl\0"
+"\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0\0"
+"tokushima.jp\0kayabe.hokkaido.jp\0supersale.jp\0"
+"lib.id.us\0webview-assets.cloud9.ca-central-1.amazonaws.com\0"
+"univ.sn\0"
+"uy.com\0"
+"dvag\0"
+"independent-panel.uk\0"
+"moka.tochigi.jp\0"
+"ooo\0pleskns.com\0"
+"from-ia.com\0"
+"\xe3\x82\xb3\xe3\x83\xa0\0"
+"recreation.aero\0"
+"yokote.akita.jp\0sakegawa.yamagata.jp\0user.aseinet.ne.jp\0"
+"s3.dualstack.ap-south-2.amazonaws.com\0"
+"alto-adige.it\0amazon\0"
+"wakasa.tottori.jp\0"
+"iris.arpa\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xdb\x83\0vladimir.ru\0"
+"groks-this.info\0nl.eu.org\0"
+"olsztyn.pl\0"
+"us-gov-east-1.elasticbeanstalk.com\0nyan.to\0"
+"fhv.se\0"
+"s3-object-lambda.eu-west-3.amazonaws.com\0webview-assets.aws-cloud9.ap-northeast-1.amazonaws.com\0"
+"repl.co\0"
+"iizuna.nagano.jp\0"
+"higashimatsuyama.saitama.jp\0"
+"ac\0is-slick.com\0"
+"ad\0osasco.br\0js.cn\0"
+"ae\0\xe7\xbd\x91\xe7\xb5\xa1.hk\0"
+"af\0ogimi.okinawa.jp\0"
+"ag\0"
+"mt.it\0"
+"ai\0org\0filegear-de.me\0"
+"yamagata.ibaraki.jp\0"
+"pay\0s3-accesspoint.eu-south-1.amazonaws.com\0"
+"al\0kouyama.kagoshima.jp\0"
+"am\0jele.io\0"
+"tanohata.iwate.jp\0"
+"ao\0shw.io\0"
+"aq\0ba\0*.eu-west-3.airflow.amazonaws.com\0"
+"ar\0bb\0jl.cn\0"
+"as\0cloudflare-ipfs.com\0"
+"at\0recife.br\0kisosaki.mie.jp\0"
+"au\0be\0"
+"bf\0nic.tj\0"
+"aw\0bg\0"
+"ax\0bh\0"
+"bi\0"
+"az\0bj\0inami.toyama.jp\0"
+"oji.nara.jp\0"
+"bm\0divtasvuodna.no\0s3.ap-east-1.amazonaws.com\0"
+"bn\0for-the.biz\0"
+"bo\0"
+"in-vpn.net\0"
+"ca\0zapto.org\0"
+"br\0"
+"bs\0cc\0klabu.no\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\xe0\xa4\xae\xe0\xa5\x8d\0forsale\0"
+"bt\0cd\0"
+"bv\0cf\0direct.quickconnect.cn\0"
+"bw\0cg\0nhs.uk\0s3-accesspoint-fips.us-east-2.amazonaws.com\0"
+"ch\0"
+"by\0ci\0"
+"bz\0yamagata.yamagata.jp\0"
+"s3-ap-east-1.amazonaws.com\0"
+"cl\0ota.gunma.jp\0ninomiya.kanagawa.jp\0dunlop\0"
+"cm\0is-an-actor.com\0"
+"cn\0heguri.nara.jp\0"
+"co\0athleta\0swiss\0"
+"aizubange.fukushima.jp\0gyeongnam.kr\0s3.dualstack.cn-north-1.amazonaws.com.cn\0"
+"parachuting.aero\0s3-accesspoint.eu-central-2.amazonaws.com\0"
+"cr\0lo.it\0isla.pr\0"
+"flatanger.no\0tm.za\0n4t.co\0""123kotisivu.fi\0"
+"fujiidera.osaka.jp\0"
+"cu\0de\0dnsalias.com\0"
+"cv\0ott\0*.dapps.earth\0wpmudev.host\0"
+"cw\0*.compute.amazonaws.com\0"
+"cx\0"
+"cy\0"
+"cz\0dj\0joboji.iwate.jp\0matsubushi.saitama.jp\0"
+"dk\0acct.pro\0"
+"goto.nagasaki.jp\0"
+"dm\0hol.no\0is-a-musician.com\0"
+"mishima.fukushima.jp\0"
+"do\0grimstad.no\0auth.us-east-2.amazoncognito.com\0"
+"sexy\0*.azurecontainer.io\0"
+"chofu.tokyo.jp\0"
+"ec\0"
+"ee\0condos\0"
+"hirosaki.aomori.jp\0binhdinh.vn\0pet\0"
+"eg\0lib.fl.us\0"
+"internet.in\0kawanabe.kagoshima.jp\0mihara.kochi.jp\0"
+"claims\0shopping\0"
+"dz\0gouv.fr\0!city.yokohama.jp\0ovh\0"
+"tsukiyono.gunma.jp\0"
+"dattorelay.com\0"
+"augustow.pl\0"
+"es\0ng.eu.org\0"
+"eng.br\0et\0shunan.yamaguchi.jp\0vinhphuc.vn\0"
+"eu\0evje-og-hornnes.no\0eu.com\0is-uberleet.com\0"
+"caserta.it\0"
+"hi.cn\0"
+"fi\0"
+"fj\0meiwa.mie.jp\0"
+"fm\0studio.us-gov-east-1.sagemaker.aws\0"
+"fo\0lelux.site\0loginline.site\0"
+"snowflake.app\0"
+"ga\0"
+"emp.br\0fr\0gb\0"
+"*.customer-oci.com\0"
+"gd\0"
+"ge\0mykolaiv.ua\0"
+"hb.cn\0gf\0phd\0"
+"gg\0"
+"gh\0wazuka.kyoto.jp\0myfast.host\0nodes.k8s.nl-ams.scw.cloud\0"
+"gi\0\xc3\xa1laheadju.no\0"
+"gl\0gouv.ht\0"
+"gm\0halsa.no\0l\xc3\xa6rdal.no\0nic.za\0"
+"gn\0final\0"
+"barsycenter.com\0"
+"gp\0edgekey-staging.net\0"
+"gq\0lib.dc.us\0"
+"gr\0"
+"gs\0flekkefjord.no\0"
+"gt\0nakama.fukuoka.jp\0"
+"gu\0"
+"pid\0"
+"gw\0"
+"pussycat.jp\0"
+"gy\0auth-fips.us-west-2.amazoncognito.com\0"
+"trentino-sudtirol.it\0"
+"hk\0"
+"hm\0from-sc.com\0"
+"hn\0watari.miyagi.jp\0"
+"emrnotebooks-prod.eu-north-1.amazonaws.com\0"
+"pin\0"
+"gd.cn\0hr\0komoro.nagano.jp\0"
+"cafe\0viajes\0"
+"fm.br\0ht\0id\0"
+"hu\0ie\0"
+"higashi.fukuoka.jp\0"
+"alaheadju.no\0"
+"execute-api.ap-southeast-2.amazonaws.com\0"
+"il\0"
+"im\0lib.ca.us\0"
+"in\0"
+"io\0"
+"gouv.ci\0iq\0"
+"ir\0toyota.aichi.jp\0\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0*.code.run\0"
+"is\0"
+"it\0"
+"je\0singles\0"
+"omasvuotna.no\0"
+"meiwa.gunma.jp\0ina.ibaraki.jp\0"
+"cupcake.is\0"
+"tosashimizu.kochi.jp\0"
+"webview-assets.cloud9.ap-south-1.amazonaws.com\0"
+"toei.aichi.jp\0okoppe.hokkaido.jp\0noda.iwate.jp\0"
+"dnipropetrovsk.ua\0ny.us\0"
+"nodes.k8s.fr-par.scw.cloud\0"
+"jo\0study\0"
+"jp\0yasugi.shimane.jp\0"
+"br\xc3\xb8nn\xc3\xb8y.no\0"
+"s3-object-lambda.ap-southeast-1.amazonaws.com\0"
+"ke\0lillesand.no\0"
+"kg\0"
+"ki\0"
+"notebook.ap-southeast-4.sagemaker.aws\0homeunix.com\0"
+"km\0quicksytes.com\0"
+"kn\0"
+"servepics.com\0"
+"kp\0"
+"la\0"
+"\xd7\x90\xd7\xa7\xd7\x93\xd7\x9e\xd7\x99\xd7\x94.\xd7\x99\xd7\xa9\xd7\xa8\xd7\x90\xd7\x9c\0kr\0lb\0gotdns.ch\0"
+"lc\0sochi.su\0"
+"kw\0media\0reservd.com\0"
+"shiroi.chiba.jp\0"
+"ky\0li\0"
+"otaki.saitama.jp\0kz\0"
+"!www.ck\0lk\0loppa.no\0stj\xc3\xb8rdal.no\0"
+"plo.ps\0"
+"ma\0"
+"goiania.br\0lr\0"
+"ls\0mc\0from-il.com\0"
+"\xe6\xb2\x96\xe7\xb8\x84.jp\0sarufutsu.hokkaido.jp\0lt\0md\0west1-us.cloudjiffy.net\0"
+"lu\0me\0pnc\0"
+"lv\0omg.lol\0"
+"mg\0mt.us\0nd.us\0s3-accesspoint.dualstack.eu-central-1.amazonaws.com\0"
+"agano.niigata.jp\0mh\0"
+"ly\0"
+"shinonsen.hyogo.jp\0"
+"mk\0"
+"gr.it\0ml\0uh-oh.jp\0"
+"galsa.no\0sirdal.no\0"
+"mn\0"
+"mo\0"
+"kamiamakusa.kumamoto.jp\0mp\0""123homepage.it\0"
+"mq\0na\0in.na\0lv.ua\0analytics-gateway.ap-southeast-2.amazonaws.com\0"
+"mr\0"
+"ms\0nc\0"
+"yoshida.saitama.jp\0mt\0weather\0"
+"mu\0ne\0mus.mi.us\0*.ap-southeast-1.airflow.amazonaws.com\0s3-website.dualstack.ca-central-1.amazonaws.com\0"
+"mv\0nf\0"
+"mw\0ng\0"
+"gr.jp\0honjo.saitama.jp\0mx\0githubpreview.dev\0"
+"my\0ni\0in.ni\0"
+"mz\0"
+"group.aero\0krodsherad.no\0investments\0s3-external-1.amazonaws.com\0folionetwork.site\0"
+"nl\0"
+"onga.fukuoka.jp\0"
+"no\0"
+"lib.ak.us\0"
+"minato.osaka.jp\0nr\0"
+"kimobetsu.hokkaido.jp\0"
+"nu\0auth.eu-west-1.amazoncognito.com\0s3.dualstack.eu-north-1.amazonaws.com\0"
+"kasai.hyogo.jp\0"
+"gjemnes.no\0webview-assets.cloud9.us-east-2.amazonaws.com\0"
+"\xe7\xb6\xb2\xe7\xbb\x9c.hk\0freemyip.com\0"
+"tomigusuku.okinawa.jp\0nz\0call\0lgbt\0blackbaudcdn.net\0"
+"sigdal.no\0"
+"om\0lpusercontent.com\0"
+"uji.kyoto.jp\0""2.azurestaticapps.net\0"
+"pa\0"
+"v\xc3\xa6r\xc3\xb8y.no\0pymnt.uk\0"
+"pe\0"
+"fm.it\0pf\0"
+"ph\0"
+"pk\0"
+"pl\0chirurgiens-dentistes-en-france.fr\0"
+"design.aero\0pm\0"
+"pn\0camp\0"
+"qa\0servemp3.com\0"
+"vald-aosta.it\0pr\0"
+"ps\0webthings.io\0"
+"pt\0"
+"lancaster\0akamaiedge.net\0goupile.fr\0"
+"pw\0miniserver.com\0"
+"py\0"
+"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x86\0vapor.cloud\0"
+"trentinoaadige.it\0podhale.pl\0"
+"org.ac\0tingvoll.no\0la.us\0"
+"org.ae\0shacknet.nu\0"
+"org.af\0keliweb.cloud\0"
+"org.ag\0pro\0"
+"org.ai\0emb.kw\0"
+"re\0"
+"org.al\0"
+"org.am\0pru\0"
+"kazo.saitama.jp\0\xe0\xaa\xad\xe0\xaa\xbe\xe0\xaa\xb0\xe0\xaa\xa4\0"
+"org.ba\0"
+"org.ar\0org.bb\0ragusa.it\0"
+"s\xc3\xb8r-fron.no\0"
+"kochi.jp\0"
+"org.au\0ro\0"
+"gujo.gifu.jp\0\xeb\x8b\xb7\xec\xbb\xb4\0"
+"sa\0"
+"org.bh\0sb\0verse.jp\0"
+"org.bi\0fuoisku.no\0rs\0in.rs\0sc\0"
+"org.az\0org.bj\0sd\0"
+"ru\0se\0"
+"org.bm\0rw\0sg\0ae.org\0jdevcloud.com\0"
+"org.bn\0coop.ht\0sh\0"
+"org.bo\0si\0notebook.ap-east-1.sagemaker.aws\0"
+"mamurogawa.yamagata.jp\0sj\0"
+"sk\0youtube\0"
+"org.br\0otaki.chiba.jp\0usuki.oita.jp\0sl\0"
+"org.bs\0osen.no\0sm\0"
+"org.bt\0sn\0"
+"so\0game-host.org\0rackmaze.com\0reservd.dev.thingdust.io\0"
+"org.bw\0dynns.com\0"
+"coop.in\0sr\0her.jp\0"
+"org.ci\0ss\0tc\0"
+"org.bz\0kiyama.saga.jp\0st\0td\0pub\0"
+"su\0dvrdns.org\0"
+"coop.ar\0sv\0tf\0"
+"tg\0*.sch.uk\0readthedocs.io\0direct.quickconnect.to\0"
+"org.cn\0sx\0th\0in.th\0"
+"ab.ca\0org.co\0sy\0"
+"\xe5\xb2\x90\xe9\x98\x9c.jp\0fujinomiya.shizuoka.jp\0sz\0tj\0"
+"tk\0execute-api.eu-west-2.amazonaws.com\0s3-accesspoint.dualstack.us-west-2.amazonaws.com\0"
+"cz.it\0yakage.okayama.jp\0tl\0"
+"tm\0"
+"ulsan.kr\0tn\0"
+"research.aero\0org.cu\0to\0"
+"org.cv\0watarai.mie.jp\0"
+"org.cw\0fm.no\0ua\0in.ua\0caa.li\0"
+"tr\0"
+"org.cy\0care\0chrome\0"
+"cs.in\0tt\0"
+"for-our.info\0"
+"coop.br\0tv\0"
+"association.aero\0org.dm\0tw\0ug\0"
+"minokamo.gifu.jp\0aya.miyazaki.jp\0"
+"org.do\0"
+"brescia.it\0cs.it\0tz\0"
+"uk\0"
+"org.ec\0realty\0"
+"org.ee\0casa\0"
+"towada.aomori.jp\0"
+"org.eg\0va\0cars\0"
+"us\0in.us\0vc\0case\0bukhara.su\0"
+"org.dz\0sejny.pl\0"
+"ve\0pwc\0s3-accesspoint.ca-central-1.amazonaws.com\0appchizi.com\0"
+"cash\0homedepot\0"
+"\xc3\xa5s.no\0vg\0s3-ca-central-1.amazonaws.com\0"
+"cl.it\0dlugoleka.pl\0"
+"uy\0vi\0furniture\0"
+"uz\0"
+"sakura.chiba.jp\0"
+"org.es\0"
+"org.et\0toshima.tokyo.jp\0vn\0"
+"barueri.br\0yamamoto.miyagi.jp\0fastvps.host\0"
+"org.fj\0"
+"\xc3\xa5l.no\0vu\0"
+"ce.it\0elk.pl\0wf\0"
+"org.fm\0engineering\0s3-website-ap-southeast-1.amazonaws.com\0"
+"debian.net\0"
+"is-an-anarchist.com\0"
+"minamiuonuma.niigata.jp\0"
+"lund.no\0"
+"studio.me-central-1.sagemaker.aws\0"
+"moriyoshi.akita.jp\0fedex\0trust\0"
+"org.ge\0"
+"org.gg\0java\0"
+"org.gh\0"
+"org.gi\0ws\0"
+"bn.it\0auspost\0meinforum.net\0"
+"org.gl\0cloudaccess.host\0"
+"divttasvuotna.no\0"
+"org.gn\0"
+"org.gp\0"
+"chernovtsy.ua\0staples\0"
+"org.gr\0aso.kumamoto.jp\0democrat\0"
+"hi.us\0"
+"org.gt\0"
+"org.gu\0cc.wi.us\0"
+"emrstudio-prod.sa-east-1.amazonaws.com\0"
+"bg.it\0mukawa.hokkaido.jp\0settsu.osaka.jp\0"
+"org.gy\0"
+"gob.ar\0"
+"org.hk\0ye\0"
+"niteroi.br\0"
+"sund.no\0edu.eu.org\0"
+"org.hn\0"
+"ibaraki.jp\0khanhhoa.vn\0"
+"warabi.saitama.jp\0"
+"charter.aero\0baidu\0"
+"org.ht\0"
+"org.hu\0ciscofreak.com\0"
+"ap.it\0"
+"gob.bo\0"
+"gmbh\0"
+"amli.no\0\xe7\xb6\xb2\xe8\xb7\xaf.tw\0"
+"bulsan-suedtirol.it\0longan.vn\0yt\0nordeste-idc.saveincloud.net\0"
+"org.il\0kaminokawa.tochigi.jp\0gouv.sn\0"
+"org.im\0"
+"bhz.br\0ai.in\0org.in\0anan.tokushima.jp\0"
+"uk.com\0stage.nodeart.io\0"
+"guam.gu\0org.iq\0"
+"eco.bj\0org.ir\0iizuka.fukuoka.jp\0pa.leg.br\0"
+"org.is\0zm\0"
+"gob.cl\0"
+"org.je\0s3-website.us-west-2.amazonaws.com\0diskstation.me\0"
+"nagano.jp\0"
+"nakadomari.aomori.jp\0"
+"komforb.se\0notebook.us-gov-east-1.sagemaker.aws\0"
+"eco.br\0"
+"rovigo.it\0mashiko.tochigi.jp\0\xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xa0\xe0\xa4\xa8\0"
+"zw\0"
+"nakatane.kagoshima.jp\0"
+"org.jo\0cc.ut.us\0oncilla.mythic-beasts.com\0"
+"taxi.br\0kuji.iwate.jp\0oe.yamagata.jp\0"
+"\xe5\xbe\xae\xe5\x8d\x9a\0"
+"public-inquiry.uk\0in-dsl.de\0"
+"diskstation.eu\0"
+"gob.do\0org.kg\0bu.no\0"
+"sunagawa.hokkaido.jp\0"
+"org.ki\0"
+"aoste.it\0wakuya.miyagi.jp\0"
+"gob.ec\0"
+"umi.fukuoka.jp\0govt.nz\0"
+"org.km\0"
+"sayama.saitama.jp\0org.kn\0"
+"likes-pie.com\0"
+"org.kp\0"
+"org.la\0"
+"org.lb\0hospital\0pb.leg.br\0"
+"org.lc\0j.scaleforce.com.cy\0"
+"poker\0"
+"tsumagoi.gunma.jp\0canon\0"
+"org.kw\0k12.wy.us\0"
+"org.ky\0"
+"bibai.hokkaido.jp\0org.kz\0"
+"gob.es\0org.lk\0gs.rl.no\0"
+"collegefan.org\0"
+"shingu.hyogo.jp\0nakagusuku.okinawa.jp\0"
+"fnwk.site\0from-mt.com\0from-nd.com\0"
+"matsuura.nagasaki.jp\0on-web.fr\0"
+"org.ma\0"
+"kokubunji.tokyo.jp\0org.lr\0no-ip.biz\0"
+"org.ls\0sula.no\0dyndns-web.com\0"
+"org.me\0shaw\0"
+"org.lv\0olayangroup\0"
+"org.mg\0sogne.no\0troms\xc3\xb8.no\0"
+"org.ly\0fedje.no\0"
+"org.mk\0"
+"varese.it\0hakone.kanagawa.jp\0minowa.nagano.jp\0org.ml\0"
+"fauske.no\0"
+"kamiizumi.saitama.jp\0org.mn\0"
+"org.mo\0"
+"basilicata.it\0biei.hokkaido.jp\0"
+"org.na\0wpenginepowered.com\0"
+"miyagi.jp\0"
+"org.ms\0s3-accesspoint.dualstack.eu-west-2.amazonaws.com\0"
+"trd.br\0org.mt\0"
+"org.mu\0"
+"org.mv\0serveblog.net\0"
+"org.mw\0org.ng\0"
+"kyotango.kyoto.jp\0org.mx\0"
+"org.my\0org.ni\0"
+"org.mz\0prof.pr\0"
+"gob.gt\0aomori.aomori.jp\0"
+"r\xc3\xb8yken.no\0business\0"
+"eek.jp\0"
+"katsuragi.nara.jp\0org.nr\0wroclaw.pl\0"
+"chuo.chiba.jp\0goshiki.hyogo.jp\0"
+"gob.hn\0iwakuni.yamaguchi.jp\0"
+"org.nz\0"
+"prod\0"
+"org.om\0"
+"prof\0"
+"ralingen.no\0"
+"veneto.it\0takayama.gunma.jp\0aga.niigata.jp\0"
+"org.pa\0wales\0"
+"xbox\0"
+"freebox-os.com\0"
+"us.reclaim.cloud\0"
+"org.pe\0\xe3\x82\xa2\xe3\x83\x9e\xe3\x82\xbe\xe3\x83\xb3\0"
+"org.pf\0"
+"org.ph\0"
+"org.pk\0"
+"org.pl\0"
+"malvik.no\0"
+"org.pn\0"
+"tas.edu.au\0dc.us\0"
+"barlettatraniandria.it\0kawara.fukuoka.jp\0katano.osaka.jp\0mibu.tochigi.jp\0"
+"m\xc3\xa1tta-v\xc3\xa1rjjat.no\0org.qa\0cc.sc.us\0"
+"org.pr\0gdansk.pl\0"
+"org.ps\0"
+"org.pt\0jotelulu.cloud\0"
+"s3.dualstack.cn-northwest-1.amazonaws.com.cn\0"
+"*.cloudera.site\0"
+"kakamigahara.gifu.jp\0"
+"org.py\0"
+"gouv.km\0int.eu.org\0"
+"backdrop.jp\0"
+"a.prod.fastly.net\0"
+"express.aero\0frana.no\0statefarm\0notebook.eu-west-2.sagemaker.aws\0"
+"nosegawa.nara.jp\0uk.reclaim.cloud\0"
+"\xe6\xb7\xa1\xe9\xa9\xac\xe9\x94\xa1\0"
+"higashimatsushima.miyagi.jp\0"
+"pagefrontapp.com\0"
+"mihama.fukui.jp\0hamatama.saga.jp\0"
+"togane.chiba.jp\0school\0"
+"dyndns-pics.com\0"
+"tvedestrand.no\0"
+"dynathome.net\0"
+"cipriani\0mytuleap.com\0paris.eu.org\0googlecode.com\0"
+"org.ro\0"
+"noheji.aomori.jp\0katsuyama.fukui.jp\0"
+"org.sa\0githubusercontent.com\0barsy.site\0"
+"org.sb\0"
+"org.rs\0org.sc\0"
+"firm.ht\0kushimoto.wakayama.jp\0org.sd\0"
+"askvoll.no\0org.se\0org.ru\0"
+"miyoshi.saitama.jp\0"
+"org.rw\0org.sg\0s3-fips.dualstack.ca-central-1.amazonaws.com\0"
+"org.sh\0"
+"meldal.no\0"
+"sera.hiroshima.jp\0gouv.ml\0s3-accesspoint.dualstack.cn-north-1.amazonaws.com.cn\0"
+"gs.nt.no\0"
+"ohda.shimane.jp\0org.sl\0red\0"
+"ferrero\0"
+"firm.in\0suzuka.mie.jp\0org.sn\0"
+"org.so\0shia\0"
+"nakamura.kochi.jp\0"
+"royrvik.no\0drive\0"
+"yamada.fukuoka.jp\0matsushima.miyagi.jp\0\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa6\xb0\xe0\xa6\xa4\0"
+"org.ss\0analytics-gateway.us-east-2.amazonaws.com\0user.party.eus\0"
+"org.st\0"
+"fr\xc3\xb8ya.no\0holtalen.no\0"
+"org.sv\0ren\0"
+"nagiso.nagano.jp\0"
+"veterinaire.km\0org.sy\0cbre\0"
+"org.sz\0org.tj\0"
+"studio.ap-south-1.sagemaker.aws\0"
+"org.tm\0webview-assets.cloud9.eu-north-1.amazonaws.com\0"
+"org.tn\0"
+"org.to\0gratis\0"
+"gob.mx\0"
+"gob.ni\0coop.rw\0org.ua\0"
+"fukuroi.shizuoka.jp\0ohkura.yamagata.jp\0org.tr\0"
+"kushiro.hokkaido.jp\0org.tt\0"
+"gop.pk\0org.tw\0org.ug\0writesthisblog.com\0"
+"org.uk\0"
+"termez.su\0gitapp.si\0"
+"firm.co\0"
+"sassari.it\0"
+"author.aero\0veg\xc3\xa5rshei.no\0org.vc\0auth.eu-north-1.amazoncognito.com\0"
+"lovesick.jp\0"
+"org.ve\0"
+"minamiboso.chiba.jp\0target\0"
+"gob.pa\0org.uy\0org.vi\0"
+"cesena-forl\xc3\xac.it\0org.uz\0"
+"firm.dk\0stuff-4-sale.org\0"
+"gallup\0"
+"gob.pe\0twmail.cc\0"
+"coop.tt\0ai.vn\0org.vn\0"
+"arq.br\0"
+"dyndns1.de\0"
+"unnan.shimane.jp\0"
+"gob.pk\0cc.or.us\0mo-siemens.io\0"
+"org.vu\0emrstudio-prod.eu-west-1.amazonaws.com\0hostedpi.com\0"
+"y.bg\0"
+"res.in\0beppu.oita.jp\0"
+"\xc3\xa5krehamn.no\0"
+"veterinaire.fr\0"
+"001www.com\0"
+"rel.ht\0sodegaura.chiba.jp\0coop.mv\0boyfriend.jp\0"
+"tksat.bo\0coop.mw\0cc.ok.us\0"
+"uchinada.ishikawa.jp\0"
+"org.ws\0"
+"monza-brianza.it\0ril\0"
+"kasserver.com\0*.ocp.customer-oci.com\0"
+"rio\0"
+"rip\0"
+"r.bg\0"
+"autos\0"
+"minamisanriku.miyagi.jp\0"
+"snasa.no\0"
+"dyndns-server.com\0"
+"org.ye\0"
+"nagawa.nagano.jp\0geek.nz\0"
+"k.bg\0"
+"ena.gifu.jp\0ravendb.cloud\0jeez.jp\0"
+"apigee.io\0"
+"cc.nm.us\0"
+"campinas.br\0"
+"telebit.io\0"
+"org.za\0"
+"lom.it\0pi.leg.br\0"
+"b\xc3\xa5tsfjord.no\0"
+"yusui.kagoshima.jp\0org.yt\0"
+"d.bg\0"
+"hyundai\0mypi.co\0"
+"vestnes.no\0"
+"trentin-sued-tirol.it\0"
+"wios.gov.pl\0"
+"org.zm\0"
+"tajiri.osaka.jp\0gob.sv\0shop\0"
+"jab.br\0tako.chiba.jp\0takasaki.gunma.jp\0"
+"gaivuotna.no\0"
+"takatori.nara.jp\0"
+"coop.py\0"
+"shimokitayama.nara.jp\0"
+"show\0studio.us-west-1.sagemaker.aws\0go.dyndns.org\0"
+"\xd0\xbc\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0\0"
+"org.zw\0"
+"cc.mo.us\0"
+"davvenj\xc3\xa1rga.no\0"
+"frosta.no\0khmelnitskiy.ua\0"
+"geo.br\0neyagawa.osaka.jp\0pulawy.pl\0"
+"morena.br\0kainan.wakayama.jp\0shinjo.yamagata.jp\0"
+"dazaifu.fukuoka.jp\0mragowo.pl\0agakhan\0"
+"noip.us\0*.s5y.io\0"
+"ukiha.fukuoka.jp\0privatizehealthinsurance.net\0"
+"gob.ve\0"
+"paas.hosted-by-previder.com\0"
+"noor.jp\0"
+"urakawa.hokkaido.jp\0"
+"cc.ma.us\0*.digitaloceanspaces.com\0"
+"gosen.niigata.jp\0"
+"coop.km\0execute-api.ap-south-1.amazonaws.com\0"
+"kuriyama.hokkaido.jp\0"
+"web.bo\0"
+"raisa.no\0"
+"tempio-olbia.it\0eniwa.hokkaido.jp\0fool.jp\0"
+"tromsa.no\0"
+"friuli-ve-giulia.it\0"
+"friuli-v-giulia.it\0"
+"nsw.au\0from-or.com\0"
+"togitsu.nagasaki.jp\0matsubara.osaka.jp\0"
+"web.co\0"
+"lom.no\0k12.oh.us\0"
+"hachioji.tokyo.jp\0"
+"s3-website.dualstack.af-south-1.amazonaws.com\0lon.wafaicloud.com\0"
+"cc.ks.us\0is-a-landscaper.com\0"
+"realestate.pl\0"
+"modalen.no\0"
+"sanda.hyogo.jp\0quangnam.vn\0"
+"rel.pl\0"
+"schoolbus.jp\0"
+"web.do\0k12.mo.us\0tires\0"
+"haebaru.okinawa.jp\0"
+"bas.it\0"
+"chonan.chiba.jp\0"
+"firm.ve\0"
+"3.bg\0\xd1\x83\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0s3-accesspoint-fips.dualstack.us-east-2.amazonaws.com\0"
+"lidl\0sap\0"
+"sas\0"
+"daemon.panel.gg\0"
+"sbi\0mircloud.us\0"
+"atm.pl\0"
+"gratangen.no\0"
+"air-traffic-control.aero\0k12.ma.us\0"
+"tawaramoto.nara.jp\0"
+"act.edu.au\0gs.oslo.no\0"
+"scb\0"
 "sbs\0"
-"sakaki.nagano.jp\0"
-"dr\xc3\xb8""bak.no\0vega.no\0"
-"trentin-sud-tirol.it\0honjo.akita.jp\0"
-"eurovision\0"
-"\xe0\xba\xa5\xe0\xba\xb2\xe0\xba\xa7\0me.vu\0"
-"juniper\0"
-"sayo.hyogo.jp\0"
-"githubpreview.dev\0"
-"twmail.cc\0"
-"misato.shimane.jp\0forex\0jls-sto1.elastx.net\0"
-"sirdal.no\0"
-"la.us\0"
-"reggioemilia.it\0"
-"lavagis.no\0lib.pa.us\0"
-"tv.im\0troandin.no\0githubusercontent.com\0"
-"tv.in\0amagasaki.hyogo.jp\0other.nf\0cloud\0"
-"cn.com\0"
-"\xe4\xb8\x96\xe7\x95\x8c\0"
-"tv.it\0nobeoka.miyazaki.jp\0"
-"cust.dev.thingdust.io\0"
-"ichikawa.hyogo.jp\0"
-"tako.chiba.jp\0monster\0run\0"
-"vossevangen.no\0""611.to\0"
-"g\xc3\xa1ls\xc3\xa1.no\0stuff-4-sale.us\0"
-"bolzano-altoadige.it\0"
-"emb.kw\0"
-"freebox-os.fr\0"
-"sew\0s3-ap-northeast-2.amazonaws.com\0"
+"autocode.dev\0"
+"discourse.group\0"
+"abudhabi\0"
+"telebit.app\0"
+"life\0"
+"asahi.nagano.jp\0pe.leg.br\0"
+"\xe5\x85\xac\xe5\x8f\xb8.cn\0aogashima.tokyo.jp\0"
+"k12.md.us\0"
+"sp.gov.br\0"
+"sola.no\0gitlab.io\0"
+"trentins\xc3\xbc""dtirol.it\0nanbu.tottori.jp\0"
+"asuke.aichi.jp\0"
+"mihama.aichi.jp\0"
+"filegear.me\0"
+"monzaebrianza.it\0"
+"works.aero\0"
+"rome.it\0"
+"web.gu\0\xe5\x85\xac\xe5\x8f\xb8.hk\0"
+"sydney\0"
+"littlestar.jp\0"
+"giving\0"
+"miyama.mie.jp\0mymediapc.net\0"
+"hachinohe.aomori.jp\0observer\0"
+"kaluga.su\0"
+"gniezno.pl\0pisz.pl\0functions.fnc.fr-par.scw.cloud\0"
+"itau\0myspreadshop.com.au\0"
+"domains\0"
+"web.id\0yotsukaido.chiba.jp\0cloudns.biz\0dynv6.net\0"
+"bjarkoy.no\0"
+"caobang.vn\0"
+"gives\0wpmucdn.com\0"
+"run\0mimoza.jp\0za.net\0"
+"friuli-venezia-giulia.it\0higashiyamato.tokyo.jp\0web.in\0blush.jp\0"
+"emrstudio-prod.us-west-2.amazonaws.com\0"
+"salud.bo\0"
+"akamaized.net\0"
+"firm.ro\0sew\0"
 "sex\0"
-"alpha-myqnapcloud.com\0"
-"bunkyo.tokyo.jp\0cloudns.biz\0"
-"stj\xc3\xb8rdal.no\0istmein.de\0tv.kg\0"
-"onomichi.hiroshima.jp\0static-access.net\0"
-"search\0"
-"fi.cloudplatform.fi\0"
-"higashiyama.kyoto.jp\0sfr\0"
-"associates\0"
-"potenza.it\0soctrang.vn\0"
-"rwe\0"
-"nishiazai.shiga.jp\0"
-"sdscloud.pl\0"
-"sr.it\0"
-"ce.it\0"
-"misconfused.org\0mintere.site\0"
-"*.nagoya.jp\0myoko.niigata.jp\0"
-"meteorapp.com\0"
-"museum\0gop.pk\0*.on-k3s.io\0"
-"saitama.jp\0"
-"kawaminami.miyazaki.jp\0"
-"navy\0"
-"kr.com\0"
-"us-east-1.amazonaws.com\0"
-"thainguyen.vn\0"
-"trani-barletta-andria.it\0chichibu.saitama.jp\0"
-"shirako.chiba.jp\0eastasia.azurestaticapps.net\0"
-"hockey\0"
-"tv.na\0"
-"limanowa.pl\0"
-"miyazaki.jp\0shiroishi.saga.jp\0"
-"cc.wv.us\0"
-"rn.it\0"
-"khmelnytskyi.ua\0"
-"aq.it\0ba.it\0yufu.oita.jp\0de.trendhosting.cloud\0"
-"econo.bj\0pa.gov.br\0fujimi.nagano.jp\0"
-"odate.akita.jp\0"
-"hakodate.hokkaido.jp\0kyowa.hokkaido.jp\0griw.gov.pl\0"
-"yoshino.nara.jp\0"
-"sweetpepper.org\0"
-"cloudaccess.net\0"
-"oseto.nagasaki.jp\0"
-"pagexl.com\0"
-"cnpy.gdn\0"
-"higashiosaka.osaka.jp\0"
-"gu.us\0"
-"nishinomiya.hyogo.jp\0"
-"\xe5\xb1\xb1\xe6\xa2\xa8.jp\0"
-"s\xc3\xa1l\xc3\xa1t.no\0properties\0"
-"ski\0volvo\0"
-"eiheiji.fukui.jp\0"
-"kvam.no\0is-a-teacher.com\0"
-"pz.it\0"
-"pb.gov.br\0k8s.fr-par.scw.cloud\0"
-"genting\0university\0*.compute-1.amazonaws.com\0drr.ac\0"
-"!city.sapporo.jp\0"
-"kawara.fukuoka.jp\0"
-"bu.no\0"
-"yawara.ibaraki.jp\0shimoichi.nara.jp\0"
-"secure\0sky\0"
-"belluno.it\0"
-"gs.sf.no\0codes\0s3-eu-central-1.amazonaws.com\0"
-"nanae.hokkaido.jp\0ishinomaki.miyagi.jp\0squares.net\0"
-"varggat.no\0condos\0firestone\0"
-"o.se\0ga.us\0"
-"kitagawa.kochi.jp\0binhphuoc.vn\0canon\0"
-"k12.ma.us\0"
-"midsund.no\0shopware.store\0"
-"nome.pt\0"
-"sec.ps\0"
-"chofu.tokyo.jp\0dnsup.net\0storage.yandexcloud.net\0"
-"ravendb.cloud\0"
-"uz.ua\0"
-"style\0"
-"taka.hyogo.jp\0tv.sd\0"
-"aisai.aichi.jp\0"
-"miyakonojo.miyazaki.jp\0"
-"ringerike.no\0"
-"omihachiman.shiga.jp\0"
-"community\0"
-"bozen-suedtirol.it\0caserta.it\0"
-"barsycenter.com\0"
-"ichinohe.iwate.jp\0"
-"cloud.interhostsolutions.be\0"
-"svelvik.no\0spa\0"
-"otoineppu.hokkaido.jp\0takazaki.miyazaki.jp\0"
-"media.aero\0"
-"etne.no\0"
-"trentinos\xc3\xbc""dtirol.it\0tv.tr\0"
-"com.ac\0webview-assets.aws-cloud9.af-south-1.amazonaws.com\0"
-"soy\0"
-"com.af\0nghean.vn\0"
-"com.ag\0s3.dualstack.eu-west-2.amazonaws.com\0"
-"business.in\0iide.yamagata.jp\0"
+"pokrovsk.su\0static.observableusercontent.com\0"
+"issmarterthanyou.com\0"
+"kanra.gunma.jp\0"
+"tanabe.wakayama.jp\0"
+"s3-website.eu-west-3.amazonaws.com\0"
+"sfr\0"
+"jewelry\0"
+"dev.br\0"
+"rwe\0webview-assets.cloud9.ap-northeast-1.amazonaws.com\0ditchyourip.com\0"
+"nishiaizu.fukushima.jp\0"
+"nord-aurdal.no\0trana.no\0"
+"takaishi.osaka.jp\0so.gov.pl\0"
+"leirfjord.no\0"
+"askim.no\0*.us-east-2.airflow.amazonaws.com\0mircloud.ru\0*.vps.myjino.ru\0"
+"uryu.hokkaido.jp\0isehara.kanagawa.jp\0"
+"inami.wakayama.jp\0"
+"\xe5\x85\xb5\xe5\xba\xab.jp\0"
+"lib.wa.us\0vologda.su\0"
+"nanyo.yamagata.jp\0"
+"mycloud.by\0"
+"yamaxun\0"
+"trentino-sud-tirol.it\0"
+"hanam.vn\0"
+"like\0"
+"lel.br\0"
+"fot.br\0"
+"web.lk\0nsupdate.info\0"
+"shijonawate.osaka.jp\0yoshimi.saitama.jp\0"
+"silk\0"
+"fredrikstad.no\0noip.me\0"
+"christmas\0"
+"minamidaito.okinawa.jp\0"
+"noticias.bo\0"
+"b\xc3\xb8.telemark.no\0"
+"emrnotebooks-prod.us-east-1.amazonaws.com\0s3-fips-us-gov-east-1.amazonaws.com\0"
+"firm.nf\0ketrzyn.pl\0"
+"harstad.no\0firm.ng\0"
+"y.se\0"
+"lowicz.pl\0realtor\0"
+"kofu.yamanashi.jp\0"
+"karacol.su\0"
+"shirakawa.fukushima.jp\0"
+"sina\0"
+"shiriuchi.hokkaido.jp\0"
+"praxi\0"
+"bunkyo.tokyo.jp\0web.nf\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa5\x8b\xe0\xa4\xa4\0"
+"lib.ut.us\0"
+"tirol\0"
+"web.ni\0servehalflife.com\0"
+"\xe5\x9f\xbc\xe7\x8e\x89.jp\0"
+"r.se\0hs.zone\0"
+"ginowan.okinawa.jp\0"
+"sklep.pl\0"
+"limo\0meteorapp.com\0"
+"rackmaze.net\0"
+"ski\0"
+"k.se\0firewalledreplit.co\0"
+"link\0webview-assets.cloud9.us-west-1.amazonaws.com\0"
+"ap-southeast-2.elasticbeanstalk.com\0lima-city.de\0"
+"auth.il-central-1.amazoncognito.com\0"
+"sky\0"
+"xj.cn\0ikusaka.nagano.jp\0rulez.jp\0"
+"erotika.hu\0d.se\0"
+"horokanai.hokkaido.jp\0"
+"reggio-calabria.it\0kui.hiroshima.jp\0"
+"web.pk\0"
+"davvenjarga.no\0"
+"demon.nl\0"
+"withyoutube.com\0"
+"k12.gu.us\0"
+"srv.br\0"
+"nishikawa.yamagata.jp\0pr.leg.br\0"
+"friuli-vegiulia.it\0jobs.tt\0"
+"toyako.hokkaido.jp\0"
+"lilly\0"
+"lima-city.at\0"
+"shikokuchuo.ehime.jp\0"
+"s3-accesspoint.dualstack.me-central-1.amazonaws.com\0from-vt.com\0"
+"agr.br\0"
+"microsoft\0channelsdvr.net\0"
+"s\xc3\xb8rreisa.no\0we.bs\0"
+"fashion\0xx.gl\0"
+"tysfjord.no\0"
+"koryo.nara.jp\0"
+"lease\0"
+"misaki.osaka.jp\0"
+"\xe7\xa5\x9e\xe5\xa5\x88\xe5\xb7\x9d.jp\0centralus.azurestaticapps.net\0"
+"tama.tokyo.jp\0notebook.cn-north-1.sagemaker.com.cn\0lima-city.ch\0"
+"crap.jp\0"
+"hepforge.org\0"
+"k8s.scw.cloud\0"
+"ikano\0"
+"nara.jp\0"
+"emiliaromagna.it\0"
+"voagat.no\0spa\0"
+"cutegirl.jp\0"
+"cc.de.us\0"
+"steinkjer.no\0soy\0"
+"site\0"
+"toolforge.org\0"
+"web.tj\0"
+"jolster.no\0"
+"politica.bo\0plesk.page\0"
+"tab\0"
+"cloudfunctions.net\0"
+"*.0emm.com\0"
+"itabashi.tokyo.jp\0web.tr\0"
+"3utilities.com\0"
+"sr.gov.pl\0easypanel.host\0"
+"vfs.cloud9.eu-south-1.amazonaws.com\0"
+"tajimi.gifu.jp\0"
+"trentin-s\xc3\xbc""d-tirol.it\0sub.jp\0"
+"eu.ngrok.io\0"
+"\xd8\xb4\xd8\xa8\xd9\x83\xd8\xa9\0net.eu.org\0googleapis.com\0"
+"com.ac\0"
+"hirara.okinawa.jp\0tax\0"
+"web.ve\0s3-accesspoint.eu-south-2.amazonaws.com\0"
+"com.af\0forl\xc3\xac-cesena.it\0"
+"com.ag\0"
+"shonai.fukuoka.jp\0srl\0familyds.net\0"
 "com.ai\0"
-"tv.tz\0"
-"tecnologia.bo\0"
-"com.al\0hirokawa.fukuoka.jp\0"
-"com.am\0"
-"aomori.jp\0tab\0"
-"sor-aurdal.no\0"
-"ca.reclaim.cloud\0"
+"kitagata.saga.jp\0"
+"emrnotebooks-prod.eu-west-1.amazonaws.com\0"
+"com.al\0"
+"com.am\0\xe3\x82\xbb\xe3\x83\xbc\xe3\x83\xab\0s3-accesspoint.eu-west-1.amazonaws.com\0notebook.il-central-1.sagemaker.aws\0"
 "com.ba\0"
-"com.ar\0com.bb\0"
-"webview-assets.cloud9.ap-east-1.amazonaws.com\0lpusercontent.com\0"
-"shisui.chiba.jp\0ninohe.iwate.jp\0"
-"com.au\0cust.retrosnub.co.uk\0messwithdns.com\0"
+"com.ar\0com.bb\0busan.kr\0"
+"oygarden.no\0notebook.ap-south-2.sagemaker.aws\0"
+"com.au\0live\0tci\0trading\0mine.nu\0"
+"mihama.mie.jp\0"
 "com.aw\0"
-"com.bh\0ogata.akita.jp\0"
-"com.bi\0is-slick.com\0"
-"com.az\0com.bj\0bando.ibaraki.jp\0fussa.tokyo.jp\0"
-"com.bm\0namsskogan.no\0"
-"com.bn\0yabuki.fukushima.jp\0mail-box.ne.jp\0"
-"com.bo\0webview-assets.cloud9.ap-northeast-2.amazonaws.com\0"
-"mn.it\0"
+"com.bh\0"
+"com.bi\0s3-website.il-central-1.amazonaws.com\0"
+"com.az\0com.bj\0clerk.app\0"
+"com.bm\0"
+"com.bn\0"
+"com.bo\0stc\0"
+"\xe7\xb5\x84\xe7\xbb\x87.hk\0"
 "com.br\0"
-"com.bs\0shangrila\0"
-"com.bt\0slask.pl\0tax\0r.cdn77.net\0"
-"shimotsuma.ibaraki.jp\0sakuho.nagano.jp\0"
-"*.transurl.be\0"
-"rio.br\0kawakami.nara.jp\0srl\0"
-"com.by\0com.ci\0"
-"com.bz\0basilicata.it\0"
-"webthings.io\0"
-"kamikawa.hokkaido.jp\0"
-"com.cm\0"
-"com.cn\0\xd0\xba\xd0\xbe\xd0\xbc\0"
-"com.co\0villas\0"
-"shiogama.miyagi.jp\0itoigawa.niigata.jp\0expert\0"
-"namie.fukushima.jp\0matsubara.osaka.jp\0"
-"yk.ca\0erotica.hu\0pleskns.com\0"
-"tobishima.aichi.jp\0"
-"com.cu\0tci\0com.de\0writesthisblog.com\0"
-"com.cv\0\xe6\xbe\xb3\xe9\x96\x80\0"
+"com.bs\0synology-diskstation.de\0"
+"com.bt\0"
+"uonuma.niigata.jp\0pya.jp\0"
+"skanland.no\0cc.ar.us\0tdk\0"
+"kuzumaki.iwate.jp\0gold\0"
+"com.by\0com.ci\0rissa.no\0"
+"com.bz\0golf\0whm.nl-ams.scw.cloud\0"
+"dattolocal.com\0"
+"mashike.hokkaido.jp\0jaguar\0typedream.app\0"
+"broker.aero\0com.cm\0tunes\0webview-assets.cloud9.sa-east-1.amazonaws.com\0"
+"com.cn\0elementor.cloud\0"
+"com.co\0zhytomyr.ua\0cust.disrec.thingdust.io\0"
+"kumiyama.kyoto.jp\0"
+"tana.no\0s3-me-south-1.amazonaws.com\0"
+"koto.shiga.jp\0"
+"com.cu\0cc.ak.us\0com.de\0"
+"com.cv\0jpmorgan\0"
 "com.cw\0"
-"yuasa.wakayama.jp\0"
-"com.cy\0marker.no\0forum\0eu.org\0"
-"takahata.yamagata.jp\0test.tj\0"
-"n\xc3\xa1vuotna.no\0rana.no\0"
-"com.dm\0"
-"com.do\0stc\0"
-"hn.cn\0"
-"com.ec\0"
-"minamiechizen.fukui.jp\0ayagawa.kagawa.jp\0velvet.jp\0myftp.biz\0"
+"tel\0"
+"com.cy\0"
+"barsy.shop\0"
+"vfs.cloud9.eu-west-3.amazonaws.com\0"
+"com.dm\0lib.pa.us\0"
+"komae.tokyo.jp\0yuza.yamagata.jp\0"
+"com.do\0scrysec.com\0"
+"verona.it\0saito.miyazaki.jp\0"
+"hurum.no\0web.za\0"
+"com.ec\0emrnotebooks-prod.us-gov-east-1.amazonaws.com\0"
 "com.ee\0"
-"autocode.dev\0"
-"com.eg\0bridgestone\0tdk\0"
-"cafe\0viajes\0"
-"com.dz\0\xe0\xae\x87\xe0\xae\xb2\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x88\0"
-"uchihara.ibaraki.jp\0"
-"com.es\0mypets.ws\0"
-"com.et\0takikawa.hokkaido.jp\0shirosato.ibaraki.jp\0calvinklein\0"
-"barum.no\0"
-"nic.in\0tel\0"
-"homeunix.com\0"
-"com.fj\0nagano.jp\0"
-"pordenone.it\0"
-"com.fm\0no.eu.org\0barsy.me\0"
-"moriya.ibaraki.jp\0shiftcrypto.dev\0"
-"naples.it\0"
-"com.fr\0nakamichi.yamanashi.jp\0"
-"logistics.aero\0mykolaiv.ua\0"
-"miyako.fukuoka.jp\0abu.yamaguchi.jp\0"
-"com.ge\0test.ru\0"
-"sykkylven.no\0webview-assets.aws-cloud9.us-east-2.amazonaws.com\0game-host.org\0*.transurl.eu\0"
+"shinjuku.tokyo.jp\0"
+"com.eg\0here-for-more.info\0"
+"carrara-massa.it\0pup.gov.pl\0"
+"com.dz\0ryugasaki.ibaraki.jp\0"
+"sweetpepper.org\0"
+"vfs.cloud9.ca-central-1.amazonaws.com\0"
+"crotone.it\0"
+"com.es\0"
+"com.et\0ug.gov.pl\0"
+"ws.na\0"
+"fyresdal.no\0"
+"com.fj\0up.in\0"
+"goog\0"
+"nakijin.okinawa.jp\0kashima.saga.jp\0"
+"com.fm\0"
+"vaksdal.no\0"
+"thd\0"
+"com.fr\0"
+"pro.az\0"
+"com.ge\0zt.ua\0"
+"oi.kanagawa.jp\0"
+"orkanger.no\0"
 "com.gh\0"
-"noticias.bo\0com.gi\0"
-"hakui.ishikawa.jp\0"
-"s3.dualstack.eu-central-1.amazonaws.com\0is-very-bad.org\0"
-"com.gl\0\xe6\x97\xb6\xe5\xb0\x9a\0"
-"com.gn\0kitagata.gifu.jp\0"
-"com.gp\0kamifurano.hokkaido.jp\0kasai.hyogo.jp\0takagi.nagano.jp\0android\0"
-"bjark\xc3\xb8y.no\0elverum.no\0"
-"com.gr\0wajima.ishikawa.jp\0kinder\0"
-"zaporizhzhia.ua\0\xe6\xb7\xa1\xe9\xa9\xac\xe9\x94\xa1\0"
-"com.gt\0umaji.kochi.jp\0"
+"com.gi\0execute-api.us-gov-west-1.amazonaws.com\0"
+"jeep\0"
+"pro.br\0com.gl\0fujikawa.yamanashi.jp\0*.beget.app\0"
+"com.gn\0\xe9\xa6\x99\xe5\xb7\x9d.jp\0"
+"com.gp\0"
+"vp4.me\0"
+"com.gr\0akadns.net\0"
+"emerck\0"
+"com.gt\0\xd8\xa7\xd9\x84\xd9\x85\xd8\xba\xd8\xb1\xd8\xa8\0"
 "com.gu\0"
-"haga.tochigi.jp\0"
-"asaminami.hiroshima.jp\0"
+"k12.as.us\0rentals\0"
 "com.gy\0"
-"x.bg\0com.hk\0"
-"com.hn\0daa.jp\0"
-"mobara.chiba.jp\0thd\0"
-"com.hr\0ericsson\0"
+"isumi.chiba.jp\0"
+"com.hk\0"
+"tr.it\0"
+"karasjok.no\0"
+"com.hn\0"
+"porsanger.no\0"
+"com.hr\0"
+"show.aero\0pro.cy\0studio.eu-central-1.sagemaker.aws\0"
 "com.ht\0"
-"latrobe\0barrel-of-knowledge.info\0"
-"nabari.mie.jp\0"
-"orangecloud.tn\0"
-"fujieda.shizuoka.jp\0"
-"okayama.okayama.jp\0"
-"com.im\0"
-"com.in\0minamiminowa.nagano.jp\0"
-"com.io\0al.eu.org\0bmoattachments.org\0"
-"traniandriabarletta.it\0"
-"com.iq\0"
-"ueda.nagano.jp\0"
-"com.is\0"
-"s3-website.eu-west-2.amazonaws.com\0"
-"sakaiminato.tottori.jp\0"
-"bharti\0"
-"pi.gov.br\0tokorozawa.saitama.jp\0"
-"d.bg\0s3.amazonaws.com\0"
-"\xe6\xbe\xb3\xe9\x97\xa8\0"
-"com.jo\0"
-"clinique\0"
-"abogado\0"
-"trentins\xc3\xbc""d-tirol.it\0moka.tochigi.jp\0*.code.run\0"
-"h\xc3\xa4kkinen.fi\0"
-"fukuyama.hiroshima.jp\0"
-"control.aero\0com.kg\0ngo.lk\0vanylven.no\0"
-"6g.in\0"
-"com.ki\0wang\0*.quipelements.com\0"
-"webview-assets.aws-cloud9.us-west-1.amazonaws.com\0"
-"com.km\0hemne.no\0webview-assets.aws-cloud9.ap-northeast-2.amazonaws.com\0"
-"com.kp\0call\0"
-"com.la\0"
-"com.lb\0"
-"com.lc\0chernihiv.ua\0from-pa.com\0"
+"windows\0execute-api.ap-southeast-1.amazonaws.com\0"
+"qc.ca\0"
+"playstation\0"
+"higashikagawa.kagawa.jp\0suwa.nagano.jp\0ogi.saga.jp\0"
+"pro.ec\0com.im\0"
+"com.in\0"
+"com.io\0dubai\0"
+"wsse.gov.pl\0"
+"com.iq\0hapmir.no\0"
+"kuroiso.tochigi.jp\0"
+"com.is\0homesecuritypc.com\0dev.vu\0"
 "tjx\0"
-"com.kw\0webview-assets.aws-cloud9.eu-central-1.amazonaws.com\0barsy.ro\0"
-"com.ky\0theworkpc.com\0"
-"com.kz\0priv.instances.scw.cloud\0"
-"guam.gu\0com.lk\0hyundai\0"
-"tur.ar\0"
-"nz.eu.org\0"
-"miki.hyogo.jp\0bbs.tr\0"
-"ask\xc3\xb8y.no\0"
-"fukagawa.hokkaido.jp\0com.lr\0"
-"statebank\0ngo.ng\0"
-"katsuura.chiba.jp\0camp\0"
-"webview-assets.cloud9.eu-central-1.amazonaws.com\0"
-"nara.nara.jp\0com.lv\0"
-"com.mg\0n\xc3\xa5\xc3\xa5mesjevuemie.no\0"
-"com.ly\0"
-"marugame.kagawa.jp\0shishikui.tokushima.jp\0"
+"vallee-aoste.it\0"
+"in-the-band.net\0"
+"s3-object-lambda.ap-southeast-2.amazonaws.com\0"
+"com.jo\0volda.no\0"
+"pe.ca\0kv\xc3\xa6nangen.no\0"
+"pro.fj\0"
+"nsw.edu.au\0notebook.ap-southeast-3.sagemaker.aws\0"
+"com.kg\0"
+"kazuno.akita.jp\0akamai-staging.net\0"
+"com.ki\0from-in.com\0"
+"ullensaker.no\0"
+"og.ao\0com.km\0lib.mi.us\0"
+"vet.br\0deno-staging.dev\0"
+"execute-api.me-central-1.amazonaws.com\0"
+"com.kp\0"
+"on.ca\0com.la\0"
+"com.lb\0"
+"com.lc\0"
+"onagawa.miyagi.jp\0"
+"com.kw\0"
+"niihama.ehime.jp\0saiki.oita.jp\0"
+"com.ky\0"
+"omitama.ibaraki.jp\0com.kz\0"
+"com.lk\0cloudns.eu\0ro.im\0"
+"s3-accesspoint.ap-southeast-3.amazonaws.com\0"
+"hino.tokyo.jp\0"
+"komvux.se\0"
+"jeonbuk.kr\0"
+"motorcycles\0"
+"ro.it\0com.lr\0"
+"utsira.no\0"
+"com.lv\0"
+"com.mg\0tr.no\0"
+"com.ly\0fjell.no\0med.pro\0"
+"fuji.shizuoka.jp\0discount\0"
 "com.mk\0"
-"tur.br\0kiryu.gunma.jp\0com.ml\0goodyear\0"
+"abruzzo.it\0com.ml\0floppy.jp\0"
+"pro.ht\0"
 "com.mo\0"
 "com.na\0"
-"osaka.jp\0noheji.aomori.jp\0shibetsu.hokkaido.jp\0niyodogawa.kochi.jp\0"
 "com.ms\0"
 "com.mt\0"
-"com.mu\0kindle\0"
+"com.mu\0we.tc\0"
 "com.mv\0com.nf\0"
-"com.mw\0com.ng\0tydal.no\0"
-"tara.saga.jp\0com.mx\0tgory.pl\0dedibox.fr\0"
-"com.my\0com.ni\0"
-"cloudns.club\0"
-"mn.us\0"
-"matrix.jp\0"
-"dyndns-office.com\0"
-"com.nr\0"
-"gs.svalbard.no\0k12.ca.us\0barsy.uk\0"
-"ngo.ph\0"
-"agakhan\0westeurope.azurestaticapps.net\0"
-"vs.it\0"
-"azimuth.network\0"
-"bj.cn\0"
-"com.om\0"
-"mitsuke.niigata.jp\0*.transurl.nl\0"
-"udine.it\0"
-"com.pa\0"
+"homebuilt.aero\0com.mw\0com.ng\0"
+"pro.in\0com.mx\0"
+"com.my\0com.ni\0lviv.ua\0"
+"sjc.br\0miharu.fukushima.jp\0*.stg.dev\0"
+"top\0"
+"ra.it\0"
+"stavanger.no\0sebastopol.ua\0"
+"higashiagatsuma.gunma.jp\0nankoku.kochi.jp\0"
+"toyota.yamaguchi.jp\0com.nr\0"
+"st.no\0"
+"\xe9\x95\xb7\xe5\xb4\x8e.jp\0u.channelsdvr.net\0"
+"b\xc3\xa1jddar.no\0"
+"nb.ca\0withgoogle.com\0h\xc3\xa4kkinen.fi\0"
+"kaneyama.fukushima.jp\0"
+"pz.it\0"
+"federation.aero\0hurdal.no\0k\xc3\xa5""fjord.no\0com.om\0careers\0is-lost.org\0"
+"shingo.aomori.jp\0"
+"*.linodeobjects.com\0panel.gg\0"
+"jele.cloud\0"
+"com.pa\0vn.ua\0"
+"esp.br\0kariwa.niigata.jp\0"
+"intuit\0cloudns.in\0linkyard-cloud.ch\0"
 "com.pe\0"
-"tochigi.jp\0com.pf\0"
-"com.ph\0istanbul\0fool.jp\0"
-"harstad.no\0ann-arbor.mi.us\0"
-"res.in\0"
+"toki.gifu.jp\0shimonita.gunma.jp\0com.pf\0"
+"tokke.no\0"
+"com.ph\0"
+"hornindal.no\0"
+"to.gov.br\0carboniaiglesias.it\0"
 "com.pk\0"
-"com.pl\0\xd9\x81\xd9\x84\xd8\xb3\xd8\xb7\xd9\x8a\xd9\x86\0top\0"
-"\xe6\x96\xb0\xe5\x8a\xa0\xe5\x9d\xa1\0"
-"inagi.tokyo.jp\0"
-"gs.oslo.no\0"
-"hitachinaka.ibaraki.jp\0"
-"com.qa\0"
-"bet.ar\0com.pr\0"
-"laakesvuemie.no\0com.ps\0bashkiria.ru\0"
-"com.pt\0nic.tj\0"
-"vall\xc3\xa9""eaoste.it\0"
-"from-wv.com\0"
-"dr.in\0"
-"com.py\0care\0"
-"mar.it\0"
-"mymailer.com.tw\0"
-"review\0"
-"\xd0\xbe\xd0\xb1\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0"
-"askoy.no\0scrapping.cc\0bashkiria.su\0virtual-user.de\0"
-"shika.ishikawa.jp\0"
-"com.re\0nhs.uk\0casa\0"
-"mimoza.jp\0"
-"\xe5\x95\x86\xe6\xa5\xad.tw\0cars\0"
-"\xe9\x9d\x99\xe5\xb2\xa1.jp\0mitake.gifu.jp\0chanel\0k8s.scw.cloud\0"
-"froland.no\0case\0"
-"bitter.jp\0"
-"affinitylottery.org.uk\0"
-"pe.gov.br\0soeda.fukuoka.jp\0hiraizumi.iwate.jp\0cash\0"
-"homedns.org\0royal-commission.uk\0"
-"unazuki.toyama.jp\0"
-"com.ro\0grozny.su\0"
-"urown.cloud\0"
+"com.pl\0"
+"snoasa.no\0za.org\0"
+"boavista.br\0wegrow.pl\0tn.oxa.cloud\0"
+"sf.no\0"
+"assn.lk\0stat.no\0com.qa\0"
+"com.pr\0"
+"com.ps\0s3-1.amazonaws.com\0"
+"com.pt\0"
+"style\0"
+"tomi.nagano.jp\0"
+"com.py\0cloudns.cc\0"
+"washtenaw.mi.us\0"
+"md.ci\0notebook.eu-south-1.sagemaker.aws\0"
+"law.pro\0cards\0ubs\0vfs.cloud9.sa-east-1.amazonaws.com\0lug.org.uk\0"
+"beagleboard.io\0"
+"fermo.it\0trv\0"
+"bayern\0"
+"com.re\0"
+"pe.it\0"
+"iwata.shizuoka.jp\0pecori.jp\0"
+"d\xc3\xb8nna.no\0"
+"\xe5\xba\x83\xe5\xb3\xb6.jp\0"
+"pro.na\0"
+"lib.ia.us\0\xe5\xa4\xa9\xe4\xb8\xbb\xe6\x95\x99\0is-a-designer.com\0"
+"com.ro\0"
+"kikonai.hokkaido.jp\0fukaya.saitama.jp\0pro.mv\0"
 "com.sa\0"
-"biei.hokkaido.jp\0com.sb\0"
+"com.sb\0"
 "com.sc\0"
-"com.sd\0twmail.net\0"
-"com.se\0com.ru\0"
-"com.sg\0groks-the.info\0"
-"com.sh\0"
-"\xe7\xae\x87\xe4\xba\xba.hk\0"
-"cn.in\0bato.tochigi.jp\0caobang.vn\0pa.leg.br\0"
-"yamatsuri.fukushima.jp\0noboribetsu.hokkaido.jp\0com.sl\0"
-"biev\xc3\xa1t.no\0"
-"trentin-sudtirol.it\0com.sn\0\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86\0"
-"com.so\0ubs\0"
-"cn.it\0"
-"trv\0"
-"com.ss\0"
-"com.st\0football\0gift\0"
+"com.sd\0"
+"malselv.no\0pub.sa\0com.se\0com.ru\0"
+"kuju.oita.jp\0"
+"com.sg\0"
+"caltanissetta.it\0tamano.okayama.jp\0com.sh\0"
+"s3.af-south-1.amazonaws.com\0notebook-fips.us-gov-west-1.sagemaker.aws\0"
+"asahi.toyama.jp\0*.hosting.ovh.net\0"
+"nagareyama.chiba.jp\0com.sl\0"
+"mutual.ar\0com.sn\0"
+"com.so\0tec.mi.us\0"
+"trentino-aadige.it\0"
+"og.it\0"
+"com.ss\0lighting\0azerbaijan.su\0"
+"susaki.kochi.jp\0pe.kr\0com.st\0"
+"tui\0"
 "com.sv\0"
-"com.sy\0"
-"com.tj\0"
-"hatsukaichi.hiroshima.jp\0protection\0"
+"pro.om\0studio.us-gov-west-1.sagemaker.aws\0"
+"komaki.aichi.jp\0"
+"granvin.no\0com.sy\0"
+"ookuwa.nagano.jp\0com.tj\0"
+"\xe5\x95\x86\xe6\xa0\x87\0"
 "com.tm\0"
-"com.tn\0"
+"my.id\0com.tn\0"
 "com.to\0"
-"educator.aero\0hjelmeland.no\0com.ua\0"
+"skin\0"
+"com.ua\0"
 "com.tr\0"
-"chungbuk.kr\0com.tt\0"
-"s3-website.ap-northeast-2.amazonaws.com\0"
-"shiroishi.miyagi.jp\0toyama.toyama.jp\0"
-"karlsoy.no\0com.tw\0com.ug\0lib.mn.us\0"
-"onza.mythic-beasts.com\0"
-"freetls.fastly.net\0pb.leg.br\0"
-"dr.na\0samnanger.no\0"
-"\xd8\xa8\xd8\xa7\xd8\xb2\xd8\xa7\xd8\xb1\0grozny.ru\0"
-"!city.kawasaki.jp\0streamlit.app\0"
-"dnsdojo.org\0"
-"def.br\0democrat\0"
-"com.vc\0"
-"harima.hyogo.jp\0shell\0"
-"orskog.no\0com.ve\0tui\0"
-"hitachi.ibaraki.jp\0"
-"knightpoint.systems\0"
-"lur\xc3\xb8y.no\0com.uy\0com.vi\0"
+"b\xc3\xa1l\xc3\xa1t.no\0s3-object-lambda.eu-central-1.amazonaws.com\0s3-object-lambda.me-south-1.amazonaws.com\0from-oh.com\0"
+"sukagawa.fukushima.jp\0com.tt\0"
+"\xe5\xb1\xb1\xe6\xa2\xa8.jp\0cern\0"
+"com.tw\0com.ug\0"
+"aknoluokta.no\0us.ngrok.io\0"
+"jx.cn\0andria-trani-barletta.it\0"
+"notodden.no\0"
+"pro.pr\0"
+"orsta.no\0"
+"tvs\0"
+"shiogama.miyagi.jp\0limanowa.pl\0"
+"oumu.hokkaido.jp\0kouzushima.tokyo.jp\0"
+"gloppen.no\0sm.ua\0com.vc\0dyn53.io\0"
+"com.ve\0streamlitapp.com\0"
+"osaka.jp\0"
+"com.uy\0com.vi\0"
 "com.uz\0"
-"nic.za\0tires\0video\0from-ak.com\0"
-"deta.app\0"
-"com.vn\0"
-"j\xc3\xb8lster.no\0progressive\0"
-"kazo.saitama.jp\0"
-"vgs.no\0com.vu\0"
-"vercel.app\0"
+"biev\xc3\xa1t.no\0"
+"kapsi.fi\0myds.me\0"
+"com.vn\0mydatto.net\0"
+"kariya.aichi.jp\0gets-it.net\0"
+"h\xc3\xa5.no\0rade.no\0sk\xc3\xa1nit.no\0rv.ua\0"
+"balashov.su\0"
+"trani-barletta-andria.it\0fudai.iwate.jp\0"
+"com.vu\0mypets.ws\0"
+"vda.it\0\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86\0"
+"*.nom.br\0"
+"elementor.cool\0"
+"tj\xc3\xb8me.no\0"
+"v\xc3\xa5gs\xc3\xb8y.no\0com.ws\0"
+"repair\0"
+"aquarelle\0tuva.su\0"
+"lt.it\0myamaze.net\0"
+"miyawaka.fukuoka.jp\0"
+"auth.us-east-1.amazoncognito.com\0"
+"livorno.it\0torun.pl\0"
+"ekloges.cy\0com.ye\0"
+"\xe5\xb3\xb6\xe6\xa0\xb9.jp\0foundation\0"
+"\xe0\xae\x87\xe0\xae\xb2\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x88\0"
+"hyllestad.no\0"
+"taiji.wakayama.jp\0"
+"winners\0"
+"pro.tt\0"
+"trycloudflare.com\0"
+"hongo.hiroshima.jp\0"
+"austevoll.no\0"
+"studio.ap-northeast-3.sagemaker.aws\0"
+"africa.bj\0it1.eur.aruba.jenv-aruba.cloud\0"
+"s3.ap-northeast-3.amazonaws.com\0"
+"*.user.localcert.dev\0"
+"stokke.no\0com.zm\0"
+"hn.cn\0izumozaki.niigata.jp\0"
+"obninsk.su\0"
+"messerli.app\0"
+"sorreisa.no\0q-a.eu.org\0"
+"riopreto.br\0hiphop\0"
+"site.tb-hosting.com\0"
+"kaisei.kanagawa.jp\0higashiomi.shiga.jp\0comcast\0penne.jp\0"
+"mr.no\0alibaba\0"
+"pro.vn\0"
+"catania.it\0\xe5\xb2\xa9\xe6\x89\x8b.jp\0kitakata.fukushima.jp\0"
+"google\0"
+"adobeioruntime.net\0"
+"kitanakagusuku.okinawa.jp\0"
+"balestrand.no\0is-very-bad.org\0s3.teckids.org\0"
+"yamakita.kanagawa.jp\0test.tj\0"
+"\xc3\xb8ksnes.no\0in-brb.de\0*.nodebalancer.linode.com\0"
+"friulive-giulia.it\0yashio.saitama.jp\0"
+"pl.ua\0"
+"takasago.hyogo.jp\0"
+"\xe0\xb6\xbd\xe0\xb6\x82\xe0\xb6\x9a\xe0\xb7\x8f\0"
+"bsb.br\0appengine.flow.ch\0"
+"cloudns.us\0"
+"iz.hr\0"
+"chikusei.ibaraki.jp\0"
+"from-ct.com\0"
+"nabari.mie.jp\0"
+"*.eu-north-1.airflow.amazonaws.com\0"
+"1kapp.com\0"
+"ebetsu.hokkaido.jp\0noto.ishikawa.jp\0"
+"vps.mcdir.ru\0lib.de.us\0"
+"\xe5\xae\xb6\xe9\x9b\xbb\0s3.eu-south-2.amazonaws.com\0cloudcontrolapp.com\0"
+"ballangen.no\0sellfy.store\0"
+"thanhphohochiminh.vn\0cat.ax\0"
+"uno\0"
+"palermo.it\0"
+"iservschule.de\0shopitsite.com\0"
+"buzz\0"
+"\xe4\xb8\xaa\xe4\xba\xba.hk\0"
+"cooperativa.bo\0"
+"ms.leg.br\0"
+"\xd0\xb0\xd0\xba.\xd1\x81\xd1\x80\xd0\xb1\0emrappui-prod.eu-west-3.amazonaws.com\0"
+"yokosuka.kanagawa.jp\0szkola.pl\0uol\0smartlabeling.scw.cloud\0"
+"ghost.io\0"
+"is.it\0"
+"gitpage.si\0"
+"bss.design\0"
+"laakesvuemie.no\0police.uk\0test.ru\0"
+"lenvik.no\0emrstudio-prod.ap-east-1.amazonaws.com\0"
+"jele.club\0"
+"dnepropetrovsk.ua\0"
+"koga.fukuoka.jp\0"
+"gs.jan-mayen.no\0"
+"fujimi.nagano.jp\0"
+"v\xc3\xa5ler.\xc3\xb8stfold.no\0simplesite.com\0"
+"anan.nagano.jp\0"
+"cci.fr\0"
+"v-info.info\0"
+"ups\0"
+"egoism.jp\0"
+"dyndns-office.com\0"
+"mt.leg.br\0"
+"insurance.aero\0webview-assets.cloud9.ap-northeast-3.amazonaws.com\0"
+"otsuchi.iwate.jp\0"
+"dynamisches-dns.de\0"
+"tsubetsu.hokkaido.jp\0"
+"s\xc3\xb8rum.no\0"
+"rexroth\0"
+"app.render.com\0"
+"hair\0"
+"supplies\0tr.eu.org\0mayfirst.org\0"
+"sowa.ibaraki.jp\0"
+"hasuda.saitama.jp\0"
+"ichikawa.hyogo.jp\0"
+"fam.pk\0"
+"res.aero\0\xd1\x81\xd0\xbf\xd0\xb1.\xd1\x80\xd1\x83\xd1\x81\0"
+"mk.ua\0"
+"xii.jp\0"
+"kindle\0"
+"kitakami.iwate.jp\0*.lcl.dev\0"
+"boomla.net\0"
+"mil.ac\0alsace\0"
+"kawahara.tottori.jp\0"
+"mil.ae\0"
+"jampa.br\0tenei.fukushima.jp\0lezajsk.pl\0"
+"vfs.cloud9.ap-east-1.amazonaws.com\0"
+"kyowa.akita.jp\0"
+"s3.ap-south-2.amazonaws.com\0"
+"honjyo.akita.jp\0nakatombetsu.hokkaido.jp\0kitayama.wakayama.jp\0ostrowiec.pl\0j.scaleforce.net\0"
+"lt.ua\0"
+"mil.al\0andria-barletta-trani.it\0uwajima.ehime.jp\0"
+"sport\0"
+"vana\0"
+"takahagi.ibaraki.jp\0"
+"mil.ba\0"
+"mil.ar\0vall\xc3\xa9""e-d-aoste.it\0"
+"chiyoda.tokyo.jp\0"
+"ann-arbor.mi.us\0"
+"\xe0\xb8\xa8\xe0\xb8\xb6\xe0\xb8\x81\xe0\xb8\xa9\xe0\xb8\xb2.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
+"mil.az\0pavia.it\0"
+"\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa7\xb0\xe0\xa6\xa4\0"
+"md.us\0s3-website.dualstack.eu-west-1.amazonaws.com\0"
+"cq.cn\0kawakami.nara.jp\0tochigi.tochigi.jp\0digick.jp\0"
+"mil.bo\0"
+"nagaoka.niigata.jp\0"
+"mil.br\0fr.it\0yatsuka.shimane.jp\0definima.net\0"
+"vet\0"
+"kv.ua\0"
+"mil.by\0skedsmokorset.no\0zhitomir.ua\0url.tw\0"
+"heteml.net\0"
+"s3.me-central-1.amazonaws.com\0"
+"mil.cl\0eu.int\0perugia.it\0"
+"mil.cn\0"
+"mil.co\0odesa.ua\0phone\0"
+"ichinohe.iwate.jp\0higashiosaka.osaka.jp\0slupsk.pl\0"
+"lur\xc3\xb8y.no\0familyds.org\0"
+"mil.cy\0"
+"cam.it\0shimonoseki.yamaguchi.jp\0"
+"midtre-gauldal.no\0"
+"bozen-sudtirol.it\0ryuoh.shiga.jp\0"
+"ichinomiya.chiba.jp\0"
+"mil.do\0"
+"be.ax\0"
+"industries\0"
+"powiat.pl\0"
+"mil.ec\0kh.ua\0"
+"chips.jp\0oxa.cloud\0"
+"mil.eg\0skanit.no\0"
+"katsuura.chiba.jp\0"
+"s3-website.dualstack.us-east-1.amazonaws.com\0"
+"miyoshi.hiroshima.jp\0"
+"miyoshi.aichi.jp\0"
+"no-ip.ca\0"
+"inazawa.aichi.jp\0"
+"cloudns.pw\0"
+"nz.basketball\0"
+"sumy.ua\0"
+"himeshima.oita.jp\0"
+"dnsdojo.org\0"
+"h\xc3\xa1""bmer.no\0vig\0"
+"mil.fj\0"
+"pictet\0"
+"vin\0"
+"shinshinotsu.hokkaido.jp\0starachowice.pl\0vip\0"
+"is-a-anarchist.com\0"
+"kep.tr\0"
+"mil.ge\0"
+"higashiyama.kyoto.jp\0"
+"mil.gh\0"
+"kinghost.net\0"
+"toshiba\0vfs.cloud9.ap-northeast-1.amazonaws.com\0servehumour.com\0"
+"thruhere.net\0"
+"shinjo.nara.jp\0"
+"hekinan.aichi.jp\0futsu.nagasaki.jp\0"
+"r\xc3\xa5""de.no\0"
+"mil.gt\0"
+"blockbuster\0"
+"r\xc3\xa6lingen.no\0"
+"shizuoka.jp\0rs.webaccel.jp\0"
+"s3.dualstack.us-east-1.amazonaws.com\0"
+"zlg.br\0"
+"okawa.kochi.jp\0inagi.tokyo.jp\0phutho.vn\0"
+"omega\0""180r.com\0"
+"mil.hn\0"
+"sande.m\xc3\xb8re-og-romsdal.no\0clothing\0"
+"gyokuto.kumamoto.jp\0namegawa.saitama.jp\0fukumitsu.toyama.jp\0"
+"valleaosta.it\0"
+"roros.no\0studio.ap-southeast-1.sagemaker.aws\0"
+"mil.id\0eiheiji.fukui.jp\0"
+"nanto.toyama.jp\0"
+"voyage\0"
+"aarp\0"
+"ie.ua\0"
+"cc.hn\0"
+"azure-mobile.net\0"
+"il.us\0"
+"mil.in\0gorizia.it\0ens.tn\0"
+"mil.iq\0vestby.no\0globo\0"
+"bz.it\0"
+"alesund.no\0barsyonline.co.uk\0"
+"kure.hiroshima.jp\0"
+"sk\xc3\xa5nland.no\0emrnotebooks-prod.eu-west-3.amazonaws.com\0"
+"herad.no\0bo.telemark.no\0organic\0photo\0"
+"togo.aichi.jp\0"
+"nohost.me\0"
+"servebbs.net\0"
+"mil.jo\0stord.no\0"
+"bs.it\0fukuchiyama.kyoto.jp\0peewee.jp\0"
+"notebook-fips.us-east-2.sagemaker.aws\0be.gy\0"
+"winb.gov.pl\0"
+"mil.kg\0ybo.review\0"
+"cdn77-ssl.net\0"
+"\xe7\xb6\xb2\xe7\xb5\xa1.\xe9\xa6\x99\xe6\xb8\xaf\0orange\0"
+"kisarazu.chiba.jp\0"
+"kawazu.shizuoka.jp\0wif.gov.pl\0"
+"mil.km\0haus\0"
+"bl.it\0mie.jp\0"
+"kitagawa.kochi.jp\0"
+"studio.eu-west-2.sagemaker.aws\0"
+"mil.kr\0"
+"maringa.br\0shiraoka.saitama.jp\0"
+"outsystemscloud.com\0"
+"\xe5\xa5\x88\xe8\x89\xaf.jp\0"
+"ecologia.bo\0movimiento.bo\0gs.tm.no\0bharti\0sa.com\0"
+"otaki.nagano.jp\0mil.kz\0"
+"myddns.rocks\0"
+"takamori.nagano.jp\0"
+"s3-sa-east-1.amazonaws.com\0"
+"bio.br\0"
+"storfjord.no\0s3-object-lambda.ap-south-2.amazonaws.com\0"
+"mil.lv\0buyshouses.net\0redirectme.net\0"
+"szex.hu\0mil.mg\0batsfjord.no\0auth.us-west-2.amazoncognito.com\0"
+"kanazawa.ishikawa.jp\0"
+"an.it\0"
+"dyn.ddnss.de\0ashgabad.su\0"
+"cdn-edges.net\0"
+"genting\0"
+"tagajo.miyagi.jp\0"
+"luster.no\0cc.vi.us\0"
+"mil.mv\0"
+"mil.ng\0fedorapeople.org\0"
+"ag.it\0"
+"mil.my\0mil.ni\0"
+"mil.mz\0"
+"annaka.gunma.jp\0"
+"cc.na\0halden.no\0hitachi\0"
+"mil.no\0"
+"shioya.tochigi.jp\0myspreadshop.nl\0"
+"from-mo.com\0"
+"hungry.jp\0"
+"myspreadshop.no\0"
+"r\xc3\xa5holt.no\0"
+"koza.wakayama.jp\0"
+"oshu.iwate.jp\0"
+"saogonca.br\0niiza.saitama.jp\0mil.nz\0principe.st\0"
+"higashi.okinawa.jp\0"
+"mandal.no\0"
+"mil.pe\0net-freaks.com\0"
+"s3-eu-north-1.amazonaws.com\0syno-ds.de\0"
+"yamagata.gifu.jp\0mil.ph\0"
+"mil.pl\0"
+"barclays\0"
+"is-very-good.org\0"
+"ishikawa.jp\0tsuno.kochi.jp\0myspreadshop.pl\0"
+"city.hu\0\xc3\xb8stre-toten.no\0mil.qa\0\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0emrappui-prod.us-gov-west-1.amazonaws.com\0"
+"select\0"
+"jeju.kr\0"
+"in-dsl.org\0"
+"mil.py\0jpn.org\0"
+"campinagrande.br\0"
+"k12.ec\0vestvagoy.no\0*.ap-southeast-2.airflow.amazonaws.com\0"
+"chernihiv.ua\0uk.eu.org\0"
+"venezia.it\0gsm.pl\0\xe0\xb4\xad\xe0\xb4\xbe\xe0\xb4\xb0\xe0\xb4\xa4\xe0\xb4\x82\0leczna.pl\0"
+"jc.neen.it\0"
+"studio.ap-east-1.sagemaker.aws\0"
+"fujikawa.shizuoka.jp\0binhduong.vn\0"
+"wed\0"
+"k12.wi.us\0kyoto\0"
+"nakaniikawa.toyama.jp\0myspreadshop.it\0"
+"loab\xc3\xa1t.no\0"
 "usui.fukuoka.jp\0"
-"dvag\0is-into-anime.com\0"
-"funahashi.toyama.jp\0"
-"sel.no\0goip.de\0"
-"gamo.shiga.jp\0"
-"hostedpi.com\0"
-"tvs\0vladikavkaz.ru\0"
-"gwangju.kr\0imdb\0"
-"rc.it\0"
-"com.ws\0kpmg\0"
-"kamisunagawa.hokkaido.jp\0"
-"123sait.ru\0"
-"pa.gov.pl\0myeffect.net\0"
-"warmia.pl\0"
-"lviv.ua\0"
-"zuerich\0"
-"nes.akershus.no\0ngo.za\0"
-"lomza.pl\0mc.ax\0"
-"\xeb\x8b\xb7\xeb\x84\xb7\0dattolocal.com\0vladikavkaz.su\0"
+"my-gateway.de\0"
+"pippu.hokkaido.jp\0"
+"able\0*.triton.zone\0opensocial.site\0"
+"is-a-doctor.com\0"
+"notebook.ap-northeast-3.sagemaker.aws\0"
+"tone.ibaraki.jp\0chat\0"
+"notebook.ap-southeast-1.sagemaker.aws\0cx.ua\0"
+"education\0"
+"press\0mil.ru\0"
+"sampa.br\0higashine.yamagata.jp\0"
+"mil.rw\0"
+"mil.sh\0"
+"enscaled.sg\0"
+"restaurant.bj\0cuiaba.br\0"
+"s3-website.dualstack.ap-south-1.amazonaws.com\0s3.eu-central-1.amazonaws.com\0is-a-bulls-fan.com\0"
+"westeurope.azurestaticapps.net\0"
+"gentlentapis.com\0"
+"from-ny.net\0"
+"bydgoszcz.pl\0"
+"gleeze.com\0"
+"s3-website.eu-west-2.amazonaws.com\0"
+"mil.st\0"
+"s3.dualstack.us-gov-west-1.amazonaws.com\0"
+"zpisdn.gov.pl\0"
+"mil.sy\0"
+"cieszyn.pl\0mil.tj\0"
+"l\xc3\xa1hppi.no\0co.events\0"
+"mil.tm\0"
+"kvinnherad.no\0mil.to\0notebook.af-south-1.sagemaker.aws\0"
+"rj.gov.br\0"
+"gub.uy\0"
+"mil.tr\0"
+"aktyubinsk.su\0"
+"\xe6\xbb\x8b\xe8\xb3\x80.jp\0kasama.ibaraki.jp\0lamdong.vn\0"
+"s3-accesspoint.dualstack.ap-southeast-4.amazonaws.com\0"
+"mil.tw\0"
+"selfip.info\0"
+"mil.tz\0"
+"sakura.tochigi.jp\0"
+"revista.bo\0mo-i-rana.no\0cc.ua\0us.org\0"
+"afjord.no\0luroy.no\0"
+"rishiri.hokkaido.jp\0"
+"mil.vc\0"
+"k12.il\0"
+"mil.ve\0"
+"\xd7\x99\xd7\xa9\xd7\xa8\xd7\x90\xd7\x9c\0"
+"*.tst.site\0"
+"achi.nagano.jp\0"
+"navuotna.no\0mil.uy\0eu-west-2.elasticbeanstalk.com\0"
+"minamata.kumamoto.jp\0"
+"yamanakako.yamanashi.jp\0targi.pl\0"
+"k12.tx.us\0emrnotebooks-prod.us-east-2.amazonaws.com\0secaas.hk\0"
+"goip.de\0virtualserver.io\0"
+"rec.br\0win\0de.trendhosting.cloud\0"
+"nakai.kanagawa.jp\0ondigitalocean.app\0"
+"sauda.no\0"
+"webview-assets.aws-cloud9.eu-south-1.amazonaws.com\0*.awdev.ca\0"
+"ownip.net\0"
+"country\0"
+"laocai.vn\0eurovision\0it1.jenv-aruba.cloud\0"
+"norddal.no\0s3-accesspoint.af-south-1.amazonaws.com\0"
+"hitachinaka.ibaraki.jp\0"
+"rec.co\0"
+"akamai.net\0"
+"abashiri.hokkaido.jp\0"
+"s3-deprecated.us-east-1.amazonaws.com\0dyndns-remote.com\0"
+"from-az.net\0"
+"accountant\0"
+"koobin.events\0"
+"ikeda.hokkaido.jp\0worse-than.tv\0"
+"republican\0"
+"nhlfan.net\0"
+"mel\xc3\xb8y.no\0mil.ye\0ufcfan.org\0"
+"kobierzyce.pl\0"
+"eu.encoway.cloud\0"
+"gon.pk\0*.on-rio.io\0"
+"kunigami.okinawa.jp\0nirasaki.yamanashi.jp\0"
+"vestre-toten.no\0""123sait.ru\0"
+"a.run.app\0"
+"mil.za\0"
+"ishikawa.fukushima.jp\0"
+"kashiba.nara.jp\0"
+"scientist.aero\0wme\0"
+"yoshinogari.saga.jp\0hoabinh.vn\0"
+"yahaba.iwate.jp\0"
+"mil.zm\0"
+"genoa.it\0nagatoro.saitama.jp\0"
+"messwithdns.com\0"
+"hosting-cluster.nl\0"
+"official.academy\0"
+"surgery\0"
+"ayase.kanagawa.jp\0azurestaticapps.net\0"
+"eng.pro\0club.tw\0mil.zw\0"
+"aaa.pro\0studio.ca-central-1.sagemaker.aws\0myspreadshop.se\0"
+"karatsu.saga.jp\0"
+"bozen-suedtirol.it\0yatomi.aichi.jp\0"
+"w.bg\0"
+"dyndns.biz\0"
+"sunndal.no\0dnsfor.me\0"
+"cc.ny.us\0"
+"\xe5\xb1\xb1\xe5\xbd\xa2.jp\0"
+"nh-serv.co.uk\0"
+"*.usercontent.goog\0"
+"aetna\0"
+"p.bg\0"
+"itayanagi.aomori.jp\0sncf\0yandexcloud.net\0"
+"s3-fips.us-east-1.amazonaws.com\0"
+"slask.pl\0"
+"nakamichi.yamanashi.jp\0"
+"raffleentry.org.uk\0"
+"kashihara.nara.jp\0"
+"sevastopol.ua\0wow\0virtualuser.de\0"
+"i.bg\0schule\0"
+"kami.miyagi.jp\0"
+"macerata.it\0"
+"mokuren.ne.jp\0"
+"anani.br\0uozu.toyama.jp\0wkz.gov.pl\0"
+"airport.aero\0"
+"rugby\0"
+"holdings\0"
+"shiki.saitama.jp\0"
+"b.bg\0"
+"iwi.nz\0"
+"webview-assets.aws-cloud9.ap-northeast-3.amazonaws.com\0"
+"cc.mt.us\0cc.nd.us\0"
+"skjak.no\0webview-assets.aws-cloud9.ap-southeast-1.amazonaws.com\0"
+"suifu.ibaraki.jp\0mincom.tn\0"
+"mckinsey\0"
+"b.br\0sabae.fukui.jp\0"
+"kitaura.miyazaki.jp\0"
+"is-a-cubicle-slave.com\0"
+"wakasa.fukui.jp\0"
+"pramerica\0myftp.org\0"
+"vlaanderen\0"
+"playstation-cloud.com\0"
+"tsukigata.hokkaido.jp\0"
+"jelastic.saveincloud.net\0"
+"kani.gifu.jp\0hidaka.kochi.jp\0"
+"namikata.ehime.jp\0"
+"mihama.chiba.jp\0"
+"cust.testing.thingdust.io\0"
+"s3-accesspoint.eu-west-2.amazonaws.com\0"
+"oiso.kanagawa.jp\0"
+"emrnotebooks-prod.eu-south-1.amazonaws.com\0eu-south-1.elasticbeanstalk.com\0"
+"wtc\0"
+"h\xc3\xb8yanger.no\0webview-assets.cloud9.ap-southeast-2.amazonaws.com\0"
+"wtf\0s3-website.nl-ams.scw.cloud\0"
+"k12.tr\0"
+"int.ar\0kadena.okinawa.jp\0"
+"dyn-vpn.de\0"
+"stordal.no\0cust.retrosnub.co.uk\0"
+"kuromatsunai.hokkaido.jp\0"
+"\xc3\xa5rdal.no\0lipsy\0"
+"shiso.hyogo.jp\0"
+"sa.gov.au\0"
+"int.az\0rec.nf\0computer\0dnsdojo.net\0"
+"empresa.bo\0finance\0"
+"tabayama.yamanashi.jp\0"
+"bozen-s\xc3\xbc""dtirol.it\0s3-object-lambda.cn-north-1.amazonaws.com.cn\0"
+"int.bo\0"
+"berlev\xc3\xa5g.no\0vaporcloud.io\0"
+"tomioka.gunma.jp\0"
+"works\0loseyourip.com\0"
+"world\0"
+"k12.nv.us\0k12.vi\0emrstudio-prod.ap-northeast-1.amazonaws.com\0"
+"int.ci\0"
+"toyo.kochi.jp\0vpndns.net\0"
+"cc.la.us\0s3.ap-northeast-1.amazonaws.com\0studio.sa-east-1.sagemaker.aws\0"
+"\xe0\xb8\x98\xe0\xb8\xb8\xe0\xb8\xa3\xe0\xb8\x81\xe0\xb8\xb4\xe0\xb8\x88.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
+"virgin\0watson.jp\0halfmoon.jp\0"
+"int.co\0"
+"nago.okinawa.jp\0"
+"nikko.tochigi.jp\0static-access.net\0"
+"8.bg\0storebase.store\0"
+"suita.osaka.jp\0"
+"k12.ne.us\0fantasyleague.cc\0"
+"int.cv\0"
+"andebu.no\0"
+"ranzan.saitama.jp\0bona.jp\0"
+"\xe3\x83\x95\xe3\x82\xa1\xe3\x83\x83\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\0dattoweb.com\0"
+"inf.br\0namie.fukushima.jp\0katsuragi.wakayama.jp\0"
+"bokn.no\0"
+"1.bg\0"
+"k12.nh.us\0jelastic.team\0"
+"tarui.gifu.jp\0"
+"rr.gov.br\0"
+"volvo\0tech.orange\0"
+"abira.hokkaido.jp\0ikeda.nagano.jp\0"
+"dyndns-ip.com\0"
+"*.bd\0massa-carrara.it\0hagiang.vn\0"
+"novara.it\0\xe5\x92\x8c\xe6\xad\x8c\xe5\xb1\xb1.jp\0"
+"inf.cu\0college\0"
+"aizuwakamatsu.fukushima.jp\0"
+"benevento.it\0semine.miyagi.jp\0"
+"komatsu\0"
+"vardo.no\0is-a-rockstar.com\0"
+"capoo.jp\0"
+"emrappui-prod.eu-west-1.amazonaws.com\0"
+"firewall-gateway.net\0"
+"myspreadshop.es\0"
+"oshima.yamaguchi.jp\0"
+"lib.ee\0siiites.com\0"
+"chikuhoku.nagano.jp\0netgamers.jp\0"
+"holy.jp\0"
+"*.ck\0asnes.no\0h\xc3\xa6gebostad.no\0rec.ro\0damnserver.com\0myspreadshop.fi\0"
+"taranto.it\0ninohe.iwate.jp\0"
+"webview-assets.aws-cloud9.ap-south-1.amazonaws.com\0"
+"rs.gov.br\0sc.gov.br\0xin\0perma.jp\0"
+"in-vpn.de\0loginto.me\0"
+"savona.it\0*.stgstage.dev\0"
+"wmcloud.org\0ybo.science\0"
+"s3.eu-west-1.amazonaws.com\0"
+"myspreadshop.fr\0"
+"k12.la.us\0"
+"frei.no\0"
+"b\xc3\xa1hccavuotna.no\0cc.in.us\0"
+"hashima.gifu.jp\0"
+"s3-eu-west-1.amazonaws.com\0"
+"dongthap.vn\0a.ssl.fastly.net\0"
+"gs.fm.no\0"
+"kasugai.aichi.jp\0"
+"ocelot.mythic-beasts.com\0"
+"s3.dualstack.us-gov-east-1.amazonaws.com\0"
+"yao.osaka.jp\0przeworsk.pl\0\xe0\xb8\xa3\xe0\xb8\xb1\xe0\xb8\x90\xe0\xb8\x9a\xe0\xb8\xb2\xe0\xb8\xa5.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
+"api.stdlib.com\0"
+"mein-iserv.de\0"
+"*.er\0"
+"stranda.no\0"
+"homeftp.org\0"
+"int.in\0kontum.vn\0"
+"myspreadshop.ie\0"
+"i.ng\0"
+"*.fk\0int.is\0"
+"florist\0"
+"\xc3\xb8rland.no\0"
+"det.br\0"
+"rec.ve\0airbus\0"
+"cc.hi.us\0nalchik.ru\0"
+"legal\0myspreadshop.at\0"
+"riik.ee\0aurskog-h\xc3\xb8land.no\0framer.website\0cloud.interhostsolutions.be\0myspreadshop.be\0"
+"kasahara.gifu.jp\0"
+"muosat.no\0\xeb\x8b\xb7\xeb\x84\xb7\0boldlygoingnowhere.org\0homelink.one\0"
+"tateyama.chiba.jp\0taketomi.okinawa.jp\0daynight.jp\0"
+"airkitapps.com\0"
+"kawakami.nagano.jp\0"
+"meloy.no\0s3-accesspoint.ap-southeast-2.amazonaws.com\0"
+"trani-andria-barletta.it\0seiro.niigata.jp\0"
+"safety\0s3.dualstack.ap-southeast-4.amazonaws.com\0nalchik.su\0myspreadshop.ca\0"
+"limited\0static.land\0"
+"grocery\0"
+"int.la\0"
+"def.br\0setouchi.okayama.jp\0i.ph\0curv.dev\0myspreadshop.ch\0"
+"hdfc\0"
+"qld.edu.au\0"
+"kamoenai.hokkaido.jp\0ooshika.nagano.jp\0"
+"mymailer.com.tw\0"
+"loan\0"
+"int.lk\0stockholm\0"
+"dni.us\0"
+"intl.tn\0ric.jelastic.vps-host.net\0"
+"heroy.more-og-romsdal.no\0lib.va.us\0myspreadshop.de\0"
+"trentinosuedtirol.it\0"
+"puglia.it\0mikawa.yamagata.jp\0"
+"w.se\0"
+"hyogo.jp\0"
+"myspreadshop.dk\0"
+"rn.gov.br\0"
+"agematsu.nagano.jp\0in-dsl.net\0"
+"adygeya.su\0"
+"udine.it\0"
+"office-on-the.net\0"
+"csx.cc\0"
+"p.se\0bridgestone\0"
+"fuchu.hiroshima.jp\0"
+"infiniti\0"
+"laspezia.it\0"
+"*.jm\0commbank\0"
+"int.mv\0""7.azurestaticapps.net\0"
+"int.mw\0inder\xc3\xb8y.no\0"
+"int.ni\0"
+"azure\0barsy.online\0novecore.site\0"
+"s3-accesspoint.dualstack.ap-northeast-1.amazonaws.com\0"
+"i.se\0azimuth.network\0"
+"*.kh\0hotmail\0"
+"honbetsu.hokkaido.jp\0"
+"estate\0"
+"netbank\0servebbs.org\0"
+"ro.gov.br\0kitashiobara.fukushima.jp\0"
+"inf.mk\0"
+"cloudcontrolled.com\0"
+"yahiko.niigata.jp\0"
+"k12.il.us\0cafjs.com\0"
+"b.se\0"
+"chungbuk.kr\0"
+"gs.bu.no\0amfam\0"
+"karuizawa.nagano.jp\0opole.pl\0"
+"wlocl.pl\0"
+"*.diher.solutions\0"
+"ichikawa.chiba.jp\0shimotsuma.ibaraki.jp\0"
+"nagano.nagano.jp\0"
+"rar.ve\0adygeya.ru\0"
+"hatsukaichi.hiroshima.jp\0kawai.nara.jp\0saitama.saitama.jp\0"
+"dyr\xc3\xb8y.no\0"
+"kouhoku.saga.jp\0"
+"takko.aomori.jp\0"
+"paris\0security\0emrnotebooks-prod.ap-south-1.amazonaws.com\0"
+"tome.miyagi.jp\0"
+"int.pt\0gmail\0"
+"*.mm\0est-a-la-masion.com\0"
+"nishiawakura.okayama.jp\0"
+"notebook.eu-west-3.sagemaker.aws\0"
+"friulivegiulia.it\0"
+"square7.de\0"
+"monza.it\0ogawa.ibaraki.jp\0gda.pl\0"
+"s3.us-west-1.amazonaws.com\0amscompute.com\0"
+"brasilia.me\0"
+"shobara.hiroshima.jp\0"
+"kochi.kochi.jp\0*.np\0"
+"is-a-financialadvisor.com\0"
+"engineer\0"
+"shirako.chiba.jp\0shibuya.tokyo.jp\0ac.leg.br\0"
+"\xd9\x85\xd9\x88\xd9\x82\xd8\xb9\0"
+"konan.aichi.jp\0"
+"df.gov.br\0"
+"ibestad.no\0barsy.me\0"
+"sohu\0from-wa.com\0stuff-4-sale.us\0"
+"int.ru\0"
+"oguni.kumamoto.jp\0"
+"kvitsoy.no\0cc.dc.us\0"
+"sanok.pl\0swatch\0"
+"naka.ibaraki.jp\0"
+"pixolino.com\0"
+"indigena.bo\0agency\0"
+"*.pg\0"
+"fastvps-server.com\0"
+"int.tj\0sakura.ne.jp\0"
+"webview-assets.aws-cloud9.sa-east-1.amazonaws.com\0"
+"square7.ch\0mongolian.jp\0lon-2.paas.massivegrid.net\0"
+"int.tt\0"
+"frenchkiss.jp\0"
+"levanger.no\0blogdns.com\0"
+"tushu\0execute-api.ap-east-1.amazonaws.com\0"
+"myoko.niigata.jp\0"
+"citi\0kurgan.su\0"
+"tw.cn\0cdn.prod.atlassian-dev.net\0"
+"crew.aero\0"
+"soc.srcf.net\0"
+"s3-website.af-south-1.amazonaws.com\0"
+"modena.it\0nakano.nagano.jp\0"
+"int.ve\0"
+"kunisaki.oita.jp\0flickr\0"
+"eidskog.no\0toyota\0"
+"b\xc3\xb8.nordland.no\0"
+"sakyo.kyoto.jp\0"
+"adv.br\0\xe0\xb8\xad\xe0\xb8\x87\xe0\xb8\x84\xe0\xb9\x8c\xe0\xb8\x81\xe0\xb8\xa3.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
+"city\0inf.ua\0"
+"int.vn\0"
+"xxx\0"
+"skien.no\0"
+"okinawa.okinawa.jp\0"
+"s3.dualstack.ca-central-1.amazonaws.com\0"
+"handa.aichi.jp\0"
+"zone\0"
+"omuta.fukuoka.jp\0"
+"vix.br\0bandai.fukushima.jp\0"
+"lifeinsurance\0kilatiron.com\0"
+"cloud.jelastic.open.tim.it\0"
+"nsn.us\0"
+"prato.it\0s\xc3\xbc""dtirol.it\0netflix\0"
+"fujisawa.kanagawa.jp\0hinohara.tokyo.jp\0"
+"giize.com\0"
+"ostroleka.pl\0xyz\0myfritz.net\0"
+"kazimierz-dolny.pl\0"
+"song\0"
+"cnt.br\0"
+"e12.ve\0"
+"sk.ca\0"
+"nextdirect\0"
+"barsy.ro\0"
+"valleeaoste.it\0vs.it\0"
+"rovno.ua\0"
+"studio.ap-northeast-2.sagemaker.aws\0"
+"minamiizu.shizuoka.jp\0hyatt\0emrappui-prod.cn-northwest-1.amazonaws.com.cn\0"
+"vic.au\0independent-inquiry.uk\0"
+"arida.wakayama.jp\0thanhhoa.vn\0"
+"sony\0"
+"airtraffic.aero\0wpdevcloud.com\0"
+"zapto.xyz\0"
+"time.no\0"
+"kolobrzeg.pl\0"
+"morioka.iwate.jp\0"
+"yonaguni.okinawa.jp\0"
+"mrap.accesspoint.s3-global.amazonaws.com\0"
+"sd.cn\0"
+"graphox.us\0uwu.ai\0"
+"svalbard.no\0sondre-land.no\0"
+"ve.it\0izumizaki.fukushima.jp\0"
+"nichinan.miyazaki.jp\0okuizumo.shimane.jp\0cn-north-1.eb.amazonaws.com.cn\0"
+"misato.miyagi.jp\0"
+"sor-odal.no\0"
+"nagato.yamaguchi.jp\0"
+"trentino-sued-tirol.it\0dongnai.vn\0"
+"rhcloud.com\0"
+"se.gov.br\0contact\0on-the-web.tv\0"
+"sandnessj\xc3\xb8""en.no\0emrappui-prod.ap-northeast-1.amazonaws.com\0barsy.uk\0"
+"kitaakita.akita.jp\0"
+"elverum.no\0"
+"deals\0"
+"matrix.jp\0"
+"lib.nv.us\0s3-accesspoint.us-west-1.amazonaws.com\0nov.ru\0"
+"parts\0"
+"taa.it\0akagi.shimane.jp\0"
+"voting\0"
+"gokase.miyazaki.jp\0watch\0siteleaf.net\0"
+"flakstad.no\0party\0"
+"saltdal.no\0radio.am\0"
+"vercelli.it\0"
+"cpa.pro\0lib.mo.us\0"
+"kill.jp\0"
+"\xe6\x9b\xb8\xe7\xb1\x8d\0nov.su\0"
+"valer.hedmark.no\0notebook.ap-northeast-1.sagemaker.aws\0"
+"tp.it\0kin.okinawa.jp\0"
+"emrappui-prod.eu-west-2.amazonaws.com\0"
+"guge\0"
+"lib.mt.us\0lib.nd.us\0"
+"tondabayashi.osaka.jp\0"
+"salangen.no\0edgestack.me\0gentapps.com\0"
+"qh.cn\0!city.sapporo.jp\0"
+"certification.aero\0you\0iamallama.com\0nflfan.org\0"
+"radio.br\0*.compute.amazonaws.com.cn\0"
+"oz.au\0alt.za\0flowers\0"
+"pug.it\0itakura.gunma.jp\0direct\0"
+"bmoattachments.org\0"
+"\xe7\xa6\x8f\xe5\xb2\xa1.jp\0"
+"kanagawa.jp\0"
+"sonla.vn\0"
+"lib.nm.us\0"
+"casacam.net\0"
+"siellak.no\0"
+"sr.it\0"
+"\xc3\xa5lesund.no\0"
+"mishima.shizuoka.jp\0"
+"filegear-sg.me\0""123webseite.de\0"
+"seiyo.ehime.jp\0"
+"kurate.fukuoka.jp\0"
+"kristiansand.no\0"
+"oyabe.toyama.jp\0"
+"skedsmo.no\0"
+"amagasaki.hyogo.jp\0iwaizumi.iwate.jp\0"
+"accenture\0*.user.fm\0"
+"today\0"
+"oum.gov.pl\0"
+"sande.vestfold.no\0"
+"kyuragi.saga.jp\0"
+"guitars\0"
+"shinyoshitomi.fukuoka.jp\0misato.wakayama.jp\0"
+"florence.it\0"
+"alvdal.no\0"
+"sld.do\0rendalen.no\0"
+"marriott\0hu.net\0"
+"loginline.services\0"
+"s\xc3\xa1lat.no\0homes\0"
+"marshalls\0"
+"sa.gov.pl\0"
+"love\0dyn.home-webserver.de\0"
+"shikabe.hokkaido.jp\0cranky.jp\0""123webseite.at\0"
+"nu.ca\0"
+"tokoname.aichi.jp\0"
+"getmyip.com\0pagespeedmobilizer.com\0"
+"rm.it\0"
+"radio.fm\0"
+"markets\0"
+"mywire.org\0"
+"boleslawiec.pl\0"
+"lib.ky.us\0"
+"iwamizawa.hokkaido.jp\0"
+"air-surveillance.aero\0"
+"ham-radio-op.net\0"
+"adv.mz\0"
+"takanezawa.tochigi.jp\0"
+"dyroy.no\0upli.io\0"
+"nagara.chiba.jp\0"
+"notebook-fips.us-gov-east-1.sagemaker.aws\0"
+"help\0"
+"ostre-toten.no\0ap.ngrok.io\0"
 "i234.me\0"
-"worse-than.tv\0"
-"moss.no\0"
-"com.ye\0"
-"x.se\0"
-"tamakawa.fukushima.jp\0"
-"komforb.se\0k12.mt.us\0"
-"sakai.osaka.jp\0"
-"trentinoa-adige.it\0kouzushima.tokyo.jp\0"
-"ing.pa\0"
-"vfs.cloud9.eu-west-1.amazonaws.com\0dscloud.mobi\0woltlab-demo.com\0"
-"ninomiya.kanagawa.jp\0"
-"po.it\0"
-"nt.edu.au\0nedre-eiker.no\0"
-"\xd0\xbe\xd0\xbd\xd0\xbb\xd0\xb0\xd0\xb9\xd0\xbd\0"
-"xerox\0"
-"scientist.aero\0"
-"soo.kagoshima.jp\0"
-"com.zm\0"
-"saogonca.br\0"
-"*.gateway.dev\0"
-"channelsdvr.net\0"
-"onjuku.chiba.jp\0niki.hokkaido.jp\0career\0"
-"yasuda.kochi.jp\0"
-"webhop.info\0"
-"inagawa.hyogo.jp\0durban\0"
-"gratangen.no\0d.se\0"
-"consultant.aero\0luroy.no\0s3-external-1.amazonaws.com\0"
-"hapmir.no\0azure\0versicherung\0backplaneapp.io\0barsy.bg\0"
-"us.org\0"
-"doshi.yamanashi.jp\0bip.sh\0"
-"futaba.fukushima.jp\0"
-"rexroth\0"
-"barsy.ca\0"
-"3utilities.com\0"
-"pr.gov.br\0dr.tr\0"
-"oxa.cloud\0"
-"hidaka.kochi.jp\0"
-"oguni.yamagata.jp\0abbott\0"
-"vao.it\0"
-"app.banzaicloud.io\0ryd.wafaicloud.com\0"
-"wzmiuw.gov.pl\0it1.jenv-aruba.cloud\0"
-"vefsn.no\0"
-"taketomi.okinawa.jp\0"
-"etajima.hiroshima.jp\0weatherchannel\0"
-"*.backyards.banzaicloud.io\0is-a-caterer.com\0barsy.de\0"
-"pmn.it\0ichinomiya.chiba.jp\0kepno.pl\0"
-"l\xc3\xb8""dingen.no\0"
-"9guacu.br\0"
-"flowers\0"
-"kokubunji.tokyo.jp\0"
-"nagaokakyo.kyoto.jp\0"
-"hatogaya.saitama.jp\0"
-"mangyshlak.su\0"
-"aikawa.kanagawa.jp\0"
-"gsj.bz\0"
-"c66.me\0"
-"cn.ua\0from-ky.com\0sa.ngrok.io\0"
-"ono.fukui.jp\0nayoro.hokkaido.jp\0nodes.k8s.pl-waw.scw.cloud\0"
-"bible\0webview-assets.cloud9.me-south-1.amazonaws.com\0ap.ngrok.io\0"
-"from-al.com\0"
-"myfritz.net\0"
-"awsglobalaccelerator.com\0"
-"iitate.fukushima.jp\0\xd0\xbc\xd0\xba\xd0\xb4\0"
-"gran.no\0"
-"kamagaya.chiba.jp\0"
-"service.one\0"
-"federation.aero\0uno\0"
-"chikujo.fukuoka.jp\0"
-"barsy.eu\0"
-"trentino-a-adige.it\0nantan.kyoto.jp\0"
-"paas.datacenter.fi\0"
-"netflix\0"
-"yomitan.okinawa.jp\0"
-"nesset.no\0"
-"tirol\0"
-"miyama.fukuoka.jp\0daiwa.hiroshima.jp\0ouchi.saga.jp\0*.developer.app\0"
-"iki.nagasaki.jp\0uol\0"
-"gildesk\xc3\xa5l.no\0"
-"mc.it\0"
-"bo.telemark.no\0masfjorden.no\0"
-"ddnss.de\0mt.eu.org\0"
-"cn.vu\0"
-"lucania.it\0kibichuo.okayama.jp\0"
-"hadsel.no\0\xe5\xae\xb6\xe9\x9b\xbb\0"
-"koshigaya.saitama.jp\0"
-"zp.gov.pl\0homesklep.pl\0"
-"konsulat.gov.pl\0"
-"cbre\0s3.dualstack.ap-northeast-2.amazonaws.com\0"
-"diskstation.org\0"
-"her.jp\0"
-"navigation.aero\0immo\0"
-"kodaira.tokyo.jp\0torproject.net\0"
-"prime\0singles\0ups\0"
-"az.us\0vfs.cloud9.me-south-1.amazonaws.com\0"
-"r\xc3\xb8yrvik.no\0k12.id.us\0"
-"nakatsugawa.gifu.jp\0kadena.okinawa.jp\0"
-"grainger\0"
-"aostavalley.it\0"
-"gs.cn\0"
-"furukawa.miyagi.jp\0tamayu.shimane.jp\0"
-"nara.jp\0barsy.in\0"
-"abo.pa\0barsy.io\0"
-"\xe7\xa6\x8f\xe4\xba\x95.jp\0s3.cn-north-1.amazonaws.com.cn\0yandexcloud.net\0"
-"pi.leg.br\0"
-"\xd0\xbc\xd0\xbe\xd0\xbd\0"
-"from-tn.com\0"
+"yun\0"
+"in-addr.arpa\0pimienta.org\0karelia.su\0"
+"music\0"
+"bjugn.no\0farsund.no\0farmers\0"
+"yoichi.hokkaido.jp\0voorloper.cloud\0"
+"notebook.me-south-1.sagemaker.aws\0"
+"mp.br\0"
+"frogans\0"
+"catering.aero\0"
+"konskowola.pl\0edgekey.net\0"
+"dyndns-home.com\0"
+"sos.pl\0"
+"balena-devices.com\0"
+"toyama.toyama.jp\0"
+"emrnotebooks-prod.ap-northeast-2.amazonaws.com\0"
+"enna.it\0"
+"pol.dz\0al.leg.br\0"
+"au.ngrok.io\0"
+"higashiyodogawa.osaka.jp\0"
+"horten.no\0"
+"hidaka.saitama.jp\0"
+"alwaysdata.net\0"
+"marumori.miyagi.jp\0realm.cz\0sopot.pl\0"
+"agdenes.no\0institute\0systems\0"
+"mizumaki.fukuoka.jp\0"
+"bajddar.no\0"
+"homeftp.net\0"
+"mb.ca\0"
+"yasuoka.nagano.jp\0"
+"sugito.saitama.jp\0"
+"takatsuki.osaka.jp\0himi.toyama.jp\0"
+"zaporizhzhe.ua\0"
+"idrett.no\0"
+"download\0"
+"is-a-guru.com\0"
+"tamaki.mie.jp\0taishi.osaka.jp\0kounosu.saitama.jp\0"
+"\xe5\x8c\x97\xe6\xb5\xb7\xe9\x81\x93.jp\0"
+"vaga.no\0emrstudio-prod.eu-south-1.amazonaws.com\0"
+"pc.it\0"
+"teaches-yoga.com\0"
+"rieti.it\0okayama.okayama.jp\0sp.leg.br\0"
+"alipay\0"
+"emrnotebooks-prod.ca-central-1.amazonaws.com\0from-ks.com\0"
+"kaho.fukuoka.jp\0zip\0"
+"nore-og-uvdal.no\0s\xc3\xb8r-odal.no\0"
+"gamagori.aichi.jp\0"
+"emrappui-prod.eu-south-1.amazonaws.com\0studio.ap-southeast-2.sagemaker.aws\0x0.to\0"
+"tottori.jp\0"
+"far.br\0"
+"takaoka.toyama.jp\0"
+"barsy.bg\0"
+"shisui.chiba.jp\0"
+"here\0"
+"pol.ht\0"
+"nu.it\0"
+"h\xc3\xb8nefoss.no\0"
+"toyotsu.fukuoka.jp\0"
+"sling\0"
+"barsy.ca\0webview-assets.cloud9.eu-central-1.amazonaws.com\0"
+"izumisano.osaka.jp\0"
+"health-carereform.com\0"
+"froland.no\0"
+"guru\0viking\0"
+"sannan.hyogo.jp\0"
+"\xd0\xbe\xd0\xb4.\xd1\x81\xd1\x80\xd0\xb1\0"
+"yaita.tochigi.jp\0tayninh.vn\0hra.health\0"
+"tattoo\0"
+"nozawaonsen.nagano.jp\0endofinternet.net\0krakow.pl\0"
+"aero\0"
+"midsund.no\0sn\xc3\xa5sa.no\0barsy.de\0"
+"spot\0workers.dev\0"
+"ro.eu.org\0"
+"tsurugi.ishikawa.jp\0ny-1.paas.massivegrid.net\0"
+"blogspot.co.at\0"
+"webview-assets.aws-cloud9.us-east-2.amazonaws.com\0"
+"skype\0"
+"onrender.com\0"
+"gushikami.okinawa.jp\0wedeploy.sh\0"
+"yura.wakayama.jp\0murayama.yamagata.jp\0"
 "s3-website-ap-northeast-1.amazonaws.com\0"
-"ichikawa.chiba.jp\0echizen.fukui.jp\0seranishi.hiroshima.jp\0shimizu.hokkaido.jp\0"
-"hidaka.wakayama.jp\0broker\0"
-"student.aero\0"
-"kyiv.ua\0"
-"noda.chiba.jp\0isehara.kanagawa.jp\0bieszczady.pl\0"
-"oi.kanagawa.jp\0"
-"minami.tokushima.jp\0"
-"fantasyleague.cc\0"
-"evenes.no\0"
-"tsukiyono.gunma.jp\0"
-"hamatonbetsu.hokkaido.jp\0takasago.hyogo.jp\0kyotanabe.kyoto.jp\0"
-"mosj\xc3\xb8""en.no\0"
-"bayern\0"
-"m.bg\0\xe7\xb5\x84\xe7\xb9\x94.\xe9\xa6\x99\xe6\xb8\xaf\0"
-"yotsukaido.chiba.jp\0"
-"v\xc3\xa5gan.no\0"
-"onion\0"
-"granvin.no\0"
-"*.sapporo.jp\0!city.nagoya.jp\0higashitsuno.kochi.jp\0"
-"amazon\0"
-"larvik.no\0"
-"vet\0indie.porn\0"
-"official.ec\0"
-"fakefur.jp\0"
-"ine.kyoto.jp\0"
-"\xe4\xbd\x90\xe8\xb3\x80.jp\0blogspot.vn\0"
-"certmgr.org\0"
-"kamijima.ehime.jp\0"
-"maringa.br\0"
-"genova.it\0"
-"cpa.pro\0"
+"calabria.it\0"
+"floro.no\0"
+"s3-website-ap-southeast-2.amazonaws.com\0notebook-fips.us-east-1.sagemaker.aws\0qualifioapp.com\0"
+"\xc3\xa5seral.no\0sld.pa\0"
+"vipsinaapp.com\0"
+"koya.wakayama.jp\0"
+"sic.it\0"
+"ivgu.no\0"
+"mi.it\0"
+"execute-api.ap-northeast-3.amazonaws.com\0barsy.eu\0"
+"hobby-site.com\0"
+"ol.no\0"
+"suzuki\0l-o-g-i-n.de\0"
+"sd.us\0notebook.us-west-1.sagemaker.aws\0"
+"oseto.nagasaki.jp\0konin.pl\0"
+"prime\0"
+"mb.it\0"
+"sicily.it\0yamada.iwate.jp\0"
+"flora.no\0"
+"kobayashi.miyazaki.jp\0pc.pl\0"
+"sm\xc3\xb8la.no\0"
+"bitbridge.net\0"
+"bauhaus\0"
+"hakata.fukuoka.jp\0"
+"jele.host\0"
+"akamaihd-staging.net\0"
+"emrappui-prod.us-gov-east-1.amazonaws.com\0"
+"sano.tochigi.jp\0hayakawa.yamanashi.jp\0\xe7\xa7\xbb\xe5\x8a\xa8\0"
+"os.hedmark.no\0si.eu.org\0"
+"sch.ae\0bible\0"
+"melbourne\0s3-website-us-west-1.amazonaws.com\0camdvr.org\0"
+"naha.okinawa.jp\0"
+"honda\0"
+"auth.af-south-1.amazoncognito.com\0ap-northeast-3.elasticbeanstalk.com\0"
+"\xd8\xb9\xd8\xb1\xd8\xa8\0"
+"uchiko.ehime.jp\0"
+"sagae.yamagata.jp\0akamaized-staging.net\0"
+"hl.cn\0sakata.yamagata.jp\0"
+"tonsberg.no\0"
+"funahashi.toyama.jp\0"
+"rawa-maz.pl\0"
+"skierv\xc3\xa1.no\0bar.pro\0"
+"barsy.in\0"
+"barsy.io\0"
+"uk0.bigv.io\0"
+"sadist.jp\0dev.static.land\0"
+"\xe4\xbd\x9b\xe5\xb1\xb1\0in-butter.de\0""123minsida.se\0"
+"honjo.akita.jp\0"
+"ladesk.com\0"
+"he.cn\0"
+"cnpy.gdn\0"
+"discordsays.com\0git-repos.de\0"
+"gallery\0"
+"gg.ax\0"
+"*.cn-northwest-1.airflow.amazonaws.com.cn\0"
+"bronnoy.no\0"
+"s3-us-east-2.amazonaws.com\0"
+"\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xae\0"
+"samsung\0s3-accesspoint.sa-east-1.amazonaws.com\0"
+"blogspot.co.id\0"
+"nedre-eiker.no\0"
+"nagi.okayama.jp\0"
+"blogspot.co.il\0"
+"mitsuke.niigata.jp\0"
+"\xe0\xae\x9a\xe0\xae\xbf\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x82\xe0\xae\xb0\xe0\xaf\x8d\0s3-website.ca-central-1.amazonaws.com\0s3.eu-west-3.amazonaws.com\0"
+"koga.ibaraki.jp\0"
+"\xd2\x9b\xd0\xb0\xd0\xb7\0sk.eu.org\0"
+"impertrix.com\0"
+"drobak.no\0somna.no\0myiphost.com\0"
+"yabu.hyogo.jp\0tsuno.miyazaki.jp\0"
+"realestate\0mayfirst.info\0"
+"fage\0s3-eu-west-3.amazonaws.com\0"
+"ichikai.tochigi.jp\0"
+"nishitosa.kochi.jp\0glogow.pl\0"
+"\xe7\x82\xb9\xe7\x9c\x8b\0"
+"kujukuri.chiba.jp\0sites.static.land\0"
+"vicenza.it\0"
+"s3-website-eu-west-1.amazonaws.com\0"
+"fi.cr\0"
+"mol.it\0"
+"sado.niigata.jp\0maif\0"
+"sukumo.kochi.jp\0pol.tr\0"
+"ed.ao\0\xc3\xa5mli.no\0myhome-server.de\0"
+"sakuho.nagano.jp\0"
+"wiw.gov.pl\0ngrok-free.dev\0"
+"m\xc3\xa1latvuopmi.no\0wedeploy.me\0"
+"bosch\0"
+"cog.mi.us\0"
+"aparecida.br\0"
+"futuremailing.at\0"
+"s3-website-sa-east-1.amazonaws.com\0eero-stage.online\0"
+"oshino.yamanashi.jp\0wielun.pl\0*.banzai.cloud\0"
+"tas.gov.au\0nes.akershus.no\0lib.as.us\0msk.ru\0"
+"perso.ht\0machida.tokyo.jp\0"
+"shinichi.hiroshima.jp\0fail\0"
+"mediatech.by\0"
+"reggioemilia.it\0hokuryu.hokkaido.jp\0"
+"nanmoku.gunma.jp\0"
+"s3-accesspoint.dualstack.ap-southeast-1.amazonaws.com\0is-a-celticsfan.org\0awsmppl.com\0"
+"saigawa.fukuoka.jp\0"
+"ed.ci\0"
+"friuli-veneziagiulia.it\0"
+"is-a-nurse.com\0"
+"tateyama.toyama.jp\0"
+"ru.eu.org\0se.eu.org\0msk.su\0srht.site\0"
+"sch.id\0piw.gov.pl\0mi.th\0"
+"co.ae\0"
+"co.ag\0from-al.com\0"
+"ed.cr\0"
+"cymru\0talk\0"
+"mino.gifu.jp\0hs.kr\0"
+"lesja.no\0lugansk.ua\0"
+"co.am\0"
+"co.ao\0"
+"vs.mythic-beasts.com\0"
+"co.bb\0sch.ir\0"
+"co.at\0"
+"il-central-1.elasticbeanstalk.com\0"
+"omachi.nagano.jp\0"
+"agrar.hu\0"
+"co.bi\0"
+"co.bj\0"
+"okinoshima.shimane.jp\0co.bn\0"
+"sch.jo\0mi.us\0"
+"yomitan.okinawa.jp\0ashikaga.tochigi.jp\0"
+"co.ca\0"
+"taiwa.miyagi.jp\0"
+"co.bw\0\xd0\xbc\xd1\x81\xd0\xba.\xd1\x80\xd1\x83\xd1\x81\0"
+"aisai.aichi.jp\0kawaiishop.jp\0"
+"co.ci\0"
+"co.cl\0"
+"co.cm\0"
+"ponpes.id\0"
+"ba.gov.br\0trentin-sud-tirol.it\0"
+"co.cr\0onomichi.hiroshima.jp\0"
+"cesenaforl\xc3\xac.it\0"
+"furubira.hokkaido.jp\0tsuwano.shimane.jp\0"
+"co.cz\0experts-comptables.fr\0"
+"sch.lk\0co.dk\0"
+"chuo.osaka.jp\0"
+"webspace.rocks\0"
+"fi.it\0tsugaru.aomori.jp\0"
+"my-wan.de\0"
+"shinanomachi.nagano.jp\0"
+"griw.gov.pl\0"
+"hl.no\0km.ua\0"
+"funagata.yamagata.jp\0"
+"er.in\0"
+"sch.ly\0"
+"naruto.tokushima.jp\0"
+"execute-api.eu-central-1.amazonaws.com\0"
+"\xe3\x81\xbf\xe3\x82\x93\xe3\x81\xaa\0"
+"fans\0"
+"epson\0"
+"valle-d-aosta.it\0"
+"leangaviika.no\0"
+"yamada.toyama.jp\0"
+"chintai\0"
+"trentinsued-tirol.it\0"
+"sch.ng\0archi\0"
+"bj.cn\0"
+"bc.ca\0homesense\0"
+"for-some.biz\0"
+"namsos.no\0*.ap-northeast-1.airflow.amazonaws.com\0"
+"emrstudio-prod.ca-central-1.amazonaws.com\0"
+"amot.no\0"
+"localhost.daplie.me\0lugs.org.uk\0"
+"uchihara.ibaraki.jp\0iliadboxos.it\0"
+"s\xc3\xb8ndre-land.no\0emrnotebooks-prod.ap-southeast-1.amazonaws.com\0"
+"backan.vn\0"
+"co.gg\0"
+"seidat.net\0"
+"luhansk.ua\0from-ms.com\0from-nc.com\0"
+"co.gl\0hanyu.saitama.jp\0channel\0"
+"uni5.net\0"
+"kragero.no\0"
+"ed.jp\0"
+"co.gy\0"
+"ginan.gifu.jp\0"
+"from-ca.com\0"
+"blogspot.co.uk\0"
+"sch.qa\0ngrok.pizza\0"
+"yamaguchi.jp\0emrstudio-prod.cn-north-1.amazonaws.com.cn\0"
+"sor-aurdal.no\0watches\0"
+"co.id\0*.magentosite.cloud\0"
+"co.hu\0"
+"per.la\0farm\0"
+"aivencloud.com\0"
+"co.il\0obuse.nagano.jp\0"
+"co.im\0"
+"co.in\0iruma.saitama.jp\0boo.jp\0torproject.net\0"
+"unicloud.pl\0"
+"co.ir\0edogawa.tokyo.jp\0"
+"s3-object-lambda.eu-west-2.amazonaws.com\0webview-assets.aws-cloud9.ap-northeast-2.amazonaws.com\0"
+"co.it\0"
+"co.je\0\xe9\x80\x9a\xe8\xb2\xa9\0dyndns.ddnss.de\0"
+"uk.net\0"
+"khakassia.su\0"
+"kasaoka.okayama.jp\0"
+"minamiaiki.nagano.jp\0"
+"saves-the-whales.com\0own.pm\0"
+"better-than.tv\0pupu.jp\0"
+"sakai.fukui.jp\0fast\0jp.net\0"
+"studio.us-west-2.sagemaker.aws\0"
+"co.jp\0naie.hokkaido.jp\0"
+"sch.sa\0"
+"ch.it\0yamanashi.jp\0"
+"2ix.at\0"
+"co.ke\0"
+"walbrzych.pl\0"
+"ask\xc3\xb8y.no\0hlx3.page\0s3-accesspoint.eu-west-3.amazonaws.com\0"
+"ca.in\0"
+"gose.nara.jp\0per.nf\0"
+"osteroy.no\0"
+"ogawa.nagano.jp\0"
+"reviews\0sch.so\0"
+"am.gov.br\0ca.it\0irish\0"
+"co.kr\0"
+"co.lc\0sch.ss\0amica\0wedeploy.io\0"
+"vic.gov.au\0"
+"sch.tf\0"
+"dovre.no\0mer\xc3\xa5ker.no\0reservd.disrec.thingdust.io\0"
+"valle-daosta.it\0""2ix.ch\0"
+"gs.tr.no\0kirkenes.no\0eu-central-1.elasticbeanstalk.com\0"
+"educator.aero\0bloomberg\0"
+"med.br\0candypop.jp\0"
+"democracia.bo\0is-a-blogger.com\0"
+"accident-prevention.aero\0co.ma\0"
+"co.ls\0"
+"co.me\0""2ix.de\0"
+"co.mg\0gu.us\0taxi\0"
+"coupon\0"
+"balsan-suedtirol.it\0"
+"ngrok.io\0"
+"co.na\0"
+"casino\0barsyonline.com\0"
+"co.mu\0*.stg-builder.code.com\0"
+"beskidy.pl\0"
+"co.mw\0gs.st.no\0shop.brendly.rs\0from-ky.com\0blogspot.co.ke\0"
+"yaotsu.gifu.jp\0"
+"co.ni\0alpha-myqnapcloud.com\0"
+"al.it\0co.mz\0*.cryptonomic.net\0"
+"s3.ap-northeast-2.amazonaws.com\0"
+"co.nl\0"
+"ed.pw\0"
+"med.ec\0co.no\0"
+"nakano.tokyo.jp\0zarow.pl\0"
+"med.ee\0"
+"ogaki.gifu.jp\0"
+"verdal.no\0"
+"asago.hyogo.jp\0"
+"fuchu.tokyo.jp\0sch.wf\0"
+"jondal.no\0"
+"co.nz\0"
+"extraspace\0servebbs.com\0"
+"ca.na\0co.om\0jed.wafaicloud.com\0"
+"parti.se\0"
+"to.leg.br\0"
+"gs.sf.no\0balsfjord.no\0"
+"hanoi.vn\0"
+"exchange.aero\0recht.pro\0"
+"tkmaxx\0"
+"hoylandet.no\0"
+"kinokawa.wakayama.jp\0"
+"cloudsite.builders\0"
+"co.pl\0"
+"per.sg\0"
+"aosta.it\0co.pn\0"
+"*.moonscale.io\0"
+"yamatotakada.nara.jp\0bialystok.pl\0"
+"civilaviation.aero\0"
+"independent-inquest.uk\0"
+"prudential\0"
+"club\0s3-deprecated.cn-north-1.amazonaws.com.cn\0freebox-os.fr\0"
+"sandnes.no\0co.pw\0"
+"s3-deprecated.us-west-2.amazonaws.com\0"
+"laichau.vn\0"
+"bplaced.de\0"
+"quest\0"
+"obu.aichi.jp\0"
+"ap.gov.br\0"
+"global.prod.fastly.net\0"
+"chuo.fukuoka.jp\0"
+"eu.org\0"
+"contractors\0"
+"brand.se\0"
+"blogspot.co.nz\0"
+"sch.zm\0"
+"trentinostirol.it\0perso.sn\0"
+"co.ro\0"
+"med.ht\0sakura.tv\0"
+"shari.hokkaido.jp\0"
+"co.rs\0express\0"
+"al.no\0"
+"tamamura.gunma.jp\0"
+"co.rw\0",
+
+"fukui.fukui.jp\0ap.gov.pl\0"
+"perso.tn\0"
+"execute-api.ap-southeast-3.amazonaws.com\0"
+"fujishiro.ibaraki.jp\0"
+"cv.ua\0fh-muenster.io\0\xd1\x8f.\xd1\x80\xd1\x83\xd1\x81\0"
+"reggio-emilia.it\0co.st\0"
+"kuroishi.aomori.jp\0"
+"co.th\0"
+"co.sz\0co.tj\0"
+"\xe0\xb8\x84\xe0\xb8\xad\xe0\xb8\xa1\0"
 "kota.aichi.jp\0"
-"ok.us\0"
-"karumai.iwate.jp\0"
-"us-gov-west-1.elasticbeanstalk.com\0"
-"saga.jp\0"
-"yatomi.aichi.jp\0"
-"skanland.no\0"
-"land\0"
-"nikolaev.ua\0"
-"toda.saitama.jp\0"
-"merseine.nu\0"
-"gda.pl\0"
-"hagiang.vn\0"
-"webview-assets.cloud9.eu-west-1.amazonaws.com\0"
-"oharu.aichi.jp\0tsukui.kanagawa.jp\0"
-"vig\0"
-"pepper.jp\0"
-"chernovtsy.ua\0freeboxos.com\0"
-"hob\xc3\xb8l.no\0"
-"\xe0\xb8\xa8\xe0\xb8\xb6\xe0\xb8\x81\xe0\xb8\xa9\xe0\xb8\xb2.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"herokuapp.com\0"
-"pup.gov.pl\0vin\0"
-"k12.ct.us\0diamonds\0"
-"vip\0"
-"info\0my.eu.org\0blogspot.re\0"
-"eu.platform.sh\0"
-"cologne\0"
-"sumy.ua\0"
-"vet.br\0"
-"gotdns.com\0"
-"soja.okayama.jp\0"
+"co.tm\0"
+"toho.fukuoka.jp\0"
+"hatinh.vn\0"
+"emrstudio-prod.eu-north-1.amazonaws.com\0pointto.us\0workisboring.com\0co.ua\0ch.tc\0"
+"toyonaka.osaka.jp\0krellian.net\0"
+"k12.vi.us\0erni\0"
+"co.tt\0"
+"lefrak\0hosp.uk\0minisite.ms\0"
+"ashoro.hokkaido.jp\0"
+"moss.no\0co.ug\0"
+"internet-dns.de\0"
+"co.tz\0"
+"co.uk\0"
+"*.awsapprunner.com\0dyn-ip24.de\0hotelwithflight.com\0"
+"tsuruga.fukui.jp\0imakane.hokkaido.jp\0uda.nara.jp\0"
+"pharmacy\0"
+"kinko.kagoshima.jp\0"
+"co.us\0"
+"geisei.kochi.jp\0"
+"valer.ostfold.no\0co.ve\0s3-fips.us-west-2.amazonaws.com\0"
+"kartuzy.pl\0swidnica.pl\0"
+"co.vi\0auth-fips.us-gov-west-1.amazoncognito.com\0"
+"\xe7\xbd\x91\xe7\xbb\x9c.cn\0co.uz\0"
+"s3.dualstack.ap-southeast-1.amazonaws.com\0"
+"ee.eu.org\0"
+"akamaiorigin.net\0"
+"richardli\0"
+"kushima.miyazaki.jp\0"
+"nobeoka.miyazaki.jp\0thainguyen.vn\0"
+"med.ly\0"
+"turin.it\0pfizer\0"
+"tickets.io\0"
+"melhus.no\0"
+"canva-apps.cn\0"
+"\xd8\xa8\xd8\xa7\xd8\xb2\xd8\xa7\xd8\xb1\0"
+"ca.us\0nokia\0mozilla-iot.org\0"
+"vall\xc3\xa9""eaoste.it\0olayan\0supabase.in\0"
+"az.us\0endofinternet.org\0cloud-fr1.unispace.io\0"
+"gol.no\0panasonic\0"
+"ericsson\0"
+"krokstadelva.no\0"
+"jdf.br\0"
+"customer.speedpartner.de\0"
+"onza.mythic-beasts.com\0"
+"med.om\0americanfamily\0"
+"kyoto.jp\0toride.ibaraki.jp\0"
+"r\xc3\xa1hkker\xc3\xa1vju.no\0as.us\0"
+"rgr.jp\0"
+"med.pa\0gos.pk\0\xd1\x81\xd0\xb0\xd0\xbc\xd0\xb0\xd1\x80\xd0\xb0.\xd1\x80\xd1\x83\xd1\x81\0"
+"teshikaga.hokkaido.jp\0"
+"co.za\0vfs.cloud9.ap-southeast-2.amazonaws.com\0"
+"s3-website.cn-northwest-1.amazonaws.com.cn\0"
+"\xd1\x81\xd0\xbe\xd1\x87\xd0\xb8.\xd1\x80\xd1\x83\xd1\x81\0"
+"med.pl\0"
+"skydiving.aero\0al.us\0emrnotebooks-prod.us-west-2.amazonaws.com\0"
+"qsl.br\0fujieda.shizuoka.jp\0tmall\0"
+"gs.mr.no\0finn\xc3\xb8y.no\0s3.ap-southeast-4.amazonaws.com\0"
+"shoo.okayama.jp\0"
+"langevag.no\0co.zm\0shiftedit.io\0"
+"mmafan.biz\0"
+"gjerdrum.no\0kongsvinger.no\0auth.ap-northeast-1.amazoncognito.com\0"
+"fujitsu\0"
+"tozawa.yamagata.jp\0"
+"oystre-slidre.no\0yombo.me\0"
+"art.br\0samsclub\0"
+"\xe7\xbd\x91\xe7\xbb\x9c.hk\0co.zw\0"
+"valdaosta.it\0"
+"kosaka.akita.jp\0"
+"ciencia.bo\0"
+"natura\0"
+"moriguchi.osaka.jp\0"
+"kannami.shizuoka.jp\0"
+"s3-us-west-2.amazonaws.com\0"
+"from-md.com\0dray-dns.de\0"
+"dynu.net\0"
+"minamimaki.nagano.jp\0"
+"services.aero\0"
+"med.sa\0"
+"asaka.saitama.jp\0"
+"u.bg\0affinitylottery.org.uk\0"
+"med.sd\0hoplix.shop\0"
+"art.do\0is-a-linux-user.org\0blogspot.co.za\0"
+"tecnologia.bo\0"
+"viterbo.it\0beep.pl\0"
+"askoy.no\0pvt.k12.ma.us\0"
+"sth.ac.at\0"
+"lierne.no\0cust.prod.thingdust.io\0"
+"frosinone.it\0"
+"n.bg\0"
+"art.dz\0"
+"mazeplay.com\0"
+"us-east-1.elasticbeanstalk.com\0"
+"wada.nagano.jp\0kikirara.jp\0"
+"lebtimnetz.de\0supabase.co\0"
+"tsukui.kanagawa.jp\0"
+"conn.uk\0"
+"off.ai\0"
+"inatsuki.fukuoka.jp\0"
+"g.bg\0"
+"dynalias.net\0"
+"vic.edu.au\0"
+"ancona.it\0"
+"g\xc3\xa1ivuotna.no\0solund.no\0"
+"accident-investigation.aero\0\xe7\xb5\x84\xe7\xb9\x94.\xe9\xa6\x99\xe6\xb8\xaf\0lamborghini\0"
+"online\0"
+"matera.it\0"
+"magnet.page\0"
+"malatvuopmi.no\0"
+"actor\0akamaiedge-staging.net\0whm.fr-par.scw.cloud\0"
+"sobetsu.hokkaido.jp\0wiih.gov.pl\0"
+"hirono.fukushima.jp\0*.webhare.dev\0"
+"uri.arpa\0"
+"activetrail.biz\0"
+"shinkamigoto.nagasaki.jp\0"
+"from-tn.com\0"
+"mosvik.no\0"
+"nemuro.hokkaido.jp\0matsuzaki.shizuoka.jp\0"
+"okuma.fukushima.jp\0"
+"foggia.it\0"
+"chiryu.aichi.jp\0"
+"club.aero\0tysnes.no\0from-fl.com\0"
+"art.ht\0"
+"cloud.fedoraproject.org\0"
+"cc.md.us\0"
+"akaiwa.okayama.jp\0"
+"nishinoomote.kagoshima.jp\0"
+"s3.dualstack.us-west-1.amazonaws.com\0"
+"shiraoi.hokkaido.jp\0custom.metacentrum.cz\0"
+"bod\xc3\xb8.no\0"
+"maniwa.okayama.jp\0"
+"\xd8\xa7\xd8\xb1\xd8\xa7\xd9\x85\xd9\x83\xd9\x88\0"
+"loginline.io\0"
+"soja.okayama.jp\0tsurugashima.saitama.jp\0"
+"me-south-1.elasticbeanstalk.com\0"
+"seranishi.hiroshima.jp\0swinoujscie.pl\0"
+"ikoma.nara.jp\0platform0.app\0"
+"east-kazakhstan.su\0"
+"tokorozawa.saitama.jp\0"
+"lunner.no\0is-a-nascarfan.com\0"
+"k12.ny.us\0"
+"higashikurume.tokyo.jp\0citadel\0sharp\0"
+"s3-website.dualstack.eu-central-1.amazonaws.com\0"
+"solutions\0"
+"ogawara.miyagi.jp\0kumatori.osaka.jp\0"
+"*.alces.network\0vfs.cloud9.eu-west-2.amazonaws.com\0"
+"kiwi.nz\0crafting.xyz\0"
+"vibo-valentia.it\0"
+"cyon.site\0"
+"\xe8\xb4\xad\xe7\x89\xa9\0logoip.com\0"
+"piedmont.it\0"
+"dyn-berlin.de\0"
+"6.bg\0"
+"delhi.in\0bacninh.vn\0"
+"k12.ms.us\0k12.nc.us\0"
+"auth.ap-southeast-1.amazoncognito.com\0"
+"ind.br\0clan.rip\0"
+"bentley\0"
+"origins\0studio.ap-northeast-1.sagemaker.aws\0spacekit.io\0"
+"deca.jp\0"
+"trentinos\xc3\xbc""d-tirol.it\0futtsu.chiba.jp\0"
+"skiptvet.no\0"
+"sandcats.io\0"
+"ebino.miyazaki.jp\0miyota.nagano.jp\0"
+"*.hosting.myjino.ru\0"
+"pomorze.pl\0"
+"k12.me.us\0emrstudio-prod.me-central-1.amazonaws.com\0"
+"shirataka.yamagata.jp\0"
+"sauherad.no\0hopto.me\0"
+"theshop.jp\0"
+"execute-api.af-south-1.amazonaws.com\0s3-accesspoint.us-gov-east-1.amazonaws.com\0is-a-personaltrainer.com\0"
+"crown\0star\0"
+"agents.aero\0"
+"yamatokoriyama.nara.jp\0"
+"kodaira.tokyo.jp\0"
+"s3-accesspoint.us-west-2.amazonaws.com\0"
+"r\xc3\xa1isa.no\0"
+"is-a-socialist.com\0"
+"x.mythic-beasts.com\0"
+"kakuda.miyagi.jp\0urawa.saitama.jp\0"
+"roma.it\0shibata.niigata.jp\0"
+"shinjo.okayama.jp\0oia.gov.pl\0"
+"is-not-certified.com\0"
+"cc.il.us\0"
+"aus.basketball\0"
+"cn.eu.org\0"
+"flights\0"
+"art.pl\0"
+"recipes\0"
+"academy\0"
+"blogspot.vn\0"
+"katsushika.tokyo.jp\0homesklep.pl\0"
+"pythonanywhere.com\0"
+"ltda\0"
+"polkowice.pl\0ngrok-free.app\0"
+"ohira.miyagi.jp\0"
+"gangaviika.no\0"
+"kaufen\0"
+"moareke.no\0"
+"ind.gt\0sumida.tokyo.jp\0"
+"is-an-accountant.com\0"
+"hjelmeland.no\0"
+"shibecha.hokkaido.jp\0*.lclstage.dev\0"
+"ilawa.pl\0"
+"osaki.miyagi.jp\0"
+"nom.ad\0isa.kagoshima.jp\0"
+"kurotaki.nara.jp\0"
+"nom.ag\0"
+"takamori.kumamoto.jp\0"
+"demo.jelastic.com\0"
+"lig.it\0rikubetsu.hokkaido.jp\0hanno.saitama.jp\0"
+"s3-website.ap-northeast-3.amazonaws.com\0"
+"tokyo.jp\0"
+"ipiranga\0"
+"art.sn\0"
+"emergency.aero\0*.transurl.be\0"
+"not.br\0ind.in\0"
+"qbuser.com\0"
+"mysecuritycamera.net\0"
+"ringebu.no\0selje.no\0"
+"bar2.net\0"
+"finnoy.no\0odessa.ua\0"
+"is-a-soxfan.org\0"
+"kitahiroshima.hokkaido.jp\0"
+"k12.in.us\0loans\0"
+"yk.ca\0blogspot.re\0mintere.site\0"
+"auth.sa-east-1.amazoncognito.com\0"
+"wakayama.jp\0naka.hiroshima.jp\0"
 "blogspot.ro\0"
-"research.aero\0vegarshei.no\0"
-"pe.leg.br\0"
-"blogspot.rs\0"
-"tokai.aichi.jp\0higashiizu.shizuoka.jp\0musashino.tokyo.jp\0"
-"blackfriday\0industries\0blogspot.ru\0blogspot.se\0"
-"tama.tokyo.jp\0"
-"blogspot.sg\0"
-"law.pro\0blogspot.si\0"
-"nerdpol.ovh\0"
-"blogspot.sk\0"
-"haram.no\0prvcy.page\0it.com\0"
-"suzaka.nagano.jp\0po.gov.pl\0binhduong.vn\0blogspot.sn\0"
-"gitapp.si\0"
-"\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\0"
-"jellybean.jp\0"
-"1.bg\0pics\0dopaas.com\0"
+"\xe6\x94\xbf\xe5\xba\x9c.\xe9\xa6\x99\xe6\xb8\xaf\0s3.dualstack.me-south-1.amazonaws.com\0is-by.us\0"
+"u.se\0emrappui-prod.me-central-1.amazonaws.com\0blogspot.rs\0"
+"conference.aero\0nom.co\0blogspot.ru\0blogspot.se\0"
+"oizumi.gunma.jp\0ryokami.saitama.jp\0"
+"*.ap-south-1.airflow.amazonaws.com\0blogspot.sg\0"
+"analytics-gateway.eu-central-1.amazonaws.com\0blogspot.si\0"
+"ohi.fukui.jp\0"
+"trogstad.no\0blogspot.sk\0*.quipelements.com\0"
+"blogspot.sn\0"
+"jobs\0iopsys.se\0"
+"miasa.nagano.jp\0yazu.tottori.jp\0rehab\0"
+"n.se\0"
+"hikimi.shimane.jp\0"
+"ind.kw\0fairwinds\0s3.dualstack.eu-south-1.amazonaws.com\0cy.eu.org\0"
 "blogspot.td\0"
-"dst.mi.us\0"
-"corsica\0"
-"lukow.pl\0"
-"srv.br\0"
-"edugit.io\0"
-"friuli-vgiulia.it\0"
-"vads\xc3\xb8.no\0verm\xc3\xb6gensberatung\0"
-"storipress.app\0"
+"isa.us\0"
+"olawa.pl\0""3.azurestaticapps.net\0"
+"kutno.pl\0church\0"
+"asahikawa.hokkaido.jp\0"
+"is-a-knight.org\0"
+"g.se\0"
+"bloxcms.com\0"
+"racing\0s3-website.dualstack.eu-west-3.amazonaws.com\0"
+"inashiki.ibaraki.jp\0uw.gov.pl\0doctor\0"
 "blogspot.tw\0blogspot.ug\0"
-"nh-serv.co.uk\0"
-"\xe5\xae\xae\xe5\x9f\x8e.jp\0matsuzaki.shizuoka.jp\0tjmaxx\0town\0"
-"nango.fukushima.jp\0"
-"kagamiishi.fukushima.jp\0kakinoki.shimane.jp\0fuefuki.yamanashi.jp\0"
-"fermo.it\0"
-"\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa7\0"
-"blogspot.mr\0linkyard-cloud.ch\0"
-"\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa9\0youtube\0"
-"shitara.aichi.jp\0"
-"tt.im\0*.platformsh.site\0"
-"kanagawa.jp\0blogspot.mx\0"
-"blogspot.my\0"
-"horonobe.hokkaido.jp\0"
+"fnd.br\0shika.ishikawa.jp\0"
+"nom.es\0cloud66.zone\0*.transurl.eu\0"
+"ogose.saitama.jp\0koge.tottori.jp\0"
+"knightpoint.systems\0*.paywhirl.com\0"
+"yurihonjo.akita.jp\0"
+"fishing\0"
+"blogspot.mr\0"
+"cz.eu.org\0"
+"pisa.it\0!city.kobe.jp\0wassamu.hokkaido.jp\0zp.gov.pl\0"
+"nom.fr\0blogspot.mx\0"
+"arendal.no\0blogspot.my\0"
 "blogspot.nl\0"
-"moskenes.no\0webview-assets.cloud9.us-east-1.amazonaws.com\0"
-"qh.cn\0ud.it\0"
-"bremanger.no\0blogspot.no\0"
-"minobu.yamanashi.jp\0"
-"osaka\0saves-the-whales.com\0"
-"hobol.no\0"
-"hatinh.vn\0watch\0"
-"quangbinh.vn\0"
-"sande.m\xc3\xb8re-og-romsdal.no\0webview-assets.cloud9.ap-south-1.amazonaws.com\0"
-"hiji.oita.jp\0kred\0"
-"bykle.no\0lahppi.no\0is-a-celticsfan.org\0"
-"bibai.hokkaido.jp\0"
-"cc.hn\0"
-"murmansk.su\0"
-"toys\0"
-"solutions\0"
-"fujishiro.ibaraki.jp\0"
-"nl.eu.org\0blogspot.pe\0"
-"cosenza.it\0bacgiang.vn\0"
-"showa.gunma.jp\0sko.gov.pl\0"
-"ipiranga\0"
-"sp.it\0"
-"tingvoll.no\0blogspot.qa\0"
-"bs.it\0yao.osaka.jp\0koganei.tokyo.jp\0"
-"bod\xc3\xb8.no\0"
+"wa.au\0"
+"pistoia.it\0yamanobe.yamagata.jp\0gb.net\0"
+"blogspot.no\0"
+"abeno.osaka.jp\0"
+"forli-cesena.it\0chuo.tokyo.jp\0"
+"visa\0"
+"community-pro.net\0"
+"webview-assets.aws-cloud9.us-west-1.amazonaws.com\0"
+"ikeda.fukui.jp\0"
+"natural.bo\0living\0dk.eu.org\0"
+"blogspot.pe\0"
+"daisen.akita.jp\0"
+"daiwa.hiroshima.jp\0"
+"us.ax\0"
+"game-server.cc\0freeddns.org\0"
+"armenia.su\0"
+"leksvik.no\0blogspot.qa\0"
+"toga.toyama.jp\0"
 "blogspot.pt\0"
-"dnsdojo.net\0"
-"horten.no\0"
-"ena.gifu.jp\0legnica.pl\0jele.host\0"
-"gon.pk\0"
-"frontdoor\0"
-"oizumi.gunma.jp\0"
-"patria.bo\0"
-"nagoya\0"
-"mongolian.jp\0"
-"ravenna.it\0"
+"itcouldbewor.se\0"
+"tosa.kochi.jp\0"
+"s3-website.eu-south-2.amazonaws.com\0"
+"americanexpress\0"
+"higashikagura.hokkaido.jp\0moriya.ibaraki.jp\0"
+"riobranco.br\0podlasie.pl\0design\0"
+"s3-object-lambda.eu-central-2.amazonaws.com\0"
+"nishio.aichi.jp\0freetls.fastly.net\0"
+"s3-website.dualstack.ap-northeast-2.amazonaws.com\0"
+"nomi.ishikawa.jp\0konan.shiga.jp\0"
 "blogspot.is\0"
-"kilo.jp\0blogspot.it\0"
-"lugansk.ua\0"
-"fedex\0"
-"tomika.gifu.jp\0hamada.shimane.jp\0"
-"mol.it\0trentin-s\xc3\xbc""d-tirol.it\0daigo.ibaraki.jp\0"
-"cards\0"
+"blogspot.it\0"
+"tamatsukuri.ibaraki.jp\0chizu.tottori.jp\0under.jp\0"
+"jan-mayen.no\0b\xc3\xa5""d\xc3\xa5""ddj\xc3\xa5.no\0\xe5\x80\x8b\xe4\xba\xba.\xe9\xa6\x99\xe6\xb8\xaf\0"
+"bolzano-altoadige.it\0"
+"viva\0s3-accesspoint.dualstack.af-south-1.amazonaws.com\0"
+"garden\0"
+"\xd8\xa7\xd8\xa8\xd9\x88\xd8\xb8\xd8\xa8\xd9\x8a\0"
 "blogspot.jp\0"
-"ao.it\0kawaiishop.jp\0"
-"impertrix.com\0"
-"arq.br\0"
-"jelastic.tsukaeru.net\0"
-"saigawa.fukuoka.jp\0minamiuonuma.niigata.jp\0repl.run\0"
-"aarborte.no\0music\0"
-"tatebayashi.gunma.jp\0nishimera.miyazaki.jp\0aga.niigata.jp\0"
-"jpmorgan\0"
-"kalmykia.su\0"
-"valleaosta.it\0fujisawa.kanagawa.jp\0blogspot.kr\0"
-"natura\0"
-"salon\0"
-"balena-devices.com\0from-tx.com\0blogspot.li\0"
-"abashiri.hokkaido.jp\0"
-"air-traffic-control.aero\0k12.ok.us\0loseyourip.com\0"
-"mincom.tn\0"
-"sula.no\0"
-"cc.na\0"
-"hidaka.hokkaido.jp\0johana.toyama.jp\0"
-"supersale.jp\0pr.leg.br\0"
-"\xe6\x94\xbf\xe5\xba\x9c.hk\0"
-"\xe9\xab\x98\xe7\x9f\xa5.jp\0yonezawa.yamagata.jp\0blogspot.lt\0blogspot.md\0"
-"cloudns.info\0blogspot.lu\0"
-"kaneyama.fukushima.jp\0akune.kagoshima.jp\0"
-"orsta.no\0blogspot.mk\0"
-"yamagata.yamagata.jp\0vision\0"
-"gouv.fr\0asti.it\0uryu.hokkaido.jp\0pr.gov.pl\0theater\0"
-"knowsitall.info\0"
-"tychy.pl\0"
-"tsuiki.fukuoka.jp\0auto.pl\0mods.jp\0"
-"\xe7\xb5\x84\xe7\xb9\x94.tw\0ng.eu.org\0"
-"shiroi.chiba.jp\0"
-"ping\0"
+"blogsite.xyz\0"
+"nom.km\0"
+"napoli.it\0rj.leg.br\0"
+"vivo\0"
+"lib.ri.us\0bestbuy\0"
+"hisamitsu\0emrnotebooks-prod.us-gov-west-1.amazonaws.com\0"
+"zgorzelec.pl\0"
+"team\0"
+"yaese.okinawa.jp\0blogspot.kr\0"
+"de.eu.org\0"
+"zagan.pl\0"
+"tarumizu.kagoshima.jp\0"
+"fukushima.fukushima.jp\0"
+"blogspot.li\0"
+"ind.tn\0"
+"kagoshima.jp\0wanouchi.gifu.jp\0barsy.support\0"
+"nom.mg\0travelersinsurance\0"
+"kira.aichi.jp\0oschr.gov.pl\0"
+"bato.tochigi.jp\0"
+"translate.goog\0"
+"soni.nara.jp\0"
+"\xe5\xb9\xbf\xe4\xb8\x9c\0blogspot.lt\0blogspot.md\0"
+"nord-odal.no\0blogspot.lu\0"
+"nom.nc\0"
+"adm.br\0nachikatsuura.wakayama.jp\0"
+"nog.community\0blogspot.mk\0"
+"tech\0"
+"co.place\0"
+"cosenza.it\0itami.hyogo.jp\0"
+"nom.ni\0property\0"
+"*.transurl.nl\0"
+"rakkestad.no\0"
+"elasticbeanstalk.com\0from-wy.com\0"
+"myftp.biz\0"
+"k12.ct.us\0"
+"teramo.it\0ina.nagano.jp\0"
 "blogspot.fi\0"
-"m.se\0pink\0"
-"government.aero\0"
-"vall\xc3\xa9""e-d-aoste.it\0ube.yamaguchi.jp\0"
-"twmail.org\0"
-"tamatsukuri.ibaraki.jp\0jele.club\0"
-"kopervik.no\0kalmykia.ru\0"
-"asahi.mie.jp\0blogspot.fr\0"
-"dnshome.de\0"
-"ot.it\0pd.it\0yoshida.saitama.jp\0wakasa.tottori.jp\0"
-"tagami.niigata.jp\0aus.basketball\0"
-"rl.no\0"
-"poltava.ua\0"
-"gouv.ht\0"
-"gets-it.net\0blogspot.gr\0"
-"frana.no\0"
-"floppy.jp\0uk.oxa.cloud\0"
-"parti.se\0"
-"murayama.yamagata.jp\0"
-"eid.no\0ufcfan.org\0"
-"berg.no\0blogspot.hk\0"
-"tsuru.yamanashi.jp\0"
-"k12.ks.us\0"
-"akita.akita.jp\0hamatama.saga.jp\0blogspot.hr\0"
-"nat.tn\0"
-"news\0blogspot.hu\0blogspot.ie\0"
-"kharkov.ua\0\xe6\x94\xbf\xe5\xba\x9c.\xe9\xa6\x99\xe6\xb8\xaf\0"
-"\xe9\x95\xb7\xe5\xb4\x8e.jp\0kanna.gunma.jp\0togitsu.nagasaki.jp\0"
-"yuki.ibaraki.jp\0"
-"daejeon.kr\0blogspot.in\0"
+"fin.ci\0"
+"nanao.ishikawa.jp\0"
+"pila.pl\0"
+"blogspot.fr\0"
+"exposed\0punyu.jp\0"
+"nom.pa\0"
+"shibata.miyagi.jp\0"
+"hikari.yamaguchi.jp\0lawyer\0"
+"nom.pe\0"
+"selbu.no\0"
+"moriyama.shiga.jp\0szczytno.pl\0grainger\0"
+"\xe6\x96\xb0\xe9\x97\xbb\0"
+"us.in\0nom.pl\0blogspot.gr\0"
+"shop.ht\0kawasaki.miyagi.jp\0"
+"fin.ec\0shop.hu\0"
+"psi.br\0hino.tottori.jp\0"
+"vc.it\0zao.miyagi.jp\0"
+"execute-api.sa-east-1.amazonaws.com\0"
+"blogspot.hk\0"
+"tank.jp\0"
+"ibaraki.osaka.jp\0akishima.tokyo.jp\0"
+"gallo\0"
+"soc.dz\0ichikawamisato.yamanashi.jp\0"
+"genkai.saga.jp\0blogspot.hr\0"
+"hemne.no\0"
+"tateshina.nagano.jp\0"
+"blogspot.hu\0blogspot.ie\0"
+"ce.gov.br\0cool\0meet\0"
+"hammarfeasta.no\0"
+"ujitawara.kyoto.jp\0"
+"coop\0sener\0"
+"nom.re\0zp.ua\0rag-cloud.hosteur.com\0us.kg\0"
+"lib.oh.us\0"
+"r2.dev\0blogspot.in\0"
 "blogspot.ba\0"
-"ureshino.mie.jp\0arida.wakayama.jp\0win\0"
-"arte.bo\0krym.ua\0"
-"gouv.ci\0blogspot.be\0"
-"tone.ibaraki.jp\0next\0"
-"blogspot.bg\0"
+"fukuchi.fukuoka.jp\0"
+"medecin.km\0siljan.no\0forumz.info\0"
+"angry.jp\0"
+"nom.ro\0blogspot.be\0"
+"blogspot.bg\0weeklylottery.org.uk\0"
+"otsuki.yamanashi.jp\0storipress.app\0"
+"forgeblocks.com\0"
 "blogspot.bj\0"
-"restaurant.bj\0augustow.pl\0"
-"uber.space\0"
-"kuron.jp\0"
-"zaporizhzhe.ua\0\xe0\xae\x9a\xe0\xae\xbf\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x82\xe0\xae\xb0\xe0\xaf\x8d\0blogspot.ca\0"
-"travel.pl\0blogspot.cf\0meinforum.net\0"
+"abc.br\0"
+"seljord.no\0"
+"chuo.yamanashi.jp\0"
+"blogspot.ca\0"
+"tn.it\0\xe7\xa7\x8b\xe7\x94\xb0.jp\0ashibetsu.hokkaido.jp\0"
+"myspreadshop.co.uk\0"
+"tel.tr\0blogspot.cf\0"
+"torsken.no\0"
 "blogspot.ch\0"
-"ballooning.aero\0cc.sd.us\0alibaba\0"
-"deta.dev\0"
-"microlight.aero\0*.nodebalancer.linode.com\0"
-"gen.in\0blogspot.cl\0"
-"sagamihara.kanagawa.jp\0mw.gov.pl\0"
-"cc.ua\0"
-"arita.saga.jp\0"
-"friuliv-giulia.it\0shimonoseki.yamaguchi.jp\0"
-"vercel.dev\0xy.ax\0"
-"blogspot.de\0"
-"blogspot.cv\0"
-"caracal.mythic-beasts.com\0"
-"blogspot.cz\0sites.static.land\0"
-"blogspot.dk\0"
-"berlev\xc3\xa5g.no\0modum.no\0"
-"lodingen.no\0"
-"vestv\xc3\xa5g\xc3\xb8y.no\0"
-"esashi.hokkaido.jp\0"
-"nago.okinawa.jp\0"
-"her\xc3\xb8y.nordland.no\0tysnes.no\0lifeinsurance\0"
-"wme\0"
-"oita.jp\0"
-"hl.cn\0"
-"cng.br\0gujarat.in\0tome.miyagi.jp\0"
-"svalbard.no\0keymachine.de\0*.tst.site\0"
-"*.on-rio.io\0"
-"ms.gov.br\0"
-"hasura-app.io\0"
-"dyn.ddnss.de\0pstmn.io\0"
-"takatsuki.osaka.jp\0"
-"tadaoka.osaka.jp\0"
-"firm.ht\0kaszuby.pl\0"
-"marketing\0"
-"lib.vt.us\0homeoffice.gov.uk\0"
-"bjerkreim.no\0"
-"firm.in\0"
-"s\xc3\xb8r-odal.no\0safety\0magnet.page\0"
-"travel.tt\0does-it.net\0"
-"mt.gov.br\0vibovalentia.it\0"
-"wa.au\0gen.ng\0"
-"repair\0"
-"pvh.br\0"
-"wow\0"
-"\xe8\x8c\xa8\xe5\x9f\x8e.jp\0"
-"asahi.nagano.jp\0*.dapps.earth\0"
-"services.aero\0"
-"raffleentry.org.uk\0"
-"\xe9\x9d\x92\xe6\xa3\xae.jp\0"
-"v.bg\0bjugn.no\0blogspot.ae\0"
-"gen.nz\0scrapper-site.net\0"
-"firm.co\0"
-"monzaebrianza.it\0mifune.kumamoto.jp\0bar1.net\0"
-"dreamhosters.com\0"
-"blogspot.al\0"
-"blogspot.am\0"
-"cc.oh.us\0vfs.cloud9.ap-northeast-3.amazonaws.com\0"
-"mayfirst.info\0"
-"nishiizu.shizuoka.jp\0lolipopmc.jp\0"
-"firm.dk\0"
-"kanonji.kagawa.jp\0"
-"oshima.tokyo.jp\0"
-"shimodate.ibaraki.jp\0"
-"place\0in-butter.de\0"
-"ngrok-free.dev\0"
-"\xc3\xb8yer.no\0ap-northeast-3.elasticbeanstalk.com\0"
-"mikawa.yamagata.jp\0embaixada.st\0"
-"cesena-forli.it\0tenei.fukushima.jp\0kamakura.kanagawa.jp\0yawata.kyoto.jp\0"
-"giske.no\0"
-"catering.aero\0b.bg\0nalchik.ru\0"
-"inuyama.aichi.jp\0jcloud.kz\0"
-"myasustor.com\0"
-"vindafjord.no\0codespot.com\0"
-"andria-barletta-trani.it\0"
-"nesseby.no\0"
-"\xe6\x95\x8e\xe8\x82\xb2.hk\0cc.mt.us\0cc.nd.us\0"
-"b.br\0sukumo.kochi.jp\0*.firenet.ch\0"
-"bargains\0"
-"wtc\0nalchik.su\0"
-"cloudfront.net\0"
-"shinichi.hiroshima.jp\0morimachi.shizuoka.jp\0wtf\0"
-"\xd0\xbe\xd1\x80\xd0\xb3\0"
-"cdn.prod.atlassian-dev.net\0fly.dev\0"
-"shiftedit.io\0"
-"gehirn.ne.jp\0nikita.jp\0"
-"hu.com\0"
-"chitose.hokkaido.jp\0"
-"\xd1\x81\xd0\xb0\xd0\xbc\xd0\xb0\xd1\x80\xd0\xb0.\xd1\x80\xd1\x83\xd1\x81\0"
-"kimino.wakayama.jp\0"
-"a.run.app\0"
-"solund.no\0is-into-cartoons.com\0"
-"nowruz\0"
-"tolga.no\0ciscofreak.com\0"
-"toyohashi.aichi.jp\0"
-"misawa.aomori.jp\0udono.mie.jp\0"
-"sondrio.it\0"
-"vfs.cloud9.us-west-2.amazonaws.com\0"
-"tec.br\0kochi.kochi.jp\0easypanel.app\0"
-"samukawa.kanagawa.jp\0kamiamakusa.kumamoto.jp\0"
-"oygarden.no\0"
-"weir\0"
-"flatanger.no\0"
-"gen.tr\0barsy.net\0"
-"chieti.it\0moriyoshi.akita.jp\0cloudfunctions.net\0"
-"oppeg\xc3\xa5rd.no\0"
-"fairwinds\0"
-"mel\xc3\xb8y.no\0"
-"microsoft\0"
-"lasalle\0"
-"fr-par-1.baremetal.scw.cloud\0"
-"trentin-suedtirol.it\0hangout\0"
-"\xe5\xb2\x90\xe9\x98\x9c.jp\0izumi.kagoshima.jp\0"
-"friuli-venezia-giulia.it\0wskr.gov.pl\0"
-"hl.no\0"
-"togakushi.nagano.jp\0"
+"h\xc3\xa1pmir.no\0"
+"owani.aomori.jp\0"
+"k12.az.us\0"
+"balsan-sudtirol.it\0blogspot.cl\0"
+"s3-ap-south-1.amazonaws.com\0"
+"barsy.net\0"
+"obihiro.hokkaido.jp\0"
+"s3-fips.dualstack.us-east-1.amazonaws.com\0"
+"hammerfest.no\0nom.tm\0ca.eu.org\0dnsiskinky.com\0wellbeingzone.eu\0"
+"us.na\0blogspot.de\0"
+"owariasahi.aichi.jp\0greater.jp\0blogspot.cv\0"
+"yamatsuri.fukushima.jp\0"
+"kizu.kyoto.jp\0blogspot.cz\0"
+"\xe6\x94\xbf\xe5\x8a\xa1\0blogspot.dk\0yolasite.com\0"
+"localzone.xyz\0""32-b.it\0"
+"kids.us\0exchange\0simple-url.com\0"
+"sp.it\0mitake.gifu.jp\0"
+"\xc3\xa5""fjord.no\0"
+"koto.tokyo.jp\0"
+"hacca.jp\0"
+"lib.md.us\0"
+"messina.it\0kamikawa.saitama.jp\0"
+"k12.al.us\0"
+"tendo.yamagata.jp\0karpacz.pl\0"
+"lab.ms\0"
+"\xd8\xa7\xd9\x84\xd8\xb9\xd9\x84\xd9\x8a\xd8\xa7\xd9\x86\0"
+"fla.no\0nom.ve\0video\0nyaa.am\0"
+"mus.br\0si.it\0sumoto.kumamoto.jp\0yasaka.nagano.jp\0hidaka.wakayama.jp\0"
+"kr.com\0"
+"hatoyama.saitama.jp\0"
+"tranibarlettaandria.it\0"
+"basketball\0locker\0selfip.net\0"
+"schools.nsw.edu.au\0"
+"nid.io\0"
+"makeup\0"
 "doomdns.com\0"
-"higashimurayama.tokyo.jp\0"
-"ent.platform.sh\0"
-"fylkesbibl.no\0"
-"tsumagoi.gunma.jp\0itano.tokushima.jp\0tn.oxa.cloud\0"
-"ipifony.net\0"
-"\xe7\xb5\x84\xe7\xb9\x94.hk\0"
-"lundbeck\0"
-"oirase.aomori.jp\0swiebodzin.pl\0"
-"k12.as.us\0barsyonline.com\0"
-"minami.kyoto.jp\0taishi.osaka.jp\0"
-"theatre\0is-by.us\0""123miweb.es\0"
-"xin\0"
-"web.bo\0uk.com\0"
-"samegawa.fukushima.jp\0tanabe.kyoto.jp\0"
-"ddnslive.com\0"
-"gouv.sn\0thaibinh.vn\0"
-"aarp\0"
-"air-surveillance.aero\0google\0"
-"web.co\0",
-
-"lon-2.paas.massivegrid.net\0"
-"selje.no\0"
-"gmina.pl\0ondigitalocean.app\0fra1-de.cloudjiffy.net\0"
-"tas.edu.au\0"
-"gorlice.pl\0podhale.pl\0"
-"minamiashigara.kanagawa.jp\0nissan\0"
-"firm.ve\0"
-"parma.it\0"
-"takahama.aichi.jp\0"
-"web.do\0trana.no\0read-books.org\0"
-"ino.kochi.jp\0thuathienhue.vn\0"
-"yokaichiba.chiba.jp\0"
-"asaka.saitama.jp\0"
-"cc.id.us\0nissay\0"
-"cl.it\0"
-"meloy.no\0"
-"trd.br\0"
-"uk0.bigv.io\0"
-"kinko.kagoshima.jp\0"
-"furniture\0"
-"gokase.miyazaki.jp\0"
-"\xe5\xb1\xb1\xe5\xbd\xa2.jp\0"
-"karm\xc3\xb8y.no\0"
-"church\0"
-"aizumi.tokushima.jp\0"
-"h\xc3\xb8yanger.no\0"
-"kikonai.hokkaido.jp\0"
-"bahccavuotna.no\0from-sc.com\0"
-"omuta.fukuoka.jp\0nanyo.yamagata.jp\0"
-"dynalias.net\0"
-"cloud66.ws\0"
-"yachiyo.ibaraki.jp\0"
-"campinagrande.br\0"
-"amot.no\0qoto.io\0"
-"lamdong.vn\0gmbh\0messerli.app\0"
-"hirakata.osaka.jp\0\xe0\xb4\xad\xe0\xb4\xbe\xe0\xb4\xb0\xe0\xb4\xa4\xe0\xb4\x82\0"
-"ibestad.no\0"
-"krakow.pl\0"
-"web.gu\0quicksytes.com\0"
-"miura.kanagawa.jp\0"
-"priv.hu\0"
-"caltanissetta.it\0sadist.jp\0"
-"publishproxy.com\0"
-"fuel.aero\0lib.md.us\0"
-"tenkawa.nara.jp\0"
-"web.id\0podlasie.pl\0"
-"firm.ro\0"
-"akagi.shimane.jp\0"
-"cc.wi.us\0*.stolos.io\0"
-"adult.ht\0ra.it\0bona.jp\0"
-"rad\xc3\xb8y.no\0cc.fl.us\0"
-"godo.gifu.jp\0etisalat\0"
-"supplies\0serveexchange.com\0"
-"sassari.it\0web.in\0"
-"architectes.bj\0"
-"gulen.no\0dscloud.me\0"
-"vercelli.it\0"
-"fyresdal.no\0"
-"binhdinh.vn\0"
-"ad.jp\0adult\0cern\0"
-"salud.bo\0"
-"saiki.oita.jp\0"
-"noip.us\0"
-"mo-i-rana.no\0"
-"chigasaki.kanagawa.jp\0"
-"iwakura.aichi.jp\0"
-"okawa.fukuoka.jp\0toyo.kochi.jp\0"
-"gouv.km\0karmoy.no\0ivano-frankivsk.ua\0joburg\0"
-"campinas.br\0"
-"kin.okinawa.jp\0"
-"shibecha.hokkaido.jp\0"
-"from-la.net\0raindrop.jp\0"
-"zhytomyr.ua\0"
-"eero.online\0barsy.pro\0"
-"hurdal.no\0"
-"web.lk\0is-a-blogger.com\0v.ua\0"
-"joyo.kyoto.jp\0firm.nf\0"
-"business\0firm.ng\0"
-"wa.us\0able\0"
-"b.se\0training\0"
-"travel.in\0kitakata.miyazaki.jp\0sayama.osaka.jp\0gouv.ml\0"
-"mobi.gp\0whitesnow.jp\0"
-"priv.at\0"
-"ddnss.org\0"
-"kikirara.jp\0"
-"finn\xc3\xb8y.no\0"
-"in-addr.arpa\0cc.ct.us\0"
-"yamato.fukushima.jp\0"
-"dp.ua\0"
-"slg.br\0"
-"ullensvang.no\0"
-"web.nf\0"
-"clerk.app\0"
-"web.ni\0www.ro\0"
-"barsy.pub\0"
-"assn.lk\0"
-"radoy.no\0authgearapps.com\0"
-"leitungsen.de\0"
-"fukaya.saitama.jp\0"
-"hk.com\0"
-"hole.no\0"
-"from-sd.com\0"
-"tsuno.kochi.jp\0cantho.vn\0namaste.jp\0trafficplex.cloud\0"
-"ilovecollege.info\0"
-"trader.aero\0fetsund.no\0"
-"inatsuki.fukuoka.jp\0"
-"ms.leg.br\0"
-"hadano.kanagawa.jp\0hikawa.shimane.jp\0"
-"ac.gov.br\0watari.miyagi.jp\0"
-"drud.io\0"
-"fvg.it\0"
-"ambulance.aero\0"
-"trentino-aadige.it\0noto.ishikawa.jp\0"
-"*.spectrum.myjino.ru\0"
-"ne.jp\0"
-"web.pk\0us-west-2.elasticbeanstalk.com\0"
-"seven\0"
+"neat-url.com\0"
+"okagaki.fukuoka.jp\0mail-box.ne.jp\0"
+"omigawa.chiba.jp\0"
+"prd.fr\0"
+"katowice.pl\0"
+"ns.ca\0"
+"s3.dualstack.ap-northeast-1.amazonaws.com\0"
+"hiji.oita.jp\0johana.toyama.jp\0"
+"servegame.com\0"
+"kitakata.miyazaki.jp\0"
+"yuki.ibaraki.jp\0kudoyama.wakayama.jp\0"
+"soc.lk\0wv.us\0"
+"joinville.br\0\xe5\xae\xae\xe5\xb4\x8e.jp\0minamiise.mie.jp\0"
+"nl.ca\0"
+"yono.saitama.jp\0"
+"dating\0dynalias.org\0"
+"meme\0d.gv.vc\0from-pr.com\0"
+"jaworzno.pl\0main.jp\0"
+"lindesnes.no\0nl.ci\0"
+"norton\0webhop.biz\0"
+"from-wi.com\0"
+"pesaro-urbino.it\0\xe4\xb8\x96\xe7\x95\x8c\0"
+"s3-website.ap-south-2.amazonaws.com\0"
+"\xc3\xb8rskog.no\0"
+"blogspot.ae\0"
+"um.gov.pl\0"
+"nom.za\0"
+"s3-object-lambda.ap-northeast-3.amazonaws.com\0"
+"etc.br\0"
+"zombie.jp\0blogspot.al\0"
+"mosj\xc3\xb8""en.no\0blogspot.am\0"
+"analytics-gateway.ap-south-1.amazonaws.com\0""1337.pictures\0"
+"emrstudio-prod.af-south-1.amazonaws.com\0"
+"pv.it\0edu.krd\0"
+"games\0cd.eu.org\0"
+"v\xc3\xa1rgg\xc3\xa1t.no\0cust.dev.thingdust.io\0"
+"uz.ua\0menu\0"
+"lib.in.us\0"
+"!city.nagoya.jp\0"
+"wa.us\0"
+"higashiizumo.shimane.jp\0forte.id\0"
+"kawaguchi.saitama.jp\0clickrising.net\0"
+"po.it\0"
+"s3-object-lambda.af-south-1.amazonaws.com\0dyndns.info\0logoip.de\0"
+"diadem.cloud\0"
+"e164.arpa\0"
+"kiyokawa.kanagawa.jp\0kanzaki.saga.jp\0"
+"kumakogen.ehime.jp\0rr.leg.br\0"
+"sdn.gov.pl\0"
+"prd.km\0"
+"ascoli-piceno.it\0wnext.app\0"
+"video.hu\0ngo.lk\0"
+"lier.no\0"
+"baidar.no\0shangrila\0"
+"akdn\0"
+"lodingen.no\0"
+"mugi.tokushima.jp\0"
+"hashimoto.wakayama.jp\0skr.jp\0"
+"lardal.no\0stryn.no\0"
+"surf\0"
+"pa.it\0schmidt\0"
+"boxfuse.io\0from-dc.com\0"
+"emilia-romagna.it\0udono.mie.jp\0"
+"emrappui-prod.me-south-1.amazonaws.com\0"
+"*.ocs.customer-oci.com\0"
+"muroran.hokkaido.jp\0mimata.miyazaki.jp\0"
+"lincoln\0"
+"prd.mg\0"
+"us.gov.pl\0"
+"s3-object-lambda.eu-south-1.amazonaws.com\0"
+"rs.leg.br\0sc.leg.br\0"
+"ngo.ng\0"
+"choyo.kumamoto.jp\0nakagawa.nagano.jp\0"
+"vgs.no\0fhsk.se\0s3.dualstack.il-central-1.amazonaws.com\0"
+"witd.gov.pl\0"
+"mysecuritycamera.org\0"
+"tomika.gifu.jp\0"
+"emrstudio-prod.eu-west-3.amazonaws.com\0"
+"funabashi.chiba.jp\0health\0"
+"horse\0id.repl.co\0"
+"shimokawa.hokkaido.jp\0"
+"s3-object-lambda.us-west-1.amazonaws.com\0"
+"okazaki.aichi.jp\0"
+"folkebibl.no\0"
+"durban\0"
 "law.za\0"
+"\xe4\xb8\x89\xe9\x87\x8d.jp\0toya.hokkaido.jp\0"
+"tn.us\0"
+"wskr.gov.pl\0dnsalias.net\0"
+"wafflecell.com\0"
+"myvnc.com\0"
+"arts.co\0"
+"ngo.ph\0"
+"safety.aero\0progressive\0"
+"trentinsud-tirol.it\0miyazu.kyoto.jp\0qpon\0ch.trendhosting.cloud\0"
+"fin.tn\0"
+"zappos\0"
+"izu.shizuoka.jp\0"
+"arte.bo\0teva\0"
+"jus.br\0koshigaya.saitama.jp\0"
+"barsy.pro\0"
+"arakawa.tokyo.jp\0"
+"lib.ga.us\0"
+"shizukuishi.iwate.jp\0nagahama.shiga.jp\0"
+"nexus\0leadpages.co\0"
+"ne.jp\0"
+"verran.no\0"
+"mn.it\0hatogaya.saitama.jp\0takatsuki.shiga.jp\0"
+"gotdns.com\0u2-local.xnbay.com\0"
 "ne.ke\0"
-"isesaki.gunma.jp\0holy.jp\0"
-"jeonnam.kr\0chirurgiens-dentistes-en-france.fr\0"
-"k12.in.us\0"
-"bozen-s\xc3\xbc""dtirol.it\0servers.run\0"
-"arna.no\0is-a-candidate.org\0"
-"achi.nagano.jp\0"
-"guovdageaidnu.no\0"
-"takamori.nagano.jp\0ne.kr\0"
-"sandnessjoen.no\0giehtavuoatna.no\0s3-website.eu-central-1.amazonaws.com\0"
-"mt.leg.br\0"
-"cc.ri.us\0"
-"cc.al.us\0"
-"shonai.yamagata.jp\0"
-"ezproxy.kuleuven.be\0"
-"yachiyo.chiba.jp\0"
-"l\xc3\xb8renskog.no\0tec.ve\0"
-"annaka.gunma.jp\0xxx\0"
-"christmas\0"
-"frei.no\0"
-"giving\0"
-"finnoy.no\0from-dc.com\0"
-"faststacks.net\0"
-"buzz\0"
-"fhv.se\0"
-"play\0"
-"navuotna.no\0woodside\0"
-"kuzumaki.iwate.jp\0notogawa.shiga.jp\0okutama.tokyo.jp\0xyz\0"
-"nesodden.no\0\xd8\xb4\xd8\xa8\xd9\x83\xd8\xa9\0"
-"rokunohe.aomori.jp\0green\0hs.run\0"
-"adobeaemcloud.com\0"
-"trentinosudtirol.it\0oiso.kanagawa.jp\0"
-"ha.cn\0lodi.it\0final\0"
-"kawaue.gifu.jp\0"
-"alto-adige.it\0"
-"ikeda.gifu.jp\0joso.ibaraki.jp\0"
-"utashinai.hokkaido.jp\0web.tj\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa5\x8b\xe0\xa4\xa4\0"
-"yahoo\0"
-"bulsan-s\xc3\xbc""dtirol.it\0kure.hiroshima.jp\0taiki.hokkaido.jp\0"
-"byen.site\0"
-"seirou.niigata.jp\0"
-"h\xc3\xb8nefoss.no\0stange.no\0*.customer-oci.com\0"
-"web.tr\0"
-"ecologia.bo\0"
-"copro.uk\0"
-"sos.pl\0"
-"m\xc3\xa5s\xc3\xb8y.no\0vpnplus.to\0"
-"fm.br\0cremona.it\0"
-"vennesla.no\0lib.va.us\0"
-"lib.fl.us\0rogers\0noip.me\0"
-"tsuruta.aomori.jp\0"
-"d.gv.vc\0"
-"chikuhoku.nagano.jp\0"
-"paris.eu.org\0"
-"cc.pa.us\0"
-"web.ve\0alipay\0"
-"lefrak\0"
-"tsukumi.oita.jp\0itigo.jp\0"
-"s3.fr-par.scw.cloud\0"
-"fuoisku.no\0ne.pw\0webview-assets.aws-cloud9.eu-north-1.amazonaws.com\0"
-"balsan-sudtirol.it\0"
-"room\0"
-"taira.toyama.jp\0girly.jp\0"
-"panasonic\0"
-"inashiki.ibaraki.jp\0anan.tokushima.jp\0"
-"k.bg\0gifts\0"
-"ragusa.it\0hashikami.aomori.jp\0servebbs.net\0"
-"sydney\0adimo.co.uk\0"
-"prof.pr\0firewall-gateway.net\0"
-"s3-ap-southeast-1.amazonaws.com\0"
-"hikone.shiga.jp\0nagato.yamaguchi.jp\0"
-"school.na\0"
-"treviso.it\0higashinaruse.akita.jp\0auspost\0akamaiorigin-staging.net\0"
-"barueri.br\0yoshikawa.saitama.jp\0"
-"cc.nm.us\0"
-"nakagyo.kyoto.jp\0"
-"forum.hu\0tselinograd.su\0filegear-au.me\0"
-"\xe7\x86\x8a\xe6\x9c\xac.jp\0"
-"cloudcontrolled.com\0"
-"simplesite.com.br\0"
-"*.stgstage.dev\0a.ssl.fastly.net\0"
-"tosashimizu.kochi.jp\0"
-"habmer.no\0k\xc3\xa5""fjord.no\0"
-"*.telebit.xyz\0"
-"you\0"
-"nyc.mn\0"
-"from-ok.com\0"
-"fujikawaguchiko.yamanashi.jp\0"
-"\xe4\xb8\xad\xe5\x9b\xbd\0dsmynas.com\0"
-"school.nz\0"
-"ny.us\0"
-"adobeioruntime.net\0"
-"k12.vi.us\0"
-"dance\0"
-"koka.shiga.jp\0iliadboxos.it\0"
-"web.za\0s3-website-us-west-1.amazonaws.com\0"
-"health\0"
-"k8s.nl-ams.scw.cloud\0"
-"cc.mi.us\0\xe4\xb8\xad\xe5\x9c\x8b\0"
-"kunimi.fukushima.jp\0akamai.net\0"
-"systems\0"
-"lombardy.it\0kamo.niigata.jp\0"
-"lillesand.no\0website\0"
-"takanabe.miyazaki.jp\0"
-"lego\0"
-"ne.ug\0dy.fi\0"
-"otobe.hokkaido.jp\0naklo.pl\0"
-"kommune.no\0"
-"yachimata.chiba.jp\0ne.tz\0gialai.vn\0"
-"api.stdlib.com\0"
-"narashino.chiba.jp\0"
-"analytics-gateway.us-east-1.amazonaws.com\0from-ct.com\0"
-"service.gov.uk\0"
-"minowa.nagano.jp\0"
-"hjartdal.no\0"
-"watarai.mie.jp\0"
-"ne.us\0us-east-1.elasticbeanstalk.com\0"
-"herokussl.com\0barsy.org\0"
-"nosegawa.nara.jp\0"
-"institute\0"
-"drud.us\0"
-"sn.cn\0"
-"fm.it\0tottori.jp\0kozagawa.wakayama.jp\0"
-"kurate.fukuoka.jp\0\xe0\xb8\x98\xe0\xb8\xb8\xe0\xb8\xa3\xe0\xb8\x81\xe0\xb8\xb4\xe0\xb8\x88.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"lorenskog.no\0"
-"chuo.tokyo.jp\0"
-"emr.it\0tono.iwate.jp\0kiyokawa.kanagawa.jp\0togura.nagano.jp\0oyama.tochigi.jp\0"
-"shopping\0"
-"haiphong.vn\0"
-"nico\0property\0"
-"ma.us\0"
-"am.br\0hinohara.tokyo.jp\0boehringer\0"
-"lib.al.us\0"
-"kanie.aichi.jp\0\xd8\xb9\xd9\x85\xd8\xa7\xd9\x86\0cdn77-ssl.net\0"
-"engerdal.no\0"
-"klabu.no\0co.com\0"
-"s\xc3\xb8r-aurdal.no\0secaas.hk\0"
-"merckmsd\0websozai.jp\0"
-"yun\0de.gt\0"
-"ovre-eiker.no\0sola.no\0km.ua\0"
-"yamagata.jp\0"
-"kirara.st\0"
-"ha.no\0"
-"googlecode.com\0"
-"co.education\0"
-"minamata.kumamoto.jp\0"
-"porsgrunn.no\0\xd1\x8f.\xd1\x80\xd1\x83\xd1\x81\0"
-"akiruno.tokyo.jp\0"
-"hammarfeasta.no\0"
-"matsuura.nagasaki.jp\0"
-"myhome-server.de\0"
-"kishiwada.osaka.jp\0priv.pl\0"
-"vfs.cloud9.af-south-1.amazonaws.com\0"
-"bulsan-suedtirol.it\0tenri.nara.jp\0gallup\0"
-"k12.az.us\0"
-"yamanashi.jp\0"
-"nikaho.akita.jp\0"
-"tr.it\0"
-"kirovograd.ua\0jelastic.team\0"
-"gunma.jp\0"
-"pb.ao\0xs4all.space\0"
-"or.at\0"
-"fm.no\0fh-muenster.io\0"
-"uh-oh.jp\0"
-"\xd1\x80\xd1\x83\xd1\x81\0"
-"shimane.shimane.jp\0"
-"or.bi\0"
-"esan.hokkaido.jp\0"
-"gol.no\0customer.mythic-beasts.com\0"
-"quebec\0"
-"oschr.gov.pl\0"
-"\xe8\x87\xba\xe7\x81\xa3\0"
-"oum.gov.pl\0backan.vn\0"
-"al.gov.br\0"
-"priv.no\0java\0"
-"kuleuven.cloud\0"
-"lib.ny.us\0"
-"handcrafted.jp\0"
-"or.ci\0googleapis.com\0"
-"ca.in\0nakanojo.gunma.jp\0mobi.tt\0"
-"dyn.home-webserver.de\0"
-"smart\0"
-"cc.hi.us\0cable-modem.org\0"
-"ca.it\0mobi.tz\0zip\0"
-"or.cr\0tondabayashi.osaka.jp\0gloomy.jp\0"
-"m\xc3\xa1latvuopmi.no\0overhalla.no\0ie.ua\0"
-"vf.no\0"
-"in.net\0"
-"intl.tn\0"
-"shimabara.nagasaki.jp\0"
-"odda.no\0"
-"ribeirao.br\0"
-"tysvar.no\0clothing\0de.ls\0"
-"hokuto.yamanashi.jp\0de.md\0"
-"yashiro.hyogo.jp\0"
-"fujiyoshida.yamanashi.jp\0"
-"sorum.no\0"
-"isen.kagoshima.jp\0"
-"lib.nm.us\0technology\0"
-"priv.me\0"
-"am.in\0"
-"skygearapp.com\0"
-"tran\xc3\xb8y.no\0"
-"gdynia.pl\0"
-"nike\0wixsite.com\0"
-"kita.tokyo.jp\0"
-"tr.no\0"
-"miyawaka.fukuoka.jp\0"
-"shirakawa.fukushima.jp\0"
-"s3.nl-ams.scw.cloud\0"
-"happou.akita.jp\0kitadaito.okinawa.jp\0"
-"framer.photos\0"
-"*.futurecms.at\0"
-"iris.arpa\0temasek\0app.render.com\0"
-"reggio-emilia.it\0"
-"*.hosting.myjino.ru\0"
-"hikimi.shimane.jp\0ngrok-free.app\0"
-"\xd9\x83\xd8\xa7\xd8\xab\xd9\x88\xd9\x84\xd9\x8a\xd9\x83\0is-found.org\0"
-"chippubetsu.hokkaido.jp\0"
-"lib.la.us\0"
-"*.kunden.ortsinfo.at\0"
-"teshikaga.hokkaido.jp\0ama.shimane.jp\0"
-"ca.na\0taobao\0"
-"plus\0"
-"pv.it\0"
-"recreation.aero\0dni.us\0"
-"gjerstad.no\0accesscam.org\0"
-"mobi.na\0"
-"kunitomi.miyazaki.jp\0"
-"troms\xc3\xb8.no\0airforce\0"
-"motosu.gifu.jp\0ide.kyoto.jp\0"
-"miami\0nyan.to\0"
-"kamishihoro.hokkaido.jp\0kobayashi.miyazaki.jp\0"
-"mobi.ng\0"
-"now-dns.top\0"
-"soni.nara.jp\0"
-"ddnsking.com\0"
-"nakanoto.ishikawa.jp\0"
-"or.id\0kashihara.nara.jp\0takashima.shiga.jp\0parliament.nz\0"
-"dyndns-blog.com\0paas.massivegrid.com\0"
-"milano.it\0koori.fukushima.jp\0trust\0"
-"k.se\0"
-"k12.me.us\0"
-"hofu.yamaguchi.jp\0"
-"but.jp\0"
-"musica.ar\0ac.leg.br\0"
-"or.it\0"
-"video.hu\0"
-"ladesk.com\0"
-"schaeffler\0"
-"szczytno.pl\0chat\0"
-"musica.bo\0"
-"oppegard.no\0"
-"or.jp\0chuo.chiba.jp\0upow.gov.pl\0"
-"tranoy.no\0"
-"kounosu.saitama.jp\0"
-"or.ke\0no-ip.org\0"
-"fukui.fukui.jp\0"
-"gs.aa.no\0rennes\xc3\xb8y.no\0"
-"aure.no\0"
-"akkeshi.hokkaido.jp\0"
-"caa.aero\0rdv.to\0"
-"k12.ky.us\0"
-"tomari.hokkaido.jp\0shibata.miyagi.jp\0*.on-rancher.cloud\0"
-"seiyo.ehime.jp\0or.kr\0"
-"dynalias.org\0"
-"miyama.mie.jp\0"
-"padova.it\0"
-"\xe4\xbf\xa1\xe6\x81\xaf\0"
-"opensocial.site\0"
-"nasushiobara.tochigi.jp\0"
-"takarazuka.hyogo.jp\0"
-"ass.km\0gs.jan-mayen.no\0termez.su\0"
-"apigee.io\0"
-"ichinomiya.aichi.jp\0"
-"software.aero\0"
-"aki.kochi.jp\0*.webpaas.ovh.net\0"
-"khakassia.su\0"
-"\xe5\x8c\x97\xe6\xb5\xb7\xe9\x81\x93.jp\0"
-"mobi.ke\0"
-"kusatsu.gunma.jp\0tel.tr\0"
-"de.us\0forsale\0\xe9\xa6\x99\xe6\xa0\xbc\xe9\x87\x8c\xe6\x8b\x89\0"
-"aizumisato.fukushima.jp\0hatoyama.saitama.jp\0"
-"buyshouses.net\0from-az.net\0jelastic.saveincloud.net\0"
-"or.na\0\xe0\xb8\x84\xe0\xb8\xad\xe0\xb8\xa1\0"
-"bielawa.pl\0memorial\0akamaized.net\0"
-"or.mu\0sandcats.io\0"
-"saobernardo.br\0"
-"\xc3\xa5lg\xc3\xa5rd.no\0\xd1\x81\xd1\x80\xd0\xb1\0"
-"n4t.co\0"
-"now.sh\0"
-"safe\0"
-"map.fastly.net\0"
-"tr.eu.org\0"
-"hachirogata.akita.jp\0"
-"academy\0"
-"altoadige.it\0"
-"gs.of.no\0""4u.com\0"
-"laocai.vn\0lubartow.pl\0"
-"trentinsuedtirol.it\0s3-website.nl-ams.scw.cloud\0"
-"neat-url.com\0"
-"ca.us\0"
-"nonoichi.ishikawa.jp\0cloudjiffy.net\0"
-"k12.ia.us\0lib.ga.us\0"
-"monza.it\0"
-"floripa.br\0"
-"voagat.no\0"
-"modena.it\0"
-"lease\0"
-"gz.cn\0arao.kumamoto.jp\0higashine.yamagata.jp\0"
-"forde.no\0"
-"taifun-dns.de\0"
-"saga.saga.jp\0"
-"urn.arpa\0collegefan.org\0"
-"or.pw\0blogdns.com\0"
-"omasvuotna.no\0"
-"gs.mr.no\0"
-"tube\0webview-assets.aws-cloud9.eu-west-1.amazonaws.com\0"
-"goldpoint\0"
-"bozen-sudtirol.it\0"
-"f\xc3\xb8rde.no\0k12.gu.us\0"
-"yamato.kumamoto.jp\0"
-"yolasite.com\0"
-"gold\0"
-"golf\0verisign\0"
-"3.azurestaticapps.net\0"
-"guitars\0"
-"mosjoen.no\0"
-"securitytactics.com\0"
-"za.net\0"
-"clan.rip\0"
-"r\xc3\xa1isa.no\0"
-"milan.it\0dongthap.vn\0"
-"healthcare\0"
-"mints.ne.jp\0"
-"vic.au\0ferrari\0github.io\0"
-"trentino-s\xc3\xbc""dtirol.it\0bosch\0"
-"t.bg\0is-a-student.com\0"
-"yurihonjo.akita.jp\0maniwa.okayama.jp\0"
-"from-ia.com\0playstation-cloud.com\0u2.xnbay.com\0"
-"zlg.br\0"
-"torino.it\0or.th\0"
-"fnd.br\0"
-"cc.nv.us\0"
-"sale\0"
-"hiratsuka.kanagawa.jp\0"
-"lifestyle\0"
-"ote.bj\0omiya.saitama.jp\0*.lcl.dev\0"
-"fnc.fr-par.scw.cloud\0"
-"slattum.no\0or.ug\0"
-"mutual.ar\0kicks-ass.net\0"
-"tomobe.ibaraki.jp\0toyosato.shiga.jp\0or.tz\0"
-"goog\0"
-"stream\0"
-"codeberg.page\0"
-"pesarourbino.it\0isumi.chiba.jp\0"
-"or.us\0"
-"kobierzyce.pl\0"
-"skydiving.aero\0"
-"okuizumo.shimane.jp\0"
-"accountant\0pigboat.jp\0"
-"v\xc3\xa5ler.hedmark.no\0aca.pro\0prequalifyme.today\0"
-"crap.jp\0"
-"authgear-staging.com\0"
-"yorii.saitama.jp\0kitayama.wakayama.jp\0"
-"staples\0"
-"yoshida.shizuoka.jp\0"
-"santoandre.br\0nakijin.okinawa.jp\0lgbt\0"
-"tokai.ibaraki.jp\0"
-"withyoutube.com\0"
-"airkitapps-au.com\0"
-"toyonaka.osaka.jp\0"
-"her\xc3\xb8y.m\xc3\xb8re-og-romsdal.no\0marshalls\0"
-"yuzawa.niigata.jp\0goupile.fr\0"
-"rivne.ua\0"
-"dynserv.org\0"
+"sb.ua\0"
+"miyoshi.tokushima.jp\0"
+"android\0"
+"larvik.no\0"
+"suli.hu\0framer.media\0"
+"saobernardo.br\0\xe6\x96\xb0\xe6\xbd\x9f.jp\0tenri.nara.jp\0ne.kr\0"
+"her\xc3\xb8y.nordland.no\0"
+"inzai.chiba.jp\0motobu.okinawa.jp\0"
+"kawaba.gunma.jp\0"
+"barsy.pub\0"
+"pmn.it\0iwanai.hokkaido.jp\0"
+"wa.gov.au\0"
+"doesntexist.com\0"
+"chikushino.fukuoka.jp\0"
+"iglesias-carbonia.it\0futaba.fukushima.jp\0mima.tokushima.jp\0"
+"bulsan-s\xc3\xbc""dtirol.it\0"
+"luxe\0"
+"fukudomi.saga.jp\0shop.th\0rn.leg.br\0"
+"iijima.nagano.jp\0"
+"li.it\0tohnosho.chiba.jp\0"
+"jprs\0"
+"nl.no\0"
+"kamifurano.hokkaido.jp\0"
+"hof.no\0"
+"cheap.jp\0"
+"oslo.no\0lerdal.no\0"
+"kr.it\0"
+"lublin.pl\0"
+"chtr.k12.ma.us\0ox.rs\0"
+"jcloud-ver-jpc.ik-server.com\0"
+"small-web.org\0"
+"higashinaruse.akita.jp\0bytom.pl\0"
+"gz.cn\0bacgiang.vn\0"
+"webview-assets.aws-cloud9.ap-east-1.amazonaws.com\0"
+"go.gov.br\0"
+"ro.leg.br\0medecin.fr\0"
+"ishikari.hokkaido.jp\0"
+"trentino-s\xc3\xbc""d-tirol.it\0"
+"akita.jp\0hiroo.hokkaido.jp\0"
+"shop.ro\0"
+"carrd.co\0"
+"gs.cn\0"
+"reise\0"
+"s3-accesspoint.dualstack.il-central-1.amazonaws.com\0"
+"haboro.hokkaido.jp\0global\0"
+"ap-northeast-1.elasticbeanstalk.com\0x443.pw\0"
+"matsuno.ehime.jp\0"
+"toscana.it\0"
+"\xc3\xb8vre-eiker.no\0"
+"s3.dualstack.af-south-1.amazonaws.com\0"
+"rifu.miyagi.jp\0"
+"fastlylb.net\0fireweb.app\0"
+"kameyama.mie.jp\0"
+"ne.pw\0ravendb.me\0"
+"trentinsuedtirol.it\0"
+"inagawa.hyogo.jp\0"
+"post.in\0shop.pl\0"
+"kirovograd.ua\0"
+"s3-accesspoint-fips.us-west-2.amazonaws.com\0"
+"toyoake.aichi.jp\0"
+"haugesund.no\0"
+"s3-accesspoint.me-central-1.amazonaws.com\0"
+"daigo.ibaraki.jp\0"
+"io.in\0sakai.ibaraki.jp\0ivory.ne.jp\0"
+"pa.us\0"
+"from.hr\0*.elb.amazonaws.com.cn\0"
+"\xe7\xbe\xa4\xe9\xa6\xac.jp\0s3.isk01.sakurastorage.jp\0"
+"nt.edu.au\0"
+"df.leg.br\0"
+"ngo.za\0locus\0"
+"aostavalley.it\0"
+"ismaili\0"
+"izumi.kagoshima.jp\0kanan.osaka.jp\0"
+"iida.nagano.jp\0"
+"ddnsfree.com\0"
+"iiyama.nagano.jp\0"
+"software\0"
+"ako.hyogo.jp\0"
+"arts.ve\0altervista.org\0"
+"macapa.br\0"
+"baclieu.vn\0"
+"mlbfan.org\0io.kg\0"
+"miyake.nara.jp\0"
 "kiyosu.aichi.jp\0"
-"in.na\0trycloudflare.com\0"
-"shonai.fukuoka.jp\0"
-"in.ni\0geekgalaxy.com\0"
-"rs.ba\0"
-"dyndns-mail.com\0"
-"arakawa.saitama.jp\0"
-"webview-assets.aws-cloud9.us-east-1.amazonaws.com\0"
-"nesna.no\0"
-"analytics\0"
-"dating\0"
-"arendal.no\0abbvie\0"
-"\xe7\xa5\x9e\xe5\xa5\x88\xe5\xb7\x9d.jp\0"
-"8.bg\0"
-"tsubata.ishikawa.jp\0"
-"airline.aero\0"
-"warszawa.pl\0"
-"from-wy.com\0pyatigorsk.ru\0karaganda.su\0"
-"er.in\0"
-"jinsekikogen.hiroshima.jp\0"
-"sc.cn\0midori.chiba.jp\0wsa.gov.pl\0"
+"navigation.aero\0bnpparibas\0mitsubishi\0"
+"moseushi.hokkaido.jp\0aero.tt\0\xd8\xb9\xd8\xb1\xd8\xa7\xd9\x82\0"
+"test-iserv.de\0"
+"mifune.kumamoto.jp\0"
+"helsinki\0"
+"64-b.it\0"
+"scrapper-site.net\0"
+"vinnytsia.ua\0"
+"setagaya.tokyo.jp\0"
+"lavagis.no\0ne.ug\0"
+"opencraft.hosting\0"
+"aero.mv\0ne.tz\0"
+"taipei\0"
+"samegawa.fukushima.jp\0"
+"s3-accesspoint.ap-southeast-4.amazonaws.com\0"
+"lib.az.us\0"
+"otobe.hokkaido.jp\0toyoura.hokkaido.jp\0uenohara.yamanashi.jp\0"
+"karm\xc3\xb8y.no\0ne.us\0analytics\0"
 "hokkaido.jp\0"
-"maizuru.kyoto.jp\0sango.nara.jp\0minami-alps.yamanashi.jp\0sarl\0"
-"entertainment.aero\0kv.ua\0balashov.su\0"
-"\xd8\xa7\xd9\x84\xd8\xb9\xd9\x84\xd9\x8a\xd8\xa7\xd9\x86\0"
-"oyer.no\0"
-"kimitsu.chiba.jp\0lawyer\0"
-"vfs.cloud9.ap-northeast-2.amazonaws.com\0ap-southeast-2.elasticbeanstalk.com\0"
-"trentin-sued-tirol.it\0furudono.fukushima.jp\0kiyama.saga.jp\0caravan\0"
+"ouda.nara.jp\0nanbu.yamanashi.jp\0"
+"games.hu\0"
+"loginline.dev\0"
+"mn.us\0"
+"even\xc3\xa1\xc5\xa1\xc5\xa1i.no\0"
+"dsmynas.org\0"
+"sinaapp.com\0"
+"toyotomi.hokkaido.jp\0yamaga.kumamoto.jp\0"
 "promo\0"
-"ch.trendhosting.cloud\0"
-"myfast.space\0"
-"al.leg.br\0"
-"s3.ca-central-1.amazonaws.com\0"
-"emerck\0"
-"shikatsu.aichi.jp\0pomorze.pl\0wien\0"
-"vfs.cloud9.eu-south-1.amazonaws.com\0folionetwork.site\0"
-"ab.ca\0"
-"sodegaura.chiba.jp\0"
-"cagliari.it\0mihama.aichi.jp\0takatsuki.shiga.jp\0"
-"ws.na\0"
-"uk.in\0shiso.hyogo.jp\0"
-"is-a-hunter.com\0servebbs.org\0"
-"dnsupdate.info\0"
-"hokksund.no\0webspace.rocks\0"
-"kustanai.ru\0"
-"sanuki.kagawa.jp\0homedepot\0"
-"salangen.no\0"
-"nakadomari.aomori.jp\0kasahara.gifu.jp\0iijima.nagano.jp\0"
-"ekloges.cy\0"
-"in.rs\0"
-"ginowan.okinawa.jp\0"
-"inc.hk\0"
+"langev\xc3\xa5g.no\0"
+"balsan-s\xc3\xbc""dtirol.it\0"
+"dy.fi\0"
+"ge.it\0service.gov.scot\0"
+"from-me.org\0"
+"makinohara.shizuoka.jp\0"
+"arts.ro\0quebec\0technology\0hk.com\0"
+"casino.hu\0"
+"\xe4\xb8\xad\xe4\xbf\xa1\0"
 "krasnodar.su\0"
-"kustanai.su\0"
-"akamaiedge-staging.net\0"
-"homes\0uk.kg\0"
-"webview-assets.cloud9.us-west-2.amazonaws.com\0"
-"xii.jp\0"
-"sth.ac.at\0"
-"balestrand.no\0tech.orange\0"
-"ami.ibaraki.jp\0"
-"save\0"
-"yanagawa.fukuoka.jp\0tsubame.niigata.jp\0"
-"jessheim.no\0"
-"wanouchi.gifu.jp\0oshu.iwate.jp\0in.th\0"
-"appspacehosted.com\0"
-"yura.wakayama.jp\0"
-"kuromatsunai.hokkaido.jp\0"
-"catholic.edu.au\0itau\0freemyip.com\0"
-"dev.br\0bz.it\0"
-"og.ao\0"
-"in.ua\0"
-"nis.za\0hb.cldmail.ru\0"
-"okayama.jp\0"
-"jolster.no\0vfs.cloud9.us-west-1.amazonaws.com\0"
-"senasa.ar\0"
-"komatsushima.tokushima.jp\0"
-"is-a-socialist.com\0"
-"tj\xc3\xb8me.no\0"
-"wpmucdn.com\0"
-"in.us\0"
-"ny-2.paas.massivegrid.net\0"
-"cust.disrec.thingdust.io\0"
-"ogose.saitama.jp\0chu.jp\0"
-"uk.eu.org\0"
-"tonosho.kagawa.jp\0futsu.nagasaki.jp\0suita.osaka.jp\0m\xc4\x81ori.nz\0"
-"saxo\0"
-"av.it\0realestate.pl\0"
-"tuxfamily.org\0"
-"wiki\0"
-"damnserver.com\0"
-"foggia.it\0ricoh\0"
-"kirkenes.no\0"
-"toba.mie.jp\0"
-"kosuge.yamanashi.jp\0"
-"recife.br\0"
-"sc.ke\0"
-"gov.nc.tr\0"
-"co.financial\0"
-"gloppen.no\0"
-"iruma.saitama.jp\0"
-"\xc3\xb8ksnes.no\0"
-"kasamatsu.gifu.jp\0sc.kr\0"
-"beats\0"
-"iiyama.nagano.jp\0"
-"alsace\0"
-"alstahaug.no\0"
-"otsuki.kochi.jp\0"
-"sakahogi.gifu.jp\0"
-"barclays\0lotte\0"
-"canva-apps.com\0"
-"oia.gov.pl\0"
-"malatvuopmi.no\0"
-"heguri.nara.jp\0"
-"sc.ls\0"
-"macapa.br\0"
-"aero\0lotto\0"
-"wine\0dyn.cosidns.de\0"
-"hlx.live\0"
-"lebesby.no\0"
-"t.se\0school.za\0"
-"ojiya.niigata.jp\0"
-"k12.nh.us\0"
-"prochowice.pl\0"
-"*.awdev.ca\0"
-"maori.nz\0"
-"pub.sa\0remotewd.com\0"
-"kashima.saga.jp\0tabitorder.co.il\0"
-"b\xc3\xb8.telemark.no\0"
-"taku.saga.jp\0"
-"ae.org\0discourse.team\0myspreadshop.com\0js.wpenginepowered.com\0"
-"inabe.mie.jp\0"
-"charity\0"
-"app.br\0"
-"karasjok.no\0on-aptible.com\0"
-"volkswagen\0"
-"money\0"
-"\xd8\xa7\xd9\x84\xd9\x85\xd8\xba\xd8\xb1\xd8\xa8\0"
-"\xe6\x84\x9b\xe5\xaa\x9b.jp\0"
-"s3-website.ap-south-1.amazonaws.com\0app.os.stg.fedoraproject.org\0"
-"yukuhashi.fukuoka.jp\0"
-"cranky.jp\0"
-"s3.dualstack.sa-east-1.amazonaws.com\0"
-"noor.jp\0"
-"lib.ee\0mytis.ru\0"
-"no-ip.net\0cistron.nl\0"
-"yoro.gifu.jp\0vxl.sh\0"
-"lib.in.us\0"
-"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86.ir\0dev.static.land\0"
-"ulvik.no\0apps.lair.io\0"
-"bolt.hu\0\xc3\xb8vre-eiker.no\0cust.prod.thingdust.io\0"
-"oyabe.toyama.jp\0"
-"eidfjord.no\0"
-"og.it\0rishirifuji.hokkaido.jp\0"
-"plc.co.im\0"
-"dn.ua\0"
-"macerata.it\0okinoshima.shimane.jp\0restaurant\0"
-"*.ocs.customer-oci.com\0members.linode.com\0"
-"demon.nl\0"
-"aquarelle\0"
-"passenger-association.aero\0"
-"pharmaciens.km\0"
-"leksvik.no\0"
-"steigen.no\0"
-"poznan.pl\0"
-"kouyama.kagoshima.jp\0iwata.shizuoka.jp\0\xd1\x83\xd0\xba\xd1\x80\0"
-"isa.kagoshima.jp\0*.beget.app\0"
-"\xe5\x92\x8c\xe6\xad\x8c\xe5\xb1\xb1.jp\0"
-"my-router.de\0"
-"nishitosa.kochi.jp\0sakado.saitama.jp\0""123homepage.it\0"
-"ms.it\0"
-"mobile\0"
-"\xe4\xb8\x89\xe9\x87\x8d.jp\0ishikawa.fukushima.jp\0kikugawa.shizuoka.jp\0mymediapc.net\0"
-"nord-fron.no\0"
-"armenia.su\0dyn53.io\0"
-"pohl\0"
-"nexus\0"
-"tarnobrzeg.pl\0"
-"cloud-fr1.unispace.io\0"
-"app.gp\0"
-"vard\xc3\xb8.no\0"
-"ikaruga.nara.jp\0digital\0"
-"\xe7\xbd\x91\xe7\xb5\xa1.hk\0audnedaln.no\0"
-"nanporo.hokkaido.jp\0"
-"myddns.rocks\0"
-"ms.kr\0"
-"ras.ru\0"
-"higashikawa.hokkaido.jp\0"
-"lo.it\0kisofukushima.nagano.jp\0"
-"spydeberg.no\0honda\0"
-"shimoda.shizuoka.jp\0"
-"av.tr\0"
-"v\xc3\xa1rgg\xc3\xa1t.no\0"
-"onna.okinawa.jp\0"
-"sc.ug\0is-an-artist.com\0"
-"\xd7\x99\xd7\xa9\xd7\x95\xd7\x91.\xd7\x99\xd7\xa9\xd7\xa8\xd7\x90\xd7\x9c\0yahaba.iwate.jp\0sc.tz\0"
-"production.aero\0citi\0"
-"cam.it\0iizuka.fukuoka.jp\0mydissent.net\0"
-"tysfjord.no\0paas.hosted-by-previder.com\0"
-"yoita.niigata.jp\0"
-"pharmacy\0"
-"bardu.no\0skierv\xc3\xa1.no\0sc.us\0"
-"trentinostirol.it\0aero.tt\0"
-"sa.edu.au\0"
-"trentino-altoadige.it\0s3-website.fr-par.scw.cloud\0"
-"go.ci\0unicom\0"
-"financial\0"
-"city\0"
-"rikubetsu.hokkaido.jp\0"
-"\xd0\xbc\xd0\xb8\xd1\x80.\xd1\x80\xd1\x83\xd1\x81\0"
-"no-ip.co.uk\0townnews-staging.com\0"
-"go.cr\0\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe\0"
-"smushcdn.com\0"
-"psse.gov.pl\0\xe5\xb9\xbf\xe4\xb8\x9c\0"
-"myphotos.cc\0"
-"aero.mv\0"
-"\xc3\xa5""fjord.no\0"
-"2000.hu\0airbus\0"
-"from-ar.com\0"
-"za.org\0"
-"yamaga.kumamoto.jp\0"
-"penne.jp\0"
-"t\xc3\xb8nsberg.no\0"
-"takata.fukuoka.jp\0suwalki.pl\0boy.jp\0"
-"jele.site\0"
-"sannohe.aomori.jp\0jgora.pl\0"
-"emp.br\0baria-vungtau.vn\0"
-"hair\0"
-"qld.gov.au\0"
-"jur.pro\0"
-"alwaysdata.net\0"
-"staging.onred.one\0"
-"cloud.fedoraproject.org\0"
-"\xe5\xb3\xb6\xe6\xa0\xb9.jp\0amakusa.kumamoto.jp\0"
-"\xe0\xae\x87\xe0\xae\xa8\xe0\xaf\x8d\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xbe\0"
-"taiwa.miyagi.jp\0"
-"eidsberg.no\0\xd5\xb0\xd5\xa1\xd5\xb5\0"
-"kicks-ass.org\0"
-"i.bg\0"
-"biratori.hokkaido.jp\0"
-"translated.page\0"
-"turystyka.pl\0"
-"dyndns-at-work.com\0"
-"kazuno.akita.jp\0maibara.shiga.jp\0"
-"zushi.kanagawa.jp\0"
-"stord.no\0"
-"nakano.tokyo.jp\0jeep\0"
-"birkenes.no\0"
-"uni5.net\0"
-"iwafune.tochigi.jp\0"
-"misaki.okayama.jp\0"
-"go.id\0est.pr\0"
-"dev.vu\0"
-"takahagi.ibaraki.jp\0"
-"b\xc3\xa6rum.no\0"
-"fosnes.no\0utwente.io\0"
-"hs.kr\0"
-"binhthuan.vn\0"
-"go.it\0porn\0"
-"nc.tr\0"
-"chihayaakasaka.osaka.jp\0haibara.shizuoka.jp\0"
-"ogori.fukuoka.jp\0ayabe.kyoto.jp\0"
-"psc.br\0fastlylb.net\0egoism.jp\0"
-"go.jp\0sakurai.nara.jp\0"
-"fr\xc3\xb8ya.no\0"
-"go.ke\0"
-"dynathome.net\0"
-"piw.gov.pl\0"
-"ms.us\0nc.us\0"
-"ibaraki.ibaraki.jp\0miyoshi.tokushima.jp\0post\0secret.jp\0"
-"gallery\0"
-"levanger.no\0lib.az.us\0dvrcam.info\0"
-"stalowa-wola.pl\0"
-"ybo.review\0"
-"mitaka.tokyo.jp\0"
-"go.kr\0"
-"lanxess\0"
-"cc.ks.us\0\xe0\xb6\xbd\xe0\xb6\x82\xe0\xb6\x9a\xe0\xb7\x8f\0"
-"fujiidera.osaka.jp\0shimizu.shizuoka.jp\0futbol\0samsclub\0"
-"shinonsen.hyogo.jp\0"
-"pictet\0"
-"sorfold.no\0"
+"nat.tn\0"
+"kr.ua\0"
+"hopto.org\0"
 "ebina.kanagawa.jp\0"
-"maebashi.gunma.jp\0blogsite.xyz\0"
-"tkmaxx\0"
-"onojo.fukuoka.jp\0"
-"epson\0"
-"kizu.kyoto.jp\0"
-"per.la\0hasvik.no\0barcelona\0s3.dualstack.ap-southeast-1.amazonaws.com\0"
-"neyagawa.osaka.jp\0"
-"verona.it\0ozu.kumamoto.jp\0yaizu.shizuoka.jp\0"
-"sg-1.paas.massivegrid.net\0"
-"is-very-good.org\0"
-"sagae.yamagata.jp\0"
-"valleeaoste.it\0"
-"juegos\0"
-"\xe5\xb2\xa9\xe6\x89\x8b.jp\0"
-"\xe8\xb4\xad\xe7\x89\xa9\0"
-"lidl\0"
-"holmestrand.no\0lamborghini\0"
-"scot\0"
-"bungotakada.oita.jp\0wolterskluwer\0"
-"flog.br\0"
-"sci.eg\0"
-"iwanuma.miyagi.jp\0"
-"orkanger.no\0"
-"framer.app\0"
-"naha.okinawa.jp\0\xd9\xbe\xd8\xa7\xd9\x83\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0"
-"ooshika.nagano.jp\0\xe7\xbd\x91\xe5\x9d\x80\0"
-"kani.gifu.jp\0"
-"per.nf\0neustar\0"
-"life\0"
-"kamimine.saga.jp\0tanabe.wakayama.jp\0smartlabeling.scw.cloud\0"
-"\xe7\xbd\x91\xe7\xab\x99\0"
-"hakuba.nagano.jp\0"
-"\xc3\xa5snes.no\0"
-"cs.in\0"
-"kharkiv.ua\0"
-"tp.it\0kiyose.tokyo.jp\0sp.leg.br\0"
-"kommunalforbund.se\0"
-"cs.it\0uppo.gov.pl\0"
-"zt.ua\0"
-"cahcesuolo.no\0"
-"vlog.br\0myfast.host\0"
-"rodoy.no\0"
-"oto.fukuoka.jp\0"
-"parachuting.aero\0"
-"kawakami.nagano.jp\0rzgw.gov.pl\0"
-"go.pw\0"
-"fujisawa.iwate.jp\0"
-"\xe5\xa4\xa9\xe4\xb8\xbb\xe6\x95\x99\0"
-"saroma.hokkaido.jp\0hanyu.saitama.jp\0\xd8\xa7\xd9\x84\xd8\xa8\xd8\xad\xd8\xb1\xd9\x8a\xd9\x86\0s3.isk01.sakurastorage.jp\0"
-"lib.ok.us\0haus\0"
-"nozawaonsen.nagano.jp\0yoshimi.saitama.jp\0kwpsp.gov.pl\0"
-"\xda\x80\xd8\xa7\xd8\xb1\xd8\xaa\0parallel.jp\0"
-"golffan.us\0"
-"\xe0\xb9\x80\xe0\xb8\x99\xe0\xb9\x87\xe0\xb8\x95.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"\xe6\x95\x99\xe8\x82\xb2.hk\0"
-"utazas.hu\0"
-"bo.it\0hospital\0"
-"fhsk.se\0"
-"misugi.mie.jp\0"
-"gamagori.aichi.jp\0akamaihd-staging.net\0lovesick.jp\0"
-"i.ng\0"
-"hachinohe.aomori.jp\0"
-"bplaced.com\0"
-"kids.us\0"
-"nl.ca\0"
-"sunndal.no\0bnpparibas\0"
-"tickets.io\0"
-"pagefrontapp.com\0"
-"hyogo.jp\0"
-"nl.ci\0"
-"go.th\0"
-"pythonanywhere.com\0"
-"go.tj\0"
-"l-o-g-i-n.de\0"
-"inazawa.aichi.jp\0makinohara.shizuoka.jp\0hikari.yamaguchi.jp\0syncloud.it\0"
-"khmelnitskiy.ua\0"
-"shikabe.hokkaido.jp\0kawatana.nagasaki.jp\0izumisano.osaka.jp\0"
-"per.sg\0gripe\0like\0isa-geek.org\0"
-"tochio.niigata.jp\0"
-"nowaruda.pl\0"
-"rsvp\0"
-"shacknet.nu\0"
-"go.ug\0"
-"i.ph\0poniatowa.pl\0"
-"motorcycles\0"
-"go.tz\0"
-"riobranco.br\0"
-"gs.st.no\0"
-"\xd7\x90\xd7\xa7\xd7\x93\xd7\x9e\xd7\x99\xd7\x94.\xd7\x99\xd7\xa9\xd7\xa8\xd7\x90\xd7\x9c\0shinto.gunma.jp\0"
-"\xe4\xbc\x81\xe4\xb8\x9a\0"
-"vfs.cloud9.us-east-1.amazonaws.com\0"
-"shimogo.fukushima.jp\0"
-"k12.mo.us\0lib.ks.us\0"
-"azerbaijan.su\0"
-"veneto.it\0"
-"ismaili\0cloudflare-ipfs.com\0dyndns.org\0bounty-full.com\0"
-"kyowa.akita.jp\0kamisato.saitama.jp\0"
-"dyndns.tv\0"
-"\xe6\x95\x99\xe8\x82\xb2.\xe9\xa6\x99\xe6\xb8\xaf\0kasserver.com\0"
-"dellogliastra.it\0enna.it\0pt.it\0koshimizu.hokkaido.jp\0"
-"urausu.hokkaido.jp\0"
-"dynamisches-dns.de\0wphostedmail.com\0"
-"limo\0dattoweb.com\0"
-"boavista.br\0"
-"varoy.no\0vfs.cloud9.eu-central-1.amazonaws.com\0"
-"pesaro-urbino.it\0anquan\0"
-"edgesuite.net\0"
+"trainer.aero\0ky.us\0shopware.store\0"
+"ent.platform.sh\0"
+"chosei.chiba.jp\0unzen.nagasaki.jp\0"
+"travelers\0backplaneapp.io\0"
+"fg.it\0saka.hiroshima.jp\0uto.kumamoto.jp\0"
+"barsy.org\0"
+"merseine.nu\0"
+"saijo.ehime.jp\0tanabe.kyoto.jp\0haugiang.vn\0"
+"ryd.wafaicloud.com\0"
+"*.telebit.xyz\0"
+"notebook.eu-south-2.sagemaker.aws\0vfs.cloud9.eu-central-1.amazonaws.com\0wellbeingzone.co.uk\0"
+"salerno.it\0ostrowwlkp.pl\0"
+"likescandy.com\0"
+"lundbeck\0"
+"binhthuan.vn\0"
 "klepp.no\0"
-"i.se\0link\0"
-"oguchi.aichi.jp\0opoczno.pl\0"
-"hanggliding.aero\0"
-"kitanakagusuku.okinawa.jp\0"
-"melbourne\0"
-"cc.tx.us\0"
-"toyoura.hokkaido.jp\0thick.jp\0"
-"alt.za\0"
-"academia.bo\0"
-"\xe9\xb3\xa5\xe5\x8f\x96.jp\0"
-"oumu.hokkaido.jp\0"
-"dyndns.ws\0"
-"nagasu.kumamoto.jp\0red.sv\0"
-"yoga\0"
-"yamagata.ibaraki.jp\0nankoku.kochi.jp\0"
-"babymilk.jp\0"
-"taiji.wakayama.jp\0"
-"ut.us\0"
-"hizen.saga.jp\0"
-"morena.br\0"
-"amscompute.com\0"
-"is-certified.com\0health-carereform.com\0"
-"vip.jelastic.cloud\0"
+"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86\0se.leg.br\0"
+"ac.ae\0chernivtsi.ua\0"
+"her\xc3\xb8y.m\xc3\xb8re-og-romsdal.no\0"
+"aioi.hyogo.jp\0tsunan.niigata.jp\0arts.nf\0"
+"ueno.gunma.jp\0cloudapp.net\0"
+"ch.eu.org\0"
+"dr.in\0yorii.saitama.jp\0"
+"ollo\0"
+"ac.at\0"
+"ac.be\0vfs.cloud9.af-south-1.amazonaws.com\0"
+"shell\0"
+"corsica\0"
+"\xe5\xa4\xa7\xe5\x88\x86.jp\0"
+"shimabara.nagasaki.jp\0"
+"uruma.okinawa.jp\0naklo.pl\0"
+"ac.ci\0chimkent.su\0"
+"reserve-online.net\0"
+"aerobatic.aero\0naustdal.no\0"
+"ac.cn\0"
+"moskenes.no\0"
+"ac.cr\0ct.it\0"
+"*.kawasaki.jp\0seihi.nagasaki.jp\0"
+"stavern.no\0"
+"s3-object-lambda.us-east-1.amazonaws.com\0"
+"ac.cy\0ally\0"
+"industria.bo\0patria.bo\0"
+"trondheim.no\0"
 "friuliveneziagiulia.it\0"
-"x0.to\0"
-"tonaki.okinawa.jp\0"
-"in-dsl.org\0qa2.com\0"
-"meguro.tokyo.jp\0"
-"buzen.fukuoka.jp\0\xd8\xb9\xd8\xb1\xd8\xa8\0"
-"gotpantheon.com\0"
-"tos.it\0"
-"cn-northwest-1.eb.amazonaws.com.cn\0"
-"verdal.no\0servebeer.com\0"
-"s3-eu-west-2.amazonaws.com\0"
-"avellino.it\0"
-"dc.us\0"
-"cityeats\0asso.eu.org\0ktistory.com\0"
-"reggiocalabria.it\0"
-"inder\xc3\xb8y.no\0"
-"uda.nara.jp\0"
-"balat.no\0"
-"cc.as.us\0"
-"kyotango.kyoto.jp\0"
-"ostroleka.pl\0"
-"audio\0barsy.site\0"
-"choyo.kumamoto.jp\0"
-"lilly\0"
-"gs.nt.no\0"
-"bindal.no\0"
-"police.uk\0shoes\0"
-"wodzislaw.pl\0"
-"sigdal.no\0stada\0"
-"hisayama.fukuoka.jp\0"
-"webhop.me\0"
-"malselv.no\0"
-"foz.br\0platform0.app\0"
-"ikano\0"
-"gx.cn\0laquila.it\0"
-"ravendb.me\0"
-"in.ngrok.io\0"
-"ikeda.osaka.jp\0williamhill\0"
-"skaun.no\0"
-"wakayama.jp\0"
-"nl.no\0sn\xc3\xa5""ase.no\0"
-"komono.mie.jp\0"
-"live\0"
-"perso.ht\0"
-"is-an-engineer.com\0"
-"2ix.at\0"
-"wielun.pl\0"
-"seat\0"
-"avoues.fr\0"
-"chintai\0"
-"ak.us\0"
-"jotelulu.cloud\0"
-"uk.primetel.cloud\0"
-"halsa.no\0"
-"takaishi.osaka.jp\0masuda.shimane.jp\0bar2.net\0"
-"\xc3\xa5mli.no\0"
-"gd.cn\0shiraoka.saitama.jp\0""2ix.ch\0"
-"\xe0\xb8\xad\xe0\xb8\x87\xe0\xb8\x84\xe0\xb9\x8c\xe0\xb8\x81\xe0\xb8\xa3.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
-"austevoll.no\0servequake.com\0"
-"aju.br\0"
-"act.edu.au\0ltd.cy\0"
-"munakata.fukuoka.jp\0"
-"redstone\0ventures\0"
-"mishima.fukushima.jp\0"
-"masaki.ehime.jp\0swidnik.pl\0"
-"\xc3\xa1k\xc5\x8boluokta.no\0isa-geek.com\0""2ix.de\0"
-"zagan.pl\0"
-"phx.enscaled.us\0"
-"barsy.shop\0"
-"h\xc3\xa1mm\xc3\xa1rfeasta.no\0jp.kg\0"
-"cipriani\0*.owo.codes\0"
-"r.bg\0mock.pstmn.io\0"
-"framercanvas.com\0lon.wafaicloud.com\0"
-"taki.mie.jp\0"
-"iwate.jp\0"
-"plo.ps\0is-uberleet.com\0"
-"assur.bj\0"
-"nagasaki.jp\0"
-"seek\0vm.bytemark.co.uk\0"
-"r\xc3\xa6lingen.no\0vegas\0barrell-of-knowledge.info\0"
-"flekkefjord.no\0\xc3\xb8ygarden.no\0"
-"\xe0\xaa\xad\xe0\xaa\xbe\xe0\xaa\xb0\xe0\xaa\xa4\0"
-"reviews\0"
-"novara.it\0mond.jp\0jp.md\0"
-"community-pro.net\0"
-"ltd.gi\0"
-"jor.br\0"
-"webview-assets.aws-cloud9.ap-east-1.amazonaws.com\0"
-"otama.fukushima.jp\0oe.yamagata.jp\0"
-"notteroy.no\0"
-"kamioka.akita.jp\0"
-"stat.no\0"
-"vall\xc3\xa9""edaoste.it\0"
-"free.hr\0"
-"bhz.br\0"
-"kongsvinger.no\0valer.ostfold.no\0ltd.hk\0"
-"wolomin.pl\0"
-"komatsu.ishikawa.jp\0memset.net\0"
-"nishigo.fukushima.jp\0kuokgroup\0"
-"boutique\0s3.dualstack.us-east-1.amazonaws.com\0"
-"balsan.it\0"
-"galsa.no\0"
-"honjyo.akita.jp\0"
-"k12.tn.us\0lib.sd.us\0leclerc\0"
-"uki.kumamoto.jp\0starachowice.pl\0"
-"k12.co.us\0lib.as.us\0diskstation.me\0"
-"oishida.yamagata.jp\0ruhr\0activetrail.biz\0deca.jp\0"
-"shichikashuku.miyagi.jp\0"
-"podzone.net\0"
-"naroy.no\0tunes\0servebbs.com\0"
-"endofinternet.net\0gdansk.pl\0"
-"toyota.yamaguchi.jp\0"
-"sa.au\0diskstation.eu\0"
-"nahari.kochi.jp\0nanbu.tottori.jp\0"
-"loginto.me\0"
-"001www.com\0"
-"shiki.saitama.jp\0"
-"utazu.kagawa.jp\0"
-"science\0"
-"centralus.azurestaticapps.net\0"
-"sakae.chiba.jp\0daknong.vn\0"
-"barsy.info\0"
-"trentinos-tirol.it\0date.hokkaido.jp\0mukawa.hokkaido.jp\0"
-"6.bg\0"
-"bihar.in\0citadel\0"
-"yokoze.saitama.jp\0"
-"lillehammer.no\0"
-"kariwa.niigata.jp\0observer\0"
-"agency\0\xe5\x9c\xa8\xe7\xba\xbf\0"
-"flor\xc3\xb8.no\0"
-"monzaedellabrianza.it\0hakone.kanagawa.jp\0"
-"from-mo.com\0nyaa.am\0"
-"ltd.lk\0ferrero\0"
-"sa.cr\0szczecin.pl\0bplaced.net\0"
-"accountants\0"
-"*.frusky.de\0"
-"kropyvnytskyi.ua\0"
-"mihama.mie.jp\0"
-"s3.dualstack.ca-central-1.amazonaws.com\0servehalflife.com\0"
-"goto.nagasaki.jp\0boomla.net\0"
-"vfs.cloud9.us-east-2.amazonaws.com\0"
-"e4.cz\0"
-"gjerdrum.no\0webview-assets.aws-cloud9.eu-south-1.amazonaws.com\0is-a-cpa.com\0"
-"mutsu.aomori.jp\0tadotsu.kagawa.jp\0"
-"wafflecell.com\0"
-"easypanel.host\0"
-"simplesite.com\0"
-"ilawa.pl\0"
-"naturbruksgymn.se\0"
-"londrina.br\0konan.shiga.jp\0oops.jp\0"
-"shop.brendly.rs\0"
-"usa.oita.jp\0"
-"is-very-sweet.org\0"
-"rakkestad.no\0"
-"\xe5\xa8\xb1\xe4\xb9\x90\0"
-"ltd.ng\0"
-"nore-og-uvdal.no\0"
-"loisirs.bj\0"
-"rotorcraft.aero\0"
-"pors\xc3\xa1\xc5\x8bgu.no\0rovno.ua\0\xce\xb5\xce\xbb\0eu.ngrok.io\0"
-"kikuchi.kumamoto.jp\0"
-"trogstad.no\0mcpe.me\0"
-"sasaguri.fukuoka.jp\0"
-"ikeda.fukui.jp\0"
-"\xd0\xbe\xd0\xb4.\xd1\x81\xd1\x80\xd0\xb1\0\xe9\x80\x9a\xe8\xb2\xa9\0zapto.org\0"
-"\xce\xb5\xcf\x85\0s3-us-west-1.amazonaws.com\0"
-"tsuruoka.yamagata.jp\0oshima.yamaguchi.jp\0"
-"avocat.fr\0"
+"kaszuby.pl\0"
+"edu.ac\0"
+"loisirs.bj\0kishiwada.osaka.jp\0"
+"edu.af\0io.vn\0"
+"data\0""123hjemmeside.no\0"
+"odate.akita.jp\0upper.jp\0"
+"emrappui-prod.ap-southeast-2.amazonaws.com\0br.com\0"
+"date\0"
+"edu.al\0"
+"edu.ba\0gjerstad.no\0potager.org\0"
+"edu.ar\0edu.bb\0"
+"dr.na\0"
+"dentist\0"
+"edu.au\0www.ro\0"
+"ia.us\0s3-accesspoint.eu-central-1.amazonaws.com\0"
+"edu.bh\0terni.it\0"
+"edu.bi\0drammen.no\0"
+"edu.az\0edu.bj\0ac.fj\0"
+"bo.it\0kamisunagawa.hokkaido.jp\0"
+"edu.bm\0"
+"edu.bn\0"
+"edu.bo\0oya.to\0"
+"s3.dualstack.us-west-2.amazonaws.com\0"
+"edu.br\0"
+"edu.bs\0"
+"edu.bt\0ikeda.osaka.jp\0"
+"\xe6\x95\x99\xe8\x82\xb2.\xe9\xa6\x99\xe6\xb8\xaf\0"
+"vads\xc3\xb8.no\0"
+"zachpomor.pl\0"
+"edu.ci\0"
+"edu.bz\0"
+"cbg.ru\0"
+"misasa.tottori.jp\0"
+"edu.cn\0ac.gn\0"
+"edu.co\0lasalle\0"
+"trapani.it\0ogata.akita.jp\0bentre.vn\0"
+"verbania.it\0kashiwazaki.niigata.jp\0"
+"studio.af-south-1.sagemaker.aws\0"
+"beta.tailscale.net\0"
+"edu.cu\0"
+"edu.cv\0"
+"edu.cw\0\xd0\xb1\xd0\xb5\xd0\xbb\0studio.us-east-2.sagemaker.aws\0"
+"aq.it\0ba.it\0"
+"philips\0s3.sa-east-1.amazonaws.com\0"
+"edu.dm\0kongsberg.no\0campaign.gov.uk\0"
+"saotome.st\0"
+"edu.do\0notteroy.no\0"
+"habikino.osaka.jp\0"
+"joyo.kyoto.jp\0fly.dev\0pcloud.host\0"
+"edu.ec\0stjordal.no\0vfs.cloud9.eu-west-1.amazonaws.com\0"
+"ac.id\0"
+"edu.ee\0*.vultrobjects.com\0"
+"naoshima.kagawa.jp\0"
+"edu.eg\0"
+"vanylven.no\0drr.ac\0"
+"edu.dz\0"
+"authgearapps.com\0"
+"ac.il\0"
+"ac.im\0l\xc3\xb8""dingen.no\0"
+"ac.in\0"
+"at.eu.org\0"
+"6g.in\0"
+"ac.ir\0minamiminowa.nagano.jp\0"
+"edu.es\0selfip.org\0myqnapcloud.com\0"
+"edu.et\0map.fastlylb.net\0"
+"ltd.cy\0edu.fm\0"
+"ac.jp\0wuoz.gov.pl\0"
+"eid.no\0pages.wiardweb.com\0"
+"starostwo.gov.pl\0"
+"edu.gd\0"
+"edu.ge\0ac.ke\0"
+"canva-apps.com\0"
+"edu.gh\0hanamigawa.chiba.jp\0"
+"trading.aero\0edu.gi\0emrappui-prod.ap-northeast-3.amazonaws.com\0"
+"auth.us-west-1.amazoncognito.com\0"
+"edu.gl\0ohtawara.tochigi.jp\0"
+"enterprises\0"
+"edu.gn\0gmina.pl\0"
+"s3.us-east-1.amazonaws.com\0myspreadshop.com\0"
+"edu.gp\0"
+"trade\0"
+"edu.gr\0ac.kr\0"
+"feira.br\0edu.gt\0"
+"edu.gu\0shouji\0"
+"onflashdrive.app\0"
+"vacations\0schulserver.de\0"
+"edu.gy\0photos\0"
+"edu.hk\0ac.lk\0"
+"lecce.it\0wloclawek.pl\0from.tv\0"
+"edu.hn\0"
+"kashiwara.osaka.jp\0tjmaxx\0"
+"ac.ma\0"
+"ac.ls\0n\xc3\xa5\xc3\xa5mesjevuemie.no\0"
+"edu.ht\0dr.tr\0"
+"ac.me\0s3-website.eu-central-2.amazonaws.com\0"
+"museum.tt\0"
+"amex\0free.hr\0"
+"troandin.no\0stada\0ooguy.com\0"
+"is-found.org\0"
+"ltd.gi\0karmoy.no\0s3-fips.dualstack.us-west-2.amazonaws.com\0"
+"edu.in\0"
+"auth.eu-west-3.amazoncognito.com\0"
+"edu.iq\0"
+"edu.is\0"
+"edu.it\0"
+"ac.mu\0s3-accesspoint-fips.us-west-1.amazonaws.com\0"
+"ac.mw\0"
+"mitaka.tokyo.jp\0stalowa-wola.pl\0"
+"ac.ni\0s3-eu-central-1.amazonaws.com\0"
+"ac.mz\0"
+"notebook.us-east-1.sagemaker.aws\0"
+"eu-west-3.elasticbeanstalk.com\0"
+"kurashiki.okayama.jp\0velvet.jp\0"
+"edu.jo\0ltd.hk\0"
+"est-le-patron.com\0"
+"notogawa.shiga.jp\0"
+"123hjemmeside.dk\0"
+"webview-assets.cloud9.ap-northeast-2.amazonaws.com\0"
+"edu.kg\0"
+"edu.ki\0"
+"ac.nz\0faith\0"
+"kasumigaura.ibaraki.jp\0otoyo.kochi.jp\0"
+"edu.km\0fetsund.no\0"
+"furukawa.miyagi.jp\0bungotakada.oita.jp\0edu.kn\0"
+"edu.kp\0"
+"edu.la\0lind\xc3\xa5s.no\0ac.pa\0ct.us\0"
+"edu.lb\0"
+"edu.lc\0cc.sd.us\0"
+"opoczno.pl\0\xe1\x83\x92\xe1\x83\x94\0"
+"edu.kw\0"
+"edu.ky\0"
+"edu.kz\0lebork.pl\0online.th\0"
+"edu.lk\0"
+"ogawa.saitama.jp\0"
+"s3-website.ap-southeast-3.amazonaws.com\0"
+"edu.lr\0ac.pr\0"
+"edu.ls\0*.ap-northeast-2.airflow.amazonaws.com\0"
+"shinto.gunma.jp\0"
+"edu.me\0nordreisa.no\0"
+"edu.lv\0"
+"edu.mg\0nordre-land.no\0"
+"gyeonggi.kr\0"
+"edu.ly\0s3-accesspoint.dualstack.ap-east-1.amazonaws.com\0"
+"sdscloud.pl\0"
+"edu.mk\0"
+"edu.ml\0author\0"
+"fastvps.site\0\xd0\xbc\xd0\xb8\xd1\x80.\xd1\x80\xd1\x83\xd1\x81\0"
+"edu.mn\0eastus2.azurestaticapps.net\0"
+"edu.mo\0gs.ol.no\0"
+"training\0"
+"edu.ms\0voss.no\0"
+"edu.mt\0green\0"
+"edu.mv\0"
+"edu.mw\0edu.ng\0u2.xnbay.com\0"
+"edu.mx\0"
+"edu.my\0edu.ni\0"
+"edu.mz\0"
+"arakawa.saitama.jp\0adobeaemcloud.net\0"
+"productions\0"
+"*.yokohama.jp\0atl.jelastic.vps-host.net\0"
+"ltd.lk\0notebook.eu-north-1.sagemaker.aws\0"
+"log.br\0"
+"dnsalias.org\0"
+"edu.nr\0"
+"ac.rs\0degree\0"
+"ac.se\0ac.ru\0pagexl.com\0myshopify.com\0"
+"ac.rw\0rocky.page\0"
+"kahoku.yamagata.jp\0"
+"edu.om\0place\0"
+"es-1.axarnet.cloud\0"
+"fylkesbibl.no\0"
+"ariake.saga.jp\0"
+"edu.pa\0*.platformsh.site\0"
+"caxias.br\0"
+"s\xc3\xb8gne.no\0"
+"semboku.akita.jp\0"
+"edu.pe\0"
+"edu.pf\0pages.torproject.net\0"
+"sakaiminato.tottori.jp\0edu.ph\0ac.th\0"
+"ac.sz\0ac.tj\0kuron.jp\0"
+"edu.pk\0ltd.ng\0"
+"iheya.okinawa.jp\0wajiki.tokushima.jp\0edu.pl\0"
+"edu.pn\0phuyen.vn\0now-dns.net\0ts.net\0"
+"edu.qa\0"
+"edu.pr\0"
+"edu.ps\0"
+"edu.pt\0"
 "mihara.hiroshima.jp\0"
-"ohira.miyagi.jp\0onporter.run\0"
-"k12.ak.us\0"
-"kitahiroshima.hokkaido.jp\0"
-"hornindal.no\0"
-"\xe5\xb1\xb1\xe5\x8f\xa3.jp\0\xe8\x81\x94\xe9\x80\x9a\0"
-"te.it\0omotego.fukushima.jp\0ota.tokyo.jp\0"
-"det.br\0ch.it\0yugawara.kanagawa.jp\0sakawa.kochi.jp\0"
-"to.leg.br\0"
-"independent-inquest.uk\0"
-"a.prod.fastly.net\0usercontent.jp\0"
-"gos.pk\0"
-"ro.eu.org\0"
-"yenbai.vn\0"
-"hol.no\0m\xc3\xa5lselv.no\0iki.fi\0impertrixcdn.com\0"
-"safety.aero\0"
-"okinawa.jp\0nishio.aichi.jp\0olawa.pl\0"
-"gs.va.no\0commbank\0"
-"webview-assets.aws-cloud9.ca-central-1.amazonaws.com\0"
-"nu.ca\0samsung\0"
-"il.us\0"
-"lib.mt.us\0lib.nd.us\0today\0dnsfor.me\0"
-"akrehamn.no\0is-a-anarchist.com\0"
-"\xd1\x83\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0"
-"pecori.jp\0senseering.net\0"
-"cc.wy.us\0virtualserver.io\0"
-"sa.it\0"
-"tcp4.me\0"
-"at.it\0"
-"is-a-cubicle-slave.com\0"
-"works\0"
-"world\0"
-"sp.gov.br\0\xd8\xa7\xd8\xb1\xd8\xa7\xd9\x85\xd9\x83\xd9\x88\0"
-"is-into-cars.com\0"
-"lenvik.no\0"
-"gs.tm.no\0"
-"mochizuki.nagano.jp\0"
-"rsc.cdn77.org\0us-4.evennode.com\0"
-"isa.us\0"
-"tozsde.hu\0"
-"hdfc\0encoreapi.com\0ownprovider.com\0"
-"kosai.shizuoka.jp\0"
-"\xd7\x99\xd7\xa9\xd7\xa8\xd7\x90\xd7\x9c\0"
-"ltd.ua\0"
-"inawashiro.fukushima.jp\0shinjo.nara.jp\0perso.sn\0"
-"si.eu.org\0""1kapp.com\0"
-"matsue.shimane.jp\0lincoln\0"
-"ltd.uk\0dnsalias.com\0"
-"jeju.kr\0"
-"langevag.no\0"
-"vda.it\0medio-campidano.it\0kuriyama.hokkaido.jp\0kusu.oita.jp\0club\0"
-"bloomberg\0"
-"at.md\0"
-"oslo.no\0"
-"perspecta.cloud\0"
-"nannestad.no\0n\xc3\xb8tter\xc3\xb8y.no\0"
-"perso.tn\0"
-"r.se\0"
-"pisa.it\0"
-"leikanger.no\0lea\xc5\x8bgaviika.no\0lebtimnetz.de\0ee.eu.org\0"
-"kiho.mie.jp\0"
-"siracusa.it\0"
-"heroy.nordland.no\0pictures\0cyon.link\0"
-"stj\xc3\xb8rdalshalsen.no\0showtime\0"
-"so.gov.pl\0"
-"cc.va.us\0from-wa.com\0"
-"pi.it\0"
-"independent-panel.uk\0"
-"legal\0"
-"yamada.iwate.jp\0pomorskie.pl\0"
-"\xc3\xb8rskog.no\0srht.site\0"
-"ishigaki.okinawa.jp\0"
-"tachikawa.tokyo.jp\0"
-"shinshiro.aichi.jp\0"
-"gs.ah.no\0us-3.evennode.com\0"
-"kurgan.su\0"
-"chikuho.fukuoka.jp\0otsuchi.iwate.jp\0"
-"nord-aurdal.no\0"
-"wpmudev.host\0"
-"\xc3\xa5krehamn.no\0"
-"oy.lc\0"
-"beagleboard.io\0"
-"nu.it\0kamikoani.akita.jp\0mihama.wakayama.jp\0prod\0"
-"onred.one\0"
-"prof\0"
-"sk.eu.org\0"
-"aknoluokta.no\0"
-"drammen.no\0webredirect.org\0"
-"kartuzy.pl\0in-dsl.net\0"
-"ujitawara.kyoto.jp\0buyshop.jp\0"
-"yamada.fukuoka.jp\0"
-"*.kitakyushu.jp\0kawanabe.kagoshima.jp\0"
-"sexy\0"
-"raholt.no\0sande.more-og-romsdal.no\0is-a-bulls-fan.com\0"
-"cog.mi.us\0"
-"wios.gov.pl\0"
-"lib.id.us\0ch.tc\0"
-"chikuzen.fukuoka.jp\0"
-"na.it\0isa-geek.net\0"
-"reservd.com\0"
-"te.ua\0"
-"suldal.no\0ui.nabu.casa\0"
-"bd.se\0"
-"forl\xc3\xac""cesena.it\0"
-"us-2.evennode.com\0"
-"os.hedmark.no\0"
-"nakaniikawa.toyama.jp\0"
-"thanhphohochiminh.vn\0"
-"at-band-camp.net\0"
-"kunohe.iwate.jp\0"
-"stcgroup\0"
-"potager.org\0dyndns.info\0"
-"shibuya.tokyo.jp\0"
-"webview-assets.aws-cloud9.us-west-2.amazonaws.com\0"
-"yn.cn\0"
-"amsterdam\0ru.eu.org\0se.eu.org\0"
-"here-for-more.info\0"
-"for-more.biz\0"
-"rag-cloud.hosteur.com\0"
-"x.mythic-beasts.com\0"
-"\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xae\0"
-"mazury.pl\0"
-"\xe5\x98\x89\xe9\x87\x8c\0"
-"jpn.com\0"
-"flight.aero\0"
-"gushikami.okinawa.jp\0"
-"black\0lynx.mythic-beasts.com\0"
-"joboji.iwate.jp\0"
-"lib.wa.us\0fage\0"
-"trentino-sudtirol.it\0asahikawa.hokkaido.jp\0"
-"otsuki.yamanashi.jp\0"
-"at.vg\0"
-"de.com\0drayddns.com\0"
-"tomisato.chiba.jp\0"
-"mein-iserv.de\0"
-"xj.cn\0"
-"langev\xc3\xa5g.no\0grimstad.no\0"
-"urayasu.chiba.jp\0"
-"ocelot.mythic-beasts.com\0"
-"tonsberg.no\0"
-"4lima.de\0"
-"kvits\xc3\xb8y.no\0us-1.evennode.com\0"
-"ogi.saga.jp\0"
-"jetzt\0"
-"kawakita.ishikawa.jp\0"
-"*.diher.solutions\0mazeplay.com\0"
-"joinville.br\0val-daosta.it\0"
-"yoichi.hokkaido.jp\0nagatoro.saitama.jp\0ryokami.saitama.jp\0"
-"sr.gov.pl\0"
-"is-gone.com\0"
-"jab.br\0vivian.jp\0"
-"nokia\0dyndns-web.com\0"
-"tokoname.aichi.jp\0"
-"okegawa.saitama.jp\0fail\0"
-"ruovat.no\0"
-"unzen.nagasaki.jp\0london\0"
-"chuo.osaka.jp\0solar\0weather\0"
-"salat.no\0"
-"fi.cr\0trentino-s-tirol.it\0"
-"4lima.at\0"
-"pixolino.com\0dev-myqnapcloud.com\0"
-"kalisz.pl\0"
-"fr\xc3\xa6na.no\0iservschule.de\0"
-"uonuma.niigata.jp\0"
-"kita.osaka.jp\0"
-"girlfriend.jp\0"
-"g.bg\0k12.wi.us\0"
-"dienbien.vn\0"
-"lib.ct.us\0"
-"4lima.ch\0"
-"storebase.store\0"
-"is-a-doctor.com\0"
-"kiwa.mie.jp\0"
-"hirado.nagasaki.jp\0nachikatsuura.wakayama.jp\0"
-"bajddar.no\0"
-"kami.kochi.jp\0"
-"\xe7\xa7\x8b\xe7\x94\xb0.jp\0"
-"tromsa.no\0vaga.no\0*.otap.co\0"
-"piedmont.it\0"
-"b.ssl.fastly.net\0"
-"edgestack.me\0"
-"murakami.niigata.jp\0schoolbus.jp\0"
-"sandvikcoromant\0flop.jp\0"
-"\xe6\x9b\xb8\xe7\xb1\x8d\0nsupdate.info\0"
-"jls-sto3.elastx.net\0"
-"andebu.no\0"
-"vfs.cloud9.ap-south-1.amazonaws.com\0"
-"friuli-veneziagiulia.it\0tmall\0"
-"b\xc3\xb8.nordland.no\0"
-"guge\0"
-"cc.me.us\0stufftoread.com\0"
-"cq.cn\0"
-"kanra.gunma.jp\0forte.id\0"
-"agr.br\0"
-"qld.edu.au\0"
-"*.devcdnaccesso.com\0podzone.org\0"
-"aosta-valley.it\0"
-"wiki.bo\0fans\0glass\0"
-"snasa.no\0js.org\0"
-"wiki.br\0namikata.ehime.jp\0ug.gov.pl\0khplay.nl\0"
-"mup.gov.pl\0"
-"skien.no\0zara\0"
-"sanok.pl\0"
-"vv.it\0kinghost.net\0"
-"cc.la.us\0"
-"fi.it\0tajiri.osaka.jp\0"
-"capital\0readymade.jp\0"
-"tomiya.miyagi.jp\0\xd9\xbe\xd8\xa7\xda\xa9\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0"
-"messina.it\0"
-"molde.no\0cn.eu.org\0fedorainfracloud.org\0"
-"med.pro\0internet-dns.de\0"
-"webview-assets.cloud9.ap-southeast-2.amazonaws.com\0"
-"namdinh.vn\0"
-"joetsu.niigata.jp\0jobs.tt\0upaas.kazteleport.kz\0"
-"dazaifu.fukuoka.jp\0aya.miyazaki.jp\0"
-"haugesund.no\0gr.com\0"
-"toride.ibaraki.jp\0"
-"independent-inquiry.uk\0""1337.pictures\0"
-"kuki.saitama.jp\0"
-"higashisumiyoshi.osaka.jp\0sakura.ne.jp\0"
-"aparecida.br\0vb.it\0"
-"s3-ap-south-1.amazonaws.com\0"
-"niigata.jp\0\xe9\x95\xb7\xe9\x87\x8e.jp\0onagawa.miyagi.jp\0"
-"family\0"
-"sanda.hyogo.jp\0"
-"farm\0rocky.page\0"
-"weber\0"
-"vfs.cloud9.eu-north-1.amazonaws.com\0"
-"manaus.br\0"
-"global\0"
-"hattfjelldal.no\0"
-"chambagri.fr\0uwajima.ehime.jp\0hungyen.vn\0help\0"
-"tsunan.niigata.jp\0"
-"haiduong.vn\0fast\0"
-"kvinnherad.no\0"
-"tank.jp\0"
-"bingo\0"
-"tn.it\0fukuoka.jp\0nagi.okayama.jp\0"
-"shiiba.miyazaki.jp\0"
-"abkhazia.su\0"
-"leirfjord.no\0"
-"niteroi.br\0sano.tochigi.jp\0"
+"ac.ug\0services\0"
+"edu.py\0"
+"ac.tz\0"
+"ac.uk\0"
+"other.nf\0"
+"hiranai.aomori.jp\0"
+"s3-website.us-gov-west-1.amazonaws.com\0"
+"webcam\0*.eu-west-2.airflow.amazonaws.com\0"
+"raindrop.jp\0"
+"ubank\0"
+"cagliari.it\0museum.mv\0"
+"museum.mw\0"
+"nayoro.hokkaido.jp\0"
+"yokohama\0"
+"z.bg\0fi.cloudplatform.fi\0"
+"ac.vn\0"
+"museum.no\0edu.sa\0"
+"hachirogata.akita.jp\0edu.sb\0"
+"edu.rs\0edu.sc\0"
+"edu.sd\0"
+"tokyo\0edu.ru\0"
 "tobetsu.hokkaido.jp\0"
-"tjome.no\0\xd0\xb0\xd0\xba.\xd1\x81\xd1\x80\xd0\xb1\0"
-"imperia.it\0obama.fukui.jp\0"
-"*.compute.amazonaws.com\0"
-"\xe5\x81\xa5\xe5\xba\xb7\0ghost.io\0"
-"kasaoka.okayama.jp\0\xe5\x95\x86\xe5\x9f\x8e\0"
-"on.ca\0"
-"myspreadshop.net\0"
-"*.statics.cloud\0"
-"g\xc3\xbcnstigbestellen.de\0"
-"lom.it\0kuchinotsu.nagasaki.jp\0"
-"jan-mayen.no\0"
-"cc.gu.us\0"
-"ome.tokyo.jp\0"
-"chernigov.ua\0cy.eu.org\0"
-"creditunion\0vps-host.net\0"
-"akdn\0"
-"susono.shizuoka.jp\0tourism.tn\0for-some.biz\0"
-"endofinternet.org\0"
-"*.cryptonomic.net\0"
-"feste-ip.net\0"
-"skodje.no\0"
-"ven.it\0"
-"user.aseinet.ne.jp\0"
-"togliatti.su\0onrender.com\0"
-"airkitapps.com\0"
-"ia.us\0"
-"rishiri.hokkaido.jp\0keliweb.cloud\0"
-"skjak.no\0lib.ma.us\0"
-"pruszkow.pl\0"
-"discordsays.com\0"
-"ai.in\0"
-"tysv\xc3\xa6r.no\0"
-"cc.ga.us\0cz.eu.org\0"
-"yasaka.nagano.jp\0snowflake.app\0"
-"bokn.no\0"
-"here\0mozilla-iot.org\0"
-"ca-central-1.elasticbeanstalk.com\0"
-"nishi.osaka.jp\0"
-"onthewifi.com\0"
-"ninhbinh.vn\0"
-"h\xc3\xb8ylandet.no\0"
-"matsuyama.ehime.jp\0"
-"to.gov.br\0"
-"beardu.no\0"
-"express\0"
-"bulsan.it\0"
-"gs.bu.no\0"
-"gosen.niigata.jp\0"
-"guru\0"
-"yashio.saitama.jp\0ostrowiec.pl\0"
-"k12.ne.us\0"
-"whm.fr-par.scw.cloud\0"
-"cat.ax\0"
-"vipsinaapp.com\0"
-"fujimi.saitama.jp\0"
-"wif.gov.pl\0"
-"dk.eu.org\0"
-"ecn.br\0pr.it\0yokoshibahikari.chiba.jp\0myspreadshop.nl\0"
-"mycloud.by\0"
-"politie\0myspreadshop.no\0"
-"\xe7\xbd\x91\xe7\xbb\x9c\0"
-"lom.no\0"
-"agrigento.it\0"
-"loginline.dev\0"
-"skj\xc3\xa5k.no\0altervista.org\0"
-"shaw\0"
-"bari.it\0moseushi.hokkaido.jp\0mitoyo.kagawa.jp\0"
-"nordeste-idc.saveincloud.net\0"
-"kurogi.fukuoka.jp\0minato.osaka.jp\0"
-"froya.no\0horse\0from-oh.com\0"
-"showa.fukushima.jp\0"
-"sarpsborg.no\0g.se\0sekd1.beebyteapp.io\0"
-"k12.mi.us\0"
-"h\xc3\xa1pmir.no\0"
-"nord-odal.no\0"
-"fst.br\0tsurugi.ishikawa.jp\0chips.jp\0"
-"myspreadshop.pl\0"
-"apple\0smile\0"
-"yasuoka.nagano.jp\0"
-"firmdale\0"
-"kunneppu.hokkaido.jp\0health.nz\0"
-"cloudns.asia\0pages.it.hs-heilbronn.de\0"
-"office-on-the.net\0"
-"ciao.jp\0"
-"suifu.ibaraki.jp\0"
-"appchizi.com\0"
-"abr.it\0minakami.gunma.jp\0"
-"myspreadshop.it\0"
-"erni\0servesarcasm.com\0"
-"rikuzentakata.iwate.jp\0"
-"arts.co\0"
-"aogashima.tokyo.jp\0"
-"de.eu.org\0loginline.services\0"
-"wloclawek.pl\0"
-"ddnsfree.com\0"
-"serveblog.net\0"
-"lardal.no\0is-a-patsfan.org\0"
-"rj.leg.br\0"
-"directory\0"
-"kamisu.ibaraki.jp\0"
-"katori.chiba.jp\0"
-"divtasvuodna.no\0"
-"degree\0eu.meteorapp.com\0"
+"belau.pw\0edu.sg\0"
+"s.bg\0"
+"edu.sl\0"
+"edu.sn\0"
+"museum.om\0edu.so\0s3-website.me-south-1.amazonaws.com\0"
+"yamazoe.nara.jp\0"
+"edu.ss\0"
+"mobi.gp\0\xe4\xba\xac\xe9\x83\xbd.jp\0edu.st\0"
+"bir.ru\0"
+"edu.sv\0"
+"naamesjevuemie.no\0"
+"l.bg\0edu.sy\0emrstudio-prod.us-gov-east-1.amazonaws.com\0"
+"edu.tj\0"
+"rodoy.no\0edu.tm\0"
+"shonai.yamagata.jp\0"
+"edu.to\0from-ma.com\0"
+"edu.ua\0"
+"muroto.kochi.jp\0edu.tr\0sblo.jp\0"
+"allstate\0"
+"name.hr\0saitama.jp\0edu.tt\0fr-par-2.baremetal.scw.cloud\0"
+"minakami.gunma.jp\0saku.nagano.jp\0"
+"e.bg\0edu.tw\0"
+"karumai.iwate.jp\0weber\0"
+"m\xc3\xa5lselv.no\0skygearapp.com\0"
+"crimea.ua\0"
+"takahashi.okayama.jp\0"
+"s3-website.dualstack.ap-northeast-1.amazonaws.com\0"
+"bykle.no\0"
+"usr.cloud.muni.cz\0"
+"ac.za\0"
 "creditcard\0"
-"mima.tokushima.jp\0"
-"hareid.no\0"
-"umig.gov.pl\0"
-"unusualperson.com\0"
-"empresa.bo\0tn.us\0kyoto\0selfip.info\0"
-"df.leg.br\0"
-"busan.kr\0"
-"aseral.no\0narvik.no\0grocery\0"
-"semboku.akita.jp\0yokosuka.kanagawa.jp\0nishihara.okinawa.jp\0"
-"lolitapunk.jp\0"
-"aircraft.aero\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd9\x87\0"
-"flora.no\0"
-"online.th\0"
-"gv.ao\0travelers\0"
-"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86.ir\0"
-"o0o0.jp\0"
-"gv.at\0lecce.it\0dynu.net\0"
-"vinnica.ua\0"
-"shop.ht\0sekikawa.niigata.jp\0"
-"shop.hu\0"
-"engineer\0"
-"\xed\x95\x9c\xea\xb5\xad\0shia\0"
-"mus.br\0"
-"co.krd\0"
-"rindal.no\0"
-"sauherad.no\0"
-"phuyen.vn\0"
-"mihama.chiba.jp\0"
-"mydrobo.com\0"
-"tourism.pl\0"
-"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd8\xa9\0"
-"mediocampidano.it\0"
-"design.aero\0"
-"riopreto.br\0cs.keliweb.cloud\0"
-"ternopil.ua\0"
-"kr.it\0"
-"devices.resinstaging.io\0"
-"123kotisivu.fi\0"
-"bmd.br\0hazu.aichi.jp\0"
-"vinhphuc.vn\0unicloud.pl\0"
-"hinode.tokyo.jp\0exposed\0"
-"narviika.no\0"
-"emiliaromagna.it\0"
-"carrd.co\0"
+"edu.vc\0"
+"edu.ve\0"
+"name.et\0hannan.osaka.jp\0unazuki.toyama.jp\0"
+"kvalsund.no\0tysv\xc3\xa6r.no\0barsy.co.uk\0"
+"edu.uy\0"
+"radom.pl\0"
+"name.fj\0chijiwa.nagasaki.jp\0"
+"ac.zm\0"
+"maibara.shiga.jp\0edu.vn\0from-co.net\0"
+"emrnotebooks-prod.eu-west-2.amazonaws.com\0"
+"*.statics.cloud\0"
+"council.aero\0tiaa\0"
+"takazaki.miyazaki.jp\0"
+"emrappui-prod.ap-southeast-3.amazonaws.com\0"
+"adachi.tokyo.jp\0verisign\0half.host\0"
+"gen.mi.us\0edu.vu\0ltd.ua\0"
+"ac.zw\0"
+"gliding.aero\0cc.mi.us\0"
+"flier.jp\0"
+"emrstudio-prod.eu-central-1.amazonaws.com\0"
+"ternopil.ua\0ltd.uk\0au.eu.org\0be.eu.org\0"
+"\xe6\x95\x8e\xe8\x82\xb2.hk\0kvafjord.no\0"
+"aizumisato.fukushima.jp\0tomiya.miyagi.jp\0"
+"edu.ws\0execute-api.ap-northeast-1.amazonaws.com\0emrstudio-prod.us-east-2.amazonaws.com\0"
+"meguro.tokyo.jp\0"
+"os.hordaland.no\0no-ip.co.uk\0"
+"kawanishi.yamagata.jp\0"
+"publ.pt\0"
+"cooking\0"
+"gunma.jp\0ipifony.net\0"
+"folldal.no\0"
+"indie.porn\0"
+"website\0"
+"edu.ye\0"
+"odo.br\0"
+"name.eg\0s3-website.us-gov-east-1.amazonaws.com\0"
+"smart\0"
+"sakai.osaka.jp\0"
+"\xe6\x96\xb0\xe5\x8a\xa0\xe5\x9d\xa1\0"
+"house\0"
+"edu.za\0dclk\0"
+"taishin.fukushima.jp\0"
+"blogspot.com.cy\0"
+"bergen.no\0"
+"nuoro.it\0yasuda.kochi.jp\0broker\0"
+"yakumo.shimane.jp\0"
+"fst.br\0shimoichi.nara.jp\0stripper.jp\0"
+"sokndal.no\0"
+"name.az\0"
+"edu.zm\0"
+"chiba.jp\0ba.leg.br\0"
+"blogspot.com.ee\0"
+"blogspot.com.eg\0"
+"skoczow.pl\0"
+"id.forgerock.io\0"
+"oto.fukuoka.jp\0"
+"co.network\0adimo.co.uk\0"
+"czest.pl\0"
+"passenger-association.aero\0"
+"asakawa.fukushima.jp\0"
+"4.bg\0"
+"minobu.yamanashi.jp\0pinoko.jp\0"
+"blogspot.com.ar\0"
+"tienda\0"
+"gs.hl.no\0bg.eu.org\0blogspot.com.au\0"
+"oke.gov.pl\0thaibinh.vn\0"
+"theworkpc.com\0"
+"quangngai.vn\0"
+"midori.chiba.jp\0"
+"raholt.no\0framer.wiki\0"
+"s3-website.pl-waw.scw.cloud\0"
+"exnet.su\0"
+"fido\0"
+"map.fastly.net\0blogspot.com.br\0"
+"koshimizu.hokkaido.jp\0hinode.tokyo.jp\0"
+"yoita.niigata.jp\0primetel.cloud\0dsmynas.net\0"
+"blogspot.com.by\0"
+"fvg.it\0"
+"samnanger.no\0blogspot.com.co\0"
+"trentinosued-tirol.it\0ainan.ehime.jp\0"
+"okinawa\0"
+"belem.br\0catanzaro.it\0\xd9\x81\xd9\x84\xd8\xb3\xd8\xb7\xd9\x8a\xd9\x86\0"
+"deatnu.no\0"
+"asso.fr\0"
+"\xe8\x87\xba\xe7\x81\xa3\0"
+"barletta-trani-andria.it\0nakanoto.ishikawa.jp\0"
+"0e.vc\0"
+"ic.gov.pl\0babyblue.jp\0"
+"bel.tr\0\xe0\xac\xad\xe0\xac\xbe\xe0\xac\xb0\xe0\xac\xa4\0"
+"oppeg\xc3\xa5rd.no\0"
+"dyn-o-saur.com\0"
+"asso.gp\0"
+"\xce\xb5\xce\xbb\0from-pa.com\0"
+"shimane.jp\0higashitsuno.kochi.jp\0"
+"rdv.to\0"
+"blogspot.com.es\0"
+"cya.gg\0"
+"nowruz\0b.ssl.fastly.net\0"
+"vestv\xc3\xa5g\xc3\xb8y.no\0"
+"\xd0\xb4\xd0\xb5\xd1\x82\xd0\xb8\0lovepop.jp\0"
+"\xce\xb5\xcf\x85\0partners\0"
+"ozora.hokkaido.jp\0ota.tokyo.jp\0"
+"modum.no\0notebook.us-east-2.sagemaker.aws\0github.io\0"
+"higashiyoshino.nara.jp\0"
+"vfs.cloud9.us-west-2.amazonaws.com\0stackhero-network.com\0"
+"asso.ht\0noda.chiba.jp\0"
+"audnedaln.no\0"
+"vindafjord.no\0"
+"lib.wy.us\0"
+"fuchu.toyama.jp\0"
+"kddi\0"
+"sor-varanger.no\0"
+"aizumi.tokushima.jp\0"
+"padua.it\0chigasaki.kanagawa.jp\0"
+"gamvik.no\0"
+"iwakura.aichi.jp\0"
+"s3-accesspoint.dualstack.ap-southeast-3.amazonaws.com\0"
+"takahama.aichi.jp\0"
+"hr.eu.org\0"
+"cc.gu.us\0\xd0\xba\xd1\x80\xd1\x8b\xd0\xbc.\xd1\x80\xd1\x83\xd1\x81\0"
+"takayama.nagano.jp\0wake.okayama.jp\0"
+"muos\xc3\xa1t.no\0"
+"numazu.shizuoka.jp\0"
+"jls-sto2.elastx.net\0"
+"baseball\0"
+"is-a-conservative.com\0"
+"asso.ci\0"
+"am.leg.br\0"
+"pesarourbino.it\0"
+"xy.ax\0"
+"s3.dualstack.sa-east-1.amazonaws.com\0ap-south-1.elasticbeanstalk.com\0"
+"loginline.app\0"
+"kikuchi.kumamoto.jp\0tatsuno.nagano.jp\0"
+"tec.br\0"
+"z.se\0barsy.menu\0"
+"minami-alps.yamanashi.jp\0lapy.pl\0"
+"misato.akita.jp\0"
+"lillehammer.no\0t\xc3\xb8nsberg.no\0httpbin.org\0"
+"yatsushiro.kumamoto.jp\0schwarz\0"
+"s.se\0film\0"
+"vpnplus.to\0"
+"capital\0"
+"asso.dz\0"
+"nesoddtangen.no\0ap-southeast-3.elasticbeanstalk.com\0"
+"bar1.net\0"
+"zaporizhzhia.ua\0"
+"us-west-2.elasticbeanstalk.com\0"
+"marugame.kagawa.jp\0"
+"tobe.ehime.jp\0kosher\0"
+"l.se\0mini\0is-a-hard-worker.com\0"
+"olbia-tempio.it\0"
+"hoyanger.no\0hughes\0"
+"esan.hokkaido.jp\0"
+"mock.pstmn.io\0"
+"mint\0"
+"e.se\0"
+"parliament.nz\0"
+"gran.no\0svelvik.no\0"
+"date.fukushima.jp\0"
+"dnsup.net\0"
+"egersund.no\0"
+"shintomi.miyazaki.jp\0"
+"\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x91\0"
+"skjerv\xc3\xb8y.no\0lib.tx.us\0"
+"name.vn\0"
+"s3-object-lambda.ap-northeast-2.amazonaws.com\0"
+"chihayaakasaka.osaka.jp\0"
+"tips\0"
+"okawa.fukuoka.jp\0moonscale.net\0"
+"futurehosting.at\0"
+"kainan.tokushima.jp\0"
+"media.hu\0flesberg.no\0"
+"shiftcrypto.io\0"
+"blogspot.com.mt\0"
+"ip6.arpa\0"
+"blogspot.com.ng\0"
+"aca.pro\0"
+"emrnotebooks-prod.ap-southeast-3.amazonaws.com\0lohmus.me\0"
+"oppdal.no\0"
+"hob\xc3\xb8l.no\0"
+"latina.it\0"
+"seki.gifu.jp\0name.tj\0"
+"ap.leg.br\0"
+"magazine.aero\0schulplattform.de\0"
+"kunimi.fukushima.jp\0shiroishi.miyagi.jp\0fujikawaguchiko.yamanashi.jp\0"
+"plumbing\0"
+"es.gov.br\0kozagawa.wakayama.jp\0"
+"mangyshlak.su\0sakuratan.com\0"
+"name.tr\0"
+"wmflabs.org\0"
+"name.tt\0"
+"s3-fips.us-east-2.amazonaws.com\0"
+"mobi.tt\0"
+"sandnessjoen.no\0gjovik.no\0"
+"olecko.pl\0girlfriend.jp\0lubartow.pl\0"
+"mircloud.host\0"
+"emrstudio-prod.eu-west-2.amazonaws.com\0"
+"suedtirol.it\0mobi.tz\0"
+"webview-assets.cloud9.ap-east-1.amazonaws.com\0vfs.cloud9.ap-northeast-3.amazonaws.com\0freeddns.us\0"
+"fire\0"
+"vegarshei.no\0daplie.me\0members.linode.com\0"
+"gjesdal.no\0"
+"sells-it.net\0"
+"lib.sd.us\0"
+"horonobe.hokkaido.jp\0"
+"otama.fukushima.jp\0"
+"asahi.ibaraki.jp\0misaki.okayama.jp\0kakegawa.shizuoka.jp\0dental\0blogspot.com.tr\0gov.scot\0"
+"info.gu\0cc.co.us\0asso.eu.org\0"
+"higashiura.aichi.jp\0"
+"hzc.io\0"
+"trentinos-tirol.it\0"
+"chikuma.nagano.jp\0"
+"sa-east-1.elasticbeanstalk.com\0eurodir.ru\0"
+"chikuho.fukuoka.jp\0fish\0"
+"statebank\0"
+"hitachiomiya.ibaraki.jp\0"
+"strand.no\0"
+"webview-assets.aws-cloud9.eu-central-1.amazonaws.com\0"
+"pvh.br\0"
+"presse.km\0airkitapps-au.com\0"
+"info.ht\0"
+"info.hu\0"
+"stj\xc3\xb8rdalshalsen.no\0"
 "email\0"
-"rhcloud.com\0"
-"nishiawakura.okayama.jp\0"
-"taxi.br\0"
+"black\0webview-assets.aws-cloud9.us-east-1.amazonaws.com\0"
+"report\0"
+"info.in\0yokoshibahikari.chiba.jp\0yakumo.hokkaido.jp\0kiho.mie.jp\0"
+"softbank\0servesarcasm.com\0"
+"cc.ca.us\0"
+"info.et\0chikugo.fukuoka.jp\0nishigo.fukushima.jp\0"
+"read\0"
+"name.pm\0"
+"kaas.gg\0"
+"info.fj\0urbinopesaro.it\0kalisz.pl\0"
+"name.qa\0"
+"name.pr\0"
+"platterp.us\0"
+"otake.hiroshima.jp\0"
+"cc.az.us\0"
+"dep.no\0encoreapi.com\0"
+"presse.ml\0"
+"evenassi.no\0s3-accesspoint.ap-northeast-2.amazonaws.com\0"
+"n\xc3\xa1vuotna.no\0brussels\0"
+"yamato.kanagawa.jp\0"
+"\xe5\xb1\xb1\xe5\x8f\xa3.jp\0mods.jp\0"
+"monash\0"
+"name.na\0kautokeino.no\0"
+"kamisu.ibaraki.jp\0uzs.gov.pl\0"
+"jogasz.hu\0mobi.na\0cc.as.us\0us.eu.org\0"
+"selfip.biz\0"
+"auth-fips.us-east-1.amazoncognito.com\0emrnotebooks-prod.af-south-1.amazonaws.com\0dyndns-mail.com\0"
+"ise.mie.jp\0name.mv\0"
+"name.ng\0s3-accesspoint.dualstack.me-south-1.amazonaws.com\0from-ar.com\0"
+"fuefuki.yamanashi.jp\0"
+"a\xc3\xa9roport.ci\0name.my\0mobi.ng\0kyiv.ua\0"
+"k12.co.us\0"
+"keisen.fukuoka.jp\0info.cx\0"
+"act.au\0auth.ap-south-1.amazoncognito.com\0webview-assets.aws-cloud9.eu-west-1.amazonaws.com\0golffan.us\0"
+"media.pl\0deal\0"
+"cc.al.us\0"
+"valle-aosta.it\0vv.it\0"
+"bieszczady.pl\0langson.vn\0"
+"dopaas.com\0"
+"ma.gov.br\0"
+"rivne.ua\0emrnotebooks-prod.me-central-1.amazonaws.com\0"
+"2-d.jp\0"
+"info.ec\0\xc3\xa1k\xc5\x8boluokta.no\0"
+"aosta-valley.it\0satte.saitama.jp\0"
+"sn.cn\0trentino-suedtirol.it\0"
+"s\xc3\xb8r-varanger.no\0"
+"dev-myqnapcloud.com\0"
+"blogspot.com.uy\0diskstation.org\0"
+"123website.nl\0"
+"rotorcraft.aero\0dyndns.org\0"
+"s3-website.dualstack.ap-southeast-1.amazonaws.com\0"
+"l\xc3\xb8renskog.no\0"
+"info.bb\0"
+"k12.ca.us\0"
+"info.at\0"
+"info.au\0"
+"\xe0\xa8\xad\xe0\xa8\xbe\xe0\xa8\xb0\xe0\xa8\xa4\0"
+"karaganda.su\0"
+"info.az\0info.bj\0"
+"aurskog-holand.no\0s3-ap-southeast-2.amazonaws.com\0"
+"mup.gov.pl\0"
+"alstahaug.no\0"
+"info.bo\0\xd5\xb0\xd5\xa1\xd5\xb5\0\xd9\x82\xd8\xb7\xd8\xb1\0from-wv.com\0"
+"g12.br\0erimo.hokkaido.jp\0"
+"bomlo.no\0asso.re\0"
+"market\0"
+"name.mk\0"
+"va.it\0prochowice.pl\0"
+"h\xc3\xa1mm\xc3\xa1rfeasta.no\0"
+"kijo.miyazaki.jp\0shimane.shimane.jp\0pruszkow.pl\0"
+"kumano.hiroshima.jp\0okaya.nagano.jp\0"
+"info.co\0"
+"hiraizumi.iwate.jp\0goodyear\0"
+"fie.ee\0\xc3\xb8rsta.no\0"
+"123website.lu\0"
+"streamlit.app\0"
+"kr\xc3\xb8""dsherad.no\0"
+"name.jo\0s3.me-south-1.amazonaws.com\0"
+"takanabe.miyazaki.jp\0anquan\0"
+"chippubetsu.hokkaido.jp\0kilo.jp\0"
+"idv.hk\0synology.me\0"
+"tuscany.it\0"
+"mobi.ke\0"
+"ts.it\0"
+"arao.kumamoto.jp\0mail.pl\0"
+"lib.ms.us\0lib.nc.us\0"
+"community\0rocks\0service.gov.uk\0"
+"studio.cn-north-1.sagemaker.com.cn\0"
+"dyndns-blog.com\0"
+"football\0"
+"vote\0"
+"pro.typeform.com\0"
+"lib.nh.us\0arkhangelsk.su\0"
+"now-dns.org\0"
+"slg.br\0\xe4\xba\x9a\xe9\xa9\xac\xe9\x80\x8a\0"
+"ogano.saitama.jp\0"
+"voto\0"
+"te.it\0"
+"asso.nc\0"
+"s3-object-lambda.cn-northwest-1.amazonaws.com.cn\0"
+"takasu.hokkaido.jp\0hiratsuka.kanagawa.jp\0"
+"pri.ee\0"
+"ichinoseki.iwate.jp\0"
+"lib.ma.us\0s3-website.dualstack.us-west-2.amazonaws.com\0dyndns-wiki.com\0"
+"reit\0"
+"il.eu.org\0"
+"naturbruksgymn.se\0myfirewall.org\0"
+"dojin.com\0"
+"higashishirakawa.gifu.jp\0hita.oita.jp\0arai.shizuoka.jp\0"
+"izunokuni.shizuoka.jp\0host\0"
+"kiev.ua\0"
+"kasuga.hyogo.jp\0ravendb.run\0"
+"va.no\0"
+"mediocampidano.it\0"
+"tec.ve\0prequalifyme.today\0"
+"isa-geek.org\0ddnsgeek.com\0"
+"honefoss.no\0framercanvas.com\0"
+"ribeirao.br\0open\0"
+"frontier\0"
+"reliance\0"
+"\xe5\x9c\xa8\xe7\xba\xbf\0tuleap-partners.com\0"
+"nishimera.miyazaki.jp\0stcgroup\0"
+"homedns.org\0"
+"jls-sto1.elastx.net\0"
+"s\xc3\xa1l\xc3\xa1t.no\0"
+"s3.dualstack.ap-southeast-3.amazonaws.com\0"
+"hu.eu.org\0ie.eu.org\0"
+"money.bj\0ono.fukui.jp\0mito.ibaraki.jp\0oow.gov.pl\0"
+"consulting\0"
+"takahama.fukui.jp\0"
+"storage\0"
+"kvits\xc3\xb8y.no\0"
+"nx.cn\0"
+"tadotsu.kagawa.jp\0"
+"ri.it\0furudono.fukushima.jp\0matsumae.hokkaido.jp\0"
+"profesional.bo\0kommune.no\0leikanger.no\0"
+"gwangju.kr\0hashbang.sh\0"
+"freesite.host\0"
+"us-4.evennode.com\0"
+"\xe5\xa8\xb1\xe4\xb9\x90\0"
+"execute-api.us-west-1.amazonaws.com\0"
+"toyooka.hyogo.jp\0cloudns.club\0"
+"appspacehosted.com\0"
+"tsushima.aichi.jp\0ugim.gov.pl\0"
+"aeroclub.aero\0"
+"omura.nagasaki.jp\0kirara.st\0"
+"appspaceusercontent.com\0"
+"dell\0ngrok.app\0"
+"bolivia.bo\0clinic\0\xec\x82\xbc\xec\x84\xb1\0"
+"hobol.no\0"
+"poa.br\0"
+"bo.nordland.no\0"
+"snaase.no\0s3-accesspoint.dualstack.us-gov-east-1.amazonaws.com\0"
+"rent\0"
+"val-daosta.it\0"
+"asso.km\0"
+"kiyosato.hokkaido.jp\0"
+"altoadige.it\0"
+"dgca.aero\0mortgage\0"
+"pt.it\0"
+"selfip.com\0"
+"oga.akita.jp\0kusu.oita.jp\0"
+"s3.ap-southeast-2.amazonaws.com\0dyndns-free.com\0""123website.be\0"
+"esashi.hokkaido.jp\0czeladz.pl\0"
+"fosnes.no\0"
+"itigo.jp\0"
+"jcloud.ik-server.com\0"
+"tsukumi.oita.jp\0"
+"asso.mc\0is-a-geek.com\0"
+"hiho.jp\0"
+"stream\0"
+"info.ve\0"
+"circle\0co.com\0virtual-user.de\0"
+"deta.app\0""123website.ch\0"
+"s3.dualstack.eu-west-3.amazonaws.com\0"
+"koori.fukushima.jp\0kembuchi.hokkaido.jp\0info.vn\0"
+"ulvik.no\0us-3.evennode.com\0"
+"yamanashi.yamanashi.jp\0"
+"va.us\0"
+"ln.cn\0"
+"consultant.aero\0money\0istmein.de\0"
+"s3.cn-northwest-1.amazonaws.com.cn\0"
+"rodeo\0"
+"nerdpol.ovh\0"
+"xs4all.space\0"
+"hirado.nagasaki.jp\0"
+"beats\0"
+"tomari.hokkaido.jp\0"
+"delta\0blogsite.org\0"
+"ven.it\0genova.it\0chita.aichi.jp\0"
+"is-a-liberal.com\0"
+"nichinan.tottori.jp\0"
+"balsan.it\0"
+"vinnica.ua\0"
+"tychy.pl\0"
+"hidaka.hokkaido.jp\0mormon\0"
+"drud.io\0"
+"info.tn\0fem.jp\0"
+"abo.pa\0lib.il.us\0apartments\0s3.dualstack.us-east-2.amazonaws.com\0"
+"info.tr\0binhphuoc.vn\0"
+"sakuragawa.ibaraki.jp\0kagoshima.kagoshima.jp\0info.tt\0"
+"qc.com\0"
+"rest\0"
+"idv.tw\0"
+"info.tz\0"
+"te.ua\0traeumtgerade.de\0"
+"lib.gu.us\0scrapping.cc\0"
+"calvinklein\0"
+"vikna.no\0s3-object-lambda.us-east-2.amazonaws.com\0"
+"ishigaki.okinawa.jp\0"
+"yokoze.saitama.jp\0"
+"dyndns-at-home.com\0"
+"trentinosud-tirol.it\0saga.jp\0"
+"desi\0webview-assets.cloud9.eu-west-2.amazonaws.com\0bryansk.su\0"
+"mango\0"
+"\xe7\x86\x8a\xe6\x9c\xac.jp\0lomza.pl\0"
+"it.ao\0"
+"aki.kochi.jp\0ube.yamaguchi.jp\0"
+"barsy.mobi\0"
+"k8s.nl-ams.scw.cloud\0"
+"info.ro\0us-2.evennode.com\0"
+"hadsel.no\0masoy.no\0nordkapp.no\0"
+"ms.it\0kaizuka.osaka.jp\0"
+"info.sd\0"
+"nodes.k8s.pl-waw.scw.cloud\0"
+"\xe9\xa6\x99\xe6\xb8\xaf\0gr.eu.org\0ybo.party\0"
+"*.cns.joyent.com\0"
+"mitane.akita.jp\0hitachi.ibaraki.jp\0"
+"ullensvang.no\0"
+"fet.no\0"
 "bearalv\xc3\xa1hki.no\0"
-"tourism.bj\0health.vn\0"
-"from-id.com\0"
-"nishinoomote.kagoshima.jp\0pulawy.pl\0"
-"\xc3\xb8stre-toten.no\0"
-"shimonita.gunma.jp\0"
-"sue.fukuoka.jp\0hanoi.vn\0"
-"eng.br\0"
-"holtalen.no\0leka.no\0"
-"ai.vn\0"
-"gangaviika.no\0"
-"dynamic-dns.info\0"
-"hachioji.tokyo.jp\0hino.tokyo.jp\0"
-"is-an-entertainer.com\0"
-"feira.br\0hu.net\0"
-"sk\xc3\xa1nit.no\0"
-"tamaki.mie.jp\0"
-"lpages.co\0"
-"askvoll.no\0bo.nordland.no\0bryansk.su\0"
-"umb.it\0"
-"appspot.com\0"
-"kyotamba.kyoto.jp\0"
-"conn.uk\0"
-"trento.it\0k8s.pl-waw.scw.cloud\0"
-"pr.us\0ca.eu.org\0"
-"p.bg\0s\xc3\xb8rum.no\0lib.tn.us\0"
-"namerikawa.toyama.jp\0"
-"lesja.no\0"
-"yamatotakada.nara.jp\0"
-"lerdal.no\0\xe5\x98\x89\xe9\x87\x8c\xe5\xa4\xa7\xe9\x85\x92\xe5\xba\x97\0"
-"ancona.it\0verm\xc3\xb6gensberater\0"
-"tahara.aichi.jp\0aguni.okinawa.jp\0"
-"myspreadshop.se\0"
-"trapani.it\0uk.reclaim.cloud\0"
-"vaksdal.no\0"
-"kaho.fukuoka.jp\0"
-"rs.webaccel.jp\0"
-"is-an-accountant.com\0"
-"otofuke.hokkaido.jp\0higashiyoshino.nara.jp\0"
-"is-an-actor.com\0yali.mythic-beasts.com\0"
-"biella.it\0"
-"otoyo.kochi.jp\0cool\0"
-"ogliastra.it\0honbetsu.hokkaido.jp\0"
-"coop\0"
-"arts.ve\0webview-assets.cloud9.us-east-2.amazonaws.com\0"
-"kyonan.chiba.jp\0shop\0"
-"lib.ca.us\0readthedocs.io\0"
-"capoo.jp\0"
-"valle-d-aosta.it\0"
-"hyatt\0"
-"show\0work\0"
-"tw.cn\0bolzano.it\0tayninh.vn\0"
-"cc.mn.us\0"
-"wellbeingzone.co.uk\0"
-"*.oci.customer-oci.com\0"
-"agano.niigata.jp\0"
-"kui.hiroshima.jp\0"
-"itabashi.tokyo.jp\0"
-"kl\xc3\xa6""bu.no\0"
-"streamlitapp.com\0"
-"\xe5\x8f\xb0\xe6\xb9\xbe\0"
-"static.observableusercontent.com\0"
-"kushimoto.wakayama.jp\0uk.net\0"
-"union.aero\0analytics-gateway.us-west-2.amazonaws.com\0"
-"tc.br\0sonla.vn\0"
+"yandex\0"
+"ski.no\0xfinity\0s3-accesspoint.dualstack.eu-south-2.amazonaws.com\0"
+"awsglobalaccelerator.com\0"
+"me.in\0daejeon.kr\0chu.jp\0"
+"seg.br\0warmia.pl\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\0"
+"info.pk\0"
+"ome.tokyo.jp\0info.pl\0"
+"s3-accesspoint.ap-northeast-3.amazonaws.com\0from-ak.com\0"
+"lu.it\0me.it\0"
+"presse.ci\0emrstudio-prod.ap-south-1.amazonaws.com\0"
+"ms.kr\0"
+"vossevangen.no\0servegame.org\0"
+"kuchinotsu.nagasaki.jp\0info.pr\0"
+"nakagawa.hokkaido.jp\0suzu.ishikawa.jp\0daklak.vn\0orx.biz\0"
+"\xc3\xa5mot.no\0radio\0"
+"fnc.fr-par.scw.cloud\0"
+"cf-ipfs.com\0"
+"eu.meteorapp.com\0"
+"suldal.no\0isa-geek.com\0"
+"nishikata.tochigi.jp\0"
+"me.ke\0"
+"piemonte.it\0tuyenquang.vn\0"
+"info.na\0"
+"ri.us\0"
+"info.mv\0info.nf\0"
+"is-a-republican.com\0"
+"info.ni\0stjordalshalsen.no\0"
+"kwp.gov.pl\0"
+"romsa.no\0"
+"iki.nagasaki.jp\0"
+"s3-website.us-west-1.amazonaws.com\0us-1.evennode.com\0paas.massivegrid.com\0"
+"cherkasy.ua\0"
+"info.nr\0"
+"\xd9\x85\xd9\x88\xd8\xb1\xd9\x8a\xd8\xaa\xd8\xa7\xd9\x86\xd9\x8a\xd8\xa7\0"
+"lg.jp\0"
+"kanna.gunma.jp\0"
+"software.aero\0kozow.com\0site.transip.me\0"
+"securitytactics.com\0"
+"enf.br\0trentino-alto-adige.it\0"
+"apps.lair.io\0"
+"info.la\0randaberg.no\0baby\0tools\0wphostedmail.com\0"
+"gx.cn\0vao.it\0dscloud.biz\0"
+"plc.co.im\0\xe9\xa3\x9f\xe5\x93\x81\0"
+"*.us-east-1.airflow.amazonaws.com\0"
+"s3-website.dualstack.sa-east-1.amazonaws.com\0vladikavkaz.ru\0"
+"webhosting.be\0is-a-geek.org\0"
+"websozai.jp\0"
+"atsuma.hokkaido.jp\0tsushima.nagasaki.jp\0"
+"kppsp.gov.pl\0"
+"ha.cn\0"
+"emrappui-prod.ap-northeast-2.amazonaws.com\0s3-accesspoint.dualstack.ap-south-2.amazonaws.com\0serveirc.com\0"
+"nikaho.akita.jp\0"
+"info.ls\0ftpaccess.cc\0"
+"mjondalen.no\0s3.us-east-2.amazonaws.com\0vladikavkaz.su\0"
+"shimogo.fukushima.jp\0"
+"gs.svalbard.no\0rag-cloud-ch.hosteur.com\0"
+"kadoma.osaka.jp\0"
+"postman-echo.com\0"
+"urbino-pesaro.it\0"
+"gc.ca\0andasuolo.no\0"
+"page\0"
+"harima.hyogo.jp\0"
+"osoyro.no\0est-mon-blogueur.com\0"
+"j\xc3\xb8lster.no\0"
+"togura.nagano.jp\0"
+"discordsez.com\0impertrixcdn.com\0"
+"hichiso.gifu.jp\0but.jp\0"
+"\xe5\x98\x89\xe9\x87\x8c\0"
+"government.aero\0"
+"tokigawa.saitama.jp\0"
+"mints.ne.jp\0eu.ax\0"
+"hamar.no\0"
+"info.ke\0s3-fips.dualstack.us-west-1.amazonaws.com\0"
+"*.sendai.jp\0homeip.net\0"
+"info.ki\0"
+"akkeshi.hokkaido.jp\0bitter.jp\0"
+"im.it\0ito.shizuoka.jp\0"
+"kropyvnytskyi.ua\0"
+"fujimino.saitama.jp\0"
+"cisco\0"
+"oh.us\0"
+"munakata.fukuoka.jp\0pgafan.net\0"
+"\xc3\xa1lt\xc3\xa1.no\0s3.us-gov-west-1.amazonaws.com\0is-a-bookkeeper.com\0"
+"moo.jp\0"
+"davvesiida.no\0"
+"gujarat.in\0"
+"mg.gov.br\0dellogliastra.it\0oishida.yamagata.jp\0"
+"dielddanuorri.no\0drud.us\0"
+"upow.gov.pl\0"
+"ora.gunma.jp\0"
+"padova.it\0dabur\0"
+"s3-website.sa-east-1.amazonaws.com\0"
+"port.fr\0"
+"supabase.net\0"
+"notebook.me-central-1.sagemaker.aws\0"
+"kunneppu.hokkaido.jp\0sanagochi.tokushima.jp\0nc.tr\0"
+"s3-website-us-east-1.amazonaws.com\0"
 "nj.us\0"
+"s3-website.ap-northeast-1.amazonaws.com\0s3-website.ap-southeast-4.amazonaws.com\0"
+"guardian\0"
+"hasura.app\0"
+"me.so\0s3-fips.us-west-1.amazonaws.com\0"
+"rzeszow.pl\0dienbien.vn\0"
+"vennesla.no\0"
+"anamizu.ishikawa.jp\0"
+"tananger.no\0me.ss\0me.tc\0"
+"ms.us\0nc.us\0s3-fips.ca-central-1.amazonaws.com\0"
+"nanjo.okinawa.jp\0"
+"*.us-west-2.airflow.amazonaws.com\0"
+"kasuga.fukuoka.jp\0"
+"is-a-candidate.org\0"
+"niikappu.hokkaido.jp\0"
+"mc.eu.org\0"
+"higashi.fukushima.jp\0"
+"berg.no\0"
+"me.tz\0"
+"me.uk\0wang\0"
+"is-gone.com\0"
+"takayama.gifu.jp\0ibara.okayama.jp\0"
+"dnshome.de\0"
+"\xe6\xa0\x83\xe6\x9c\xa8.jp\0"
+"me.us\0"
+"sasebo.nagasaki.jp\0"
+"on-aptible.com\0"
+"kumano.mie.jp\0iwatsuki.saitama.jp\0ngrok.dev\0"
+"s3-accesspoint.us-east-1.amazonaws.com\0"
+"hanawa.fukushima.jp\0"
+"namsskogan.no\0"
+"is-an-actress.com\0"
+"s3.cn-north-1.amazonaws.com.cn\0"
+"lg.ua\0"
+"matsukawa.nagano.jp\0"
+"4.azurestaticapps.net\0"
+"umb.it\0"
+"cahcesuolo.no\0aaa\0lt.eu.org\0"
+"me.vu\0"
+"s3-accesspoint.dualstack.ap-northeast-3.amazonaws.com\0"
+"trentins\xc3\xbc""d-tirol.it\0vps-host.net\0"
+"vfs.cloud9.ap-southeast-1.amazonaws.com\0"
+"onthewifi.com\0"
+"isshiki.aichi.jp\0yamashina.kyoto.jp\0"
+"ru.com\0"
+"yamato.fukushima.jp\0band\0"
+"friulivenezia-giulia.it\0fe.it\0abb\0"
+"abc\0s3.ap-southeast-3.amazonaws.com\0"
+"shichikashuku.miyagi.jp\0"
+"s3-website.dualstack.us-west-1.amazonaws.com\0forgot.his.name\0"
+"bedzin.pl\0"
+"tr\xc3\xb8gstad.no\0bank\0"
+"isahaya.nagasaki.jp\0"
+"volyn.ua\0"
+"tourism.tn\0flir\0"
+"management\0"
+"pordenone.it\0ninhthuan.vn\0cocotte.jp\0"
+"barsy.info\0"
+"en.it\0takino.hyogo.jp\0"
+"s3-object-lambda.us-gov-east-1.amazonaws.com\0"
+"duckdns.org\0"
+"sardinia.it\0otofuke.hokkaido.jp\0"
+"ha.no\0pgfog.com\0"
+"dh.bytemark.co.uk\0"
+"jelenia-gora.pl\0"
+"ce.leg.br\0"
+"mobile\0"
+"aco\0"
+"takarazuka.hyogo.jp\0omaezaki.shizuoka.jp\0"
+"amakusa.kumamoto.jp\0"
+"cologne\0"
+"mombetsu.hokkaido.jp\0"
+"\xd9\x83\xd9\x88\xd9\x85\0"
+"meland.no\0appspot.com\0"
+"spjelkavik.no\0"
+"sakae.chiba.jp\0minamioguni.kumamoto.jp\0arab\0""123siteweb.fr\0"
+"airkitapps.eu\0"
+"akita.akita.jp\0"
+"lorenskog.no\0"
+"kuki.saitama.jp\0flynnhosting.net\0"
+"ads\0pars\0g\xc3\xbcnstigbestellen.de\0paas.beebyte.io\0"
+"boy.jp\0jellybean.jp\0"
+"ah.cn\0"
+"aeg\0"
+"click\0network\0"
+"kagami.kochi.jp\0morotsuka.miyazaki.jp\0"
+"hirogawa.wakayama.jp\0"
+"netlify.app\0"
+"router.management\0"
+"ichihara.chiba.jp\0"
+"miyakonojo.miyazaki.jp\0"
+"kiengiang.vn\0"
+"cr.it\0"
+"gov.ac\0"
+"appudo.net\0"
+"gov.ae\0webview-assets.aws-cloud9.ap-southeast-2.amazonaws.com\0"
+"gov.af\0\xda\x80\xd8\xa7\xd8\xb1\xd8\xaa\0afl\0"
+"eigersund.no\0if.ua\0bingo\0s3-accesspoint.dualstack.eu-north-1.amazonaws.com\0"
+"tur.ar\0katashina.gunma.jp\0"
+"gov.al\0"
+"erotica.hu\0"
+"soo.kagoshima.jp\0\xd8\xa7\xd9\x84\xd9\x8a\xd9\x85\xd9\x86\0poznan.pl\0"
+"webview-assets.cloud9.eu-west-3.amazonaws.com\0woltlab-demo.com\0"
+"gov.ba\0"
+"gov.ar\0gov.bb\0"
+"gov.as\0rad\xc3\xb8y.no\0"
+"nakasatsunai.hokkaido.jp\0ami.ibaraki.jp\0osakasayama.osaka.jp\0store.nf\0"
+"gov.au\0"
+"gov.bf\0"
+"gov.bh\0tur.br\0"
+"emrstudio-prod.ap-southeast-3.amazonaws.com\0"
+"gov.az\0"
+"cc.wv.us\0"
+"gov.bm\0tula.su\0"
+"gov.bn\0bt.it\0"
+"from-ne.com\0herokuapp.com\0"
+"cesena-forli.it\0omiya.saitama.jp\0chowder.jp\0"
+"kvinesdal.no\0"
+"gov.br\0"
+"gov.bs\0"
+"gov.bt\0gov.cd\0isesaki.gunma.jp\0\xe6\x8b\x9b\xe8\x81\x98\0"
+"remotewd.com\0"
+"kisofukushima.nagano.jp\0"
 "ashiya.fukuoka.jp\0"
-"moareke.no\0k12.de.us\0"
-"clinic\0"
-"notodden.no\0"
-"avocats.bj\0fr.it\0"
-"roan.no\0"
-"alta.no\0lv.ua\0\xe6\x94\xbf\xe5\x8a\xa1\0"
-"nishikawa.yamagata.jp\0"
-"gsm.pl\0rocher\0"
-"dyn-vpn.de\0"
-"platterp.us\0"
-"cd.eu.org\0"
-"nishiarita.saga.jp\0"
-"akita.jp\0"
-"cocotte.jp\0reserve-online.net\0"
-"4.bg\0dielddanuorri.no\0"
-"es-1.axarnet.cloud\0"
-"arts.ro\0"
-"seiro.niigata.jp\0daito.osaka.jp\0"
-"webview-assets.aws-cloud9.me-south-1.amazonaws.com\0"
-"en.it\0"
-"vacations\0"
-"akabira.hokkaido.jp\0"
-"sex.hu\0kr.ua\0loginline.site\0"
-"my-firewall.org\0"
-"oyamazaki.kyoto.jp\0takayama.nagano.jp\0akaiwa.okayama.jp\0"
-"is-very-evil.org\0"
-"muni.il\0saloon.jp\0"
-"vibo-valentia.it\0bounceme.net\0"
-"hirono.fukushima.jp\0"
-"redumbrella\0"
-"ikeda.hokkaido.jp\0"
-"tr\xc3\xa6na.no\0"
-"development.run\0"
-"folldal.no\0"
-"desa.id\0karuizawa.nagano.jp\0"
-"upper.jp\0rr.leg.br\0"
-"iyo.ehime.jp\0"
-"likescandy.com\0"
-"ally\0"
-"koto.shiga.jp\0"
-"*.magentosite.cloud\0"
-"lipsy\0"
-"cz.it\0isla.pr\0"
-"\xe5\xa4\xa7\xe9\x98\xaa.jp\0"
-"\xc3\xa5seral.no\0"
-"cuiaba.br\0weblike.jp\0"
-"oyodo.nara.jp\0"
-"\xe7\xb6\xb2\xe7\xb5\xa1.\xe9\xa6\x99\xe6\xb8\xaf\0"
-"nose.osaka.jp\0"
-"aerodrome.aero\0holiday\0"
-"hokuto.hokkaido.jp\0"
-"arts.nf\0marriott\0"
-"consulting.aero\0"
-"nirasaki.yamanashi.jp\0"
+"gov.by\0s3-object-lambda.us-gov-west-1.amazonaws.com\0studio.il-central-1.sagemaker.aws\0"
+"gov.bz\0"
+"gov.cl\0"
+"gov.cm\0"
+"gov.cn\0"
+"gov.co\0"
+"aig\0gripe\0notebook.us-west-2.sagemaker.aws\0thingdustdata.com\0"
+"bolt.hu\0"
+"atsugi.kanagawa.jp\0"
+"gov.cu\0isa-hockeynut.com\0"
+"kunohe.iwate.jp\0mielec.pl\0banamex\0"
+"associates\0"
+"gov.cx\0nyuzen.toyama.jp\0"
+"gov.cy\0reserve-online.com\0"
+"av.it\0akune.kagoshima.jp\0"
+"info.zm\0"
+"gov.dm\0"
+"shingu.wakayama.jp\0wien.funkfeuer.at\0"
+"gov.do\0hemsedal.no\0"
+"shibetsu.hokkaido.jp\0"
+"gov.ec\0"
+"miasta.pl\0"
+"gov.ee\0s\xc3\xb8r-aurdal.no\0cc.wa.us\0"
+"wolomin.pl\0"
+"gov.eg\0ringerike.no\0auth.ca-central-1.amazoncognito.com\0"
+"ao.it\0"
+"repbody.aero\0*.dev-builder.code.com\0"
+"gov.dz\0nasu.tochigi.jp\0"
+"friuli-vgiulia.it\0"
+"bryne.no\0"
+"isa-geek.net\0"
+"gov.et\0kumagaya.saitama.jp\0"
+"vfs.cloud9.eu-north-1.amazonaws.com\0b-data.io\0"
+"gov.fj\0"
+"ecn.br\0"
 "coffee\0"
-"ferrara.it\0rs.leg.br\0sc.leg.br\0"
-"latina.it\0"
-"tsubetsu.hokkaido.jp\0"
-"energy\0oya.to\0"
-"sandnessj\xc3\xb8""en.no\0\xc3\xa5lesund.no\0"
-"nakagawa.tokushima.jp\0govt.nz\0"
-"rimini.it\0"
-"myshopify.com\0"
-"ss.it\0noda.iwate.jp\0kumejima.okinawa.jp\0"
-"webview-assets.aws-cloud9.eu-west-3.amazonaws.com\0cechire.com\0myspreadshop.es\0"
-"us.ngrok.io\0ditchyourip.com\0"
-"myspreadshop.fi\0"
-"obama.nagasaki.jp\0"
-"soccer\0"
-"nagahama.shiga.jp\0myspreadshop.fr\0"
-"clerkstage.app\0"
-"ns.ca\0"
-"livorno.it\0oke.gov.pl\0"
-"try-snowplow.com\0"
-"kakogawa.hyogo.jp\0*.database.run\0"
-"himi.toyama.jp\0"
-"lanbib.se\0ro.im\0myiphost.com\0"
-"ath.cx\0"
-"yokohama\0ddns.me\0*.stg-builder.code.com\0"
-"hida.gifu.jp\0monash\0"
-"ro.it\0ono.hyogo.jp\0"
-"ar.it\0appengine.flow.ch\0"
-"is-very-nice.org\0"
-"chikugo.fukuoka.jp\0kumagaya.saitama.jp\0"
-"\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x91\0"
-"art.br\0nisshin.aichi.jp\0"
-"getmyip.com\0*.landing.myjino.ru\0plesk.page\0"
-"moo.jp\0"
-"exnet.su\0"
-"imari.saga.jp\0"
-"shop.th\0"
-"spacekit.io\0"
-"dell-ogliastra.it\0"
-"myspreadshop.ie\0"
-"sex.pl\0"
-"brand.se\0gv.vc\0"
-"k12.oh.us\0silk\0"
-"skanit.no\0insure\0"
-"mypi.co\0"
-"mo.cn\0loan\0myspreadshop.at\0"
-"art.do\0porsanger.no\0jewelry\0s3.eu-west-3.amazonaws.com\0myspreadshop.be\0"
-"tynset.no\0"
-"nakatombetsu.hokkaido.jp\0vinhlong.vn\0"
-"drangedal.no\0msk.ru\0"
-"karpacz.pl\0"
-"trentino-alto-adige.it\0"
-"partners\0"
-"art.dz\0"
-"latino\0sina\0myspreadshop.ca\0"
-"opencraft.hosting\0"
-"yakage.okayama.jp\0rn.leg.br\0"
-"kviteseid.no\0dyndns-work.com\0"
-"\xe5\xa4\xa7\xe6\x8b\xbf\0eu-west-1.elasticbeanstalk.com\0"
-"uchinada.ishikawa.jp\0myspreadshop.ch\0"
-"msk.su\0shop.ro\0"
-"taishin.fukushima.jp\0izumo.shimane.jp\0"
-"p.se\0"
-"tele.amune.org\0"
-"pg.in\0tarumizu.kagoshima.jp\0"
-"webview-assets.cloud9.us-west-1.amazonaws.com\0"
-"esp.br\0yuza.yamagata.jp\0"
-"hzc.io\0myspreadshop.de\0"
-"pg.it\0venezia.it\0"
-"amex\0"
+"bib.br\0\xe6\x84\x9b\xe7\x9f\xa5.jp\0"
+"s3-accesspoint-fips.dualstack.us-east-1.amazonaws.com\0s3-accesspoint.dualstack.us-east-2.amazonaws.com\0"
+"deno.dev\0"
+"ong.br\0"
+"gov.gd\0kihoku.ehime.jp\0"
+"gov.ge\0app.lmpm.com\0townnews-staging.com\0"
+"grp.lk\0"
+"gov.gh\0"
+"gov.gi\0"
+"yasu.shiga.jp\0"
+"*.builder.code.com\0"
+"fl.us\0"
+"gov.gn\0miho.ibaraki.jp\0"
+"gov.gr\0wix.run\0"
+"gov.gu\0dst.mi.us\0"
+"yoshino.nara.jp\0"
+"app.banzaicloud.io\0"
+"seven\0"
+"gov.gy\0"
+"isen.kagoshima.jp\0"
+"gov.hk\0r\xc3\xb8ros.no\0"
+"5g.in\0oyama.tochigi.jp\0"
+"chillout.jp\0"
+"ehime.jp\0tourism.pl\0"
+"leka.no\0"
+"serveminecraft.net\0"
+"gov.ie\0"
+"midori.gunma.jp\0blog.gt\0"
+"k12.wa.us\0emrstudio-prod.us-west-1.amazonaws.com\0"
+"kuwana.mie.jp\0*.gateway.dev\0"
+"s3-accesspoint.eu-north-1.amazonaws.com\0s3.eu-west-2.amazonaws.com\0"
+"build\0walmart\0"
+"cc.tn.us\0mk.eu.org\0"
+"gov.il\0"
+"12hp.de\0"
+"gov.in\0"
+"xihuan\0"
+"gov.iq\0surnadal.no\0is-very-sweet.org\0"
+"gov.ir\0"
+"gov.is\0dp.ua\0store.ve\0isteingeek.de\0"
+"gov.it\0anz\0"
+"journal.aero\0k12.vt.us\0feedback\0"
+"aol\0"
+"s3-eu-west-2.amazonaws.com\0"
+"minamiashigara.kanagawa.jp\0orangecloud.tn\0"
+"storj.farm\0"
+"kyonan.chiba.jp\0"
+"kerrylogistics\0"
+"yoshioka.gunma.jp\0fujiyoshida.yamanashi.jp\0"
+"\xd9\x85\xd8\xb5\xd8\xb1\0"
+"gov.jo\0"
+"tourism.bj\0"
+"ah.no\0"
+"kamaishi.iwate.jp\0reisen\0support\0"
+"citic\0staging.onred.one\0"
+"pilot.aero\0gov.kg\0"
+"elblag.pl\0"
+"gov.ki\0"
+"kamitsue.oita.jp\0app\0"
 "fresenius\0"
-"myspreadshop.dk\0"
-"wlocl.pl\0"
-"vang.no\0"
-"bedzin.pl\0"
-"adygeya.su\0"
-"deno-staging.dev\0"
-"kuju.oita.jp\0makeup\0ro.leg.br\0"
-"minamifurano.hokkaido.jp\0shop.pl\0"
-"\xd0\xbc\xd1\x81\xd0\xba.\xd1\x80\xd1\x83\xd1\x81\0tlon.network\0"
-"taa.it\0"
-"support\0"
-"uri.arpa\0"
-"nichinan.miyazaki.jp\0"
-"americanexpress\0gucci\0shopitsite.com\0"
-"bronnoysund.no\0"
-"ostre-toten.no\0"
-"tokushima.tokushima.jp\0"
-"s3-website-ap-southeast-1.amazonaws.com\0*.s5y.io\0"
-"tsugaru.aomori.jp\0shiranuka.hokkaido.jp\0thanhhoa.vn\0pcloud.host\0"
-"home.dyndns.org\0"
-"art.ht\0"
-"babia-gora.pl\0"
-"askim.no\0mel.cloudlets.com.au\0"
-"canva-apps.cn\0"
-"immobilien\0"
-"cooperativa.bo\0divttasvuotna.no\0"
-"nobushi.jp\0"
-"sorreisa.no\0"
-"glogow.pl\0"
-"barsy.support\0"
-"adygeya.ru\0"
-"eek.jp\0"
-"lavangen.no\0""2038.io\0"
-"*.0emm.com\0"
-"anjo.aichi.jp\0"
-"*.r.appspot.com\0"
-"hanam.vn\0"
-"mo.it\0"
-"unj\xc3\xa1rga.no\0cc.az.us\0kaas.gg\0"
-"yamagata.gifu.jp\0faith\0"
-"gjesdal.no\0site.tb-hosting.com\0"
-"powiat.pl\0"
-"graphox.us\0"
-"vadso.no\0"
-"site\0"
-"calabria.it\0wajiki.tokushima.jp\0r2.dev\0zakopane.pl\0"
-"yamanakako.yamanashi.jp\0"
-"kotoura.tottori.jp\0"
-"shibata.niigata.jp\0center\0"
-"seljord.no\0"
+"12hp.at\0"
+"gov.km\0vfs.cloud9.us-west-1.amazonaws.com\0"
+"gov.kn\0"
+"aa.no\0cr.ua\0dyndns.dappnode.io\0"
+"gov.kp\0ca.reclaim.cloud\0"
+"blog.bo\0gov.la\0"
+"gov.lb\0"
+"gov.lc\0"
+"blog.br\0"
+"tjome.no\0codespot.com\0"
+"hitachiota.ibaraki.jp\0"
+"gov.kw\0"
+"kamagaya.chiba.jp\0gov.kz\0"
+"gov.lk\0"
+"minami.fukuoka.jp\0miyada.nagano.jp\0bar\0"
+"ck.ua\0bbc\0"
+"army\0"
+"12hp.ch\0"
+"gov.ma\0attorney\0from-mn.com\0"
+"torino.it\0kamisato.saitama.jp\0gov.lr\0"
+"gov.ls\0politie\0"
+"gov.lt\0"
+"gov.me\0arna.no\0\xe4\xbf\xa1\xe6\x81\xaf\0fr.eu.org\0"
+"gov.lv\0"
+"gov.mg\0"
+"gov.ly\0eu-west-1.elasticbeanstalk.com\0"
+"gov.mk\0ruovat.no\0*.advisor.ws\0lu.eu.org\0me.eu.org\0"
+"gov.ml\0deta.dev\0"
+"rost.no\0"
+"gov.mn\0art\0bbt\0base.shop\0"
+"gov.mo\0""2038.io\0"
+"beiarn.no\0bcg\0"
+"nishiokoppe.hokkaido.jp\0kanuma.tochigi.jp\0gov.mr\0"
+"gov.ms\0"
+"futbol\0solar\0is-a-geek.net\0"
+"gov.mu\0rsc.cdn77.org\0"
+"gov.mv\0koeln\0"
+"arpa\0gov.mw\0gov.ng\0"
+"bcn\0cloudjiffy.net\0"
+"gov.my\0skaun.no\0s3.dualstack.ap-northeast-3.amazonaws.com\0"
+"gov.mz\0"
+"audio\0"
+"*.ex.ortsinfo.at\0gov.nl\0"
+"store.ro\0"
+"matsushige.tokushima.jp\0"
+"gov.nr\0"
+"monzaedellabrianza.it\0"
+"notaires.km\0\xe9\xa4\x90\xe5\x8e\x85\0servequake.com\0"
+"sekikawa.niigata.jp\0"
+"avoues.fr\0av.tr\0"
+"s3-accesspoint-fips.us-gov-east-1.amazonaws.com\0"
+"hsbc\0icbc\0lv.eu.org\0"
+"thuathienhue.vn\0"
+"gov.om\0vm.bytemark.co.uk\0"
+"togakushi.nagano.jp\0"
+"brumunddal.no\0bjerkreim.no\0"
+"myphotos.cc\0"
+"store.st\0"
+"m\xc4\x81ori.nz\0"
+"hofu.yamaguchi.jp\0gov.ph\0"
+"asn.au\0"
+"gs.nl.no\0gov.pk\0"
+"gov.pl\0"
+"gov.pn\0bet\0"
+"s3.dualstack.eu-south-2.amazonaws.com\0""4u.com\0"
+"gov.qa\0pccw\0"
+"gov.pr\0*.in.futurecms.at\0"
+"oster\xc3\xb8y.no\0gov.ps\0nagoya\0"
+"sakawa.kochi.jp\0gov.pt\0"
+"evenes.no\0"
+"vall\xc3\xa9""edaoste.it\0turek.pl\0"
+"gov.py\0try-snowplow.com\0"
+"hosting\0pdns.page\0"
+"ardal.no\0"
+"pub.instances.scw.cloud\0"
+"\xc3\xb8ygarden.no\0k12.sc.us\0"
+"go.leg.br\0"
+"us-east-2.elasticbeanstalk.com\0codeberg.page\0utwente.io\0"
+"bulsan.it\0"
+"asda\0eu-4.evennode.com\0"
+"\xe5\xb2\xa1\xe5\xb1\xb1.jp\0"
+"arte\0axa\0"
+"aws\0studio-fips.us-gov-west-1.sagemaker.aws\0"
+"gov.sa\0s3.dualstack.eu-west-1.amazonaws.com\0"
+"friuliv-giulia.it\0oarai.ibaraki.jp\0gov.sb\0"
+"trysil.no\0gov.rs\0gov.sc\0"
+"gov.sd\0allfinanz\0"
+"tjeldsund.no\0cc.pa.us\0gov.ru\0"
+"gov.rw\0gov.sg\0"
+"gov.sh\0"
+"emrnotebooks-prod.ap-southeast-2.amazonaws.com\0s3.us-west-2.amazonaws.com\0"
+"gov.sl\0"
+"x.bg\0\xd0\xb1\xd0\xb8\xd0\xb7.\xd1\x80\xd1\x83\xd1\x81\0"
+"bid\0upaas.kazteleport.kz\0"
+"orkdal.no\0gov.so\0taobao\0"
+"journalist.aero\0radoy.no\0\xd9\x87\xd9\x85\xd8\xb1\xd8\xa7\xd9\x87\0"
+"gov.ss\0fastly-edge.com\0"
+"maori.nz\0"
+"2000.hu\0"
+"bbva\0"
+"shizuoka.shizuoka.jp\0is.gov.pl\0sosnowiec.pl\0gov.sx\0"
+"gov.sy\0bio\0"
+"gov.tj\0"
+"q.bg\0s3-website-us-gov-west-1.amazonaws.com\0"
+"gov.tl\0"
+"gov.tm\0s3.dualstack.ap-east-1.amazonaws.com\0"
+"gov.tn\0"
+"gov.to\0"
+"shikama.miyagi.jp\0"
+"gov.ua\0"
+"yanaizu.fukushima.jp\0gov.tr\0"
+"biz\0marche.it\0gov.tt\0"
+"auth.ap-northeast-2.amazoncognito.com\0vfs.cloud9.ap-northeast-2.amazonaws.com\0"
+"gov.tw\0"
+"bip.sh\0"
+"j.bg\0"
+"itako.ibaraki.jp\0"
+"gov.uk\0"
+"aibetsu.hokkaido.jp\0*.firenet.ch\0"
+"ovre-eiker.no\0"
+"nagasaki.jp\0"
+"nyanta.jp\0"
+"s3.amazonaws.com\0webview-assets.aws-cloud9.me-south-1.amazonaws.com\0"
+"umig.gov.pl\0"
+"gov.vc\0"
+"chino.nagano.jp\0*.northflank.app\0"
+"gov.ve\0execute-api.il-central-1.amazonaws.com\0s3-object-lambda.eu-north-1.amazonaws.com\0s3-website.eu-south-1.amazonaws.com\0"
+"c.bg\0stathelle.no\0eu-3.evennode.com\0"
+"holt\xc3\xa5len.no\0k12.pr.us\0sekd1.beebyteapp.io\0j.layershift.co.uk\0"
+"akiruno.tokyo.jp\0s3.fr-par.scw.cloud\0"
+"kharkov.ua\0cc.ne.us\0orsites.com\0"
+"gov.vn\0mattel\0"
+"khmelnytskyi.ua\0"
+"toray\0temp-dns.com\0"
+"asia\0sand\xc3\xb8y.no\0k12.pa.us\0"
+"cc.mn.us\0kr.eu.org\0app.os.stg.fedoraproject.org\0"
+"tsuru.yamanashi.jp\0"
+"\xe4\xb8\xad\xe5\x9b\xbd\0"
+"mazury.pl\0"
+"emrnotebooks-prod.me-south-1.amazonaws.com\0"
+"vallee-d-aoste.it\0hakodate.hokkaido.jp\0izumo.shimane.jp\0"
+"gov.ws\0"
+"saroma.hokkaido.jp\0"
+"nord-fron.no\0\xe5\x85\xac\xe5\x8f\xb8.\xe9\xa6\x99\xe6\xb8\xaf\0"
+"blog.vu\0"
+"kashiwa.chiba.jp\0"
+"capetown\0"
+"\xe4\xb8\xad\xe5\x9c\x8b\0"
+"bms\0"
+"matsue.shimane.jp\0"
+"bmw\0"
+"gov.ye\0"
+"osaka\0"
+"simplesite.com.br\0"
+"chambagri.fr\0"
+"jgora.pl\0"
+"bib.ve\0gov.za\0demo.datadetect.com\0fuettertdasnetz.de\0"
+"ravenna.it\0"
+"sa.edu.au\0*.otap.co\0nfshost.com\0"
+"hiroshima.jp\0"
+"cc.ky.us\0"
+"bom\0eu-2.evennode.com\0"
+"\xd9\xbe\xd8\xa7\xd9\x83\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0rich\0"
+"boo\0latrobe\0freeboxos.com\0"
+"square7.net\0"
+"\xe0\xb9\x80\xe0\xb8\x99\xe0\xb9\x87\xe0\xb8\x95.\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0"
+"gov.zm\0"
+"bot\0"
+"sko.gov.pl\0box\0"
+"budejju.no\0"
+"gov.zw\0"
+"kawakita.ishikawa.jp\0"
+"kokonoe.oita.jp\0asn.lv\0"
+"9.bg\0"
+"kosei.shiga.jp\0cab\0"
+"onred.one\0"
+"hobby-site.org\0x0.com\0"
+"from-la.net\0"
+"nishiizu.shizuoka.jp\0"
+"gaular.no\0"
+"huissier-justice.fr\0minano.saitama.jp\0cal\0nyc.mn\0"
+"tozsde.hu\0cam\0"
+"yenbai.vn\0"
+"2.bg\0gj\xc3\xb8vik.no\0"
+"mond.jp\0"
+"aremark.no\0cba\0taifun-dns.de\0"
+"biratori.hokkaido.jp\0car\0"
+"cat\0kawamata.fukushima.jp\0"
+"grondar.za\0"
+"kids\0"
+"ashiya.hyogo.jp\0gobo.wakayama.jp\0"
+"hole.no\0"
+"webhop.org\0"
+"hasama.oita.jp\0opal.ne.jp\0"
+"execute-api.eu-south-2.amazonaws.com\0"
+"ogliastra.it\0shiroishi.saga.jp\0cbn\0"
+"k12.nj.us\0s3-accesspoint.ap-south-1.amazonaws.com\0"
+"salon\0"
+"\xe7\xbd\x91\xe7\xab\x99\0"
+"sardegna.it\0"
+"marker.no\0properties\0"
+"store.bb\0kawai.iwate.jp\0tokushima.tokushima.jp\0"
+"sogndal.no\0"
+"t3l3p0rt.net\0"
+"stufftoread.com\0"
+"shintoku.hokkaido.jp\0"
+"emrappui-prod.ca-central-1.amazonaws.com\0"
+"k12.mi.us\0eu-1.evennode.com\0"
+"carraramassa.it\0tohma.hokkaido.jp\0"
+"camera\0"
+"lolipop.io\0"
+"gen.in\0"
+"imb.br\0diet\0"
+"j\xc3\xb8rpeland.no\0"
+"cuneo.it\0hioki.kagoshima.jp\0*.sensiosite.cloud\0"
+"\xd7\x9e\xd7\x9e\xd7\xa9\xd7\x9c.\xd7\x99\xd7\xa9\xd7\xa8\xd7\x90\xd7\x9c\0\xe8\x81\x94\xe9\x80\x9a\0"
+"deporte.bo\0"
+"myspreadshop.net\0"
+"auth.ap-southeast-2.amazoncognito.com\0is-a-cpa.com\0"
+"is-a-libertarian.com\0"
+"porsgrunn.no\0"
+"c.la\0"
+"architectes.bj\0red.sv\0gov.nc.tr\0"
+"k12.ks.us\0"
+"bahccavuotna.no\0\xe0\xb0\xad\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\xa4\xe0\xb1\x8d\0"
+"londrina.br\0ynh.fr\0"
+"ceo\0store.dk\0blogspot.com\0js.wpenginepowered.com\0"
+"cfa\0beta.bounty-full.com\0"
+"takehara.hiroshima.jp\0shikaoi.hokkaido.jp\0"
+"ryukyu\0"
+"cfd\0"
+"buy\0miami\0"
+"cc.ia.us\0"
+"gorlice.pl\0"
+"s3-accesspoint.us-gov-west-1.amazonaws.com\0"
+"*.owo.codes\0"
+"chichibu.saitama.jp\0"
+"urn.arpa\0""123miweb.es\0basicserver.io\0"
+"buzen.fukuoka.jp\0wakkanai.hokkaido.jp\0"
+"instance.datadetect.com\0"
+"doesntexist.org\0"
+"foz.br\0ogasawara.tokyo.jp\0"
+"tynset.no\0"
+"*.eu-west-1.airflow.amazonaws.com\0"
+"teo.br\0kusatsu.shiga.jp\0"
+"!city.sendai.jp\0"
+"gen.ng\0"
+"merckmsd\0"
+"akrehamn.no\0lib.wi.us\0"
+"hiraya.nagano.jp\0"
+"namdinh.vn\0"
+"vfs.cloud9.us-east-2.amazonaws.com\0"
+"ono.hyogo.jp\0"
+"os\xc3\xb8yro.no\0"
+"copro.uk\0"
+"blog.kg\0"
+"yn.cn\0gen.nz\0"
+"tolga.no\0x.se\0"
+"\xe5\xa4\xa7\xe9\x98\xaa.jp\0"
+"mobi\0"
+"sarpsborg.no\0"
+"nakatsugawa.gifu.jp\0bzh\0"
+"\xe6\xb8\xb8\xe6\x88\x8f\0ras.ru\0"
+"k12.ia.us\0"
+"\xe7\xb6\xb2\xe7\xb5\xa1.cn\0verm\xc3\xb6gensberater\0"
+"lifestyle\0"
 "*.kobe.jp\0"
-"gj\xc3\xb8vik.no\0"
-"uruma.okinawa.jp\0"
-"stjordal.no\0"
-"services\0is-a-liberal.com\0is-a-nascarfan.com\0operaunite.com\0"
-"masoy.no\0"
-"lierne.no\0"
-"rj.gov.br\0urakawa.hokkaido.jp\0"
-"helsinki\0blogsite.org\0from-pr.com\0"
-"nohost.me\0"
-"mragowo.pl\0"
-"kamikitayama.nara.jp\0"
-"dagestan.ru\0"
-"kawajima.saitama.jp\0"
-"ar.us\0nid.io\0"
-"k12.il.us\0"
-"valleedaoste.it\0"
-"df.gov.br\0"
-"chernivtsi.ua\0"
-"dagestan.su\0"
-"bodo.no\0george\0"
-"hakata.fukuoka.jp\0ashiya.hyogo.jp\0awaji.hyogo.jp\0reisen\0"
-"n\xc3\xa6r\xc3\xb8y.no\0"
-"holt\xc3\xa5len.no\0"
-"art.pl\0"
-"bel.tr\0"
-"y.bg\0"
-"hannan.osaka.jp\0"
-"valle-daosta.it\0sumoto.hyogo.jp\0toga.toyama.jp\0"
-"kg.kr\0"
-"cc.ok.us\0ar.com\0"
-"is.it\0daynight.jp\0"
-"sn\xc3\xa5sa.no\0"
-"minisite.ms\0"
-"trentino-s\xc3\xbc""d-tirol.it\0manno.kagawa.jp\0yasugi.shimane.jp\0"
-"workinggroup.aero\0tromso.no\0hitachi\0"
-"kira.aichi.jp\0"
-"gifu.gifu.jp\0"
-"inderoy.no\0kvalsund.no\0dray-dns.de\0"
-"iwakuni.yamaguchi.jp\0"
-"domains\0"
-"hlx3.page\0"
-"e.bg\0"
-"kawai.nara.jp\0"
-"aaa\0"
-"co.ae\0ch.eu.org\0"
-"co.ag\0"
-"naoshima.kagawa.jp\0winb.gov.pl\0"
-"co.am\0statefarm\0""123webseite.de\0httpbin.org\0"
-"art.sn\0se.leg.br\0"
-"co.ao\0"
-"tawaramoto.nara.jp\0group\0cloudapps.digital\0scalebook.scw.cloud\0"
-"co.bb\0"
-"aurland.no\0hemnes.no\0"
-"co.at\0abb\0"
-"abc\0readmyblog.org\0"
-"kitahata.saga.jp\0"
-"tushu\0"
-"aso.kumamoto.jp\0loginline.app\0"
-"co.bi\0farmers\0"
-"co.bj\0static.land\0"
-"hagebostad.no\0"
-"co.bn\0"
-"mypep.link\0"
-"obihiro.hokkaido.jp\0ba.leg.br\0"
-"wpdevcloud.com\0co.ca\0"
-"nemuro.hokkaido.jp\0eating-organic.net\0"
-"troitsk.su\0"
-"asakawa.fukushima.jp\0"
-"co.bw\0k12.ec\0media\0logoip.de\0vp4.me\0"
-"co.ci\0"
-"co.cl\0""123webseite.at\0"
-"co.cm\0"
-"pro.az\0huissier-justice.fr\0"
-"aco\0vologda.su\0"
-"co.cr\0bergamo.it\0"
-"fujioka.gunma.jp\0"
-"qsl.br\0theshop.jp\0"
-"pro.br\0"
-"iwanai.hokkaido.jp\0co.cz\0"
-"co.dk\0"
-"beppu.oita.jp\0"
-"sand\xc3\xb8y.no\0"
-"tomigusuku.okinawa.jp\0"
-"vaporcloud.io\0"
-"barlettatraniandria.it\0"
-"from-in.com\0soundcast.me\0"
-"bihoro.hokkaido.jp\0rybnik.pl\0"
-"mo.us\0"
-"kihoku.ehime.jp\0"
-"a\xc3\xa9roport.ci\0ads\0"
-"\xe5\x8f\xb0\xe7\x81\xa3\0aeg\0"
-"kazimierz-dolny.pl\0"
-"dyndns-remote.com\0"
-"coop.ht\0"
-"fed.us\0"
-"sh.cn\0laz.it\0vt.it\0"
-"pro.cy\0"
-"fg.it\0"
-"movie\0is-a-soxfan.org\0hosp.uk\0jelastic.dogado.eu\0"
-"chijiwa.nagasaki.jp\0wkz.gov.pl\0"
-"davvesiida.no\0"
-"kiengiang.vn\0"
-"from-ma.com\0"
-"coop.in\0kembuchi.hokkaido.jp\0flt.cloud.muni.cz\0"
-"pro.ec\0"
-"coop.ar\0kiso.nagano.jp\0"
-"edeka\0"
-"tranibarlettaandria.it\0yahiko.niigata.jp\0"
-"afl\0"
-"hotels\0sakuraweb.com\0"
-"ebetsu.hokkaido.jp\0izumi.osaka.jp\0danang.vn\0"
-"oystre-slidre.no\0"
-"lubin.pl\0"
-"love\0"
-"pug.it\0ostrowwlkp.pl\0"
-"co.gg\0k12.sc.us\0"
-"coop.br\0up.in\0muroran.hokkaido.jp\0kamikawa.saitama.jp\0fbx-os.fr\0"
-"co.gl\0!city.sendai.jp\0"
-"pro.fj\0k12.il\0"
-"groks-this.info\0"
-"minamiaiki.nagano.jp\0"
-"suzuki\0"
-"takasaki.gunma.jp\0"
-"wanggou\0"
-"dd-dns.de\0"
-"coupon\0"
-"co.gy\0lindesnes.no\0house\0"
-"ppg.br\0"
-"pp.az\0wakayama.wakayama.jp\0"
-"daisen.akita.jp\0tobe.ehime.jp\0"
-"is-not-certified.com\0"
-"webhosting.be\0iamallama.com\0"
-"co.id\0kagoshima.jp\0"
-"sa.gov.au\0co.hu\0unjarga.no\0at.eu.org\0"
-"austrheim.no\0freebox-os.com\0"
-"aig\0data\0sphinx.mythic-beasts.com\0"
-"chicappa.jp\0no-ip.biz\0"
-"co.il\0en-root.fr\0"
-"act.au\0co.im\0date\0"
-"co.in\0"
-"gliding.aero\0"
-"sandoy.no\0vinnytsia.ua\0s3-website-us-east-1.amazonaws.com\0cloud.nospamproxy.com\0"
-"co.ir\0"
-"bluebite.io\0"
-"co.it\0bydgoszcz.pl\0"
-"co.je\0zp.ua\0"
-"mo-siemens.io\0"
-"cheap.jp\0"
-"stavanger.no\0"
-"pro.ht\0"
-"wa.edu.au\0"
-"greater.jp\0"
-"realm.cz\0"
-"championship.aero\0"
-"co.jp\0am.leg.br\0"
-"yamakita.kanagawa.jp\0"
-"pro.in\0"
-"co.ke\0gildeskal.no\0"
-"mod.gi\0"
-"daklak.vn\0"
-"massa-carrara.it\0handa.aichi.jp\0"
-"lib.mo.us\0tuva.su\0"
-"lier.no\0"
-"oow.gov.pl\0"
-"rr.gov.br\0co.kr\0"
-"co.lc\0"
-"\xe7\xb6\xb2\xe7\xb5\xa1.cn\0"
-"booking\0"
-"miyako.iwate.jp\0"
-"\xe7\xbd\x91\xe5\xba\x97\0"
-"aoste.it\0honjo.saitama.jp\0"
-"ltd.co.im\0"
-"zamami.okinawa.jp\0"
-"\xc3\xa5rdal.no\0applinzi.com\0"
-"co.ma\0\xd9\x85\xd9\x88\xd8\xb1\xd9\x8a\xd8\xaa\xd8\xa7\xd9\x86\xd9\x8a\xd8\xa7\0"
-"langson.vn\0"
-"co.ls\0omega\0zero\0"
-"co.me\0mcpre.ru\0"
-"fukushima.jp\0lancaster\0tatar\0"
-"co.mg\0enterprises\0"
-"hisamitsu\0"
-"misato.saitama.jp\0"
-"hasuda.saitama.jp\0"
-"co.na\0"
-"rs.gov.br\0sc.gov.br\0sunagawa.hokkaido.jp\0kamigori.hyogo.jp\0\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa6\xb0\xe0\xa6\xa4\0"
-"iobb.net\0nyanta.jp\0"
-"co.mu\0"
-"localzone.xyz\0"
-"co.mw\0"
-"ag.it\0"
-"co.ni\0s3-website-eu-west-1.amazonaws.com\0"
-"co.mz\0"
-"co.nl\0"
-"hdfcbank\0instances.spawn.cc\0"
-"fujimino.saitama.jp\0"
-"courses\0co.no\0"
-"kamitsue.oita.jp\0"
-"miyoshi.saitama.jp\0"
-"omachi.saga.jp\0"
-"sk\xc3\xa5nland.no\0"
-"otaru.hokkaido.jp\0katowice.pl\0"
-"pro.na\0fla.no\0"
-"skin\0"
-"viking\0"
-"co.nz\0"
-"kristiansand.no\0hk.org\0"
-"pro.mv\0aid.pl\0anz\0"
-"co.om\0y.se\0"
-"aol\0"
-"vic.gov.au\0kherson.ua\0k12.ms.us\0k12.nc.us\0"
-"mielno.pl\0seidat.net\0"
-"br\xc3\xb8nn\xc3\xb8y.no\0"
-"md.ci\0"
-"tanagura.fukushima.jp\0chikuma.nagano.jp\0"
-"qld.au\0photos\0"
-"eti.br\0"
-"jele.io\0"
-"osaki.miyagi.jp\0"
-"ogawa.saitama.jp\0co.pl\0"
-"kokonoe.oita.jp\0co.pn\0"
-"s3.dualstack.ap-northeast-1.amazonaws.com\0oncilla.mythic-beasts.com\0"
-"ap.leg.br\0"
-"\xe7\xb6\xb2\xe7\xb5\xa1.hk\0g\xc3\xa1ivuotna.no\0"
-"app\0*.rss.my.id\0"
-"pro.om\0aivencloud.com\0"
-"erimo.hokkaido.jp\0fudai.iwate.jp\0prudential\0"
-"zhitomir.ua\0"
-"co.pw\0"
-"trentino.it\0koryo.nara.jp\0"
-"gs.rl.no\0"
-"ina.ibaraki.jp\0"
-"vt.us\0"
-"e.se\0"
-"sytes.net\0"
-"matsusaka.mie.jp\0"
-"bar\0opal.ne.jp\0"
-"bbc\0"
-"s3-sa-east-1.amazonaws.com\0from-va.com\0"
-"friuli-ve-giulia.it\0zentsuji.kagawa.jp\0pro.pr\0usr.cloud.muni.cz\0"
-"hongo.hiroshima.jp\0"
-"co.ro\0"
-"makurazaki.kagoshima.jp\0\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x86\0"
-"co.rs\0"
-"komaki.aichi.jp\0"
-"\xc3\xb8ystre-slidre.no\0"
-"machida.tokyo.jp\0k12.tr\0art\0bbt\0"
-"co.rw\0"
-"bcg\0mircloud.us\0"
-"noho.st\0"
-"tsuyama.okayama.jp\0"
-"belau.pw\0"
-"xbox\0"
-"est-mon-blogueur.com\0"
-"bcn\0"
-"rn.gov.br\0shingu.wakayama.jp\0"
-"tokigawa.saitama.jp\0co.st\0"
-"analytics-gateway.eu-west-1.amazonaws.com\0is-a-therapist.com\0"
-"r\xc3\xb8""d\xc3\xb8y.no\0"
-"ayase.kanagawa.jp\0co.th\0"
-"crotone.it\0co.sz\0co.tj\0"
-"jl.cn\0sicilia.it\0motoyama.kochi.jp\0"
-"co.tm\0k12.vi\0"
+"s3-deprecated.us-east-2.amazonaws.com\0from-mi.com\0"
+"\xe5\xa4\xa7\xe6\x8b\xbf\0s3-website.ap-south-1.amazonaws.com\0"
+"tsuiki.fukuoka.jp\0aridagawa.wakayama.jp\0""5.azurestaticapps.net\0"
+"analytics-gateway.us-east-1.amazonaws.com\0"
+"jeonnam.kr\0"
+"imizu.toyama.jp\0"
+"k12.id.us\0moda\0"
+"bergamo.it\0yabuki.fukushima.jp\0"
+"\xc3\xa5snes.no\0"
+"oita.jp\0"
+"karasjohka.no\0"
+"quangbinh.vn\0"
+"uppo.gov.pl\0"
+"yahoo\0"
+"c.se\0"
+"toyokawa.aichi.jp\0komono.mie.jp\0"
+"ballooning.aero\0ap-southeast-1.elasticbeanstalk.com\0is-very-evil.org\0"
+"bar0.net\0"
+"freedesktop.org\0"
+"kamo.niigata.jp\0"
+"\xe9\xa3\x9e\xe5\x88\xa9\xe6\xb5\xa6\0user.srcf.net\0"
+"student.aero\0*.on-acorn.io\0"
+"noticeable.news\0"
+"iobb.net\0"
+"cloudns.info\0"
+"nissan\0"
+"uk.oxa.cloud\0"
+"penza.su\0"
+"cyou\0"
 "\xe5\x8d\x83\xe8\x91\x89.jp\0"
-"co.ua\0"
-"enscaled.sg\0"
-"co.tt\0"
-"puglia.it\0"
-"co.ug\0"
-"id.forgerock.io\0"
-"co.tz\0"
-"co.uk\0radio.am\0from-ne.com\0"
-"kawanishi.hyogo.jp\0"
-"ro.gov.br\0quest\0fem.jp\0"
-"co.us\0"
-"targi.pl\0from-ny.net\0"
-"co.ve\0"
-"ryuoh.shiga.jp\0bet\0sblo.jp\0"
-"ascoli-piceno.it\0"
-"co.vi\0"
-"okawa.kochi.jp\0pro.tt\0co.uz\0"
-"okinawa\0dyndns-server.com\0awsmppl.com\0"
-"lig.it\0"
-"storfjord.no\0*.compute.estate\0"
-"lt.it\0"
-"works.aero\0"
-"radio.br\0global.prod.fastly.net\0"
-"enterprisecloud.nu\0"
-"budejju.no\0hopto.org\0"
-"mikasa.hokkaido.jp\0akamaiorigin.net\0"
-"ol.no\0americanfamily\0"
-"myforum.community\0"
-"walbrzych.pl\0kontum.vn\0"
-"omaezaki.shizuoka.jp\0"
-"space\0"
-"folkebibl.no\0s\xc3\xb8rreisa.no\0webview-assets.aws-cloud9.ap-southeast-1.amazonaws.com\0beta.bounty-full.com\0"
-"uto.kumamoto.jp\0"
-"coop.rw\0"
-"med.br\0"
-"urbinopesaro.it\0"
-"bomlo.no\0skjervoy.no\0axa\0"
-"pro.vn\0"
-"aws\0"
-"poivron.org\0"
-"webhop.biz\0""2-d.jp\0"
-"mx.na\0"
-"takasu.hokkaido.jp\0"
-"mircloud.ru\0mediatech.by\0"
-"b\xc3\xa1id\xc3\xa1r.no\0"
-"campidano-medio.it\0"
-"trentinsued-tirol.it\0"
+"nissay\0"
+"sandoy.no\0ing.pa\0"
+"pubtls.org\0"
+"toyosato.shiga.jp\0"
+"notebook.eu-central-1.sagemaker.aws\0"
+"ustka.pl\0"
+"poniatowa.pl\0"
+"spdns.eu\0"
+"*.kitakyushu.jp\0*.ex.futurecms.at\0"
+"minamifurano.hokkaido.jp\0gen.tr\0"
+"auth-fips.us-east-2.amazoncognito.com\0us-east-1.amazonaws.com\0"
+"bounceme.net\0"
+"\xe7\xb6\xb2\xe7\xb5\xa1.hk\0"
+"coach\0"
+"com\0bodo.no\0"
+"yuasa.wakayama.jp\0"
+"from-ga.com\0"
+"notaires.fr\0"
+"cpa\0"
+"onojo.fukuoka.jp\0"
+"cc.ct.us\0"
+"trentino-s\xc3\xbc""dtirol.it\0\xe7\xa6\x8f\xe5\xb3\xb6.jp\0financial\0"
+"news.hu\0emrappui-prod.eu-north-1.amazonaws.com\0"
+"campania.it\0zushi.kanagawa.jp\0"
+"brindisi.it\0secret.jp\0"
+"ascolipiceno.it\0lon-1.paas.massivegrid.net\0"
+"sellsyourhome.org\0"
+"katori.chiba.jp\0"
+"\xe9\xb9\xbf\xe5\x85\x90\xe5\xb3\xb6.jp\0dad\0"
+"\xe6\xbe\xb3\xe9\x96\x80\0"
+"dish\0"
+"bungoono.oita.jp\0"
+"\xd0\xba\xd0\xb0\xd1\x82\xd0\xbe\xd0\xbb\xd0\xb8\xd0\xba\0"
+"waw.pl\0"
+"xen.prgmr.com\0"
+"mutsu.aomori.jp\0imabari.ehime.jp\0shirakawa.gifu.jp\0"
+"day\0"
+"coz.br\0co.education\0"
+"k12.fl.us\0"
+"my-router.de\0"
+"buyshop.jp\0noop.app\0"
+"avianca\0weibo\0"
+"tatebayashi.gunma.jp\0"
+"crs\0"
+"andriatranibarletta.it\0toyohashi.aichi.jp\0"
+"betainabox.com\0"
+"medio-campidano.it\0vibovalentia.it\0"
+"natal.br\0himeji.hyogo.jp\0"
+"kibichuo.okayama.jp\0"
+"commune.am\0r\xc3\xb8mskog.no\0game.tw\0discourse.team\0"
+"hizen.saga.jp\0"
+"lib.pr.us\0s3-accesspoint.dualstack.eu-south-1.amazonaws.com\0s3.us-gov-east-1.amazonaws.com\0"
+"lodi.it\0gotsu.shimane.jp\0"
+"pvt.ge\0eu.pythonanywhere.com\0"
+"tj.cn\0higashikawa.hokkaido.jp\0tagami.niigata.jp\0komatsushima.tokushima.jp\0klodzko.pl\0"
+"tc.br\0ouchi.saga.jp\0"
+"webview-assets.aws-cloud9.af-south-1.amazonaws.com\0es.eu.org\0"
+"nesseby.no\0gifts\0kiwi\0"
+"schaeffler\0"
+"dds\0myshopblocks.com\0"
+"hanggliding.aero\0spdns.de\0"
+"kakogawa.hyogo.jp\0"
+"friulivgiulia.it\0vt.it\0"
+"laz.it\0massacarrara.it\0"
+"hvaler.no\0"
+"iyo.ehime.jp\0nowtv\0"
+"dev\0"
+"fukusaki.hyogo.jp\0sanjo.niigata.jp\0"
+"koriyama.fukushima.jp\0s3-accesspoint.dualstack.cn-northwest-1.amazonaws.com.cn\0"
+"\xd8\xaa\xd9\x88\xd9\x86\xd8\xb3\0"
+"taku.saga.jp\0ina.saitama.jp\0"
+"cng.br\0airtel\0"
+"tydal.no\0de.com\0"
+"mcdir.me\0"
+"toyone.aichi.jp\0"
+"nagaokakyo.kyoto.jp\0narusawa.yamanashi.jp\0lamer\0"
+"ivano-frankivsk.ua\0\xd0\xbe\xd0\xbd\xd0\xbb\xd0\xb0\xd0\xb9\xd0\xbd\0"
+"bjark\xc3\xb8y.no\0"
+"rankoshi.hokkaido.jp\0food\0"
+"sortland.no\0"
+"\xe6\xbe\xb3\xe9\x97\xa8\0"
+"roan.no\0"
+"tonami.toyama.jp\0"
+"ieee\0cloudns.pro\0"
+"audi\0"
+"kumamoto.kumamoto.jp\0*.cloud.metacentrum.cz\0"
+"asahi.chiba.jp\0"
+"steigen.no\0"
+"val-d-aosta.it\0nghean.vn\0dhl\0"
+"slz.br\0now.sh\0"
+"transporte.bo\0lea\xc5\x8bgaviika.no\0"
+"is-an-engineer.com\0"
+"s3-accesspoint.dualstack.ap-south-1.amazonaws.com\0"
+"miura.kanagawa.jp\0"
+"\xe5\xbe\xb3\xe5\xb3\xb6.jp\0"
+"bielawa.pl\0"
+"daa.jp\0"
+"ip.linodeusercontent.com\0"
+"\xe9\x9b\xbb\xe8\xa8\x8a\xe7\x9b\x88\xe7\xa7\x91\0"
+"\xe0\xae\x87\xe0\xae\xa8\xe0\xaf\x8d\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xbe\0beer\0"
+"grosseto.it\0"
+"hangout\0lplfinancial\0"
+"tunk.org\0"
+"kumamoto.jp\0"
+"lib.ne.us\0studio.eu-north-1.sagemaker.aws\0home-webserver.de\0"
+"fukagawa.hokkaido.jp\0"
+"diy\0"
+"v\xc3\xa5gan.no\0"
+"ford\0"
+"alstom\0dynserv.org\0"
+"weir\0"
+"lib.nj.us\0*.r.appspot.com\0"
+"shiojiri.nagano.jp\0imari.saga.jp\0user.webaccel.jp\0"
+"morimachi.shizuoka.jp\0"
+"omniwe.site\0"
+"ss.it\0hs.run\0"
+"skodje.no\0"
+"total\0"
+"vinhlong.vn\0fra1-de.cloudjiffy.net\0"
+"vf.no\0north-kazakhstan.su\0"
+"production.aero\0"
+"datsun\0"
+"\xe6\x89\x8b\xe6\x9c\xba\0"
+"idf.il\0"
+"moto\0emrappui-prod.sa-east-1.amazonaws.com\0"
+"\xe5\xae\xae\xe5\x9f\x8e.jp\0forex\0"
+"reservd.testing.thingdust.io\0"
+"seto.aichi.jp\0travel\0"
+"*.futurecms.at\0"
+"tonkotsu.jp\0"
+"digital\0"
+"odda.no\0"
+"trentinoaltoadige.it\0yugawara.kanagawa.jp\0"
+"mysecuritycamera.com\0"
+"senasa.ar\0narita.chiba.jp\0"
+"froya.no\0s3-website.ap-southeast-1.amazonaws.com\0"
+"fitness\0"
+"yonezawa.yamagata.jp\0"
+"katagami.akita.jp\0"
+"lib.la.us\0"
+"tatar\0"
+"fr-1.paas.massivegrid.net\0"
+"execute-api.eu-north-1.amazonaws.com\0"
+"hirono.iwate.jp\0"
+"rn.it\0run.app\0"
+"navoi.su\0"
+"kamishihoro.hokkaido.jp\0town\0"
+"of.by\0"
+"ichiba.tokushima.jp\0"
+"reklam.hu\0wy.us\0"
+"dnp\0parallel.jp\0"
+"forum.hu\0"
+"ujiie.tochigi.jp\0"
+"consulting.aero\0is-into-cars.com\0"
+"rg.it\0\xe7\xbd\x91\xe5\x9d\x80\0platter-app.dev\0"
+"otsuki.kochi.jp\0storage.yandexcloud.net\0"
+"dog\0"
+"arita.saga.jp\0"
+"insurance\0"
+"*.cn-north-1.airflow.amazonaws.com.cn\0"
+"col.ng\0"
+"thick.jp\0"
+"gildeskal.no\0"
+"is-a-lawyer.com\0webredirect.org\0"
+"brother\0"
+"s3.dualstack.eu-central-2.amazonaws.com\0"
+"agrigento.it\0moroyama.saitama.jp\0"
+"latino\0"
+"pa.gov.br\0dot\0"
+"webview-assets.cloud9.eu-south-1.amazonaws.com\0webview-assets.cloud9.us-east-1.amazonaws.com\0"
+"ozu.kumamoto.jp\0asakuchi.okayama.jp\0"
+"chase\0"
+"daegu.kr\0*.rss.my.id\0"
+"murata.miyagi.jp\0credit\0"
+"fi.eu.org\0"
+"easypanel.app\0"
+"b\xc3\xa1hcavuotna.no\0beauty\0toys\0"
+"shishikui.tokushima.jp\0"
+"mcdir.ru\0"
+"s3-accesspoint.dualstack.ap-northeast-2.amazonaws.com\0"
+"ginoza.okinawa.jp\0urasoe.okinawa.jp\0"
+"kmpsp.gov.pl\0"
+"vt.us\0"
+"s3-accesspoint.me-south-1.amazonaws.com\0"
+"campobasso.it\0pr.it\0"
+"vik.no\0cable-modem.org\0byen.site\0"
+"matsuda.kanagawa.jp\0mc.ax\0"
+"pictures\0"
+"hirakata.osaka.jp\0restaurant\0"
+"pb.gov.br\0kawaminami.miyazaki.jp\0eat\0"
+"cruise\0"
+"\xe5\x95\x86\xe5\x9f\x8e\0"
+"nakagawa.tokushima.jp\0kamitonda.wakayama.jp\0cistron.nl\0"
+"*.on-rancher.cloud\0"
+"fhs.no\0*.oci.customer-oci.com\0"
+"\xe7\xbb\x84\xe7\xb9\x94.hk\0lyngdal.no\0ua.rs\0"
+"tomobe.ibaraki.jp\0"
+"lacaixa\0"
+"hayashima.okayama.jp\0de.cool\0"
+"boehringer\0"
+"smile\0togliatti.su\0"
+"iveland.no\0"
+"ot.it\0pd.it\0"
+"filegear-au.me\0"
+"cantho.vn\0"
+"eco\0"
+"sicilia.it\0"
+"oyer.no\0"
+"muni.il\0"
+"nishihara.kumamoto.jp\0tsubame.niigata.jp\0"
+"webview-assets.aws-cloud9.us-west-2.amazonaws.com\0"
+"namegata.ibaraki.jp\0"
+"gamo.shiga.jp\0"
+"hermes\0"
+"izena.okinawa.jp\0"
+"modelling.aero\0tx.us\0cn.com\0"
+"ushiku.ibaraki.jp\0shimizu.shizuoka.jp\0"
+"edu\0"
+"dtv\0myeffect.net\0"
+"sandvik\0of.je\0"
+"curitiba.br\0aichi.jp\0numata.hokkaido.jp\0eastasia.azurestaticapps.net\0"
+"execute-api.eu-west-1.amazonaws.com\0s3-accesspoint.dualstack.us-west-1.amazonaws.com\0"
+"floripa.br\0ninhbinh.vn\0"
+"ringsaker.no\0s3.dualstack.me-central-1.amazonaws.com\0is-a-techie.com\0"
+"bulsan-sudtirol.it\0szczecin.pl\0girly.jp\0"
+"chanel\0"
+"capitalone\0"
+"lima-city.rocks\0"
+"kiyose.tokyo.jp\0tiengiang.vn\0"
+"*.uberspace.de\0"
+"no.it\0"
+"cesenaforli.it\0health.nz\0"
+"logistics.aero\0s3-website.eu-north-1.amazonaws.com\0"
+"hadano.kanagawa.jp\0webhop.net\0"
 "aver\xc3\xb8y.no\0"
-"uozu.toyama.jp\0"
-"shimosuwa.nagano.jp\0earth\0"
-"bid\0"
-"\xe7\xbb\x84\xe7\xbb\x87.hk\0b\xc3\xb8mlo.no\0pizza\0"
-"pp.se\0independent-review.uk\0pp.ru\0"
-"hlx.page\0"
-"coop.tt\0"
-"kitami.hokkaido.jp\0suginami.tokyo.jp\0"
-"med.ec\0malvik.no\0co.za\0bio\0jcloud.ik-server.com\0"
-"minamimaki.nagano.jp\0"
-"med.ee\0"
-"itami.hyogo.jp\0shiojiri.nagano.jp\0tsk.tr\0appudo.net\0"
-"perugia.it\0imakane.hokkaido.jp\0minamidaito.okinawa.jp\0maif\0"
-"mimata.miyazaki.jp\0"
-"hirara.okinawa.jp\0"
-"beauty\0radio.fm\0"
-"biz\0minamiyamashiro.kyoto.jp\0beta.tailscale.net\0"
-"co.zm\0"
-"coop.mv\0"
-"coop.mw\0in-berlin.de\0"
-"nikko.tochigi.jp\0"
-"volyn.ua\0"
-"surgery\0au.eu.org\0be.eu.org\0forumz.info\0pp.ua\0"
-"basketball\0"
-"co.zw\0"
-"show.aero\0"
-"catania.it\0"
-"higashiomi.shiga.jp\0ogasawara.tokyo.jp\0"
-"\xd0\xba\xd0\xbe\xd0\xbc.\xd1\x80\xd1\x83\xd1\x81\0"
-"geek.nz\0"
-"osen.no\0sinaapp.com\0"
-"futtsu.chiba.jp\0"
-"biz.bb\0"
-"n.bg\0"
-"biz.at\0"
-"lib.co.us\0tula.su\0"
-"ehime.jp\0"
-"svn-repos.de\0"
-"\xe6\x96\xb0\xe9\x97\xbb\0"
-"biz.az\0"
-"myqnapcloud.com\0"
-"contact\0"
-"bygland.no\0"
-"delhi.in\0narita.chiba.jp\0"
-"pvt.ge\0r\xc3\xb8st.no\0fentiger.mythic-beasts.com\0"
-"kagawa.jp\0"
-"gb.net\0"
-"h\xc3\xa1""bmer.no\0coop.py\0"
-"med.ht\0"
-"averoy.no\0bms\0ap-northeast-2.elasticbeanstalk.com\0"
-"*.webhare.dev\0"
-"deporte.bo\0\xc3\xb8rsta.no\0"
-"bmw\0from-ca.com\0"
-"omi.niigata.jp\0datsun\0"
-"biz.cy\0"
-"biz.dk\0"
-"salerno.it\0"
-"bg.eu.org\0"
-"trondheim.no\0"
-"rygge.no\0"
-"teo.br\0s\xc3\xbc""dtirol.it\0"
-"is-a-nurse.com\0"
-"tsuno.miyazaki.jp\0"
-"honefoss.no\0bom\0"
-"isshiki.aichi.jp\0"
-"boo\0"
-"hayashima.okayama.jp\0report\0"
-"coop.km\0"
-"bot\0"
-"yokkaichi.mie.jp\0takatori.nara.jp\0"
-"biz.et\0box\0"
-"nh.us\0"
-"wada.nagano.jp\0"
-"kvitsoy.no\0k12.dc.us\0"
-"biz.fj\0"
-"coupons\0lima.zone\0"
-"molise.it\0ascolipiceno.it\0\xe5\x85\xac\xe7\x9b\x8a\0"
-"cab\0primetel.cloud\0"
-"hitachiomiya.ibaraki.jp\0shimotsuke.tochigi.jp\0"
-"otsuka\0issmarterthanyou.com\0"
-"\xc3\xb8rland.no\0lt.ua\0is-a-conservative.com\0"
-"*.compute.amazonaws.com.cn\0"
-"duckdns.org\0"
-"cal\0"
-"cam\0lk3.ru\0"
-"se.gov.br\0biz.gl\0"
-"cba\0dclk\0"
-"car\0"
-"muosat.no\0marnardal.no\0"
-"cat\0"
-"med.ly\0sandefjord.no\0"
-"ota.gunma.jp\0"
-"gs.hl.no\0"
-"takahama.fukui.jp\0"
-"md.us\0"
-"kakuda.miyagi.jp\0wake.okayama.jp\0\xe3\x82\xb9\xe3\x83\x88\xe3\x82\xa2\0"
-"2.bg\0veg\xc3\xa5rshei.no\0"
-"toki.gifu.jp\0cbn\0\xe5\x85\xab\xe5\x8d\xa6\0"
-"r\xc3\xa1hkker\xc3\xa1vju.no\0lib.ak.us\0"
-"credit\0"
-"ba.gov.br\0nogata.fukuoka.jp\0toho.fukuoka.jp\0"
-"vestre-toten.no\0cbs\0"
-"obuse.nagano.jp\0"
-"attorney\0gentlentapis.com\0"
-"vi.it\0"
-"biz.id\0"
-"snoasa.no\0"
-"ownip.net\0"
-"thingdustdata.com\0"
-"experts-comptables.fr\0komagane.nagano.jp\0yonabaru.okinawa.jp\0"
-"luxury\0"
-"taishi.hyogo.jp\0"
-"biz.in\0"
-"hamamatsu.shizuoka.jp\0"
-"azurestaticapps.net\0"
-"ako.hyogo.jp\0"
-"med.om\0oracle\0"
-"bostik\0"
-"med.pa\0"
-"skierva.no\0from-ri.com\0"
-"tas.au\0"
+"lukow.pl\0"
+"vision\0"
+"rahkkeravju.no\0temasek\0"
+"kurogi.fukuoka.jp\0chiyoda.gunma.jp\0embetsu.hokkaido.jp\0gyeongbuk.kr\0"
+"hikone.shiga.jp\0oguni.yamagata.jp\0"
+"gucci\0fldrv.com\0"
+"mitsue.nara.jp\0dvr\0"
+"oyamazaki.kyoto.jp\0"
+"press.cy\0s3-website.dualstack.ap-northeast-3.amazonaws.com\0"
+"s3-accesspoint.cn-north-1.amazonaws.com.cn\0"
+"cloudns.org\0"
+"kawanehon.shizuoka.jp\0"
+"oppegard.no\0emrappui-prod.ap-southeast-1.amazonaws.com\0s3-accesspoint.dualstack.us-gov-west-1.amazonaws.com\0"
+"na.it\0best\0"
+"from-de.com\0"
+"shoparena.pl\0edu.scot\0"
+"jorpeland.no\0songdalen.no\0barrell-of-knowledge.info\0"
+"milan.it\0nogata.fukuoka.jp\0"
+"rimini.it\0"
+"shoes\0"
+"auto\0"
+"broke-it.net\0"
+"compare\0hlx.live\0"
+"omachi.saga.jp\0"
+"jp.eu.org\0"
+"editorx.io\0"
+"oki.fukuoka.jp\0"
+"insure\0"
+"id.au\0"
+"mc.it\0"
+"of.no\0"
+"knx-server.net\0"
+"minamitane.kagoshima.jp\0"
+"ventures\0s3-object-lambda.ap-south-1.amazonaws.com\0"
+"minamiyamashiro.kyoto.jp\0"
+"sorum.no\0"
+"aeroport.fr\0"
+"g\xc3\xbcnstigliefern.de\0"
+"mx.na\0from-ri.com\0"
+"gv.ao\0"
+"krym.ua\0cleverapps.io\0"
+"gv.at\0trento.it\0"
+"aircraft.aero\0"
+"le.it\0shikatsu.aichi.jp\0hanamaki.iwate.jp\0"
+"dyndns-work.com\0"
+"auth-fips.us-west-1.amazoncognito.com\0"
+"forum\0"
+"bozen.it\0kaminoyama.yamagata.jp\0"
+"ddnslive.com\0"
+"lexus\0na4u.ru\0"
+"nango.fukushima.jp\0"
+"ambulance.aero\0"
+"for-more.biz\0"
+"physio\0"
+"instances.spawn.cc\0"
+"s3-fips.dualstack.us-gov-west-1.amazonaws.com\0phx.enscaled.us\0"
+"babymilk.jp\0"
+"point2this.com\0"
+"go.ci\0"
+"hamada.shimane.jp\0health.vn\0"
+"lib.co.us\0readmyblog.org\0"
+"aogaki.hyogo.jp\0"
+"pr.us\0"
+"berlin\0"
+"qoto.io\0"
+"trafficplex.cloud\0"
+"co.business\0"
+"go.cr\0"
+"company\0events\0s3-accesspoint-fips.us-gov-west-1.amazonaws.com\0"
+"\xd0\xba\xd0\xbe\xd0\xbc\0"
+"s3-object-lambda.il-central-1.amazonaws.com\0"
+"builders\0"
+"lib.ct.us\0"
+"s\xc3\xb8rfold.no\0"
+"hokuto.hokkaido.jp\0onion\0"
+"s3-accesspoint-fips.dualstack.us-gov-east-1.amazonaws.com\0"
+"kg.kr\0"
+"mikasa.hokkaido.jp\0"
+"sci.eg\0jp.kg\0"
+"quangtri.vn\0ciao.jp\0"
+"sandefjord.no\0"
+"milano.it\0es.leg.br\0"
+"s3-website.eu-central-1.amazonaws.com\0s3-accesspoint.dualstack.eu-west-1.amazonaws.com\0"
+"boutique\0"
+"boutir.com\0"
+"es.ax\0"
+"niki.hokkaido.jp\0ando.nara.jp\0"
+"bardu.no\0"
+"pi.gov.br\0bologna.it\0yawata.kyoto.jp\0"
+"fj.cn\0"
+"moscow\0"
+"space-to-rent.com\0"
+"no-ip.org\0"
+"\xe6\x94\xbf\xe5\xba\x9c\0serveftp.net\0"
+"s3.eu-central-2.amazonaws.com\0servehttp.com\0"
+"zuerich\0"
+"n\xc3\xa6r\xc3\xb8y.no\0scholarships\0"
+"iwanuma.miyagi.jp\0immobilien\0jp.md\0"
+"dyndns.tv\0khplay.nl\0"
+"ingatlan.hu\0nv.us\0"
+"kanonji.kagawa.jp\0"
+"s3-website.eu-west-1.amazonaws.com\0"
+"id.ir\0auto.pl\0"
+"neko.am\0"
+"lyngen.no\0filegear-ie.me\0dynvpn.de\0"
+"fed.us\0glug.org.uk\0"
+"miyako.fukuoka.jp\0oketo.hokkaido.jp\0fan\0versus.jp\0"
+"alessandria.it\0"
+"sa.ngrok.io\0"
+"yokkaichi.mie.jp\0"
+"auth.eu-west-2.amazoncognito.com\0est-a-la-maison.com\0"
+"natori.miyagi.jp\0"
+"rennebu.no\0nh.us\0"
+"siena.it\0"
+"go.id\0"
+"s3-us-gov-west-1.amazonaws.com\0"
+"nishihara.okinawa.jp\0"
+"hamaroy.no\0*.sa-east-1.airflow.amazonaws.com\0notebook.eu-west-1.sagemaker.aws\0"
+"k8s.pl-waw.scw.cloud\0"
+"trentinsudtirol.it\0execute-api.cn-northwest-1.amazonaws.com.cn\0"
+"faststacks.net\0"
+"\xd0\xb1\xd0\xb3\0"
+"\xe9\x95\xb7\xe9\x87\x8e.jp\0kaga.ishikawa.jp\0kawagoe.mie.jp\0\xd9\xbe\xd8\xa7\xda\xa9\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0"
+"esq\0dyndns.ws\0"
+"dedyn.io\0"
+"go.it\0"
+"tselinograd.su\0"
+"sel.no\0sells-for-u.com\0"
 "agro.bj\0"
-"hr.eu.org\0"
-"homelinux.com\0editorx.io\0"
-"edgekey.net\0"
+"fusa.no\0"
+"sumoto.hyogo.jp\0id.lv\0parasite.jp\0"
 "agro.bo\0"
-"rdy.jp\0med.pl\0"
-"tosu.saga.jp\0"
-"toyone.aichi.jp\0hiraya.nagano.jp\0"
-"biz.ki\0onfabrica.com\0"
-"wnext.app\0"
-"ceo\0"
-"adm.br\0prd.fr\0barsy.club\0"
-"loppa.no\0cfa\0"
-"l\xc3\xa1hppi.no\0steinkjer.no\0in-vpn.de\0servep2p.com\0"
-"cfd\0"
-"fitness\0"
-"buy\0is-a-chef.org\0"
-"blog.gt\0"
-"pe.ca\0r\xc3\xb8mskog.no\0pdns.page\0"
-"ishikawa.okinawa.jp\0"
-"is-a-landscaper.com\0"
-"64-b.it\0"
-"ritto.shiga.jp\0"
-"biz.ls\0dyn-o-saur.com\0"
-"doesntexist.com\0"
-"ta.it\0nagasaki.nagasaki.jp\0sa.gov.pl\0"
-"bt.it\0meiwa.gunma.jp\0kasumigaura.ibaraki.jp\0chino.nagano.jp\0"
-"med.sa\0"
-"salvador.br\0med.sd\0"
-"akishima.tokyo.jp\0"
-"bryne.no\0sogne.no\0"
-"dupont\0"
-"demo.datadetect.com\0couchpotatofries.org\0"
+"id.ly\0name\0aure.no\0family\0"
+"go.jp\0"
+"br\xc3\xb8nn\xc3\xb8ysund.no\0"
+"shirahama.wakayama.jp\0"
+"go.ke\0tuxfamily.org\0"
+"koshu.yamanashi.jp\0"
+"lib.al.us\0is-a-democrat.com\0"
+"forsand.no\0game\0"
+"trentino-stirol.it\0kanegasaki.iwate.jp\0"
+"go.kr\0seoul.kr\0\xe9\x9b\x86\xe5\x9b\xa2\0"
+"eus\0"
+"edgesuite.net\0"
+"cremona.it\0"
+"musashimurayama.tokyo.jp\0"
+"sakahogi.gifu.jp\0undo.jp\0"
+"utazas.hu\0"
+"dr\xc3\xb8""bak.no\0s\xc3\xb8mna.no\0"
+"kusatsu.gunma.jp\0"
+"madrid\0"
+"hm.no\0g\xc3\xa1\xc5\x8bgaviika.no\0redumbrella\0is-a-patsfan.org\0"
+"showa.yamanashi.jp\0rybnik.pl\0\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe\0"
+"*.nagoya.jp\0\xe5\x8f\xb0\xe6\xb9\xbe\0web.app\0"
+"cal.it\0fukushima.jp\0"
+"priv.hu\0"
+"muika.niigata.jp\0"
+"nesna.no\0"
+"fc.it\0"
+"marine.ru\0"
+"gru.br\0lolipopmc.jp\0"
+"nahari.kochi.jp\0niyodogawa.kochi.jp\0tamayu.shimane.jp\0"
+"drangedal.no\0holmestrand.no\0"
+"pe.gov.br\0"
+"execute-api.us-east-2.amazonaws.com\0"
+"tahara.aichi.jp\0kepno.pl\0"
+"averoy.no\0s3.dualstack.eu-west-2.amazonaws.com\0"
+"qa2.com\0"
+"ino.kochi.jp\0"
+"\xc4\x8d\xc3\xa1hcesuolo.no\0"
+"from-sd.com\0"
+"wakayama.wakayama.jp\0"
+"*.devcdnaccesso.com\0"
+"sveio.no\0herokussl.com\0"
+"am.br\0"
+"ddns5.com\0"
+"iide.yamagata.jp\0\xd0\xb5\xd1\x8e\0""123paginaweb.pt\0"
+"es.kr\0"
+"pantheonsite.io\0"
+"e4.cz\0"
+"hattfjelldal.no\0"
+"\xe4\xbd\x90\xe8\xb3\x80.jp\0"
+"press.se\0"
+"fit\0podzone.net\0gloomy.jp\0"
+"tomakomai.hokkaido.jp\0*.migration.run\0"
+"fedorainfracloud.org\0"
+"ishinomaki.miyagi.jp\0"
+"hostyhosting.io\0"
+"nl-ams-1.baremetal.scw.cloud\0"
+"s3.dualstack.ap-south-1.amazonaws.com\0notebook.ca-central-1.sagemaker.aws\0"
+"grue.no\0"
+"torahime.shiga.jp\0"
+"haram.no\0"
+"\xd8\xa8\xda\xbe\xd8\xa7\xd8\xb1\xd8\xaa\0"
+"dattolocal.net\0alp1.ae.flow.ch\0o0o0.jp\0"
+"go.pw\0service.one\0devices.resinstaging.io\0"
+"versicherung\0"
+"forde.no\0mcpre.ru\0"
+"monzabrianza.it\0"
+"edugit.io\0"
+"abbott\0"
+"kitchen\0"
+"creditunion\0"
+"rennesoy.no\0"
+"sannohe.aomori.jp\0nakanojo.gunma.jp\0"
+"eaton.mi.us\0eero.online\0customer.mythic-beasts.com\0"
+"priv.at\0"
+"s3-object-lambda.sa-east-1.amazonaws.com\0"
+"miyazaki.miyazaki.jp\0"
+"lakas.hu\0"
+"gs.va.no\0"
+"porsangu.no\0s3.ca-central-1.amazonaws.com\0"
+"ci.it\0azurewebsites.net\0"
+"obira.hokkaido.jp\0"
+"bindal.no\0tours\0community-pro.de\0"
+"id.us\0fly\0"
+"nishiwaki.hyogo.jp\0"
+"tsuga.tochigi.jp\0turystyka.pl\0"
+"free\0"
+"palmas.br\0br.it\0cb.it\0pa.gov.pl\0"
+"gifu.gifu.jp\0"
+"id.vn\0servers.run\0"
+"narvik.no\0"
+"kimino.wakayama.jp\0go.th\0"
+"orland.no\0tickets\0execute-api.ap-northeast-2.amazonaws.com\0emrstudio-prod.us-east-1.amazonaws.com\0bnr.la\0"
+"yamato.kumamoto.jp\0go.tj\0"
+"s3-accesspoint-fips.us-east-1.amazonaws.com\0"
+"mutsuzawa.chiba.jp\0kakinoki.shimane.jp\0"
+"nome.cv\0"
+"is.eu.org\0"
+"psse.gov.pl\0"
+"navy\0"
+"gv.vc\0"
+"maizuru.kyoto.jp\0"
+"go.ug\0"
+"asaminami.hiroshima.jp\0"
+"*.dev.adobeaemcloud.com\0"
+"at.it\0go.tz\0"
+"\xe6\x84\x9b\xe5\xaa\x9b.jp\0kamakura.kanagawa.jp\0landrover\0"
+"webview-assets.aws-cloud9.eu-west-3.amazonaws.com\0"
+"shingu.fukuoka.jp\0hirata.fukushima.jp\0"
+"press.ma\0foo\0"
+"am.in\0"
+"rio.br\0taki.mie.jp\0"
+"matsuyama.ehime.jp\0williamhill\0"
+"b\xc3\xa6rum.no\0"
+"fox\0"
+"poivron.org\0"
+"authgear-staging.com\0"
+"venice.it\0"
+"bahcavuotna.no\0s3-website-us-west-2.amazonaws.com\0"
+"perspecta.cloud\0onporter.run\0"
+"it.eu.org\0"
+"incheon.kr\0"
+"framer.photos\0"
+"sumomo.ne.jp\0"
+"!city.kawasaki.jp\0saikai.nagasaki.jp\0"
 "dealer\0"
-"saitama.saitama.jp\0"
-"isteingeek.de\0"
-"ishikari.hokkaido.jp\0kamoenai.hokkaido.jp\0nanto.toyama.jp\0biz.mv\0"
-"association.aero\0biz.mw\0"
-"pol.dz\0"
-"biz.my\0biz.ni\0"
-"oksnes.no\0k12.or.us\0lib.nh.us\0"
-"blog.bo\0"
-"biz.nr\0"
-"blog.br\0fashion\0"
-"*.on-acorn.io\0"
-"rm.it\0"
-"ooguy.com\0"
-"ap.it\0"
-"profesional.bo\0"
-"futurehosting.at\0"
-"shingu.fukuoka.jp\0mysecuritycamera.net\0"
-"accenture\0"
-"bzh\0"
-"repbody.aero\0"
-"kadogawa.miyazaki.jp\0futuremailing.at\0"
-"prd.km\0"
-"ginoza.okinawa.jp\0run.app\0"
-"kujukuri.chiba.jp\0boston\0"
-"biz.pk\0"
-"komoro.nagano.jp\0biz.pl\0"
-"exchange.aero\0"
-"am.gov.br\0"
-"k12.nv.us\0webview-assets.cloud9.ap-northeast-1.amazonaws.com\0"
-"biz.pr\0"
-"ngrok.app\0"
-"geo.br\0"
-"sm\xc3\xb8la.no\0"
-"chiba.jp\0"
-"cc.wa.us\0from-vt.com\0"
-"northwesternmutual\0"
-"is-a-chef.com\0"
-"shintomi.miyazaki.jp\0"
-"prd.mg\0avianca\0"
-"pol.ht\0"
-"tsu.mie.jp\0misato.wakayama.jp\0"
-"lenug.su\0"
-"router.management\0"
-"santamaria.br\0komae.tokyo.jp\0chungnam.kr\0"
-"zgora.pl\0\xe5\x85\xac\xe5\x8f\xb8\0njs.jelastic.vps-host.net\0"
-"reservd.dev.thingdust.io\0"
-"jobs\0"
-"n.se\0compare\0"
-"k12.nj.us\0"
+"gal\0"
+"ga.us\0vfs.cloud9.ap-south-1.amazonaws.com\0"
+"gap\0"
+"cc.va.us\0"
+"kawagoe.saitama.jp\0"
+"grane.no\0donetsk.ua\0af-south-1.elasticbeanstalk.com\0"
+"pr.gov.br\0"
+"codes\0"
+"gay\0"
+"fujisato.akita.jp\0squares.net\0at.md\0"
+"frl\0"
+"execute-api.me-south-1.amazonaws.com\0"
+"avocats.bj\0avellino.it\0"
+"beardu.no\0s3-accesspoint.ap-south-2.amazonaws.com\0cechire.com\0"
+"lecco.it\0tsuruta.aomori.jp\0\xe4\xbc\x81\xe4\xb8\x9a\0"
+"shimoda.shizuoka.jp\0gbiz\0"
+"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd9\x87\0"
+"misato.saitama.jp\0"
+"juniper\0\xe7\xbd\x91\xe7\xbb\x9c\0pages.dev\0"
+"from-ut.com\0"
+"execute-api.eu-south-1.amazonaws.com\0"
+"\xd1\x80\xd1\x84\0"
+"protection\0"
+"tashkent.su\0wixsite.com\0"
+"\xe8\xb0\xb7\xe6\xad\x8c\0"
+"linkyard.cloud\0"
+"bashkiria.ru\0"
+"kashima.ibaraki.jp\0kitamoto.saitama.jp\0"
+"space\0tele.amune.org\0"
+"mat.br\0traniandriabarletta.it\0gdn\0co.financial\0"
+"gea\0in.eu.org\0"
+"olbiatempio.it\0asahi.mie.jp\0ftr\0"
+"dn.ua\0"
+"ikata.ehime.jp\0miyako.iwate.jp\0"
+"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd8\xa9\0"
+"bashkiria.su\0"
+"kharkiv.ua\0notebook-fips.us-west-2.sagemaker.aws\0studio.eu-south-1.sagemaker.aws\0"
+"hasami.nagasaki.jp\0kitadaito.okinawa.jp\0goldpoint\0"
+"fun\0"
+"k12.va.us\0"
+"yuzawa.niigata.jp\0"
+"s3-object-lambda.ap-southeast-4.amazonaws.com\0jelastic.regruhosting.ru\0"
+"pors\xc3\xa1\xc5\x8bgu.no\0"
+"\xd7\xa6\xd7\x94\xd7\x9c.\xd7\x99\xd7\xa9\xd7\xa8\xd7\x90\xd7\x9c\0assabu.hokkaido.jp\0"
+"musician.io\0"
+"lucca.it\0"
+"notebook.sa-east-1.sagemaker.aws\0"
+"maintenance.aero\0"
+"k12.ut.us\0"
+"wroc.pl\0"
+"eu-north-1.elasticbeanstalk.com\0"
+"monza-e-della-brianza.it\0"
+"lahppi.no\0is-an-entertainer.com\0"
+"malbork.pl\0"
+"gr.com\0"
+"rep.br\0numata.gunma.jp\0"
+"s3-website.us-east-2.amazonaws.com\0"
+"smola.no\0"
+"s3-accesspoint.ap-southeast-1.amazonaws.com\0"
+"shimotsuke.tochigi.jp\0"
+"hockey\0georgia.su\0"
+"bd.se\0"
+"k12.tn.us\0""611.to\0"
+"kanoya.kagoshima.jp\0"
+"hokksund.no\0cc.ri.us\0"
+"s3.eu-north-1.amazonaws.com\0"
+"ikeda.gifu.jp\0"
+"suginami.tokyo.jp\0shopselect.net\0s3.pl-waw.scw.cloud\0"
+"fyi\0"
+"rzgw.gov.pl\0"
+"vegas\0"
+"\xd0\xbc\xd0\xba\xd0\xb4\0"
+"memset.net\0"
+"b\xc3\xb8mlo.no\0villas\0"
+"carbonia-iglesias.it\0"
+"keymachine.de\0"
+"sande.more-og-romsdal.no\0sykkylven.no\0"
+"vfs.cloud9.us-east-1.amazonaws.com\0"
+"agro.pl\0"
+"academia.bo\0"
+"joso.ibaraki.jp\0"
+"contagem.br\0miyashiro.saitama.jp\0"
+"stor-elvdal.no\0"
+"fr\xc3\xa6na.no\0"
+"uchinomi.kagawa.jp\0"
+"balat.no\0"
+"taira.toyama.jp\0"
+"s3-ap-northeast-3.amazonaws.com\0misconfused.org\0at.vg\0"
+"adobeio-static.net\0"
+"my-vigor.de\0"
+"fukui.jp\0"
+"*.compute-1.amazonaws.com\0"
+"bluebite.io\0"
+"gle\0"
+"\xe5\xaf\x8c\xe5\xb1\xb1.jp\0haiphong.vn\0"
+"kamogawa.chiba.jp\0mashiki.kumamoto.jp\0kamikitayama.nara.jp\0"
+"no-ip.net\0"
+"studio-fips.us-gov-east-1.sagemaker.aws\0"
+"career\0"
+"aukra.no\0"
+"naganohara.gunma.jp\0"
+"s3-website.ap-east-1.amazonaws.com\0pyatigorsk.ru\0"
+"notebook.eu-central-2.sagemaker.aws\0"
+"holiday\0"
+"mihama.wakayama.jp\0"
+"s3-object-lambda.ap-northeast-1.amazonaws.com\0"
+"is-a-student.com\0kalmykia.su\0"
+"la-spezia.it\0"
+"s3-object-lambda.ap-east-1.amazonaws.com\0from-nm.com\0hk.org\0"
+"gmo\0"
+"ebiz.tw\0"
+"tra.kp\0"
+"\xd0\xbc\xd0\xbe\xd0\xbd\0"
+"kopervik.no\0"
+"toyama.jp\0kiryu.gunma.jp\0minamiawaji.hyogo.jp\0gmx\0"
+"adobeaemcloud.com\0myfast.space\0"
+"v.bg\0"
+"priv.pl\0"
+"haga.tochigi.jp\0cheap\0group\0"
+"cc.oh.us\0yodobashi\0"
+"international\0"
+"lindas.no\0"
+"mitou.yamaguchi.jp\0"
+"hungyen.vn\0whitesnow.jp\0"
+"o.bg\0"
+"\xd0\xbe\xd1\x80\xd0\xb3.\xd1\x81\xd1\x80\xd0\xb1\0goo\0s3-object-lambda.eu-west-1.amazonaws.com\0"
+"gop\0"
+"vadso.no\0"
+"co.krd\0"
+"homegoods\0"
+"got\0"
+"emrnotebooks-prod.eu-central-1.amazonaws.com\0"
+"gov\0kawatana.nagasaki.jp\0hachijo.tokyo.jp\0s3.isk02.sakurastorage.jp\0"
+"ui.nabu.casa\0"
+"repl.run\0"
+"h.bg\0kalmykia.ru\0"
+"yame.fukuoka.jp\0"
+"rdy.jp\0"
+"cc.nj.us\0"
+"kamikawa.hokkaido.jp\0rep.kp\0execute-api.cn-north-1.amazonaws.com.cn\0"
+"priv.no\0"
+"alta.no\0"
+"date.hokkaido.jp\0"
+"a.bg\0fitjar.no\0movie\0c.cdn77.org\0"
+"nikon\0"
+"matsumoto.nagano.jp\0instantcloud.cn\0"
+"toon.ehime.jp\0"
+"cc.ms.us\0cc.nc.us\0"
+"shirosato.ibaraki.jp\0po.gov.pl\0"
+"barcelona\0"
+"g.vbrplsbx.io\0"
+"yukuhashi.fukuoka.jp\0kameoka.kyoto.jp\0kyotamba.kyoto.jp\0"
+"s3-object-lambda.ca-central-1.amazonaws.com\0"
+"tromso.no\0"
+"aquila.it\0"
+"birkenes.no\0"
+"isernia.it\0tamakawa.fukushima.jp\0kitahata.saga.jp\0"
+"hbo\0"
+"trentinoalto-adige.it\0"
+"agric.za\0secure\0"
+"higashisumiyoshi.osaka.jp\0travel.pl\0"
+"yoro.gifu.jp\0"
+"chernigov.ua\0k12.or.us\0"
+"musashino.tokyo.jp\0"
+"notebook.ap-south-1.sagemaker.aws\0"
+"notebook.cn-northwest-1.sagemaker.com.cn\0"
+"priv.me\0cc.me.us\0dreamhosters.com\0"
+"okegawa.saitama.jp\0lubin.pl\0\xe6\x85\x88\xe5\x96\x84\0"
+"chikujo.fukuoka.jp\0nome.pt\0"
+"orskog.no\0"
+"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86.ir\0"
+"hasvik.no\0s3-accesspoint.ap-northeast-1.amazonaws.com\0"
+"osakikamijima.hiroshima.jp\0"
+"ass.km\0"
+"saloon.jp\0"
+"tranby.no\0"
+"nakayama.yamagata.jp\0"
+"ntr.br\0sondrio.it\0tsuyama.okayama.jp\0"
+"eidsberg.no\0edeka\0"
+"sport.hu\0serveftp.org\0"
+"ecommerce-shop.pl\0"
+"hirokawa.fukuoka.jp\0"
+"akamaiorigin-staging.net\0"
+"\xe5\x8f\xb0\xe7\x81\xa3\0"
+"nisshin.aichi.jp\0"
+"k12.ok.us\0"
+"biella.it\0"
+"pics\0tlon.network\0"
+"tarama.okinawa.jp\0fujimi.saitama.jp\0"
+"bounty-full.com\0"
+"lazio.it\0\xd8\xb3\xd9\x88\xd8\xaf\xd8\xa7\xd9\x86\0"
+"otsuka\0podzone.org\0"
+"yashiro.hyogo.jp\0kurobe.toyama.jp\0"
+"kiso.nagano.jp\0"
+"7.bg\0"
+"akabira.hokkaido.jp\0psp.gov.pl\0"
+"k12.mn.us\0s3-website.dualstack.ap-southeast-2.amazonaws.com\0"
+"*.stolos.io\0"
+"wien\0deci.jp\0"
+"cloud\0"
+"directory\0ddnss.de\0"
+"kamigori.hyogo.jp\0seika.kyoto.jp\0"
+"s3-website.dualstack.cn-north-1.amazonaws.com.cn\0"
+"nagai.yamagata.jp\0noho.st\0"
+"0.bg\0s3-ap-southeast-1.amazonaws.com\0"
+"kita.kyoto.jp\0travel.tt\0senseering.net\0"
+"k12.nm.us\0"
+"hamatonbetsu.hokkaido.jp\0"
+"s3-accesspoint.dualstack.sa-east-1.amazonaws.com\0"
+"assur.bj\0asahi.yamagata.jp\0"
+"r\xc3\xb8yrvik.no\0s3-deprecated.eu-west-1.amazonaws.com\0"
+"draydns.de\0"
+"algard.no\0caracal.mythic-beasts.com\0"
+"wedding\0forgot.her.name\0"
+"git-pages.rit.edu\0"
+"emrstudio-prod.us-gov-west-1.amazonaws.com\0dnsdojo.com\0"
+"it.com\0"
+"xerox\0"
+"fortal.br\0jelastic.tsukaeru.net\0"
+"synology-ds.de\0"
+"sakura\0"
+"tokai.ibaraki.jp\0taito.tokyo.jp\0"
+"pueblo.bo\0"
+"namerikawa.toyama.jp\0"
+"poltava.ua\0dd-dns.de\0"
+"trentinoa-adige.it\0otsu.shiga.jp\0"
 "satsumasendai.kagoshima.jp\0"
-"boleslawiec.pl\0"
-"pe.it\0"
-"b\xc3\xa5tsfjord.no\0"
-"land-4-sale.us\0"
-"tmp.br\0jele.cloud\0"
-"\xd1\x81\xd0\xbf\xd0\xb1.\xd1\x80\xd1\x83\xd1\x81\0"
-"biz.ss\0"
-"webview-assets.aws-cloud9.eu-west-2.amazonaws.com\0"
-"numata.hokkaido.jp\0baseball\0"
-"stockholm\0"
-"biz.tj\0"
-"square7.de\0crd.co\0"
-"asso.fr\0"
-"from-nh.com\0"
-"rauma.no\0"
-"vi.us\0biz.ua\0"
-"liguria.it\0minamiise.mie.jp\0biz.tr\0"
-"whoswho\0"
-"biz.tt\0"
-"matsumoto.nagano.jp\0"
-"com\0"
-"asso.gp\0pe.kr\0"
-"is-a-photographer.com\0"
-"kiwi.nz\0hungry.jp\0"
-"cpa\0"
-"\xe6\x96\xb0\xe6\xbd\x9f.jp\0hicam.net\0"
-"neko.am\0"
-"cx.ua\0"
-"izumizaki.fukushima.jp\0"
-"demo.jelastic.com\0"
-"fukuchi.fukuoka.jp\0"
-"pinoko.jp\0"
-"shijonawate.osaka.jp\0"
-"hopto.me\0"
-"ap.gov.br\0asso.ht\0biz.vn\0design\0"
-"apartments\0"
-"nichinan.tottori.jp\0dad\0pfizer\0"
-"kudamatsu.yamaguchi.jp\0"
-"agents.aero\0volda.no\0firewalledreplit.co\0"
-"piemonte.it\0sarufutsu.hokkaido.jp\0schokokeks.net\0"
-"forsand.no\0"
-"*.user.localcert.dev\0biz.wf\0"
-"studio\0"
-"\xe7\xbe\xa4\xe9\xa6\xac.jp\0"
-"baby\0"
-"dunlop\0square7.ch\0"
-"melhus.no\0deatnu.no\0toolforge.org\0"
-"vanguard\0"
-"saltdal.no\0"
-"yusui.kagoshima.jp\0yamato.kanagawa.jp\0"
-"company\0day\0"
-"dovre.no\0h\xc3\xa5.no\0cloudns.eu\0"
-"ap.gov.pl\0"
-"rehab\0"
-"fuji.shizuoka.jp\0"
-"s3-website.pl-waw.scw.cloud\0"
-"crs\0"
-"asso.ci\0dvrdns.org\0"
-"olayangroup\0"
-"dep.no\0"
-"kosher\0"
-"fuettertdasnetz.de\0"
-"s3.teckids.org\0"
-"himeji.hyogo.jp\0"
-"ftpaccess.cc\0"
-"xz.cn\0"
-"tokke.no\0"
-"li.it\0shimamoto.osaka.jp\0\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86\0"
-"home-webserver.de\0"
-"sannan.hyogo.jp\0"
-"yalta.ua\0public-inquiry.uk\0"
-"kvinesdal.no\0randaberg.no\0koobin.events\0"
-"ookuwa.nagano.jp\0"
-"biz.zm\0windows\0"
-"hirosaki.aomori.jp\0ntdll.top\0"
-"dds\0"
-"loabat.no\0"
+"s3-object-lambda.ap-southeast-3.amazonaws.com\0s3-accesspoint-fips.dualstack.us-west-2.amazonaws.com\0"
+"hiv\0"
+"execute-api.ap-southeast-4.amazonaws.com\0paas.datacenter.fi\0"
+"rygge.no\0"
+"babia-gora.pl\0"
+"\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\x9f\0"
+"shimosuwa.nagano.jp\0"
+"engerdal.no\0"
+"k12.ky.us\0\xe5\x81\xa5\xe5\xba\xb7\0"
+"ssl.origin.cdn77-secure.org\0"
+"royal-commission.uk\0"
+"heroy.nordland.no\0from-nh.com\0"
+"diskussionsbereich.de\0"
+"pr.gov.pl\0r.cdn77.net\0"
+"is-a-therapist.com\0"
+"tokashiki.okinawa.jp\0yoshida.shizuoka.jp\0westus2.azurestaticapps.net\0"
+"konsulat.gov.pl\0"
+"m\xc3\xa5s\xc3\xb8y.no\0"
+"hashikami.aomori.jp\0hkt\0"
+"dscloud.me\0"
+"sue.fukuoka.jp\0tsubata.ishikawa.jp\0"
+"skierva.no\0notebook.ap-southeast-2.sagemaker.aws\0"
+"oita.oita.jp\0dontexist.net\0"
+"wiki\0"
+"des.br\0"
+"blackfriday\0"
+"ar.com\0fentiger.mythic-beasts.com\0dsmynas.com\0"
+"onna.okinawa.jp\0"
+"nysa.pl\0"
+"s3-accesspoint-fips.ca-central-1.amazonaws.com\0"
+"aarborte.no\0"
+"matsumoto.kagoshima.jp\0tonaki.okinawa.jp\0"
+"barrel-of-knowledge.info\0"
+"cs.keliweb.cloud\0"
+"zj.cn\0zentsuji.kagawa.jp\0"
+"equipment\0"
+"fjaler.no\0lynx.mythic-beasts.com\0"
+"emrnotebooks-prod.sa-east-1.amazonaws.com\0"
+"okayama.jp\0"
+"\xe6\x94\xbf\xe5\xba\x9c.hk\0b\xc3\xa1id\xc3\xa1r.no\0"
+"adult\0flop.jp\0"
+"krager\xc3\xb8.no\0official.ec\0"
+"trentin-sudtirol.it\0jinsekikogen.hiroshima.jp\0"
+"bike\0"
+"yugawa.fukushima.jp\0"
+"tado.mie.jp\0"
+"romskog.no\0valle.no\0wine\0za.com\0"
+"iwate.jp\0\xd8\xa7\xd9\x84\xd8\xa8\xd8\xad\xd8\xb1\xd9\x8a\xd9\x86\0"
+"hazu.aichi.jp\0"
+"koganei.tokyo.jp\0kicks-ass.net\0hippy.jp\0"
+"valledaosta.it\0"
+"school.na\0"
+"yoshikawa.saitama.jp\0hot\0"
+"lib.vi.us\0s3-fips.us-gov-west-1.amazonaws.com\0"
+"santamaria.br\0showa.fukushima.jp\0"
+"how\0ping\0"
+"o.se\0cuisinella\0"
+"shiwa.iwate.jp\0"
+"cc.fl.us\0catholic\0pink\0"
+"1.azurestaticapps.net\0"
+"cloud66.ws\0"
+"flap.id\0"
+"pt.eu.org\0"
+"lib.tn.us\0"
+"oristano.it\0"
+"karlsoy.no\0"
+"h.se\0v.ua\0"
+"school.nz\0"
+"apple\0"
+"trentino-a-adige.it\0"
+"mw.gov.pl\0"
+"hara.nagano.jp\0"
+"ddns.me\0"
+"pinb.gov.pl\0"
+"bing\0s3.ap-southeast-1.amazonaws.com\0in-berlin.de\0"
+"uki.kumamoto.jp\0joetsu.niigata.jp\0"
+"plurinacional.bo\0a.se\0docs\0"
+"bari.it\0"
+"bronnoysund.no\0"
+"ohira.tochigi.jp\0"
+"yoga\0"
+"abogado\0"
+"ibm\0emrappui-prod.ap-east-1.amazonaws.com\0"
+"yokawa.hyogo.jp\0"
+"trentino-altoadige.it\0"
+"ice\0"
+"shimizu.hokkaido.jp\0"
+"*.database.run\0"
+"\xe8\x8c\xa8\xe5\x9f\x8e.jp\0"
+"\xd0\xbe\xd1\x80\xd0\xb3.\xd1\x80\xd1\x83\xd1\x81\0"
+"london.cloudapps.digital\0"
+"ibxos.it\0"
+"ms.gov.br\0anjo.aichi.jp\0hagi.yamaguchi.jp\0"
+"asker.no\0icu\0my-firewall.org\0"
+"nishinomiya.hyogo.jp\0website.yandexcloud.net\0"
+"mo\xc3\xa5reke.no\0"
+"sekigahara.gifu.jp\0"
+"barum.no\0homesecuritymac.com\0"
+"\xe7\xb5\x84\xe7\xb9\x94.tw\0"
+"kyotanabe.kyoto.jp\0\xe6\x9c\xba\xe6\x9e\x84\0at-band-camp.net\0"
+"oksnes.no\0"
+"leasing.aero\0"
+"zamami.okinawa.jp\0"
+"kitagata.gifu.jp\0mizunami.gifu.jp\0manno.kagawa.jp\0mitoyo.kagawa.jp\0"
+"lib.sc.us\0crd.co\0"
+"tsuchiura.ibaraki.jp\0"
+"fukuyama.hiroshima.jp\0"
+"gs.ah.no\0"
+"is-a-bruinsfan.org\0"
+"mycd.eu\0"
+"mt.gov.br\0gliwice.pl\0"
+"woodside\0from-tx.com\0"
+"yamagata.nagano.jp\0"
+"leitungsen.de\0"
+"soeda.fukuoka.jp\0"
+"tv.bb\0"
+"niigata.niigata.jp\0"
+"gs.aa.no\0ifm\0"
+"luxury\0"
+"utsunomiya.tochigi.jp\0"
+"fastly-terrarium.com\0"
+"sn\xc3\xa5""ase.no\0webview-assets.cloud9.eu-west-1.amazonaws.com\0ddnsking.com\0"
+"tv.bo\0"
+"tv.br\0hakui.ishikawa.jp\0"
+"maceio.br\0"
+"trentin-s\xc3\xbc""dtirol.it\0tsukuba.ibaraki.jp\0"
+"*.spectrum.myjino.ru\0"
+"uzhhorod.ua\0ca-central-1.elasticbeanstalk.com\0myforum.community\0"
+"adult.ht\0"
+"soccer\0"
+"vfs.cloud9.me-south-1.amazonaws.com\0"
+"kitami.hokkaido.jp\0walter\0"
+"obanazawa.yamagata.jp\0"
+"platter-app.com\0"
+"niigata.jp\0iwaki.fukushima.jp\0"
+"tube\0"
+"urausu.hokkaido.jp\0"
+"lk3.ru\0"
+"press.aero\0"
+"nishiazai.shiga.jp\0abu.yamaguchi.jp\0"
+"leirvik.no\0"
+"greta.fr\0"
+"emrstudio-prod.ap-southeast-1.amazonaws.com\0from-ok.com\0"
+"potenza.it\0"
+"mochizuki.nagano.jp\0nieruchomosci.pl\0search\0"
+"webview-assets.cloud9.ap-southeast-1.amazonaws.com\0"
+"kai.yamanashi.jp\0"
+"uzhgorod.ua\0"
+"sx.cn\0iitate.fukushima.jp\0yachiyo.ibaraki.jp\0suzaka.nagano.jp\0"
+"vang.no\0"
+"africa\0catering\0protonet.io\0"
+"bci.dnstrace.pro\0"
+"wzmiuw.gov.pl\0"
+"from-hi.com\0"
+"shiiba.miyazaki.jp\0"
 };
 
 static const quint16 tldChunkCount = 2;
-static const quint32 tldChunks[] = {65512, 108689};
+static const quint32 tldChunks[] = {65516, 127046};
 
 QT_END_NAMESPACE
 
diff -pruN 5.15.15+dfsg-2/src/corelib/itemmodels/qabstractitemmodel.cpp 5.15.17+dfsg-1/src/corelib/itemmodels/qabstractitemmodel.cpp
--- 5.15.15+dfsg-2/src/corelib/itemmodels/qabstractitemmodel.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/itemmodels/qabstractitemmodel.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -52,6 +52,8 @@
 #include <qdatetime.h>
 #include <qloggingcategory.h>
 
+#include <functional>
+
 #include <limits.h>
 
 QT_BEGIN_NAMESPACE
@@ -213,7 +215,7 @@ bool QPersistentModelIndex::operator<(co
     if (d && other.d)
         return d->index < other.d->index;
 
-    return d < other.d;
+    return std::less<>{}(d, other.d);
 }
 
 /*!
@@ -1327,6 +1329,8 @@ void QAbstractItemModel::resetInternalDa
     rows to the model, \l{QAbstractItemModel::}{beginInsertRows()} and
     \l{QAbstractItemModel::}{endInsertRows()} must be called.
 
+    \include models.qdocinc {thread-safety-section1}{QAbstractItemModel}
+
     \sa {Model Classes}, {Model Subclassing Reference}, QModelIndex,
         QAbstractItemView, {Using drag and drop with item views},
         {Simple DOM Model Example}, {Simple Tree Model Example},
@@ -3576,7 +3580,7 @@ bool QAbstractItemModel::checkIndex(cons
     \note Some general guidelines for subclassing models are available in the
     \l{Model Subclassing Reference}.
 
-    \note
+    \include models.qdocinc {thread-safety-section1}{QAbstractTableModel}
 
     \sa {Model Classes}, QAbstractItemModel, QAbstractListModel,
     {Pixelator Example}
diff -pruN 5.15.15+dfsg-2/src/corelib/kernel/qmetaobject.cpp 5.15.17+dfsg-1/src/corelib/kernel/qmetaobject.cpp
--- 5.15.15+dfsg-2/src/corelib/kernel/qmetaobject.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/kernel/qmetaobject.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -2112,7 +2112,7 @@ QMetaMethod::MethodType QMetaMethod::met
     \since 5.0
 
     Returns the meta-method that corresponds to the given \a signal, or an
-    invalid QMetaMethod if \a signal is not a signal of the class.
+    invalid QMetaMethod if \a signal is \c{nullptr} or not a signal of the class.
 
     Example:
 
diff -pruN 5.15.15+dfsg-2/src/corelib/kernel/qobject.cpp 5.15.17+dfsg-1/src/corelib/kernel/qobject.cpp
--- 5.15.15+dfsg-2/src/corelib/kernel/qobject.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/kernel/qobject.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -2220,6 +2220,9 @@ void QObjectPrivate::setParent_helper(QO
     If multiple event filters are installed on a single object, the
     filter that was installed last is activated first.
 
+    If \a filterObj has already been installed for this object,
+    this function moves it so it acts as if it was installed last.
+
     Here's a \c KeyPressEater class that eats the key presses of its
     monitored objects:
 
diff -pruN 5.15.15+dfsg-2/src/corelib/serialization/qdatastream.cpp 5.15.17+dfsg-1/src/corelib/serialization/qdatastream.cpp
--- 5.15.15+dfsg-2/src/corelib/serialization/qdatastream.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/serialization/qdatastream.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -1008,10 +1008,11 @@ QDataStream &QDataStream::operator>>(qfl
 /*!
     \overload
 
-    Reads the '\\0'-terminated string \a s from the stream and returns
-    a reference to the stream.
+    Reads string \a s from the stream and returns a reference to the stream.
 
-    The string is deserialized using \c{readBytes()}.
+    The string is deserialized using \c{readBytes()} where the serialization
+    format is a \c quint32 length specifier first, followed by that many bytes
+    of data. The resulting string is always '\\0'-terminated.
 
     Space for the string is allocated using \c{new []} -- the caller must
     destroy it with \c{delete []}.
diff -pruN 5.15.15+dfsg-2/src/corelib/text/qregularexpression.cpp 5.15.17+dfsg-1/src/corelib/text/qregularexpression.cpp
--- 5.15.15+dfsg-2/src/corelib/text/qregularexpression.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/text/qregularexpression.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -3127,7 +3127,8 @@ static const char *pcreCompileErrorCodes
     QT_TRANSLATE_NOOP("QRegularExpression", "heap limit exceeded"),
     QT_TRANSLATE_NOOP("QRegularExpression", "invalid syntax"),
     QT_TRANSLATE_NOOP("QRegularExpression", "internal error - duplicate substitution match"),
-    QT_TRANSLATE_NOOP("QRegularExpression", "PCRE2_MATCH_INVALID_UTF is not supported for DFA matching")
+    QT_TRANSLATE_NOOP("QRegularExpression", "PCRE2_MATCH_INVALID_UTF is not supported for DFA matching"),
+    QT_TRANSLATE_NOOP("QRegularExpression", "INTERNAL ERROR: invalid substring offset")
 };
 #endif // #if 0
 
diff -pruN 5.15.15+dfsg-2/src/corelib/thread/qatomic.cpp 5.15.17+dfsg-1/src/corelib/thread/qatomic.cpp
--- 5.15.15+dfsg-2/src/corelib/thread/qatomic.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/thread/qatomic.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -68,8 +68,8 @@
     The template parameter \c T must be a C++ integer type:
     \list
        \li 8-bit: bool, char, signed char, unsigned char, qint8, quint8, char8_t (C++20)
-       \li 16-bit: short, unsigned short, qint16, quint16, char16_t (C++11)
-       \li 32-bit: int, unsigned int, qint32, quint32, char32_t (C++11)
+       \li 16-bit: short, unsigned short, qint16, quint16, char16_t
+       \li 32-bit: int, unsigned int, qint32, quint32, char32_t
        \li 64-bit: long long, unsigned long long, qint64, quint64
        \li platform-specific size: long, unsigned long
        \li pointer size: qintptr, quintptr, qptrdiff
diff -pruN 5.15.15+dfsg-2/src/corelib/thread/qfutureinterface.h 5.15.17+dfsg-1/src/corelib/thread/qfutureinterface.h
--- 5.15.15+dfsg-2/src/corelib/thread/qfutureinterface.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/thread/qfutureinterface.h	2024-11-20 13:56:33.000000000 +0000
@@ -281,7 +281,7 @@ template <>
 class QFutureInterface<void> : public QFutureInterfaceBase
 {
 public:
-    explicit QFutureInterface<void>(State initialState = NoState)
+    explicit QFutureInterface(State initialState = NoState)
         : QFutureInterfaceBase(initialState)
     { }
 
diff -pruN 5.15.15+dfsg-2/src/corelib/tools/qalgorithms.qdoc 5.15.17+dfsg-1/src/corelib/tools/qalgorithms.qdoc
--- 5.15.15+dfsg-2/src/corelib/tools/qalgorithms.qdoc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/tools/qalgorithms.qdoc	2024-11-20 13:56:33.000000000 +0000
@@ -377,14 +377,37 @@
 
 /*! \fn template <typename T> void qSwap(T &var1, T &var2)
     \relates <QtAlgorithms>
-    \deprecated
 
-    Use \c std::swap instead.
+    Exchanges the values of variables \a lhs and \a rhs,
+    taking type-specific \c{swap()} overloads into account.
 
-    Exchanges the values of variables \a var1 and \a var2.
+    This function is Qt's version of
+    \l{https://www.boost.org/doc/libs/release/libs/core/doc/html/core/swap.html}{\c{boost::swap()}},
+    and is equivalent to
+    \code
+    using std::swap;   // bring std::swap into scope (for built-in types)
+    swap(lhs, rhs);    // unqualified call (picks up type-specific overloads
+                       // via Argument-Dependent Lookup, or falls back to std::swap)
+    \endcode
 
-    Example:
-    \snippet code/doc_src_qalgorithms.cpp 10
+    Use this function primarily in generic code, where you would traditionally
+    have written the above two lines, because you don't know anything about \c{T}.
+
+    If you already know what \c{T} is, then use one of the following options, in
+    order of preference:
+
+    \list
+    \li \c{lhs.swap(rhs);} if such a member-swap exists
+    \li \c{std::swap(lhs, rhs);} if no type-specific \c{swap()} exists
+    \endlist
+
+    See
+    \l{https://www.boost.org/doc/libs/release/libs/core/doc/html/core/swap.html}{\c{boost::swap()} on boost.org}
+    for more details.
+
+    See also
+    \l{https://en.cppreference.com/w/cpp/algorithm/swap}{\c{std::swap} on cppreference.com},
+    \l{https://en.cppreference.com/w/cpp/named_req/Swappable}{\c{Swappable} on cppreference.com}.
 */
 
 /*! \fn template <typename RandomAccessIterator> void qSort(RandomAccessIterator begin, RandomAccessIterator end)
diff -pruN 5.15.15+dfsg-2/src/corelib/tools/qcommandlineoption.cpp 5.15.17+dfsg-1/src/corelib/tools/qcommandlineoption.cpp
--- 5.15.15+dfsg-2/src/corelib/tools/qcommandlineoption.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/tools/qcommandlineoption.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -151,8 +151,7 @@ QCommandLineOption::QCommandLineOption(c
     The default value for the option is set to \a defaultValue.
 
     In Qt versions before 5.4, this constructor was \c explicit. In Qt 5.4
-    and later, it no longer is and can be used for C++11-style uniform
-    initialization:
+    and later, it no longer is and can be used for uniform initialization:
 
     \snippet code/src_corelib_tools_qcommandlineoption.cpp cxx11-init
 
@@ -187,8 +186,7 @@ QCommandLineOption::QCommandLineOption(c
     The default value for the option is set to \a defaultValue.
 
     In Qt versions before 5.4, this constructor was \c explicit. In Qt 5.4
-    and later, it no longer is and can be used for C++11-style uniform
-    initialization:
+    and later, it no longer is and can be used for uniform initialization:
 
     \snippet code/src_corelib_tools_qcommandlineoption.cpp cxx11-init-list
 
diff -pruN 5.15.15+dfsg-2/src/corelib/tools/qhash.cpp 5.15.17+dfsg-1/src/corelib/tools/qhash.cpp
--- 5.15.15+dfsg-2/src/corelib/tools/qhash.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/tools/qhash.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -2593,9 +2593,6 @@ uint qHash(long double key, uint seed) n
 
     Constructs a multi-hash with a copy of each of the elements in the
     initializer list \a list.
-
-    This function is only available if the program is being
-    compiled in C++11 mode.
 */
 
 /*! \fn template <class Key, class T> QMultiHash<Key, T>::QMultiHash(const QHash<Key, T> &other)
diff -pruN 5.15.15+dfsg-2/src/corelib/tools/qsharedpointer.cpp 5.15.17+dfsg-1/src/corelib/tools/qsharedpointer.cpp
--- 5.15.15+dfsg-2/src/corelib/tools/qsharedpointer.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/tools/qsharedpointer.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -211,7 +211,7 @@
     last QSharedPointer instance had.
 
     This class is never instantiated directly: the constructors and
-    destructor are private and, in C++11, deleted. Only the create() function
+    destructor are deleted. Only the create() function
     may be called to return an object of this type. See below for construction
     details.
 
@@ -250,8 +250,7 @@
 
     Like ExternalRefCountWithCustomDeleter, this class is never instantiated
     directly. This class also provides a create() member that returns the
-    pointer, and hides its constructors and destructor. With C++11, they're
-    deleted.
+    pointer, and deletes its constructors and destructor.
 
     The size of this class depends on the size of \tt T.
 
diff -pruN 5.15.15+dfsg-2/src/corelib/tools/qvarlengtharray.qdoc 5.15.17+dfsg-1/src/corelib/tools/qvarlengtharray.qdoc
--- 5.15.15+dfsg-2/src/corelib/tools/qvarlengtharray.qdoc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/tools/qvarlengtharray.qdoc	2024-11-20 13:56:33.000000000 +0000
@@ -110,9 +110,6 @@
     \since 5.5
 
     Constructs an array from the std::initializer_list given by \a args.
-
-    This constructor is only enabled if the compiler supports C++11 initializer
-    lists.
 */
 
 /*! \fn template<class T, int Prealloc> template<typename InputIterator> QVarLengthArray<T, Prealloc>::QVarLengthArray(InputIterator first, InputIterator last)
@@ -413,9 +410,6 @@
     \since 5.5
 
     Assigns the values of \a list to this array, and returns a reference to this array.
-
-    This constructor is only enabled if the compiler supports C++11 initializer
-    lists.
 */
 
 /*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::QVarLengthArray(const QVarLengthArray<T, Prealloc> &other)
diff -pruN 5.15.15+dfsg-2/src/corelib/tools/qversionnumber.cpp 5.15.17+dfsg-1/src/corelib/tools/qversionnumber.cpp
--- 5.15.15+dfsg-2/src/corelib/tools/qversionnumber.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/corelib/tools/qversionnumber.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -105,18 +105,13 @@ QT_BEGIN_NAMESPACE
     \fn QVersionNumber::QVersionNumber(QVector<int> &&seg)
 
     Move-constructs a version number from the list of numbers contained in \a seg.
-
-    This constructor is only enabled if the compiler supports C++11 move semantics.
 */
 
 /*!
     \fn QVersionNumber::QVersionNumber(std::initializer_list<int> args)
 
-    Construct a version number from the std::initializer_list specified by
+    Constructs a version number from the std::initializer_list specified by
     \a args.
-
-    This constructor is only enabled if the compiler supports C++11 initializer
-    lists.
 */
 
 /*!
diff -pruN 5.15.15+dfsg-2/src/dbus/qdbusutil.cpp 5.15.17+dfsg-1/src/dbus/qdbusutil.cpp
--- 5.15.15+dfsg-2/src/dbus/qdbusutil.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/dbus/qdbusutil.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -244,6 +244,21 @@ static const char oneLetterTypes[] = "vs
 static const char basicTypes[] =      "sogybnqiuxtdh";
 static const char fixedTypes[] =         "ybnqiuxtdh";
 
+/*
+    D-Bus signature grammar (in ABNF), as of 0.42 (2023-08-21):
+    https://dbus.freedesktop.org/doc/dbus-specification.html#type-system
+
+    <signature>            = *<single-complete-type>
+    <single-complete-type> = <basic-type> / <variant> / <struct> / <array>
+    <fixed-type>           = "y" / "b" / "n" / "q" / "i" / "u" / "x" / "t" / "d" / "h"
+    <variable-length-type> = "s" / "o" / "g"
+    <basic-type>           = <variable-length-type> / <fixed-type>
+    <variant>              = "v"
+    <struct>               = "(" 1*<single-complete-type> ")"
+    <array>                = "a" ( <single-complete-type> / <dict-entry> )
+    <dict-entry>           = "{" <basic-type> <single-complete-type> "}"
+*/
+
 static bool isBasicType(int c)
 {
     return c != DBUS_TYPE_INVALID && strchr(basicTypes, c) != nullptr;
diff -pruN 5.15.15+dfsg-2/src/gui/kernel/qinputmethod.cpp 5.15.17+dfsg-1/src/gui/kernel/qinputmethod.cpp
--- 5.15.15+dfsg-2/src/gui/kernel/qinputmethod.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/gui/kernel/qinputmethod.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -426,13 +426,17 @@ QVariant QInputMethod::queryFocusObject(
     if (!focusObject)
         return retval;
 
-    bool newMethodWorks = QMetaObject::invokeMethod(focusObject, "inputMethodQuery",
-                                                    Qt::DirectConnection,
-                                                    Q_RETURN_ARG(QVariant, retval),
-                                                    Q_ARG(Qt::InputMethodQuery, query),
-                                                    Q_ARG(QVariant, argument));
-    if (newMethodWorks)
+    static const char *signature = "inputMethodQuery(Qt::InputMethodQuery,QVariant)";
+    const bool newMethodSupported = focusObject->metaObject()->indexOfMethod(signature) != -1;
+    if (newMethodSupported) {
+        const bool ok = QMetaObject::invokeMethod(focusObject, "inputMethodQuery",
+                                                        Qt::DirectConnection,
+                                                        Q_RETURN_ARG(QVariant, retval),
+                                                        Q_ARG(Qt::InputMethodQuery, query),
+                                                        Q_ARG(QVariant, argument));
+        Q_ASSERT(ok);
         return retval;
+    }
 
     QInputMethodQueryEvent queryEvent(query);
     QCoreApplication::sendEvent(focusObject, &queryEvent);
diff -pruN 5.15.15+dfsg-2/src/gui/kernel/qwindow.cpp 5.15.17+dfsg-1/src/gui/kernel/qwindow.cpp
--- 5.15.15+dfsg-2/src/gui/kernel/qwindow.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/gui/kernel/qwindow.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -660,6 +660,9 @@ void QWindow::create()
 /*!
     Returns the window's platform id.
 
+    \note This function will cause the platform window to be created if it is not already.
+    Returns 0, if the platform window creation failed.
+
     For platforms where this id might be useful, the value returned
     will uniquely represent the window inside the corresponding screen.
 
@@ -672,6 +675,9 @@ WId QWindow::winId() const
     if(!d->platformWindow)
         const_cast<QWindow *>(this)->create();
 
+    if (!d->platformWindow)
+        return 0;
+
     return d->platformWindow->winId();
 }
 
diff -pruN 5.15.15+dfsg-2/src/gui/painting/qpaintengine_raster.cpp 5.15.17+dfsg-1/src/gui/painting/qpaintengine_raster.cpp
--- 5.15.15+dfsg-2/src/gui/painting/qpaintengine_raster.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/gui/painting/qpaintengine_raster.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -3462,16 +3462,18 @@ void QRasterPaintEngine::drawBitmap(cons
     // Boundaries
     int w = image.width();
     int h = image.height();
-    int ymax = qMin(qRound(pos.y() + h), d->rasterBuffer->height());
-    int ymin = qMax(qRound(pos.y()), 0);
-    int xmax = qMin(qRound(pos.x() + w), d->rasterBuffer->width());
-    int xmin = qMax(qRound(pos.x()), 0);
+    int px = qRound(pos.x());
+    int py = qRound(pos.y());
+    int ymax = qMin(py + h, d->rasterBuffer->height());
+    int ymin = qMax(py, 0);
+    int xmax = qMin(px + w, d->rasterBuffer->width());
+    int xmin = qMax(px, 0);
 
-    int x_offset = xmin - qRound(pos.x());
+    int x_offset = xmin - px;
 
     QImage::Format format = image.format();
     for (int y = ymin; y < ymax; ++y) {
-        const uchar *src = image.scanLine(y - qRound(pos.y()));
+        const uchar *src = image.scanLine(y - py);
         if (format == QImage::Format_MonoLSB) {
             for (int x = 0; x < xmax - xmin; ++x) {
                 int src_x = x + x_offset;
@@ -3860,7 +3862,7 @@ void QClipData::initialize()
         return;
 
     if (!m_clipLines)
-        m_clipLines = (ClipLine *)calloc(sizeof(ClipLine), clipSpanHeight);
+        m_clipLines = (ClipLine *)calloc(clipSpanHeight, sizeof(ClipLine));
 
     Q_CHECK_PTR(m_clipLines);
     QT_TRY {
diff -pruN 5.15.15+dfsg-2/src/gui/painting/qregion.cpp 5.15.17+dfsg-1/src/gui/painting/qregion.cpp
--- 5.15.15+dfsg-2/src/gui/painting/qregion.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/gui/painting/qregion.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -82,7 +82,7 @@ QT_BEGIN_NAMESPACE
     contains() a QPoint or QRect. The bounding rectangle can be found
     with boundingRect().
 
-    Iteration over the region (with begin(), end(), or C++11
+    Iteration over the region (with begin(), end(), or
     ranged-for loops) gives a decomposition of the region into
     rectangles.
 
diff -pruN 5.15.15+dfsg-2/src/gui/text/qtextengine.cpp 5.15.17+dfsg-1/src/gui/text/qtextengine.cpp
--- 5.15.15+dfsg-2/src/gui/text/qtextengine.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/gui/text/qtextengine.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -1807,8 +1807,10 @@ QT_WARNING_PUSH
 QT_WARNING_DISABLE_DEPRECATED
         if (!actualFontEngine->supportsSubPixelPositions() || (actualFontEngine->fontDef.styleStrategy & QFont::ForceIntegerMetrics)) {
 QT_WARNING_POP
-            for (uint i = 0; i < num_glyphs; ++i)
+            for (uint i = 0; i < num_glyphs; ++i) {
                 g.advances[i] = g.advances[i].round();
+                g.offsets[i].x = g.offsets[i].x.round();
+            }
         }
 
         glyphs_shaped += num_glyphs;
diff -pruN 5.15.15+dfsg-2/src/gui/text/qtextformat.cpp 5.15.17+dfsg-1/src/gui/text/qtextformat.cpp
--- 5.15.15+dfsg-2/src/gui/text/qtextformat.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/gui/text/qtextformat.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -2076,7 +2076,7 @@ QFont QTextCharFormat::font() const
     associated QTextBlockFormat that specifies its characteristics.
 
     To cater for left-to-right and right-to-left languages you can set
-    a block's direction with setDirection(). Paragraph alignment is
+    a block's direction with setLayoutDirection(). Paragraph alignment is
     set with setAlignment(). Margins are controlled by setTopMargin(),
     setBottomMargin(), setLeftMargin(), setRightMargin(). Overall
     indentation is set with setIndent(), the indentation of the first
diff -pruN 5.15.15+dfsg-2/src/gui/util/qktxhandler.cpp 5.15.17+dfsg-1/src/gui/util/qktxhandler.cpp
--- 5.15.15+dfsg-2/src/gui/util/qktxhandler.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/gui/util/qktxhandler.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -73,7 +73,7 @@ struct KTXHeader {
     quint32 bytesOfKeyValueData;
 };
 
-static const quint32 headerSize = sizeof(KTXHeader);
+static constexpr quint32 qktxh_headerSize = sizeof(KTXHeader);
 
 // Currently unused, declared for future reference
 struct KTXKeyValuePairItem {
@@ -103,11 +103,36 @@ struct KTXMipmapLevel {
     */
 };
 
-bool QKtxHandler::canRead(const QByteArray &suffix, const QByteArray &block)
+static bool qAddOverflow(quint32 v1, quint32 v2, quint32 *r) {
+    // unsigned additions are well-defined
+    *r = v1 + v2;
+    return v1 > quint32(v1 + v2);
+}
+
+// Returns the nearest multiple of 4 greater than or equal to 'value'
+static bool nearestMultipleOf4(quint32 value, quint32 *result)
 {
-    Q_UNUSED(suffix)
+    constexpr quint32 rounding = 4;
+    *result = 0;
+    if (qAddOverflow(value, rounding - 1, result))
+        return true;
+    *result &= ~(rounding - 1);
+    return false;
+}
 
-    return (qstrncmp(block.constData(), ktxIdentifier, KTX_IDENTIFIER_LENGTH) == 0);
+// Returns a slice with prechecked bounds
+static QByteArray safeSlice(const QByteArray& array, quint32 start, quint32 length)
+{
+    quint32 end = 0;
+    if (qAddOverflow(start, length, &end) || end > quint32(array.length()))
+        return {};
+    return QByteArray(array.data() + start, length);
+}
+
+bool QKtxHandler::canRead(const QByteArray &suffix, const QByteArray &block)
+{
+    Q_UNUSED(suffix);
+    return block.startsWith(QByteArray::fromRawData(ktxIdentifier, KTX_IDENTIFIER_LENGTH));
 }
 
 QTextureFileData QKtxHandler::read()
@@ -115,42 +140,97 @@ QTextureFileData QKtxHandler::read()
     if (!device())
         return QTextureFileData();
 
-    QByteArray buf = device()->readAll();
-    const quint32 dataSize = quint32(buf.size());
-    if (dataSize < headerSize || !canRead(QByteArray(), buf)) {
-        qCDebug(lcQtGuiTextureIO, "Invalid KTX file %s", logName().constData());
+    const QByteArray buf = device()->readAll();
+    if (size_t(buf.size()) > std::numeric_limits<quint32>::max()) {
+        qWarning(lcQtGuiTextureIO, "Too big KTX file %s", logName().constData());
+        return QTextureFileData();
+    }
+
+    if (!canRead(QByteArray(), buf)) {
+        qWarning(lcQtGuiTextureIO, "Invalid KTX file %s", logName().constData());
+        return QTextureFileData();
+    }
+
+    if (buf.size() < qsizetype(qktxh_headerSize)) {
+        qWarning(lcQtGuiTextureIO, "Invalid KTX header size in %s", logName().constData());
         return QTextureFileData();
     }
 
-    const KTXHeader *header = reinterpret_cast<const KTXHeader *>(buf.constData());
-    if (!checkHeader(*header)) {
-        qCDebug(lcQtGuiTextureIO, "Unsupported KTX file format in %s", logName().constData());
+    KTXHeader header;
+    memcpy(&header, buf.data(), qktxh_headerSize);
+    if (!checkHeader(header)) {
+        qWarning(lcQtGuiTextureIO, "Unsupported KTX file format in %s", logName().constData());
         return QTextureFileData();
     }
 
     QTextureFileData texData;
     texData.setData(buf);
 
-    texData.setSize(QSize(decode(header->pixelWidth), decode(header->pixelHeight)));
-    texData.setGLFormat(decode(header->glFormat));
-    texData.setGLInternalFormat(decode(header->glInternalFormat));
-    texData.setGLBaseInternalFormat(decode(header->glBaseInternalFormat));
-
-    texData.setNumLevels(decode(header->numberOfMipmapLevels));
-    quint32 offset = headerSize + decode(header->bytesOfKeyValueData);
-    const int maxLevels = qMin(texData.numLevels(), 32);               // Cap iterations in case of corrupt file.
-    for (int i = 0; i < maxLevels; i++) {
-        if (offset + sizeof(KTXMipmapLevel) > dataSize)                // Corrupt file; avoid oob read
-            break;
-        const KTXMipmapLevel *level = reinterpret_cast<const KTXMipmapLevel *>(buf.constData() + offset);
-        quint32 levelLen = decode(level->imageSize);
-        texData.setDataOffset(offset + sizeof(KTXMipmapLevel::imageSize), i);
-        texData.setDataLength(levelLen, i);
-        offset += sizeof(KTXMipmapLevel::imageSize) + levelLen + (3 - ((levelLen + 3) % 4));
+    texData.setSize(QSize(decode(header.pixelWidth), decode(header.pixelHeight)));
+    texData.setGLFormat(decode(header.glFormat));
+    texData.setGLInternalFormat(decode(header.glInternalFormat));
+    texData.setGLBaseInternalFormat(decode(header.glBaseInternalFormat));
+
+    texData.setNumLevels(decode(header.numberOfMipmapLevels));
+
+    const quint32 bytesOfKeyValueData = decode(header.bytesOfKeyValueData);
+    quint32 headerKeyValueSize;
+    if (qAddOverflow(qktxh_headerSize, bytesOfKeyValueData, &headerKeyValueSize)) {
+        qWarning(lcQtGuiTextureIO, "Overflow in size of key value data in header of KTX file %s",
+                 logName().constData());
+        return QTextureFileData();
+    }
+
+    if (headerKeyValueSize >= quint32(buf.size())) {
+        qWarning(lcQtGuiTextureIO, "OOB request in KTX file %s", logName().constData());
+        return QTextureFileData();
+    }
+
+    // Technically, any number of levels is allowed but if the value is bigger than
+    // what is possible in KTX V2 (and what makes sense) we return an error.
+    // maxLevels = log2(max(width, height, depth))
+    const int maxLevels = (sizeof(quint32) * 8)
+            - qCountLeadingZeroBits(std::max(
+                    { header.pixelWidth, header.pixelHeight, header.pixelDepth }));
+
+    if (texData.numLevels() > maxLevels) {
+        qWarning(lcQtGuiTextureIO, "Too many levels in KTX file %s", logName().constData());
+        return QTextureFileData();
+    }
+
+    quint32 offset = headerKeyValueSize;
+    for (int level = 0; level < texData.numLevels(); level++) {
+        const auto imageSizeSlice = safeSlice(buf, offset, sizeof(quint32));
+        if (imageSizeSlice.isEmpty()) {
+            qWarning(lcQtGuiTextureIO, "OOB request in KTX file %s", logName().constData());
+            return QTextureFileData();
+        }
+
+        const quint32 imageSize = decode(qFromUnaligned<quint32>(imageSizeSlice.data()));
+        offset += sizeof(quint32); // overflow checked indirectly above
+
+        texData.setDataOffset(offset, level);
+        texData.setDataLength(imageSize, level);
+
+        // Add image data and padding to offset
+        quint32 padded = 0;
+        if (nearestMultipleOf4(imageSize, &padded)) {
+            qWarning(lcQtGuiTextureIO, "Overflow in KTX file %s", logName().constData());
+            return QTextureFileData();
+        }
+
+        quint32 offsetNext;
+        if (qAddOverflow(offset, padded, &offsetNext)) {
+            qWarning(lcQtGuiTextureIO, "OOB request in KTX file %s", logName().constData());
+            return QTextureFileData();
+        }
+
+        offset = offsetNext;
     }
 
     if (!texData.isValid()) {
-        qCDebug(lcQtGuiTextureIO, "Invalid values in header of KTX file %s", logName().constData());
+        qWarning(lcQtGuiTextureIO, "Invalid values in header of KTX file %s",
+                 logName().constData());
         return QTextureFileData();
     }
 
@@ -191,7 +271,7 @@ bool QKtxHandler::checkHeader(const KTXH
             (decode(header.numberOfFaces) == 1));
 }
 
-quint32 QKtxHandler::decode(quint32 val)
+quint32 QKtxHandler::decode(quint32 val) const
 {
     return inverseEndian ? qbswap<quint32>(val) : val;
 }
diff -pruN 5.15.15+dfsg-2/src/gui/util/qktxhandler_p.h 5.15.17+dfsg-1/src/gui/util/qktxhandler_p.h
--- 5.15.15+dfsg-2/src/gui/util/qktxhandler_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/gui/util/qktxhandler_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -68,7 +68,7 @@ public:
 
 private:
     bool checkHeader(const KTXHeader &header);
-    quint32 decode(quint32 val);
+    quint32 decode(quint32 val) const;
 
     bool inverseEndian = false;
 };
diff -pruN 5.15.15+dfsg-2/src/network/access/http2/hpacktable.cpp 5.15.17+dfsg-1/src/network/access/http2/hpacktable.cpp
--- 5.15.15+dfsg-2/src/network/access/http2/hpacktable.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/network/access/http2/hpacktable.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -40,6 +40,7 @@
 #include "hpacktable_p.h"
 
 #include <QtCore/qdebug.h>
+#include <QtCore/private/qnumeric_p.h>
 
 #include <algorithm>
 #include <cstddef>
@@ -62,8 +63,10 @@ HeaderSize entry_size(const QByteArray &
     // for counting the number of references to the name and value would have
     // 32 octets of overhead."
 
-    const unsigned sum = unsigned(name.size() + value.size());
-    if (std::numeric_limits<unsigned>::max() - 32 < sum)
+    size_t sum;
+    if (add_overflow(size_t(name.size()), size_t(value.size()), &sum))
+        return HeaderSize();
+    if (sum > (std::numeric_limits<unsigned>::max() - 32))
         return HeaderSize();
     return HeaderSize(true, quint32(sum + 32));
 }
diff -pruN 5.15.15+dfsg-2/src/network/access/qhttp2protocolhandler.cpp 5.15.17+dfsg-1/src/network/access/qhttp2protocolhandler.cpp
--- 5.15.15+dfsg-2/src/network/access/qhttp2protocolhandler.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/network/access/qhttp2protocolhandler.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -46,6 +46,8 @@
 #include <private/qnoncontiguousbytedevice_p.h>
 
 #include <QtNetwork/qabstractsocket.h>
+
+#include <QtCore/private/qnumeric_p.h>
 #include <QtCore/qloggingcategory.h>
 #include <QtCore/qendian.h>
 #include <QtCore/qdebug.h>
@@ -124,8 +126,10 @@ std::vector<uchar> assemble_hpack_block(
     std::vector<uchar> hpackBlock;
 
     quint32 total = 0;
-    for (const auto &frame : frames)
-        total += frame.hpackBlockSize();
+    for (const auto &frame : frames) {
+        if (add_overflow(total, frame.hpackBlockSize(), &total))
+            return hpackBlock;
+    }
 
     if (!total)
         return hpackBlock;
diff -pruN 5.15.15+dfsg-2/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp 5.15.17+dfsg-1/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp
--- 5.15.15+dfsg-2/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -1106,15 +1106,7 @@ static bool addFontToDatabase(QString fa
             writingSystems.setSupported(ws);
     }
 
-    // We came here from populating a different font family, so we have
-    // to ensure the entire typographic family is populated before we
-    // mark it as such inside registerFont()
-    if (!subFamilyName.isEmpty()
-            && familyName != subFamilyName
-            && sfp->populatedFontFamily != familyName
-            && !QPlatformFontDatabase::isFamilyPopulated(familyName)) {
-        sfp->windowsFontDatabase->populateFamily(familyName);
-    }
+    const bool wasPopulated = QPlatformFontDatabase::isFamilyPopulated(familyName);
 
     QPlatformFontDatabase::registerFont(familyName, styleName, foundryName, weight,
                                         style, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(faceName));
@@ -1130,6 +1122,16 @@ static bool addFontToDatabase(QString fa
         QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, QFont::Bold,
                                             QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(faceName));
 
+    // We came here from populating a different font family, so we have
+    // to ensure the entire typographic family is populated before we
+    // mark it as such inside registerFont()
+    if (!subFamilyName.isEmpty()
+        && familyName != subFamilyName
+        && sfp->populatedFontFamily != familyName
+        && !wasPopulated) {
+        sfp->windowsFontDatabase->populateFamily(familyName);
+    }
+
     if (!subFamilyName.isEmpty() && familyName != subFamilyName) {
         QPlatformFontDatabase::registerFont(subFamilyName, subFamilyStyle, foundryName, weight,
                                             style, stretch, antialias, scalable, size, fixed, writingSystems, createFontFile(faceName));
@@ -1471,36 +1473,70 @@ QT_WARNING_POP
     return fontEngine;
 }
 
-static QList<quint32> getTrueTypeFontOffsets(const uchar *fontData)
+static QList<quint32> getTrueTypeFontOffsets(const uchar *fontData, const uchar *fileEndSentinel)
 {
     QList<quint32> offsets;
-    const quint32 headerTag = *reinterpret_cast<const quint32 *>(fontData);
+    if (fileEndSentinel - fontData < 12) {
+        qCWarning(lcQpaFonts) << "Corrupted font data detected";
+        return offsets;
+    }
+
+    const quint32 headerTag = qFromUnaligned<quint32>(fontData);
     if (headerTag != MAKE_TAG('t', 't', 'c', 'f')) {
         if (headerTag != MAKE_TAG(0, 1, 0, 0)
             && headerTag != MAKE_TAG('O', 'T', 'T', 'O')
             && headerTag != MAKE_TAG('t', 'r', 'u', 'e')
-            && headerTag != MAKE_TAG('t', 'y', 'p', '1'))
+            && headerTag != MAKE_TAG('t', 'y', 'p', '1')) {
             return offsets;
+        }
         offsets << 0;
         return offsets;
     }
+
+    const quint32 maximumNumFonts = 0xffff;
     const quint32 numFonts = qFromBigEndian<quint32>(fontData + 8);
-    for (uint i = 0; i < numFonts; ++i) {
-        offsets << qFromBigEndian<quint32>(fontData + 12 + i * 4);
+    if (numFonts > maximumNumFonts) {
+        qCWarning(lcQpaFonts) << "Font collection of" << numFonts << "fonts is too large. Aborting.";
+        return offsets;
     }
+
+    if (quintptr(fileEndSentinel - fontData) > 12 + (numFonts - 1) * 4) {
+        for (quint32 i = 0; i < numFonts; ++i)
+            offsets << qFromBigEndian<quint32>(fontData + 12 + i * 4);
+    } else {
+        qCWarning(lcQpaFonts) << "Corrupted font data detected";
+    }
+
     return offsets;
 }
 
-static void getFontTable(const uchar *fileBegin, const uchar *data, quint32 tag, const uchar **table, quint32 *length)
+static void getFontTable(const uchar *fileBegin, const uchar *fileEndSentinel, const uchar *data, quint32 tag, const uchar **table, quint32 *length)
 {
-    const quint16 numTables = qFromBigEndian<quint16>(data + 4);
-    for (uint i = 0; i < numTables; ++i) {
-        const quint32 offset = 12 + 16 * i;
-        if (*reinterpret_cast<const quint32 *>(data + offset) == tag) {
-            *table = fileBegin + qFromBigEndian<quint32>(data + offset + 8);
-            *length = qFromBigEndian<quint32>(data + offset + 12);
-            return;
+    if (fileEndSentinel - data >= 6) {
+        const quint16 numTables = qFromBigEndian<quint16>(data + 4);
+        if (fileEndSentinel - data >= 28 + 16 * (numTables - 1)) {
+            for (quint32 i = 0; i < numTables; ++i) {
+                const quint32 offset = 12 + 16 * i;
+                if (qFromUnaligned<quint32>(data + offset) == tag) {
+                    const quint32 tableOffset = qFromBigEndian<quint32>(data + offset + 8);
+                    if (quintptr(fileEndSentinel - fileBegin) <= tableOffset) {
+                        qCWarning(lcQpaFonts) << "Corrupted font data detected";
+                        break;
+                    }
+                    *table = fileBegin + tableOffset;
+                    *length = qFromBigEndian<quint32>(data + offset + 12);
+                    if (quintptr(fileEndSentinel - *table) < *length) {
+                        qCWarning(lcQpaFonts) << "Corrupted font data detected";
+                        break;
+                    }
+                    return;
+                }
+            }
+        } else {
+            qCWarning(lcQpaFonts) << "Corrupted font data detected";
         }
+    } else {
+        qCWarning(lcQpaFonts) << "Corrupted font data detected";
     }
     *table = 0;
     *length = 0;
@@ -1513,8 +1549,9 @@ static void getFamiliesAndSignatures(con
                                      QVector<QFontValues> *values)
 {
     const uchar *data = reinterpret_cast<const uchar *>(fontData.constData());
+    const uchar *dataEndSentinel = data + fontData.size();
 
-    QList<quint32> offsets = getTrueTypeFontOffsets(data);
+    QList<quint32> offsets = getTrueTypeFontOffsets(data, dataEndSentinel);
     if (offsets.isEmpty())
         return;
 
@@ -1522,7 +1559,7 @@ static void getFamiliesAndSignatures(con
         const uchar *font = data + offsets.at(i);
         const uchar *table;
         quint32 length;
-        getFontTable(data, font, MAKE_TAG('n', 'a', 'm', 'e'), &table, &length);
+        getFontTable(data, dataEndSentinel, font, MAKE_TAG('n', 'a', 'm', 'e'), &table, &length);
         if (!table)
             continue;
         QFontNames names = qt_getCanonicalFontNames(table, length);
@@ -1532,7 +1569,7 @@ static void getFamiliesAndSignatures(con
         families->append(std::move(names));
 
         if (values || signatures)
-            getFontTable(data, font, MAKE_TAG('O', 'S', '/', '2'), &table, &length);
+            getFontTable(data, dataEndSentinel, font, MAKE_TAG('O', 'S', '/', '2'), &table, &length);
 
         if (values) {
             QFontValues fontValues;
diff -pruN 5.15.15+dfsg-2/src/platformsupport/input/xkbcommon/qxkbcommon.cpp 5.15.17+dfsg-1/src/platformsupport/input/xkbcommon/qxkbcommon.cpp
--- 5.15.15+dfsg-2/src/platformsupport/input/xkbcommon/qxkbcommon.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/platformsupport/input/xkbcommon/qxkbcommon.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -273,10 +273,14 @@ static constexpr const auto KeyTbl = qMa
         Xkb2Qt<XKB_KEY_dead_small_schwa,        Qt::Key_Dead_Small_Schwa>,
         Xkb2Qt<XKB_KEY_dead_capital_schwa,      Qt::Key_Dead_Capital_Schwa>,
         Xkb2Qt<XKB_KEY_dead_greek,              Qt::Key_Dead_Greek>,
+/* The following four XKB_KEY_dead keys got removed in libxkbcommon 1.6.0
+   The define check is kind of version check here. */
+#ifdef XKB_KEY_dead_lowline
         Xkb2Qt<XKB_KEY_dead_lowline,            Qt::Key_Dead_Lowline>,
         Xkb2Qt<XKB_KEY_dead_aboveverticalline,  Qt::Key_Dead_Aboveverticalline>,
         Xkb2Qt<XKB_KEY_dead_belowverticalline,  Qt::Key_Dead_Belowverticalline>,
         Xkb2Qt<XKB_KEY_dead_longsolidusoverlay, Qt::Key_Dead_Longsolidusoverlay>,
+#endif
 
         // Special keys from X.org - This include multimedia keys,
         // wireless/bluetooth/uwb keys, special launcher keys, etc.
@@ -547,7 +551,15 @@ static int keysymToQtKey_internal(xkb_ke
         // numeric keypad keys
         qtKey = Qt::Key_0 + (keysym - XKB_KEY_KP_0);
     } else if (QXkbCommon::isLatin1(keysym)) {
+        // Upper-case first, since Qt::Keys are defined in terms of their
+        // upper-case versions.
         qtKey = QXkbCommon::qxkbcommon_xkb_keysym_to_upper(keysym);
+        // Upper-casing a Latin1 character might move it out of Latin1 range,
+        // for example U+00B5 MICRO SIGN, which upper-case equivalent is
+        // U+039C GREEK CAPITAL LETTER MU. If that's the case, then map the
+        // original lower-case character.
+        if (!QXkbCommon::isLatin1(qtKey))
+            qtKey = keysym;
     } else {
         // check if we have a direct mapping
         xkb2qt_t searchKey{keysym, 0};
@@ -754,6 +766,8 @@ xkb_keysym_t QXkbCommon::lookupLatinKeys
 {
     xkb_layout_index_t layout;
     xkb_keysym_t sym = XKB_KEY_NoSymbol;
+    if (!state)
+        return sym;
     xkb_keymap *keymap = xkb_state_get_keymap(state);
     const xkb_layout_index_t layoutCount = xkb_keymap_num_layouts_for_key(keymap, keycode);
     const xkb_layout_index_t currentLayout = xkb_state_key_get_layout(state, keycode);
diff -pruN 5.15.15+dfsg-2/src/platformsupport/windowsuiautomation/qwindowsuiawrapper.cpp 5.15.17+dfsg-1/src/platformsupport/windowsuiautomation/qwindowsuiawrapper.cpp
--- 5.15.15+dfsg-2/src/platformsupport/windowsuiautomation/qwindowsuiawrapper.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/platformsupport/windowsuiautomation/qwindowsuiawrapper.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -53,7 +53,6 @@ QWindowsUiaWrapper::QWindowsUiaWrapper()
         m_pUiaHostProviderFromHwnd = reinterpret_cast<PtrUiaHostProviderFromHwnd>(uiaLib.resolve("UiaHostProviderFromHwnd"));
         m_pUiaRaiseAutomationPropertyChangedEvent = reinterpret_cast<PtrUiaRaiseAutomationPropertyChangedEvent>(uiaLib.resolve("UiaRaiseAutomationPropertyChangedEvent"));
         m_pUiaRaiseAutomationEvent = reinterpret_cast<PtrUiaRaiseAutomationEvent>(uiaLib.resolve("UiaRaiseAutomationEvent"));
-        m_pUiaRaiseNotificationEvent = reinterpret_cast<PtrUiaRaiseNotificationEvent>(uiaLib.resolve("UiaRaiseNotificationEvent"));
         m_pUiaClientsAreListening = reinterpret_cast<PtrUiaClientsAreListening>(uiaLib.resolve("UiaClientsAreListening"));
     }
 }
@@ -69,7 +68,7 @@ QWindowsUiaWrapper *QWindowsUiaWrapper::
     return &wrapper;
 }
 
-// True if most symbols resolved (UiaRaiseNotificationEvent is optional).
+// True if all symbols resolved.
 BOOL QWindowsUiaWrapper::ready()
 {
     return m_pUiaReturnRawElementProvider
@@ -114,12 +113,5 @@ HRESULT QWindowsUiaWrapper::raiseAutomat
     return m_pUiaRaiseAutomationEvent(pProvider, id);
 }
 
-HRESULT QWindowsUiaWrapper::raiseNotificationEvent(IRawElementProviderSimple *provider, NotificationKind notificationKind, NotificationProcessing notificationProcessing, BSTR displayString, BSTR activityId)
-{
-    if (!m_pUiaRaiseNotificationEvent)
-        return UIA_E_NOTSUPPORTED;
-    return m_pUiaRaiseNotificationEvent(provider, notificationKind, notificationProcessing, displayString, activityId);
-}
-
 QT_END_NAMESPACE
 
diff -pruN 5.15.15+dfsg-2/src/platformsupport/windowsuiautomation/qwindowsuiawrapper_p.h 5.15.17+dfsg-1/src/platformsupport/windowsuiautomation/qwindowsuiawrapper_p.h
--- 5.15.15+dfsg-2/src/platformsupport/windowsuiautomation/qwindowsuiawrapper_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/platformsupport/windowsuiautomation/qwindowsuiawrapper_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -80,20 +80,17 @@ public:
     HRESULT hostProviderFromHwnd(HWND hwnd, IRawElementProviderSimple **ppProvider);
     HRESULT raiseAutomationPropertyChangedEvent(IRawElementProviderSimple *pProvider, PROPERTYID id, VARIANT oldValue, VARIANT newValue);
     HRESULT raiseAutomationEvent(IRawElementProviderSimple *pProvider, EVENTID id);
-    HRESULT raiseNotificationEvent(IRawElementProviderSimple *provider, NotificationKind notificationKind, NotificationProcessing notificationProcessing, BSTR displayString, BSTR activityId);
 
 private:
     typedef LRESULT (WINAPI *PtrUiaReturnRawElementProvider)(HWND, WPARAM, LPARAM, IRawElementProviderSimple *);
     typedef HRESULT (WINAPI *PtrUiaHostProviderFromHwnd)(HWND, IRawElementProviderSimple **);
     typedef HRESULT (WINAPI *PtrUiaRaiseAutomationPropertyChangedEvent)(IRawElementProviderSimple *, PROPERTYID, VARIANT, VARIANT);
     typedef HRESULT (WINAPI *PtrUiaRaiseAutomationEvent)(IRawElementProviderSimple *, EVENTID);
-    typedef HRESULT (WINAPI *PtrUiaRaiseNotificationEvent)(IRawElementProviderSimple *, NotificationKind, NotificationProcessing, BSTR, BSTR);
     typedef BOOL (WINAPI *PtrUiaClientsAreListening)();
     PtrUiaReturnRawElementProvider             m_pUiaReturnRawElementProvider = nullptr;
     PtrUiaHostProviderFromHwnd                 m_pUiaHostProviderFromHwnd = nullptr;
     PtrUiaRaiseAutomationPropertyChangedEvent  m_pUiaRaiseAutomationPropertyChangedEvent = nullptr;
     PtrUiaRaiseAutomationEvent                 m_pUiaRaiseAutomationEvent = nullptr;
-    PtrUiaRaiseNotificationEvent               m_pUiaRaiseNotificationEvent = nullptr;
     PtrUiaClientsAreListening                  m_pUiaClientsAreListening = nullptr;
 };
 
diff -pruN 5.15.15+dfsg-2/src/platformsupport/windowsuiautomation/uiatypes_p.h 5.15.17+dfsg-1/src/platformsupport/windowsuiautomation/uiatypes_p.h
--- 5.15.15+dfsg-2/src/platformsupport/windowsuiautomation/uiatypes_p.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/platformsupport/windowsuiautomation/uiatypes_p.h	2024-11-20 13:56:33.000000000 +0000
@@ -162,22 +162,6 @@ enum ExpandCollapseState {
     ExpandCollapseState_LeafNode          = 3
 };
 
-enum NotificationKind {
-    NotificationKind_ItemAdded       = 0,
-    NotificationKind_ItemRemoved     = 1,
-    NotificationKind_ActionCompleted = 2,
-    NotificationKind_ActionAborted   = 3,
-    NotificationKind_Other           = 4
-};
-
-enum NotificationProcessing {
-    NotificationProcessing_ImportantAll          = 0,
-    NotificationProcessing_ImportantMostRecent   = 1,
-    NotificationProcessing_All                   = 2,
-    NotificationProcessing_MostRecent            = 3,
-    NotificationProcessing_CurrentThenMostRecent = 4
-};
-
 struct UiaRect {
     double left;
     double top;
diff -pruN 5.15.15+dfsg-2/src/plugins/platforms/android/androidcontentfileengine.cpp 5.15.17+dfsg-1/src/plugins/platforms/android/androidcontentfileengine.cpp
--- 5.15.15+dfsg-2/src/plugins/platforms/android/androidcontentfileengine.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/plugins/platforms/android/androidcontentfileengine.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -662,7 +662,8 @@ QJNIObjectPrivate parseUri(const QString
 
 DocumentFilePtr DocumentFile::parseFromAnyUri(const QString &fileName)
 {
-    const QJNIObjectPrivate uri = parseUri(fileName);
+    const QString encodedUri = QUrl(fileName).toEncoded();
+    const QJNIObjectPrivate uri = parseUri(encodedUri);
 
     if (DocumentsContract::isDocumentUri(uri))
         return fromSingleUri(uri);
@@ -670,17 +671,17 @@ DocumentFilePtr DocumentFile::parseFromA
     const QString documentType = QLatin1String("/document/");
     const QString treeType = QLatin1String("/tree/");
 
-    const int treeIndex = fileName.indexOf(treeType);
-    const int documentIndex = fileName.indexOf(documentType);
+    const int treeIndex = encodedUri.indexOf(treeType);
+    const int documentIndex = encodedUri.indexOf(documentType);
     const int index = fileName.lastIndexOf(QLatin1Char('/'));
 
     if (index <= treeIndex + treeType.size() || index <= documentIndex + documentType.size())
         return fromTreeUri(uri);
 
-    const QString parentUrl = fileName.left(index);
+    const QString parentUrl = encodedUri.left(index);
     DocumentFilePtr parentDocFile = fromTreeUri(parseUri(parentUrl));
 
-    const QString baseName = fileName.mid(index);
+    const QString baseName = encodedUri.mid(index);
     const QString fileUrl = parentUrl + QUrl::toPercentEncoding(baseName);
 
     DocumentFilePtr docFile = std::make_shared<MakeableDocumentFile>(parseUri(fileUrl));
diff -pruN 5.15.15+dfsg-2/src/plugins/platforms/android/qandroidplatformfontdatabase.cpp 5.15.17+dfsg-1/src/plugins/platforms/android/qandroidplatformfontdatabase.cpp
--- 5.15.15+dfsg-2/src/plugins/platforms/android/qandroidplatformfontdatabase.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/plugins/platforms/android/qandroidplatformfontdatabase.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -38,6 +38,7 @@
 ****************************************************************************/
 
 #include <QDir>
+#include <QLocale>
 
 #include "qandroidplatformfontdatabase.h"
 
@@ -76,6 +77,38 @@ QStringList QAndroidPlatformFontDatabase
                                                              QChar::Script script) const
 {
     QStringList result;
+
+    // Prepend CJK fonts by the locale.
+    QLocale locale = QLocale::system();
+    switch (locale.language()) {
+    case QLocale::Chinese: {
+        switch (locale.country()) {
+        case QLocale::China:
+        case QLocale::Singapore:
+            result.append(QStringLiteral("Noto Sans Mono CJK SC"));
+            break;
+        case QLocale::Taiwan:
+        case QLocale::HongKong:
+        case QLocale::Macau:
+            result.append(QStringLiteral("Noto Sans Mono CJK TC"));
+            break;
+        default:
+            // no modifications.
+            break;
+        }
+        break;
+    }
+    case QLocale::Japanese:
+        result.append(QStringLiteral("Noto Sans Mono CJK JP"));
+        break;
+    case QLocale::Korean:
+        result.append(QStringLiteral("Noto Sans Mono CJK KR"));
+        break;
+    default:
+        // no modifications.
+        break;
+    }
+
     if (styleHint == QFont::Monospace || styleHint == QFont::Courier)
         result.append(QString(qgetenv("QT_ANDROID_FONTS_MONOSPACE")).split(QLatin1Char(';')));
     else if (styleHint == QFont::Serif)
diff -pruN 5.15.15+dfsg-2/src/plugins/platforms/windows/qwindowssystemtrayicon.cpp 5.15.17+dfsg-1/src/plugins/platforms/windows/qwindowssystemtrayicon.cpp
--- 5.15.15+dfsg-2/src/plugins/platforms/windows/qwindowssystemtrayicon.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/plugins/platforms/windows/qwindowssystemtrayicon.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -278,6 +278,10 @@ void QWindowsSystemTrayIcon::showMessage
         size = largeIcon;
     }
     QPixmap pm = icon.pixmap(size);
+    if (m_hMessageIcon) {
+        DestroyIcon(m_hMessageIcon);
+        m_hMessageIcon = nullptr;
+    }
     if (pm.isNull()) {
         tnd.dwInfoFlags = NIIF_INFO;
     } else {
@@ -286,7 +290,8 @@ void QWindowsSystemTrayIcon::showMessage
                       pm.size().width(), pm.size().height(), size.width(), size.height());
             pm = pm.scaled(size, Qt::IgnoreAspectRatio);
         }
-        tnd.hBalloonIcon = qt_pixmapToWinHICON(pm);
+        m_hMessageIcon = qt_pixmapToWinHICON(pm);
+        tnd.hBalloonIcon = m_hMessageIcon;
     }
     tnd.hWnd = m_hwnd;
     tnd.uTimeout = msecsIn <= 0 ?  UINT(10000) : UINT(msecsIn); // 10s default
@@ -344,7 +349,10 @@ void QWindowsSystemTrayIcon::ensureClean
     }
     if (m_hIcon != nullptr)
         DestroyIcon(m_hIcon);
+    if (m_hMessageIcon != nullptr)
+        DestroyIcon(m_hMessageIcon);
     m_hIcon = nullptr;
+    m_hMessageIcon = nullptr;
     m_menu = nullptr; // externally owned
     m_toolTip.clear();
 }
diff -pruN 5.15.15+dfsg-2/src/plugins/platforms/windows/qwindowssystemtrayicon.h 5.15.17+dfsg-1/src/plugins/platforms/windows/qwindowssystemtrayicon.h
--- 5.15.15+dfsg-2/src/plugins/platforms/windows/qwindowssystemtrayicon.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/plugins/platforms/windows/qwindowssystemtrayicon.h	2024-11-20 13:56:33.000000000 +0000
@@ -91,6 +91,7 @@ private:
     QString m_toolTip;
     HWND m_hwnd = nullptr;
     HICON m_hIcon = nullptr;
+    HICON m_hMessageIcon = nullptr;
     mutable QPointer<QWindowsPopupMenu> m_menu;
     bool m_ignoreNextMouseRelease = false;
     bool m_visible = false;
diff -pruN 5.15.15+dfsg-2/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp 5.15.17+dfsg-1/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp
--- 5.15.15+dfsg-2/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -172,27 +172,11 @@ void QWindowsUiaMainProvider::notifyValu
         }
         if (event->value().type() == QVariant::String) {
             if (QWindowsUiaMainProvider *provider = providerForAccessible(accessible)) {
-
-                // Tries to notify the change using UiaRaiseNotificationEvent(), which is only available on
-                // Windows 10 version 1709 or newer. Otherwise uses UiaRaiseAutomationPropertyChangedEvent().
-
-                BSTR displayString = bStrFromQString(event->value().toString());
-                BSTR activityId = bStrFromQString(QString());
-
-                HRESULT hr = QWindowsUiaWrapper::instance()->raiseNotificationEvent(provider, NotificationKind_Other,
-                                                                                    NotificationProcessing_ImportantMostRecent,
-                                                                                    displayString, activityId);
-
-                ::SysFreeString(displayString);
-                ::SysFreeString(activityId);
-
-                if (hr == static_cast<HRESULT>(UIA_E_NOTSUPPORTED)) {
-                    VARIANT oldVal, newVal;
-                    clearVariant(&oldVal);
-                    setVariantString(event->value().toString(), &newVal);
-                    QWindowsUiaWrapper::instance()->raiseAutomationPropertyChangedEvent(provider, UIA_ValueValuePropertyId, oldVal, newVal);
-                    ::SysFreeString(newVal.bstrVal);
-                }
+                // Notifies changes in string values.
+                VARIANT oldVal, newVal;
+                clearVariant(&oldVal);
+                setVariantString(event->value().toString(), &newVal);
+                QWindowsUiaWrapper::instance()->raiseAutomationPropertyChangedEvent(provider, UIA_ValueValuePropertyId, oldVal, newVal);
             }
         } else if (QAccessibleValueInterface *valueInterface = accessible->valueInterface()) {
             if (QWindowsUiaMainProvider *provider = providerForAccessible(accessible)) {
diff -pruN 5.15.15+dfsg-2/src/plugins/platforms/xcb/qxcbdrag.cpp 5.15.17+dfsg-1/src/plugins/platforms/xcb/qxcbdrag.cpp
--- 5.15.15+dfsg-2/src/plugins/platforms/xcb/qxcbdrag.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/plugins/platforms/xcb/qxcbdrag.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -1294,7 +1294,7 @@ void QXcbDrag::handleSelectionRequest(co
 
 bool QXcbDrag::dndEnable(QXcbWindow *w, bool on)
 {
-    qCDebug(lcQpaXDnd) << "dndEnable" << w << on;
+    qCDebug(lcQpaXDnd) << "dndEnable" << static_cast<QPlatformWindow *>(w) << on;
     // Windows announce that they support the XDND protocol by creating a window property XdndAware.
     if (on) {
         QXcbWindow *window = nullptr;
diff -pruN 5.15.15+dfsg-2/src/plugins/platforms/xcb/qxcbwindow.cpp 5.15.17+dfsg-1/src/plugins/platforms/xcb/qxcbwindow.cpp
--- 5.15.15+dfsg-2/src/plugins/platforms/xcb/qxcbwindow.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/plugins/platforms/xcb/qxcbwindow.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -94,6 +94,7 @@ enum {
 QT_BEGIN_NAMESPACE
 
 Q_LOGGING_CATEGORY(lcQpaWindow, "qt.qpa.window");
+Q_LOGGING_CATEGORY(lcQpaXcbWindow, "qt.qpa.xcb.window");
 
 Q_DECLARE_TYPEINFO(xcb_rectangle_t, Q_PRIMITIVE_TYPE);
 
@@ -129,7 +130,7 @@ const quint32 XEMBED_VERSION = 0;
 
 QXcbScreen *QXcbWindow::parentScreen()
 {
-    return parent() ? static_cast<QXcbWindow*>(parent())->parentScreen() : xcbScreen();
+    return QPlatformWindow::parent() ? static_cast<QXcbWindow*>(QPlatformWindow::parent())->parentScreen() : xcbScreen();
 }
 
 //QPlatformWindow::screenForGeometry version that uses deviceIndependentGeometry
@@ -267,6 +268,7 @@ enum : quint32 {
 
 void QXcbWindow::create()
 {
+    xcb_window_t old_m_window = m_window;
     destroy();
 
     m_windowState = Qt::WindowNoState;
@@ -275,8 +277,8 @@ void QXcbWindow::create()
     Qt::WindowType type = window()->type();
 
     QXcbScreen *currentScreen = xcbScreen();
-    QXcbScreen *platformScreen = parent() ? parentScreen() : initialScreen();
-    QRect rect = parent()
+    QXcbScreen *platformScreen = QPlatformWindow::parent() ? parentScreen() : initialScreen();
+    QRect rect = QPlatformWindow::parent()
         ? QHighDpi::toNativeLocalPosition(window()->geometry(), platformScreen)
         : QHighDpi::toNativePixels(window()->geometry(), platformScreen);
 
@@ -316,11 +318,11 @@ void QXcbWindow::create()
         QWindowSystemInterface::handleWindowScreenChanged(window(), platformScreen->QPlatformScreen::screen());
 
     xcb_window_t xcb_parent_id = platformScreen->root();
-    if (parent()) {
-        xcb_parent_id = static_cast<QXcbWindow *>(parent())->xcb_window();
-        m_embedded = parent()->isForeignWindow();
+    if (QPlatformWindow::parent()) {
+        xcb_parent_id = static_cast<QXcbWindow *>(QPlatformWindow::parent())->xcb_window();
+        m_embedded = QPlatformWindow::parent()->isForeignWindow();
 
-        QSurfaceFormat parentFormat = parent()->window()->requestedFormat();
+        QSurfaceFormat parentFormat = QPlatformWindow::parent()->window()->requestedFormat();
         if (window()->surfaceType() != QSurface::OpenGLSurface && parentFormat.hasAlpha()) {
             window()->setFormat(parentFormat);
         }
@@ -338,16 +340,16 @@ void QXcbWindow::create()
             qWarning() << "Failed to use requested visual id.";
     }
 
-    if (parent()) {
+    if (QPlatformWindow::parent()) {
         // When using a Vulkan QWindow via QWidget::createWindowContainer() we
         // must make sure the visuals are compatible. Now, the parent will be
         // of RasterGLSurface which typically chooses a GLX/EGL compatible
         // visual which may not be what the Vulkan window would choose.
         // Therefore, take the parent's visual.
         if (window()->surfaceType() == QSurface::VulkanSurface
-                && parent()->window()->surfaceType() != QSurface::VulkanSurface)
+                && QPlatformWindow::parent()->window()->surfaceType() != QSurface::VulkanSurface)
         {
-            visual = platformScreen->visualForId(static_cast<QXcbWindow *>(parent())->visualId());
+            visual = platformScreen->visualForId(static_cast<QXcbWindow *>(QPlatformWindow::parent())->visualId());
         }
     }
 
@@ -515,6 +517,17 @@ void QXcbWindow::create()
 
     if (m_trayIconWindow)
         m_embedded = requestSystemTrayWindowDock();
+
+    if (m_window != old_m_window) {
+        if (!m_wmTransientForChildren.isEmpty()) {
+            QList<QPointer<QXcbWindow>> transientChildren = m_wmTransientForChildren;
+            m_wmTransientForChildren.clear();
+            for (auto transientChild : transientChildren) {
+                if (transientChild)
+                    transientChild->updateWmTransientFor();
+            }
+        }
+    }
 }
 
 QXcbWindow::~QXcbWindow()
@@ -539,6 +552,8 @@ void QXcbWindow::destroy()
         doFocusOut();
     if (connection()->mouseGrabber() == this)
         connection()->setMouseGrabber(nullptr);
+    if (connection()->mousePressWindow() == this)
+        connection()->setMousePressWindow(nullptr);
 
     if (m_syncCounter && connection()->hasXSync())
         xcb_sync_destroy_counter(xcb_connection(), m_syncCounter);
@@ -570,7 +585,7 @@ void QXcbWindow::setGeometry(const QRect
     propagateSizeHints();
 
     QXcbScreen *currentScreen = xcbScreen();
-    QXcbScreen *newScreen = parent() ? parentScreen() : static_cast<QXcbScreen*>(screenForGeometry(rect));
+    QXcbScreen *newScreen = QPlatformWindow::parent() ? parentScreen() : static_cast<QXcbScreen*>(screenForGeometry(rect));
 
     if (!newScreen)
         newScreen = xcbScreen();
@@ -689,6 +704,44 @@ void QXcbWindow::setVisible(bool visible
         hide();
 }
 
+void QXcbWindow::updateWmTransientFor()
+{
+    xcb_window_t transientXcbParent = XCB_NONE;
+    if (isTransient(window())) {
+        QWindow *tp = window()->transientParent();
+        if (tp && tp->handle()) {
+            QXcbWindow *handle = static_cast<QXcbWindow *>(tp->handle());
+            transientXcbParent = tp->handle()->winId();
+            if (transientXcbParent) {
+                handle->registerWmTransientForChild(this);
+                qCDebug(lcQpaXcbWindow) << Q_FUNC_INFO << static_cast<QPlatformWindow *>(handle)
+                    << " registerWmTransientForChild " << static_cast<QPlatformWindow *>(this);
+            }
+        }
+        // Default to client leader if there is no transient parent, else modal dialogs can
+        // be hidden by their parents.
+        if (!transientXcbParent)
+            transientXcbParent = connection()->clientLeader();
+        if (transientXcbParent) { // ICCCM 4.1.2.6
+            xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
+                                XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, 32,
+                                1, &transientXcbParent);
+            qCDebug(lcQpaXcbWindow, "0x%x added XCB_ATOM_WM_TRANSIENT_FOR 0x%x", m_window, transientXcbParent);
+        }
+    }
+    if (!transientXcbParent)
+        xcb_delete_property(xcb_connection(), m_window, XCB_ATOM_WM_TRANSIENT_FOR);
+}
+
+void QXcbWindow::registerWmTransientForChild(QXcbWindow *child)
+{
+    if (!child)
+        return;
+
+    if (!m_wmTransientForChildren.contains(child))
+        m_wmTransientForChildren.append(child);
+}
+
 void QXcbWindow::show()
 {
     if (window()->isTopLevel()) {
@@ -702,23 +755,7 @@ void QXcbWindow::show()
         propagateSizeHints();
 
         // update WM_TRANSIENT_FOR
-        xcb_window_t transientXcbParent = 0;
-        if (isTransient(window())) {
-            const QWindow *tp = window()->transientParent();
-            if (tp && tp->handle())
-                transientXcbParent = tp->handle()->winId();
-            // Default to client leader if there is no transient parent, else modal dialogs can
-            // be hidden by their parents.
-            if (!transientXcbParent)
-                transientXcbParent = connection()->clientLeader();
-            if (transientXcbParent) { // ICCCM 4.1.2.6
-                xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
-                                    XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, 32,
-                                    1, &transientXcbParent);
-            }
-        }
-        if (!transientXcbParent)
-            xcb_delete_property(xcb_connection(), m_window, XCB_ATOM_WM_TRANSIENT_FOR);
+        updateWmTransientFor();
 
         // update _NET_WM_STATE
         setNetWmStateOnUnmappedWindow();
@@ -1062,7 +1099,7 @@ void QXcbWindow::setNetWmState(Qt::Windo
 void QXcbWindow::setNetWmStateOnUnmappedWindow()
 {
     if (Q_UNLIKELY(m_mapped))
-        qCWarning(lcQpaXcb()) << "internal error: " << Q_FUNC_INFO << "called on mapped window";
+        qCDebug(lcQpaXcb()) << "internal info: " << Q_FUNC_INFO << "called on mapped window";
 
     NetWmStates states;
     const Qt::WindowFlags flags = window()->flags();
@@ -1418,7 +1455,8 @@ void QXcbWindow::propagateSizeHints()
                                           qMin(XCOORD_MAX, maximumSize.height()));
 
     if (sizeIncrement.width() > 0 || sizeIncrement.height() > 0) {
-        xcb_icccm_size_hints_set_base_size(&hints, baseSize.width(), baseSize.height());
+        if (!baseSize.isNull() && baseSize.isValid())
+            xcb_icccm_size_hints_set_base_size(&hints, baseSize.width(), baseSize.height());
         xcb_icccm_size_hints_set_resize_inc(&hints, sizeIncrement.width(), sizeIncrement.height());
     }
 
@@ -1444,6 +1482,11 @@ void QXcbWindow::requestActivateWindow()
 
     updateNetWmUserTime(connection()->time());
     QWindow *focusWindow = QGuiApplication::focusWindow();
+    xcb_window_t current = XCB_NONE;
+    if (focusWindow) {
+        if (QPlatformWindow *pw = focusWindow->handle())
+            current = pw->winId();
+    }
 
     if (window()->isTopLevel()
         && !(window()->flags() & Qt::X11BypassWindowManagerHint)
@@ -1458,7 +1501,7 @@ void QXcbWindow::requestActivateWindow()
         event.type = atom(QXcbAtom::_NET_ACTIVE_WINDOW);
         event.data.data32[0] = 1;
         event.data.data32[1] = connection()->time();
-        event.data.data32[2] = focusWindow ? focusWindow->winId() : XCB_NONE;
+        event.data.data32[2] = current;
         event.data.data32[3] = 0;
         event.data.data32[4] = 0;
 
@@ -1794,7 +1837,7 @@ void QXcbWindow::handleConfigureNotifyEv
 {
     bool fromSendEvent = (event->response_type & 0x80);
     QPoint pos(event->x, event->y);
-    if (!parent() && !fromSendEvent) {
+    if (!QPlatformWindow::parent() && !fromSendEvent) {
         // Do not trust the position, query it instead.
         auto reply = Q_XCB_REPLY(xcb_translate_coordinates, xcb_connection(),
                                  xcb_window(), xcbScreen()->root(), 0, 0);
@@ -1805,7 +1848,7 @@ void QXcbWindow::handleConfigureNotifyEv
     }
 
     const QRect actualGeometry = QRect(pos, QSize(event->width, event->height));
-    QPlatformScreen *newScreen = parent() ? parent()->screen() : screenForGeometry(actualGeometry);
+    QPlatformScreen *newScreen = QPlatformWindow::parent() ? QPlatformWindow::parent()->screen() : screenForGeometry(actualGeometry);
     if (!newScreen)
         return;
 
@@ -1915,7 +1958,7 @@ void QXcbWindow::handleButtonPressEvent(
 
     if (m_embedded && !m_trayIconWindow) {
         if (window() != QGuiApplication::focusWindow()) {
-            const QXcbWindow *container = static_cast<const QXcbWindow *>(parent());
+            const QXcbWindow *container = static_cast<const QXcbWindow *>(QPlatformWindow::parent());
             Q_ASSERT(container != nullptr);
 
             sendXEmbedMessage(container->xcb_window(), XEMBED_REQUEST_FOCUS);
@@ -1980,10 +2023,15 @@ static inline bool doCheckUnGrabAncestor
     return true;
 }
 
-static bool ignoreLeaveEvent(quint8 mode, quint8 detail, QXcbConnection *conn = nullptr)
+static bool windowContainsGlobalPoint(QXcbWindow *window, int x, int y)
+{
+    return window ? window->geometry().contains(window->mapFromGlobal(QPoint(x, y))) : false;
+}
+
+static bool ignoreLeaveEvent(quint8 mode, quint8 detail, QXcbConnection *conn)
 {
     return ((doCheckUnGrabAncestor(conn)
-             && mode == XCB_NOTIFY_MODE_GRAB && detail == XCB_NOTIFY_DETAIL_ANCESTOR)
+            && mode == XCB_NOTIFY_MODE_GRAB && detail == XCB_NOTIFY_DETAIL_ANCESTOR)
             || (mode == XCB_NOTIFY_MODE_UNGRAB && detail == XCB_NOTIFY_DETAIL_INFERIOR)
             || detail == XCB_NOTIFY_DETAIL_VIRTUAL
             || detail == XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL);
@@ -2003,14 +2051,13 @@ void QXcbWindow::handleEnterNotifyEvent(
 {
     connection()->setTime(timestamp);
 
-    const QPoint global = QPoint(root_x, root_y);
-
     if (ignoreEnterEvent(mode, detail, connection()) || connection()->mousePressWindow())
         return;
 
     // Updates scroll valuators, as user might have done some scrolling outside our X client.
     connection()->xi2UpdateScrollingDevices();
 
+    const QPoint global = QPoint(root_x, root_y);
     const QPoint local(event_x, event_y);
     QWindowSystemInterface::handleEnterEvent(window(), local, global);
 }
@@ -2020,8 +2067,11 @@ void QXcbWindow::handleLeaveNotifyEvent(
 {
     connection()->setTime(timestamp);
 
-    if (ignoreLeaveEvent(mode, detail, connection()) || connection()->mousePressWindow())
+    QXcbWindow *mousePressWindow = connection()->mousePressWindow();
+    if (ignoreLeaveEvent(mode, detail, connection())
+        || (mousePressWindow && windowContainsGlobalPoint(mousePressWindow, root_x, root_y))) {
         return;
+    }
 
     // check if enter event is buffered
     auto event = connection()->eventQueue()->peek([](xcb_generic_event_t *event, int type) {
@@ -2039,6 +2089,8 @@ void QXcbWindow::handleLeaveNotifyEvent(
         QWindowSystemInterface::handleEnterLeaveEvent(enterWindow->window(), window(), local, global);
     } else {
         QWindowSystemInterface::handleLeaveEvent(window());
+        if (!windowContainsGlobalPoint(this, root_x, root_y))
+            connection()->setMousePressWindow(nullptr);
     }
 
     free(enter);
@@ -2363,7 +2415,7 @@ bool QXcbWindow::windowEvent(QEvent *eve
             case Qt::BacktabFocusReason:
                 {
                 const QXcbWindow *container =
-                    static_cast<const QXcbWindow *>(parent());
+                    static_cast<const QXcbWindow *>(QPlatformWindow::parent());
                 sendXEmbedMessage(container->xcb_window(),
                                   focusEvent->reason() == Qt::TabFocusReason ?
                                   XEMBED_FOCUS_NEXT : XEMBED_FOCUS_PREV);
diff -pruN 5.15.15+dfsg-2/src/plugins/platforms/xcb/qxcbwindow.h 5.15.17+dfsg-1/src/plugins/platforms/xcb/qxcbwindow.h
--- 5.15.15+dfsg-2/src/plugins/platforms/xcb/qxcbwindow.h	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/plugins/platforms/xcb/qxcbwindow.h	2024-11-20 13:56:33.000000000 +0000
@@ -41,6 +41,8 @@
 #define QXCBWINDOW_H
 
 #include <qpa/qplatformwindow.h>
+#include <QtCore/QObject>
+#include <QtCore/QPointer>
 #include <QtGui/QSurfaceFormat>
 #include <QtGui/QImage>
 
@@ -57,8 +59,9 @@ class QXcbScreen;
 class QXcbSyncWindowRequest;
 class QIcon;
 
-class Q_XCB_EXPORT QXcbWindow : public QXcbObject, public QXcbWindowEventListener, public QPlatformWindow
+class Q_XCB_EXPORT QXcbWindow : public QObject, public QXcbObject, public QXcbWindowEventListener, public QPlatformWindow
 {
+    Q_OBJECT
 public:
     enum NetWmState {
         NetWmStateAbove = 0x1,
@@ -154,6 +157,8 @@ public:
                           Qt::KeyboardModifiers modifiers, QEvent::Type type, Qt::MouseEventSource source);
 
     void updateNetWmUserTime(xcb_timestamp_t timestamp);
+    void updateWmTransientFor();
+    void registerWmTransientForChild(QXcbWindow *);
 
     static void setWmWindowTypeStatic(QWindow *window, QXcbWindowFunctions::WmWindowTypes windowTypes);
     static void setWmWindowRoleStatic(QWindow *window, const QByteArray &role);
@@ -290,6 +295,8 @@ protected:
     qreal m_sizeHintsScaleFactor = 1.0;
 
     RecreationReasons m_recreationReasons = RecreationNotNeeded;
+
+    QList<QPointer<QXcbWindow>> m_wmTransientForChildren;
 };
 
 class QXcbForeignWindow : public QXcbWindow
diff -pruN 5.15.15+dfsg-2/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp 5.15.17+dfsg-1/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp
--- 5.15.15+dfsg-2/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -233,6 +233,9 @@ void QXdgDesktopPortalFileDialog::openPo
             filter.name = mimeType.comment();
             filter.filterConditions = filterConditions;
 
+            if (filter.name.isEmpty())
+                filter.name = mimeTypefilter;
+
             filterList << filter;
 
             if (!d->selectedMimeTypeFilter.isEmpty() && d->selectedMimeTypeFilter == mimeTypefilter)
diff -pruN 5.15.15+dfsg-2/src/testlib/qtestcase.qdoc 5.15.17+dfsg-1/src/testlib/qtestcase.qdoc
--- 5.15.15+dfsg-2/src/testlib/qtestcase.qdoc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/testlib/qtestcase.qdoc	2024-11-20 13:56:33.000000000 +0000
@@ -237,7 +237,7 @@
 
    Example:
    \code
-   QTRY_VERIFY2_WITH_TIMEOUT(list.size() > 2, QByteArray::number(list.size()).constData());
+   QTRY_VERIFY2(list.size() > 2, QByteArray::number(list.size()).constData());
    \endcode
 
    \note This macro can only be used in a test function that is invoked
@@ -617,8 +617,8 @@
     this macro.
 
     Unlike QBENCHMARK, the contents of the contained code block is only run
-    once. The elapsed time will be reported as "0" if it's to short to
-    be measured by the selected backend. (Use)
+    once. The elapsed time will be reported as "0" if it's too short to
+    be measured by the selected backend.
 
     \sa {Qt Test Overview#Creating a Benchmark}{Creating a Benchmark},
     {Chapter 5: Writing a Benchmark}{Writing a Benchmark}
diff -pruN 5.15.15+dfsg-2/src/tools/androiddeployqt/main.cpp 5.15.17+dfsg-1/src/tools/androiddeployqt/main.cpp
--- 5.15.15+dfsg-2/src/tools/androiddeployqt/main.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/tools/androiddeployqt/main.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -2332,8 +2332,9 @@ void checkAndWarnGradleLongPaths(const Q
     QDirIterator it(outputDirectory, QStringList(QStringLiteral("*.java")), QDir::Files,
                     QDirIterator::Subdirectories);
     while (it.hasNext()) {
-        if (it.next().size() >= MAX_PATH)
-            longFileNames.append(it.next());
+        const QString &filePath = it.next();
+        if (filePath.size() >= MAX_PATH)
+            longFileNames.append(filePath);
     }
 
     if (!longFileNames.isEmpty()) {
diff -pruN 5.15.15+dfsg-2/src/widgets/accessible/qaccessiblewidgets.cpp 5.15.17+dfsg-1/src/widgets/accessible/qaccessiblewidgets.cpp
--- 5.15.15+dfsg-2/src/widgets/accessible/qaccessiblewidgets.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/widgets/accessible/qaccessiblewidgets.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -900,7 +900,7 @@ QString QAccessibleTextWidget::attribute
             underlineStyleValue = QStringLiteral("wave"); // this is not correct, but provides good approximation at least
             break;
         default:
-            qWarning() << "Unknown QTextCharFormat::​UnderlineStyle value " << underlineStyle << " could not be translated to IAccessible2 value";
+            qWarning() << "Unknown QTextCharFormat::UnderlineStyle value " << underlineStyle << " could not be translated to IAccessible2 value";
             break;
     }
     if (!underlineStyleValue.isNull()) {
diff -pruN 5.15.15+dfsg-2/src/widgets/doc/snippets/code/src_gui_dialogs_qfiledialog.cpp 5.15.17+dfsg-1/src/widgets/doc/snippets/code/src_gui_dialogs_qfiledialog.cpp
--- 5.15.15+dfsg-2/src/widgets/doc/snippets/code/src_gui_dialogs_qfiledialog.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/widgets/doc/snippets/code/src_gui_dialogs_qfiledialog.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -157,5 +157,5 @@ QFileDialog::getOpenFileContent("Images
 
 //! [16]
 QByteArray imageData; // obtained from e.g. QImage::save()
-QFileDialog::saveFile("myimage.png", imageData);
+QFileDialog::saveFileContent(imageData, "myimage.png");
 //! [16]
diff -pruN 5.15.15+dfsg-2/src/widgets/kernel/qwidget.cpp 5.15.17+dfsg-1/src/widgets/kernel/qwidget.cpp
--- 5.15.15+dfsg-2/src/widgets/kernel/qwidget.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/widgets/kernel/qwidget.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -1272,7 +1272,6 @@ void QWidgetPrivate::create()
         win->setProperty("_q_showWithoutActivating", QVariant(true));
     if (q->testAttribute(Qt::WA_MacAlwaysShowToolWindow))
         win->setProperty("_q_macAlwaysShowToolWindow", QVariant(true));
-    setNetWmWindowTypes(true); // do nothing if none of WA_X11NetWmWindowType* is set
     win->setFlags(flags);
     fixPosIncludesFrame();
     if (q->testAttribute(Qt::WA_Moved)
@@ -1345,6 +1344,7 @@ void QWidgetPrivate::create()
         Q_ASSERT(id != WId(0));
         setWinId(id);
     }
+    setNetWmWindowTypes(true); // do nothing if none of WA_X11NetWmWindowType* is set
 
     // Check children and create windows for them if necessary
     q_createNativeChildrenAndSetParent(q);
diff -pruN 5.15.15+dfsg-2/src/widgets/util/qsystemtrayicon.cpp 5.15.17+dfsg-1/src/widgets/util/qsystemtrayicon.cpp
--- 5.15.15+dfsg-2/src/widgets/util/qsystemtrayicon.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/widgets/util/qsystemtrayicon.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -208,7 +208,7 @@ void QSystemTrayIcon::setContextMenu(QMe
     if (oldMenu != menu && d->qpa_sys) {
         // Show the QMenu-based menu for QPA plugins that do not provide native menus
         if (oldMenu && !oldMenu->platformMenu())
-            QObject::disconnect(d->qpa_sys, &QPlatformSystemTrayIcon::contextMenuRequested, menu, nullptr);
+            QObject::disconnect(d->qpa_sys, &QPlatformSystemTrayIcon::contextMenuRequested, oldMenu, nullptr);
         if (menu && !menu->platformMenu()) {
             QObject::connect(d->qpa_sys, &QPlatformSystemTrayIcon::contextMenuRequested,
                              menu,
diff -pruN 5.15.15+dfsg-2/src/widgets/widgets/qcalendarwidget.cpp 5.15.17+dfsg-1/src/widgets/widgets/qcalendarwidget.cpp
--- 5.15.15+dfsg-2/src/widgets/widgets/qcalendarwidget.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/widgets/widgets/qcalendarwidget.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -2515,8 +2515,7 @@ void QCalendarWidget::showToday()
     \snippet code/src_gui_widgets_qcalendarwidget.cpp 1
     \endtable
 
-    By default, the minimum date is the earliest date that the QDate
-    class can handle.
+    The default minimum date is November 25, 4714 BCE.
 
     When setting a minimum date, the maximumDate and selectedDate
     properties are adjusted if the selection range becomes invalid. If
@@ -2566,8 +2565,7 @@ void QCalendarWidget::setMinimumDate(con
     \snippet code/src_gui_widgets_qcalendarwidget.cpp 2
     \endtable
 
-    By default, the maximum date is the last day the QDate class can
-    handle.
+    The default maximum date is December 31, 9999 CE.
 
     When setting a maximum date, the minimumDate and selectedDate
     properties are adjusted if the selection range becomes invalid. If
diff -pruN 5.15.15+dfsg-2/src/xml/sax/qxml.cpp 5.15.17+dfsg-1/src/xml/sax/qxml.cpp
--- 5.15.15+dfsg-2/src/xml/sax/qxml.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/src/xml/sax/qxml.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -7464,7 +7464,12 @@ bool QXmlSimpleReaderPrivate::parseRefer
             case DoneD:
                 tmp = ref().toUInt(&ok, 10);
                 if (ok) {
-                    stringAddC(QChar(tmp));
+                    if (tmp > 0xffff) {
+                        stringAddC(QChar::highSurrogate(tmp));
+                        stringAddC(QChar::lowSurrogate(tmp));
+                    } else {
+                        stringAddC(QChar(tmp));
+                    }
                 } else {
                     reportParseError(QLatin1String(XMLERR_ERRORPARSINGREFERENCE));
                     return false;
@@ -7475,7 +7480,12 @@ bool QXmlSimpleReaderPrivate::parseRefer
             case DoneH:
                 tmp = ref().toUInt(&ok, 16);
                 if (ok) {
-                    stringAddC(QChar(tmp));
+                    if (tmp > 0xffff) {
+                        stringAddC(QChar::highSurrogate(tmp));
+                        stringAddC(QChar::lowSurrogate(tmp));
+                    } else {
+                        stringAddC(QChar(tmp));
+                    }
                 } else {
                     reportParseError(QLatin1String(XMLERR_ERRORPARSINGREFERENCE));
                     return false;
diff -pruN 5.15.15+dfsg-2/tests/auto/corelib/kernel/qmetaenum/tst_qmetaenum.cpp 5.15.17+dfsg-1/tests/auto/corelib/kernel/qmetaenum/tst_qmetaenum.cpp
--- 5.15.15+dfsg-2/tests/auto/corelib/kernel/qmetaenum/tst_qmetaenum.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/corelib/kernel/qmetaenum/tst_qmetaenum.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -98,6 +98,10 @@ void tst_QMetaEnum::valuesToKeys()
 
     QMetaEnum me = QMetaEnum::fromType<Qt::WindowFlags>();
     QCOMPARE(me.valueToKeys(windowFlags), expected);
+    bool ok = false;
+    using U = Qt::WindowFlags::Int;
+    QCOMPARE(U(me.keysToValue(expected, &ok)), U(windowFlags));
+    QVERIFY(ok);
 }
 
 void tst_QMetaEnum::defaultConstructed()
diff -pruN 5.15.15+dfsg-2/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp 5.15.17+dfsg-1/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp
--- 5.15.15+dfsg-2/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -46,6 +46,7 @@ private slots:
     void comparisonOperators();
 
     void fromSignal();
+    void fromSignalOfNullSignalIsInvalid();
 
     void gadget();
 };
@@ -725,6 +726,12 @@ void tst_QMetaMethod::fromSignal()
 #undef FROMSIGNAL_HELPER
 }
 
+void tst_QMetaMethod::fromSignalOfNullSignalIsInvalid()
+{
+    constexpr decltype(&QObject::destroyed) ptr = nullptr;
+    QVERIFY(!QMetaMethod::fromSignal(ptr).isValid());
+}
+
 class MyGadget {
     Q_GADGET
 public:
diff -pruN 5.15.15+dfsg-2/tests/auto/corelib/text/qstring/tst_qstring.cpp 5.15.17+dfsg-1/tests/auto/corelib/text/qstring/tst_qstring.cpp
--- 5.15.15+dfsg-2/tests/auto/corelib/text/qstring/tst_qstring.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/corelib/text/qstring/tst_qstring.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -323,7 +323,8 @@ class tst_QString : public QObject
 
     class TransientDefaultLocale
     {
-        const QLocale prior; // Records what *was* the default before we set it.
+        // This default-constructed QLocale records what *was* the default before we changed it:
+        const QLocale prior = {};
     public:
         TransientDefaultLocale(const QLocale &transient) { revise(transient); }
         void revise(const QLocale &transient) { QLocale::setDefault(transient); }
diff -pruN 5.15.15+dfsg-2/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp 5.15.17+dfsg-1/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp
--- 5.15.15+dfsg-2/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -72,8 +72,8 @@ void tst_QHashFunctions::consistent()
     {
         const QString s = QStringLiteral("abcdefghijklmnopqrstuvxyz").repeated(16);
 
-        QCOMPARE(qHash(s), qHash(QStringRef(&s)));
-        QCOMPARE(qHash(s), qHash(QStringView(s)));
+        QCOMPARE(qHash(s, seed), qHash(QStringRef(&s), seed));
+        QCOMPARE(qHash(s, seed), qHash(QStringView(s), seed));
     }
 }
 
diff -pruN 5.15.15+dfsg-2/tests/auto/gui/painting/qpainter/tst_qpainter.cpp 5.15.17+dfsg-1/tests/auto/gui/painting/qpainter/tst_qpainter.cpp
--- 5.15.15+dfsg-2/tests/auto/gui/painting/qpainter/tst_qpainter.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/gui/painting/qpainter/tst_qpainter.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -84,6 +84,7 @@ private slots:
 #endif
     void drawPixmapFragments();
     void drawPixmapNegativeScale();
+    void drawPixmapRounding();
 
     void drawLine_data();
     void drawLine();
@@ -799,6 +800,16 @@ void tst_QPainter::drawPixmapNegativeSca
     QVERIFY(resultImage.pixel(12, 8) == qRgba(0, 0, 0, 255)); // and right strip is now black
 }
 
+void tst_QPainter::drawPixmapRounding()
+{
+    // Just test that we don't assert
+    QBitmap bm(8, 8);
+    QImage out(64, 64, QImage::Format_RGB32);
+    QPainter p(&out);
+    qreal y = 26.499999999999996;
+    p.drawPixmap(QPointF(0, y), bm);
+}
+
 void tst_QPainter::drawLine_data()
 {
     QTest::addColumn<QLine>("line");
diff -pruN 5.15.15+dfsg-2/tests/auto/gui/text/qtextmarkdownimporter/data/thematicBreaks.md 5.15.17+dfsg-1/tests/auto/gui/text/qtextmarkdownimporter/data/thematicBreaks.md
--- 5.15.15+dfsg-2/tests/auto/gui/text/qtextmarkdownimporter/data/thematicBreaks.md	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/gui/text/qtextmarkdownimporter/data/thematicBreaks.md	2024-11-20 13:56:33.000000000 +0000
@@ -11,6 +11,7 @@ stars
 stars with tabs between
 ***  	   
 stars with whitespace after
+
 ---   	   
 hyphens with whitespace after
 _____	   
diff -pruN 5.15.15+dfsg-2/tests/auto/gui/util/qtexturefilereader/qtexturefilereader.qrc 5.15.17+dfsg-1/tests/auto/gui/util/qtexturefilereader/qtexturefilereader.qrc
--- 5.15.15+dfsg-2/tests/auto/gui/util/qtexturefilereader/qtexturefilereader.qrc	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/gui/util/qtexturefilereader/qtexturefilereader.qrc	2024-11-20 13:56:33.000000000 +0000
@@ -5,5 +5,6 @@
         <file>texturefiles/car_mips.ktx</file>
         <file>texturefiles/newlogo_srgb.astc</file>
         <file>texturefiles/newlogo.astc</file>
+        <file>texturefiles/invalid.ktx</file>
     </qresource>
 </RCC>
Binary files 5.15.15+dfsg-2/tests/auto/gui/util/qtexturefilereader/texturefiles/invalid.ktx and 5.15.17+dfsg-1/tests/auto/gui/util/qtexturefilereader/texturefiles/invalid.ktx differ
diff -pruN 5.15.15+dfsg-2/tests/auto/gui/util/qtexturefilereader/tst_qtexturefilereader.cpp 5.15.17+dfsg-1/tests/auto/gui/util/qtexturefilereader/tst_qtexturefilereader.cpp
--- 5.15.15+dfsg-2/tests/auto/gui/util/qtexturefilereader/tst_qtexturefilereader.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/gui/util/qtexturefilereader/tst_qtexturefilereader.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -36,6 +36,7 @@ class tst_qtexturefilereader : public QO
 private slots:
     void checkHandlers_data();
     void checkHandlers();
+    void checkInvalid();
 };
 
 void tst_qtexturefilereader::checkHandlers_data()
@@ -128,6 +129,16 @@ void tst_qtexturefilereader::checkHandle
     }
 }
 
+void tst_qtexturefilereader::checkInvalid()
+{
+    QFile f(":/texturefiles/invalid.ktx");
+    QVERIFY(f.open(QIODevice::ReadOnly));
+    QTextureFileReader r(&f);
+    QTextureFileData d = r.read();
+
+    // Basically just checking that we don't crash on and invalid file
+}
+
 QTEST_MAIN(tst_qtexturefilereader)
 
 #include "tst_qtexturefilereader.moc"
diff -pruN 5.15.15+dfsg-2/tests/auto/network/ssl/qdtls/tst_qdtls.cpp 5.15.17+dfsg-1/tests/auto/network/ssl/qdtls/tst_qdtls.cpp
--- 5.15.15+dfsg-2/tests/auto/network/ssl/qdtls/tst_qdtls.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/network/ssl/qdtls/tst_qdtls.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -600,20 +600,28 @@ void tst_QDtls::protocolVersionMatching_
     QTest::addColumn<QSsl::SslProtocol>("clientProtocol");
     QTest::addColumn<bool>("works");
 
-    QTest::addRow("DtlsV1_0 <-> DtlsV1_0") << QSsl::DtlsV1_0 << QSsl::DtlsV1_0 << true;
-    QTest::addRow("DtlsV1_0OrLater <-> DtlsV1_0") << QSsl::DtlsV1_0OrLater << QSsl::DtlsV1_0 << true;
-    QTest::addRow("DtlsV1_0 <-> DtlsV1_0OrLater") << QSsl::DtlsV1_0 << QSsl::DtlsV1_0OrLater << true;
-    QTest::addRow("DtlsV1_0OrLater <-> DtlsV1_0OrLater") << QSsl::DtlsV1_0OrLater << QSsl::DtlsV1_0OrLater << true;
+    //OPENSSL_VERSION_NUMBER :
+    //(OPENSSL_VERSION_MAJOR<<28) | (OPENSSL_VERSION_MINOR<<20) | (OPENSSL_VERSION_PATCH<<4)
+    const long ossl311 = 0x30100010;
+    
+    if (QSslSocket::sslLibraryVersionNumber() < ossl311) {
+        QTest::addRow("DtlsV1_0 <-> DtlsV1_0") << QSsl::DtlsV1_0 << QSsl::DtlsV1_0 << true;
+        QTest::addRow("DtlsV1_0OrLater <-> DtlsV1_0") << QSsl::DtlsV1_0OrLater << QSsl::DtlsV1_0 << true;
+        QTest::addRow("DtlsV1_0 <-> DtlsV1_0OrLater") << QSsl::DtlsV1_0 << QSsl::DtlsV1_0OrLater << true;
+        QTest::addRow("DtlsV1_0OrLater <-> DtlsV1_0OrLater") << QSsl::DtlsV1_0OrLater << QSsl::DtlsV1_0OrLater << true;
+    }
 
     QTest::addRow("DtlsV1_2 <-> DtlsV1_2") << QSsl::DtlsV1_2 << QSsl::DtlsV1_2 << true;
     QTest::addRow("DtlsV1_2OrLater <-> DtlsV1_2") << QSsl::DtlsV1_2OrLater << QSsl::DtlsV1_2 << true;
     QTest::addRow("DtlsV1_2 <-> DtlsV1_2OrLater") << QSsl::DtlsV1_2 << QSsl::DtlsV1_2OrLater << true;
     QTest::addRow("DtlsV1_2OrLater <-> DtlsV1_2OrLater") << QSsl::DtlsV1_2OrLater << QSsl::DtlsV1_2OrLater << true;
 
-    QTest::addRow("DtlsV1_0 <-> DtlsV1_2") << QSsl::DtlsV1_0 << QSsl::DtlsV1_2 << false;
-    QTest::addRow("DtlsV1_0 <-> DtlsV1_2OrLater") << QSsl::DtlsV1_0 << QSsl::DtlsV1_2OrLater << false;
-    QTest::addRow("DtlsV1_2 <-> DtlsV1_0") << QSsl::DtlsV1_2 << QSsl::DtlsV1_0 << false;
-    QTest::addRow("DtlsV1_2OrLater <-> DtlsV1_0") << QSsl::DtlsV1_2OrLater << QSsl::DtlsV1_0 << false;
+    if (QSslSocket::sslLibraryVersionNumber() < ossl311) {
+        QTest::addRow("DtlsV1_0 <-> DtlsV1_2") << QSsl::DtlsV1_0 << QSsl::DtlsV1_2 << false;
+        QTest::addRow("DtlsV1_0 <-> DtlsV1_2OrLater") << QSsl::DtlsV1_0 << QSsl::DtlsV1_2OrLater << false;
+        QTest::addRow("DtlsV1_2 <-> DtlsV1_0") << QSsl::DtlsV1_2 << QSsl::DtlsV1_0 << false;
+        QTest::addRow("DtlsV1_2OrLater <-> DtlsV1_0") << QSsl::DtlsV1_2OrLater << QSsl::DtlsV1_0 << false;
+    }
 }
 
 void tst_QDtls::protocolVersionMatching()
diff -pruN 5.15.15+dfsg-2/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp 5.15.17+dfsg-1/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp
--- 5.15.15+dfsg-2/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -306,8 +306,8 @@ protected slots:
 private:
     QSslSocket *socket;
     QList<QSslError> storedExpectedSslErrors;
+    bool isSecurityLevel0Required = false;
 #endif // QT_NO_SSL
-private:
     static int loopLevel;
 public:
     static QString testDataDir;
@@ -348,6 +348,7 @@ tst_QSslSocket::tst_QSslSocket()
 #ifndef QT_NO_OPENSSL
     qRegisterMetaType<QSslPreSharedKeyAuthenticator *>();
     qRegisterMetaType<tst_QSslSocket::PskConnectTestType>();
+    isSecurityLevel0Required = OPENSSL_VERSION_NUMBER >= 0x30100010;
 #endif
 #endif
 }
@@ -602,6 +603,10 @@ void tst_QSslSocket::simpleConnect()
     if (!QSslSocket::supportsSsl())
         return;
 
+    // Starting from OpenSSL v 3.1.1 deprecated protocol versions (we want to use when connecting) are not available by default.
+    if (isSecurityLevel0Required)
+        QSKIP("Testing with OpenSSL backend, but security level 0 is required for TLS v1.1 or earlier");
+
     QFETCH_GLOBAL(bool, setProxy);
     if (setProxy)
         return;
@@ -660,6 +665,10 @@ void tst_QSslSocket::simpleConnectWithIg
     if (!QSslSocket::supportsSsl())
         return;
 
+    // Starting from OpenSSL v 3.1.1 deprecated protocol versions (we want to use when connecting) are not available by default.
+    if (isSecurityLevel0Required)
+        QSKIP("Testing with OpenSSL backend, but security level 0 is required for TLS v1.1 or earlier");
+
     QFETCH_GLOBAL(bool, setProxy);
     if (setProxy)
         return;
@@ -702,6 +711,10 @@ void tst_QSslSocket::simpleConnectWithIg
 
 void tst_QSslSocket::sslErrors_data()
 {
+    // Starting from OpenSSL v 3.1.1 deprecated protocol versions (we want to use in 'sslErrors' test) are not available by default.
+    if (isSecurityLevel0Required)
+        QSKIP("Testing with OpenSSL backend, but security level 0 is required for TLS v1.1 or earlier");
+
     QTest::addColumn<QString>("host");
     QTest::addColumn<int>("port");
 
@@ -1714,6 +1727,10 @@ void tst_QSslSocket::waitForConnectedEnc
     if (!QSslSocket::supportsSsl())
         return;
 
+    // Starting from OpenSSL v 3.1.1 deprecated protocol versions (we want to use here) are not available by default.
+    if (isSecurityLevel0Required)
+        QSKIP("Testing with OpenSSL backend, but security level 0 is required for TLS v1.1 or earlier");
+
     QSslSocketPtr socket = newSocket();
     this->socket = socket.data();
 
@@ -2848,6 +2865,10 @@ void tst_QSslSocket::encryptWithoutConne
 
 void tst_QSslSocket::resume_data()
 {
+    // Starting from OpenSSL v 3.1.1 deprecated protocol versions (we want to use in 'resume' test) are not available by default.
+    if (isSecurityLevel0Required)
+        QSKIP("Testing with OpenSSL backend, but security level 0 is required for TLS v1.1 or earlier");
+
     QTest::addColumn<bool>("ignoreErrorsAfterPause");
     QTest::addColumn<QList<QSslError> >("errorsToIgnore");
     QTest::addColumn<bool>("expectSuccess");
diff -pruN 5.15.15+dfsg-2/tests/auto/tools/moc/tst_moc.cpp 5.15.17+dfsg-1/tests/auto/tools/moc/tst_moc.cpp
--- 5.15.15+dfsg-2/tests/auto/tools/moc/tst_moc.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/tools/moc/tst_moc.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -758,6 +758,14 @@ private:
 
 };
 
+#define VERIFY_NO_ERRORS(proc) do { \
+        auto &&p = proc; \
+        const QByteArray stderr = p.readAllStandardError(); \
+        QVERIFY2(stderr.isEmpty(), stderr.data()); \
+        QCOMPARE(p.exitCode(), 0); \
+    } while (false)
+
+
 void tst_Moc::initTestCase()
 {
     QString binpath = QLibraryInfo::location(QLibraryInfo::BinariesPath);
@@ -771,10 +779,9 @@ void tst_Moc::initTestCase()
     QProcess proc;
     proc.start(qmake, QStringList() << "-query" << "QT_INSTALL_HEADERS");
     QVERIFY(proc.waitForFinished());
-    QCOMPARE(proc.exitCode(), 0);
+    VERIFY_NO_ERRORS(proc);
     QByteArray output = proc.readAllStandardOutput();
     QVERIFY(!output.isEmpty());
-    QCOMPARE(proc.readAllStandardError(), QByteArray());
     qtIncludePath = QString::fromLocal8Bit(output).trimmed();
     QFileInfo fi(qtIncludePath);
     QVERIFY(fi.exists());
@@ -809,10 +816,9 @@ void tst_Moc::oldStyleCasts()
     QProcess proc;
     proc.start(m_moc, QStringList(m_sourceDirectory + QStringLiteral("/oldstyle-casts.h")));
     QVERIFY(proc.waitForFinished());
-    QCOMPARE(proc.exitCode(), 0);
+    VERIFY_NO_ERRORS(proc);
     QByteArray mocOut = proc.readAllStandardOutput();
     QVERIFY(!mocOut.isEmpty());
-    QCOMPARE(proc.readAllStandardError(), QByteArray());
 
     QStringList args;
     args << "-c" << "-x" << "c++" << "-Wold-style-cast" << "-I" << "."
@@ -823,8 +829,7 @@ void tst_Moc::oldStyleCasts()
     proc.closeWriteChannel();
 
     QVERIFY(proc.waitForFinished());
-    QCOMPARE(QString::fromLocal8Bit(proc.readAllStandardError()), QString());
-    QCOMPARE(proc.exitCode(), 0);
+    VERIFY_NO_ERRORS(proc);
 #else
     QSKIP("Only tested on linux/gcc");
 #endif
@@ -879,10 +884,9 @@ void tst_Moc::inputFileNameWithDotsButNo
     proc.setWorkingDirectory(m_sourceDirectory + QStringLiteral("/task71021"));
     proc.start(m_moc, QStringList("../Header"));
     QVERIFY(proc.waitForFinished());
-    QCOMPARE(proc.exitCode(), 0);
+    VERIFY_NO_ERRORS(proc);
     QByteArray mocOut = proc.readAllStandardOutput();
     QVERIFY(!mocOut.isEmpty());
-    QCOMPARE(proc.readAllStandardError(), QByteArray());
 
     QStringList args;
     args << "-c" << "-x" << "c++" << "-I" << ".."
@@ -893,8 +897,7 @@ void tst_Moc::inputFileNameWithDotsButNo
     proc.closeWriteChannel();
 
     QVERIFY(proc.waitForFinished());
-    QCOMPARE(QString::fromLocal8Bit(proc.readAllStandardError()), QString());
-    QCOMPARE(proc.exitCode(), 0);
+    VERIFY_NO_ERRORS(proc);
 #else
     QSKIP("Only tested on linux/gcc");
 #endif
@@ -1155,11 +1158,7 @@ void tst_Moc::ignoreOptionClashes()
     if (!finished)
         qWarning("waitForFinished failed. QProcess error: %d", (int)proc.error());
     QVERIFY(finished);
-    if (proc.exitCode() != 0) {
-        qDebug() << proc.readAllStandardError();
-    }
-    QCOMPARE(proc.exitCode(), 0);
-    QCOMPARE(proc.readAllStandardError(), QByteArray());
+    VERIFY_NO_ERRORS(proc);
     QByteArray mocOut = proc.readAllStandardOutput();
 
     // If -pthread wasn't ignored, it was parsed as a prefix of "thread/", which breaks compilation.
@@ -1173,7 +1172,7 @@ void tst_Moc::ignoreOptionClashes()
     proc.closeWriteChannel();
 
     QVERIFY(proc.waitForFinished());
-    QCOMPARE(QString::fromLocal8Bit(proc.readAllStandardError()), QString());
+    VERIFY_NO_ERRORS(proc);
 #else
     QSKIP("Only tested on linux/gcc");
 #endif
@@ -1278,11 +1277,7 @@ void tst_Moc::frameworkSearchPath()
     if (!finished)
         qWarning("waitForFinished failed. QProcess error: %d", (int)proc.error());
     QVERIFY(finished);
-    if (proc.exitCode() != 0) {
-        qDebug() << proc.readAllStandardError();
-    }
-    QCOMPARE(proc.exitCode(), 0);
-    QCOMPARE(proc.readAllStandardError(), QByteArray());
+    VERIFY_NO_ERRORS(proc);
 #else
     QSKIP("Only tested/relevant on unixy platforms");
 #endif
@@ -1314,11 +1309,9 @@ void tst_Moc::templateGtGt()
     QProcess proc;
     proc.start(m_moc, QStringList(m_sourceDirectory + QStringLiteral("/template-gtgt.h")));
     QVERIFY(proc.waitForFinished());
-    QCOMPARE(proc.exitCode(), 0);
+    VERIFY_NO_ERRORS(proc);
     QByteArray mocOut = proc.readAllStandardOutput();
     QVERIFY(!mocOut.isEmpty());
-    QString mocWarning = QString::fromLocal8Bit(proc.readAllStandardError());
-    QVERIFY(mocWarning.isEmpty());
 #else
     QSKIP("Only tested on linux/gcc");
 #endif
@@ -1335,8 +1328,7 @@ void tst_Moc::defineMacroViaCmdline()
 
     proc.start(m_moc, args);
     QVERIFY(proc.waitForFinished());
-    QCOMPARE(proc.exitCode(), 0);
-    QCOMPARE(proc.readAllStandardError(), QByteArray());
+    VERIFY_NO_ERRORS(proc);
     QByteArray mocOut = proc.readAllStandardOutput();
     QVERIFY(!mocOut.isEmpty());
 #else
@@ -1355,8 +1347,7 @@ void tst_Moc::defineMacroViaForcedInclud
 
     proc.start(m_moc, args);
     QVERIFY(proc.waitForFinished());
-    QCOMPARE(proc.exitCode(), 0);
-    QCOMPARE(proc.readAllStandardError(), QByteArray());
+    VERIFY_NO_ERRORS(proc);
     QByteArray mocOut = proc.readAllStandardOutput();
     QVERIFY(!mocOut.isEmpty());
 #else
@@ -1375,8 +1366,7 @@ void tst_Moc::defineMacroViaForcedInclud
 
     proc.start(m_moc, args);
     QVERIFY(proc.waitForFinished());
-    QCOMPARE(proc.exitCode(), 0);
-    QCOMPARE(proc.readAllStandardError(), QByteArray());
+    VERIFY_NO_ERRORS(proc);
     QByteArray mocOut = proc.readAllStandardOutput();
     QVERIFY(!mocOut.isEmpty());
 #else
@@ -1421,8 +1411,7 @@ void tst_Moc::environmentIncludePaths()
     proc.setProcessEnvironment(env);
     proc.start(m_moc, args);
     QVERIFY(proc.waitForFinished());
-    QCOMPARE(proc.exitCode(), 0);
-    QCOMPARE(proc.readAllStandardError(), QByteArray());
+    VERIFY_NO_ERRORS(proc);
     QByteArray mocOut = proc.readAllStandardOutput();
     QVERIFY(!mocOut.isEmpty());
 #else
@@ -1851,11 +1840,10 @@ void tst_Moc::notifyError()
     const QString header = m_sourceDirectory + QStringLiteral("/error-on-wrong-notify.h");
     proc.start(m_moc, QStringList(header));
     QVERIFY(proc.waitForFinished());
-    QCOMPARE(proc.exitCode(), 0);
+    VERIFY_NO_ERRORS(proc);
     QCOMPARE(proc.exitStatus(), QProcess::NormalExit);
     QByteArray mocOut = proc.readAllStandardOutput();
     QVERIFY(!mocOut.isEmpty());
-    QCOMPARE(proc.readAllStandardError(), QByteArray());
 
     QStringList args;
     args << "-c" << "-x" << "c++" << "-I" << "."
@@ -3560,10 +3548,9 @@ void tst_Moc::preprocessorOnly()
     QProcess proc;
     proc.start(m_moc, QStringList() << "-E" << m_sourceDirectory + QStringLiteral("/pp-dollar-signs.h"));
     QVERIFY(proc.waitForFinished());
-    QCOMPARE(proc.exitCode(), 0);
+    VERIFY_NO_ERRORS(proc);
     QByteArray mocOut = proc.readAllStandardOutput();
     QVERIFY(!mocOut.isEmpty());
-    QCOMPARE(proc.readAllStandardError(), QByteArray());
 
     QVERIFY(mocOut.contains("$$ = parser->createFoo()"));
 #else
diff -pruN 5.15.15+dfsg-2/tests/auto/widgets/widgets/qmainwindow/BLACKLIST 5.15.17+dfsg-1/tests/auto/widgets/widgets/qmainwindow/BLACKLIST
--- 5.15.15+dfsg-2/tests/auto/widgets/widgets/qmainwindow/BLACKLIST	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/widgets/widgets/qmainwindow/BLACKLIST	2024-11-20 13:56:33.000000000 +0000
@@ -1,2 +1,3 @@
 [resizeDocks]
 winrt
+windows-7sp1 # QTQAINFRA-6145
diff -pruN 5.15.15+dfsg-2/tests/auto/widgets/widgets/qopenglwidget/BLACKLIST 5.15.17+dfsg-1/tests/auto/widgets/widgets/qopenglwidget/BLACKLIST
--- 5.15.15+dfsg-2/tests/auto/widgets/widgets/qopenglwidget/BLACKLIST	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/widgets/widgets/qopenglwidget/BLACKLIST	2024-11-20 13:56:33.000000000 +0000
@@ -2,3 +2,6 @@
 windows-10 msvc-2017
 sles-15.4 # QTBUG-104241
 
+# QTQAINFRA-6145
+[clearAndGrab]
+windows-7sp1
\ No newline at end of file
diff -pruN 5.15.15+dfsg-2/tests/auto/xml/sax/qxmlsimplereader/parser/main.cpp 5.15.17+dfsg-1/tests/auto/xml/sax/qxmlsimplereader/parser/main.cpp
--- 5.15.15+dfsg-2/tests/auto/xml/sax/qxmlsimplereader/parser/main.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/xml/sax/qxmlsimplereader/parser/main.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -37,7 +37,6 @@
 
 #include "parser.h"
 
-static QTextStream qout(stdout, QIODevice::WriteOnly);
 static QTextStream qerr(stderr, QIODevice::WriteOnly);
 
 static void usage()
@@ -79,19 +78,15 @@ int main(int argc, const char *argv[])
     if (out_file_name.isEmpty())
         out_file_name = file_name + ".ref";
 
-    QFile _out_file;
-    QTextStream _out_stream;
-    QTextStream *out_stream;
+    QFile out_file;
     if (out_file_name == "-") {
-        out_stream = &qout;
+        out_file.open(stdout, QFile::WriteOnly);
     } else {
-        _out_file.setFileName(out_file_name);
-        if (!_out_file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
+        out_file.setFileName(out_file_name);
+        if (!out_file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
             qerr << "Could not open " << out_file_name << ": " << strerror(errno) << Qt::endl;
             return 1;
         }
-        _out_stream.setDevice(&_out_file);
-        out_stream = &_out_stream;
     }
 
     Parser parser;
@@ -102,9 +97,7 @@ int main(int argc, const char *argv[])
 
     parser.parseFile(&in_file);
 
-    out_stream->setCodec("utf8");
-
-    *out_stream << parser.result();
+    out_file.write(parser.result().toUtf8());
 
     return 0;
 }
diff -pruN 5.15.15+dfsg-2/tests/auto/xml/sax/qxmlsimplereader/parser/parser.cpp 5.15.17+dfsg-1/tests/auto/xml/sax/qxmlsimplereader/parser/parser.cpp
--- 5.15.15+dfsg-2/tests/auto/xml/sax/qxmlsimplereader/parser/parser.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/xml/sax/qxmlsimplereader/parser/parser.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -142,11 +142,12 @@ bool ContentHandler::startElement(const
 QString ContentHandler::escapeStr(const QString &s)
 {
     QString result = s;
-    result.replace(QRegularExpression("\""), "\\\"");
-    result.replace(QRegularExpression("\\"), "\\\\");
-    result.replace(QRegularExpression("\n"), "\\n");
-    result.replace(QRegularExpression("\r"), "\\r");
-    result.replace(QRegularExpression("\t"), "\\t");
+    result.replace(QChar(0), "\\0");
+    result.replace("\\", "\\\\");
+    result.replace("\"", "\\\"");
+    result.replace("\n", "\\n");
+    result.replace("\r", "\\r");
+    result.replace("\t", "\\t");
     return result;
 }
 
diff -pruN 5.15.15+dfsg-2/tests/auto/xml/sax/qxmlsimplereader/tst_qxmlsimplereader.cpp 5.15.17+dfsg-1/tests/auto/xml/sax/qxmlsimplereader/tst_qxmlsimplereader.cpp
--- 5.15.15+dfsg-2/tests/auto/xml/sax/qxmlsimplereader/tst_qxmlsimplereader.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/auto/xml/sax/qxmlsimplereader/tst_qxmlsimplereader.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -311,14 +311,12 @@ void tst_QXmlSimpleReader::testGoodXmlFi
     QVERIFY(file.open(QIODevice::ReadOnly));
     Parser parser;
 
-    QEXPECT_FAIL(QFINDTESTDATA("xmldocs/valid/sa/089.xml").toLocal8Bit().constData(), "a form feed character is not accepted in XML", Continue);
     QVERIFY(parser.parseFile(&file));
 
     QFile ref_file(file_name + ".ref");
     QVERIFY(ref_file.open(QIODevice::ReadOnly | QIODevice::Text));
-    QTextStream ref_stream(&ref_file);
-    ref_stream.setCodec("UTF-8");
-    QString ref_file_contents = ref_stream.readAll();
+    QByteArray data = ref_file.readAll();
+    QString ref_file_contents = QString::fromUtf8(data.constData(), data.size());
 
     QCOMPARE(parser.result(), ref_file_contents);
 }
@@ -393,9 +391,7 @@ void tst_QXmlSimpleReader::testBadXmlFil
 
     QFile ref_file(file_name + ".ref");
     QVERIFY(ref_file.open(QIODevice::ReadOnly | QIODevice::Text));
-    QTextStream ref_stream(&ref_file);
-    ref_stream.setCodec("UTF-8");
-    QString ref_file_contents = ref_stream.readAll();
+    QString ref_file_contents = QString::fromUtf8(ref_file.readAll());
 
     QEXPECT_FAIL(QFINDTESTDATA("xmldocs/not-wf/sa/145.xml").toLocal8Bit().constData(), "Surrogate code point 0xD800 should be rejected", Continue);
 
@@ -469,9 +465,7 @@ void tst_QXmlSimpleReader::testIncrement
 
     QFile ref_file(file_name + ".ref");
     QVERIFY(ref_file.open(QIODevice::ReadOnly | QIODevice::Text));
-    QTextStream ref_stream(&ref_file);
-    ref_stream.setCodec("UTF-8");
-    QString ref_file_contents = ref_stream.readAll();
+    QString ref_file_contents = QString::fromUtf8(ref_file.readAll());
 
     QCOMPARE(parser.result(), ref_file_contents);
 }
Binary files 5.15.15+dfsg-2/tests/auto/xml/sax/qxmlsimplereader/xmldocs/not-wf/sa/142.xml.ref and 5.15.17+dfsg-1/tests/auto/xml/sax/qxmlsimplereader/xmldocs/not-wf/sa/142.xml.ref differ
Binary files 5.15.15+dfsg-2/tests/auto/xml/sax/qxmlsimplereader/xmldocs/valid/sa/064.xml.ref and 5.15.17+dfsg-1/tests/auto/xml/sax/qxmlsimplereader/xmldocs/valid/sa/064.xml.ref differ
Binary files 5.15.15+dfsg-2/tests/auto/xml/sax/qxmlsimplereader/xmldocs/valid/sa/089.xml.ref and 5.15.17+dfsg-1/tests/auto/xml/sax/qxmlsimplereader/xmldocs/valid/sa/089.xml.ref differ
diff -pruN 5.15.15+dfsg-2/tests/benchmarks/corelib/text/qstringlist/main.cpp 5.15.17+dfsg-1/tests/benchmarks/corelib/text/qstringlist/main.cpp
--- 5.15.15+dfsg-2/tests/benchmarks/corelib/text/qstringlist/main.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/benchmarks/corelib/text/qstringlist/main.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -68,9 +68,9 @@ private:
 QStringList tst_QStringList::populateList(const int count, const QString &unit)
 {
     QStringList retval;
-
+    retval.reserve(count);
     for (int i = 0; i < count; ++i)
-        retval.append(unit);
+        retval.append(unit + QString::number(i));
 
     return retval;
 }
@@ -102,19 +102,19 @@ void tst_QStringList::join_data() const
     QTest::addColumn<QStringList>("input");
     QTest::addColumn<QString>("separator");
 
-    QTest::newRow("")
+    QTest::newRow("100")
         << populateList(100, QLatin1String("unit"))
         << QString();
 
-    QTest::newRow("")
+    QTest::newRow("1000")
         << populateList(1000, QLatin1String("unit"))
         << QString();
 
-    QTest::newRow("")
+    QTest::newRow("10000")
         << populateList(10000, QLatin1String("unit"))
         << QString();
 
-    QTest::newRow("")
+    QTest::newRow("100000")
         << populateList(100000, QLatin1String("unit"))
         << QString();
 }
diff -pruN 5.15.15+dfsg-2/tests/benchmarks/gui/image/qimagereader/qimagereader.pro 5.15.17+dfsg-1/tests/benchmarks/gui/image/qimagereader/qimagereader.pro
--- 5.15.15+dfsg-2/tests/benchmarks/gui/image/qimagereader/qimagereader.pro	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/benchmarks/gui/image/qimagereader/qimagereader.pro	2024-11-20 13:56:33.000000000 +0000
@@ -1,10 +1,10 @@
-QT += testlib
+QT += testlib core-private
 QT_FOR_CONFIG += gui-private
 
 TEMPLATE = app
 TARGET = tst_bench_qimagereader
 
-SOURCES += tst_qimagereader.cpp
+SOURCES += tst_bench_qimagereader.cpp
 
 qtConfig(gif): DEFINES += QTEST_HAVE_GIF
 qtConfig(jpeg): DEFINES += QTEST_HAVE_JPEG
diff -pruN 5.15.15+dfsg-2/tests/benchmarks/gui/image/qimagereader/tst_bench_qimagereader.cpp 5.15.17+dfsg-1/tests/benchmarks/gui/image/qimagereader/tst_bench_qimagereader.cpp
--- 5.15.15+dfsg-2/tests/benchmarks/gui/image/qimagereader/tst_bench_qimagereader.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 5.15.17+dfsg-1/tests/benchmarks/gui/image/qimagereader/tst_bench_qimagereader.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -0,0 +1,243 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+
+#include <QBuffer>
+#include <QDebug>
+#include <QFile>
+#include <QImage>
+#include <QImageReader>
+#include <QImageWriter>
+#include <QPixmap>
+
+#include <QtCore/private/qfactoryloader_p.h>
+#include <QSet>
+#include <QTimer>
+
+typedef QMap<QString, QString> QStringMap;
+typedef QList<int> QIntList;
+Q_DECLARE_METATYPE(QStringMap)
+Q_DECLARE_METATYPE(QIntList)
+
+class tst_bench_QImageReader : public QObject
+{
+    Q_OBJECT
+
+public:
+    tst_bench_QImageReader();
+
+public slots:
+    void initTestCase();
+
+private slots:
+    void rawFactoryLoader_keyMap();
+    void rawFactoryLoader_instance();
+
+    void readImage_data();
+    void readImage();
+
+    void setScaledSize_data();
+    void setScaledSize();
+
+    void setClipRect_data();
+    void setClipRect();
+
+    void setScaledClipRect_data();
+    void setScaledClipRect();
+
+private:
+    QList< QPair<QString, QByteArray> > images; // filename, format
+    QString prefix;
+    QFactoryLoader m_loader{QImageIOHandlerFactoryInterface_iid, "/imageformats"};
+};
+
+tst_bench_QImageReader::tst_bench_QImageReader()
+{
+    images << QPair<QString, QByteArray>(QLatin1String("colorful.bmp"), QByteArray("bmp"));
+    images << QPair<QString, QByteArray>(QLatin1String("font.bmp"), QByteArray("bmp"));
+    images << QPair<QString, QByteArray>(QLatin1String("crash-signed-char.bmp"), QByteArray("bmp"));
+    images << QPair<QString, QByteArray>(QLatin1String("4bpp-rle.bmp"), QByteArray("bmp"));
+    images << QPair<QString, QByteArray>(QLatin1String("tst7.bmp"), QByteArray("bmp"));
+    images << QPair<QString, QByteArray>(QLatin1String("16bpp.bmp"), QByteArray("bmp"));
+    images << QPair<QString, QByteArray>(QLatin1String("negativeheight.bmp"), QByteArray("bmp"));
+    images << QPair<QString, QByteArray>(QLatin1String("marble.xpm"), QByteArray("xpm"));
+    images << QPair<QString, QByteArray>(QLatin1String("kollada.png"), QByteArray("png"));
+    images << QPair<QString, QByteArray>(QLatin1String("teapot.ppm"), QByteArray("ppm"));
+    images << QPair<QString, QByteArray>(QLatin1String("runners.ppm"), QByteArray("ppm"));
+    images << QPair<QString, QByteArray>(QLatin1String("test.ppm"), QByteArray("ppm"));
+    images << QPair<QString, QByteArray>(QLatin1String("gnus.xbm"), QByteArray("xbm"));
+#if defined QTEST_HAVE_JPEG
+    images << QPair<QString, QByteArray>(QLatin1String("beavis.jpg"), QByteArray("jpeg"));
+    images << QPair<QString, QByteArray>(QLatin1String("YCbCr_cmyk.jpg"), QByteArray("jpeg"));
+    images << QPair<QString, QByteArray>(QLatin1String("YCbCr_rgb.jpg"), QByteArray("jpeg"));
+    images << QPair<QString, QByteArray>(QLatin1String("task210380.jpg"), QByteArray("jpeg"));
+#endif
+#if defined QTEST_HAVE_GIF
+    images << QPair<QString, QByteArray>(QLatin1String("earth.gif"), QByteArray("gif"));
+    images << QPair<QString, QByteArray>(QLatin1String("trolltech.gif"), QByteArray("gif"));
+#endif
+}
+
+void tst_bench_QImageReader::initTestCase()
+{
+    prefix = QFINDTESTDATA("images/");
+    if (prefix.isEmpty())
+        QFAIL("Can't find images directory!");
+}
+
+void tst_bench_QImageReader::rawFactoryLoader_keyMap()
+{
+    if (m_loader.keyMap().isEmpty())
+        QSKIP("No image plugins found.");
+
+    QBENCHMARK {
+        auto r = m_loader.keyMap();
+        Q_UNUSED(r);
+    }
+}
+
+void tst_bench_QImageReader::rawFactoryLoader_instance()
+{
+    if (m_loader.keyMap().isEmpty())
+        QSKIP("No image plugins found.");
+
+    const auto numInstances = m_loader.keyMap().uniqueKeys().size();
+
+    QBENCHMARK {
+        for (int i = 0; i < numInstances; ++i)
+            delete m_loader.instance(i);
+    }
+}
+
+
+void tst_bench_QImageReader::readImage_data()
+{
+    QTest::addColumn<QString>("fileName");
+    QTest::addColumn<QByteArray>("format");
+
+    for (int i = 0; i < images.size(); ++i) {
+        const QString file = images[i].first;
+        const QByteArray format = images[i].second;
+        QTest::newRow(qPrintable(file)) << file << format;
+    }
+}
+
+void tst_bench_QImageReader::readImage()
+{
+    QFETCH(QString, fileName);
+    QFETCH(QByteArray, format);
+
+    QBENCHMARK {
+        QImageReader io(prefix + fileName, format);
+        QImage image = io.read();
+        QVERIFY(!image.isNull());
+    }
+}
+
+void tst_bench_QImageReader::setScaledSize_data()
+{
+    QTest::addColumn<QString>("fileName");
+    QTest::addColumn<QByteArray>("format");
+    QTest::addColumn<QSize>("newSize");
+
+    for (int i = 0; i < images.size(); ++i) {
+        const QString file = images[i].first;
+        const QByteArray format = images[i].second;
+        QSize size(200, 200);
+        if (file == QLatin1String("teapot"))
+            size = QSize(400, 400);
+        else if (file == QLatin1String("test.ppm"))
+            size = QSize(10, 10);
+        QTest::newRow(qPrintable(file)) << file << format << size;
+    }
+}
+
+void tst_bench_QImageReader::setScaledSize()
+{
+    QFETCH(QString, fileName);
+    QFETCH(QSize, newSize);
+    QFETCH(QByteArray, format);
+
+    QBENCHMARK {
+        QImageReader reader(prefix + fileName, format);
+        reader.setScaledSize(newSize);
+        QImage image = reader.read();
+        QCOMPARE(image.size(), newSize);
+    }
+}
+
+void tst_bench_QImageReader::setClipRect_data()
+{
+    QTest::addColumn<QString>("fileName");
+    QTest::addColumn<QByteArray>("format");
+    QTest::addColumn<QRect>("newRect");
+
+    for (int i = 0; i < images.size(); ++i) {
+        const QString file = images[i].first;
+        const QByteArray format = images[i].second;
+        QTest::newRow(qPrintable(file)) << file << format << QRect(0, 0, 50, 50);
+    }
+}
+
+void tst_bench_QImageReader::setClipRect()
+{
+    QFETCH(QString, fileName);
+    QFETCH(QRect, newRect);
+    QFETCH(QByteArray, format);
+
+    QBENCHMARK {
+        QImageReader reader(prefix + fileName, format);
+        reader.setClipRect(newRect);
+        QImage image = reader.read();
+        QCOMPARE(image.rect(), newRect);
+    }
+}
+
+void tst_bench_QImageReader::setScaledClipRect_data()
+{
+    setClipRect_data();
+}
+
+void tst_bench_QImageReader::setScaledClipRect()
+{
+    QFETCH(QString, fileName);
+    QFETCH(QRect, newRect);
+    QFETCH(QByteArray, format);
+
+    QBENCHMARK {
+        QImageReader reader(prefix + fileName, format);
+        reader.setScaledSize(QSize(300, 300));
+        reader.setScaledClipRect(newRect);
+        QImage image = reader.read();
+        QCOMPARE(image.rect(), newRect);
+    }
+}
+
+QTEST_MAIN(tst_bench_QImageReader)
+#include "tst_bench_qimagereader.moc"
diff -pruN 5.15.15+dfsg-2/tests/benchmarks/gui/image/qimagereader/tst_qimagereader.cpp 5.15.17+dfsg-1/tests/benchmarks/gui/image/qimagereader/tst_qimagereader.cpp
--- 5.15.15+dfsg-2/tests/benchmarks/gui/image/qimagereader/tst_qimagereader.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/tests/benchmarks/gui/image/qimagereader/tst_qimagereader.cpp	1970-01-01 00:00:00.000000000 +0000
@@ -1,226 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qtest.h>
-#include <QBuffer>
-#include <QDebug>
-#include <QFile>
-#include <QImage>
-#include <QImageReader>
-#include <QImageWriter>
-#include <QPixmap>
-#include <QSet>
-#include <QTimer>
-
-typedef QMap<QString, QString> QStringMap;
-typedef QList<int> QIntList;
-Q_DECLARE_METATYPE(QStringMap)
-Q_DECLARE_METATYPE(QIntList)
-
-class tst_QImageReader : public QObject
-{
-    Q_OBJECT
-
-public:
-    tst_QImageReader();
-    virtual ~tst_QImageReader();
-
-public slots:
-    void initTestCase();
-    void init();
-    void cleanup();
-
-private slots:
-    void readImage_data();
-    void readImage();
-
-    void setScaledSize_data();
-    void setScaledSize();
-
-    void setClipRect_data();
-    void setClipRect();
-
-    void setScaledClipRect_data();
-    void setScaledClipRect();
-
-private:
-    QList< QPair<QString, QByteArray> > images; // filename, format
-    QString prefix;
-};
-
-tst_QImageReader::tst_QImageReader()
-{
-    images << QPair<QString, QByteArray>(QLatin1String("colorful.bmp"), QByteArray("bmp"));
-    images << QPair<QString, QByteArray>(QLatin1String("font.bmp"), QByteArray("bmp"));
-    images << QPair<QString, QByteArray>(QLatin1String("crash-signed-char.bmp"), QByteArray("bmp"));
-    images << QPair<QString, QByteArray>(QLatin1String("4bpp-rle.bmp"), QByteArray("bmp"));
-    images << QPair<QString, QByteArray>(QLatin1String("tst7.bmp"), QByteArray("bmp"));
-    images << QPair<QString, QByteArray>(QLatin1String("16bpp.bmp"), QByteArray("bmp"));
-    images << QPair<QString, QByteArray>(QLatin1String("negativeheight.bmp"), QByteArray("bmp"));
-    images << QPair<QString, QByteArray>(QLatin1String("marble.xpm"), QByteArray("xpm"));
-    images << QPair<QString, QByteArray>(QLatin1String("kollada.png"), QByteArray("png"));
-    images << QPair<QString, QByteArray>(QLatin1String("teapot.ppm"), QByteArray("ppm"));
-    images << QPair<QString, QByteArray>(QLatin1String("runners.ppm"), QByteArray("ppm"));
-    images << QPair<QString, QByteArray>(QLatin1String("test.ppm"), QByteArray("ppm"));
-    images << QPair<QString, QByteArray>(QLatin1String("gnus.xbm"), QByteArray("xbm"));
-#if defined QTEST_HAVE_JPEG
-    images << QPair<QString, QByteArray>(QLatin1String("beavis.jpg"), QByteArray("jpeg"));
-    images << QPair<QString, QByteArray>(QLatin1String("YCbCr_cmyk.jpg"), QByteArray("jpeg"));
-    images << QPair<QString, QByteArray>(QLatin1String("YCbCr_rgb.jpg"), QByteArray("jpeg"));
-    images << QPair<QString, QByteArray>(QLatin1String("task210380.jpg"), QByteArray("jpeg"));
-#endif
-#if defined QTEST_HAVE_GIF
-    images << QPair<QString, QByteArray>(QLatin1String("earth.gif"), QByteArray("gif"));
-    images << QPair<QString, QByteArray>(QLatin1String("trolltech.gif"), QByteArray("gif"));
-#endif
-}
-
-tst_QImageReader::~tst_QImageReader()
-{
-}
-
-void tst_QImageReader::initTestCase()
-{
-    prefix = QFINDTESTDATA("images/");
-    if (prefix.isEmpty())
-        QFAIL("Can't find images directory!");
-}
-
-void tst_QImageReader::init()
-{
-}
-
-void tst_QImageReader::cleanup()
-{
-}
-
-void tst_QImageReader::readImage_data()
-{
-    QTest::addColumn<QString>("fileName");
-    QTest::addColumn<QByteArray>("format");
-
-    for (int i = 0; i < images.size(); ++i) {
-        const QString file = images[i].first;
-        const QByteArray format = images[i].second;
-        QTest::newRow(qPrintable(file)) << file << format;
-    }
-}
-
-void tst_QImageReader::readImage()
-{
-    QFETCH(QString, fileName);
-    QFETCH(QByteArray, format);
-
-    QBENCHMARK {
-        QImageReader io(prefix + fileName, format);
-        QImage image = io.read();
-        QVERIFY(!image.isNull());
-    }
-}
-
-void tst_QImageReader::setScaledSize_data()
-{
-    QTest::addColumn<QString>("fileName");
-    QTest::addColumn<QByteArray>("format");
-    QTest::addColumn<QSize>("newSize");
-
-    for (int i = 0; i < images.size(); ++i) {
-        const QString file = images[i].first;
-        const QByteArray format = images[i].second;
-        QSize size(200, 200);
-        if (file == QLatin1String("teapot"))
-            size = QSize(400, 400);
-        else if (file == QLatin1String("test.ppm"))
-            size = QSize(10, 10);
-        QTest::newRow(qPrintable(file)) << file << format << size;
-    }
-}
-
-void tst_QImageReader::setScaledSize()
-{
-    QFETCH(QString, fileName);
-    QFETCH(QSize, newSize);
-    QFETCH(QByteArray, format);
-
-    QBENCHMARK {
-        QImageReader reader(prefix + fileName, format);
-        reader.setScaledSize(newSize);
-        QImage image = reader.read();
-        QCOMPARE(image.size(), newSize);
-    }
-}
-
-void tst_QImageReader::setClipRect_data()
-{
-    QTest::addColumn<QString>("fileName");
-    QTest::addColumn<QByteArray>("format");
-    QTest::addColumn<QRect>("newRect");
-
-    for (int i = 0; i < images.size(); ++i) {
-        const QString file = images[i].first;
-        const QByteArray format = images[i].second;
-        QTest::newRow(qPrintable(file)) << file << format << QRect(0, 0, 50, 50);
-    }
-}
-
-void tst_QImageReader::setClipRect()
-{
-    QFETCH(QString, fileName);
-    QFETCH(QRect, newRect);
-    QFETCH(QByteArray, format);
-
-    QBENCHMARK {
-        QImageReader reader(prefix + fileName, format);
-        reader.setClipRect(newRect);
-        QImage image = reader.read();
-        QCOMPARE(image.rect(), newRect);
-    }
-}
-
-void tst_QImageReader::setScaledClipRect_data()
-{
-    setClipRect_data();
-}
-
-void tst_QImageReader::setScaledClipRect()
-{
-    QFETCH(QString, fileName);
-    QFETCH(QRect, newRect);
-    QFETCH(QByteArray, format);
-
-    QBENCHMARK {
-        QImageReader reader(prefix + fileName, format);
-        reader.setScaledSize(QSize(300, 300));
-        reader.setScaledClipRect(newRect);
-        QImage image = reader.read();
-        QCOMPARE(image.rect(), newRect);
-    }
-}
-
-QTEST_MAIN(tst_QImageReader)
-#include "tst_qimagereader.moc"
diff -pruN 5.15.15+dfsg-2/util/corelib/qurl-generateTLDs/main.cpp 5.15.17+dfsg-1/util/corelib/qurl-generateTLDs/main.cpp
--- 5.15.15+dfsg-2/util/corelib/qurl-generateTLDs/main.cpp	2024-07-23 10:25:47.000000000 +0000
+++ 5.15.17+dfsg-1/util/corelib/qurl-generateTLDs/main.cpp	2024-11-20 13:56:33.000000000 +0000
@@ -95,8 +95,7 @@ int main(int argc, char **argv)
         printf("as obtained from http://publicsuffix.org/. To create indices and data\n");
         printf("file, do the following:\n\n");
         printf("       wget https://publicsuffix.org/list/public_suffix_list.dat -O public_suffix_list.dat\n");
-        printf("       grep -v '^//' public_suffix_list.dat | grep . > public_suffix_list.dat.trimmed\n");
-        printf("       ./%s public_suffix_list.dat.trimmed public_suffix_list.cpp\n\n", argv[0]);
+        printf("       ./%s public_suffix_list.dat public_suffix_list.cpp\n\n", argv[0]);
         printf("Now replace the code in qtbase/src/corelib/io/qurltlds_p.h with public_suffix_list.cpp's contents\n\n");
         return 1;
     }
@@ -119,10 +118,18 @@ int main(int argc, char **argv)
     QBuffer outDataBuffer(&outDataBufferBA);
     outDataBuffer.open(QIODevice::WriteOnly);
 
+    const auto skip = [](const QByteArray &line) {
+        if (line.isEmpty())
+            return true;
+        if (line.startsWith("//")) // comment
+            return true;
+        return false;
+    };
+
     int lineCount = 0;
     while (!file.atEnd()) {
-        file.readLine();
-        lineCount++;
+        if (!skip(file.readLine().trimmed()))
+            lineCount++;
     }
     outFile.write("static const quint16 tldCount = ");
     outFile.write(QByteArray::number(lineCount));
@@ -131,7 +138,10 @@ int main(int argc, char **argv)
     file.reset();
     QVector<QString> strings(lineCount);
     while (!file.atEnd()) {
-        QString st = QString::fromUtf8(file.readLine()).trimmed();
+        QByteArray line = file.readLine().trimmed();
+        if (skip(line))
+            continue;
+        QString st = QString::fromUtf8(std::move(line));
         int num = qt_hash(st) % lineCount;
         QString &entry = strings[num];
         st = utf8encode(st.toUtf8());
