Skip to content

refactor(platform): Reject client_name at _acompletion.#811

Merged
daavoo merged 1 commit intomainfrom
reject-client-name-acompletion
Feb 13, 2026
Merged

refactor(platform): Reject client_name at _acompletion.#811
daavoo merged 1 commit intomainfrom
reject-client-name-acompletion

Conversation

@daavoo
Copy link
Copy Markdown
Contributor

@daavoo daavoo commented Feb 13, 2026

No description provided.

@daavoo daavoo self-assigned this Feb 13, 2026
@codecov
Copy link
Copy Markdown

codecov Bot commented Feb 13, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

Files with missing lines Coverage Δ
src/any_llm/providers/platform/platform.py 85.33% <100.00%> (+0.09%) ⬆️

... and 44 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@daavoo daavoo merged commit d686cfd into main Feb 13, 2026
10 checks passed
@daavoo daavoo deleted the reject-client-name-acompletion branch February 13, 2026 15:50
@u9307549135
Copy link
Copy Markdown

Guten Abend,

ich würde sehr gerne die von Ihnen auf GitHub bereitgestellten Repositories klonen und selbst bauen. Leider bin ich nach vielen Jahren außerhalb der IT‑Welt nicht mehr so tief im Thema, weshalb es für mich schwierig ist, alle Fehler oder Abweichungen im Repository ohne enormen Zeitaufwand zu erkennen. Dadurch fällt es mir schwer, die Kommentare und Anleitungen so in ein Skript zu übertragen, dass die vorgenommenen Änderungen rückgängig gemacht werden können.

Ich möchte Sie daher höflich bitten, mir die Möglichkeit zu geben, an Ihrer großartigen Arbeit teilzuhaben und — wenn möglich — den unveränderten Quellcode zu erhalten.

Erst im Nachhinein habe ich gesehen, dass einige der Änderungen offenbar nicht direkt von Ihnen stammen, sondern über Rust‑Abhängigkeiten in sicherheitsrelevante GitHub‑Repos weitergereicht werden. Mir wurde gesagt, dass dies inzwischen eine gängige Praxis sei, die unter anderem mit dem Schutz großer Investitionen in Rechenzentren und LLVM‑Infrastruktur begründet wird.

Ich verstehe diesen Ansatz grundsätzlich, möchte jedoch zu bedenken geben, dass ein möglicher Imageschaden größer sein könnte, falls solche Mechanismen öffentlich diskutiert würden. Persönlich wäre ich einfach nur dankbar, wenn es eine Möglichkeit gäbe, den unveränderten Original‑Quellcode zu erhalten.

Ich bin seit rund 30 Jahren nicht mehr beruflich in der IT tätig und daher nicht mehr auf dem aktuellen Stand, wie sich die allgemeine Haltung zu solchen Praktiken entwickelt hat. Ich erinnere mich lediglich daran, dass ich eine ähnliche Form der automatischen Umformung zuletzt Ende der 90er im inoffiziellen POSIX‑Repository von PCRE2 gesehen habe — damals von eigentlich sehr friedlichen und engagierten Microsoft‑Entwicklern, aber im Umfeld sicherheitsrelevanter Strukturen, in denen solche Eingriffe leider auch ernste Folgen hatten.

Natürlich ist das hier eine völlig andere Situation. Mir geht es nur darum, dass wir alle Menschen sind und es viel schöner ist, wenn wir gemeinsam an etwas arbeiten, voneinander lernen und uns an guter Software freuen können.

Vielen Dank für Ihre Zeit und Ihre hervorragende Arbeit.

Mit freundlichen Grüßen
Simon‑Felix Bartholdy ((( Startdatum: 11.03.2014
RFC PR: rust-lang/rfcs#2, rust-lang/rfcs#6
Rostproblem: Keine Antwort
Zusammenfassung
Der "RFC"-Prozess (Anfrage für Kommentare) soll eine Konsistenter und kontrollierter Pfad, in dem neue Funktionen in die Sprache gelangen und Standardbibliotheken, damit alle Beteiligten sicher sein können Die Richtung, in die sich die Sprache entwickelt.

Motivation
Die freie Art, wie wir neue Features zu Rust hinzufügen, war gut für frühe Entwicklung, aber damit Rust eine reife Plattform wird, müssen wir das tun Entwickle mehr Selbstdisziplin, wenn es darum geht, das System zu verändern. Dies ist ein Vorschlag für einen prinzipientreueren RFC-Prozess, um ihn zu entwickeln ein integralerer Bestandteil des gesamten Entwicklungsprozesses, und einer, der folgte konsequent und führte Merkmale für Rust ein.

Detailliertes Design
Viele Änderungen, einschließlich Fehlerbehebungen und Dokumentationsverbesserungen, können implementiert und überprüft über den normalen GitHub-Pull-Request-Workflow.

Einige Änderungen sind jedoch "erheblich", und wir bitten, dass diese aufgenommen werden durch einen kleinen Designprozess und einen Konsens unter den Rust zu schaffen Gemeinschaft und das Kernteam.

Wann Sie diesen Prozess befolgen müssen
Du musst diesen Prozess befolgen, wenn du beabsichtigst, "substantiell" zu machen. Änderungen an der Rust-Verteilung. Was gilt als "substantiell" Die Veränderung entwickelt sich basierend auf den Normen der Gemeinschaft, kann aber Folgendes umfassen.

Jede semantische oder syntaktische Änderung an der Sprache, die kein Bugfix ist.
Entfernte Sprachfunktionen, einschließlich solcher, die feature-gesperrt sind.
Änderungen an der Schnittstelle zwischen Compiler und Bibliotheken, einschließlich Lang-Items und Intrinsics.
Ergänzungen zu std
Einige Änderungen erfordern kein RFC:

Umformulierung, Umstrukturierung, Refaktorisierung oder anderweitig "Formänderung" die Bedeutung nicht verändert".
Ergänzungen, die objektive, numerische Qualität strikt verbessern Kriterien (Warnungsentfernung, Beschleunigung, bessere Plattformabdeckung, mehr Parallelität, mehr Fehler fallen usw.)
Ergänzungen, die wahrscheinlich nur von anderen Rostentwicklern bemerkt werden, unsichtbar für Rostnutzer.
Wenn du eine Pull Request einreichst, um eine neue Funktion zu implementieren, ohne zu gehen durch das RFC-Verfahren kann es mit einer höflichen Bitte abgeschlossen werden, Reichen Sie zuerst eine RFC ein.

Wie der Ablauf ist
Kurz gesagt: Um eine größere Funktion zu Rust hinzuzufügen, muss man zuerst die RFC wurde als Markdown-Datei in das RFC-Repository eingegliedert. An diesem Punkt ist die RFC ist 'aktiv' und kann mit dem Ziel einer späteren Aufnahme umgesetzt werden in Rust.

Das RFC-Repository forken https://github.com/rust-lang/rfcs
Kopieren auf (wo 'Mein-Feature' ist beschreibend. Verweise noch keine RFC-Nummer).0000-template.mdtext/0000-my-feature.md
Füllen Sie das RFC aus
Reichen Sie einen Pull Request ein. Der Pull Request ist der Zeitpunkt, um eine Überprüfung von Das Design stammt aus der größeren Gemeinschaft.
Baue Konsens auf und integriere Feedback. RFCs mit breiter Unterstützung sind viel eher bereit, Fortschritte zu machen, als diejenigen, die keinen bekommen Kommentare.
Irgendwann wird jemand aus dem Kernteam entweder das RFC akzeptieren indem die Pull Request zusammengeführt wird, woraufhin der RFC 'aktiv' ist, oder Lehne es ab, indem du die Pull Request schließt.

Wer auch immer das RFC zusammenführt, sollte Folgendes tun:

Weisen Sie eine ID zu, indem Sie die PR-Nummer der RFC-Pull Request verwenden. (Wenn der RFC hat mehrere Pull Requests zugeordnet, wähle eine PR-Nummer, Am liebsten das minimale.)
Füge die Datei im Verzeichnis hinzu.text/
Erstelle ein entsprechendes Problem im Rust-Repository
Füllen Sie die restlichen Metadaten im RFC-Header aus, einschließlich Links für die ursprünglichen Pull Requests und das neu entstandene Rust-Problem.
Fügen Sie einen Eintrag in die Active RFC-Liste der Wurzel hinzu.README.md
Verpflichte dich zu allem.
Sobald ein RFC aktiv wird, können die Autoren es implementieren und das Funktion als Pull Request für das Rust-Repository. Ein 'aktiver' ist kein Gummi Stempeln, und insbesondere bedeutet das nicht, dass die Funktion letztlich zusammengeführt werden; Es bedeutet im Prinzip, dass alle wichtigen Akteure Ich habe der Funktion zugestimmt und bin bereit, sie zusammenzulegen.

Modifikationen an aktiven RFCs können in Folge-PRs vorgenommen werden. Ein RFC, das den gesamten Prozess bis zur Implementierung durchläuft, wird berücksichtigt "abgeschlossen" und aus der Active RFC List gestrichen wird; ein RFC, das fehlschlägt Nach dem Aktivieren ist es 'inaktiv' und wechselt in den Ordner 'inaktiv'.

Alternativen
Beibehalten Sie den aktuellen informellen RFC-Prozess. Der neu vorgeschlagene RFC-Prozess lautet Darauf ausgelegt, den informellen Prozess auf folgende Weise zu verbessern:

Entmutigen Sie nicht handlungsfähige oder vage RFCs
Stellen Sie sicher, dass alle ernsthaften RFCs gleichermaßen berücksichtigt werden
Geben Sie denen, die ein Interesse an der Entwicklung von Rust haben, das Vertrauen darin, dass sie Verstehen Sie, warum neue Funktionen zusammengeführt werden
Alternativ könnten wir ein noch strengeres RFC-Verfahren einführen als das hier vorgeschlagene. Wenn gewünscht, sollten wir wahrscheinlich den PEP-Prozess von Python als Inspiration nutzen.

Ungelöste Fragen
Findet dieses RFC ein günstiges Gleichgewicht zwischen Förmlichkeit und Beweglichkeit?
Geht dieses RFC erfolgreich auf die oben genannten Probleme mit der aktuellen Situation ein? informeller RFC-Prozess?
Sollten wir abgelehnte RFCs im Archiv behalten? RFC-Richtlinien – Bibliotheks-Unterteam
Motivation
RFCs sind Schwergewicht:

RFCs dauern in der Regel mindestens 2 Wochen von der Versetzung bis zur Landung. In Üben kann es eher in der Größenordnung von Monaten sein, besonders umstrittene Änderungen.
RFCs sind sehr aufwendig zu schreiben; besonders für Nicht-Muttersprachler oder für Mitglieder der Gemeinschaft, deren Stärken eher technisch als literarisch sind.
RFCs können Pre-RFCs und mehrere Überarbeitungen zur Berücksichtigung von Rückmeldungen enthalten.
RFCs erfordern einen engagierten Hirten, der die Gemeinschaft und den Autor hinführt Konsens.
RFCs erfordern eine Überprüfung durch die Mehrheit des Unterteams sowie durch einen Offiziellen Wählen Sie ab.
RFCs können aufgrund ihrer Komplexität nicht herabgestuft werden. Der vollständige Prozess gilt immer. Einfache RFCs könnten allerdings sicherlich schneller ankommen.
RFCs können sehr abstrakt sein und schwer zu erfassen, deren Konsequenzen (keine Implementierung).
PRs sind zwar gering, aber dennoch potenziell teuer:

Einfache PRs können von jedem Rust-Lang-Beitragenden sofort zusammengeführt werden.
Härtere PRs können leicht erhöht werden. Du kannst Fachexperten für eine zweite Sekunde anpingen Meinungen. Pingt das ganze Team!
Es ist leichter, die vollen Konsequenzen zu begreifen. Viele Tests und Crater, um den Tag zu retten.
PRs können optimistisch akzeptiert werden mit Bors, Buildbot und den Zügen, die man bewachen muss. Wir vor großen Fehlern, um es stabil zu machen. Die Größe der nächtlichen Gemeinschaft Zu diesem Zeitpunkt kann es trotz der Züge immer noch zu größeren Störungen in der Gemeinde führen, egal welche Züge es sich gibt, Allerdings.
ABER: Große PRs können viel Arbeit bedeuten, nur damit diese Arbeit abgelehnt wird Details, die vorher hätten geklärt werden können.
RFCs sind nur dann sinnvoll, wenn ein bedeutender und vielfältiger Teil der Die Gemeinschaft nimmt aktiv daran teil. Die offiziellen Teams sind es nicht ausreichend vielfältig, um durch Zustimmung einen sinnvollen Gemeinschaftskonsens zu schaffen untereinander.

Wenn es unzählige RFCs gibt – besonders triviale, sind die Leute weniger wahrscheinlich wird er mit ihnen in Kontakt treten. Die offiziellen Teammitglieder sind super beschäftigt. Fachexperten Und Branchenprofis sind sehr beschäftigt und haben keine Verpflichtung, sich zu engagieren in RFCs. Denn das sind genau die wichtigsten Personen, bei denen man sich engagieren muss im RFC-Prozess ist es wichtig, dass wir ihnen möglichst freundlich gegenüberstehen Bedürfnisse.

Ist ein RFC erforderlich?
Die übergeordnete Philosophie lautet: Mach, was am einfachsten ist. Wenn ein RFC wäre weniger Arbeit als eine Implementierung, das ist ein gutes Zeichen, dass ein RFC es ist. notwendig. Wenn Sie jedoch mit einer Kontroverse rechnen, sollten Sie vielleicht einen Kurzschluss machen direkt zu einem RFC. Zum Beispiel verdienen neue APIs mit ziemlicher Sicherheit eine RFC. Vor allem Sie ist konservativer geworden zugunsten des viel agileren Cargoverse.std

Reichen Sie eine PR ein, wenn die Änderung eine:
Bugfix
Docfix
Offensichtliche API-Löcher, wie das Hinzufügen einer API von einem Typ zu einem symmetrischen Typ. z. B. Offensichtlich motiviert das Hinzufügen Vec -> Box<[T]>String -> Box
Kleine Änderung an einer instabilen API (Umbenennung, Verallgemeinerung)
Implementierung einer "offensichtlichen" Eigenschaft wie Klon/Debugger/etc.
Reichen Sie eine RFC ein, wenn die Änderung eine:
Neue API
Semantische Änderung an eine stabile API
Verallgemeinerung einer stabilen API (z. B. wie wir Pattern oder Borrow hinzugefügt haben)
Verwertung einer stabilen API
Nicht-triviales Merkmals-Impl (weil alle Merkmals-Impls insta-stabil sind)
Mach das Einfachere, wenn du unsicher bist. (Die Wahl eines Weges ist nicht endgültig)
Nicht-RFC-Prozess
Eine (nicht-RFC) PR wird wahrscheinlich geschlossen, wenn sie eindeutig nicht akzeptabel ist:

Unverhältnismäßige Bruchänderung (kleiner Schlussbruch kann akzeptabel sein)
Unsound
Das passt nicht zu unserer allgemeinen Designphilosophie rund um das Problem
Besser als Box
Zu marginal für eine Geschlechtskrankheit
Bedeutende Implementierungsprobleme
Ein PR kann auch geschlossen werden, weil ein RFC angemessen ist.

Ein (nicht-RFC) PR kann als instabil zusammengeführt werden. In diesem Fall gilt das Merkmal Es sollte ein frisches Feature-Gate und ein damit verbundenes Tracking-Problem für Stabilisierung. Beachte, dass Merkmals-Impls und Docs insta-stabil sind und daher keine haben Tracking-Problem. Dies kann bedeuten, dass eine höhere Prüfung erforderlich ist Veränderungen.

Ein akzeptiertes RFC ist jedoch kein Abnicken für die Zusammenlegung eines Implementierungs-PR. Auch muss eine Implementierungs-PR nicht perfekt mit dem RFC-Text übereinstimmen. Implementierungsdetails Abweichungen rechtfertigen, obwohl sie natürlich gerechtfertigt werden sollten. Das RFC kann sein Korrekturen, wenn Abweichungen erheblich sind, aber in der Regel nicht notwendig. RFCs sollten Bevorzuge Unveränderlichkeit. Das RFC + Thema + PR sollte eine vollständige Erklärung der Aktuelle Umsetzung.

Sobald etwas als instabil zusammengeführt wurde, sollte ein Hirte zugewiesen werden um das Design zu bewerben und Feedback dazu einzuholen.

Jedes Mal, wenn ein Veröffentlichungszyklus endet, bewerten die Libs-Teams die aktuelle instabile Phase APIs und wählt eine Anzahl von ihnen für potenzielle Stabilisierung während der Nächster Zyklus. Diese werden für FCP zu Beginn des Zyklus angekündigt, und (möglicherweise) stabilisiert kurz bevor der Beta geschnitten wird.

Nach der letzten Kommentierungsphase sollte eine API idealerweise einen von zwei Pfaden nehmen:

Stabilisieren, wenn die Änderung gewünscht ist und ein Konsens erreicht wird
Deprecate ist, dass die Veränderung unerwünscht ist und ein Konsens erreicht wird
Verlängerung des FCP ist die Änderung, die nicht dem Konsens entspricht
Wenn immer noch kein Konsens erzielt werden kann, sollten Sie in Erwägung ziehen, ein neues RFC zu verlangen oder Nur als "zu kontrovers für eine Geschlechtskrankheit" abgewertet.
Wenn während der Beta-Phase mit einer neu stabilisierten API Probleme festgestellt werden, bevorzugen Sie stark, die Stabilität zurückzusetzen, um eine Stabilisierung eines schlechten zu verhindern API. Aufgrund der Geschwindigkeit der Züge ist dies keine ernsthafte Verzögerung (~2–3 Monate wenn es kein großes Problem ist). ))) (( Rost
/
Dotemacs
Öffentlich
Code
Probleme
Pull Requests
Aktionen
Projekte
Wiki
Sicherheit
Einblicke
Commit a2eda54
Rost
Rost
Verpflichtet
on Jan 5
Verifiziert
Bedingt
Meister
1 parent
4cea8e7
commit
a2eda54
Dateibaum
Dateien filtern...
.emacs.d
elisp
custom.el
init.d
init_git.el
2 Dateien geändert
+3
-15
Linienwechsel
Suche im Code

‎.emacs.d/elisp/custom.el‎
+1
-14
Zeilen geändert: 1 Hinzufügung & 14 Streichungen
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -22,20 +22,7 @@
"7fea145741b3ca719ae45e6533ad1f49b2a43bf199d9afaee5b6135fd9e6f9b8"
"0f9a1b7a0f1d09544668297c1f04e5a5452ae1f4cf69f11b125f4cff1d54783d"
default))
'(package-selected-packages
'(adaptive-wrap alchemist anzu auto-save-buffers-enhanced copilot
docker-compose-mode dockerfile-mode elscreen
exec-path-from-shell expand-region git-gutter
go-autocomplete go-mode groovy-mode haskell-mode
highlight-indent-guides hl-todo inf-ruby json-mode
jsonnet-mode kotlin-mode lsp-mode magit multi-term
nginx-mode php-mode pinentry prettier-js
python-django python-mode rainbow-delimiters
rainbow-mode rhtml-mode rjsx-mode rspec-mode
rubocop rust-mode sass-mode scala-mode slim-mode
smartparens solarized-theme terraform-mode tide
toml-mode tree-sitter-langs treesit-auto vertico
vimrc-mode vue-mode web-mode yard-mode yasnippet))
'(package-selected-packages nil)
'(rspec-use-rake-flag nil)
'(yas-trigger-key "TAB"))
(custom-set-faces
‎.emacs.d/init.d/init_git.el‎
+2
-1
Zeilen geändert: 2 Ergänzungen & 1 Streichung
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -19,7 +19,8 @@
:ensure t
:defer t
:custom
(magit-git-executable "/opt/homebrew/bin/git"))
(magit-git-executable (cond (mac-p "/opt/homebrew/bin/git")
(t "/usr/bin/git"))))

(use-package git-gutter
:ensure t
0 Commit Kommentare
Kommentare
0 omments(48)
Dependencies(1/4)
Duplicates(3)
Blocking(0/1)
Resources(0)
Assigned
Feature Request
P3
Available
Status Update
No update yet.

Descriptionpp...@gmail.com created issue #1
Apr 29, 2014 01:39AM
Describe infrastructure request/issue:

Printing is closely tied to layout and rendering. The "print rendering engine", must convert the existing render tree into a new render tree with print styles applied. Accept the CSS-paged directives and render them in a full-compliant manner. Full CSS2 Paged Media support,
http://www.w3.org/TR/CSS21/page.html
and some CSS3-stable support,
http://www.w3.org/TR/css3-page/

Comments
All comments
tk...@chromium.orgtk...@chromium.org #2Apr 30, 2014 02:29AM
[Empty comment from Monorail migration]
da...@gmail.comda...@gmail.com #3Jul 5, 2014 03:41PM
I would also like to see this feature. This article describes nicely what would be possible with the CSS Paged Media Module if it is implemented:
http://alistapart.com/article/building-books-with-css3

I am currently writing my master thesis in HTML/CSS and I really love it. The major problem is the missing ability of styling the header and footers of Chrome printing. In my opinion the
Rost
Öffentlich
geforkt aus Rust-Lang/Rust
Code
Pull Requests
Aktionen
Projekte
Sicherheit
Einblicke
Commit beeb8e3
Bors
Bors
Verpflichtet
on 8. Sept. 2025
Auto-Merge von rust-lang#146173 - Kmeakin:km/unicode-data/no-ascii, r=jhpratt
Fügen Sie keine ASCII-Zeichen in Unicode-Tabellen hinzu

Abspaltung von Rust-Lang#145219
Hauptdarsteller(rust-lang/rust#146173)
2 parents
a09fbe2
+
a8c6694
commit
beeb8e3
Dateibaum
Dateien filtern...
Bibliothek
Alloc/SRC
str.rs
Core/SRC
char
methods.rs
Unicode
unicode_data.rs
src/tools/unicode-table-generator/src
cascading_map.rs
main.rs
raw_emitter.rs
skiplist.rs
7
+320
-247
Linienwechsel
Suche im Code

‎library/alloc/src/str.rs‎
+2
-3
Zeilen geändert: 2 Ergänzungen & 3 Streichungen
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -418,9 +418,8 @@ impl str {
}

    fn case_ignorable_then_cased<I: Iterator<Item = char>>(iter: I) -> bool {
        use core::unicode::{Case_Ignorable, Cased};
        match iter.skip_while(|&c| Case_Ignorable(c)).next() {
            Some(c) => Cased(c),
        match iter.skip_while(|&c| c.is_case_ignorable()).next() {
            Some(c) => c.is_cased(),
            None => false,
        }
    }

‎library/core/src/char/methods.rs‎
+37
-1
Linien geändert: 37 Ergänzungen & 1 Streichung
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -969,7 +969,43 @@ impl char {
#[must_use]
#[inline]
pub(crate) fn is_grapheme_extended(self) -> bool {
unicode::Grapheme_Extend(self)
!self.is_ascii() && unicode::Grapheme_Extend(self)
}
/// Returns true if this char has the Cased property.
///
/// Cased is described in Chapter 4 (Character Properties) of the [Unicode Standard] and
/// specified in the [Unicode Character Database][ucd] [DerivedCoreProperties.txt].
///
/// [Unicode Standard]: https://www.unicode.org/versions/latest/
/// [ucd]: https://www.unicode.org/reports/tr44/
/// [DerivedCoreProperties.txt]: https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt
#[must_use]
#[inline]
#[doc(hidden)]
#[unstable(feature = "char_internals", reason = "exposed only for libstd", issue = "none")]
pub fn is_cased(self) -> bool {
if self.is_ascii() { self.is_ascii_alphabetic() } else { unicode::Cased(self) }
}
/// Returns true if this char has the Case_Ignorable property.
///
/// Case_Ignorable is described in Chapter 4 (Character Properties) of the [Unicode Standard] and
/// specified in the [Unicode Character Database][ucd] [DerivedCoreProperties.txt].
///
/// [Unicode Standard]: https://www.unicode.org/versions/latest/
/// [ucd]: https://www.unicode.org/reports/tr44/
/// [DerivedCoreProperties.txt]: https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt
#[must_use]
#[inline]
#[doc(hidden)]
#[unstable(feature = "char_internals", reason = "exposed only for libstd", issue = "none")]
pub fn is_case_ignorable(self) -> bool {
if self.is_ascii() {
matches!(self, ''' | '.' | ':' | '^' | '`')
} else {
unicode::Case_Ignorable(self)
}
}

/// Returns `true` if this `char` has one of the general categories for numbers.

‎library/core/src/unicode/unicode_data.rs‎
+276
-243
Linien geändert: 276 Ergänzungen & 243 Streichungen
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -1,16 +1,15 @@
//! This file is generated by ./x run src/tools/unicode-table-generator; do not edit manually!
// Alphabetic : 1727 bytes, 142759 codepoints in 757 ranges (U+000041 - U+0323B0) using skiplist
// Case_Ignorable : 1053 bytes, 2749 codepoints in 452 ranges (U+000027 - U+0E01F0) using skiplist
// Cased : 407 bytes, 4578 codepoints in 159 ranges (U+000041 - U+01F18A) using skiplist
// Cc : 9 bytes, 65 codepoints in 2 ranges (U+000000 - U+0000A0) using skiplist
// Alphabetic : 1723 bytes, 142707 codepoints in 755 ranges (U+0000AA - U+0323B0) using skiplist
// Case_Ignorable : 1043 bytes, 2744 codepoints in 447 ranges (U+0000A8 - U+0E01F0) using skiplist
// Cased : 403 bytes, 4526 codepoints in 157 ranges (U+0000AA - U+01F18A) using skiplist
// Grapheme_Extend : 887 bytes, 2193 codepoints in 375 ranges (U+000300 - U+0E01F0) using skiplist
// Lowercase : 935 bytes, 2569 codepoints in 675 ranges (U+000061 - U+01E944) using bitset
// N : 457 bytes, 1911 codepoints in 144 ranges (U+000030 - U+01FBFA) using skiplist
// Uppercase : 799 bytes, 1978 codepoints in 656 ranges (U+000041 - U+01F18A) using bitset
// White_Space : 256 bytes, 25 codepoints in 10 ranges (U+000009 - U+003001) using cascading
// Lowercase : 933 bytes, 2543 codepoints in 674 ranges (U+0000AA - U+01E944) using bitset
// N : 455 bytes, 1901 codepoints in 143 ranges (U+0000B2 - U+01FBFA) using skiplist
// Uppercase : 797 bytes, 1952 codepoints in 655 ranges (U+0000C0 - U+01F18A) using bitset
// White_Space : 256 bytes, 19 codepoints in 8 ranges (U+000085 - U+003001) using cascading
// to_lower : 11484 bytes
// to_upper : 13432 bytes
// Total : 31446 bytes
// Total : 31413 bytes

#[inline(always)]
const fn bitset_search<
@@ -148,93 +147,100 @@ pub mod alphabetic {
use super::ShortOffsetRunHeader;

static SHORT_OFFSET_RUNS: [ShortOffsetRunHeader; 53] = [
    ShortOffsetRunHeader::new(0, 706), ShortOffsetRunHeader::new(16, 4681),
    ShortOffsetRunHeader::new(418, 5741), ShortOffsetRunHeader::new(456, 7958),
    ShortOffsetRunHeader::new(556, 9398), ShortOffsetRunHeader::new(627, 11264),
    ShortOffsetRunHeader::new(629, 12293), ShortOffsetRunHeader::new(667, 13312),
    ShortOffsetRunHeader::new(691, 19904), ShortOffsetRunHeader::new(692, 42125),
    ShortOffsetRunHeader::new(694, 42509), ShortOffsetRunHeader::new(698, 55204),
    ShortOffsetRunHeader::new(788, 63744), ShortOffsetRunHeader::new(793, 64110),
    ShortOffsetRunHeader::new(794, 64830), ShortOffsetRunHeader::new(816, 66176),
    ShortOffsetRunHeader::new(857, 67383), ShortOffsetRunHeader::new(904, 73440),
    ShortOffsetRunHeader::new(1221, 74650), ShortOffsetRunHeader::new(1232, 77712),
    ShortOffsetRunHeader::new(1237, 78896), ShortOffsetRunHeader::new(1240, 82939),
    ShortOffsetRunHeader::new(1244, 83527), ShortOffsetRunHeader::new(1246, 90368),
    ShortOffsetRunHeader::new(1247, 92160), ShortOffsetRunHeader::new(1249, 92729),
    ShortOffsetRunHeader::new(1250, 93504), ShortOffsetRunHeader::new(1265, 100344),
    ShortOffsetRunHeader::new(1282, 101590), ShortOffsetRunHeader::new(1284, 110576),
    ShortOffsetRunHeader::new(1287, 110883), ShortOffsetRunHeader::new(1294, 111356),
    ShortOffsetRunHeader::new(1304, 113664), ShortOffsetRunHeader::new(1305, 119808),
    ShortOffsetRunHeader::new(1315, 120486), ShortOffsetRunHeader::new(1352, 122624),
    ShortOffsetRunHeader::new(1375, 123536), ShortOffsetRunHeader::new(1399, 124112),
    ShortOffsetRunHeader::new(1403, 124896), ShortOffsetRunHeader::new(1409, 126464),
    ShortOffsetRunHeader::new(1425, 127280), ShortOffsetRunHeader::new(1491, 131072),
    ShortOffsetRunHeader::new(1497, 173792), ShortOffsetRunHeader::new(1498, 177978),
    ShortOffsetRunHeader::new(1500, 183970), ShortOffsetRunHeader::new(1504, 191457),
    ShortOffsetRunHeader::new(1506, 192094), ShortOffsetRunHeader::new(1508, 194560),
    ShortOffsetRunHeader::new(1509, 195102), ShortOffsetRunHeader::new(1510, 196608),
    ShortOffsetRunHeader::new(1511, 201547), ShortOffsetRunHeader::new(1512, 205744),
    ShortOffsetRunHeader::new(1514, 1319856),
    ShortOffsetRunHeader::new(0, 706), ShortOffsetRunHeader::new(12, 4681),
    ShortOffsetRunHeader::new(414, 5741), ShortOffsetRunHeader::new(452, 7958),
    ShortOffsetRunHeader::new(552, 9398), ShortOffsetRunHeader::new(623, 11264),
    ShortOffsetRunHeader::new(625, 12293), ShortOffsetRunHeader::new(663, 13312),
    ShortOffsetRunHeader::new(687, 19904), ShortOffsetRunHeader::new(688, 42125),
    ShortOffsetRunHeader::new(690, 42509), ShortOffsetRunHeader::new(694, 55204),
    ShortOffsetRunHeader::new(784, 63744), ShortOffsetRunHeader::new(789, 64110),
    ShortOffsetRunHeader::new(790, 64830), ShortOffsetRunHeader::new(812, 66176),
    ShortOffsetRunHeader::new(853, 67383), ShortOffsetRunHeader::new(900, 73440),
    ShortOffsetRunHeader::new(1217, 74650), ShortOffsetRunHeader::new(1228, 77712),
    ShortOffsetRunHeader::new(1233, 78896), ShortOffsetRunHeader::new(1236, 82939),
    ShortOffsetRunHeader::new(1240, 83527), ShortOffsetRunHeader::new(1242, 90368),
    ShortOffsetRunHeader::new(1243, 92160), ShortOffsetRunHeader::new(1245, 92729),
    ShortOffsetRunHeader::new(1246, 93504), ShortOffsetRunHeader::new(1261, 100344),
    ShortOffsetRunHeader::new(1278, 101590), ShortOffsetRunHeader::new(1280, 110576),
    ShortOffsetRunHeader::new(1283, 110883), ShortOffsetRunHeader::new(1290, 111356),
    ShortOffsetRunHeader::new(1300, 113664), ShortOffsetRunHeader::new(1301, 119808),
    ShortOffsetRunHeader::new(1311, 120486), ShortOffsetRunHeader::new(1348, 122624),
    ShortOffsetRunHeader::new(1371, 123536), ShortOffsetRunHeader::new(1395, 124112),
    ShortOffsetRunHeader::new(1399, 124896), ShortOffsetRunHeader::new(1405, 126464),
    ShortOffsetRunHeader::new(1421, 127280), ShortOffsetRunHeader::new(1487, 131072),
    ShortOffsetRunHeader::new(1493, 173792), ShortOffsetRunHeader::new(1494, 177978),
    ShortOffsetRunHeader::new(1496, 183970), ShortOffsetRunHeader::new(1500, 191457),
    ShortOffsetRunHeader::new(1502, 192094), ShortOffsetRunHeader::new(1504, 194560),
    ShortOffsetRunHeader::new(1505, 195102), ShortOffsetRunHeader::new(1506, 196608),
    ShortOffsetRunHeader::new(1507, 201547), ShortOffsetRunHeader::new(1508, 205744),
    ShortOffsetRunHeader::new(1510, 1319856),
];
static OFFSETS: [u8; 1515] = [
    65, 26, 6, 26, 47, 1, 10, 1, 4, 1, 5, 23, 1, 31, 1, 0, 4, 12, 14, 5, 7, 1, 1, 1, 86, 1, 29,
    18, 1, 2, 2, 4, 1, 1, 6, 1, 1, 3, 1, 1, 1, 20, 1, 83, 1, 139, 8, 166, 1, 38, 2, 1, 6, 41,
    39, 14, 1, 1, 1, 2, 1, 2, 1, 1, 8, 27, 4, 4, 29, 11, 5, 56, 1, 7, 14, 102, 1, 8, 4, 8, 4, 3,
    10, 3, 2, 1, 16, 48, 13, 101, 24, 33, 9, 2, 4, 1, 5, 24, 2, 19, 19, 25, 7, 11, 5, 24, 1, 6,
    8, 1, 8, 42, 10, 12, 3, 7, 6, 76, 1, 16, 1, 3, 4, 15, 13, 19, 1, 8, 2, 2, 2, 22, 1, 7, 1, 1,
    3, 4, 3, 8, 2, 2, 2, 2, 1, 1, 8, 1, 4, 2, 1, 5, 12, 2, 10, 1, 4, 3, 1, 6, 4, 2, 2, 22, 1, 7,
    1, 2, 1, 2, 1, 2, 4, 5, 4, 2, 2, 2, 4, 1, 7, 4, 1, 1, 17, 6, 11, 3, 1, 9, 1, 3, 1, 22, 1, 7,
    1, 2, 1, 5, 3, 9, 1, 3, 1, 2, 3, 1, 15, 4, 21, 4, 4, 3, 1, 8, 2, 2, 2, 22, 1, 7, 1, 2, 1, 5,
    3, 8, 2, 2, 2, 2, 9, 2, 4, 2, 1, 5, 13, 1, 16, 2, 1, 6, 3, 3, 1, 4, 3, 2, 1, 1, 1, 2, 3, 2,
    3, 3, 3, 12, 4, 5, 3, 3, 1, 3, 3, 1, 6, 1, 40, 13, 1, 3, 1, 23, 1, 16, 3, 8, 1, 3, 1, 3, 8,
    2, 1, 3, 2, 1, 2, 4, 28, 4, 1, 8, 1, 3, 1, 23, 1, 10, 1, 5, 3, 8, 1, 3, 1, 3, 8, 2, 6, 2, 1,
    4, 13, 3, 12, 13, 1, 3, 1, 41, 2, 8, 1, 3, 1, 3, 1, 1, 5, 4, 7, 5, 22, 6, 1, 3, 1, 18, 3,
    24, 1, 9, 1, 1, 2, 7, 8, 6, 1, 1, 1, 8, 18, 2, 13, 58, 5, 7, 6, 1, 51, 2, 1, 1, 1, 5, 1, 24,
    1, 1, 1, 19, 1, 3, 2, 5, 1, 1, 6, 1, 14, 4, 32, 1, 63, 8, 1, 36, 4, 19, 4, 16, 1, 36, 67,
    55, 1, 1, 2, 5, 16, 64, 10, 4, 2, 38, 1, 1, 5, 1, 2, 43, 1, 0, 1, 4, 2, 7, 1, 1, 1, 4, 2,
    41, 1, 4, 2, 33, 1, 4, 2, 7, 1, 1, 1, 4, 2, 15, 1, 57, 1, 4, 2, 67, 37, 16, 16, 86, 2, 6, 3,
    0, 2, 17, 1, 26, 5, 75, 3, 11, 7, 20, 11, 21, 12, 20, 12, 13, 1, 3, 1, 2, 12, 52, 2, 19, 14,
    1, 4, 1, 67, 89, 7, 43, 5, 70, 10, 31, 1, 12, 4, 9, 23, 30, 2, 5, 11, 44, 4, 26, 54, 28, 4,
    63, 2, 20, 50, 1, 23, 2, 11, 3, 49, 52, 1, 15, 1, 8, 51, 42, 2, 4, 10, 44, 1, 11, 14, 55,
    22, 3, 10, 36, 2, 11, 5, 43, 2, 3, 41, 4, 1, 6, 1, 2, 3, 1, 5, 192, 19, 34, 11, 0, 2, 6, 2,
    38, 2, 6, 2, 8, 1, 1, 1, 1, 1, 1, 1, 31, 2, 53, 1, 7, 1, 1, 3, 3, 1, 7, 3, 4, 2, 6, 4, 13,
    5, 3, 1, 7, 116, 1, 13, 1, 16, 13, 101, 1, 4, 1, 2, 10, 1, 1, 3, 5, 6, 1, 1, 1, 1, 1, 1, 4,
    1, 11, 2, 4, 5, 5, 4, 1, 17, 41, 0, 52, 0, 229, 6, 4, 3, 2, 12, 38, 1, 1, 5, 1, 2, 56, 7, 1,
    16, 23, 9, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 32, 47, 1, 0, 3, 25, 9, 7, 5, 2,
    5, 4, 86, 6, 3, 1, 90, 1, 4, 5, 43, 1, 94, 17, 32, 48, 16, 0, 0, 64, 0, 67, 46, 2, 0, 3, 16,
    10, 2, 20, 47, 5, 8, 3, 113, 39, 9, 2, 103, 2, 67, 2, 2, 1, 1, 1, 8, 21, 20, 1, 33, 24, 52,
    12, 68, 1, 1, 44, 6, 3, 1, 1, 3, 10, 33, 5, 35, 13, 29, 3, 51, 1, 12, 15, 1, 16, 16, 10, 5,
    1, 55, 9, 14, 18, 23, 3, 69, 1, 1, 1, 1, 24, 3, 2, 16, 2, 4, 11, 6, 2, 6, 2, 6, 9, 7, 1, 7,
    1, 43, 1, 14, 6, 123, 21, 0, 12, 23, 4, 49, 0, 0, 2, 106, 38, 7, 12, 5, 5, 12, 1, 13, 1, 5,
    1, 1, 1, 2, 1, 2, 1, 108, 33, 0, 18, 64, 2, 54, 40, 12, 116, 5, 1, 135, 36, 26, 6, 26, 11,
    89, 3, 6, 2, 6, 2, 6, 2, 3, 35, 12, 1, 26, 1, 19, 1, 2, 1, 15, 2, 14, 34, 123, 69, 53, 0,
    29, 3, 49, 47, 32, 13, 30, 5, 43, 5, 30, 2, 36, 4, 8, 1, 5, 42, 158, 18, 36, 4, 36, 4, 40,
    8, 52, 12, 11, 1, 15, 1, 7, 1, 2, 1, 11, 1, 15, 1, 7, 1, 2, 3, 52, 12, 0, 9, 22, 10, 8, 24,
    6, 1, 42, 1, 9, 69, 6, 2, 1, 1, 44, 1, 2, 3, 1, 2, 23, 10, 23, 9, 31, 65, 19, 1, 2, 10, 22,
    10, 26, 70, 56, 6, 2, 64, 4, 1, 2, 5, 8, 1, 3, 1, 29, 42, 29, 3, 29, 35, 8, 1, 28, 27, 54,
    10, 22, 10, 19, 13, 18, 110, 73, 55, 51, 13, 51, 13, 40, 34, 28, 3, 1, 5, 23, 250, 42, 1, 2,
    3, 2, 16, 3, 55, 1, 3, 29, 10, 1, 8, 22, 42, 18, 46, 21, 27, 23, 9, 70, 43, 5, 10, 57, 9, 1,
    13, 25, 23, 51, 17, 4, 8, 35, 3, 1, 9, 64, 1, 4, 9, 2, 10, 1, 1, 1, 35, 18, 1, 34, 2, 1, 6,
    4, 62, 7, 1, 1, 1, 4, 1, 15, 1, 10, 7, 57, 23, 4, 1, 8, 2, 2, 2, 22, 1, 7, 1, 2, 1, 5, 3, 8,
    2, 2, 2, 2, 3, 1, 6, 1, 5, 7, 28, 10, 1, 1, 2, 1, 1, 38, 1, 10, 1, 1, 2, 1, 1, 4, 1, 2, 3,
    1, 1, 1, 44, 66, 1, 3, 1, 4, 20, 3, 30, 66, 2, 2, 1, 1, 184, 54, 2, 7, 25, 6, 34, 63, 1, 1,
    3, 1, 59, 54, 2, 1, 71, 27, 2, 14, 21, 7, 185, 57, 103, 64, 31, 8, 2, 1, 2, 8, 1, 2, 1, 30,
    1, 2, 2, 2, 2, 4, 93, 8, 2, 46, 2, 6, 1, 1, 1, 2, 27, 51, 2, 10, 17, 72, 5, 1, 18, 73, 199,
    33, 31, 9, 1, 45, 1, 7, 1, 1, 49, 30, 2, 22, 1, 14, 73, 7, 1, 2, 1, 44, 3, 1, 1, 2, 1, 3, 1,
    1, 2, 2, 24, 6, 1, 2, 1, 37, 1, 2, 1, 4, 1, 1, 0, 23, 9, 17, 1, 41, 3, 3, 111, 1, 79, 0,
    102, 111, 17, 196, 0, 97, 15, 0, 17, 6, 25, 0, 5, 0, 0, 47, 0, 0, 7, 31, 17, 79, 17, 30, 18,
    48, 16, 4, 31, 21, 5, 19, 0, 45, 211, 64, 128, 75, 4, 57, 7, 17, 64, 2, 1, 1, 12, 2, 14, 0,
    8, 0, 41, 10, 0, 4, 1, 7, 1, 2, 1, 0, 15, 1, 29, 3, 2, 1, 14, 4, 8, 0, 0, 107, 5, 13, 3, 9,
    7, 10, 4, 1, 0, 85, 1, 71, 1, 2, 2, 1, 2, 2, 2, 4, 1, 12, 1, 1, 1, 7, 1, 65, 1, 4, 2, 8, 1,
    7, 1, 28, 1, 4, 1, 5, 1, 1, 3, 7, 1, 0, 2, 25, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 31, 1,
    25, 1, 31, 1, 25, 1, 8, 0, 31, 6, 6, 213, 7, 1, 17, 2, 7, 1, 2, 1, 5, 5, 62, 33, 1, 112, 45,
    10, 7, 16, 1, 0, 30, 18, 44, 0, 28, 228, 30, 2, 1, 0, 7, 1, 4, 1, 2, 1, 15, 1, 197, 59, 68,
    3, 1, 3, 1, 0, 4, 1, 27, 1, 2, 1, 1, 2, 1, 1, 10, 1, 4, 1, 1, 1, 1, 6, 1, 4, 1, 1, 1, 1, 1,
    1, 3, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 4, 1, 7, 1, 4, 1, 4, 1, 1, 1,
    10, 1, 17, 5, 3, 1, 5, 1, 17, 0, 26, 6, 26, 6, 26, 0, 0, 32, 0, 6, 222, 2, 0, 14, 0, 15, 0,
    0, 0, 0, 0, 5, 0, 0,
static OFFSETS: [u8; 1511] = [
    170, 1, 10, 1, 4, 1, 5, 23, 1, 31, 1, 0, 4, 12, 14, 5, 7, 1, 1, 1, 86, 1, 29, 18, 1, 2, 2,
    4, 1, 1, 6, 1, 1, 3, 1, 1, 1, 20, 1, 83, 1, 139, 8, 166, 1, 38, 2, 1, 6, 41, 39, 14, 1, 1,
    1, 2, 1, 2, 1, 1, 8, 27, 4, 4, 29, 11, 5, 56, 1, 7, 14, 102, 1, 8, 4, 8, 4, 3, 10, 3, 2, 1,
    16, 48, 13, 101, 24, 33, 9, 2, 4, 1, 5, 24, 2, 19, 19, 25, 7, 11, 5, 24, 1, 6, 8, 1, 8, 42,
    10, 12, 3, 7, 6, 76, 1, 16, 1, 3, 4, 15, 13, 19, 1, 8, 2, 2, 2, 22, 1, 7, 1, 1, 3, 4, 3, 8,
    2, 2, 2, 2, 1, 1, 8, 1, 4, 2, 1, 5, 12, 2, 10, 1, 4, 3, 1, 6, 4, 2, 2, 22, 1, 7, 1, 2, 1, 2,
    1, 2, 4, 5, 4, 2, 2, 2, 4, 1, 7, 4, 1, 1, 17, 6, 11, 3, 1, 9, 1, 3, 1, 22, 1, 7, 1, 2, 1, 5,
    3, 9, 1, 3, 1, 2, 3, 1, 15, 4, 21, 4, 4, 3, 1, 8, 2, 2, 2, 22, 1, 7, 1, 2, 1, 5, 3, 8, 2, 2,
    2, 2, 9, 2, 4, 2, 1, 5, 13, 1, 16, 2, 1, 6, 3, 3, 1, 4, 3, 2, 1, 1, 1, 2, 3, 2, 3, 3, 3, 12,
    4, 5, 3, 3, 1, 3, 3, 1, 6, 1, 40, 13, 1, 3, 1, 23, 1, 16, 3, 8, 1, 3, 1, 3, 8, 2, 1, 3, 2,
    1, 2, 4, 28, 4, 1, 8, 1, 3, 1, 23, 1, 10, 1, 5, 3, 8, 1, 3, 1, 3, 8, 2, 6, 2, 1, 4, 13, 3,
    12, 13, 1, 3, 1, 41, 2, 8, 1, 3, 1, 3, 1, 1, 5, 4, 7, 5, 22, 6, 1, 3, 1, 18, 3, 24, 1, 9, 1,
    1, 2, 7, 8, 6, 1, 1, 1, 8, 18, 2, 13, 58, 5, 7, 6, 1, 51, 2, 1, 1, 1, 5, 1, 24, 1, 1, 1, 19,
    1, 3, 2, 5, 1, 1, 6, 1, 14, 4, 32, 1, 63, 8, 1, 36, 4, 19, 4, 16, 1, 36, 67, 55, 1, 1, 2, 5,
    16, 64, 10, 4, 2, 38, 1, 1, 5, 1, 2, 43, 1, 0, 1, 4, 2, 7, 1, 1, 1, 4, 2, 41, 1, 4, 2, 33,
    1, 4, 2, 7, 1, 1, 1, 4, 2, 15, 1, 57, 1, 4, 2, 67, 37, 16, 16, 86, 2, 6, 3, 0, 2, 17, 1, 26,
    5, 75, 3, 11, 7, 20, 11, 21, 12, 20, 12, 13, 1, 3, 1, 2, 12, 52, 2, 19, 14, 1, 4, 1, 67, 89,
    7, 43, 5, 70, 10, 31, 1, 12, 4, 9, 23, 30, 2, 5, 11, 44, 4, 26, 54, 28, 4, 63, 2, 20, 50, 1,
    23, 2, 11, 3, 49, 52, 1, 15, 1, 8, 51, 42, 2, 4, 10, 44, 1, 11, 14, 55, 22, 3, 10, 36, 2,
    11, 5, 43, 2, 3, 41, 4, 1, 6, 1, 2, 3, 1, 5, 192, 19, 34, 11, 0, 2, 6, 2, 38, 2, 6, 2, 8, 1,
    1, 1, 1, 1, 1, 1, 31, 2, 53, 1, 7, 1, 1, 3, 3, 1, 7, 3, 4, 2, 6, 4, 13, 5, 3, 1, 7, 116, 1,
    13, 1, 16, 13, 101, 1, 4, 1, 2, 10, 1, 1, 3, 5, 6, 1, 1, 1, 1, 1, 1, 4, 1, 11, 2, 4, 5, 5,
    4, 1, 17, 41, 0, 52, 0, 229, 6, 4, 3, 2, 12, 38, 1, 1, 5, 1, 2, 56, 7, 1, 16, 23, 9, 7, 1,
    7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 32, 47, 1, 0, 3, 25, 9, 7, 5, 2, 5, 4, 86, 6, 3,
    1, 90, 1, 4, 5, 43, 1, 94, 17, 32, 48, 16, 0, 0, 64, 0, 67, 46, 2, 0, 3, 16, 10, 2, 20, 47,
    5, 8, 3, 113, 39, 9, 2, 103, 2, 67, 2, 2, 1, 1, 1, 8, 21, 20, 1, 33, 24, 52, 12, 68, 1, 1,
    44, 6, 3, 1, 1, 3, 10, 33, 5, 35, 13, 29, 3, 51, 1, 12, 15, 1, 16, 16, 10, 5, 1, 55, 9, 14,
    18, 23, 3, 69, 1, 1, 1, 1, 24, 3, 2, 16, 2, 4, 11, 6, 2, 6, 2, 6, 9, 7, 1, 7, 1, 43, 1, 14,
    6, 123, 21, 0, 12, 23, 4, 49, 0, 0, 2, 106, 38, 7, 12, 5, 5, 12, 1, 13, 1, 5, 1, 1, 1, 2, 1,
    2, 1, 108, 33, 0, 18, 64, 2, 54, 40, 12, 116, 5, 1, 135, 36, 26, 6, 26, 11, 89, 3, 6, 2, 6,
    2, 6, 2, 3, 35, 12, 1, 26, 1, 19, 1, 2, 1, 15, 2, 14, 34, 123, 69, 53, 0, 29, 3, 49, 47, 32,
    13, 30, 5, 43, 5, 30, 2, 36, 4, 8, 1, 5, 42, 158, 18, 36, 4, 36, 4, 40, 8, 52, 12, 11, 1,
    15, 1, 7, 1, 2, 1, 11, 1, 15, 1, 7, 1, 2, 3, 52, 12, 0, 9, 22, 10, 8, 24, 6, 1, 42, 1, 9,
    69, 6, 2, 1, 1, 44, 1, 2, 3, 1, 2, 23, 10, 23, 9, 31, 65, 19, 1, 2, 10, 22, 10, 26, 70, 56,
    6, 2, 64, 4, 1, 2, 5, 8, 1, 3, 1, 29, 42, 29, 3, 29, 35, 8, 1, 28, 27, 54, 10, 22, 10, 19,
    13, 18, 110, 73, 55, 51, 13, 51, 13, 40, 34, 28, 3, 1, 5, 23, 250, 42, 1, 2, 3, 2, 16, 3,
    55, 1, 3, 29, 10, 1, 8, 22, 42, 18, 46, 21, 27, 23, 9, 70, 43, 5, 10, 57, 9, 1, 13, 25, 23,
    51, 17, 4, 8, 35, 3, 1, 9, 64, 1, 4, 9, 2, 10, 1, 1, 1, 35, 18, 1, 34, 2, 1, 6, 4, 62, 7, 1,
    1, 1, 4, 1, 15, 1, 10, 7, 57, 23, 4, 1, 8, 2, 2, 2, 22, 1, 7, 1, 2, 1, 5, 3, 8, 2, 2, 2, 2,
    3, 1, 6, 1, 5, 7, 28, 10, 1, 1, 2, 1, 1, 38, 1, 10, 1, 1, 2, 1, 1, 4, 1, 2, 3, 1, 1, 1, 44,
    66, 1, 3, 1, 4, 20, 3, 30, 66, 2, 2, 1, 1, 184, 54, 2, 7, 25, 6, 34, 63, 1, 1, 3, 1, 59, 54,
    2, 1, 71, 27, 2, 14, 21, 7, 185, 57, 103, 64, 31, 8, 2, 1, 2, 8, 1, 2, 1, 30, 1, 2, 2, 2, 2,
    4, 93, 8, 2, 46, 2, 6, 1, 1, 1, 2, 27, 51, 2, 10, 17, 72, 5, 1, 18, 73, 199, 33, 31, 9, 1,
    45, 1, 7, 1, 1, 49, 30, 2, 22, 1, 14, 73, 7, 1, 2, 1, 44, 3, 1, 1, 2, 1, 3, 1, 1, 2, 2, 24,
    6, 1, 2, 1, 37, 1, 2, 1, 4, 1, 1, 0, 23, 9, 17, 1, 41, 3, 3, 111, 1, 79, 0, 102, 111, 17,
    196, 0, 97, 15, 0, 17, 6, 25, 0, 5, 0, 0, 47, 0, 0, 7, 31, 17, 79, 17, 30, 18, 48, 16, 4,
    31, 21, 5, 19, 0, 45, 211, 64, 128, 75, 4, 57, 7, 17, 64, 2, 1, 1, 12, 2, 14, 0, 8, 0, 41,
    10, 0, 4, 1, 7, 1, 2, 1, 0, 15, 1, 29, 3, 2, 1, 14, 4, 8, 0, 0, 107, 5, 13, 3, 9, 7, 10, 4,
    1, 0, 85, 1, 71, 1, 2, 2, 1, 2, 2, 2, 4, 1, 12, 1, 1, 1, 7, 1, 65, 1, 4, 2, 8, 1, 7, 1, 28,
    1, 4, 1, 5, 1, 1, 3, 7, 1, 0, 2, 25, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 31,
    1, 25, 1, 8, 0, 31, 6, 6, 213, 7, 1, 17, 2, 7, 1, 2, 1, 5, 5, 62, 33, 1, 112, 45, 10, 7, 16,
    1, 0, 30, 18, 44, 0, 28, 228, 30, 2, 1, 0, 7, 1, 4, 1, 2, 1, 15, 1, 197, 59, 68, 3, 1, 3, 1,
    0, 4, 1, 27, 1, 2, 1, 1, 2, 1, 1, 10, 1, 4, 1, 1, 1, 1, 6, 1, 4, 1, 1, 1, 1, 1, 1, 3, 1, 2,
    1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 4, 1, 7, 1, 4, 1, 4, 1, 1, 1, 10, 1, 17,
    5, 3, 1, 5, 1, 17, 0, 26, 6, 26, 6, 26, 0, 0, 32, 0, 6, 222, 2, 0, 14, 0, 15, 0, 0, 0, 0, 0,
    5, 0, 0,
];
#[inline]
pub fn lookup(c: char) -> bool {
    debug_assert!(!c.is_ascii());
    (c as u32) >= 0xaa && lookup_slow(c)
}
#[inline(never)]
fn lookup_slow(c: char) -> bool {
    const {
        assert!(SHORT_OFFSET_RUNS.last().unwrap().0 > char::MAX as u32);
        let mut i = 0;

@@ -254,62 +260,69 @@ pub mod case_ignorable {
use super::ShortOffsetRunHeader;

static SHORT_OFFSET_RUNS: [ShortOffsetRunHeader; 37] = [
    ShortOffsetRunHeader::new(0, 688), ShortOffsetRunHeader::new(21, 4957),
    ShortOffsetRunHeader::new(273, 5906), ShortOffsetRunHeader::new(275, 8125),
    ShortOffsetRunHeader::new(385, 11388), ShortOffsetRunHeader::new(419, 12293),
    ShortOffsetRunHeader::new(431, 40981), ShortOffsetRunHeader::new(443, 42232),
    ShortOffsetRunHeader::new(445, 42508), ShortOffsetRunHeader::new(447, 64286),
    ShortOffsetRunHeader::new(543, 65024), ShortOffsetRunHeader::new(547, 66045),
    ShortOffsetRunHeader::new(577, 67456), ShortOffsetRunHeader::new(583, 68097),
    ShortOffsetRunHeader::new(589, 68900), ShortOffsetRunHeader::new(601, 69291),
    ShortOffsetRunHeader::new(609, 71727), ShortOffsetRunHeader::new(733, 71995),
    ShortOffsetRunHeader::new(737, 72752), ShortOffsetRunHeader::new(765, 73459),
    ShortOffsetRunHeader::new(795, 78896), ShortOffsetRunHeader::new(807, 90398),
    ShortOffsetRunHeader::new(811, 92912), ShortOffsetRunHeader::new(815, 93504),
    ShortOffsetRunHeader::new(821, 94031), ShortOffsetRunHeader::new(825, 110576),
    ShortOffsetRunHeader::new(833, 113821), ShortOffsetRunHeader::new(839, 118528),
    ShortOffsetRunHeader::new(843, 119143), ShortOffsetRunHeader::new(847, 121344),
    ShortOffsetRunHeader::new(857, 122880), ShortOffsetRunHeader::new(869, 123566),
    ShortOffsetRunHeader::new(885, 124139), ShortOffsetRunHeader::new(889, 125136),
    ShortOffsetRunHeader::new(893, 127995), ShortOffsetRunHeader::new(897, 917505),
    ShortOffsetRunHeader::new(899, 2032112),
    ShortOffsetRunHeader::new(0, 688), ShortOffsetRunHeader::new(11, 4957),
    ShortOffsetRunHeader::new(263, 5906), ShortOffsetRunHeader::new(265, 8125),
    ShortOffsetRunHeader::new(375, 11388), ShortOffsetRunHeader::new(409, 12293),
    ShortOffsetRunHeader::new(421, 40981), ShortOffsetRunHeader::new(433, 42232),
    ShortOffsetRunHeader::new(435, 42508), ShortOffsetRunHeader::new(437, 64286),
    ShortOffsetRunHeader::new(533, 65024), ShortOffsetRunHeader::new(537, 66045),
    ShortOffsetRunHeader::new(567, 67456), ShortOffsetRunHeader::new(573, 68097),
    ShortOffsetRunHeader::new(579, 68900), ShortOffsetRunHeader::new(591, 69291),
    ShortOffsetRunHeader::new(599, 71727), ShortOffsetRunHeader::new(723, 71995),
    ShortOffsetRunHeader::new(727, 72752), ShortOffsetRunHeader::new(755, 73459),
    ShortOffsetRunHeader::new(785, 78896), ShortOffsetRunHeader::new(797, 90398),
    ShortOffsetRunHeader::new(801, 92912), ShortOffsetRunHeader::new(805, 93504),
    ShortOffsetRunHeader::new(811, 94031), ShortOffsetRunHeader::new(815, 110576),
    ShortOffsetRunHeader::new(823, 113821), ShortOffsetRunHeader::new(829, 118528),
    ShortOffsetRunHeader::new(833, 119143), ShortOffsetRunHeader::new(837, 121344),
    ShortOffsetRunHeader::new(847, 122880), ShortOffsetRunHeader::new(859, 123566),
    ShortOffsetRunHeader::new(875, 124139), ShortOffsetRunHeader::new(879, 125136),
    ShortOffsetRunHeader::new(883, 127995), ShortOffsetRunHeader::new(887, 917505),
    ShortOffsetRunHeader::new(889, 2032112),
];
static OFFSETS: [u8; 905] = [
    39, 1, 6, 1, 11, 1, 35, 1, 1, 1, 71, 1, 4, 1, 1, 1, 4, 1, 2, 2, 0, 192, 4, 2, 4, 1, 9, 2,
    1, 1, 251, 7, 207, 1, 5, 1, 49, 45, 1, 1, 1, 2, 1, 2, 1, 1, 44, 1, 11, 6, 10, 11, 1, 1, 35,
    1, 10, 21, 16, 1, 101, 8, 1, 10, 1, 4, 33, 1, 1, 1, 30, 27, 91, 11, 58, 11, 4, 1, 2, 1, 24,
    24, 43, 3, 44, 1, 7, 2, 5, 9, 41, 58, 55, 1, 1, 1, 4, 8, 4, 1, 3, 7, 10, 2, 13, 1, 15, 1,
    58, 1, 4, 4, 8, 1, 20, 2, 26, 1, 2, 2, 57, 1, 4, 2, 4, 2, 2, 3, 3, 1, 30, 2, 3, 1, 11, 2,
    57, 1, 4, 5, 1, 2, 4, 1, 20, 2, 22, 6, 1, 1, 58, 1, 2, 1, 1, 4, 8, 1, 7, 2, 11, 2, 30, 1,
    61, 1, 12, 1, 50, 1, 3, 1, 55, 1, 1, 3, 5, 3, 1, 4, 7, 2, 11, 2, 29, 1, 58, 1, 2, 1, 6, 1,
    5, 2, 20, 2, 28, 2, 57, 2, 4, 4, 8, 1, 20, 2, 29, 1, 72, 1, 7, 3, 1, 1, 90, 1, 2, 7, 11, 9,
    98, 1, 2, 9, 9, 1, 1, 7, 73, 2, 27, 1, 1, 1, 1, 1, 55, 14, 1, 5, 1, 2, 5, 11, 1, 36, 9, 1,
    102, 4, 1, 6, 1, 2, 2, 2, 25, 2, 4, 3, 16, 4, 13, 1, 2, 2, 6, 1, 15, 1, 94, 1, 0, 3, 0, 3,
    29, 2, 30, 2, 30, 2, 64, 2, 1, 7, 8, 1, 2, 11, 3, 1, 5, 1, 45, 5, 51, 1, 65, 2, 34, 1, 118,
    3, 4, 2, 9, 1, 6, 3, 219, 2, 2, 1, 58, 1, 1, 7, 1, 1, 1, 1, 2, 8, 6, 10, 2, 1, 39, 1, 8, 31,
    49, 4, 48, 1, 1, 5, 1, 1, 5, 1, 40, 9, 12, 2, 32, 4, 2, 2, 1, 3, 56, 1, 1, 2, 3, 1, 1, 3,
    58, 8, 2, 2, 64, 6, 82, 3, 1, 13, 1, 7, 4, 1, 6, 1, 3, 2, 50, 63, 13, 1, 34, 101, 0, 1, 1,
    3, 11, 3, 13, 3, 13, 3, 13, 2, 12, 5, 8, 2, 10, 1, 2, 1, 2, 5, 49, 5, 1, 10, 1, 1, 13, 1,
    16, 13, 51, 33, 0, 2, 113, 3, 125, 1, 15, 1, 96, 32, 47, 1, 0, 1, 36, 4, 3, 5, 5, 1, 93, 6,
    93, 3, 0, 1, 0, 6, 0, 1, 98, 4, 1, 10, 1, 1, 28, 4, 80, 2, 14, 34, 78, 1, 23, 3, 103, 3, 3,
    2, 8, 1, 3, 1, 4, 1, 25, 2, 5, 1, 151, 2, 26, 18, 13, 1, 38, 8, 25, 11, 46, 3, 48, 1, 2, 4,
    2, 2, 17, 1, 21, 2, 66, 6, 2, 2, 2, 2, 12, 1, 8, 1, 35, 1, 11, 1, 51, 1, 1, 3, 2, 2, 5, 2,
    1, 1, 27, 1, 14, 2, 5, 2, 1, 1, 100, 5, 9, 3, 121, 1, 2, 1, 4, 1, 0, 1, 147, 17, 0, 16, 3,
    1, 12, 16, 34, 1, 2, 1, 169, 1, 7, 1, 6, 1, 11, 1, 35, 1, 1, 1, 47, 1, 45, 2, 67, 1, 21, 3,
    0, 1, 226, 1, 149, 5, 0, 6, 1, 42, 1, 9, 0, 3, 1, 2, 5, 4, 40, 3, 4, 1, 165, 2, 0, 4, 38, 1,
    26, 5, 1, 1, 0, 2, 79, 4, 70, 11, 49, 4, 123, 1, 54, 15, 41, 1, 2, 2, 10, 3, 49, 4, 2, 2, 2,
    1, 4, 1, 10, 1, 50, 3, 36, 5, 1, 8, 62, 1, 12, 2, 52, 9, 10, 4, 2, 1, 95, 3, 2, 1, 1, 2, 6,
    1, 2, 1, 157, 1, 3, 8, 21, 2, 57, 2, 3, 1, 37, 7, 3, 5, 70, 6, 13, 1, 1, 1, 1, 1, 14, 2, 85,
    8, 2, 3, 1, 1, 23, 1, 84, 6, 1, 1, 4, 2, 1, 2, 238, 4, 6, 2, 1, 2, 27, 2, 85, 8, 2, 1, 1, 2,
    106, 1, 1, 1, 2, 6, 1, 1, 101, 1, 1, 1, 2, 4, 1, 5, 0, 9, 1, 2, 0, 2, 1, 1, 4, 1, 144, 4, 2,
    2, 4, 1, 32, 10, 40, 6, 2, 4, 8, 1, 9, 6, 2, 3, 46, 13, 1, 2, 0, 7, 1, 6, 1, 1, 82, 22, 2,
    7, 1, 2, 1, 2, 122, 6, 3, 1, 1, 2, 1, 7, 1, 1, 72, 2, 3, 1, 1, 1, 0, 2, 11, 2, 52, 5, 5, 1,
    1, 1, 23, 1, 0, 17, 6, 15, 0, 12, 3, 3, 0, 5, 59, 7, 9, 4, 0, 3, 40, 2, 0, 1, 63, 17, 64, 2,
    1, 2, 0, 4, 1, 7, 1, 2, 0, 2, 1, 4, 0, 46, 2, 23, 0, 3, 9, 16, 2, 7, 30, 4, 148, 3, 0, 55,
    4, 50, 8, 1, 14, 1, 22, 5, 1, 15, 0, 7, 1, 17, 2, 7, 1, 2, 1, 5, 5, 62, 33, 1, 160, 14, 0,
    1, 61, 4, 0, 5, 254, 2, 0, 7, 109, 8, 0, 5, 0, 1, 30, 96, 128, 240, 0,
static OFFSETS: [u8; 895] = [
    168, 1, 4, 1, 1, 1, 4, 1, 2, 2, 0, 192, 4, 2, 4, 1, 9, 2, 1, 1, 251, 7, 207, 1, 5, 1, 49,
    45, 1, 1, 1, 2, 1, 2, 1, 1, 44, 1, 11, 6, 10, 11, 1, 1, 35, 1, 10, 21, 16, 1, 101, 8, 1, 10,
    1, 4, 33, 1, 1, 1, 30, 27, 91, 11, 58, 11, 4, 1, 2, 1, 24, 24, 43, 3, 44, 1, 7, 2, 5, 9, 41,
    58, 55, 1, 1, 1, 4, 8, 4, 1, 3, 7, 10, 2, 13, 1, 15, 1, 58, 1, 4, 4, 8, 1, 20, 2, 26, 1, 2,
    2, 57, 1, 4, 2, 4, 2, 2, 3, 3, 1, 30, 2, 3, 1, 11, 2, 57, 1, 4, 5, 1, 2, 4, 1, 20, 2, 22, 6,
    1, 1, 58, 1, 2, 1, 1, 4, 8, 1, 7, 2, 11, 2, 30, 1, 61, 1, 12, 1, 50, 1, 3, 1, 55, 1, 1, 3,
    5, 3, 1, 4, 7, 2, 11, 2, 29, 1, 58, 1, 2, 1, 6, 1, 5, 2, 20, 2, 28, 2, 57, 2, 4, 4, 8, 1,
    20, 2, 29, 1, 72, 1, 7, 3, 1, 1, 90, 1, 2, 7, 11, 9, 98, 1, 2, 9, 9, 1, 1, 7, 73, 2, 27, 1,
    1, 1, 1, 1, 55, 14, 1, 5, 1, 2, 5, 11, 1, 36, 9, 1, 102, 4, 1, 6, 1, 2, 2, 2, 25, 2, 4, 3,
    16, 4, 13, 1, 2, 2, 6, 1, 15, 1, 94, 1, 0, 3, 0, 3, 29, 2, 30, 2, 30, 2, 64, 2, 1, 7, 8, 1,
    2, 11, 3, 1, 5, 1, 45, 5, 51, 1, 65, 2, 34, 1, 118, 3, 4, 2, 9, 1, 6, 3, 219, 2, 2, 1, 58,
    1, 1, 7, 1, 1, 1, 1, 2, 8, 6, 10, 2, 1, 39, 1, 8, 31, 49, 4, 48, 1, 1, 5, 1, 1, 5, 1, 40, 9,
    12, 2, 32, 4, 2, 2, 1, 3, 56, 1, 1, 2, 3, 1, 1, 3, 58, 8, 2, 2, 64, 6, 82, 3, 1, 13, 1, 7,
    4, 1, 6, 1, 3, 2, 50, 63, 13, 1, 34, 101, 0, 1, 1, 3, 11, 3, 13, 3, 13, 3, 13, 2, 12, 5, 8,
    2, 10, 1, 2, 1, 2, 5, 49, 5, 1, 10, 1, 1, 13, 1, 16, 13, 51, 33, 0, 2, 113, 3, 125, 1, 15,
    1, 96, 32, 47, 1, 0, 1, 36, 4, 3, 5, 5, 1, 93, 6, 93, 3, 0, 1, 0, 6, 0, 1, 98, 4, 1, 10, 1,
    1, 28, 4, 80, 2, 14, 34, 78, 1, 23, 3, 103, 3, 3, 2, 8, 1, 3, 1, 4, 1, 25, 2, 5, 1, 151, 2,
    26, 18, 13, 1, 38, 8, 25, 11, 46, 3, 48, 1, 2, 4, 2, 2, 17, 1, 21, 2, 66, 6, 2, 2, 2, 2, 12,
    1, 8, 1, 35, 1, 11, 1, 51, 1, 1, 3, 2, 2, 5, 2, 1, 1, 27, 1, 14, 2, 5, 2, 1, 1, 100, 5, 9,
    3, 121, 1, 2, 1, 4, 1, 0, 1, 147, 17, 0, 16, 3, 1, 12, 16, 34, 1, 2, 1, 169, 1, 7, 1, 6, 1,
    11, 1, 35, 1, 1, 1, 47, 1, 45, 2, 67, 1, 21, 3, 0, 1, 226, 1, 149, 5, 0, 6, 1, 42, 1, 9, 0,
    3, 1, 2, 5, 4, 40, 3, 4, 1, 165, 2, 0, 4, 38, 1, 26, 5, 1, 1, 0, 2, 79, 4, 70, 11, 49, 4,
    123, 1, 54, 15, 41, 1, 2, 2, 10, 3, 49, 4, 2, 2, 2, 1, 4, 1, 10, 1, 50, 3, 36, 5, 1, 8, 62,
    1, 12, 2, 52, 9, 10, 4, 2, 1, 95, 3, 2, 1, 1, 2, 6, 1, 2, 1, 157, 1, 3, 8, 21, 2, 57, 2, 3,
    1, 37, 7, 3, 5, 70, 6, 13, 1, 1, 1, 1, 1, 14, 2, 85, 8, 2, 3, 1, 1, 23, 1, 84, 6, 1, 1, 4,
    2, 1, 2, 238, 4, 6, 2, 1, 2, 27, 2, 85, 8, 2, 1, 1, 2, 106, 1, 1, 1, 2, 6, 1, 1, 101, 1, 1,
    1, 2, 4, 1, 5, 0, 9, 1, 2, 0, 2, 1, 1, 4, 1, 144, 4, 2, 2, 4, 1, 32, 10, 40, 6, 2, 4, 8, 1,
    9, 6, 2, 3, 46, 13, 1, 2, 0, 7, 1, 6, 1, 1, 82, 22, 2, 7, 1, 2, 1, 2, 122, 6, 3, 1, 1, 2, 1,
    7, 1, 1, 72, 2, 3, 1, 1, 1, 0, 2, 11, 2, 52, 5, 5, 1, 1, 1, 23, 1, 0, 17, 6, 15, 0, 12, 3,
    3, 0, 5, 59, 7, 9, 4, 0, 3, 40, 2, 0, 1, 63, 17, 64, 2, 1, 2, 0, 4, 1, 7, 1, 2, 0, 2, 1, 4,
    0, 46, 2, 23, 0, 3, 9, 16, 2, 7, 30, 4, 148, 3, 0, 55, 4, 50, 8, 1, 14, 1, 22, 5, 1, 15, 0,
    7, 1, 17, 2, 7, 1, 2, 1, 5, 5, 62, 33, 1, 160, 14, 0, 1, 61, 4, 0, 5, 254, 2, 0, 7, 109, 8,
    0, 5, 0, 1, 30, 96, 128, 240, 0,
];
#[inline]
pub fn lookup(c: char) -> bool {
    debug_assert!(!c.is_ascii());
    (c as u32) >= 0xa8 && lookup_slow(c)
}
#[inline(never)]
fn lookup_slow(c: char) -> bool {
    const {
        assert!(SHORT_OFFSET_RUNS.last().unwrap().0 > char::MAX as u32);
        let mut i = 0;

@@ -329,33 +342,40 @@ pub mod cased {
use super::ShortOffsetRunHeader;

static SHORT_OFFSET_RUNS: [ShortOffsetRunHeader; 22] = [
    ShortOffsetRunHeader::new(0, 4256), ShortOffsetRunHeader::new(55, 5024),
    ShortOffsetRunHeader::new(65, 7296), ShortOffsetRunHeader::new(69, 7958),
    ShortOffsetRunHeader::new(78, 9398), ShortOffsetRunHeader::new(153, 11264),
    ShortOffsetRunHeader::new(155, 42560), ShortOffsetRunHeader::new(167, 43824),
    ShortOffsetRunHeader::new(187, 64256), ShortOffsetRunHeader::new(193, 65313),
    ShortOffsetRunHeader::new(197, 66560), ShortOffsetRunHeader::new(201, 67456),
    ShortOffsetRunHeader::new(223, 68736), ShortOffsetRunHeader::new(231, 71840),
    ShortOffsetRunHeader::new(239, 93760), ShortOffsetRunHeader::new(241, 119808),
    ShortOffsetRunHeader::new(243, 120486), ShortOffsetRunHeader::new(280, 122624),
    ShortOffsetRunHeader::new(303, 122928), ShortOffsetRunHeader::new(309, 125184),
    ShortOffsetRunHeader::new(311, 127280), ShortOffsetRunHeader::new(313, 1241482),
    ShortOffsetRunHeader::new(0, 4256), ShortOffsetRunHeader::new(51, 5024),
    ShortOffsetRunHeader::new(61, 7296), ShortOffsetRunHeader::new(65, 7958),
    ShortOffsetRunHeader::new(74, 9398), ShortOffsetRunHeader::new(149, 11264),
    ShortOffsetRunHeader::new(151, 42560), ShortOffsetRunHeader::new(163, 43824),
    ShortOffsetRunHeader::new(183, 64256), ShortOffsetRunHeader::new(189, 65313),
    ShortOffsetRunHeader::new(193, 66560), ShortOffsetRunHeader::new(197, 67456),
    ShortOffsetRunHeader::new(219, 68736), ShortOffsetRunHeader::new(227, 71840),
    ShortOffsetRunHeader::new(235, 93760), ShortOffsetRunHeader::new(237, 119808),
    ShortOffsetRunHeader::new(239, 120486), ShortOffsetRunHeader::new(276, 122624),
    ShortOffsetRunHeader::new(299, 122928), ShortOffsetRunHeader::new(305, 125184),
    ShortOffsetRunHeader::new(307, 127280), ShortOffsetRunHeader::new(309, 1241482),
];
static OFFSETS: [u8; 319] = [
    65, 26, 6, 26, 47, 1, 10, 1, 4, 1, 5, 23, 1, 31, 1, 195, 1, 4, 4, 208, 1, 36, 7, 2, 30, 5,
    96, 1, 42, 4, 2, 2, 2, 4, 1, 1, 6, 1, 1, 3, 1, 1, 1, 20, 1, 83, 1, 139, 8, 166, 1, 38, 9,
    41, 0, 38, 1, 1, 5, 1, 2, 43, 1, 4, 0, 86, 2, 6, 0, 11, 5, 43, 2, 3, 64, 192, 64, 0, 2, 6,
    2, 38, 2, 6, 2, 8, 1, 1, 1, 1, 1, 1, 1, 31, 2, 53, 1, 7, 1, 1, 3, 3, 1, 7, 3, 4, 2, 6, 4,
    13, 5, 3, 1, 7, 116, 1, 13, 1, 16, 13, 101, 1, 4, 1, 2, 10, 1, 1, 3, 5, 6, 1, 1, 1, 1, 1, 1,
    4, 1, 6, 4, 1, 2, 4, 5, 5, 4, 1, 17, 32, 3, 2, 0, 52, 0, 229, 6, 4, 3, 2, 12, 38, 1, 1, 5,
    1, 0, 46, 18, 30, 132, 102, 3, 4, 1, 62, 2, 2, 1, 1, 1, 8, 21, 5, 1, 3, 0, 43, 1, 14, 6, 80,
    0, 7, 12, 5, 0, 26, 6, 26, 0, 80, 96, 36, 4, 36, 116, 11, 1, 15, 1, 7, 1, 2, 1, 11, 1, 15,
    1, 7, 1, 2, 0, 1, 2, 3, 1, 42, 1, 9, 0, 51, 13, 51, 93, 22, 10, 22, 0, 64, 0, 64, 0, 85, 1,
    71, 1, 2, 2, 1, 2, 2, 2, 4, 1, 12, 1, 1, 1, 7, 1, 65, 1, 4, 2, 8, 1, 7, 1, 28, 1, 4, 1, 5,
    1, 1, 3, 7, 1, 0, 2, 25, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1,
    8, 0, 10, 1, 20, 6, 6, 0, 62, 0, 68, 0, 26, 6, 26, 6, 26, 0,
static OFFSETS: [u8; 315] = [
    170, 1, 10, 1, 4, 1, 5, 23, 1, 31, 1, 195, 1, 4, 4, 208, 1, 36, 7, 2, 30, 5, 96, 1, 42, 4,
    2, 2, 2, 4, 1, 1, 6, 1, 1, 3, 1, 1, 1, 20, 1, 83, 1, 139, 8, 166, 1, 38, 9, 41, 0, 38, 1, 1,
    5, 1, 2, 43, 1, 4, 0, 86, 2, 6, 0, 11, 5, 43, 2, 3, 64, 192, 64, 0, 2, 6, 2, 38, 2, 6, 2, 8,
    1, 1, 1, 1, 1, 1, 1, 31, 2, 53, 1, 7, 1, 1, 3, 3, 1, 7, 3, 4, 2, 6, 4, 13, 5, 3, 1, 7, 116,
    1, 13, 1, 16, 13, 101, 1, 4, 1, 2, 10, 1, 1, 3, 5, 6, 1, 1, 1, 1, 1, 1, 4, 1, 6, 4, 1, 2, 4,
    5, 5, 4, 1, 17, 32, 3, 2, 0, 52, 0, 229, 6, 4, 3, 2, 12, 38, 1, 1, 5, 1, 0, 46, 18, 30, 132,
    102, 3, 4, 1, 62, 2, 2, 1, 1, 1, 8, 21, 5, 1, 3, 0, 43, 1, 14, 6, 80, 0, 7, 12, 5, 0, 26, 6,
    26, 0, 80, 96, 36, 4, 36, 116, 11, 1, 15, 1, 7, 1, 2, 1, 11, 1, 15, 1, 7, 1, 2, 0, 1, 2, 3,
    1, 42, 1, 9, 0, 51, 13, 51, 93, 22, 10, 22, 0, 64, 0, 64, 0, 85, 1, 71, 1, 2, 2, 1, 2, 2, 2,
    4, 1, 12, 1, 1, 1, 7, 1, 65, 1, 4, 2, 8, 1, 7, 1, 28, 1, 4, 1, 5, 1, 1, 3, 7, 1, 0, 2, 25,
    1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 8, 0, 10, 1, 20, 6, 6, 0,
    62, 0, 68, 0, 26, 6, 26, 6, 26, 0,
];
#[inline]
pub fn lookup(c: char) -> bool {
    debug_assert!(!c.is_ascii());
    (c as u32) >= 0xaa && lookup_slow(c)
}
#[inline(never)]
fn lookup_slow(c: char) -> bool {
    const {
        assert!(SHORT_OFFSET_RUNS.last().unwrap().0 > char::MAX as u32);
        let mut i = 0;

@@ -424,6 +444,7 @@ pub mod grapheme_extend {
];
#[inline]
pub fn lookup(c: char) -> bool {
debug_assert!(!c.is_ascii());
(c as u32) >= 0x300 && lookup_slow(c)
}

@@ -446,7 +467,7 @@ pub mod grapheme_extend {
#[rustfmt::skip]
pub mod lowercase {
static BITSET_CHUNKS_MAP: [u8; 123] = [
14, 17, 0, 0, 9, 0, 0, 12, 13, 10, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12, 17, 0, 0, 9, 0, 0, 13, 14, 10, 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, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 4, 1, 0, 15, 0, 8, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0,
@@ -458,37 +479,37 @@ pub mod lowercase {
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 14, 56, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 43, 0, 52, 48, 50, 33],
[0, 0, 0, 0, 10, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 9, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 3, 0, 16, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27],
[0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 34, 17, 23, 53, 54, 49, 47, 7, 35, 42, 0, 28, 12, 31],
[0, 0, 46, 0, 56, 56, 56, 0, 22, 22, 69, 22, 36, 25, 24, 37],
[0, 5, 70, 0, 29, 15, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 66, 34, 17, 23, 53, 54, 49, 47, 8, 35, 42, 0, 28, 13, 31],
[11, 60, 0, 6, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 32, 0],
[10, 60, 0, 6, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 32, 0],
[16, 26, 22, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[16, 51, 2, 21, 68, 9, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[16, 51, 2, 21, 68, 8, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[16, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[65, 41, 55, 12, 77, 63, 18, 1, 7, 64, 76, 20, 73, 74, 4, 45],
[65, 41, 55, 11, 66, 63, 18, 13, 1, 64, 76, 20, 73, 74, 4, 45],
];
static BITSET_CANONICAL: [u64; 56] = [
0b0000000000000000000000000000000000000000000000000000000000000000,
0b1111111111111111110000000000000000000000000011111111111111111111,
0b0000111111111111111111111111110000000000000000000000000011111111,
0b1010101010101010101010101010101010101010101010101010100000000010,
0b0000000000000111111111111111111111111111111111111111111111111111,
0b1111111111111111111111000000000000000000000000001111110111111111,
0b1000000000000010000000000000000000000000000000000000000000000000,
0b0000111111111111111111111111111111111111000000000000000000000000,
0b0000111111111111111111111111110000000000000000000000000011111111,
0b1111111111111111111111111111111111111111111111111010101010000101,
0b1111111111111111111111111111111100000000000000000000000000000000,
0b1111111111111111111111111111110000000000000000000000000000000000,
0b1111111111111111111111110000000000000000000000000000000000000000,
0b1111111111111111111111000000000000000000000000001111111111101111,
0b1111111111111111111100000000000000000000000000010000000000000000,
0b1111111111111111110000000000000000000000000011111111111111111111,
0b1111111111111111000000111111111111110111111111111111111111111111,
0b1111111111111111000000000000000000000000000000000100001111000000,
0b1111111111111111000000000000000000000000000000000000000000000000,
@@ -532,13 +553,15 @@ pub mod lowercase {
0b1110011001010001001011010010101001001110001001000011000100101001,
0b1110101111000000000000000000000000001111111111111111111111111100,
];
static BITSET_MAPPING: [(u8, u8); 22] = [
(0, 64), (1, 188), (1, 186), (1, 183), (1, 176), (1, 109), (1, 124), (1, 126), (1, 66),
(1, 70), (1, 77), (2, 146), (2, 144), (2, 83), (3, 93), (3, 147), (3, 133), (4, 12), (4, 6),
(5, 187), (6, 78), (7, 132),
static BITSET_MAPPING: [(u8, u8); 21] = [
(0, 64), (1, 184), (1, 182), (1, 179), (1, 172), (1, 161), (1, 146), (1, 144), (1, 140),
(1, 136), (1, 132), (2, 146), (2, 144), (2, 83), (3, 93), (3, 147), (3, 133), (4, 12),
(4, 6), (5, 187), (6, 78),
];

pub const fn lookup(c: char) -> bool {
    debug_assert!(!c.is_ascii());
    (c as u32) >= 0xaa &&
    super::bitset_search(
        c as u32,
        &BITSET_CHUNKS_MAP,

@@ -554,43 +577,50 @@ pub mod n {
use super::ShortOffsetRunHeader;

static SHORT_OFFSET_RUNS: [ShortOffsetRunHeader; 42] = [
    ShortOffsetRunHeader::new(0, 1632), ShortOffsetRunHeader::new(9, 2406),
    ShortOffsetRunHeader::new(15, 4160), ShortOffsetRunHeader::new(49, 4969),
    ShortOffsetRunHeader::new(53, 5870), ShortOffsetRunHeader::new(55, 6470),
    ShortOffsetRunHeader::new(63, 8304), ShortOffsetRunHeader::new(79, 9312),
    ShortOffsetRunHeader::new(89, 10102), ShortOffsetRunHeader::new(93, 11517),
    ShortOffsetRunHeader::new(95, 12295), ShortOffsetRunHeader::new(97, 12690),
    ShortOffsetRunHeader::new(103, 42528), ShortOffsetRunHeader::new(115, 43056),
    ShortOffsetRunHeader::new(119, 44016), ShortOffsetRunHeader::new(131, 65296),
    ShortOffsetRunHeader::new(133, 65799), ShortOffsetRunHeader::new(135, 66273),
    ShortOffsetRunHeader::new(141, 67672), ShortOffsetRunHeader::new(153, 68858),
    ShortOffsetRunHeader::new(183, 69216), ShortOffsetRunHeader::new(189, 70736),
    ShortOffsetRunHeader::new(209, 71248), ShortOffsetRunHeader::new(213, 71904),
    ShortOffsetRunHeader::new(221, 72688), ShortOffsetRunHeader::new(225, 73552),
    ShortOffsetRunHeader::new(233, 74752), ShortOffsetRunHeader::new(237, 90416),
    ShortOffsetRunHeader::new(239, 92768), ShortOffsetRunHeader::new(241, 93552),
    ShortOffsetRunHeader::new(249, 93824), ShortOffsetRunHeader::new(251, 118000),
    ShortOffsetRunHeader::new(253, 119488), ShortOffsetRunHeader::new(255, 120782),
    ShortOffsetRunHeader::new(261, 123200), ShortOffsetRunHeader::new(263, 123632),
    ShortOffsetRunHeader::new(265, 124144), ShortOffsetRunHeader::new(267, 125127),
    ShortOffsetRunHeader::new(271, 126065), ShortOffsetRunHeader::new(275, 127232),
    ShortOffsetRunHeader::new(285, 130032), ShortOffsetRunHeader::new(287, 1244154),
    ShortOffsetRunHeader::new(0, 1632), ShortOffsetRunHeader::new(7, 2406),
    ShortOffsetRunHeader::new(13, 4160), ShortOffsetRunHeader::new(47, 4969),
    ShortOffsetRunHeader::new(51, 5870), ShortOffsetRunHeader::new(53, 6470),
    ShortOffsetRunHeader::new(61, 8304), ShortOffsetRunHeader::new(77, 9312),
    ShortOffsetRunHeader::new(87, 10102), ShortOffsetRunHeader::new(91, 11517),
    ShortOffsetRunHeader::new(93, 12295), ShortOffsetRunHeader::new(95, 12690),
    ShortOffsetRunHeader::new(101, 42528), ShortOffsetRunHeader::new(113, 43056),
    ShortOffsetRunHeader::new(117, 44016), ShortOffsetRunHeader::new(129, 65296),
    ShortOffsetRunHeader::new(131, 65799), ShortOffsetRunHeader::new(133, 66273),
    ShortOffsetRunHeader::new(139, 67672), ShortOffsetRunHeader::new(151, 68858),
    ShortOffsetRunHeader::new(181, 69216), ShortOffsetRunHeader::new(187, 70736),
    ShortOffsetRunHeader::new(207, 71248), ShortOffsetRunHeader::new(211, 71904),
    ShortOffsetRunHeader::new(219, 72688), ShortOffsetRunHeader::new(223, 73552),
    ShortOffsetRunHeader::new(231, 74752), ShortOffsetRunHeader::new(235, 90416),
    ShortOffsetRunHeader::new(237, 92768), ShortOffsetRunHeader::new(239, 93552),
    ShortOffsetRunHeader::new(247, 93824), ShortOffsetRunHeader::new(249, 118000),
    ShortOffsetRunHeader::new(251, 119488), ShortOffsetRunHeader::new(253, 120782),
    ShortOffsetRunHeader::new(259, 123200), ShortOffsetRunHeader::new(261, 123632),
    ShortOffsetRunHeader::new(263, 124144), ShortOffsetRunHeader::new(265, 125127),
    ShortOffsetRunHeader::new(269, 126065), ShortOffsetRunHeader::new(273, 127232),
    ShortOffsetRunHeader::new(283, 130032), ShortOffsetRunHeader::new(285, 1244154),
];
static OFFSETS: [u8; 289] = [
    48, 10, 120, 2, 5, 1, 2, 3, 0, 10, 134, 10, 198, 10, 0, 10, 118, 10, 4, 6, 108, 10, 118,
    10, 118, 10, 2, 6, 110, 13, 115, 10, 8, 7, 103, 10, 104, 7, 7, 19, 109, 10, 96, 10, 118, 10,
    70, 20, 0, 10, 70, 10, 0, 20, 0, 3, 239, 10, 6, 10, 22, 10, 0, 10, 128, 11, 165, 10, 6, 10,
    182, 10, 86, 10, 134, 10, 6, 10, 0, 1, 3, 6, 6, 10, 198, 51, 2, 5, 0, 60, 78, 22, 0, 30, 0,
    1, 0, 1, 25, 9, 14, 3, 0, 4, 138, 10, 30, 8, 1, 15, 32, 10, 39, 15, 0, 10, 188, 10, 0, 6,
    154, 10, 38, 10, 198, 10, 22, 10, 86, 10, 0, 10, 0, 10, 0, 45, 12, 57, 17, 2, 0, 27, 36, 4,
    29, 1, 8, 1, 134, 5, 202, 10, 0, 8, 25, 7, 39, 9, 75, 5, 22, 6, 160, 2, 2, 16, 2, 46, 64, 9,
    52, 2, 30, 3, 75, 5, 104, 8, 24, 8, 41, 7, 0, 6, 48, 10, 6, 10, 0, 31, 158, 10, 42, 4, 112,
    7, 134, 30, 128, 10, 60, 10, 144, 10, 7, 20, 251, 10, 0, 10, 118, 10, 0, 10, 102, 10, 6, 20,
    76, 12, 0, 19, 93, 10, 0, 10, 86, 29, 227, 10, 70, 10, 0, 10, 102, 21, 0, 111, 0, 10, 0, 10,
    86, 10, 134, 10, 1, 7, 0, 10, 0, 23, 0, 10, 0, 20, 12, 20, 108, 25, 0, 50, 0, 10, 0, 10, 0,
    10, 247, 10, 0, 9, 128, 10, 0, 59, 1, 3, 1, 4, 76, 45, 1, 15, 0, 13, 0, 10, 0,
static OFFSETS: [u8; 287] = [
    178, 2, 5, 1, 2, 3, 0, 10, 134, 10, 198, 10, 0, 10, 118, 10, 4, 6, 108, 10, 118, 10, 118,
    10, 2, 6, 110, 13, 115, 10, 8, 7, 103, 10, 104, 7, 7, 19, 109, 10, 96, 10, 118, 10, 70, 20,
    0, 10, 70, 10, 0, 20, 0, 3, 239, 10, 6, 10, 22, 10, 0, 10, 128, 11, 165, 10, 6, 10, 182, 10,
    86, 10, 134, 10, 6, 10, 0, 1, 3, 6, 6, 10, 198, 51, 2, 5, 0, 60, 78, 22, 0, 30, 0, 1, 0, 1,
    25, 9, 14, 3, 0, 4, 138, 10, 30, 8, 1, 15, 32, 10, 39, 15, 0, 10, 188, 10, 0, 6, 154, 10,
    38, 10, 198, 10, 22, 10, 86, 10, 0, 10, 0, 10, 0, 45, 12, 57, 17, 2, 0, 27, 36, 4, 29, 1, 8,
    1, 134, 5, 202, 10, 0, 8, 25, 7, 39, 9, 75, 5, 22, 6, 160, 2, 2, 16, 2, 46, 64, 9, 52, 2,
    30, 3, 75, 5, 104, 8, 24, 8, 41, 7, 0, 6, 48, 10, 6, 10, 0, 31, 158, 10, 42, 4, 112, 7, 134,
    30, 128, 10, 60, 10, 144, 10, 7, 20, 251, 10, 0, 10, 118, 10, 0, 10, 102, 10, 6, 20, 76, 12,
    0, 19, 93, 10, 0, 10, 86, 29, 227, 10, 70, 10, 0, 10, 102, 21, 0, 111, 0, 10, 0, 10, 86, 10,
    134, 10, 1, 7, 0, 10, 0, 23, 0, 10, 0, 20, 12, 20, 108, 25, 0, 50, 0, 10, 0, 10, 0, 10, 247,
    10, 0, 9, 128, 10, 0, 59, 1, 3, 1, 4, 76, 45, 1, 15, 0, 13, 0, 10, 0,
];
#[inline]
pub fn lookup(c: char) -> bool {
    debug_assert!(!c.is_ascii());
    (c as u32) >= 0xb2 && lookup_slow(c)
}
#[inline(never)]
fn lookup_slow(c: char) -> bool {
    const {
        assert!(SHORT_OFFSET_RUNS.last().unwrap().0 > char::MAX as u32);
        let mut i = 0;

@@ -608,34 +638,34 @@ pub mod n {
#[rustfmt::skip]
pub mod uppercase {
static BITSET_CHUNKS_MAP: [u8; 125] = [
12, 15, 6, 6, 0, 6, 6, 2, 4, 11, 6, 16, 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, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 5, 6, 14, 6, 10, 6, 6, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 7, 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, 13, 6, 6,
6, 6, 9, 6, 3,
3, 14, 6, 6, 0, 6, 6, 2, 5, 12, 6, 15, 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, 9, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 7, 6, 13, 6, 11, 6, 6, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 8, 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, 16, 6, 6,
6, 6, 10, 6, 4,
];
static BITSET_INDEX_CHUNKS: [[u8; 16]; 17] = [
[44, 44, 5, 35, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 5, 1],
[44, 44, 5, 35, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 5, 0],
[44, 44, 5, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 40, 44, 44, 44, 44, 44, 17, 17, 63, 17, 43, 29, 24, 23],
[44, 44, 40, 44, 44, 44, 44, 44, 17, 17, 62, 17, 43, 29, 24, 23],
[44, 44, 44, 32, 36, 21, 22, 15, 13, 34, 44, 44, 44, 11, 30, 39],
[44, 44, 44, 44, 9, 8, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 44, 44, 37, 28, 67, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 44, 44, 44],
[44, 44, 44, 44, 37, 28, 66, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 44, 44, 44, 44, 44, 44, 44, 55, 44, 44, 44, 44, 44, 44],
[44, 44, 44, 44, 44, 44, 44, 44, 44, 62, 61, 44, 20, 14, 16, 4],
[44, 44, 44, 44, 56, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 59, 44, 44, 31, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 60, 46, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 49, 44, 32, 36, 21, 22, 15, 13, 34, 44, 44, 44, 11, 30, 39],
[52, 54, 26, 50, 12, 7, 25, 51, 41, 53, 6, 3, 66, 65, 64, 68],
[57, 44, 9, 47, 44, 42, 33, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[58, 19, 2, 18, 10, 48, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[58, 38, 17, 27, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 57, 44, 44, 44],
[44, 44, 44, 44, 44, 44, 44, 44, 44, 49, 44, 44, 44, 44, 44, 44],
[44, 44, 44, 44, 44, 44, 44, 44, 44, 61, 60, 44, 20, 14, 16, 4],
[44, 44, 44, 44, 50, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 53, 44, 44, 31, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 54, 46, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[51, 44, 9, 47, 44, 42, 33, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[52, 19, 2, 18, 10, 48, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[52, 38, 17, 27, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[58, 1, 26, 55, 12, 7, 25, 56, 41, 59, 6, 3, 65, 64, 63, 67],
];
static BITSET_CANONICAL: [u64; 44] = [
0b0000011111111111111111111111111000000000000000000000000000000000,
0b0000000000111111111111111111111111111111111111111111111111111111,
0b1111111111111111111111110000000000000000000000000011111111111111,
0b0101010101010101010101010101010101010101010101010101010000000001,
0b0000011111111111111111111111110000000000000000000000000000000001,
0b0000000000100000000000000000000000010101010000010001101011110101,
@@ -679,13 +709,15 @@ pub mod uppercase {
0b1111011111111111000000000000000000000000000000000000000000000000,
0b1111111100000000111111110000000000111111000000001111111100000000,
];
static BITSET_MAPPING: [(u8, u8); 25] = [
(0, 187), (0, 177), (0, 171), (0, 167), (0, 164), (0, 32), (0, 47), (0, 51), (0, 121),
(0, 117), (0, 109), (1, 150), (1, 148), (1, 142), (1, 134), (1, 131), (1, 64), (2, 164),
(2, 146), (2, 20), (3, 146), (3, 140), (3, 134), (4, 178), (4, 171),
static BITSET_MAPPING: [(u8, u8); 24] = [
(0, 182), (0, 74), (0, 166), (0, 162), (0, 159), (0, 150), (0, 148), (0, 142), (0, 134),
(0, 131), (0, 64), (1, 66), (1, 70), (1, 83), (1, 12), (1, 8), (2, 164), (2, 146), (2, 20),
(3, 146), (3, 140), (3, 134), (4, 178), (4, 171),
];

pub const fn lookup(c: char) -> bool {
    debug_assert!(!c.is_ascii());
    (c as u32) >= 0xc0 &&
    super::bitset_search(
        c as u32,
        &BITSET_CHUNKS_MAP,

@@ -699,8 +731,8 @@ pub mod uppercase {
#[rustfmt::skip]
pub mod white_space {
static WHITESPACE_MAP: [u8; 256] = [
2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 2, 2, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -711,6 +743,7 @@ pub mod white_space {
];
#[inline]
pub const fn lookup(c: char) -> bool {
debug_assert!(!c.is_ascii());
match c as u32 >> 8 {
0 => WHITESPACE_MAP[c as usize & 0xff] & 1 != 0,
22 => c as u32 == 0x1680,
‎src/tools/unicode-table-generator/src/cascading_map.rs‎
+1
Zeilen geändert: 1 Hinzufügung & 0 Streichungen
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -64,6 +64,7 @@ impl RawEmitter {

    writeln!(&mut self.file, "#[inline]").unwrap();
    writeln!(&mut self.file, "pub const fn lookup(c: char) -> bool {{").unwrap();
    writeln!(&mut self.file, "    debug_assert!(!c.is_ascii());").unwrap();
    writeln!(&mut self.file, "    match c as u32 >> 8 {{").unwrap();
    for arm in arms {
        writeln!(&mut self.file, "        {arm},").unwrap();

‎src/tools/unicode-table-generator/src/main.rs‎
+1
Zeilen geändert: 1 Hinzufügung & 0 Streichungen
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -195,6 +195,7 @@ fn load_data() -> UnicodeData {
.into_iter()
.flatten()
.flat_map(|cp| cp.scalar())
.filter(|c| !c.is_ascii())
.map(u32::from)
.collect::<Vec<_>>();
(prop, ranges_from_set(&codepoints))
‎src/tools/unicode-table-generator/src/raw_emitter.rs‎
+1
Zeilen geändert: 1 Hinzufügung & 0 Streichungen
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -98,6 +98,7 @@ impl RawEmitter {
self.blank_line();

    writeln!(&mut self.file, "pub const fn lookup(c: char) -> bool {{").unwrap();
    writeln!(&mut self.file, "    debug_assert!(!c.is_ascii());").unwrap();
    if first_code_point > 0x7f {
        writeln!(&mut self.file, "    (c as u32) >= {first_code_point:#04x} &&").unwrap();
    }

‎src/tools/unicode-table-generator/src/skiplist.rs‎
+2
Zeilen geändert: 2 Ergänzungen & 0 Streichungen
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -99,6 +99,7 @@ impl RawEmitter {
if first_code_point > 0x7f {
writeln!(&mut self.file, "#[inline]").unwrap();
writeln!(&mut self.file, "pub fn lookup(c: char) -> bool {{").unwrap();
writeln!(&mut self.file, " debug_assert!(!c.is_ascii());").unwrap();
writeln!(&mut self.file, " (c as u32) >= {first_code_point:#04x} && lookup_slow(c)")
.unwrap();
writeln!(&mut self.file, "}}").unwrap();
@@ -107,6 +108,7 @@ impl RawEmitter {
writeln!(&mut self.file, "fn lookup_slow(c: char) -> bool {{").unwrap();
} else {
writeln!(&mut self.file, "pub fn lookup(c: char) -> bool {{").unwrap();
writeln!(&mut self.file, " debug_assert!(!c.is_ascii());").unwrap();
}
writeln!(&mut self.file, " const {{").unwrap();
writeln!(
0 Commit Kommentare
Kommentare
0 )) ((( Rost
/
Dotemacs
Öffentlich
Code
Probleme
Pull Requests
Aktionen
Projekte
Wiki
Sicherheit
Einblicke
Commit a2eda54
Rost
Rost
Verpflichtet
on Jan 5
Verifiziert
Bedingt
Meister
1 parent
4cea8e7
commit
a2eda54
Dateibaum
Dateien filtern...
.emacs.d
elisp
custom.el
init.d
init_git.el
2 Dateien geändert
+3
-15
Linienwechsel
Suche im Code

‎.emacs.d/elisp/custom.el‎
+1
-14
Zeilen geändert: 1 Hinzufügung & 14 Streichungen
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -22,20 +22,7 @@
"7fea145741b3ca719ae45e6533ad1f49b2a43bf199d9afaee5b6135fd9e6f9b8"
"0f9a1b7a0f1d09544668297c1f04e5a5452ae1f4cf69f11b125f4cff1d54783d"
default))
'(package-selected-packages
'(adaptive-wrap alchemist anzu auto-save-buffers-enhanced copilot
docker-compose-mode dockerfile-mode elscreen
exec-path-from-shell expand-region git-gutter
go-autocomplete go-mode groovy-mode haskell-mode
highlight-indent-guides hl-todo inf-ruby json-mode
jsonnet-mode kotlin-mode lsp-mode magit multi-term
nginx-mode php-mode pinentry prettier-js
python-django python-mode rainbow-delimiters
rainbow-mode rhtml-mode rjsx-mode rspec-mode
rubocop rust-mode sass-mode scala-mode slim-mode
smartparens solarized-theme terraform-mode tide
toml-mode tree-sitter-langs treesit-auto vertico
vimrc-mode vue-mode web-mode yard-mode yasnippet))
'(package-selected-packages nil)
'(rspec-use-rake-flag nil)
'(yas-trigger-key "TAB"))
(custom-set-faces
‎.emacs.d/init.d/init_git.el‎
+2
-1
Zeilen geändert: 2 Ergänzungen & 1 Streichung
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -19,7 +19,8 @@
:ensure t
:defer t
:custom
(magit-git-executable "/opt/homebrew/bin/git"))
(magit-git-executable (cond (mac-p "/opt/homebrew/bin/git")
(t "/usr/bin/git"))))

(use-package git-gutter
:ensure t
0 Commit Kommentare
Kommentare
0 omments(48)
Dependencies(1/4)
Duplicates(3)
Blocking(0/1)
Resources(0)
Assigned
Feature Request
P3
Available
Status Update
No update yet.

Descriptionpp...@gmail.com created issue #1
Apr 29, 2014 01:39AM
Describe infrastructure request/issue:

Printing is closely tied to layout and rendering. The "print rendering engine", must convert the existing render tree into a new render tree with print styles applied. Accept the CSS-paged directives and render them in a full-compliant manner. Full CSS2 Paged Media support,
http://www.w3.org/TR/CSS21/page.html
and some CSS3-stable support,
http://www.w3.org/TR/css3-page/

Comments
All comments
tk...@chromium.orgtk...@chromium.org #2Apr 30, 2014 02:29AM
[Empty comment from Monorail migration]
da...@gmail.comda...@gmail.com #3Jul 5, 2014 03:41PM
I would also like to see this feature. This article describes nicely what would be possible with the CSS Paged Media Module if it is implemented:
http://alistapart.com/article/building-books-with-css3

I am currently writing my master thesis in HTML/CSS and I really love it. The major problem is the missing ability of styling the header and footers of Chrome printing. In my opinion the
Rost
Öffentlich
geforkt aus Rust-Lang/Rust
Code
Pull Requests
Aktionen
Projekte
Sicherheit
Einblicke
Commit beeb8e3
Bors
Bors
Verpflichtet
on 8. Sept. 2025
Auto-Merge von rust-lang#146173 - Kmeakin:km/unicode-data/no-ascii, r=jhpratt
Fügen Sie keine ASCII-Zeichen in Unicode-Tabellen hinzu

Abspaltung von Rust-Lang#145219
Hauptdarsteller(rust-lang/rust#146173)
2 parents
a09fbe2
+
a8c6694
commit
beeb8e3
Dateibaum
Dateien filtern...
Bibliothek
Alloc/SRC
str.rs
Core/SRC
char
methods.rs
Unicode
unicode_data.rs
src/tools/unicode-table-generator/src
cascading_map.rs
main.rs
raw_emitter.rs
skiplist.rs
7
+320
-247
Linienwechsel
Suche im Code

‎library/alloc/src/str.rs‎
+2
-3
Zeilen geändert: 2 Ergänzungen & 3 Streichungen
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -418,9 +418,8 @@ impl str {
}

    fn case_ignorable_then_cased<I: Iterator<Item = char>>(iter: I) -> bool {
        use core::unicode::{Case_Ignorable, Cased};
        match iter.skip_while(|&c| Case_Ignorable(c)).next() {
            Some(c) => Cased(c),
        match iter.skip_while(|&c| c.is_case_ignorable()).next() {
            Some(c) => c.is_cased(),
            None => false,
        }
    }

‎library/core/src/char/methods.rs‎
+37
-1
Linien geändert: 37 Ergänzungen & 1 Streichung
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -969,7 +969,43 @@ impl char {
#[must_use]
#[inline]
pub(crate) fn is_grapheme_extended(self) -> bool {
unicode::Grapheme_Extend(self)
!self.is_ascii() && unicode::Grapheme_Extend(self)
}
/// Returns true if this char has the Cased property.
///
/// Cased is described in Chapter 4 (Character Properties) of the [Unicode Standard] and
/// specified in the [Unicode Character Database][ucd] [DerivedCoreProperties.txt].
///
/// [Unicode Standard]: https://www.unicode.org/versions/latest/
/// [ucd]: https://www.unicode.org/reports/tr44/
/// [DerivedCoreProperties.txt]: https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt
#[must_use]
#[inline]
#[doc(hidden)]
#[unstable(feature = "char_internals", reason = "exposed only for libstd", issue = "none")]
pub fn is_cased(self) -> bool {
if self.is_ascii() { self.is_ascii_alphabetic() } else { unicode::Cased(self) }
}
/// Returns true if this char has the Case_Ignorable property.
///
/// Case_Ignorable is described in Chapter 4 (Character Properties) of the [Unicode Standard] and
/// specified in the [Unicode Character Database][ucd] [DerivedCoreProperties.txt].
///
/// [Unicode Standard]: https://www.unicode.org/versions/latest/
/// [ucd]: https://www.unicode.org/reports/tr44/
/// [DerivedCoreProperties.txt]: https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt
#[must_use]
#[inline]
#[doc(hidden)]
#[unstable(feature = "char_internals", reason = "exposed only for libstd", issue = "none")]
pub fn is_case_ignorable(self) -> bool {
if self.is_ascii() {
matches!(self, ''' | '.' | ':' | '^' | '`')
} else {
unicode::Case_Ignorable(self)
}
}

/// Returns `true` if this `char` has one of the general categories for numbers.

‎library/core/src/unicode/unicode_data.rs‎
+276
-243
Linien geändert: 276 Ergänzungen & 243 Streichungen
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -1,16 +1,15 @@
//! This file is generated by ./x run src/tools/unicode-table-generator; do not edit manually!
// Alphabetic : 1727 bytes, 142759 codepoints in 757 ranges (U+000041 - U+0323B0) using skiplist
// Case_Ignorable : 1053 bytes, 2749 codepoints in 452 ranges (U+000027 - U+0E01F0) using skiplist
// Cased : 407 bytes, 4578 codepoints in 159 ranges (U+000041 - U+01F18A) using skiplist
// Cc : 9 bytes, 65 codepoints in 2 ranges (U+000000 - U+0000A0) using skiplist
// Alphabetic : 1723 bytes, 142707 codepoints in 755 ranges (U+0000AA - U+0323B0) using skiplist
// Case_Ignorable : 1043 bytes, 2744 codepoints in 447 ranges (U+0000A8 - U+0E01F0) using skiplist
// Cased : 403 bytes, 4526 codepoints in 157 ranges (U+0000AA - U+01F18A) using skiplist
// Grapheme_Extend : 887 bytes, 2193 codepoints in 375 ranges (U+000300 - U+0E01F0) using skiplist
// Lowercase : 935 bytes, 2569 codepoints in 675 ranges (U+000061 - U+01E944) using bitset
// N : 457 bytes, 1911 codepoints in 144 ranges (U+000030 - U+01FBFA) using skiplist
// Uppercase : 799 bytes, 1978 codepoints in 656 ranges (U+000041 - U+01F18A) using bitset
// White_Space : 256 bytes, 25 codepoints in 10 ranges (U+000009 - U+003001) using cascading
// Lowercase : 933 bytes, 2543 codepoints in 674 ranges (U+0000AA - U+01E944) using bitset
// N : 455 bytes, 1901 codepoints in 143 ranges (U+0000B2 - U+01FBFA) using skiplist
// Uppercase : 797 bytes, 1952 codepoints in 655 ranges (U+0000C0 - U+01F18A) using bitset
// White_Space : 256 bytes, 19 codepoints in 8 ranges (U+000085 - U+003001) using cascading
// to_lower : 11484 bytes
// to_upper : 13432 bytes
// Total : 31446 bytes
// Total : 31413 bytes

#[inline(always)]
const fn bitset_search<
@@ -148,93 +147,100 @@ pub mod alphabetic {
use super::ShortOffsetRunHeader;

static SHORT_OFFSET_RUNS: [ShortOffsetRunHeader; 53] = [
    ShortOffsetRunHeader::new(0, 706), ShortOffsetRunHeader::new(16, 4681),
    ShortOffsetRunHeader::new(418, 5741), ShortOffsetRunHeader::new(456, 7958),
    ShortOffsetRunHeader::new(556, 9398), ShortOffsetRunHeader::new(627, 11264),
    ShortOffsetRunHeader::new(629, 12293), ShortOffsetRunHeader::new(667, 13312),
    ShortOffsetRunHeader::new(691, 19904), ShortOffsetRunHeader::new(692, 42125),
    ShortOffsetRunHeader::new(694, 42509), ShortOffsetRunHeader::new(698, 55204),
    ShortOffsetRunHeader::new(788, 63744), ShortOffsetRunHeader::new(793, 64110),
    ShortOffsetRunHeader::new(794, 64830), ShortOffsetRunHeader::new(816, 66176),
    ShortOffsetRunHeader::new(857, 67383), ShortOffsetRunHeader::new(904, 73440),
    ShortOffsetRunHeader::new(1221, 74650), ShortOffsetRunHeader::new(1232, 77712),
    ShortOffsetRunHeader::new(1237, 78896), ShortOffsetRunHeader::new(1240, 82939),
    ShortOffsetRunHeader::new(1244, 83527), ShortOffsetRunHeader::new(1246, 90368),
    ShortOffsetRunHeader::new(1247, 92160), ShortOffsetRunHeader::new(1249, 92729),
    ShortOffsetRunHeader::new(1250, 93504), ShortOffsetRunHeader::new(1265, 100344),
    ShortOffsetRunHeader::new(1282, 101590), ShortOffsetRunHeader::new(1284, 110576),
    ShortOffsetRunHeader::new(1287, 110883), ShortOffsetRunHeader::new(1294, 111356),
    ShortOffsetRunHeader::new(1304, 113664), ShortOffsetRunHeader::new(1305, 119808),
    ShortOffsetRunHeader::new(1315, 120486), ShortOffsetRunHeader::new(1352, 122624),
    ShortOffsetRunHeader::new(1375, 123536), ShortOffsetRunHeader::new(1399, 124112),
    ShortOffsetRunHeader::new(1403, 124896), ShortOffsetRunHeader::new(1409, 126464),
    ShortOffsetRunHeader::new(1425, 127280), ShortOffsetRunHeader::new(1491, 131072),
    ShortOffsetRunHeader::new(1497, 173792), ShortOffsetRunHeader::new(1498, 177978),
    ShortOffsetRunHeader::new(1500, 183970), ShortOffsetRunHeader::new(1504, 191457),
    ShortOffsetRunHeader::new(1506, 192094), ShortOffsetRunHeader::new(1508, 194560),
    ShortOffsetRunHeader::new(1509, 195102), ShortOffsetRunHeader::new(1510, 196608),
    ShortOffsetRunHeader::new(1511, 201547), ShortOffsetRunHeader::new(1512, 205744),
    ShortOffsetRunHeader::new(1514, 1319856),
    ShortOffsetRunHeader::new(0, 706), ShortOffsetRunHeader::new(12, 4681),
    ShortOffsetRunHeader::new(414, 5741), ShortOffsetRunHeader::new(452, 7958),
    ShortOffsetRunHeader::new(552, 9398), ShortOffsetRunHeader::new(623, 11264),
    ShortOffsetRunHeader::new(625, 12293), ShortOffsetRunHeader::new(663, 13312),
    ShortOffsetRunHeader::new(687, 19904), ShortOffsetRunHeader::new(688, 42125),
    ShortOffsetRunHeader::new(690, 42509), ShortOffsetRunHeader::new(694, 55204),
    ShortOffsetRunHeader::new(784, 63744), ShortOffsetRunHeader::new(789, 64110),
    ShortOffsetRunHeader::new(790, 64830), ShortOffsetRunHeader::new(812, 66176),
    ShortOffsetRunHeader::new(853, 67383), ShortOffsetRunHeader::new(900, 73440),
    ShortOffsetRunHeader::new(1217, 74650), ShortOffsetRunHeader::new(1228, 77712),
    ShortOffsetRunHeader::new(1233, 78896), ShortOffsetRunHeader::new(1236, 82939),
    ShortOffsetRunHeader::new(1240, 83527), ShortOffsetRunHeader::new(1242, 90368),
    ShortOffsetRunHeader::new(1243, 92160), ShortOffsetRunHeader::new(1245, 92729),
    ShortOffsetRunHeader::new(1246, 93504), ShortOffsetRunHeader::new(1261, 100344),
    ShortOffsetRunHeader::new(1278, 101590), ShortOffsetRunHeader::new(1280, 110576),
    ShortOffsetRunHeader::new(1283, 110883), ShortOffsetRunHeader::new(1290, 111356),
    ShortOffsetRunHeader::new(1300, 113664), ShortOffsetRunHeader::new(1301, 119808),
    ShortOffsetRunHeader::new(1311, 120486), ShortOffsetRunHeader::new(1348, 122624),
    ShortOffsetRunHeader::new(1371, 123536), ShortOffsetRunHeader::new(1395, 124112),
    ShortOffsetRunHeader::new(1399, 124896), ShortOffsetRunHeader::new(1405, 126464),
    ShortOffsetRunHeader::new(1421, 127280), ShortOffsetRunHeader::new(1487, 131072),
    ShortOffsetRunHeader::new(1493, 173792), ShortOffsetRunHeader::new(1494, 177978),
    ShortOffsetRunHeader::new(1496, 183970), ShortOffsetRunHeader::new(1500, 191457),
    ShortOffsetRunHeader::new(1502, 192094), ShortOffsetRunHeader::new(1504, 194560),
    ShortOffsetRunHeader::new(1505, 195102), ShortOffsetRunHeader::new(1506, 196608),
    ShortOffsetRunHeader::new(1507, 201547), ShortOffsetRunHeader::new(1508, 205744),
    ShortOffsetRunHeader::new(1510, 1319856),
];
static OFFSETS: [u8; 1515] = [
    65, 26, 6, 26, 47, 1, 10, 1, 4, 1, 5, 23, 1, 31, 1, 0, 4, 12, 14, 5, 7, 1, 1, 1, 86, 1, 29,
    18, 1, 2, 2, 4, 1, 1, 6, 1, 1, 3, 1, 1, 1, 20, 1, 83, 1, 139, 8, 166, 1, 38, 2, 1, 6, 41,
    39, 14, 1, 1, 1, 2, 1, 2, 1, 1, 8, 27, 4, 4, 29, 11, 5, 56, 1, 7, 14, 102, 1, 8, 4, 8, 4, 3,
    10, 3, 2, 1, 16, 48, 13, 101, 24, 33, 9, 2, 4, 1, 5, 24, 2, 19, 19, 25, 7, 11, 5, 24, 1, 6,
    8, 1, 8, 42, 10, 12, 3, 7, 6, 76, 1, 16, 1, 3, 4, 15, 13, 19, 1, 8, 2, 2, 2, 22, 1, 7, 1, 1,
    3, 4, 3, 8, 2, 2, 2, 2, 1, 1, 8, 1, 4, 2, 1, 5, 12, 2, 10, 1, 4, 3, 1, 6, 4, 2, 2, 22, 1, 7,
    1, 2, 1, 2, 1, 2, 4, 5, 4, 2, 2, 2, 4, 1, 7, 4, 1, 1, 17, 6, 11, 3, 1, 9, 1, 3, 1, 22, 1, 7,
    1, 2, 1, 5, 3, 9, 1, 3, 1, 2, 3, 1, 15, 4, 21, 4, 4, 3, 1, 8, 2, 2, 2, 22, 1, 7, 1, 2, 1, 5,
    3, 8, 2, 2, 2, 2, 9, 2, 4, 2, 1, 5, 13, 1, 16, 2, 1, 6, 3, 3, 1, 4, 3, 2, 1, 1, 1, 2, 3, 2,
    3, 3, 3, 12, 4, 5, 3, 3, 1, 3, 3, 1, 6, 1, 40, 13, 1, 3, 1, 23, 1, 16, 3, 8, 1, 3, 1, 3, 8,
    2, 1, 3, 2, 1, 2, 4, 28, 4, 1, 8, 1, 3, 1, 23, 1, 10, 1, 5, 3, 8, 1, 3, 1, 3, 8, 2, 6, 2, 1,
    4, 13, 3, 12, 13, 1, 3, 1, 41, 2, 8, 1, 3, 1, 3, 1, 1, 5, 4, 7, 5, 22, 6, 1, 3, 1, 18, 3,
    24, 1, 9, 1, 1, 2, 7, 8, 6, 1, 1, 1, 8, 18, 2, 13, 58, 5, 7, 6, 1, 51, 2, 1, 1, 1, 5, 1, 24,
    1, 1, 1, 19, 1, 3, 2, 5, 1, 1, 6, 1, 14, 4, 32, 1, 63, 8, 1, 36, 4, 19, 4, 16, 1, 36, 67,
    55, 1, 1, 2, 5, 16, 64, 10, 4, 2, 38, 1, 1, 5, 1, 2, 43, 1, 0, 1, 4, 2, 7, 1, 1, 1, 4, 2,
    41, 1, 4, 2, 33, 1, 4, 2, 7, 1, 1, 1, 4, 2, 15, 1, 57, 1, 4, 2, 67, 37, 16, 16, 86, 2, 6, 3,
    0, 2, 17, 1, 26, 5, 75, 3, 11, 7, 20, 11, 21, 12, 20, 12, 13, 1, 3, 1, 2, 12, 52, 2, 19, 14,
    1, 4, 1, 67, 89, 7, 43, 5, 70, 10, 31, 1, 12, 4, 9, 23, 30, 2, 5, 11, 44, 4, 26, 54, 28, 4,
    63, 2, 20, 50, 1, 23, 2, 11, 3, 49, 52, 1, 15, 1, 8, 51, 42, 2, 4, 10, 44, 1, 11, 14, 55,
    22, 3, 10, 36, 2, 11, 5, 43, 2, 3, 41, 4, 1, 6, 1, 2, 3, 1, 5, 192, 19, 34, 11, 0, 2, 6, 2,
    38, 2, 6, 2, 8, 1, 1, 1, 1, 1, 1, 1, 31, 2, 53, 1, 7, 1, 1, 3, 3, 1, 7, 3, 4, 2, 6, 4, 13,
    5, 3, 1, 7, 116, 1, 13, 1, 16, 13, 101, 1, 4, 1, 2, 10, 1, 1, 3, 5, 6, 1, 1, 1, 1, 1, 1, 4,
    1, 11, 2, 4, 5, 5, 4, 1, 17, 41, 0, 52, 0, 229, 6, 4, 3, 2, 12, 38, 1, 1, 5, 1, 2, 56, 7, 1,
    16, 23, 9, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 32, 47, 1, 0, 3, 25, 9, 7, 5, 2,
    5, 4, 86, 6, 3, 1, 90, 1, 4, 5, 43, 1, 94, 17, 32, 48, 16, 0, 0, 64, 0, 67, 46, 2, 0, 3, 16,
    10, 2, 20, 47, 5, 8, 3, 113, 39, 9, 2, 103, 2, 67, 2, 2, 1, 1, 1, 8, 21, 20, 1, 33, 24, 52,
    12, 68, 1, 1, 44, 6, 3, 1, 1, 3, 10, 33, 5, 35, 13, 29, 3, 51, 1, 12, 15, 1, 16, 16, 10, 5,
    1, 55, 9, 14, 18, 23, 3, 69, 1, 1, 1, 1, 24, 3, 2, 16, 2, 4, 11, 6, 2, 6, 2, 6, 9, 7, 1, 7,
    1, 43, 1, 14, 6, 123, 21, 0, 12, 23, 4, 49, 0, 0, 2, 106, 38, 7, 12, 5, 5, 12, 1, 13, 1, 5,
    1, 1, 1, 2, 1, 2, 1, 108, 33, 0, 18, 64, 2, 54, 40, 12, 116, 5, 1, 135, 36, 26, 6, 26, 11,
    89, 3, 6, 2, 6, 2, 6, 2, 3, 35, 12, 1, 26, 1, 19, 1, 2, 1, 15, 2, 14, 34, 123, 69, 53, 0,
    29, 3, 49, 47, 32, 13, 30, 5, 43, 5, 30, 2, 36, 4, 8, 1, 5, 42, 158, 18, 36, 4, 36, 4, 40,
    8, 52, 12, 11, 1, 15, 1, 7, 1, 2, 1, 11, 1, 15, 1, 7, 1, 2, 3, 52, 12, 0, 9, 22, 10, 8, 24,
    6, 1, 42, 1, 9, 69, 6, 2, 1, 1, 44, 1, 2, 3, 1, 2, 23, 10, 23, 9, 31, 65, 19, 1, 2, 10, 22,
    10, 26, 70, 56, 6, 2, 64, 4, 1, 2, 5, 8, 1, 3, 1, 29, 42, 29, 3, 29, 35, 8, 1, 28, 27, 54,
    10, 22, 10, 19, 13, 18, 110, 73, 55, 51, 13, 51, 13, 40, 34, 28, 3, 1, 5, 23, 250, 42, 1, 2,
    3, 2, 16, 3, 55, 1, 3, 29, 10, 1, 8, 22, 42, 18, 46, 21, 27, 23, 9, 70, 43, 5, 10, 57, 9, 1,
    13, 25, 23, 51, 17, 4, 8, 35, 3, 1, 9, 64, 1, 4, 9, 2, 10, 1, 1, 1, 35, 18, 1, 34, 2, 1, 6,
    4, 62, 7, 1, 1, 1, 4, 1, 15, 1, 10, 7, 57, 23, 4, 1, 8, 2, 2, 2, 22, 1, 7, 1, 2, 1, 5, 3, 8,
    2, 2, 2, 2, 3, 1, 6, 1, 5, 7, 28, 10, 1, 1, 2, 1, 1, 38, 1, 10, 1, 1, 2, 1, 1, 4, 1, 2, 3,
    1, 1, 1, 44, 66, 1, 3, 1, 4, 20, 3, 30, 66, 2, 2, 1, 1, 184, 54, 2, 7, 25, 6, 34, 63, 1, 1,
    3, 1, 59, 54, 2, 1, 71, 27, 2, 14, 21, 7, 185, 57, 103, 64, 31, 8, 2, 1, 2, 8, 1, 2, 1, 30,
    1, 2, 2, 2, 2, 4, 93, 8, 2, 46, 2, 6, 1, 1, 1, 2, 27, 51, 2, 10, 17, 72, 5, 1, 18, 73, 199,
    33, 31, 9, 1, 45, 1, 7, 1, 1, 49, 30, 2, 22, 1, 14, 73, 7, 1, 2, 1, 44, 3, 1, 1, 2, 1, 3, 1,
    1, 2, 2, 24, 6, 1, 2, 1, 37, 1, 2, 1, 4, 1, 1, 0, 23, 9, 17, 1, 41, 3, 3, 111, 1, 79, 0,
    102, 111, 17, 196, 0, 97, 15, 0, 17, 6, 25, 0, 5, 0, 0, 47, 0, 0, 7, 31, 17, 79, 17, 30, 18,
    48, 16, 4, 31, 21, 5, 19, 0, 45, 211, 64, 128, 75, 4, 57, 7, 17, 64, 2, 1, 1, 12, 2, 14, 0,
    8, 0, 41, 10, 0, 4, 1, 7, 1, 2, 1, 0, 15, 1, 29, 3, 2, 1, 14, 4, 8, 0, 0, 107, 5, 13, 3, 9,
    7, 10, 4, 1, 0, 85, 1, 71, 1, 2, 2, 1, 2, 2, 2, 4, 1, 12, 1, 1, 1, 7, 1, 65, 1, 4, 2, 8, 1,
    7, 1, 28, 1, 4, 1, 5, 1, 1, 3, 7, 1, 0, 2, 25, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 31, 1,
    25, 1, 31, 1, 25, 1, 8, 0, 31, 6, 6, 213, 7, 1, 17, 2, 7, 1, 2, 1, 5, 5, 62, 33, 1, 112, 45,
    10, 7, 16, 1, 0, 30, 18, 44, 0, 28, 228, 30, 2, 1, 0, 7, 1, 4, 1, 2, 1, 15, 1, 197, 59, 68,
    3, 1, 3, 1, 0, 4, 1, 27, 1, 2, 1, 1, 2, 1, 1, 10, 1, 4, 1, 1, 1, 1, 6, 1, 4, 1, 1, 1, 1, 1,
    1, 3, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 4, 1, 7, 1, 4, 1, 4, 1, 1, 1,
    10, 1, 17, 5, 3, 1, 5, 1, 17, 0, 26, 6, 26, 6, 26, 0, 0, 32, 0, 6, 222, 2, 0, 14, 0, 15, 0,
    0, 0, 0, 0, 5, 0, 0,
static OFFSETS: [u8; 1511] = [
    170, 1, 10, 1, 4, 1, 5, 23, 1, 31, 1, 0, 4, 12, 14, 5, 7, 1, 1, 1, 86, 1, 29, 18, 1, 2, 2,
    4, 1, 1, 6, 1, 1, 3, 1, 1, 1, 20, 1, 83, 1, 139, 8, 166, 1, 38, 2, 1, 6, 41, 39, 14, 1, 1,
    1, 2, 1, 2, 1, 1, 8, 27, 4, 4, 29, 11, 5, 56, 1, 7, 14, 102, 1, 8, 4, 8, 4, 3, 10, 3, 2, 1,
    16, 48, 13, 101, 24, 33, 9, 2, 4, 1, 5, 24, 2, 19, 19, 25, 7, 11, 5, 24, 1, 6, 8, 1, 8, 42,
    10, 12, 3, 7, 6, 76, 1, 16, 1, 3, 4, 15, 13, 19, 1, 8, 2, 2, 2, 22, 1, 7, 1, 1, 3, 4, 3, 8,
    2, 2, 2, 2, 1, 1, 8, 1, 4, 2, 1, 5, 12, 2, 10, 1, 4, 3, 1, 6, 4, 2, 2, 22, 1, 7, 1, 2, 1, 2,
    1, 2, 4, 5, 4, 2, 2, 2, 4, 1, 7, 4, 1, 1, 17, 6, 11, 3, 1, 9, 1, 3, 1, 22, 1, 7, 1, 2, 1, 5,
    3, 9, 1, 3, 1, 2, 3, 1, 15, 4, 21, 4, 4, 3, 1, 8, 2, 2, 2, 22, 1, 7, 1, 2, 1, 5, 3, 8, 2, 2,
    2, 2, 9, 2, 4, 2, 1, 5, 13, 1, 16, 2, 1, 6, 3, 3, 1, 4, 3, 2, 1, 1, 1, 2, 3, 2, 3, 3, 3, 12,
    4, 5, 3, 3, 1, 3, 3, 1, 6, 1, 40, 13, 1, 3, 1, 23, 1, 16, 3, 8, 1, 3, 1, 3, 8, 2, 1, 3, 2,
    1, 2, 4, 28, 4, 1, 8, 1, 3, 1, 23, 1, 10, 1, 5, 3, 8, 1, 3, 1, 3, 8, 2, 6, 2, 1, 4, 13, 3,
    12, 13, 1, 3, 1, 41, 2, 8, 1, 3, 1, 3, 1, 1, 5, 4, 7, 5, 22, 6, 1, 3, 1, 18, 3, 24, 1, 9, 1,
    1, 2, 7, 8, 6, 1, 1, 1, 8, 18, 2, 13, 58, 5, 7, 6, 1, 51, 2, 1, 1, 1, 5, 1, 24, 1, 1, 1, 19,
    1, 3, 2, 5, 1, 1, 6, 1, 14, 4, 32, 1, 63, 8, 1, 36, 4, 19, 4, 16, 1, 36, 67, 55, 1, 1, 2, 5,
    16, 64, 10, 4, 2, 38, 1, 1, 5, 1, 2, 43, 1, 0, 1, 4, 2, 7, 1, 1, 1, 4, 2, 41, 1, 4, 2, 33,
    1, 4, 2, 7, 1, 1, 1, 4, 2, 15, 1, 57, 1, 4, 2, 67, 37, 16, 16, 86, 2, 6, 3, 0, 2, 17, 1, 26,
    5, 75, 3, 11, 7, 20, 11, 21, 12, 20, 12, 13, 1, 3, 1, 2, 12, 52, 2, 19, 14, 1, 4, 1, 67, 89,
    7, 43, 5, 70, 10, 31, 1, 12, 4, 9, 23, 30, 2, 5, 11, 44, 4, 26, 54, 28, 4, 63, 2, 20, 50, 1,
    23, 2, 11, 3, 49, 52, 1, 15, 1, 8, 51, 42, 2, 4, 10, 44, 1, 11, 14, 55, 22, 3, 10, 36, 2,
    11, 5, 43, 2, 3, 41, 4, 1, 6, 1, 2, 3, 1, 5, 192, 19, 34, 11, 0, 2, 6, 2, 38, 2, 6, 2, 8, 1,
    1, 1, 1, 1, 1, 1, 31, 2, 53, 1, 7, 1, 1, 3, 3, 1, 7, 3, 4, 2, 6, 4, 13, 5, 3, 1, 7, 116, 1,
    13, 1, 16, 13, 101, 1, 4, 1, 2, 10, 1, 1, 3, 5, 6, 1, 1, 1, 1, 1, 1, 4, 1, 11, 2, 4, 5, 5,
    4, 1, 17, 41, 0, 52, 0, 229, 6, 4, 3, 2, 12, 38, 1, 1, 5, 1, 2, 56, 7, 1, 16, 23, 9, 7, 1,
    7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 32, 47, 1, 0, 3, 25, 9, 7, 5, 2, 5, 4, 86, 6, 3,
    1, 90, 1, 4, 5, 43, 1, 94, 17, 32, 48, 16, 0, 0, 64, 0, 67, 46, 2, 0, 3, 16, 10, 2, 20, 47,
    5, 8, 3, 113, 39, 9, 2, 103, 2, 67, 2, 2, 1, 1, 1, 8, 21, 20, 1, 33, 24, 52, 12, 68, 1, 1,
    44, 6, 3, 1, 1, 3, 10, 33, 5, 35, 13, 29, 3, 51, 1, 12, 15, 1, 16, 16, 10, 5, 1, 55, 9, 14,
    18, 23, 3, 69, 1, 1, 1, 1, 24, 3, 2, 16, 2, 4, 11, 6, 2, 6, 2, 6, 9, 7, 1, 7, 1, 43, 1, 14,
    6, 123, 21, 0, 12, 23, 4, 49, 0, 0, 2, 106, 38, 7, 12, 5, 5, 12, 1, 13, 1, 5, 1, 1, 1, 2, 1,
    2, 1, 108, 33, 0, 18, 64, 2, 54, 40, 12, 116, 5, 1, 135, 36, 26, 6, 26, 11, 89, 3, 6, 2, 6,
    2, 6, 2, 3, 35, 12, 1, 26, 1, 19, 1, 2, 1, 15, 2, 14, 34, 123, 69, 53, 0, 29, 3, 49, 47, 32,
    13, 30, 5, 43, 5, 30, 2, 36, 4, 8, 1, 5, 42, 158, 18, 36, 4, 36, 4, 40, 8, 52, 12, 11, 1,
    15, 1, 7, 1, 2, 1, 11, 1, 15, 1, 7, 1, 2, 3, 52, 12, 0, 9, 22, 10, 8, 24, 6, 1, 42, 1, 9,
    69, 6, 2, 1, 1, 44, 1, 2, 3, 1, 2, 23, 10, 23, 9, 31, 65, 19, 1, 2, 10, 22, 10, 26, 70, 56,
    6, 2, 64, 4, 1, 2, 5, 8, 1, 3, 1, 29, 42, 29, 3, 29, 35, 8, 1, 28, 27, 54, 10, 22, 10, 19,
    13, 18, 110, 73, 55, 51, 13, 51, 13, 40, 34, 28, 3, 1, 5, 23, 250, 42, 1, 2, 3, 2, 16, 3,
    55, 1, 3, 29, 10, 1, 8, 22, 42, 18, 46, 21, 27, 23, 9, 70, 43, 5, 10, 57, 9, 1, 13, 25, 23,
    51, 17, 4, 8, 35, 3, 1, 9, 64, 1, 4, 9, 2, 10, 1, 1, 1, 35, 18, 1, 34, 2, 1, 6, 4, 62, 7, 1,
    1, 1, 4, 1, 15, 1, 10, 7, 57, 23, 4, 1, 8, 2, 2, 2, 22, 1, 7, 1, 2, 1, 5, 3, 8, 2, 2, 2, 2,
    3, 1, 6, 1, 5, 7, 28, 10, 1, 1, 2, 1, 1, 38, 1, 10, 1, 1, 2, 1, 1, 4, 1, 2, 3, 1, 1, 1, 44,
    66, 1, 3, 1, 4, 20, 3, 30, 66, 2, 2, 1, 1, 184, 54, 2, 7, 25, 6, 34, 63, 1, 1, 3, 1, 59, 54,
    2, 1, 71, 27, 2, 14, 21, 7, 185, 57, 103, 64, 31, 8, 2, 1, 2, 8, 1, 2, 1, 30, 1, 2, 2, 2, 2,
    4, 93, 8, 2, 46, 2, 6, 1, 1, 1, 2, 27, 51, 2, 10, 17, 72, 5, 1, 18, 73, 199, 33, 31, 9, 1,
    45, 1, 7, 1, 1, 49, 30, 2, 22, 1, 14, 73, 7, 1, 2, 1, 44, 3, 1, 1, 2, 1, 3, 1, 1, 2, 2, 24,
    6, 1, 2, 1, 37, 1, 2, 1, 4, 1, 1, 0, 23, 9, 17, 1, 41, 3, 3, 111, 1, 79, 0, 102, 111, 17,
    196, 0, 97, 15, 0, 17, 6, 25, 0, 5, 0, 0, 47, 0, 0, 7, 31, 17, 79, 17, 30, 18, 48, 16, 4,
    31, 21, 5, 19, 0, 45, 211, 64, 128, 75, 4, 57, 7, 17, 64, 2, 1, 1, 12, 2, 14, 0, 8, 0, 41,
    10, 0, 4, 1, 7, 1, 2, 1, 0, 15, 1, 29, 3, 2, 1, 14, 4, 8, 0, 0, 107, 5, 13, 3, 9, 7, 10, 4,
    1, 0, 85, 1, 71, 1, 2, 2, 1, 2, 2, 2, 4, 1, 12, 1, 1, 1, 7, 1, 65, 1, 4, 2, 8, 1, 7, 1, 28,
    1, 4, 1, 5, 1, 1, 3, 7, 1, 0, 2, 25, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 31,
    1, 25, 1, 8, 0, 31, 6, 6, 213, 7, 1, 17, 2, 7, 1, 2, 1, 5, 5, 62, 33, 1, 112, 45, 10, 7, 16,
    1, 0, 30, 18, 44, 0, 28, 228, 30, 2, 1, 0, 7, 1, 4, 1, 2, 1, 15, 1, 197, 59, 68, 3, 1, 3, 1,
    0, 4, 1, 27, 1, 2, 1, 1, 2, 1, 1, 10, 1, 4, 1, 1, 1, 1, 6, 1, 4, 1, 1, 1, 1, 1, 1, 3, 1, 2,
    1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 4, 1, 7, 1, 4, 1, 4, 1, 1, 1, 10, 1, 17,
    5, 3, 1, 5, 1, 17, 0, 26, 6, 26, 6, 26, 0, 0, 32, 0, 6, 222, 2, 0, 14, 0, 15, 0, 0, 0, 0, 0,
    5, 0, 0,
];
#[inline]
pub fn lookup(c: char) -> bool {
    debug_assert!(!c.is_ascii());
    (c as u32) >= 0xaa && lookup_slow(c)
}
#[inline(never)]
fn lookup_slow(c: char) -> bool {
    const {
        assert!(SHORT_OFFSET_RUNS.last().unwrap().0 > char::MAX as u32);
        let mut i = 0;

@@ -254,62 +260,69 @@ pub mod case_ignorable {
use super::ShortOffsetRunHeader;

static SHORT_OFFSET_RUNS: [ShortOffsetRunHeader; 37] = [
    ShortOffsetRunHeader::new(0, 688), ShortOffsetRunHeader::new(21, 4957),
    ShortOffsetRunHeader::new(273, 5906), ShortOffsetRunHeader::new(275, 8125),
    ShortOffsetRunHeader::new(385, 11388), ShortOffsetRunHeader::new(419, 12293),
    ShortOffsetRunHeader::new(431, 40981), ShortOffsetRunHeader::new(443, 42232),
    ShortOffsetRunHeader::new(445, 42508), ShortOffsetRunHeader::new(447, 64286),
    ShortOffsetRunHeader::new(543, 65024), ShortOffsetRunHeader::new(547, 66045),
    ShortOffsetRunHeader::new(577, 67456), ShortOffsetRunHeader::new(583, 68097),
    ShortOffsetRunHeader::new(589, 68900), ShortOffsetRunHeader::new(601, 69291),
    ShortOffsetRunHeader::new(609, 71727), ShortOffsetRunHeader::new(733, 71995),
    ShortOffsetRunHeader::new(737, 72752), ShortOffsetRunHeader::new(765, 73459),
    ShortOffsetRunHeader::new(795, 78896), ShortOffsetRunHeader::new(807, 90398),
    ShortOffsetRunHeader::new(811, 92912), ShortOffsetRunHeader::new(815, 93504),
    ShortOffsetRunHeader::new(821, 94031), ShortOffsetRunHeader::new(825, 110576),
    ShortOffsetRunHeader::new(833, 113821), ShortOffsetRunHeader::new(839, 118528),
    ShortOffsetRunHeader::new(843, 119143), ShortOffsetRunHeader::new(847, 121344),
    ShortOffsetRunHeader::new(857, 122880), ShortOffsetRunHeader::new(869, 123566),
    ShortOffsetRunHeader::new(885, 124139), ShortOffsetRunHeader::new(889, 125136),
    ShortOffsetRunHeader::new(893, 127995), ShortOffsetRunHeader::new(897, 917505),
    ShortOffsetRunHeader::new(899, 2032112),
    ShortOffsetRunHeader::new(0, 688), ShortOffsetRunHeader::new(11, 4957),
    ShortOffsetRunHeader::new(263, 5906), ShortOffsetRunHeader::new(265, 8125),
    ShortOffsetRunHeader::new(375, 11388), ShortOffsetRunHeader::new(409, 12293),
    ShortOffsetRunHeader::new(421, 40981), ShortOffsetRunHeader::new(433, 42232),
    ShortOffsetRunHeader::new(435, 42508), ShortOffsetRunHeader::new(437, 64286),
    ShortOffsetRunHeader::new(533, 65024), ShortOffsetRunHeader::new(537, 66045),
    ShortOffsetRunHeader::new(567, 67456), ShortOffsetRunHeader::new(573, 68097),
    ShortOffsetRunHeader::new(579, 68900), ShortOffsetRunHeader::new(591, 69291),
    ShortOffsetRunHeader::new(599, 71727), ShortOffsetRunHeader::new(723, 71995),
    ShortOffsetRunHeader::new(727, 72752), ShortOffsetRunHeader::new(755, 73459),
    ShortOffsetRunHeader::new(785, 78896), ShortOffsetRunHeader::new(797, 90398),
    ShortOffsetRunHeader::new(801, 92912), ShortOffsetRunHeader::new(805, 93504),
    ShortOffsetRunHeader::new(811, 94031), ShortOffsetRunHeader::new(815, 110576),
    ShortOffsetRunHeader::new(823, 113821), ShortOffsetRunHeader::new(829, 118528),
    ShortOffsetRunHeader::new(833, 119143), ShortOffsetRunHeader::new(837, 121344),
    ShortOffsetRunHeader::new(847, 122880), ShortOffsetRunHeader::new(859, 123566),
    ShortOffsetRunHeader::new(875, 124139), ShortOffsetRunHeader::new(879, 125136),
    ShortOffsetRunHeader::new(883, 127995), ShortOffsetRunHeader::new(887, 917505),
    ShortOffsetRunHeader::new(889, 2032112),
];
static OFFSETS: [u8; 905] = [
    39, 1, 6, 1, 11, 1, 35, 1, 1, 1, 71, 1, 4, 1, 1, 1, 4, 1, 2, 2, 0, 192, 4, 2, 4, 1, 9, 2,
    1, 1, 251, 7, 207, 1, 5, 1, 49, 45, 1, 1, 1, 2, 1, 2, 1, 1, 44, 1, 11, 6, 10, 11, 1, 1, 35,
    1, 10, 21, 16, 1, 101, 8, 1, 10, 1, 4, 33, 1, 1, 1, 30, 27, 91, 11, 58, 11, 4, 1, 2, 1, 24,
    24, 43, 3, 44, 1, 7, 2, 5, 9, 41, 58, 55, 1, 1, 1, 4, 8, 4, 1, 3, 7, 10, 2, 13, 1, 15, 1,
    58, 1, 4, 4, 8, 1, 20, 2, 26, 1, 2, 2, 57, 1, 4, 2, 4, 2, 2, 3, 3, 1, 30, 2, 3, 1, 11, 2,
    57, 1, 4, 5, 1, 2, 4, 1, 20, 2, 22, 6, 1, 1, 58, 1, 2, 1, 1, 4, 8, 1, 7, 2, 11, 2, 30, 1,
    61, 1, 12, 1, 50, 1, 3, 1, 55, 1, 1, 3, 5, 3, 1, 4, 7, 2, 11, 2, 29, 1, 58, 1, 2, 1, 6, 1,
    5, 2, 20, 2, 28, 2, 57, 2, 4, 4, 8, 1, 20, 2, 29, 1, 72, 1, 7, 3, 1, 1, 90, 1, 2, 7, 11, 9,
    98, 1, 2, 9, 9, 1, 1, 7, 73, 2, 27, 1, 1, 1, 1, 1, 55, 14, 1, 5, 1, 2, 5, 11, 1, 36, 9, 1,
    102, 4, 1, 6, 1, 2, 2, 2, 25, 2, 4, 3, 16, 4, 13, 1, 2, 2, 6, 1, 15, 1, 94, 1, 0, 3, 0, 3,
    29, 2, 30, 2, 30, 2, 64, 2, 1, 7, 8, 1, 2, 11, 3, 1, 5, 1, 45, 5, 51, 1, 65, 2, 34, 1, 118,
    3, 4, 2, 9, 1, 6, 3, 219, 2, 2, 1, 58, 1, 1, 7, 1, 1, 1, 1, 2, 8, 6, 10, 2, 1, 39, 1, 8, 31,
    49, 4, 48, 1, 1, 5, 1, 1, 5, 1, 40, 9, 12, 2, 32, 4, 2, 2, 1, 3, 56, 1, 1, 2, 3, 1, 1, 3,
    58, 8, 2, 2, 64, 6, 82, 3, 1, 13, 1, 7, 4, 1, 6, 1, 3, 2, 50, 63, 13, 1, 34, 101, 0, 1, 1,
    3, 11, 3, 13, 3, 13, 3, 13, 2, 12, 5, 8, 2, 10, 1, 2, 1, 2, 5, 49, 5, 1, 10, 1, 1, 13, 1,
    16, 13, 51, 33, 0, 2, 113, 3, 125, 1, 15, 1, 96, 32, 47, 1, 0, 1, 36, 4, 3, 5, 5, 1, 93, 6,
    93, 3, 0, 1, 0, 6, 0, 1, 98, 4, 1, 10, 1, 1, 28, 4, 80, 2, 14, 34, 78, 1, 23, 3, 103, 3, 3,
    2, 8, 1, 3, 1, 4, 1, 25, 2, 5, 1, 151, 2, 26, 18, 13, 1, 38, 8, 25, 11, 46, 3, 48, 1, 2, 4,
    2, 2, 17, 1, 21, 2, 66, 6, 2, 2, 2, 2, 12, 1, 8, 1, 35, 1, 11, 1, 51, 1, 1, 3, 2, 2, 5, 2,
    1, 1, 27, 1, 14, 2, 5, 2, 1, 1, 100, 5, 9, 3, 121, 1, 2, 1, 4, 1, 0, 1, 147, 17, 0, 16, 3,
    1, 12, 16, 34, 1, 2, 1, 169, 1, 7, 1, 6, 1, 11, 1, 35, 1, 1, 1, 47, 1, 45, 2, 67, 1, 21, 3,
    0, 1, 226, 1, 149, 5, 0, 6, 1, 42, 1, 9, 0, 3, 1, 2, 5, 4, 40, 3, 4, 1, 165, 2, 0, 4, 38, 1,
    26, 5, 1, 1, 0, 2, 79, 4, 70, 11, 49, 4, 123, 1, 54, 15, 41, 1, 2, 2, 10, 3, 49, 4, 2, 2, 2,
    1, 4, 1, 10, 1, 50, 3, 36, 5, 1, 8, 62, 1, 12, 2, 52, 9, 10, 4, 2, 1, 95, 3, 2, 1, 1, 2, 6,
    1, 2, 1, 157, 1, 3, 8, 21, 2, 57, 2, 3, 1, 37, 7, 3, 5, 70, 6, 13, 1, 1, 1, 1, 1, 14, 2, 85,
    8, 2, 3, 1, 1, 23, 1, 84, 6, 1, 1, 4, 2, 1, 2, 238, 4, 6, 2, 1, 2, 27, 2, 85, 8, 2, 1, 1, 2,
    106, 1, 1, 1, 2, 6, 1, 1, 101, 1, 1, 1, 2, 4, 1, 5, 0, 9, 1, 2, 0, 2, 1, 1, 4, 1, 144, 4, 2,
    2, 4, 1, 32, 10, 40, 6, 2, 4, 8, 1, 9, 6, 2, 3, 46, 13, 1, 2, 0, 7, 1, 6, 1, 1, 82, 22, 2,
    7, 1, 2, 1, 2, 122, 6, 3, 1, 1, 2, 1, 7, 1, 1, 72, 2, 3, 1, 1, 1, 0, 2, 11, 2, 52, 5, 5, 1,
    1, 1, 23, 1, 0, 17, 6, 15, 0, 12, 3, 3, 0, 5, 59, 7, 9, 4, 0, 3, 40, 2, 0, 1, 63, 17, 64, 2,
    1, 2, 0, 4, 1, 7, 1, 2, 0, 2, 1, 4, 0, 46, 2, 23, 0, 3, 9, 16, 2, 7, 30, 4, 148, 3, 0, 55,
    4, 50, 8, 1, 14, 1, 22, 5, 1, 15, 0, 7, 1, 17, 2, 7, 1, 2, 1, 5, 5, 62, 33, 1, 160, 14, 0,
    1, 61, 4, 0, 5, 254, 2, 0, 7, 109, 8, 0, 5, 0, 1, 30, 96, 128, 240, 0,
static OFFSETS: [u8; 895] = [
    168, 1, 4, 1, 1, 1, 4, 1, 2, 2, 0, 192, 4, 2, 4, 1, 9, 2, 1, 1, 251, 7, 207, 1, 5, 1, 49,
    45, 1, 1, 1, 2, 1, 2, 1, 1, 44, 1, 11, 6, 10, 11, 1, 1, 35, 1, 10, 21, 16, 1, 101, 8, 1, 10,
    1, 4, 33, 1, 1, 1, 30, 27, 91, 11, 58, 11, 4, 1, 2, 1, 24, 24, 43, 3, 44, 1, 7, 2, 5, 9, 41,
    58, 55, 1, 1, 1, 4, 8, 4, 1, 3, 7, 10, 2, 13, 1, 15, 1, 58, 1, 4, 4, 8, 1, 20, 2, 26, 1, 2,
    2, 57, 1, 4, 2, 4, 2, 2, 3, 3, 1, 30, 2, 3, 1, 11, 2, 57, 1, 4, 5, 1, 2, 4, 1, 20, 2, 22, 6,
    1, 1, 58, 1, 2, 1, 1, 4, 8, 1, 7, 2, 11, 2, 30, 1, 61, 1, 12, 1, 50, 1, 3, 1, 55, 1, 1, 3,
    5, 3, 1, 4, 7, 2, 11, 2, 29, 1, 58, 1, 2, 1, 6, 1, 5, 2, 20, 2, 28, 2, 57, 2, 4, 4, 8, 1,
    20, 2, 29, 1, 72, 1, 7, 3, 1, 1, 90, 1, 2, 7, 11, 9, 98, 1, 2, 9, 9, 1, 1, 7, 73, 2, 27, 1,
    1, 1, 1, 1, 55, 14, 1, 5, 1, 2, 5, 11, 1, 36, 9, 1, 102, 4, 1, 6, 1, 2, 2, 2, 25, 2, 4, 3,
    16, 4, 13, 1, 2, 2, 6, 1, 15, 1, 94, 1, 0, 3, 0, 3, 29, 2, 30, 2, 30, 2, 64, 2, 1, 7, 8, 1,
    2, 11, 3, 1, 5, 1, 45, 5, 51, 1, 65, 2, 34, 1, 118, 3, 4, 2, 9, 1, 6, 3, 219, 2, 2, 1, 58,
    1, 1, 7, 1, 1, 1, 1, 2, 8, 6, 10, 2, 1, 39, 1, 8, 31, 49, 4, 48, 1, 1, 5, 1, 1, 5, 1, 40, 9,
    12, 2, 32, 4, 2, 2, 1, 3, 56, 1, 1, 2, 3, 1, 1, 3, 58, 8, 2, 2, 64, 6, 82, 3, 1, 13, 1, 7,
    4, 1, 6, 1, 3, 2, 50, 63, 13, 1, 34, 101, 0, 1, 1, 3, 11, 3, 13, 3, 13, 3, 13, 2, 12, 5, 8,
    2, 10, 1, 2, 1, 2, 5, 49, 5, 1, 10, 1, 1, 13, 1, 16, 13, 51, 33, 0, 2, 113, 3, 125, 1, 15,
    1, 96, 32, 47, 1, 0, 1, 36, 4, 3, 5, 5, 1, 93, 6, 93, 3, 0, 1, 0, 6, 0, 1, 98, 4, 1, 10, 1,
    1, 28, 4, 80, 2, 14, 34, 78, 1, 23, 3, 103, 3, 3, 2, 8, 1, 3, 1, 4, 1, 25, 2, 5, 1, 151, 2,
    26, 18, 13, 1, 38, 8, 25, 11, 46, 3, 48, 1, 2, 4, 2, 2, 17, 1, 21, 2, 66, 6, 2, 2, 2, 2, 12,
    1, 8, 1, 35, 1, 11, 1, 51, 1, 1, 3, 2, 2, 5, 2, 1, 1, 27, 1, 14, 2, 5, 2, 1, 1, 100, 5, 9,
    3, 121, 1, 2, 1, 4, 1, 0, 1, 147, 17, 0, 16, 3, 1, 12, 16, 34, 1, 2, 1, 169, 1, 7, 1, 6, 1,
    11, 1, 35, 1, 1, 1, 47, 1, 45, 2, 67, 1, 21, 3, 0, 1, 226, 1, 149, 5, 0, 6, 1, 42, 1, 9, 0,
    3, 1, 2, 5, 4, 40, 3, 4, 1, 165, 2, 0, 4, 38, 1, 26, 5, 1, 1, 0, 2, 79, 4, 70, 11, 49, 4,
    123, 1, 54, 15, 41, 1, 2, 2, 10, 3, 49, 4, 2, 2, 2, 1, 4, 1, 10, 1, 50, 3, 36, 5, 1, 8, 62,
    1, 12, 2, 52, 9, 10, 4, 2, 1, 95, 3, 2, 1, 1, 2, 6, 1, 2, 1, 157, 1, 3, 8, 21, 2, 57, 2, 3,
    1, 37, 7, 3, 5, 70, 6, 13, 1, 1, 1, 1, 1, 14, 2, 85, 8, 2, 3, 1, 1, 23, 1, 84, 6, 1, 1, 4,
    2, 1, 2, 238, 4, 6, 2, 1, 2, 27, 2, 85, 8, 2, 1, 1, 2, 106, 1, 1, 1, 2, 6, 1, 1, 101, 1, 1,
    1, 2, 4, 1, 5, 0, 9, 1, 2, 0, 2, 1, 1, 4, 1, 144, 4, 2, 2, 4, 1, 32, 10, 40, 6, 2, 4, 8, 1,
    9, 6, 2, 3, 46, 13, 1, 2, 0, 7, 1, 6, 1, 1, 82, 22, 2, 7, 1, 2, 1, 2, 122, 6, 3, 1, 1, 2, 1,
    7, 1, 1, 72, 2, 3, 1, 1, 1, 0, 2, 11, 2, 52, 5, 5, 1, 1, 1, 23, 1, 0, 17, 6, 15, 0, 12, 3,
    3, 0, 5, 59, 7, 9, 4, 0, 3, 40, 2, 0, 1, 63, 17, 64, 2, 1, 2, 0, 4, 1, 7, 1, 2, 0, 2, 1, 4,
    0, 46, 2, 23, 0, 3, 9, 16, 2, 7, 30, 4, 148, 3, 0, 55, 4, 50, 8, 1, 14, 1, 22, 5, 1, 15, 0,
    7, 1, 17, 2, 7, 1, 2, 1, 5, 5, 62, 33, 1, 160, 14, 0, 1, 61, 4, 0, 5, 254, 2, 0, 7, 109, 8,
    0, 5, 0, 1, 30, 96, 128, 240, 0,
];
#[inline]
pub fn lookup(c: char) -> bool {
    debug_assert!(!c.is_ascii());
    (c as u32) >= 0xa8 && lookup_slow(c)
}
#[inline(never)]
fn lookup_slow(c: char) -> bool {
    const {
        assert!(SHORT_OFFSET_RUNS.last().unwrap().0 > char::MAX as u32);
        let mut i = 0;

@@ -329,33 +342,40 @@ pub mod cased {
use super::ShortOffsetRunHeader;

static SHORT_OFFSET_RUNS: [ShortOffsetRunHeader; 22] = [
    ShortOffsetRunHeader::new(0, 4256), ShortOffsetRunHeader::new(55, 5024),
    ShortOffsetRunHeader::new(65, 7296), ShortOffsetRunHeader::new(69, 7958),
    ShortOffsetRunHeader::new(78, 9398), ShortOffsetRunHeader::new(153, 11264),
    ShortOffsetRunHeader::new(155, 42560), ShortOffsetRunHeader::new(167, 43824),
    ShortOffsetRunHeader::new(187, 64256), ShortOffsetRunHeader::new(193, 65313),
    ShortOffsetRunHeader::new(197, 66560), ShortOffsetRunHeader::new(201, 67456),
    ShortOffsetRunHeader::new(223, 68736), ShortOffsetRunHeader::new(231, 71840),
    ShortOffsetRunHeader::new(239, 93760), ShortOffsetRunHeader::new(241, 119808),
    ShortOffsetRunHeader::new(243, 120486), ShortOffsetRunHeader::new(280, 122624),
    ShortOffsetRunHeader::new(303, 122928), ShortOffsetRunHeader::new(309, 125184),
    ShortOffsetRunHeader::new(311, 127280), ShortOffsetRunHeader::new(313, 1241482),
    ShortOffsetRunHeader::new(0, 4256), ShortOffsetRunHeader::new(51, 5024),
    ShortOffsetRunHeader::new(61, 7296), ShortOffsetRunHeader::new(65, 7958),
    ShortOffsetRunHeader::new(74, 9398), ShortOffsetRunHeader::new(149, 11264),
    ShortOffsetRunHeader::new(151, 42560), ShortOffsetRunHeader::new(163, 43824),
    ShortOffsetRunHeader::new(183, 64256), ShortOffsetRunHeader::new(189, 65313),
    ShortOffsetRunHeader::new(193, 66560), ShortOffsetRunHeader::new(197, 67456),
    ShortOffsetRunHeader::new(219, 68736), ShortOffsetRunHeader::new(227, 71840),
    ShortOffsetRunHeader::new(235, 93760), ShortOffsetRunHeader::new(237, 119808),
    ShortOffsetRunHeader::new(239, 120486), ShortOffsetRunHeader::new(276, 122624),
    ShortOffsetRunHeader::new(299, 122928), ShortOffsetRunHeader::new(305, 125184),
    ShortOffsetRunHeader::new(307, 127280), ShortOffsetRunHeader::new(309, 1241482),
];
static OFFSETS: [u8; 319] = [
    65, 26, 6, 26, 47, 1, 10, 1, 4, 1, 5, 23, 1, 31, 1, 195, 1, 4, 4, 208, 1, 36, 7, 2, 30, 5,
    96, 1, 42, 4, 2, 2, 2, 4, 1, 1, 6, 1, 1, 3, 1, 1, 1, 20, 1, 83, 1, 139, 8, 166, 1, 38, 9,
    41, 0, 38, 1, 1, 5, 1, 2, 43, 1, 4, 0, 86, 2, 6, 0, 11, 5, 43, 2, 3, 64, 192, 64, 0, 2, 6,
    2, 38, 2, 6, 2, 8, 1, 1, 1, 1, 1, 1, 1, 31, 2, 53, 1, 7, 1, 1, 3, 3, 1, 7, 3, 4, 2, 6, 4,
    13, 5, 3, 1, 7, 116, 1, 13, 1, 16, 13, 101, 1, 4, 1, 2, 10, 1, 1, 3, 5, 6, 1, 1, 1, 1, 1, 1,
    4, 1, 6, 4, 1, 2, 4, 5, 5, 4, 1, 17, 32, 3, 2, 0, 52, 0, 229, 6, 4, 3, 2, 12, 38, 1, 1, 5,
    1, 0, 46, 18, 30, 132, 102, 3, 4, 1, 62, 2, 2, 1, 1, 1, 8, 21, 5, 1, 3, 0, 43, 1, 14, 6, 80,
    0, 7, 12, 5, 0, 26, 6, 26, 0, 80, 96, 36, 4, 36, 116, 11, 1, 15, 1, 7, 1, 2, 1, 11, 1, 15,
    1, 7, 1, 2, 0, 1, 2, 3, 1, 42, 1, 9, 0, 51, 13, 51, 93, 22, 10, 22, 0, 64, 0, 64, 0, 85, 1,
    71, 1, 2, 2, 1, 2, 2, 2, 4, 1, 12, 1, 1, 1, 7, 1, 65, 1, 4, 2, 8, 1, 7, 1, 28, 1, 4, 1, 5,
    1, 1, 3, 7, 1, 0, 2, 25, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1,
    8, 0, 10, 1, 20, 6, 6, 0, 62, 0, 68, 0, 26, 6, 26, 6, 26, 0,
static OFFSETS: [u8; 315] = [
    170, 1, 10, 1, 4, 1, 5, 23, 1, 31, 1, 195, 1, 4, 4, 208, 1, 36, 7, 2, 30, 5, 96, 1, 42, 4,
    2, 2, 2, 4, 1, 1, 6, 1, 1, 3, 1, 1, 1, 20, 1, 83, 1, 139, 8, 166, 1, 38, 9, 41, 0, 38, 1, 1,
    5, 1, 2, 43, 1, 4, 0, 86, 2, 6, 0, 11, 5, 43, 2, 3, 64, 192, 64, 0, 2, 6, 2, 38, 2, 6, 2, 8,
    1, 1, 1, 1, 1, 1, 1, 31, 2, 53, 1, 7, 1, 1, 3, 3, 1, 7, 3, 4, 2, 6, 4, 13, 5, 3, 1, 7, 116,
    1, 13, 1, 16, 13, 101, 1, 4, 1, 2, 10, 1, 1, 3, 5, 6, 1, 1, 1, 1, 1, 1, 4, 1, 6, 4, 1, 2, 4,
    5, 5, 4, 1, 17, 32, 3, 2, 0, 52, 0, 229, 6, 4, 3, 2, 12, 38, 1, 1, 5, 1, 0, 46, 18, 30, 132,
    102, 3, 4, 1, 62, 2, 2, 1, 1, 1, 8, 21, 5, 1, 3, 0, 43, 1, 14, 6, 80, 0, 7, 12, 5, 0, 26, 6,
    26, 0, 80, 96, 36, 4, 36, 116, 11, 1, 15, 1, 7, 1, 2, 1, 11, 1, 15, 1, 7, 1, 2, 0, 1, 2, 3,
    1, 42, 1, 9, 0, 51, 13, 51, 93, 22, 10, 22, 0, 64, 0, 64, 0, 85, 1, 71, 1, 2, 2, 1, 2, 2, 2,
    4, 1, 12, 1, 1, 1, 7, 1, 65, 1, 4, 2, 8, 1, 7, 1, 28, 1, 4, 1, 5, 1, 1, 3, 7, 1, 0, 2, 25,
    1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 31, 1, 25, 1, 8, 0, 10, 1, 20, 6, 6, 0,
    62, 0, 68, 0, 26, 6, 26, 6, 26, 0,
];
#[inline]
pub fn lookup(c: char) -> bool {
    debug_assert!(!c.is_ascii());
    (c as u32) >= 0xaa && lookup_slow(c)
}
#[inline(never)]
fn lookup_slow(c: char) -> bool {
    const {
        assert!(SHORT_OFFSET_RUNS.last().unwrap().0 > char::MAX as u32);
        let mut i = 0;

@@ -424,6 +444,7 @@ pub mod grapheme_extend {
];
#[inline]
pub fn lookup(c: char) -> bool {
debug_assert!(!c.is_ascii());
(c as u32) >= 0x300 && lookup_slow(c)
}

@@ -446,7 +467,7 @@ pub mod grapheme_extend {
#[rustfmt::skip]
pub mod lowercase {
static BITSET_CHUNKS_MAP: [u8; 123] = [
14, 17, 0, 0, 9, 0, 0, 12, 13, 10, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12, 17, 0, 0, 9, 0, 0, 13, 14, 10, 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, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 4, 1, 0, 15, 0, 8, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0,
@@ -458,37 +479,37 @@ pub mod lowercase {
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 14, 56, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 43, 0, 52, 48, 50, 33],
[0, 0, 0, 0, 10, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 9, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 3, 0, 16, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27],
[0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 34, 17, 23, 53, 54, 49, 47, 7, 35, 42, 0, 28, 12, 31],
[0, 0, 46, 0, 56, 56, 56, 0, 22, 22, 69, 22, 36, 25, 24, 37],
[0, 5, 70, 0, 29, 15, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 66, 34, 17, 23, 53, 54, 49, 47, 8, 35, 42, 0, 28, 13, 31],
[11, 60, 0, 6, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 32, 0],
[10, 60, 0, 6, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 32, 0],
[16, 26, 22, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[16, 51, 2, 21, 68, 9, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[16, 51, 2, 21, 68, 8, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[16, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[65, 41, 55, 12, 77, 63, 18, 1, 7, 64, 76, 20, 73, 74, 4, 45],
[65, 41, 55, 11, 66, 63, 18, 13, 1, 64, 76, 20, 73, 74, 4, 45],
];
static BITSET_CANONICAL: [u64; 56] = [
0b0000000000000000000000000000000000000000000000000000000000000000,
0b1111111111111111110000000000000000000000000011111111111111111111,
0b0000111111111111111111111111110000000000000000000000000011111111,
0b1010101010101010101010101010101010101010101010101010100000000010,
0b0000000000000111111111111111111111111111111111111111111111111111,
0b1111111111111111111111000000000000000000000000001111110111111111,
0b1000000000000010000000000000000000000000000000000000000000000000,
0b0000111111111111111111111111111111111111000000000000000000000000,
0b0000111111111111111111111111110000000000000000000000000011111111,
0b1111111111111111111111111111111111111111111111111010101010000101,
0b1111111111111111111111111111111100000000000000000000000000000000,
0b1111111111111111111111111111110000000000000000000000000000000000,
0b1111111111111111111111110000000000000000000000000000000000000000,
0b1111111111111111111111000000000000000000000000001111111111101111,
0b1111111111111111111100000000000000000000000000010000000000000000,
0b1111111111111111110000000000000000000000000011111111111111111111,
0b1111111111111111000000111111111111110111111111111111111111111111,
0b1111111111111111000000000000000000000000000000000100001111000000,
0b1111111111111111000000000000000000000000000000000000000000000000,
@@ -532,13 +553,15 @@ pub mod lowercase {
0b1110011001010001001011010010101001001110001001000011000100101001,
0b1110101111000000000000000000000000001111111111111111111111111100,
];
static BITSET_MAPPING: [(u8, u8); 22] = [
(0, 64), (1, 188), (1, 186), (1, 183), (1, 176), (1, 109), (1, 124), (1, 126), (1, 66),
(1, 70), (1, 77), (2, 146), (2, 144), (2, 83), (3, 93), (3, 147), (3, 133), (4, 12), (4, 6),
(5, 187), (6, 78), (7, 132),
static BITSET_MAPPING: [(u8, u8); 21] = [
(0, 64), (1, 184), (1, 182), (1, 179), (1, 172), (1, 161), (1, 146), (1, 144), (1, 140),
(1, 136), (1, 132), (2, 146), (2, 144), (2, 83), (3, 93), (3, 147), (3, 133), (4, 12),
(4, 6), (5, 187), (6, 78),
];

pub const fn lookup(c: char) -> bool {
    debug_assert!(!c.is_ascii());
    (c as u32) >= 0xaa &&
    super::bitset_search(
        c as u32,
        &BITSET_CHUNKS_MAP,

@@ -554,43 +577,50 @@ pub mod n {
use super::ShortOffsetRunHeader;

static SHORT_OFFSET_RUNS: [ShortOffsetRunHeader; 42] = [
    ShortOffsetRunHeader::new(0, 1632), ShortOffsetRunHeader::new(9, 2406),
    ShortOffsetRunHeader::new(15, 4160), ShortOffsetRunHeader::new(49, 4969),
    ShortOffsetRunHeader::new(53, 5870), ShortOffsetRunHeader::new(55, 6470),
    ShortOffsetRunHeader::new(63, 8304), ShortOffsetRunHeader::new(79, 9312),
    ShortOffsetRunHeader::new(89, 10102), ShortOffsetRunHeader::new(93, 11517),
    ShortOffsetRunHeader::new(95, 12295), ShortOffsetRunHeader::new(97, 12690),
    ShortOffsetRunHeader::new(103, 42528), ShortOffsetRunHeader::new(115, 43056),
    ShortOffsetRunHeader::new(119, 44016), ShortOffsetRunHeader::new(131, 65296),
    ShortOffsetRunHeader::new(133, 65799), ShortOffsetRunHeader::new(135, 66273),
    ShortOffsetRunHeader::new(141, 67672), ShortOffsetRunHeader::new(153, 68858),
    ShortOffsetRunHeader::new(183, 69216), ShortOffsetRunHeader::new(189, 70736),
    ShortOffsetRunHeader::new(209, 71248), ShortOffsetRunHeader::new(213, 71904),
    ShortOffsetRunHeader::new(221, 72688), ShortOffsetRunHeader::new(225, 73552),
    ShortOffsetRunHeader::new(233, 74752), ShortOffsetRunHeader::new(237, 90416),
    ShortOffsetRunHeader::new(239, 92768), ShortOffsetRunHeader::new(241, 93552),
    ShortOffsetRunHeader::new(249, 93824), ShortOffsetRunHeader::new(251, 118000),
    ShortOffsetRunHeader::new(253, 119488), ShortOffsetRunHeader::new(255, 120782),
    ShortOffsetRunHeader::new(261, 123200), ShortOffsetRunHeader::new(263, 123632),
    ShortOffsetRunHeader::new(265, 124144), ShortOffsetRunHeader::new(267, 125127),
    ShortOffsetRunHeader::new(271, 126065), ShortOffsetRunHeader::new(275, 127232),
    ShortOffsetRunHeader::new(285, 130032), ShortOffsetRunHeader::new(287, 1244154),
    ShortOffsetRunHeader::new(0, 1632), ShortOffsetRunHeader::new(7, 2406),
    ShortOffsetRunHeader::new(13, 4160), ShortOffsetRunHeader::new(47, 4969),
    ShortOffsetRunHeader::new(51, 5870), ShortOffsetRunHeader::new(53, 6470),
    ShortOffsetRunHeader::new(61, 8304), ShortOffsetRunHeader::new(77, 9312),
    ShortOffsetRunHeader::new(87, 10102), ShortOffsetRunHeader::new(91, 11517),
    ShortOffsetRunHeader::new(93, 12295), ShortOffsetRunHeader::new(95, 12690),
    ShortOffsetRunHeader::new(101, 42528), ShortOffsetRunHeader::new(113, 43056),
    ShortOffsetRunHeader::new(117, 44016), ShortOffsetRunHeader::new(129, 65296),
    ShortOffsetRunHeader::new(131, 65799), ShortOffsetRunHeader::new(133, 66273),
    ShortOffsetRunHeader::new(139, 67672), ShortOffsetRunHeader::new(151, 68858),
    ShortOffsetRunHeader::new(181, 69216), ShortOffsetRunHeader::new(187, 70736),
    ShortOffsetRunHeader::new(207, 71248), ShortOffsetRunHeader::new(211, 71904),
    ShortOffsetRunHeader::new(219, 72688), ShortOffsetRunHeader::new(223, 73552),
    ShortOffsetRunHeader::new(231, 74752), ShortOffsetRunHeader::new(235, 90416),
    ShortOffsetRunHeader::new(237, 92768), ShortOffsetRunHeader::new(239, 93552),
    ShortOffsetRunHeader::new(247, 93824), ShortOffsetRunHeader::new(249, 118000),
    ShortOffsetRunHeader::new(251, 119488), ShortOffsetRunHeader::new(253, 120782),
    ShortOffsetRunHeader::new(259, 123200), ShortOffsetRunHeader::new(261, 123632),
    ShortOffsetRunHeader::new(263, 124144), ShortOffsetRunHeader::new(265, 125127),
    ShortOffsetRunHeader::new(269, 126065), ShortOffsetRunHeader::new(273, 127232),
    ShortOffsetRunHeader::new(283, 130032), ShortOffsetRunHeader::new(285, 1244154),
];
static OFFSETS: [u8; 289] = [
    48, 10, 120, 2, 5, 1, 2, 3, 0, 10, 134, 10, 198, 10, 0, 10, 118, 10, 4, 6, 108, 10, 118,
    10, 118, 10, 2, 6, 110, 13, 115, 10, 8, 7, 103, 10, 104, 7, 7, 19, 109, 10, 96, 10, 118, 10,
    70, 20, 0, 10, 70, 10, 0, 20, 0, 3, 239, 10, 6, 10, 22, 10, 0, 10, 128, 11, 165, 10, 6, 10,
    182, 10, 86, 10, 134, 10, 6, 10, 0, 1, 3, 6, 6, 10, 198, 51, 2, 5, 0, 60, 78, 22, 0, 30, 0,
    1, 0, 1, 25, 9, 14, 3, 0, 4, 138, 10, 30, 8, 1, 15, 32, 10, 39, 15, 0, 10, 188, 10, 0, 6,
    154, 10, 38, 10, 198, 10, 22, 10, 86, 10, 0, 10, 0, 10, 0, 45, 12, 57, 17, 2, 0, 27, 36, 4,
    29, 1, 8, 1, 134, 5, 202, 10, 0, 8, 25, 7, 39, 9, 75, 5, 22, 6, 160, 2, 2, 16, 2, 46, 64, 9,
    52, 2, 30, 3, 75, 5, 104, 8, 24, 8, 41, 7, 0, 6, 48, 10, 6, 10, 0, 31, 158, 10, 42, 4, 112,
    7, 134, 30, 128, 10, 60, 10, 144, 10, 7, 20, 251, 10, 0, 10, 118, 10, 0, 10, 102, 10, 6, 20,
    76, 12, 0, 19, 93, 10, 0, 10, 86, 29, 227, 10, 70, 10, 0, 10, 102, 21, 0, 111, 0, 10, 0, 10,
    86, 10, 134, 10, 1, 7, 0, 10, 0, 23, 0, 10, 0, 20, 12, 20, 108, 25, 0, 50, 0, 10, 0, 10, 0,
    10, 247, 10, 0, 9, 128, 10, 0, 59, 1, 3, 1, 4, 76, 45, 1, 15, 0, 13, 0, 10, 0,
static OFFSETS: [u8; 287] = [
    178, 2, 5, 1, 2, 3, 0, 10, 134, 10, 198, 10, 0, 10, 118, 10, 4, 6, 108, 10, 118, 10, 118,
    10, 2, 6, 110, 13, 115, 10, 8, 7, 103, 10, 104, 7, 7, 19, 109, 10, 96, 10, 118, 10, 70, 20,
    0, 10, 70, 10, 0, 20, 0, 3, 239, 10, 6, 10, 22, 10, 0, 10, 128, 11, 165, 10, 6, 10, 182, 10,
    86, 10, 134, 10, 6, 10, 0, 1, 3, 6, 6, 10, 198, 51, 2, 5, 0, 60, 78, 22, 0, 30, 0, 1, 0, 1,
    25, 9, 14, 3, 0, 4, 138, 10, 30, 8, 1, 15, 32, 10, 39, 15, 0, 10, 188, 10, 0, 6, 154, 10,
    38, 10, 198, 10, 22, 10, 86, 10, 0, 10, 0, 10, 0, 45, 12, 57, 17, 2, 0, 27, 36, 4, 29, 1, 8,
    1, 134, 5, 202, 10, 0, 8, 25, 7, 39, 9, 75, 5, 22, 6, 160, 2, 2, 16, 2, 46, 64, 9, 52, 2,
    30, 3, 75, 5, 104, 8, 24, 8, 41, 7, 0, 6, 48, 10, 6, 10, 0, 31, 158, 10, 42, 4, 112, 7, 134,
    30, 128, 10, 60, 10, 144, 10, 7, 20, 251, 10, 0, 10, 118, 10, 0, 10, 102, 10, 6, 20, 76, 12,
    0, 19, 93, 10, 0, 10, 86, 29, 227, 10, 70, 10, 0, 10, 102, 21, 0, 111, 0, 10, 0, 10, 86, 10,
    134, 10, 1, 7, 0, 10, 0, 23, 0, 10, 0, 20, 12, 20, 108, 25, 0, 50, 0, 10, 0, 10, 0, 10, 247,
    10, 0, 9, 128, 10, 0, 59, 1, 3, 1, 4, 76, 45, 1, 15, 0, 13, 0, 10, 0,
];
#[inline]
pub fn lookup(c: char) -> bool {
    debug_assert!(!c.is_ascii());
    (c as u32) >= 0xb2 && lookup_slow(c)
}
#[inline(never)]
fn lookup_slow(c: char) -> bool {
    const {
        assert!(SHORT_OFFSET_RUNS.last().unwrap().0 > char::MAX as u32);
        let mut i = 0;

@@ -608,34 +638,34 @@ pub mod n {
#[rustfmt::skip]
pub mod uppercase {
static BITSET_CHUNKS_MAP: [u8; 125] = [
12, 15, 6, 6, 0, 6, 6, 2, 4, 11, 6, 16, 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, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 5, 6, 14, 6, 10, 6, 6, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 7, 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, 13, 6, 6,
6, 6, 9, 6, 3,
3, 14, 6, 6, 0, 6, 6, 2, 5, 12, 6, 15, 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, 9, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 7, 6, 13, 6, 11, 6, 6, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 8, 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, 16, 6, 6,
6, 6, 10, 6, 4,
];
static BITSET_INDEX_CHUNKS: [[u8; 16]; 17] = [
[44, 44, 5, 35, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 5, 1],
[44, 44, 5, 35, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 5, 0],
[44, 44, 5, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 40, 44, 44, 44, 44, 44, 17, 17, 63, 17, 43, 29, 24, 23],
[44, 44, 40, 44, 44, 44, 44, 44, 17, 17, 62, 17, 43, 29, 24, 23],
[44, 44, 44, 32, 36, 21, 22, 15, 13, 34, 44, 44, 44, 11, 30, 39],
[44, 44, 44, 44, 9, 8, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 44, 44, 37, 28, 67, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 44, 44, 44],
[44, 44, 44, 44, 37, 28, 66, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 44, 44, 44, 44, 44, 44, 44, 55, 44, 44, 44, 44, 44, 44],
[44, 44, 44, 44, 44, 44, 44, 44, 44, 62, 61, 44, 20, 14, 16, 4],
[44, 44, 44, 44, 56, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 59, 44, 44, 31, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 60, 46, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 49, 44, 32, 36, 21, 22, 15, 13, 34, 44, 44, 44, 11, 30, 39],
[52, 54, 26, 50, 12, 7, 25, 51, 41, 53, 6, 3, 66, 65, 64, 68],
[57, 44, 9, 47, 44, 42, 33, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[58, 19, 2, 18, 10, 48, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[58, 38, 17, 27, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 57, 44, 44, 44],
[44, 44, 44, 44, 44, 44, 44, 44, 44, 49, 44, 44, 44, 44, 44, 44],
[44, 44, 44, 44, 44, 44, 44, 44, 44, 61, 60, 44, 20, 14, 16, 4],
[44, 44, 44, 44, 50, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 53, 44, 44, 31, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[44, 44, 54, 46, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[51, 44, 9, 47, 44, 42, 33, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[52, 19, 2, 18, 10, 48, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[52, 38, 17, 27, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44],
[58, 1, 26, 55, 12, 7, 25, 56, 41, 59, 6, 3, 65, 64, 63, 67],
];
static BITSET_CANONICAL: [u64; 44] = [
0b0000011111111111111111111111111000000000000000000000000000000000,
0b0000000000111111111111111111111111111111111111111111111111111111,
0b1111111111111111111111110000000000000000000000000011111111111111,
0b0101010101010101010101010101010101010101010101010101010000000001,
0b0000011111111111111111111111110000000000000000000000000000000001,
0b0000000000100000000000000000000000010101010000010001101011110101,
@@ -679,13 +709,15 @@ pub mod uppercase {
0b1111011111111111000000000000000000000000000000000000000000000000,
0b1111111100000000111111110000000000111111000000001111111100000000,
];
static BITSET_MAPPING: [(u8, u8); 25] = [
(0, 187), (0, 177), (0, 171), (0, 167), (0, 164), (0, 32), (0, 47), (0, 51), (0, 121),
(0, 117), (0, 109), (1, 150), (1, 148), (1, 142), (1, 134), (1, 131), (1, 64), (2, 164),
(2, 146), (2, 20), (3, 146), (3, 140), (3, 134), (4, 178), (4, 171),
static BITSET_MAPPING: [(u8, u8); 24] = [
(0, 182), (0, 74), (0, 166), (0, 162), (0, 159), (0, 150), (0, 148), (0, 142), (0, 134),
(0, 131), (0, 64), (1, 66), (1, 70), (1, 83), (1, 12), (1, 8), (2, 164), (2, 146), (2, 20),
(3, 146), (3, 140), (3, 134), (4, 178), (4, 171),
];

pub const fn lookup(c: char) -> bool {
    debug_assert!(!c.is_ascii());
    (c as u32) >= 0xc0 &&
    super::bitset_search(
        c as u32,
        &BITSET_CHUNKS_MAP,

@@ -699,8 +731,8 @@ pub mod uppercase {
#[rustfmt::skip]
pub mod white_space {
static WHITESPACE_MAP: [u8; 256] = [
2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 2, 2, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -711,6 +743,7 @@ pub mod white_space {
];
#[inline]
pub const fn lookup(c: char) -> bool {
debug_assert!(!c.is_ascii());
match c as u32 >> 8 {
0 => WHITESPACE_MAP[c as usize & 0xff] & 1 != 0,
22 => c as u32 == 0x1680,
‎src/tools/unicode-table-generator/src/cascading_map.rs‎
+1
Zeilen geändert: 1 Hinzufügung & 0 Streichungen
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -64,6 +64,7 @@ impl RawEmitter {

    writeln!(&mut self.file, "#[inline]").unwrap();
    writeln!(&mut self.file, "pub const fn lookup(c: char) -> bool {{").unwrap();
    writeln!(&mut self.file, "    debug_assert!(!c.is_ascii());").unwrap();
    writeln!(&mut self.file, "    match c as u32 >> 8 {{").unwrap();
    for arm in arms {
        writeln!(&mut self.file, "        {arm},").unwrap();

‎src/tools/unicode-table-generator/src/main.rs‎
+1
Zeilen geändert: 1 Hinzufügung & 0 Streichungen
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -195,6 +195,7 @@ fn load_data() -> UnicodeData {
.into_iter()
.flatten()
.flat_map(|cp| cp.scalar())
.filter(|c| !c.is_ascii())
.map(u32::from)
.collect::<Vec<_>>();
(prop, ranges_from_set(&codepoints))
‎src/tools/unicode-table-generator/src/raw_emitter.rs‎
+1
Zeilen geändert: 1 Hinzufügung & 0 Streichungen
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -98,6 +98,7 @@ impl RawEmitter {
self.blank_line();

    writeln!(&mut self.file, "pub const fn lookup(c: char) -> bool {{").unwrap();
    writeln!(&mut self.file, "    debug_assert!(!c.is_ascii());").unwrap();
    if first_code_point > 0x7f {
        writeln!(&mut self.file, "    (c as u32) >= {first_code_point:#04x} &&").unwrap();
    }

‎src/tools/unicode-table-generator/src/skiplist.rs‎
+2
Zeilen geändert: 2 Ergänzungen & 0 Streichungen
Ursprüngliche Dateizeilennummer Differenzial-Leitungsnummer Differenziallinienwechsel
@@ -99,6 +99,7 @@ impl RawEmitter {
if first_code_point > 0x7f {
writeln!(&mut self.file, "#[inline]").unwrap();
writeln!(&mut self.file, "pub fn lookup(c: char) -> bool {{").unwrap();
writeln!(&mut self.file, " debug_assert!(!c.is_ascii());").unwrap();
writeln!(&mut self.file, " (c as u32) >= {first_code_point:#04x} && lookup_slow(c)")
.unwrap();
writeln!(&mut self.file, "}}").unwrap();
@@ -107,6 +108,7 @@ impl RawEmitter {
writeln!(&mut self.file, "fn lookup_slow(c: char) -> bool {{").unwrap();
} else {
writeln!(&mut self.file, "pub fn lookup(c: char) -> bool {{").unwrap();
writeln!(&mut self.file, " debug_assert!(!c.is_ascii());").unwrap();
}
writeln!(&mut self.file, " const {{").unwrap();
writeln!(
0 Commit Kommentare
Kommentare
0 )))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants