@amritk/nish-x86_64-linux 0.26.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/std/regex.ts CHANGED
@@ -22,13 +22,22 @@
22
22
  * {n} {n,} {n,m}` with their lazy `?` forms. Escapes are `\n \r \t \f \v \0`,
23
23
  * `\cX`, `\xHH`, `\uHHHH`, `\u{H…}` and a backslash before any syntax
24
24
  * character; a `{`, `}` or `]` that does not belong to a quantifier or a
25
- * class is an error rather than a literal, so write `\{`. The flags are `i`
26
- * (ASCII letters only), `m` (`^` and `$` at line terminators) and `s` (`.`
27
- * matches them too). **Backreferences and
25
+ * class is an error rather than a literal, so write `\{`. `\p{…}` and
26
+ * `\P{…}` are Unicode 16.0's properties as JavaScript names them: a
27
+ * General_Category value (`L`, `Lu`, `Letter`, `gc=Nd`), `Script=` or
28
+ * `Script_Extensions=` a script (`sc=Grek`, `scx=Deva`), or a binary property
29
+ * (`Alphabetic`, `Emoji`, `ASCII`, `Any`, `Assigned`). The flags are `i`, `m`
30
+ * (`^` and `$` at line terminators), `s` (`.` matches them too) and `u`,
31
+ * which changes nothing. `i` folds A-Z to a-z, and above ASCII follows
32
+ * Unicode's simple case folding, so `σ` matches `Σ` and `ς` and `[α-ω]` the
33
+ * capitals; unlike JavaScript nothing folds across ASCII, so the Kelvin sign
34
+ * and `ſ` match no `k` or `s`, though under `i` both are word characters to
35
+ * `\w`, `\W`, `\b` and `\B`, as with JavaScript's `iu`. **Backreferences and
28
36
  * lookaround are refused at compile time**: they are what makes a matcher
29
37
  * backtrack, and this one never does. A repeat count is at most 1,000, a
30
38
  * pattern at most 100,000 instructions once its repeats are written out,
31
- * 1,024 capturing groups and 10,000 ranges in one class.
39
+ * 1,024 capturing groups and 10,000 ranges in one class, and its property
40
+ * escapes and case folding add at most 100,000 ranges to its classes.
32
41
  *
33
42
  * **Matching never backtracks.** A search runs a lazy DFA first: it builds
34
43
  * its states from the compiled program as the text needs them, so it reads a
@@ -83,6 +92,65 @@
83
92
 
84
93
  import { uncheckedGet } from "nish:unsafe"
85
94
 
95
+ // Derived from the Unicode Character Database 16.0.0 (https://www.unicode.org/Public/16.0.0/ucd/), the files scripts/gen-regex-unicode.mjs names. Copyright © 1991-2026 Unicode, Inc. Used under the Unicode License v3, whose text follows.
96
+ //
97
+ // UNICODE LICENSE V3
98
+ //
99
+ // COPYRIGHT AND PERMISSION NOTICE
100
+ //
101
+ // Copyright © 1991-2026 Unicode, Inc.
102
+ //
103
+ // NOTICE TO USER: Carefully read the following legal agreement. BY
104
+ // DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR
105
+ // SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
106
+ // TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT
107
+ // DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
108
+ //
109
+ // Permission is hereby granted, free of charge, to any person obtaining a
110
+ // copy of data files and any associated documentation (the "Data Files") or
111
+ // software and any associated documentation (the "Software") to deal in the
112
+ // Data Files or Software without restriction, including without limitation
113
+ // the rights to use, copy, modify, merge, publish, distribute, and/or sell
114
+ // copies of the Data Files or Software, and to permit persons to whom the
115
+ // Data Files or Software are furnished to do so, provided that either (a)
116
+ // this copyright and permission notice appear with all copies of the Data
117
+ // Files or Software, or (b) this copyright and permission notice appear in
118
+ // associated Documentation.
119
+ //
120
+ // THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
121
+ // KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
122
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
123
+ // THIRD PARTY RIGHTS.
124
+ //
125
+ // IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE
126
+ // BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES,
127
+ // OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
128
+ // WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
129
+ // ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA
130
+ // FILES OR SOFTWARE.
131
+ //
132
+ // Except as contained in this notice, the name of a copyright holder shall
133
+ // not be used in advertising or otherwise to promote the sale, use or other
134
+ // dealings in these Data Files or Software without prior written
135
+ // authorization of the copyright holder.
136
+ // gen-regex-unicode:begin -- generated by scripts/gen-regex-unicode.mjs; edit that, not this.
137
+ /** `\p{…}` names, `|key=offset|`; the key is `g`, `b` or `s` and the name (Unicode 16.0.0). */
138
+ const REGEX_PROPERTY_NAMES: string =
139
+ "|gC=0|gOther=0|gCc=1789|gControl=1789|gcntrl=1789|gCf=1796|gFormat=1796|gCn=1868|gUnassigned=1868|gCo=3649|gPrivate_Use=3649|gCs=3670|gSurrogate=3670|gL=3678|gLetter=3678|gLC=5316|gCased_Letter=5316|gLl=5684|gLowercase_Letter=5684|gLm=7068|gModifier_Letter=7068|gLo=7286|gOther_Letter=7286|gLt=8596|gTitlecase_Letter=8596|gLu=8622|gUppercase_Letter=8622|gM=9979|gMark=9979|gCombining_Mark=9979|gMc=10777|gSpacing_Mark=10777|gMe=11241|gEnclosing_Mark=11241|gMn=11261|gNonspacing_Mark=11261|gN=12129|gNumber=12129|gNd=12548|gDecimal_Number=12548|gdigit=12548|gNl=12772|gLetter_Number=12772|gNo=12814|gOther_Number=12814|gP=13031|gPunctuation=13031|gpunct=13031|gPc=13562|gConnector_Punctuation=13562|gPd=13582|gDash_Punctuation=13582|gPe=13645|gClose_Punctuation=13645|gPf=13825|gFinal_Punctuation=13825|gPi=13851|gInitial_Punctuation=13851|gPo=13879|gOther_Punctuation=13879|gPs=14388|gOpen_Punctuation=14388|gS=14574|gSymbol=14574|gSc=15185|gCurrency_Symbol=15185|gSk=15258|gModifier_Symbol=15258|gSm=15342|gMath_Symbol=15342|gSo=15512|gOther_Symbol=15512|gZ=16010|gSeparator=16010|gZl=16036|gLine_Separator=16036|gZp=16041|gParagraph_Separator=16041|gZs=16046|gSpace_Separator=16046|bASCII=16071|bASCII_Hex_Digit=16075|bAHex=16075|bAlphabetic=16083|bAlpha=16083|bAny=17887|bAssigned=~1868|bBidi_Control=17894|bBidi_C=17894|bBidi_Mirrored=17908|bBidi_M=17908|bCase_Ignorable=18170|bCI=18170|bCased=19267|bChanges_When_Casefolded=19670|bCWCF=19670|bChanges_When_Casemapped=20974|bCWCM=20974|bChanges_When_Lowercased=21306|bCWL=21306|bChanges_When_NFKC_Casefolded=22582|bCWKCF=22582|bChanges_When_Titlecased=24407|bCWT=24407|bChanges_When_Uppercased=25716|bCWU=25716|bDash=27030|bDefault_Ignorable_Code_Point=27104|bDI=27104|bDeprecated=27168|bDep=27168|bDiacritic=27198|bDia=27198|bEmoji=27770|bEmoji_Component=28111|bEComp=28111|bEmoji_Modifier=28149|bEMod=28149|bEmoji_Modifier_Base=28155|bEBase=28155|bEmoji_Presentation=28253|bEPres=28253|bExtended_Pictographic=28448|bExtPict=28448|bExtender=28647|bExt=28647|bGrapheme_Base=28780|bGr_Base=28780|bGrapheme_Extend=30873|bGr_Ext=30873|bHex_Digit=31781|bHex=31781|bIDS_Binary_Operator=31798|bIDSB=31798|bIDS_Trinary_Operator=31808|bIDST=31808|bID_Continue=31813|bIDC=31813|bID_Start=33689|bIDS=33689|bIdeographic=35328|bIdeo=35328|bJoin_Control=35415|bJoin_C=35415|bLogical_Order_Exception=35420|bLOE=35420|bLowercase=35443|bLower=35443|bMath=36859|bNoncharacter_Code_Point=37177|bNChar=37177|bPattern_Syntax=37266|bPat_Syn=37266|bPattern_White_Space=37340|bPat_WS=37340|bQuotation_Mark=37354|bQMark=37354|bRadical=37393|bRegional_Indicator=37404|bRI=37404|bSentence_Terminal=37410|bSTerm=37410|bSoft_Dotted=37662|bSD=37662|bTerminal_Punctuation=37765|bTerm=37765|bUnified_Ideograph=38087|bUIdeo=38087|bUppercase=38151|bUpper=38151|bVariation_Selector=39520|bVS=39520|bWhite_Space=39538|bWSpace=39538|bspace=39538|bXID_Continue=39567|bXIDC=39567|bXID_Start=41459|bXIDS=41459|sAdlm=43113,43124|sAdlam=43113,43124|sAghb=43149,43158|sCaucasian_Albanian=43149,43158|sAhom=43176,43176|sArab=43186,43331|sArabic=43186,43331|sArmi=43472,43472|sImperial_Aramaic=43472,43472|sArmn=43480,43496|sArmenian=43480,43496|sAvst=43514,43523|sAvestan=43514,43523|sBali=43539,43539|sBalinese=43539,43539|sBamu=43548,43548|sBamum=43548,43548|sBass=43561,43561|sBassa_Vah=43561,43561|sBatk=43569,43569|sBatak=43569,43569|sBeng=43577,43608|sBengali=43577,43608|sBhks=43671,43671|sBhaiksuki=43671,43671|sBopo=43684,43696|sBopomofo=43684,43696|sBrah=43737,43737|sBrahmi=43737,43737|sBrai=43749,43749|sBraille=43749,43749|sBugi=43755,43762|sBuginese=43755,43762|sBuhd=43774,43779|sBuhid=43774,43779|sCakm=43786,43795|sChakma=43786,43795|sCans=43812,43812|sCanadian_Aboriginal=43812,43812|sCari=43827,43834|sCarian=43827,43834|sCham=43854,43854|sCher=43867,43881|sCherokee=43867,43881|sChrs=43906,43906|sChorasmian=43906,43906|sCopt=43912,43923|sCoptic=43912,43923|sQaac=43912,43923|sCpmn=43955,43962|sCypro_Minoan=43955,43962|sCprt=43973,43990|sCypriot=43973,43990|sCyrl=44016,44057|sCyrillic=44016,44057|sDeva=44116,44135|sDevanagari=44116,44135|sDiak=44169,44169|sDives_Akuru=44169,44169|sDogr=44189,44196|sDogra=44189,44196|sDsrt=44211,44211|sDeseret=44211,44211|sDupl=44218,44233|sDuployan=44218,44233|sEgyp=44262,44262|sEgyptian_Hieroglyphs=44262,44262|sElba=44274,44281|sElbasan=44274,44281|sElym=44294,44294|sElymaic=44294,44294|sEthi=44300,44388|sEthiopic=44300,44388|sGara=44479,44490|sGaray=44479,44490|sGeor=44509,44540|sGeorgian=44509,44540|sGlag=44582,44601|sGlagolitic=44582,44601|sGong=44651,44668|sGunjala_Gondi=44651,44668|sGonm=44692,44711|sMasaram_Gondi=44692,44711|sGoth=44734,44740|sGothic=44734,44740|sGran=44757,44791|sGrantha=44757,44791|sGrek=44853,44947|sGreek=44853,44947|sGujr=45061,45092|sGujarati=45061,45092|sGukh=45133,45140|sGurung_Khema=45133,45140|sGuru=45151,45186|sGurmukhi=45151,45186|sHang=45231,45277|sHangul=45231,45277|sHani=45340,45425|sHan=45340,45425|sHano=45567,45572|sHanunoo=45567,45572|sHatr=45577,45577|sHatran=45577,45577|sHebr=45587,45612|sHebrew=45587,45612|sHira=45639,45661|sHiragana=45639,45661|sHluw=45711,45711|sAnatolian_Hieroglyphs=45711,45711|sHmng=45718,45718|sPahawh_Hmong=45718,45718|sHmnp=45733,45733|sNyiakeng_Puachue_Hmong=45733,45733|sHung=45746,45758|sOld_Hungarian=45746,45758|sItal=45782,45782|sOld_Italic=45782,45782|sJava=45791,45802|sJavanese=45791,45802|sKali=45813,45822|sKayah_Li=45813,45822|sKana=45829,45874|sKatakana=45829,45874|sKawi=45938,45938|sKhar=45949,45949|sKharoshthi=45949,45949|sKhmr=45969,45969|sKhmer=45969,45969|sKhoj=45982,45991|sKhojki=45982,45991|sKits=46008,46008|sKhitan_Small_Script=46008,46008|sKnda=46022,46051|sKannada=46022,46051|sKrai=46102,46102|sKirat_Rai=46102,46102|sKthi=46109,46118|sKaithi=46109,46118|sLana=46138,46138|sTai_Tham=46138,46138|sLaoo=46152,46152|sLao=46152,46152|sLatn=46177,46289|sLatin=46177,46289|sLepc=46462,46462|sLepcha=46462,46462|sLimb=46472,46485|sLimbu=46472,46485|sLina=46502,46513|sLinear_A=46502,46513|sLinb=46529,46549|sLinear_B=46529,46549|sLisu=46576,46587|sLyci=46606,46612|sLycian=46606,46612|sLydi=46622,46630|sLydian=46622,46630|sMahj=46645,46652|sMahajani=46645,46652|sMaka=46670,46670|sMakasar=46670,46670|sMand=46676,46683|sMandaic=46676,46683|sMani=46693,46702|sManichaean=46693,46702|sMarc=46715,46715|sMarchen=46715,46715|sMedf=46725,46725|sMedefaidrin=46725,46725|sMend=46732,46732|sMende_Kikakui=46732,46732|sMerc=46741,46741|sMeroitic_Cursive=46741,46741|sMero=46752,46758|sMeroitic_Hieroglyphs=46752,46758|sMlym=46768,46786|sMalayalam=46768,46786|sModi=46820,46829|sMong=46842,46862|sMongolian=46842,46862|sMroo=46888,46888|sMro=46888,46888|sMtei=46898,46898|sMeetei_Mayek=46898,46898|sMult=46910,46924|sMultani=46910,46924|sMymr=46942,46960|sMyanmar=46942,46960|sNagm=46981,46981|sNag_Mundari=46981,46981|sNand=46988,46999|sNandinagari=46988,46999|sNarb=47029,47029|sOld_North_Arabian=47029,47029|sNbat=47035,47035|sNabataean=47035,47035|sNewa=47043,47043|sNkoo=47052,47060|sNko=47052,47060|sNshu=47080,47080|sNushu=47080,47080|sOgam=47091,47091|sOgham=47091,47091|sOlck=47096,47096|sOl_Chiki=47096,47096|sOnao=47102,47111|sOl_Onal=47102,47111|sOrkh=47124,47131|sOld_Turkic=47124,47131|sOrya=47146,47177|sOriya=47146,47177|sOsge=47219,47229|sOsage=47219,47229|sOsma=47249,47249|sOsmanya=47249,47249|sOugr=47257,47263|sOld_Uyghur=47257,47263|sPalm=47277,47277|sPalmyrene=47277,47277|sPauc=47283,47283|sPau_Cin_Hau=47283,47283|sPerm=47290,47297|sOld_Permic=47290,47297|sPhag=47317,47324|sPhags_Pa=47317,47324|sPhli=47344,47344|sInscriptional_Pahlavi=47344,47344|sPhlp=47352,47362|sPsalter_Pahlavi=47352,47362|sPhnx=47376,47376|sPhoenician=47376,47376|sPlrd=47384,47384|sMiao=47384,47384|sPrti=47396,47396|sInscriptional_Parthian=47396,47396|sRjng=47404,47404|sRejang=47404,47404|sRohg=47413,47422|sHanifi_Rohingya=47413,47422|sRunr=47444,47452|sRunic=47444,47452|sSamr=47458,47466|sSamaritan=47458,47466|sSarb=47478,47478|sOld_South_Arabian=47478,47478|sSaur=47484,47484|sSaurashtra=47484,47484|sSgnw=47493,47493|sSignWriting=47493,47493|sShaw=47504,47511|sShavian=47504,47511|sShrd=47521,47528|sSharada=47521,47528|sSidd=47555,47555|sSiddham=47555,47555|sSind=47565,47574|sKhudawadi=47565,47574|sSinh=47591,47623|sSinhala=47591,47623|sSogd=47663,47670|sSogdian=47663,47670|sSogo=47681,47681|sOld_Sogdian=47681,47681|sSora=47688,47688|sSora_Sompeng=47688,47688|sSoyo=47696,47696|sSoyombo=47696,47696|sSund=47703,47703|sSundanese=47703,47703|sSunu=47712,47721|sSunuwar=47712,47721|sSylo=47743,47750|sSyloti_Nagri=47743,47750|sSyrc=47764,47777|sSyriac=47764,47777|sTagb=47823,47832|sTagbanwa=47823,47832|sTakr=47844,47853|sTakri=47844,47853|sTale=47870,47877|sTai_Le=47870,47877|sTalu=47895,47895|sNew_Tai_Lue=47895,47895|sTaml=47907,47950|sTamil=47907,47950|sTang=48015,48031|sTangut=48015,48031|sTavt=48054,48054|sTai_Viet=48054,48054|sTelu=48063,48092|sTelugu=48063,48092|sTfng=48132,48142|sTifinagh=48132,48142|sTglg=48161,48168|sTagalog=48161,48168|sThaa=48177,48183|sThaana=48177,48183|sThai=48206,48214|sTibt=48233,48254|sTibetan=48233,48254|sTirh=48279,48288|sTirhuta=48279,48288|sTnsa=48311,48311|sTangsa=48311,48311|sTodr=48320,48327|sTodhri=48320,48327|sToto=48348,48354|sTutg=48363,48390|sTulu_Tigalari=48363,48390|sUgar=48434,48434|sUgaritic=48434,48434|sVaii=48442,48442|sVai=48442,48442|sVith=48449,48449|sVithkuqi=48449,48449|sWara=48469,48469|sWarang_Citi=48469,48469|sWcho=48478,48478|sWancho=48478,48478|sXpeo=48487,48487|sOld_Persian=48487,48487|sXsux=48496,48496|sCuneiform=48496,48496|sYezi=48512,48523|sYezidi=48512,48523|sYiii=48545,48556|sYi=48545,48556|sZanb=48581,48581|sZanabazar_Square=48581,48581|sZinh=48588,48679|sInherited=48588,48679|sQaai=48588,48679|sZyyy=48758,49225|sCommon=48758,49225|sZzzz=49635,49635|sUnknown=49635,49635|"
140
+ /** The range lists `REGEX_PROPERTY_NAMES` points into, in base-32 digits from `0`. */
141
+ const REGEX_PROPERTY_DATA: string =
142
+ "g00ORNQ0<0f91536000C0\\<0Q51QA120QF7J35@E0UO0Q?1QJ1S4=QJ1Q@1>0K100:4N7R:0U007111E0600231811137031041H1205311E06010101100431122063006@9208020E06010419020210>31;660207111E0601041811126231041A9105220321000121222;3422031050=D4<020F0?18020361021013196E020F09041802036151031902;<020QB02053?1I020A2G080016203500075912;QI3LQ4100040G000F1400060913OR70Q33Q60Q30>0<Q4V500401[H031600031Q8031Q0031600031>0QH031R21O2I5RE151dL2RH6E8G8C;<0201;RM19595=0:5RH6Q:4R59N0;3;302Q914:Q;3I5:2QM1R00L1:595=1NQ@R<0U57QK2>2QM4Q:1:7Q:4`E151Q515170000000N1QD0>0=150B12080:4I4Q@?11J0<2Q0>Q0>T;3dIE:DQhC1O0ZL4Q<00401QG61=G86060606060606060SMQ1I0RH;VEIR?0RE1S64Q:0RM0RE8Q?0lc<2QF8ZKCUG7V=110007DQJ295QG7R57;5SC:M2R=0:3Q00QF8=191S6GK95151586060QK3SM195Zm3;F3Q@XX3[=1S9Q56;44I040001010SL?]L1QE60OQ95QB0B03340T63UM251515122606<11;0I0B010>1=Q1SJ423Q<2RG0<20Q>Q=T1L2Q@>K3Q38M4Q:4M0Q43=Q9TM195Q33Q33Q77QC:;0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F0R778Q?B014Q02J40QOQG3C1QA0147020L1239686QOOQ63;8QE2L1J4I63;6R?R8QFQB<QB6Q=795Q52L71V?N0Q90211?2QFQ;7Q9EIQ5KCF8R=3Q38QM04<H695QD0A7Q68RO0C:A0Q>QM600030>0:5QJ495307111E0601040911121050461624:900100Q509001003090171LRK04MR779U5QE1Q5Q1R4:95<BQI595CKJ1>3FUHQKS3RB;71017010M011;89R571Q=1:JR77RB<R869UEQ1=9580Q<0=9L2O1E0=R86010Q;2001087955010Q4010569YEH6@0Q82LRD0>QA<lJS5S>04:V3Rb;S2<QQ??E9SlJ4b6VeHQIQf5aH6N093R@095M159R599060D4B]?QIV5RJS4R:3QH6@QO4:1=UoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<286913SjOWI5]CR;Q=1F8SCQKWE9Q61R97S?DR5SIC;C;RF8HT6RD0R6011011130;00060R00317060K030400260ZC1Y31eM>40>QR?N55VD60@1601044QMQ00S?Q<2=1931YON@QI40^?Q9VEQ:30^O603010>0V41?Q8R;3931h@R3R;QLV130J0100100903000050300000020100100000000001001306030300090@42040@QC1X=Q;3S3;>1>0>0Q49U=QGL<Q;3861=5TInG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0S5QP5QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROegZ?W?Uo`?20ORNQ0EU=0QZA5E0UO0Q@0[O1R?0Si:0QoK4I4Q@409Qgd>0WH2TV00>0Xk1?QRRO3UV>7h[d50MROfKkH1536000C0\\<0Q51QA120QF7J35:X=0QK1S4=QJ1Q@1>0K100:4N014W<07111E0600231811137031041H1205311E06010101100431122063006@9208020E06010419020210>31;660207111E0601041811126231041A9105220321000121222;3422031050=D4<020F0?18020361021013196E020F09041802036151031902;<020QB02053?1I020A2G080016203500075912;QI3LQ4100040G000F1400060913OR70Q33Q60Q30>0<Q4V500401[H031600031Q8031Q0031600031>0QH031R21O2I5RE151dL2RH6E8G8C;<0201;RM19595I5RH6Q:4R59N0;3;302Q914:Q;3I5:2QM1R00L1:595=1NQ@R<0U57QK2>2QM4Q:1:7Q:4`E151Q515170000000N1QD0>0=150B12080S40;1J0<2Q0>Q0>T;3dIE:DQhC1O0ZL4Q<00401QG61=G86060606060606060SMQ1I0RH;VEIR?0RE1S64Q:0RM0RE8Q?0lc<2QF8ZKCUG7V=110007DQJ295QG7R57;5SC:M2R=0:3Q00QF8=191S6GK95151586060QK3SM195Zm3;F3Q@3Xc=1S9Q56;44I040001010SL?]L1QE60OQ95QB0B03340T6100UM251515122606941;0I0B010>1=Q1SJ423Q<2RG0<20Q>Q=T1L2Q@>K3Q38M4Q:4M0Q43=Q9TM195Q33Q33Q77QC:;0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F0R778Q?B014Q02J40QOQG3C1QA0147020L1239686QOOQ63;8QE2L1J4I63;6R?R8QFQB<QB6Q=795Q52L71V?N0Q90211?2QFQ;7Q9EIQ5KCF8R=3Q38R3901H695QD0A7Q68RO0C:A0Q>QM600030>0:5QJ495307111E0601040911121050461624:900100Q509001003090171LRK04MR779U5QE1Q5Q1R4:95<BQI595CKJ1>3FUHQKS3RB;71017010M011;89R571Q=1:JR77RB<R869UEQ1=9580Q<0=9L2O1E0=R86010Q;2001087955010Q4010569YEH6@0Q82LRD0>QA<lJS5S>04:V3Rb;S2<QRE9SlJ4b6VeHQIQf5aH6N093R@095M159R599060D4B]?QIV5RJS4R:3QH6@QO4:1=UoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<286917SjKWI5]CR;Q=1F8SCQKWE9Q61V1DR5SIC;C;RF8HT6RD0R6011011130;00060R00317060K030400260ZC1Y31eM>40>QR?N55VD60@1601044QMQ00S?Q<2=1931YON@QI40^?Q9VEQ:30^O603010>0V41?Q8R;3931h@R3R;QLV130J0100100903000050300000020100100000000001001306030300090@42040@QC1X=Q;3S3;>1>0>0Q49U=QGL<Q;3861=5TInG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0S5QP5QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROegR@0MROSOW?Qo`?QooM1QooM13QhP0VWOlQgOQooM1QooM1QfP0QoOe5R1I5IQ>090304F0N0^93;=46000T040113005002000C0RB0T:7U50Q5105Q8R6J33Q<Q:Q210S200>1619210?00MLRH:0GQ081304E308020FH6:4G05@Q9QIQE20A069>?37111E06002320?0<102=19075311E06010101N300B2?8020E06010420A0>1F0:7111E06010420M102>0@005220321000121222;E0QC7020F0?20I21011M037020F090420N101>1@8020Q810?04272G54A2G080016QIQ?01;6QI100040G000901801400D3O0QN70Q3J4SBQ:C0?5332021623<;0@Q500401Q:0Z<031600031Q8031Q0031600031>0QH031R2Q4??RE152c;1@0I4R:576A<B=A=<02>QCQ2030R2RH641Q1004R59NQ@M14:Q;3IQEF8QDRA0RLQ>@7QEM<19Q;IQ3Q829Q31:4Q:12Q830501204UOQOXE151Q515170000000N1QD0600220623153<4206SC0<0?<S4030190024500000030:134430QC1RcJW45321;Q500401QG60?F8606060606060606R?0^D1Q94413RE520RI034Q:0RM@OQ??_OV]OQOed<R2Q=1X<2?91CQ>?N1R5Q@81S61R2110007D?02030FLQC=QAQM52001:K9FHL6Q>K0?409940Q8F207CF202QA0021141000G21:62;5151586060Q:0=5SBLZm3;F3Q@XX3[=1S9Q56;440090<040001010S;Q0[:AQO1QEQ7;SC40T6Q3I5I:RH25151512Q2;0I0B010>1=Q1SJ\\4L2Q@Q>O<C075Q59M1Q337Q?TMAQ33Q33Q77QC;:0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F9F8NR0B019E9IR5QG51QO0>3020LQ9L2LQ270KJQE9E9B<AS=R8QFQB<QB<Q3Q5K8FWIQ951?2QJL907EQ9AQ=DJF;QDQH110<Q<OHIQ3L0107Q220;Q?=3D000Q2A0HB1QN600030>096Q>Q57111E06010420A0;4M900100Q500H000Q;QDA3C2MQ?C100UGQ>Q83Q3Q?C0QJQ:<0R6JQ46UHQ;SCQON71017010G>000RM71Q6?000K09Q760D0:Q=B0AR8V6Q0N80Q4@0Q@MS?6010Q5D0H5010O=0Z6B>00<0Q1SK0R>lIW5V3Rb;S0>QQ?@5HSlJ4b6VeHMQg1aH6N@R>@MAQ??3ND4B]?Q<VBQOSOR:40R1<QO100KUoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<2869Uk5RD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H07QiCN55X4QMTAQ<96?0Z0MAQ;_3KW3M10_>603010>0V4QJR360QUC30J0100100903000050300000020100100000000001001306030300090@42040@TZ3QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROTAR1I5IQI09F0N0V2033V?0JUO31122005002000C0RB0T:7U50Q58Q8RhFQ500401Q:12dORE15RT1:4Q:12QOQ;QN<0Q1S4XE151Q515170000000N1QD0600220623153<4206X4030190024500000030530134430QC1RcJSK1S65321;Q50040nXAQ=AKT5R=0F230QM110007G120iDQ:486R?ciO6;4QP8I5IQU4R?ROQ33Q3SC:0>06010:0>0601Qf2QB<QBRLE9ERhIQOeZOQOi[ORD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H07QiC90C55R^DR3dFS1IQI0Q8G0700000000000000000000000000000000000000000000000000000001000000000000000100000000000000000000000000000000000000000000001000021000102130102210100000100100102000111250101000000000000000010000000000000000011000200000000000000000000000000000000000000000000000000000000006101100300000000R40JV00002022A0JQ20122000000000000000000000004001011QBQ?000000000000000000000000000000000080000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Q?Q8Rj6Q:12gG5RT1800SDQ;QN<0Q1S500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087597777597777=17777774015022017311779201XA02120J03030117330QD0Re:Q?00210000003001054000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001600030;Q50040nXB000000000000000000000000000000000000000000000B000000000000000000000000000T600000000000020000000000000000000000000000000000000000000000000000000000000007000010000000003000100200000000000000000000404000000000000000300010200000000000I020iDQ:486R?ciO6;4QQ8IQV<Q7T7Q3TJ:0>0601Qh2QBSLERiIOe[OOi\\III60AIII300060:IIIIIIIIIIIIIIIIIKKH05IH05IH05IH05IH0500QiC90C55R_FQ1R;e@A3;=46000T4040^M0W50U31X<130N08020TO0U60QVC0SN0aD0QfI0S:0c20^?5U=QN<0Q1Q4e@0<0?<RnN1W@0UN0^D0Q:440S01RL2khE0QW15X=0SA0K1SH8R?0F0S8221^D0E0T80S;0D1S6380eP50Q<1QnO50Q908Q\\B0O0g^?3_K2Q71a5<QO100`P;30601\\Q@QMV86m<0QRN0`@U:0>0WO033V?0iJJ33Q<O09Q210S200G19210?00MLRH:0GQ0DEQ9H6:4G05@Q8QJQE20A069?>37111E06002320?0<102=19075311E06010101N300B2?8020E06010420A0>1F0:7111E06010420M102>0@005220321000121222;E0QC7020F0?20I21011M037020F090420N101>1@8020Q810?04272G54A2G080016QIQ?01;5QJ100040G0009018014F3O0QN70Q3J4SBQ:C0?5332021623<;0S@Z8031600031Q8031Q0031600031>0QH031R2Q4?S@c;1@0I4R:576A<B=A=<02>QCQ70R2Q20QD641Q1004R59NQ@M14:Q;3IQEF8QDU?Q>@7QEM<19Q;IQ3Q829MS@3050120QQI3RoFQGGF8606060606060606a60QD03RE700RI304Q:0RM@OQ??_OV]OQOd`D0QSFR2Q77X;3?91R10Q@R5U80S602602030FLQC=QAQM52001:K9FHL6Q>Q<418940Q8F207C?05202QA0021141000G12:60=515158606T@Q2LZm3;F3Q@XX3[=1S9R20090<040001010S;Q0[:AQO1QEQ7;SC40T6S890Q<1N25151512Q2;0I0B010>1=Q1SJ\\4L2Q@Q>O<C075Q59M1Q337SOR=S1Q77QCRKQC;YF8E97TG5100Q;01201F9F8NR0B019E9IR5QG51QO0>3020LQ9L2LQ270KJQE9E9B<AS=R8UFQ3Q5300Y?Q951?2QJL907EQ9AQ=DJF;QDQH110<Q<OHIQ3L0107Q220;Q?=3D000Q2A0HB1QN600030>096Q>Q57111E06010420A0;4M900100Q500H000Q;QDA3C2MQ?C100UGQ>Q83Q3Q?C0QJQ:<0R6JQ46UHQ;VB71017010G>000RM71Q6?000K09Q760D0:Q=B0AR8V6Q0N80Q4@0Q@MS?6010Q5D0H5010O=0Z6B>00<0Q1SK0R>lIW5V3Rb;S0>QQ?@5HSlJ4b6VeHMQg1aH6N@R>@MAQ?QBD4B]BQ7\\DR:40U>UoG7QVEQ89XgFY2>0L210=37\\;RX3S:4<2869Xc?0_DQ<Q00Z0MAQ;_3JW4M10_>603010>0V4QYJ30J0100100903000050300000020100100000000001001306030300090@42040@TZ3QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TRO:^501010Q50W\\D77777;0>0Q>0d;R1IS4F06Q000000000000000000000000000000000000000000000000000000001000000000000000100000000000000000000000000000000000000000000001000021000102130102210100000100100102000120601010100000000000000010000000000000000010100200000000000000000000000000000000000000000000000000000000006101100300000000Y00002070500200010@08Q20122000000000000000000000004010011QBQ?000000000000000000000000000000000800000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001Q5Rj8Q50040fARERTB05Q:12YO00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008775977775:000000077R73;3;3;4:3X50302212102450000003139140QL0RcKQ?Q?0021000000300107200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700030nZ<000000000000000000000000000000000000000000000B000000000000000000000000000T60000000000000200000000000000000000000000000000000000000000000000000000000009000010000000030001000200000000000000000000404000000000000000300012040000000G0ei:IQV4Q7T7Q3TK:0>0601Qg9QBTLERiIOe[OOi\\OIIIIII00110111307III1031706J103040026JIIIIIIIIIIIMHQ0HQ0HQ0HQ0HQ00TYDQ1Z1h0S?XB6X6Q<00010100R7:Q?D?0S46151103Q20MJRJ:QI880G3080204Q:2QJ8Q9G0Q0QE20A0691L2QG00611128091I012QG004311220M120:2QG0070202C1E502QG00611126291M0QJ4220380Q74QF006020361:1L2QG006020361:1>0;3QF10602038091L2R50350007A1QL016;7S1018:6R81J0000031Q@C014:0Q380S3CF332021623<;0093eN2mA3K2L1M1QOO80Q<200SD1Q10SE;3;VJ4QH90L10Q?NQ@4Q>@Q58;2M<QG=Q?CTG20D305012V5QOf?Q0RoM2T<0ROOa95S81m^C309O1R?1X?02030F430RB1QAAIA<0Q57H<Q;3Q>=Q30R2=;071Q<2QA002114100Q8441W;701ci?0g0???n<0W10TD4Qd520143Q7230U41aL3R04YL1R>3R5:Q@3SI2QD>Q801193Q<:60QL2Q3=?1Q;0;2Q?=7301RK;5010TL;D3QF106111280911624R280010030400=1RAAF0R@CW:618J1RA@S9<S4>WO>WD501130001T<61620K9Q7603708:Q=?\\D707RAE0=SI520010600R140104ZJ38100Q?624F0UW405>[V7AR]O4QJ6QPG00QF63R@0:1cU:1Tc0Q=1F`M4257716M3TC2QmJQF3QA70=0E40>QZ?60@160104S30TO6[F0QL3_K3WM1fO6S<6hUmDW?UNRX30QF0127301QA1QI2511190Q:0QI2R10QI27001QD1QI000511190S5101220290Q82QL3QL1QI004110181K0=1QI2420290Q91R:257A1Z91QN0U:1305011H19216D1151092QcG0M0T006701ZI3123105VO1QI000800175T@0Q?0400401QL0M03110QK0120021Q?771U:0D0TiE1moB110RG1QA?T=1Q>0Q?13112S=111G0Q<000S<01140W<1010100iPB000SN0Q<231SB0G1QJ0Q?281<0RL22100U92N1QI10311128091RC26010030100S427120S92500310W<25310S@27100S<00150S600130X4280WF501301000T=27330RC0L1QM0\\F0=0S906010VD43100ZM1;0Q?17100`_72Sa3QFS71h[B1555QT81UaC0Q`M302QQ\\:2[5h0S?XB4X8Q<00010100R7:Q?D?0S46151103Q20MJRJ:QI880G3080204Q:2QJ8Q9G0OQF00037302691L0QI03370C1I011QH031311220M120:1QH0340130C1E500QI010037061:1M0QL0;0QA020QF002420361:1L0QI0105041C1K1QH13370C1L0R706200RI016;7S1018:6R81J00000QF=04014:0Q380S53050111H132?3<01150>0eN2mA2L1M1M1QO106701:80Q<200SD1Q10SE2318052VJ110QI0060000175910Q?=0?Q@3Q?0040040Q78;1O31102QG0012002QI711TG20<06305021V5QOf?<302;RoM2T<0ROOa93S:1m^C039O1R?1X?02030H140TF1IA<0Q57H:Q=2Q?01311Q60R251111;070Q>0QB002114100Q9170W=01030ci?0g0???n<0W10TD4Qd520143Q7230U41aL3R04YL1R>3R5:Q@3SJ0QE>Q801192Q@31160QL2Q3407QM0;1QC89310RN210015010TL027D1QH120Q4624R55<00000=1RD71200F0RC5003101W=35101J1RD71001S90001500S40001304X2801WO10030T?31130O9Q7513708512Q=<01\\E60500RAE160101SI520010600R712000ZJ1:1QC44000F0UW405>[V7;22R]O4QJ6QPG0QN3R@0cUG1Tc0Q=1F`O2@716M3TC2QmJQF3QA70=0E40>QZ?60@160104S30TO6[F0QL3_K3WM1fO6S<6hUmDW?T@Q@9SG14012Q]09T59V59\\K9SE935S;9SE9SE915S=<SB976S69S766BS<9RO9SE9R5CX;9R59f>Ck@2W>959E9Y;9SO:U4959UE9RE9T5959QPE02559V5QB14fEQKR=EcEMQ[80h80H8=2ZF3T99M70>O9Q6>ljO9UK9YO5TI9Q59V59E9RE9\\E9dhE9_<Q<;QH@1ZDJQ33L070T54V99m=7H6Q68R:4E5TO11?1Q=QO8QC1M2R:4S77G7Q86Z95Q?959XENTM9Q93S?6T5MSO9QK9T?96CWJ9ZE9SE9[E9S595CR;;]3BRL9dE9RELW29R59]59S5DQQ:S>_V09RY59RE9T5906`=9X5FgbH9Q^5C;CS;HQRDQARYO9]59_E9WF9f;8SO9hFQJ0203R;Q<0>n1<Rg29R7Q@9Qa59T59V59\\K9SE9SE9SE9SE9SE9SE9SE9SE9SE9RO9SE9R59XE9R59Qj59Q59Y;9SO9U5959UE9RE9T5959QR^59e59Q59V59E9RE9\\E9dhE9Q\\59RT5959hK9SO9QK9T?9XE9ZE9SE9[E9S595CR;9]59S59dE9RE9WE9R59]59`^E9RY59RE9T59`E9gkE9RfCQARYO9]59_E9WF9jD9TdE9<Ug>2Rc>Q213ScM0H8=2me:9fb?QD^;070T54XQ9S>R8UB14012RYD5[G5SG2T46VH6@8]@9QQDCQSB9^O0QdD02559V5?Q80fEQKR=EcEMQ[80QTC3T99M70>O9Q6>m[?5fV@Q<R03@1ZDJQ33QYC7H6Q68R:4E5TO11?1Q=QO8QC1M2R:4S77G7Q86Z95ZONTM9Q93S?6T5C[JCQZ41]=8k6BjBDbl56hMFiQ8C;CS;HUZ=8m0QJ0203R;Q<0>n1<V6Q1205039121I200J000Q204020912020eM070^A5Q81QB0001010Q;1C101<002R93S50Q:=W82QE>N0X4190T;0SG0SH0\\50;0[>0RI091U7>00Q43R60R9431S>5U:0c38TF0c<0Q;1R=2R61TL202Q4:YH1VG1SO605TO196K2SK3QJ4QM1QO7:0iKG7C0<0;M1=1cH3L1QQL=R>1N9\\BEQN3O1gJ301S?0T>Q>0O1;]22391;?0;0S10RI0mP11X<2S2090SB5[K3RE1Q7200Q@1Q>0S0<?1SK3SM1?1WH0dZA1V?9EQ20=003001TD205039121I200J00006\\I2dK0Q?0\\M0g60V60N0X?8Q50S?6R16RH3^@0YM0U64Q;3UL6S<103SM3Q?1R>330<002RG5S:0Y9101SA49100S70WIFS82K<R;0T12WK0X72TJ0RK7RB204RL9VF0RN4Q91d41R9<U>0QS?4RkK1^cJ1T40R0470a72Y63Z60cUK0W_64RkB0jM16RO0WnN1B0Qg^M1G2W>0DQ=0QZK0QB0Sb00QP40RP85S`0010N130K0]M0B0S>0Qc\\?1Q4090U80SbO0YM0R<Q90QB0N0SeL000QjM0R]80QF0>0cI000M0QQM0000000000000R?0O000000000\\C000000000000000000000QO000Q00QQ40000000Q;0000000];0000000002000000011QcXM0VH0L00000000000000020@00000U90QB0N01010:UK0WjL020K0S^70003010>020;U;0Wk;01110H0S^70003010>020V1Q12021000019121J0R3040=160eM070^A5Q80QE01010Q;1C101<002R93S50Q:=W82QE>N0X4190T;0SG0SH0\\50;0[>0RI091U7>00S?0R9431S>5U:0c38h40SK2R61TL202Q4503YH1VG1SO605TO196K2SK3QJ4QM1QO7:0j11777813122:0009STI301S?0T>1321018010011940913000<12];2QH0UL0mP11X<2S2090SB5[K3RE1Q7200Q@1Q>0S0<?1SK3SM1?1WH0da3610E0C1132203625001TD2021000019121J0Q3011\\I2dK0Q?0\\M0g60V60N0X?8Q50S?6R16RH3mG4Q;3UL6S<103SM3Q?1R>330<002RG5S:0Y9101SA49100S70WIFS82K<R;0T12WK0X72TJ0RK7RB204RL9VF0RN4Q91d41R9<U>0QS?4RkK1^cJ1T40R0470a72Y63Z60cUK0W_64RkB0jM1R?Q80QA0N0SeM000QjM0R[M020Q50QF0>0cI000M0QQM0000000000000R?0O000000000\\C000000000000000000000QO000Q00QQ40000000H0A0000000];0000000002000000010QcY00VF0L00000000000000020@00000U90QA0N02010W<Q4050?2N000J000Q240110031020M0N0^93;=46000@SD0=1S?0T:0X92SE21011V=090B1WF061T70[8151WD0SM0T17T30V>0Q80V40V02>00215C00000T47050143V41g?9fB0[<0[30TLQ1[0988QQO002:2<2<2<1R40<0Q62<2BQ0QN1030190024500000030:1344300QI13[G3L1WNE:R@R=Ec7Q;Q@1N9\\BEQN3O1[E1O0S8W45[41Q=I0RH;VEI?30<1;0D151RJ1WB139OQ580?N:M70>O9Q6>YOV]OQOed?QFaHF81S61TL393aL2W00=1cmL0T7@[L?SN0Q;3S100210TI050?2N000J000T0606<1YH8QH@120<20Q>Q<QcI1b>0f41R]>0RTDLbj9340dZE0Sk2W??]CTKSCQKWE9Q61QK42E16M3QLDR120UIRFk90H0N0H0N0H0N0H0N0H0QK_OQF3QA70=01Qf70]>0R];020SL0^01X=Q;3S3;>1>0>0Q4FU0QGL<Q;3861=5TInG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0RKEQ40SL3QW80SJ0_A1_A160WD0X60b40R\\J0RV3Q0QQkF0e^20S;0TI0VJ121WoE3Q`hM0R]?0ORN000R60503020`83;=46000@SD0=1QX10UiC002:2<2<2<1TTK1mc2F81S61n?0=1dR5@kJ000U10QmPF4R1Q;0?2QL000Q<030Q40N0gM0`>2VaJ0<0Q62<2T:0Q6450R344130101060N11000NX;O1RI0MHQ75^D080QE7S>0Z?41N9?WOT2EQN3O1X1Q?D15QcnK0iG002U30?2QL000T2053S]01QbY@0H0N0H0N0H0N0H0N0H0Ui;1UKU60103000n@0X91SN1V=090B1WF0`20[D0T1500T30V>0Q80\\62>00215C00000T47050143V41g?9fB0fA0TLQ1[0988Q\\21030190015500000030:1=00100QI184130101060N11000NX;73C161R@0MHQ75R7E:R@R=EUF080QE7S>0WGQ;Q;QOWO_OQ?D15Q61O0S8W45[41Q=I0RH;VEI?30<1;0D151Z?139OQ580?N:M70>O9Q6>YOV]OQOed?QFk039100aL2df5?SN0Q<2_302031<1YH8QH@120<20Q>Q<QcI1b>0SSE0RTD73@bj9340dZE0Sk2W??]CTKSCQKWE9Q61QK42E16M3QLDR120UIRFQU8_OQF3QA70=01Qf70RjK0T00f@Q;3S3;>1>0>0Q4FU0QGL<Q;3861=5TIWJ4fG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0RK8Q00SN0U^N0R[N:L140Q>0SlO01XQ801XQ907Q00SN0U^N0R[N:Q30Q>0SlO010SO3Q@965I5gER1I5IQ>090304F0N0^93;=46000RE0LA0113005002000C0RB0T:7U50Q5105Q8Q6=000101007J33L:4QG06=S50737329210?Q?<S4GQ081304G1BBH6:4G05707Q99;265R;0?023><B07111E06002327111100703104;1903205311E06010101343111306300@5:208020E06010428020120>3D33207111E060104271111813104<0?105220321000121222;3422022050Q7<020F0?27020271021013K307020F0904270202715103<2;<020Q8170202004364E5020A2G080016750007A1<QI4650QB100040G000B02140050=3O0QN70Q33B3?0Q3R2QF0014?QO931Q500401Q:0Z<031600031Q8031Q0031600031>0QH031R2Q4??RE152c;1@0I4R:2:6C:D;C;<0201;QC1B=030R2RH6Q:4R59N0;38FM14:Q;3IQEK3QN1CQA0F1:2Q@QC0>07QBQ9139Q;0:=QFE29Q31:4Q:12Q830501204UOBQ1:XE151Q515170000000N1QD0600220623153<4206SC0<0?<S4030190024500000030:134430@Q8i<QCQhEW45321;Q500401QG60?F86060606060606060OQ>0^D2H864143RE520RI034Q:0RM@OQ??_OV]OQOed<R2Q=1X<2?91CQ>472S@Q681S61R2110007DC0Q0GQC;R300Q;520029Q04Q2<L2QB0;>0??940QF8=AF2R40000G21?13:5151586060Q:0=5SJDZm3;F3Q@XX3[=1S9Q56;44;0<040001010S;Q0[:AQO1QEQ7;SC40T6Q3I5I:RH25151512Q2;0I0B010>1=Q1SJR4QDX:L2Q@Q>O<M4Q:4M1Q33704Q9TMAQ33Q33Q77QC;:0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F9F8NR0B019E9IR5QG51QO30147020LQ9L2LQ270KJQE9E9B<AS=R8QFQB<QB<Q7Q1K204FWIQ90121?2QF02L907EQ9AQ=DJF8R5Q:49QH80<HFQB@37Q2208QO03819000Q2A0Q11053QM600030>096QHF307111E060104271111205046K900100Q509001003012000Q;R10203C2MR11100UGQE16H5Q1QN0020QJQE10R6J1=D6UHQHS6QON71017010M011113RL71Q=150001JQB19@R740AR8V6Q0N80Q<0600Q@M1E0=R86010Q;2001020011G5010Q4010300Z6F8@0Q822S>0R>lIS5S>@V3Rb;S0>QQ?@5HSlJ4b6VeHQ>Qf@aH6N@R>@MAQ??3ND4B]?Q<VBQOSOR:3QH6@QO100;1=UoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<286930Uk0RD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H07QiCN55VD60@1601044QMQ00S?Q<96?0Z0MAQ;_3KW3M10_>603010>0V4QJR32020QUC30J0100100903000050300000020100100000000001001306030300090@42040@cCI5I5IScEQYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TRO10QQooO4Q`L0V_@1I4QF3SBQ81A000K000L000Q<0>0ScM3QjL1R\\K191QE1=1U@0UO32520212303000038400A438100070O1340811B4184113G1?73C161QQL=R9013010243422=\\BE150=7065203401143002119511;B03100010034152G1:13301113Q:170Q740002442302400WO0`232101=119Q:7]:917QcaL541U11A000K000L0000101QekF0QH0QH0QH0QH0^4Q7050:0Q2000R6030003011_FUO31308100WJ6V>040Q@Q<00010100Q;0:59:00Q209D?0S470903Q0000MJRJ:QI:3010GGQ:2Q;06148Q8QIQF00037302691<0>0QI03370C1I011QH031311220M120:1QH0340130C1E500QI010037061:1M0QL0;0QA020QF002420361:1L0QI0105041C1K1QH13370C1L0R706200RI016:8S10188006R81J00000QF=04014:0Q380S53050111H132?3<01150>0RM0bO2mA2L1M1M1QO106701:2040Q<4QB0R01Q10SE2318052VJ110QI0060000175910Q607NQ@3Q?0040040Q78;1O31102QG0012002QI711QO5RA20<06305021QAQN<0Q1S4]L002:2<2<2<1;471901014Q@40900<0?<QBQ0Rl:1S@2SL0>0ROOQ>0^D0Q332440RL5RL2khE0QW15X=0S130900K3R?1=Q1R=0F2S6221702030H140TF1IA<0Q57H:Q=2Q?01311@0D1R151111;070Q20:0QB002114100J0=14100S3482SH01030ci?0TB@aL?20;?Q1010U806050:0Q2000Q>0Q<1R20D2`00W10TD4QP450Q908b520143Q7230U41aL3Q50I400YJ1R>3R5:Q@3SJ0QE>Q801192Q@311103090QA2Q3407QM0;1QC89310RN210015010TL027D1QH120Q4624R55<00000=1RD71200F0RC5003101W=35101J1RD71001S90001500S40001304X2801WO10030T?31130O9Q7513708512Q=<01\\E60500RAE160101SI520010600R712000ZJ1:1QC44000F0UVD@5>[V7;22R]O4QJ683_K2Q71_10QN@QO101`P:30601STM103TbKQ=1F`O28?16M3TC2QmJQF3QA70=0E40>QZ?60@1601044QMQ00TO=[?0QL3_J4WM1fO6S<7Re>4hSP00MROSOW?TOR1I5IQ>090304F0N0V2033V?0Q361M4RO0Q931113005002000C0RB0T:7U50Q58Q8RhFQ500401Q:03dORE15RT1:4Q:12QOUOQOXE151Q515170000000N1QD0600220623153<4206SC0<0?<S4030190024500000030530134430@O21i@QCQhEW45321;Q50040nXAQ=AMT3S5230QM110007D402iDQ:0=5R?ciO6;4QP8I5IQU4R?ROQ33Q3SC:0>06010:0>0601^20120Q908QV4QB<QBRLE9ERhIQOeZOQOi[ORD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H07QiC90C55X4QMRTAR3Qo;I5I5IcBR1IRI09F07O0000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000000100000001000102130102210100000100100102000120610101000000000000000010000000000000000011000200000000000000000000000000000000000000000000000000000000006101100300000000WE0Q90002070500200010@08E0;221000000000000000000000000011100011QBQ?000000000000000000000000000000000800000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001Q5Q?0RhGQ50040i95RT195Q:12YO0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008775977775:000000077?Q?12154215:3;44215Y802150Q<?B0iAIQi?Q?Q?0021000000300107200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700030nZ<000000000000000000000000000000000000000000000B000000000000000000000000000T60000000000000200000000000000000000000000000000000000000000000000000000000009000010000000030001000200000000000000000000404000000000000000300012040000000G0kIR?ciO6;4QP8IQV4Q7T7Q3TK:0>0601Qg9QBTLERiIOe[OOndOQ1T3R1I5IQI09F0N0QO0RC0K1=11003RL0A5J010001210304100110601001254091U50Q931122005002000C0Q>2Q0040T47U50Q59Q6RhGQ500401Q:12dORE15RT1:4Q:12UH020?0S@TK100SE151Q515170000000N1QD0600220623153<4206Y802150J0@O21i@QCQhES@01016S56321;Q50040nXAQ=AKT5=1QM8>22140H0M1136G1jK0KR?ciO6;4QP8I5IQU4R?ROQ33Q3SC:0>06010:0>0601Qf2QB<QBRLE9ERhIQOeZOQOncOR3c6R1IS4F06Q000000000000000000000000000000000000000000000000000000001000000000000000100000000000000000000000000000000000000000000001000021000102130102210100000100100102000120610101000000000000000010000000000000000011000200000000000000000000000000000000000000000000000000000000006101100300000000Y00002070500200010@08Q207000000000000000000000004010011QBQ?000000000000000000000000000000000800000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001Q5Rj8Q50040fARERTB05Q:12YO00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008775977775:000000077G7777774:4:3;4:4Y802150Q<?B0iAIQi?Q?Q?0021000000300107200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700030nZ<000000000000000000000000000000000000000000000B000000000000000000000000000T60000000000000200000000000000000000000000000000000000000000000000000000000009000010000000030001000200000000000000000000404000000000000000300012040000000G0ei:IQV4Q7T7Q3TK:0>0601Qg9QBTLERiIOe[OOndOQ1j<R1IR40600010001312020F07O0000000000000000000000000000000000000000000000000020010000002000000010000000000000000000000000000000000000000000001000000010001021301022101000001001001020001206900000000000000100000000000000000130200000000000000000000000000000000000000000000000000000000006101100300000000S08N514RJ10280O000000020213600010@08E0;7000000000000000000000000020100011QBQ?000000000000000000000000000000000800000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001Q5Q?0TC0RG3fN7SK100RB010Q1210WL1fD0SN0Q71Q=0QE080303030;0800460@080303030;0W5Q50040Q=0S11dF5mE1RD4QS?95Q:12S;20:0A0K<0Q1Q4QO0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008775977775:000000077000000000000001Q?121=18203302203712170?0040;2252101300072<06B1J0<:0RF3020:011412000000030:05345Q?2040U1101WG1YDT:QY00S62S40Y2Q?Q?0021000000300105400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700030SK0Y>0RB0;VEQ90QD002RO110RN0Q@RM2=RON0Q77Q>0[OlaO000000000000000000000000000000000000000000000B00000000000000000000000000001T3000000000000020000000000000000000000000000000000000000000000000000000000000007000010000000030001000200000000000000000000404000000000000000300012040000000D311k13805R?cYOX=1000190000112R31S9Q56;4400G040001010S;Q0[:AQO1QEQ7<2IED1;0B0332000T6100UM25151512260608QP6Q7T7Q3TK:0>0601_:40Q908QV4QBTLERiIOe[OOcaO3TQAQ3QS36=7QO5aNRD0R6011011130;00060R00317060K030400260ZC1Y31QARQ?QMRTAQ1QVM30J0100100903000050300000020100100000000001001306030300090@42040@b3:4N0OI2Q20S>2<Q;3861R\\M9QoP5`MfQ_1SoOcES1IQI0Q8G07000000000000000000000000000000000000000000000000000000001000000000000001000000000000000000000000000000000000000000000010000210001020401022101000001030102000102000300101000000000000000001000000000000000002000020000000000000000000000000000000000000002000000000000000007011003000000005010001210304100110601001254091U50Q:0002022A0JQ20122000000000000000000000004001010QCQ?000000000000000000000000000000000080000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Q@Q6Sc?5RT1800W=020?0SA000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087597777597777=17777774015022017311779201ZE0Q0?30j:IQj5Q?002100000050109000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700030;Q50040nXB000000000000000000000000000000000000000000000B000000000000000000000000000T60000000000000200000000000000000000000000000000000000000000000000000000000009000100000000030300110000000000000000000:00000000000000030001020400000I0jK0KR?ciO6;4QQ8IQV<Q7T7Q3TJ:0>0601Qh2QBSLERiIOe[OOne1Q1cFS1IQI0Q8G070000000000000000000000000000000000000000000000000000000010000000000000010000000000000000000000000000000000000000000000100002100010204010221010000010301020001020004101010000000000000001000000000000000001010020000000000000000000000000000000000000002000000000000000007011003000000005010001210304100110601001254091U50Q:0002022A0JQ20122000000000000000000000004001010QCQ?000000000000000000000000000000000080000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Q@Q6Rj7Q:12gG5RT1800W=020?0SA000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087597777597777=1QD013000220130231177920130Z@0Q0?30j:IQj5Q?002100000050109000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700030;Q50040nXB000000000000000000000000000000000000000000000B000000000000000000000000000T60000000000000200000000000000000000000000000000000000000000000000000000000009000100000000030300110000000000000000000:00000000000000030001020400000I0jK0KR?ciO6;4QQ8IQV<Q7T7Q3TJ:0>0601Qh2QBSLERiIOe[OOne1Q1HQ=0QZK0QB0Sb00QP40RP85QL0Q60>0\\50SP3010N130K0]M0B0S>0Qc\\?1Q4090U80SbO0YM0AU=0e00f;0Rj11QbB1RD4QoJ4I4Q@?TWC0QcTJ?W>0TO0R>8Q_U63UV>7h[d4SoO8Z90QY80RX2000RQ81RV45eH1kgVE0VFRN000R60503011_FTN0745@13081WL4V@0QF@0J000100T5731T513122R2JRJ:QI:Q11SM7Q89?KQL0?023K0R90?0S=0?0S=0?0Q>2QK0?060SF0S=0?0S=0?0S<1?0SK0S>0;500S:0<4R:1J0000031R1201QM0S?001Q7134H60091f02mC1M0TC:80ZJ2Y30C710Q?>1:S70>0Q58QE1QI0:1R11QO5RAH305012QAQNRH;Q4:]L002:2<2<2<1SW?2YL0_I5S83RN0m[A0;100K1RA1=Q1S52S<1;0Q40TF0JAQH3Q30RN0;0Q30TD2R03QB0S3482SO1ci?0h0?X=000Q>0Q<1R20gK0QTN50Q908cL230U41aJ5Q50I4\\>2R5:Q@3UO0Q80R71SG1QM0R;082S71UA1R?1?0G624RH201<1RN020SJ1WJ1SM0SE1SB0X<1X1130TK0RB0A0R@0]40X1001R@0]81F0UW;>[VH0R]O4QJ6aC1a1@R?1_oM30601Wh0Q=1F`O2257716M3Sd1QMV16[F0QL3gM1fO6S<202TFQ305049S>030Wl<0;0VG0E0RI5>1[>1;0U50H:32V60W619080QI304801011103010011020217240004;:1100100A011A5000121401131:14110410001C14503103010150010000050205091>01030003200:1Q?280=0=0[C1^>2B1QB030QVI0;0bH000S_[90V90TO1;1=019R:I01F0C018D1U=Q11S?11021RB120X60QN:50G6117;0131031<110718042;27210003050205REQ?R547123920012019W2;30XJQ>090UHS?<294QG6>1:58:Q305049WnB0VD0QgY:0QlnEI_J4Q]?3hQc;RO1SloK4Q8Y`M0VJ0?3ScSF0QK21012SD11:DB2032026000G0V8130D031U=224RB0?280:0aN01077508912QG0QL10100@20<W42Q98R@XhJ1V<32010`81D1QA;Q:0B0<071@1417040D0610030106031K0Q20003200QL2G0=0jJ1QB030SaU=0V90UM019R:I00G0C01402D1U=Q0;80R50E;Q:34;@202R6000UJ1QN<30GA0I1<0RERDQ?R550221233:168W2;30XJQ>090UHS?<294QG6>1:58R>U9030Wl<0;0VG0E0RI5>1[>1;0RN0R50H:32V60W619080QI3050;0SA9SE1:000050205091>01030003200:4Q<280=0=0[C1^>2B1QB030QVI0;0bH000S_[5WO<2N0QK5;1=019AQHJ>90C018038]A4YM7X9Q?SOSC;RDQ:;3QG795Q77MRA;Q>090]HWOoMQ9UG0`G1k=0]H0cE0T80RH0g?0SN0RZ20QG0c20\\=0R30Tl80Q:4S61RL2khE0Q_E0n10E0T80S;0D1eSJ0RP?1Q^:0J030QV60Y40SC1_A2QV>0dU81QTK100lZG1QU@0jC2kNQ0RNQ0<0bAS?71536000C0VO6U50Q51QA12Q=00010108J35@9:00Q=D?0S47051103O100MLRH:0=Q:862G3080206>0H400:4N@Q9QHQF00037302691L0107111E0600232001511100<1023G4005311E0601010132G300691200;008020E06010423700120>13;607107111E06010420105111>1023A:005220321000121222;4001220220DD5207020F0?2023B2101139690:020F0904211001G1013902=:020Q8100142020132093I110A2G08001681566912;Q?01:77<Q4100040G0009018014008913OG1J00000=0Q3A04014Q@7050<Q4Q<3050111H132?3<01150>0Q700401[H031600031Q8031Q0031600031>0QH031R24L2I5RE151dL2RH6A<B218A=<02>QC106701:829595:495RH641Q1004R59N33123105602Q914:Q;3I5:2QH112QG00800175<9595=REQ?93270L8;1O315QG001200<Q?714>2QM4Q:1::0<0630502104UOQOXE151Q515170000000N1QD0>0=150B12080:4G6Q@?11J0<2Q0QNT;3dIE:DQhC1O0ZG214Q<00401QG61>F8606060606060606Q0RMQ1I0RH;VEIQI5?0RE3S44Q:0RM0RE8Q?0lc<2QF8ZKCQ>309O1R?157V=110007D?02030H14395QG7R39;G<0Q57H:0;M5Q?0131110<0:360H0Q85111:20700191O0QB0021141000G@17:5151586060QK3SD0103295Zm3;F3Q@XX3[=1S9Q56;4400G040001010SL?]L1QE60O??9EQ20B03340T63TL1N251515122606<11;0I0B010>1=Q1SJ423Q<2RG0<20Q>Q<T2L2Q@?J3Q38M4Q59M0Q43=Q9TM195Q33Q33Q77QC:;0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F0R778Q?B014Q02J40QOQG3C1Q>>3020L98686QOOQ45;8QE2L1J4I63;6R?R8QFQB<QB6Q9;95Q57G71V?N0Q92011?2QJQ77E:8EA33Q5KCF800QE>63M0110;Q@311103=H698Q3408A7Q202:QC8007310?0C:A0K213501QN600030>0:5Q>02<97107111E060104200003111120;6K900100Q50001>001200201Q6QG71200D0002MQ?01500100101379U5Q>0153101JQ3QB710013:95<BQ:000171595CKJ2001308FUHQ>8010S3RB;71017010G0401530289R571Q97303J09Q7513780512Q=<018<R869UEQ1=9580Q5=0059L2OH06010R:6010Q5D08955010Q431000069YEB138>0Q3712FRE0>QA<lJS5S>04:V3Rb;S2<QQ?@5HSlJ4b6VeHM;229Qf5aH6N093R@095M609Q?6>99060D4B]?QIV5RJS4R:4QG:<QO3KUoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<28691010SjOWI5]CTKSCQKWE9Q61QK42E16M3QLDR120SIC;C;RF8HT6RD0R6011011130;00060R00317060K030400260ZC1Y31aAQF3QA70=06QSCN55X4QMTAQ<961931YOMAQ;3940^?K39VEM1:30^O603010>0V418Q?R3603931h@R3R;QLV130J0100100903000050300000020100100000000001001306030300090@42040@QC1X=Q;3S3;>1>0>0Q49U=QGL<Q;3861=5TInG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0S5QP5QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TRO[Gh0S?XB6X6Q<00010100R7:Q?D?0S46151103Q20MJRJ:QI880G3080204Q:2QJ8Q9G0OQF00037302691L0QI00013708091I011QH031311220M120:1QH0340130C1E500QI00103706291M0QJ000;080Q7020QF002420361:1L0QI01100220361:1K1QH10013708091L0R7030120070R@016;7S1018:6R81J00000QF=04014:0Q380S53050111H132?3<01150>0eN2mA3K2L1M1QO106701:80Q<200SD1Q10SE2318052VJ110QI0060000175910Q?NQ@3Q?932Q58;1O315QG0012004QG711TG20<06305021V5QO`;0V2Q0RoM2T<0ROOa95S81m^C309O1R?1X?02030H140TF1IA<0Q57H:00Q;2Q?0131110Q30R251111;070Q>0QB002114100Q9170W=01030ci?0g0???[=1bL0W10TD4Qd520143Q7230U41aL3R04YL1R>3R5:Q@3SJ0QE>Q801192Q@31160QL2Q3407QM0;1QC8007310RN2135010TL027D1QH10000;080=624R20150010023200=1RD71200F0R@01500100101W:0135101J1RD71001S900017S40001304X2801WD09330T?31130O9Q7513708512Q=<01\\E60500RAE160101SI520010600R712000ZJ1:1QC442F0UW405>[V7;22R]O4QJ6QPG0QN3R@0:1cU:1Tc0Q=1F`M4257716M3TC2QmJQF3QA70=0E40>QZ?60@160104S30TO6[F0QL3_K3WM1fO6S<6hUfDROSOW?6Q@965I5Qoe8965I53[o@119_@01[oB1hIQ@96I300IQ>09000104F0N0^93;=46000@SD01130054000C0RB0T:041U50Q5105Q87Q<000101007J33L:4R93S507190B10?QJ1S4=QE30101Q=AK3:4G057R:0T0190B07111E0600231811137031041;90001205311E06010101100431122063006?:208020E06010419020210>319860207111E0601041811126231041900?105220321000121222;3422031050=9?<020F0?1802036102101319?307020F09041802036151031902;<020QB020443641995020A2G080016203500075911<QI4>09Q6100040G000F1400060913O0F159:00000390Q33C0A0Q380QHR95R=1Q500401Q:0Z<031600031Q8031Q0031600031>0QH031R21288=??RE152c;1@0I4R:2:6E8E:C;<0201;RC203119Q020:5RH6Q:4R59N0;3;9Q714:Q;3I5:Q4K3QN0L1:59<07=0?Q@R<29@8;SC;QG792Q@1:4Q:12?20Q64`E151Q515170000000N1QD0600220623153<4206>1Q@1B0K0<0?<QB<302;@0301900155000000?134430@Q8RcFW458;Q500401QG60>G86060606060606060O`42H>04143RE160RN4Q:0RM@OQ??_OV]OQOed<R2Q=1X<2KCQ?390SBQ481S61R2110007DQE30BQC;R5995G200Q@1Q3;L2R0=:5N0QF8=195F2R8G21?1495151586060Q:0=5SJ01195Zm3;F3Q@XX3[=1S9Q56;44;0<040001010S;Q0[:AQO1QEQ7;3???21G2O40T6B96I300I9RI25151512Q2;0I0B010>1=Q1SJR4QDT70T1L2Q@>0NO<M4Q:4M1Q33704Q9TM195Q33Q33Q77QC;:0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F9F8NR0B019E9IR5QG51QO30147020L1230OL2LQ270MHQE9E9B<AS=R8QFQB<QB<Q7795Q5240FWIQ90121?2QFQ0907Q0NEQ9DJF8R6N?8QK60<H695QD09337Q3108R4330<00Q2A0Q453QM600030>096QJ495307111E0601040911121050461624:900100Q50900100307<1LR:4933MR50079U5QE18F5Q1R020:9Q5QH695CKJ1>3956UHQJS4R9D71017010M0118;9R571Q=1701JQN707R920AR8V6Q0>9580Q<08>9GM1E0=R86010Q;2001087955010Q4010569YEF8@0Q824<:RD0R>lIS5S>@V3Rb;S0>QQ??E9SlJ4b6VeHQIQf5aH6N095R>095M14:QF83;98D4B]?Q<29V5QOSOR:3QH6@QO101:1=UoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<286921TR@9`5Q=1F`M4257716M3TC2]JRD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H071QA_OQF3QA70=0E40>QR?N55VD60@1601044QMQ00S?Q<2=1930Z0N@QI^EQ9VEQ:_4603010>0V4:6Q8R;39QU530J0100100903000050300000020100100000000001001306030300090@42040@SYC9QP5QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROegZ?W?e5R1I5IQ>090304F0N0^93;=46000T040113005002000C0RB0T:7U50Q5105Q8R6J33Q<Q:Q210S200>1619210?00MLRH:0GQ081304E308020FH6:4G05@Q9QIQE20A069>?37111E06002320?0<102=19075311E06010101N300B2?8020E06010420A0>1F0:7111E06010420M102>0@005220321000121222;E0QC7020F0?20I21011M037020F090420N101>1@8020Q810?04272G54A2G080016QIQ?01;6QI100040G000901801400D3O0QN70Q3J4SBQ:C0?5332021623<;0@Q500401Q:0Z<031600031Q8031Q0031600031>0QH031R2Q4??RE152c;1@0I4R:2:6A<B=A=<02>QCQ2030R2RH6Q8004R59NQ@M14:Q;3IQEF8QDRA0RLQ>@7QEM<19Q;IQ3Q829Q31:4Q:12Q830501204UOQOXE151Q515170000000N1QD0600220623153<4206SC0<0?<S40301900155000000?134430@Q8RcFW45321;Q500401QG60?F8606060606060606a52H864143RE340RI034Q:0RM@OQ??_OV]OQOed<R2Q=1X<2?91CQ>?N1R?Q681S61R2110007D?02030FLQC=QAQM52001:K9FHL6Q>K0?409940Q8F207CF202QA0021141000G21:62;5151586060Q:0=5SBLZm3;F3Q@XX3[=1S9Q56;440090<040001010S;Q0[:AQO1QEQ7;SC40T6Q3I5I:RH25151512Q2;0I0B010>1=Q1SJR4QDX:L2Q@Q>O<M4Q59M1Q33704Q9TMAQ33Q33Q77QC;:0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F9F8NR0B019E9IR5QG51QO0>3020LQ9L2LQ270KJQE9E9B<AS=R8QFQB<QB<Q3Q5K8FWIQ951?2QJL907EQ9AQ=DJF;QDQH110<Q<OHIQ3L0107Q220;Q?=3D000Q2A0HB1QN600030>096Q>Q57111E06010420A0;4M900100Q500H000Q;QDA3C2MQ?C100UGQ>Q83Q3Q?C0QJQ:<0R6JQ46UHQ;SCQON71017010G>000RM71Q6?000K09Q760D0:Q=B0AR8V6Q0N80Q4@0Q@MS?6010Q5D0H5010O=0Z6B>00<0Q1SK0R>lIS5S>@V3Rb;S0>QQ?@5HSlJ4b6VeHMQg1aH6N@R>@MAQ??3ND4B]?Q<VBQOSOR:40R1<QO100KUoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<2869Uk5RD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H07QiCN55X4QMTAQ<96?0Z0MAQ;_3KW3M10_>603010>0V4QJR360QUC30J0100100903000050300000020100100000000001001306030300090@42040@TZ3QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROE\\P61H8=2n4V]OQOd_OfWO[=1S9mX90JUoG7QVEQ89YS6\\;cX3QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TRO1XP<17Sb04SJ4Rg?210QTWI11001e3S1IQ>09030Q3G0700000000000000000000000000000000000000000000000000000001000000000000000100000000000000000000000000000000000000000000001000021000102130102210100000100100102000111250101000000000000000010000000000000000011000200000000000000000000000000000000000000000000000000000000006101100300000000R40Q361M4RO0Q:0002013A0JQ20122000000000000000000000004001011QBQ?000000000000000000000000000000000080000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Q?Q8Rj6Q:03gG5RT1800SDUOR000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087597777597777=17777774015022017311779201SH0<0?<S<02120J03030117330Q0?30j:IQj5Q?00210000003001072000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001600030;Q50040nXB000000000000000000000000000000000000000000000B000000000000000000000000002T4000000000000200000000000000000000000000000000000000000000000000000000000009000010000000003000100200000000000000000000404000000000000000300010200000000000E20002iDQ:0=5R?ciO6;4QQ8IQV<Q7T7Q3TJ:0>0601^20120Q908QX4QBSLERiIOe[OOi\\III60AIII300060:IIIIIIIIIIIIIIIIIKKH05IH05IH05IH05IH0500QiC90C55X4QMRUCQ1T;Q;0?2N0L000Q<030Q40N0fG210I112`>2V`<0J2:020<0=3D4:4R0<302134A03019001550211102052=00R3G0501313O0051=X;73C1RI0MJ00G0:6]L1;935311124=00015:741QH000L382Z?QOWO_OQ?D15QcnK0iF500U10?2L000L000T2053S]01Qac?RD0R6011011130;00060R00317060K030400260ZC1Y31QAU_O30J0100100903000050300000020100100000000001001306030300090@42040@QC1BQo^@O`=1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1LQ1>96I300I3Q1600010001303020F0N0WhGG7>1B09Y@f?TOcEMQS;_OSO\\023H>0QcX<1X41594A0S30Wl71G1=Q2030T20>0WjK7H1S`60^83<2Qca03UL030RI13[d0I0RH;VE1Sl_6IRHQ10;0?0QZ80TB2UC0Q:2WE0QL00021Y41Qg31hE031h40V51TL1Q<040YI1[13U119111L2UJ1R01m30F182SU>2YA0<0E1]<0mWK0X=1W2020[M1RE1RN0TG1TB2T?1WH0da5011QJ021U80;0?0R00RgC1QWL4Q;3UL1SD3SN2T0150?1RG101S;0Y91SD1[D14>S81WH2`4000WJ1RF1]31eC1R91bi81T40R01:0a81Y70c`50W_70Q2S91V30XH0M0QC0C0YO0S1000VX80QB0<020T30TL0]40VE1RiA0SYm41QA1QA1QA1QA1QA1QA1QA1QA1QA1QA1QA1QA1RT50Y@1I0SDQ109000:120iM070`00QH0R70=002UC0Q::00W:1QE507N0X41QWC1U;035YF1hD7h40SK2R61TL220Q6311YI1[13U119102L2UJ4QM1m30F182SU>2YA0<030900121];1mWJ1X<2W24[M1RE1RN0TF2TB2SN0?1WH0da5011QH203U809000:120R0010QQI0Q?0QT50V60YE1TG5R35RH3mG4Q;3UL6S?3SN2T0150?1RG4S;0Y91SD2;1[532>S81WH2`4000WJ1RF131\\M2Q<0d41R91QY:4a_H1T40R0290a81Y61c`50W_63A]P0V]OQOd_Of`=1000190000112RQ^EQYfOOTQI5VM1Ud1=WY@>c=T]1Tj:4TROd@R1IS4F06Q000000000000000000000000000000000000000000000000000000001000000000000000100000000000000000000000000000000000000000000001000021000102130102210100000100100102000120601010100000000000000010000000000000000010100200000000000000000000000000000000000000000000000000000000006101100300000000Y00002070500200010@08Q20122000000000000000000000004010011QBQ?000000000000000000000000000000000800000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001Q5Rj8Q50040fARERTB05Q:12YO00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008775977775:000000077R73;3;3;4:3X50302212102450000003139140I?B0iAIQi?Q?Q?0021000000300107200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700030nZ<000000000000000000000000000000000000000000000B000000000000000000000000000T60000000000000200000000000000000000000000000000000000000000000000000000000009000010000000030001000200000000000000000000404000000000000000300012040000000G0ei:IQV4Q7T7Q3TK:0>0601Qg9QBTLERiIOe[OOi\\OIIIIII00110111307III1031706J103040026JIIIIIIIIIIIMHQ0HQ0HQ0HQ0HQ00TYDQ1RP=I5I5I4VP;200Qi_??jPg?W?:94A0S30I0U^N0R[N:L140Q>0SlO0i0Q@96I300IQ>09000104F0N0^93;=46000@SD01220054000C0RB0T:041U50Q5105Q87Q<000101007J33L:4R93S507190B10?QJ1S4=QE30101Q=AK3:4G057R:0T0190B07111E0600231811137031041;90001205311E06010101100431122063006?:208020E06010419020210>319860207111E0601041811126231041900?105220321000121222;3422031050=9?<020F0?1802036102101319?307020F09041802036151031902;<020QB020443641995020A2G080016203500075911<QI4>09Q6100040G000F1400060913O0F159:00000390Q33C0A0Q380QHR95R=1Q500401Q:0Z<031600031Q8031Q0031600031>0QH031R21288=??RE152c;1@0I4R:2:6E8E:C;<0201;RC203119Q020:5RH6Q:4R59N0;3;9Q714:Q;3I5:Q4K3QN0L1:59<07=0?Q@R<29@8;SC;QG792Q@1:4Q:12?20Q64`E151Q515170000000N1QD0600220623153<4206>1Q@1B0K0<0?<QB<302;@0301900155000000?134430@Q8RcFW458;Q500401QG60>G86060606060606060O`42H>04143RE11120RN4Q:0RM@OQ??_OV]OQOed<R2Q=1X<2KCQ?390SBQ481S61R2110007DQE30BQC;R5995G200Q@1Q3;L2R0=:5N0QF8=195F2R8G21?1495151586060Q:0=5SJ01195Zm3;F3Q@XX3[=1S9Q56;44;0<040001010S;Q0T:5VIAQO1QEQ795???21G2Q0000200000000SMB96I300I9RI25151512Q2;0I0B010>1=Q1SJR4QDT70T1L2Q@>0NO<M4Q:4M1Q33704Q9TM195Q33Q33Q77QC;:0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F9F8NR0B019E9IR5QG51QO30147020L1230OL2LQ270MHQE9E9B<AS=R8QFQB<QB<Q7795Q5240FWIQ90121?2QFQ0907Q0NEQ9DJF8R6N?8QK60<H695QD09337Q3108R4330<00Q2A0Q453QM600030>096QJ495307111E0601040911121050461624:900100Q50900100307<1LR:4933MR50079U5QE18F5Q1R020:9Q5QH695CKJ1>3956UHQJS4R9D71017010M0118;9R571Q=1701JQN707R920AR8V6Q0>9580Q<08>9GM1E0=R86010Q;2001087955010Q4010569YEF8@0Q824<:RD0R>lIS5S>@V3Rb;S0>QQ??E9SlJ4b6VeHQIQf5aH6N095R>095M14:QF83;98D4B]?Q<29V5QOSOR:3QH6@QO101:1=UoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<286921TR@9`5Q=1F`M4257716M3TC2]JRD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H071QA_OQF3QA70=0E40>QR?N55VD60@1601044QMQ00S?Q<2=1930Z0N@QI^EQ9VEQ:_4603010>0V4:6Q8R;39QU530J0100100903000050300000020100100000000001001306030300090@42040@SYC9QP5QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROegZ?W?e<R1I5IQ>090304F0N0^93;=46000T040122005002000C0RB0T:7U50Q5105Q8R6J33Q<Q:Q210S200>1619210?00MLRH:0GQ081304E308020FH6:4G05@Q9QIQE20A069>?37111E06002320?0<102=19075311E06010101N300B2?8020E06010420A0>1F0:7111E06010420M102>0@005220321000121222;E0QC7020F0?20I21011M037020F090420N101>1@8020Q810?04272G54A2G080016QIQ?00<6QI100040G000900901400D3O0QN70Q3J4SBQ:C0?5332021623<;0@Q500401Q:0Z<031600031Q8031Q0031600031>0QH031R2Q4??RE152c;1@0I4R:2:6A<B=A=<02>QCQ2030R2RH6Q8004R59NQ@M14:Q;3IQEF8QDRA0RLQ>@7QEM<19Q;IQ3Q829Q31:4Q:12Q830501204UOQOXE151Q515170000000N1QD0600220623153<4206SC0<0?<S40301900155000000?134430@Q8RcFW45321;Q500401QG60?F8606060606060606a52H864143RE520RI034Q:0RM@OQ??_OV]OQOed<R2Q=1X<2?91CQ>?N1R?Q681S61R2110007D?02030FLQC=QAQM52001:K9FHL6Q>K0?409940Q8F207CF202QA0021141000G21:62;5151586060Q:0=5SBLZm3;F3Q@XX3[=1S9Q56;440090<040001010S;Q0T:5VIAQO1QEQ79SF000200000000SMQ3I5I:QG1N25151512Q2;0I0B010>1=Q1SJR4QDX:L2Q@Q>O<M4Q59M1Q33704Q9TMAQ33Q33Q77QC;:0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F9F8NR0B019E9IR5QG51QO0>3020LQ9L2LQ270KJQE9E9B<AS=R8QFQB<QB<Q3Q5K8FWIQ951?2QJL907EQ9AQ=DJF;QDQH110<Q<OHIQ3L0107Q220;Q?=3D000Q2A0HB1QN600030>096Q>Q57111E06010420A0;4M900100Q500H000Q;QDA3C2MQ?C100UGQ>Q83Q3Q?C0QJQ:<0R6JQ46UHQ;SCQON71017010G>000RM71Q6?000K09Q760D0:Q=B0AR8V6Q0N80Q4@0Q@MS?6010Q5D0H5010O=0Z6B>00<0Q1SK0R>lIS5S>@V3Rb;S0>QQ?@5HSlJ4b6VeHMQg1aH6N@R>@MAQ??3ND4B]?Q<VBQOSOR:40R1<QO100KUoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<2869Uk5RD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H07QiCN55X4QMTAQ<96?0Z0MAQ;_3KW3M10_>603010>0V4QJR360QUC30J0100100903000050300000020100100000000001001306030300090@42040@TZ3QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TRO3SjX0R;39317Q`O0O0V`=0S_@0S^eMR;39312RQY@QC:05h40Q;0Q;0RP^@QC:03RUh0J1>3FQKQ`04050=020O09:I0S;0Q1R?Q?W?N014R:0LQlb?SB?[:1R?1QE60O?S?40T6Sk2NR22QF3QggO30J0100100903000050300000020100100000000001001306030300090@42040@QC1QGQ`040VF0Q1R?Q?W?N014R:0LUj>0S_@0QcX=SB?]L1QE60O?S?40T6o2KRk3NR22QF3QggO30J0100100903000050300000020100100000000001001306030300090@42040@QC12RRR0E084QYAQ51QA12Qm\\245h80a7Q51QA12Qm\\242RRh0QE264UG0[[G1QgV=QE262Vh0R<0QA2QYe0RGQ`X7aH2Rjf@M152Vn0QC73>R\\0307111E0600231811137031041HKeL0QdC1@1I307111E0600231811137031041HTf@00011007070103012QRoH04RWP080Q<0=9L3g:1[`HQ:S?O?f7002<0?1[XD2390<931050V208Q:S?OQcT41XI43RTP0R=3Q3801ZP0WO2V`0K113V`0K11QSm>01Uj0C2UiE18C2RTX0QD0A4R_69Qb?9RPUEQD0A3UP0cOa?R5RP]I?1RPe0Q@5UG0Wm1010S^B0QeS=Q@4QZ`0QF8=19133Tm0RE15QUkAR?8h020051E1:1TS=RE15QUkAR?1RSm@K3o2=ZT?SC46:UG0b702100S;1S;=ZT?SC46XF0QeV7K1R[l@S22RPX01[d=S26RRP05100Q;0120109RPX023Q<28QeO5100Q;012010:QP0T41U8Uj?:TO0R;0TS6OnQOROel=1Qh_OQMQ00BeL0R220000001040W=Y?Uj?:TO0R;0SN0So6OR20moKROel=1Qh_OQMQ005RX0R@3>1IQWjOOl_O99eL0Qb2RB1Q:Tj?Q601oE0QQiN9U5Ol_O98RVX061017010M011;891RVP0QK3R[4;QWeO9kn5QK1RQP0R?5S_P0S:4<286913:UG0b>100G1ZhF0SS^2S:4<2869172R\\P0QRE9SlJ1RQX0Q73UG0b<0RP_IQ71RSo0FQ4T`0R8031600031Q8031Q0031600031>0QH031R21O2IV_5F8606060606060606oY1515158606R_U@603010>Q5h>0Sg@R8031600031Q8031Q0031600031>0QH031R21O2IV_5F8606060606060606oY1515158606R_U@603010>3RSZ0Q52L716Q`<0=020RQhOQ52L71:TU0Q500401Q:03Rl?Q:12TQOQ50040=UG0QV@0RhEQ500401Q?Rl?Q:12lI0SU4Q50040X206[P0ROS\\lO60@160104@UG0b:000[M010X00Rk@0SjM0Rm4RO_20nQ:0R^\\?60@1601046RW[05010Q40105698UG0RU;1RToI5010Q40105697RWX06010Q;200108798R[41RTlI6010Q;200108791RPi@J5UG0b;110Q70QooMJ?RTh0307111E0601041811121050461624IRZA1@1cO=TVK001M221oE0Ql`>307111E0601040911121050461624SRJ100Q4k@3021300300002000C0QN=?VY54QA434RC0YOE151Q515170000000N1QD0>0=150B1208Y60QRaM0e^IR>@0QdRNR5Q<UG0b7110000090Q=010Q971300300002000C0QN=?VY54QA434RC2YME151Q515170000000N1QD0>0=150B1208RM0V70QRaM0e^IR>@0QdRNR5>Rd1208020E06010419020210>31;66ARZA1@1XJ208020E06010419020210>31;66QWY?91RhX0QI2R[50RelIQI@R`1205311E06010101100431122063006@CRZA1@1TJ205311E06010101100431122063006@QW]H9>TX0WOWa=1X0RMS@NR0Nmg0Ld2Zm3;F3Q@Ym3N25151512ETX0WOW`02390<=250V20QDRMS@NR0Nmg0Ld2Zm3;F3Q@Yb81XI4QIN25151512F[d0I0RH;VEQ>000H8=3n3V]OQOd_OfWO[=1S9mX71;1QTP=QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROQ:UG0[^7I0RH;VEI?020<0<0<1058UJ0TC?OQ580Q?Q7QGQ@>;QB0RGH94RON0V]OQOd_OQgO7d_G[=1S9k:1XI4lSK1;1hk=AWfM1S]=QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TRO1Ui0D1Ui0F3RRW0B01449Q\\AQF7J35QmY7I0400010109:h71d7QF7J35QmY7I04000101096\\R1RE52Rok0XNA0L2`U<0A\\P12390<?500312RE17RI1QcZ71XI490Q<1Q\\S0XNA0L2`U<01RaP0b65Rjh0R599060D4B4ShX0Q<2=19313RST0QB<QB657XRJ010S^B0>0QgaMQB<QB652RPh0Q3823QZ\\0R=19313QZ\\0R=0:312QZX0Q=001QZX0Q?>\\U1RI12W??V?Q>0RGQcP=90Q<Q\\RA3060100XN2QA0=3Fh50L0[VL2390<?50031RJ32ROW??V?Q>0RGQbg<1XIQNQ\\R?3060100XN2QA0=33RWh0@0Q82L8RR`030147020L1239684Ul0RM1959_5O2RT`0A0Q>4Rg69QWYO9j^5A0Q>3Rko40VhJ^EQ80=ST0<020F09041802036151031902ERZA1@1hI<020F09041802036151031902SnK00150F000QRiJ51RkZ0QI2RTT0R2905R[69YV00n_M9jR5R2905Va0QN0L1:595=;Sd1100040G000F1400060913Q7R1I5IQ>0>04F0N0^0Q64V`JQ55Q@434<0R5R0WO[@0<0?<T<150J0@Q8RfFOne1S52R2110007D=i?Q:0803clE6QPII5IRQ450Q908Qej4N55R1R1I5IQ>0;0104F0N0^020900200800054J>0100;0126101Q50403<XD1QV91Qm70SP3Q55Q@434<0R5QH06WOY>0R00<0?<RB0QH150J0@Q8RfFO\\F0nW77IS52R2110007D=Y=0`0Q:0803clE6QPII5IRQ450Q908Qej4N553WP0QG2>225VX0N0;3;302;6R[50SlIN0;3;302;3RQ`0YF8E974RPX7Q<QV;YF8E977RPP0;0I0B010>1=Q1SJ:RPP0;0I0B010>1=Q1SJ423Q<282QYV@Q?ne?05eL0?0[YK1mV3Q?ne?01RPd0L2XRJ0Qha4L2RRY0I404UG0[[H0Qfg=I401RTZ@Q64UG0RU;;QWeO9jXEQ61RWg0H2RR0K103Qb00_NK102RRf0Q63;3Qb00RQSNQ63;3RWS@O1E0=1Rkb0RJ2SjP0V41?3RR]0G3C1Q=1RR\\0O2XRM0QjY1O7SX0<020QB02053?1I<RZA1@1lI<020QB02053?1ISjI0F0QRiL22RU`0R4:93QZQ@9k^5R4:96VP01100C5RH6Q:Qo]D<7VP0I5RH6Q:Ql30Sn@143QibC<3Rjb0N09313QZg0FV8Q=195RTd0600030>0:6Rc69RRP?600030>0:4TP0TOQVYONS0OkR?C5TP0TOQVT=0U@NS0OkR?C1SiV@Q93RV]071Q=1:9R[41kO9SoH07060QRiD5l[971Q=1:1RRd0O2RRT0N782RUP0RK042Qn0QJ126Q`<0=020\\OQJ12QmYM12Rko10`\\=\\;1Ud0L1WR@Q?2Si^@Q:303R[41SgS9Q:301RSP0R83XRJ0S^D0Qg^>R8>Rh1207111E0601041811126231041ABRZA1@1\\J207111E0601041811126231041AT[10F02RQU@Q33Q36h101050R;0RPZFQ33Q32RQT0M191RSk@I3Qb00RQU@0QSLI1RRS0O1RVf0QH1RPj@Q:6UG0b704290[>0Qof;Q:1QZR0QG5VP2100RQ80SnA0nQLQG2RRk0B473RRl0A63;64Qb00RQYNA63;62RRX0K203Rkh0R:3QH6@2RRj0E172QZY@Q3:02RSX0Q7797Q`<0=020O0TB0RQa:Q7792Ue0R:2:1Ue0RH2RP0Q=1>3RP0Q=1>Y_A01RRc0O2QZT0R57;3SfP0d;>40>1RQR@Q?2UG0RPlGQ?1RT\\0RO8RZA0Tl40001110QRj>510jZ6RO2RU\\0QE1Q52RTe@QJ494R[41QWf99jcEQJ49=S\\120A2G080016203500075912RPo;C?R[41QPJ20A2G080016203500075912SgL0QmW=C1RSi@Q92Qb00RRW>Q91RSh0Q72RTV@H691RVb@RB2Vl0QOWO72RVn0Q1=98h01008010K020RVT=Q1=91QZP0Q<3R[41SO9QW`?Q<4Qh0=0QK12X?:Ch311100D0126100fJ0=110O09:I0T>=0QK12X?:U\\<0003Uk0<02014UiE1Q8<02012RUd0QI594R[41QWf99kb5QI592VZ@M146h014120SYB9RX5M144V\\0Q;3I5:21BRl2105220321000121222;3422031050=DRTn4QA<0IRZA1@1`K105220321000121222;3422031050=DTVN0QSPG0j`<000QF1ST2QA<04Rko00NUoG7gO_O86[o@?_>0R__?0NUoG7gO_O82QZd0R2G4=SP0<020F0?180203610210131968ARZA1@1dI<020F0?180203610210131968TRI0F03[Y@QG61=07h20001000Za5QG61=02Uh0E803Uh0E80D11Ql0QA7Q`<0=110QO9XEQAQmaO0902S`1QI4K6eL0I0Q:0Q<0Rf>QI4K7Sh0R70Q33Q60Q30>06318Sh0R70Q33Q60Q30>0631XQ<32RUT0R7796RZA1@1Tl;0QRiL9kR5R7792Rjc@R>091RQ^0QC7h1010108000R90RPc0QC1Shd@N2eL0SgnBN;RTl0900100Q509001003090171@SW69TP1000QRiJ5UJ0jd=900100Q5090010030901712RPl0M001QYX0Y;8RQ[@:0>06010:0>06012RVU0RB;02Shf0QI402RPm0Q33=4RXP0lIS5S>04:V33RSd0Q902117Q`<0=020QO9RRPEQ902112QXP0QT<2QF7\\P114917VN0kh3QT<2QFfdI41RV`0R7Mh0S?XD1^3:I0fO3TZJN`020<06305021V5QO`;1V1Q0SiH3S:1Qc[4??=n>0W10TRI0Q^n3Q=1F`O2@716M3h[jAW?Lh?0100;0126101?010A0403Q_?1TZJNgBQE0004`;1V1OQgX???=n>0QcX1Q=1F`O2@716M3h[jAW?U>0R0I5IQ>0>04F0N0^0Q6441CSC0805000cL050=020O0TK0`30T01QVH0\\D3Y10Q_>2R61V:100QV<0<063050210h4;1RF0:2:0>@Q0QNQ502150J0@Q823dIE:DlOWOcC1O0S8_ORM\\AD000H>733RJ120RI1TB?OQ580Q?QONR@Q>0RGU7V]OQOfWOQ1S52U49WC0TO0\\:0=1d^A1V?9EQ20B03TB00OI5I:90Q<1QO60694X123Q<28R?<QBQ<W3JQ^]33SjKWI5]CTKSCQKWE9Q61QM2@716M3QLVDC;C;RF8HT6RD0R6011011130;00060R00317060K030400260ZC1Y31QAUS@R3R;QLf1Q;3S3;>1>0>0Q49U=QGI01<Q;3861=5TInG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0S5hQP60MROTO0R0I5IQ>0;0104F0N0^02090020080005441CSM05000cL0VF0`30QZK0\\D3TQ6;1Q00N0901060:2:0>@Q0QNQ502150J0@Q823dIE:DlOWOcC1O0S8_OF0G1903000I]1020<0<0D0`@GN0Q@>;3U094RON0V]OQOfX7IS52n?0=1de39ED1;0B03TB00OI5I5SN60694\\A<QBQ<Qb`2WI5]CTKSCQKWE9Q61QM2@716M3QLVDC;C;RFJ6T6RD0R6011011130;00060R00317060K030400260ZC1Y31QAUS@R3R;QLf1Q;3S3;>1>0>0Q49U=QGI01<Q;38F5TInG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0S5hQP60MROfIkH1536000C0\\<0Q51QA120QF7J35:X=0QK1S4=QJ1Q@1>0K100:4N014W<07111E0600231811137031041H1205311E06010101100431122063006@9208020E06010419020210>31;660207111E0601041811126231041A9105220321000121222;3422031050=D4<020F0?18020361021013196E020F09041802036151031902;<020QB02053?1I020A2G080016203500075912;QI3LQ4100040G000F1400060913OR70Q33Q60Q30>0<Q4V500401[H031600031Q8031Q0031600031>0QH031R21O2I5RE151dL2RH6E8G8C;<0201;RM19595I5RH6Q:4R59N0;3;302Q914:Q;3I5:2QM1R00L1:595=1NQ@R<0U57QK2>2QM4Q:1:7Q:4`E151Q515170000000N1QD0>0=150B12080S40;1J0<2Q0>Q0>T;3dIE:DQhC1O0ZL4Q<00401QG61=G86060606060606060SMQ1I0RH;VEIR?0RE1S64Q:0RM0RE8Q?0lc<2QF8ZKCUG7V=110007DQJ295QG7R57;5SC:M2R=0:3Q00QF8=191S6GK95151586060QK3SM195Zm3;F3Q@XX3[=1S9Q56;44I040001010SL?]L1QE60OQ95QB0B03340T6100UM251515122606941;0I0B010>1=Q1SJ423Q<2RG0<20Q>Q=T1L2Q@>K3Q38M4Q:4M0Q43=Q9TM195Q33Q33Q77QC:;0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F0R778Q?B014Q02J40QOQG3C1QA0147020L1239686QOOQ63;8QE2L1J4I63;6R?R8QFQB<QB6Q=795Q52L71V?N0Q90211?2QFQ;7Q9EIQ5KCF8R=3Q38R3901H695QD0A7Q68RO0C:A0Q>QM600030>0:5QJ495307111E0601040911121050461624:900100Q509001003090171LRK04MR779U5QE1Q5Q1R4:95<BQI595CKJ1>3FUHQKS3RB;71017010M011;89R571Q=1:JR77RB<R869UEQ1=9580Q<0=9L2O1E0=R86010Q;2001087955010Q4010569YEH6@0Q82LRD0>QA<lJS5S>04:V3Rb;S2<QRE9SlJ4b6VeHQIQf5aH6N093R@095M159R599060D4B]?QIV5RJS4R:3QH6@QO4:1=UoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<286917SjKWI5]CR;Q=1F8SCQKWE9Q61V1DR5SIC;C;RF8HT6RD0R6011011130;00060R00317060K030400260ZC1Y31eM>40>QR?N55VD60@1601044QMQ00S?Q<2=1931YON@QI40^?Q9VEQ:30^O603010>0V41?Q8R;3931h@R3R;QLV130J0100100903000050300000020100100000000001001306030300090@42040@QC1X=Q;3S3;>1>0>0Q49U=QGL<Q;3861=5TInG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0S5QP5QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROegR@0MROSOW?Uo`?"
143
+ /** Simple case folding above ASCII: per member of an orbit, its gap and the zigzag step to the next member, doubled, plus one in a pair. */
144
+ const REGEX_FOLD_DATA: string =
145
+ "UERlL;T11T11T11T11T11T01T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T12T11T11T11T11T11T11T11mgM1SO1SO1SO1SO1SO1QPXH1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO2SO1SO1SO1SO1SO1SO1SO1_515131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151335131513151325131513151315131513151315131513251315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131_31513151315132h=1j9151315131iI15131iE1iE15132YM1i91i=15131iE1iM1\\51j=1j515131d=1UVX51j=1jE1`91jI1513151315131k915131k935131k915131k51k5151315131k=151335132W1541416141416141416151315131513151315131513151315131YK15131513151315131513151315131513151324141615131\\31VO151315131513151315131513151315131513151315131513151315131513151315131513151315131`72513151315131513151315131513151315137QZU=15131d;1QZU11QZWM1QZWM15131h;1XE1XM151315131513151315131QZSM1QZSA1QZSI1j71iG2iC1iC2i72i;1UUYM4iC1UUY=2iK1UU\\M1UUU11UUXA2j31j;1UUXA1QYnM1UUX53j;2QYoE1jC3jG8QYlM3k72UUX=1k74UUU91k71XC1k31k31XK6k;;UURE1UUR9U7Z@Q;513151335134`91`91`92^A7TI2TE1TE1TE2X12WM1WM1lX=1T11T01T11T11T01T11T11T01T01T01T11T01T11T11T11T01T02SL1T11T11T01T11T11T01T11T11TG1TC1TC1TC1lV=1SO1SH1SO1SO1X01SO1SO1S41lPD1VH1SO1SPJ1SO1SO1SO1RH1V0141SN1SO1SO1QL1SO1SO1m[D1SO1SO1WO1WK1WK1Q11WF1T<4UJ1VF1O1513151315131513151315131513151315131513151315131ZF1YN1M1^?1[>1[N25131K15132`71`71`71Z11Z11Z11Z11Z11Z11Z11Z11Z11Z11Z11Z11Z11Z11Z11Z11T11T11T01T11T01T11T11T11T11T11T11T11T11T11T01T11T11T01T01T11T11T11T11T11T11T11T01T11T11T11T11T11SO1SO1hYH1SO1hYD1SO1SO1SO1SO1SO1SO1SO1SO1SO1hX@1SO1SO1hX81hX81SO1SO1SO1SO1SO1SO1SO1hW@1SO1SO1SO1SO1SO1YO1YO1YO1YO1YO1YO1YO1YO1YO1YO1YO1YO1YO1YO1YO1YO1513141hT@1513151315131513151315131513151315131513151315131513151315139513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131QM15131513151315131513151315131QK1513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315132V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V1;UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UORhJl\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\12l\\16l\\13[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h13[h11[h11[h1e1Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Q11Q11Q11Q11Q11Q13O1O1O1O1O1ORT3h]F1h]B1h\\>1h\\6141h\\:1h[>1hTB1TYh815136[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO3[gO1[gO1[gOUJTZPA4^lIATZW1SB51315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513141W8151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315136W:3mgK2513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131Q11Q11Q11Q11Q11Q11Q11Q11O1O1O1O1O1O1O1O1Q11Q11Q11Q11Q11Q13O1O1O1O1O1O3Q11Q11Q11Q11Q11Q11Q11Q11O1O1O1O1O1O1O1O1Q11Q11Q11Q11Q11Q11Q11Q11O1O1O1O1O1O1O1O1Q11Q11Q11Q11Q11Q13O1O1O1O1O1O4Q12Q12Q12Q12O2O2O2O1Q11Q11Q11Q11Q11Q11Q11Q11O1O1O1O1O1O1O1O1Y91Y91ZI1ZI1ZI1ZI1\\A1\\A1`11`11^11^11_I1_I3Q11Q11Q11Q11Q11Q11Q11Q11O1O1O1O1O1O1O1O1Q11Q11Q11Q11Q11Q11Q11Q11O1O1O1O1O1O1O1O1Q11Q11Q11Q11Q11Q11Q11Q11O1O1O1O1O1O1O1O1Q11Q12Q55O1O1Y71Y71Q32l_25Q55ZG1ZG1ZG1ZG1Q34Q11Q12lX;5O1O1\\?1\\?5Q11Q12lV;2M3O1O1]O1]O1K7Q55_O1_O1_G1_G1Q3Y:m_B5QP\\F7SALS?BR11R11R11R11R11R11R11R11R11R11R11R11R11R11R11R11QO1QO1QO1QO1QO1QO1QO1QO1QO1QO1QO1QO1QO1QO1QO1QO4513iBS91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S7QhGV11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO15131QYnK1^lG1QYlK1QZU;1QZTO1513151315131QZS?1QYoC1QZSK1QZSG251325138QZWK1QZWK15131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513851315134513=l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O2l[O6l[OnXC5131513151315131513141TYh:15131513151315131513151315131513151315131513151315131513151315131513C5131513151315131513151315131513151315131513151315131513T75131513151315131513151315133513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513:51315131TZP?1513151315131513151345131UUTO351315131V125131513151315131513151315131513151315131UUX?1UUYK1UUY;1UUX31UUX?2UUR71UUU71UURC1Sd1151315131513151315131513151315131UO1UUX;1TZVO151315131UU\\K151335135513151315131UVX3I513jMScOMTgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiOcj6513QPKT11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T17SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SOQU6U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TOS1U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U15TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TOSETM1TM1TM1TM1TM1TM1TM1TM1TM1TM1TM2TM1TM1TM1TM1TM1TM1TM1TM1TM1TM1TM1TM1TM1TM1TM2TM1TM1TM1TM1TM1TM1TM2TM1TM2TK1TK1TK1TK1TK1TK1TK1TK1TK1TK1TK2TK1TK1TK1TK1TK1TK1TK1TK1TK1TK1TK1TK1TK1TK1TK2TK1TK1TK1TK1TK1TK1TK2TK1TKQf4X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X1>WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WORNT11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T1;SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SORhKT11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SOe[1T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SOnd1T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T7"
146
+ /** The code points `REGEX_FOLD_DATA` folds, as runs: per run its first and last, four base-32 digits each. */
147
+ const REGEX_FOLD_SPANS: string =
148
+ "005E005E0060006F006H007F007H009?009B009G009I00:800::00;N00<000<<00<>00=900=<00=I00=L00=M00=O00=O00>400??00?A00A000A200AC00AJ00BD00BF00BG00BI00BI00BK00BL00C000C100C300C600C800C<00C?00C?00CA00CB00CE00CE00CM00CM00D000D000D200D300D700D<00DB00DB00DM00DN00J500J500K@00KC00KF00KG00KK00KM00KO00KO00L600L600L800L:00L<00L<00L>00M100M300NA00NE00OE00OG00OK00OM0141014:019?019A01:F01;101<60450046504670467046=046=046@047J047M047O04M004OE04OH04OM0740074:074@075J075M075O07;I07;I07;M07;M07<>07<>07@007DE07DK07DK07DN07DN07E007HE07HH07HM07I007J507J807J=07JA07JA07JC07JC07JE07JE07JG07JG07JI07JI07JK07JK07JM07JM07JO07KM07L007MA07MC07MC07MH07ML07MN07MN07N307N307N807N<07N@07NA07NC07NC07NH07NK07O007O107O307O307O507O507O807O<07OC07OC07OH07OL08960896089;089;089B089B08:>08:>08;008;O08<308<4095F09790;000;3@0;3B0;3C0;3E0;3F0;3N0;730;7;0;7>0;7B0;7C0;800;950;970;970;9=0;9=19B019C=19D019DK19I219I?19IB19K?19KI19L719L;19L=19L@19LD19LF19M>19M@19N=19N@19NA19NF19NL19OE19OF1:JC1:JC1:K@1:MO1NH51NH61OI11OIJ1OJ11OJJ2100212?215@216C216H217K21;@21;J21;L21<:21<<21<B21<D21<E21<G21=121=321=A21=C21=I21=K21=L2340235B2360237B23:@23;523;@23<52650266O2KB02KCO3J803J:3"
149
+ /** Per block of 16 members in `REGEX_FOLD_DATA`, the first and where its step starts, four base-32 digits each. */
150
+ const REGEX_FOLD_INDEX: string =
151
+ "005E0002006?001C00700034007@004F00810065008A007500910085009C009500:400:500:E00;500;500<500;E00=500<600>800<G00?B00=700@L00=I00B100>@00C200?000D300?A00E300@100F500@A00G500A200H600AB00I600B800JF00BK00L400CE00N600KA010100L@011<00M0012M00MA014>00N1016000NA017@00O4018C00OD019F010601;1010F01<A011601>1011F01?C012601A6012F01BG013601D3013F01E3014>01F3014N01G3015>01H3015N01I3016>01J4016N01K5017>01L5017N01M5018>01N5018N01O5019>0205019O021C01:?023301;9024C01;I02630452027G045B029G046202;G046J02=G047:02?G047J02AG04M<02D404ML02FD04N<02I404NL02KD04O<02N4074002OH074E031C0755033C075E035C07@4037?07@D038?07A4039?07AD03:?07B403;?07BD03<?07C403=@07CD03>@07D403?@07DD03@@07E<03AC07EL03BC07F<03CC07FL03DC07G<03EC07GL03FC07H<03GK07I003I107I@03J907J003KA07JI03LK07K<03N307KL03O?07L>040I07LN042107M>043907N<044F07O<046308;5047F08;E0496095I04:E096904<5096I04=E097904?50;0?04@G0;0O04B70;1?04CG0;1O04E70;2?04FG0;2O04H70;3?04IL0;4804K80;4H04L80;5804M80;5H04N80;6804O80;6H05080;7B05180;8>05340;8N055419B6056J19BF057M19C6058M19D8059M19DH05:M19I>05;N19J005<N19J@05=N19K005>N19KI05?N19L<05A119LO05B519M@05CD19N005DO19NF05F91:KF05H11:L605JA1:LF05M11:M605OA1:MF06211OI506471OIE065G1OJ;06772100068I210@06:9211006;I211@06=9212006>I215@06@:216006AJ216@06C:217406DJ217D06F:21;H06GK21<906I;21<L06JK21==06L;234206MM234B06O=2352070M235B072=236?073M236O075=237?076M23:L078>23;F079N265007;@265@07=0266007>@266@07@02KB007AB2KB@07C22KC007DB2KC@07F23J8007GD3J8@07I43J9007JD3J9@07L43J:007MD"
152
+ // gen-regex-unicode:end
153
+
86
154
  /** The most instructions a compiled pattern may have. */
87
155
  export const REGEX_MAX_INSTRUCTIONS: i32 = 100000
88
156
  /** The largest count `{n}`, `{n,}` or `{n,m}` may give. */
@@ -95,6 +163,10 @@ const REGEX_MAX_SLOT_TABLE: i32 = 4194304
95
163
  export const REGEX_MAX_GROUPS: i32 = 1024
96
164
  /** The most ranges one class may list; the class sorts them by insertion. */
97
165
  export const REGEX_MAX_CLASS_RANGES: i32 = 10000
166
+ /** Most ranges the property escapes and case folding of one pattern may add to its classes. */
167
+ export const REGEX_MAX_PROPERTY_RANGES: i32 = 100000
168
+ /** Most ranges a class sorts by insertion; a longer one is merge-sorted. */
169
+ const REGEX_INSERTION_SORT: i32 = 64
98
170
  /**
99
171
  * How many levels of nested marked iterations the VM keeps apart; a mark
100
172
  * nested deeper leaves the closure's stamps as they are.
@@ -156,6 +228,13 @@ const ASSERT_BEGIN_LINE: i32 = 2
156
228
  const ASSERT_END_LINE: i32 = 3
157
229
  const ASSERT_WORD: i32 = 4
158
230
  const ASSERT_NOT_WORD: i32 = 5
231
+ // `\b` and `\B` under `i`, where U+017F and U+212A, which fold to `s` and
232
+ // `k`, are word characters too, as for JavaScript's `iu`.
233
+ const ASSERT_WORD_FOLD: i32 = 6
234
+ const ASSERT_NOT_WORD_FOLD: i32 = 7
235
+ /** The bits `1 << kind` of the kinds `\b` and `\B` compile to, and of those under `i`. */
236
+ const ASSERT_WORD_BITS: i32 = 0xf0
237
+ const ASSERT_FOLD_BITS: i32 = 0xc0
159
238
 
160
239
  // The parsed pattern's nodes.
161
240
  const NODE_EMPTY: i32 = 0
@@ -175,6 +254,42 @@ const SET_SPACE: i32 = 2
175
254
 
176
255
  /** The highest code point. */
177
256
  const REGEX_MAX_CP: i32 = 0x10ffff
257
+
258
+ /** The number `table` holds at `at`, four base-32 digits. */
259
+ const regexFixedAt = (table: string, at: i32): i32 => {
260
+ let v: i32 = 0
261
+ let i: i32 = 0
262
+ while (i < 4) {
263
+ v = v * 32 + toI32(table.charCodeAt(at + i)) - 48
264
+ i += 1
265
+ }
266
+ return v
267
+ }
268
+
269
+ /** The member a `REGEX_FOLD_DATA` step leads to from `c`: the step is a zigzag-coded difference, doubled, plus one in a pair. */
270
+ const regexFoldTarget = (c: i32, step: i32): i32 => ((step & 2) === 2 ? c - (step >> 2) - 1 : c + (step >> 2))
271
+
272
+ /** The code point `REGEX_FOLD_SPANS` holds at `at`. */
273
+ const regexSpanAt = (at: i32): i32 => regexFixedAt(REGEX_FOLD_SPANS, at)
274
+
275
+ /** Whether some code point in `[lo, hi]` folds under `i`; a range it misses needs no fold table. */
276
+ const regexFoldsIn = (lo: i32, hi: i32): boolean => {
277
+ if (hi < regexSpanAt(0)) {
278
+ return false
279
+ }
280
+ // The first run ending at or after `lo`, by binary search.
281
+ let a: i32 = 0
282
+ let b: i32 = toI32(REGEX_FOLD_SPANS.length) >> 3
283
+ while (a < b) {
284
+ const mid: i32 = (a + b) >> 1
285
+ if (regexSpanAt(mid * 8 + 4) < lo) {
286
+ a = mid + 1
287
+ } else {
288
+ b = mid
289
+ }
290
+ }
291
+ return a < toI32(REGEX_FOLD_SPANS.length) >> 3 && regexSpanAt(a * 8) <= hi
292
+ }
178
293
  /** A byte `b` that is not part of valid UTF-8 is the character `REGEX_INVALID + b`, which nothing written in a pattern equals. */
179
294
  const REGEX_INVALID: i32 = 0x110000
180
295
 
@@ -193,6 +308,43 @@ const regexOtherCase = (c: i32): i32 => {
193
308
  const isRegexWordByte = (b: i32): boolean =>
194
309
  (b >= 97 && b <= 122) || (b >= 65 && b <= 90) || (b >= 48 && b <= 57) || b === 95
195
310
 
311
+ /** Whether U+017F (C5 BF) or U+212A (E2 84 AA), word characters under `i`, ends at byte `p`. */
312
+ const regexFoldWordBefore = (text: string, p: i32): boolean => {
313
+ if (p < 2) {
314
+ return false
315
+ }
316
+ const b: i32 = toI32(text.charCodeAt(p - 1))
317
+ if (b === 0xbf) {
318
+ return toI32(text.charCodeAt(p - 2)) === 0xc5
319
+ }
320
+ return (
321
+ b === 0xaa && p >= 3 && toI32(text.charCodeAt(p - 2)) === 0x84 && toI32(text.charCodeAt(p - 3)) === 0xe2
322
+ )
323
+ }
324
+
325
+ /** Whether U+017F or U+212A starts at byte `p` of `text`, `len` bytes long. */
326
+ const regexFoldWordAt = (text: string, p: i32, len: i32): boolean => {
327
+ if (p + 1 >= len) {
328
+ return false
329
+ }
330
+ const b: i32 = toI32(text.charCodeAt(p))
331
+ if (b === 0xc5) {
332
+ return toI32(text.charCodeAt(p + 1)) === 0xbf
333
+ }
334
+ return (
335
+ b === 0xe2 &&
336
+ p + 2 < len &&
337
+ toI32(text.charCodeAt(p + 1)) === 0x84 &&
338
+ toI32(text.charCodeAt(p + 2)) === 0xaa
339
+ )
340
+ }
341
+
342
+ /** Where the value of `key` starts in `REGEX_PROPERTY_NAMES`, or -1 if it has none. */
343
+ const regexPropertyEntry = (key: string): i32 => {
344
+ const i: i32 = toI32(REGEX_PROPERTY_NAMES.indexOf(`|${key}=`))
345
+ return i < 0 ? -1 : i + toI32(key.length) + 2
346
+ }
347
+
196
348
  /** Whether every character of `s` is ASCII. */
197
349
  const isRegexAscii = (s: string): boolean => {
198
350
  let i: i32 = 0
@@ -333,7 +485,6 @@ class RegexParser {
333
485
  /** The class being parsed: its ranges, unsorted, `tmpCount` of them. */
334
486
  tmpLo: i32[]
335
487
  tmpHi: i32[]
336
-
337
488
  len: i32
338
489
  pos: i32
339
490
  errorAt: i32
@@ -343,6 +494,10 @@ class RegexParser {
343
494
  /** What `parseBraces` read. */
344
495
  qMin: i32
345
496
  qMax: i32
497
+ /** Where `tableNumber` reads next. */
498
+ tablePos: i32
499
+ /** The ranges property escapes and case folding have added, against `REGEX_MAX_PROPERTY_RANGES`. */
500
+ propertyRanges: i32
346
501
 
347
502
  icase: boolean
348
503
  multiline: boolean
@@ -382,6 +537,8 @@ class RegexParser {
382
537
  this.tmpCount = 0
383
538
  this.qMin = 0
384
539
  this.qMax = 0
540
+ this.tablePos = 0
541
+ this.propertyRanges = 0
385
542
  }
386
543
 
387
544
  fail(message: string, at: i32): i32 {
@@ -410,12 +567,82 @@ class RegexParser {
410
567
  return n
411
568
  }
412
569
 
413
- /** A node for code point `cp`, with its other case under `i`. */
570
+ /**
571
+ * A node for code point `cp`, with its other case under `i`: one other
572
+ * case is a character's second operand, more make a class of them all.
573
+ */
414
574
  charNode(cp: i32): i32 {
415
- if (this.icase) {
575
+ if (!this.icase) {
576
+ return this.node(NODE_CHAR, cp, cp)
577
+ }
578
+ if (cp < 128) {
416
579
  return this.node(NODE_CHAR, cp, regexOtherCase(cp))
417
580
  }
418
- return this.node(NODE_CHAR, cp, cp)
581
+ if (!regexFoldsIn(cp, cp)) {
582
+ return this.node(NODE_CHAR, cp, cp)
583
+ }
584
+ const step: i32 = this.foldStepOf(cp)
585
+ if (step < 0) {
586
+ return this.node(NODE_CHAR, cp, cp)
587
+ }
588
+ const next: i32 = regexFoldTarget(cp, step)
589
+ if ((step & 1) === 1) {
590
+ return this.node(NODE_CHAR, cp, next)
591
+ }
592
+ this.tmpCount = 0
593
+ this.addRange(cp, cp)
594
+ let c: i32 = next
595
+ while (c !== cp) {
596
+ this.addRange(c, c)
597
+ c = regexFoldTarget(c, this.foldStepOf(c))
598
+ }
599
+ return this.finishClass(false)
600
+ }
601
+
602
+ /** The number at `tablePos` in `table`, a generated table's base-32 digits, `tablePos` moved past it. */
603
+ tableNumber(table: string): i32 {
604
+ let v: i32 = 0
605
+ let d: i32 = toI32(table.charCodeAt(this.tablePos)) - 48
606
+ this.tablePos += 1
607
+ while (d >= 32) {
608
+ v = v * 32 + d - 32
609
+ d = toI32(table.charCodeAt(this.tablePos)) - 48
610
+ this.tablePos += 1
611
+ }
612
+ return v * 32 + d
613
+ }
614
+
615
+ /**
616
+ * The member of the `REGEX_FOLD_DATA` block that may hold `cp`: the last
617
+ * block starting at or before it, or the first. `tablePos` is left at that
618
+ * member's step.
619
+ */
620
+ foldSeek(cp: i32): i32 {
621
+ let a: i32 = 0
622
+ let b: i32 = toI32(REGEX_FOLD_INDEX.length) >> 3
623
+ while (b - a > 1) {
624
+ const mid: i32 = (a + b) >> 1
625
+ if (regexFixedAt(REGEX_FOLD_INDEX, mid * 8) <= cp) {
626
+ a = mid
627
+ } else {
628
+ b = mid
629
+ }
630
+ }
631
+ this.tablePos = regexFixedAt(REGEX_FOLD_INDEX, a * 8 + 4)
632
+ return regexFixedAt(REGEX_FOLD_INDEX, a * 8)
633
+ }
634
+
635
+ /** `cp`'s step in `REGEX_FOLD_DATA`, for `regexFoldTarget`, or -1 if it folds to nothing. */
636
+ foldStepOf(cp: i32): i32 {
637
+ let c: i32 = this.foldSeek(cp)
638
+ const end: i32 = toI32(REGEX_FOLD_DATA.length)
639
+ while (c < cp && this.tablePos < end) {
640
+ this.tableNumber(REGEX_FOLD_DATA)
641
+ if (this.tablePos < end) {
642
+ c += this.tableNumber(REGEX_FOLD_DATA)
643
+ }
644
+ }
645
+ return c === cp && this.tablePos < end ? this.tableNumber(REGEX_FOLD_DATA) : -1
419
646
  }
420
647
 
421
648
  /** `alternative ('|' alternative)*`. */
@@ -713,15 +940,32 @@ class RegexParser {
713
940
  this.pos += 1
714
941
  this.tmpCount = 0
715
942
  this.addSet(c)
943
+ // `\d`, `\w` and `\s` and their capitals are closed under case
944
+ // folding already: `\d` and `\s` hold no code point that folds, and
945
+ // under `i` `\w` holds both cases of every ASCII letter and the two
946
+ // code points above ASCII that fold into them, U+017F and U+212A,
947
+ // which `\W` leaves out. So the class is finished as if `i` were off.
948
+ const icase: boolean = this.icase
949
+ this.icase = false
950
+ const node: i32 = this.finishClass(false)
951
+ this.icase = icase
952
+ return node
953
+ }
954
+ if (c === 112 || c === 80) {
955
+ this.tmpCount = 0
956
+ this.addProperty(at, c === 80)
957
+ if (this.failed) {
958
+ return -1
959
+ }
716
960
  return this.finishClass(false)
717
961
  }
718
962
  if (c === 98) {
719
963
  this.pos += 1
720
- return this.node(NODE_ASSERT, ASSERT_WORD, REGEX_NIL)
964
+ return this.node(NODE_ASSERT, this.icase ? ASSERT_WORD_FOLD : ASSERT_WORD, REGEX_NIL)
721
965
  }
722
966
  if (c === 66) {
723
967
  this.pos += 1
724
- return this.node(NODE_ASSERT, ASSERT_NOT_WORD, REGEX_NIL)
968
+ return this.node(NODE_ASSERT, this.icase ? ASSERT_NOT_WORD_FOLD : ASSERT_NOT_WORD, REGEX_NIL)
725
969
  }
726
970
  if ((c >= 49 && c <= 57) || c === 107) {
727
971
  return this.fail("backreferences are not supported", at)
@@ -910,6 +1154,14 @@ class RegexParser {
910
1154
  r.push(95)
911
1155
  r.push(97)
912
1156
  r.push(122)
1157
+ if (this.icase) {
1158
+ // U+017F and U+212A fold to `s` and `k`, so under `i` they are word
1159
+ // characters, as for JavaScript's `iu`, and `\W` leaves them out.
1160
+ r.push(0x17f)
1161
+ r.push(0x17f)
1162
+ r.push(0x212a)
1163
+ r.push(0x212a)
1164
+ }
913
1165
  } else {
914
1166
  r.push(9)
915
1167
  r.push(13)
@@ -956,6 +1208,114 @@ class RegexParser {
956
1208
  }
957
1209
  }
958
1210
 
1211
+ /**
1212
+ * Add the ranges of `\p{…}`, or with `negate` the gaps between them as
1213
+ * `\P{…}` does, to the class being parsed. The cursor is on the `p`, `at`
1214
+ * on the `\`. The name is a General_Category value or a binary property
1215
+ * alone, or `General_Category`, `Script` or `Script_Extensions` (or `gc`,
1216
+ * `sc`, `scx`) `=` a value, spelled as ECMA-262 spells them.
1217
+ */
1218
+ addProperty(at: i32, negate: boolean): void {
1219
+ this.pos += 1
1220
+ if (this.pos >= this.len || this.byteAt(this.pos) !== 123) {
1221
+ this.fail("invalid property name", at)
1222
+ return
1223
+ }
1224
+ const start: i32 = this.pos + 1
1225
+ let eq: i32 = -1
1226
+ let i: i32 = start
1227
+ while (i < this.len && this.byteAt(i) !== 125) {
1228
+ if (this.byteAt(i) === 61 && eq < 0) {
1229
+ eq = i
1230
+ } else if (!isRegexWordByte(this.byteAt(i))) {
1231
+ this.fail("invalid property name", at)
1232
+ return
1233
+ }
1234
+ i += 1
1235
+ }
1236
+ if (i >= this.len || i === start) {
1237
+ this.fail("invalid property name", at)
1238
+ return
1239
+ }
1240
+ this.pos = i + 1
1241
+ let entry: i32 = -1
1242
+ if (eq < 0) {
1243
+ const name: string = this.src.slice(start, i)
1244
+ entry = regexPropertyEntry(`g${name}`)
1245
+ if (entry < 0) {
1246
+ entry = regexPropertyEntry(`b${name}`)
1247
+ }
1248
+ if (entry < 0) {
1249
+ this.fail("invalid property name", at)
1250
+ return
1251
+ }
1252
+ } else {
1253
+ const name: string = this.src.slice(start, eq)
1254
+ const value: string = this.src.slice(eq + 1, i)
1255
+ const script: boolean = name === "Script" || name === "sc"
1256
+ const extensions: boolean = name === "Script_Extensions" || name === "scx"
1257
+ if (name === "General_Category" || name === "gc") {
1258
+ entry = regexPropertyEntry(`g${value}`)
1259
+ } else if (script || extensions) {
1260
+ entry = regexPropertyEntry(`s${value}`)
1261
+ } else {
1262
+ this.fail("invalid property name", at)
1263
+ return
1264
+ }
1265
+ if (entry < 0) {
1266
+ this.fail("invalid property value", at)
1267
+ return
1268
+ }
1269
+ // A script's entry is its Script list, a comma, then its Script_Extensions list.
1270
+ if (extensions) {
1271
+ entry = toI32(REGEX_PROPERTY_NAMES.indexOf(",", entry)) + 1
1272
+ }
1273
+ }
1274
+ // An entry is the offset of its list in `REGEX_PROPERTY_DATA`, after a `~` for its complement.
1275
+ let gaps: boolean = negate
1276
+ if (toI32(REGEX_PROPERTY_NAMES.charCodeAt(entry)) === 126) {
1277
+ gaps = !gaps
1278
+ entry += 1
1279
+ }
1280
+ let offset: i32 = 0
1281
+ while (
1282
+ toI32(REGEX_PROPERTY_NAMES.charCodeAt(entry)) >= 48 &&
1283
+ toI32(REGEX_PROPERTY_NAMES.charCodeAt(entry)) <= 57
1284
+ ) {
1285
+ offset = offset * 10 + toI32(REGEX_PROPERTY_NAMES.charCodeAt(entry)) - 48
1286
+ entry += 1
1287
+ }
1288
+ this.tablePos = offset
1289
+ const n: i32 = this.tableNumber(REGEX_PROPERTY_DATA)
1290
+ const before: i32 = this.tmpCount
1291
+ let from: i32 = 0
1292
+ let hi: i32 = -2
1293
+ let k: i32 = 0
1294
+ while (k < n) {
1295
+ const lo: i32 = hi + 2 + this.tableNumber(REGEX_PROPERTY_DATA)
1296
+ hi = lo + this.tableNumber(REGEX_PROPERTY_DATA)
1297
+ if (!gaps) {
1298
+ this.addRange(lo, hi)
1299
+ } else if (lo > from) {
1300
+ this.addRange(from, lo - 1)
1301
+ }
1302
+ from = hi + 1
1303
+ k += 1
1304
+ }
1305
+ if (gaps && from <= REGEX_MAX_CP) {
1306
+ this.addRange(from, REGEX_MAX_CP)
1307
+ }
1308
+ this.countPropertyRanges(this.tmpCount - before, at)
1309
+ }
1310
+
1311
+ /** Count `n` more ranges against `REGEX_MAX_PROPERTY_RANGES`, failing at `at` past it. */
1312
+ countPropertyRanges(n: i32, at: i32): void {
1313
+ this.propertyRanges += n
1314
+ if (this.propertyRanges > REGEX_MAX_PROPERTY_RANGES) {
1315
+ this.fail("property escapes and case folding add more than 100000 ranges", at)
1316
+ }
1317
+ }
1318
+
959
1319
  /** One member of a class: a code point, or -2 once a set escape has added its ranges. */
960
1320
  parseClassAtom(): i32 {
961
1321
  const c: i32 = this.byteAt(this.pos)
@@ -971,6 +1331,10 @@ class RegexParser {
971
1331
  this.addSet(e)
972
1332
  return -2
973
1333
  }
1334
+ if (e === 112 || e === 80) {
1335
+ this.addProperty(at, e === 80)
1336
+ return -2
1337
+ }
974
1338
  if ((e >= 49 && e <= 57) || e === 107) {
975
1339
  return this.fail("backreferences are not supported", at)
976
1340
  }
@@ -1078,33 +1442,59 @@ class RegexParser {
1078
1442
  c += 1
1079
1443
  }
1080
1444
  }
1081
- // The non-ASCII ranges, insertion-sorted by their start and merged.
1445
+ let from: i32 = toI32(this.clsLo.length)
1446
+ let out: i32 = this.storeRanges()
1447
+ // Under `i`, the class closed under simple case folding above ASCII.
1448
+ if (this.icase && out > from && this.foldRanges(from, out)) {
1449
+ if (this.failed) {
1450
+ return -1
1451
+ }
1452
+ from = toI32(this.clsLo.length)
1453
+ out = this.storeRanges()
1454
+ }
1455
+ this.clsFrom.push(from)
1456
+ this.clsTo.push(out)
1457
+ this.clsNeg.push(negated ? toU8(1) : toU8(0))
1458
+ // The merged ranges past `out` are dead; later classes start after them.
1459
+ return this.node(NODE_CLASS, k, REGEX_NIL)
1460
+ }
1461
+
1462
+ /**
1463
+ * Append the non-ASCII part of the class being parsed to `clsLo` /
1464
+ * `clsHi`, sorted by start and merged, and answer where the merged run ends.
1465
+ */
1466
+ storeRanges(): i32 {
1082
1467
  const from: i32 = toI32(this.clsLo.length)
1083
- i = 0
1468
+ let i: i32 = 0
1084
1469
  while (i < this.tmpCount) {
1085
- let lo: i32 = this.tmpLo[i]
1086
1470
  const hi: i32 = this.tmpHi[i]
1087
- i += 1
1088
- if (hi < 128) {
1089
- continue
1471
+ if (hi >= 128) {
1472
+ const lo: i32 = this.tmpLo[i] < 128 ? 128 : this.tmpLo[i]
1473
+ this.clsLo.push(lo)
1474
+ this.clsHi.push(hi)
1090
1475
  }
1091
- if (lo < 128) {
1092
- lo = 128
1093
- }
1094
- this.clsLo.push(lo)
1095
- this.clsHi.push(hi)
1096
- let m: i32 = toI32(this.clsLo.length) - 1
1097
- while (m > from && this.clsLo[m - 1] > lo) {
1098
- this.clsLo[m] = this.clsLo[m - 1]
1099
- this.clsHi[m] = this.clsHi[m - 1]
1100
- m -= 1
1101
- }
1102
- this.clsLo[m] = lo
1103
- this.clsHi[m] = hi
1476
+ i += 1
1104
1477
  }
1105
- // Merge in place, then drop what merging left past the end by copying
1106
- // the merged run back over a fresh tail.
1107
1478
  const end: i32 = toI32(this.clsLo.length)
1479
+ if (end - from <= REGEX_INSERTION_SORT) {
1480
+ i = from + 1
1481
+ while (i < end) {
1482
+ const lo: i32 = this.clsLo[i]
1483
+ const hi: i32 = this.clsHi[i]
1484
+ let m: i32 = i
1485
+ while (m > from && this.clsLo[m - 1] > lo) {
1486
+ this.clsLo[m] = this.clsLo[m - 1]
1487
+ this.clsHi[m] = this.clsHi[m - 1]
1488
+ m -= 1
1489
+ }
1490
+ this.clsLo[m] = lo
1491
+ this.clsHi[m] = hi
1492
+ i += 1
1493
+ }
1494
+ } else {
1495
+ this.mergeSort(from, end)
1496
+ }
1497
+ // Merge in place; what merging leaves past `out` is dead.
1108
1498
  let out: i32 = from
1109
1499
  i = from
1110
1500
  while (i < end) {
@@ -1121,11 +1511,151 @@ class RegexParser {
1121
1511
  }
1122
1512
  i += 1
1123
1513
  }
1124
- this.clsFrom.push(from)
1125
- this.clsTo.push(out)
1126
- this.clsNeg.push(negated ? toU8(1) : toU8(0))
1127
- // The merged ranges past `out` are dead; later classes start after them.
1128
- return this.node(NODE_CLASS, k, REGEX_NIL)
1514
+ return out
1515
+ }
1516
+
1517
+ /**
1518
+ * Sort `clsLo` / `clsHi` over `[from, end)` by start, bottom-up through a
1519
+ * scratch copy, so that a class of many ranges, such as a few property
1520
+ * escapes in one, costs n log n rather than the n² insertion would.
1521
+ */
1522
+ mergeSort(from: i32, end: i32): void {
1523
+ const n: i32 = end - from
1524
+ let srcLo: i32[] = []
1525
+ let srcHi: i32[] = []
1526
+ let dstLo: i32[] = []
1527
+ let dstHi: i32[] = []
1528
+ let i: i32 = from
1529
+ while (i < end) {
1530
+ srcLo.push(this.clsLo[i])
1531
+ srcHi.push(this.clsHi[i])
1532
+ dstLo.push(this.clsLo[i])
1533
+ dstHi.push(this.clsHi[i])
1534
+ i += 1
1535
+ }
1536
+ let width: i32 = 1
1537
+ while (width < n) {
1538
+ let left: i32 = 0
1539
+ while (left < n) {
1540
+ const mid: i32 = left + width < n ? left + width : n
1541
+ const right: i32 = mid + width < n ? mid + width : n
1542
+ let a: i32 = left
1543
+ let b: i32 = mid
1544
+ let o: i32 = left
1545
+ // Every scratch array holds `n` entries and `a`, `b`, `o` stay below
1546
+ // `n`; the length tests say so where the prover reads them.
1547
+ while (o >= 0 && o < right && o < toI32(dstLo.length) && o < toI32(dstHi.length)) {
1548
+ let fromA: boolean = a < mid
1549
+ if (fromA && b < right && a >= 0 && a < toI32(srcLo.length) && b >= 0 && b < toI32(srcLo.length)) {
1550
+ fromA = srcLo[a] <= srcLo[b]
1551
+ }
1552
+ const pick: i32 = fromA ? a : b
1553
+ if (pick >= 0 && pick < toI32(srcLo.length) && pick < toI32(srcHi.length)) {
1554
+ dstLo[o] = srcLo[pick]
1555
+ dstHi[o] = srcHi[pick]
1556
+ }
1557
+ if (fromA) {
1558
+ a += 1
1559
+ } else {
1560
+ b += 1
1561
+ }
1562
+ o += 1
1563
+ }
1564
+ left = right
1565
+ }
1566
+ const lo: i32[] = srcLo
1567
+ const hi: i32[] = srcHi
1568
+ srcLo = dstLo
1569
+ srcHi = dstHi
1570
+ dstLo = lo
1571
+ dstHi = hi
1572
+ width *= 2
1573
+ }
1574
+ i = 0
1575
+ while (i < n && i < toI32(srcLo.length) && i < toI32(srcHi.length)) {
1576
+ this.clsLo[from + i] = srcLo[i]
1577
+ this.clsHi[from + i] = srcHi[i]
1578
+ i += 1
1579
+ }
1580
+ }
1581
+
1582
+ /**
1583
+ * Whether the merged ranges `[from, out)` miss a code point some member
1584
+ * folds to; if they do, the class being parsed becomes them and the
1585
+ * missing code points, to be stored again.
1586
+ */
1587
+ foldRanges(from: i32, out: i32): boolean {
1588
+ // A class closed already, holding no folding code point or all of them, leaves the fold table unread.
1589
+ let touches: boolean = false
1590
+ let covers: boolean = true
1591
+ let gap: i32 = 128
1592
+ let r0: i32 = from
1593
+ while (r0 < out) {
1594
+ if (!touches && regexFoldsIn(this.clsLo[r0], this.clsHi[r0])) {
1595
+ touches = true
1596
+ }
1597
+ if (covers && gap < this.clsLo[r0] && regexFoldsIn(gap, this.clsLo[r0] - 1)) {
1598
+ covers = false
1599
+ }
1600
+ gap = this.clsHi[r0] + 1
1601
+ r0 += 1
1602
+ }
1603
+ if (covers && gap <= REGEX_MAX_CP && regexFoldsIn(gap, REGEX_MAX_CP)) {
1604
+ covers = false
1605
+ }
1606
+ if (!touches || covers) {
1607
+ return false
1608
+ }
1609
+ const end: i32 = toI32(REGEX_FOLD_DATA.length)
1610
+ let added: i32 = 0
1611
+ let r: i32 = from
1612
+ while (r < out) {
1613
+ // The folding code points in the range, read on from the block that may hold its first.
1614
+ let f: i32 = this.foldSeek(this.clsLo[r])
1615
+ while (f <= this.clsHi[r] && this.tablePos < end) {
1616
+ const step: i32 = this.tableNumber(REGEX_FOLD_DATA)
1617
+ const at: i32 = this.tablePos
1618
+ let c: i32 = regexFoldTarget(f, step)
1619
+ while (f >= this.clsLo[r] && c !== f) {
1620
+ if (!this.rangesHave(from, out, c)) {
1621
+ if (added === 0) {
1622
+ this.tmpCount = 0
1623
+ }
1624
+ this.addRange(c, c)
1625
+ added += 1
1626
+ }
1627
+ c = (step & 1) === 1 ? f : regexFoldTarget(c, this.foldStepOf(c))
1628
+ }
1629
+ this.tablePos = at
1630
+ f = at < end ? f + this.tableNumber(REGEX_FOLD_DATA) : REGEX_MAX_CP + 1
1631
+ }
1632
+ r += 1
1633
+ }
1634
+ if (added === 0) {
1635
+ return false
1636
+ }
1637
+ r = from
1638
+ while (r < out) {
1639
+ this.addRange(this.clsLo[r], this.clsHi[r])
1640
+ r += 1
1641
+ }
1642
+ this.countPropertyRanges(added, this.pos)
1643
+ return true
1644
+ }
1645
+
1646
+ /** Whether the sorted, merged ranges `[from, out)` hold `c`. */
1647
+ rangesHave(from: i32, out: i32, c: i32): boolean {
1648
+ let lo: i32 = from
1649
+ let hi: i32 = out
1650
+ while (lo < hi) {
1651
+ const mid: i32 = (lo + hi) >> 1
1652
+ if (this.clsHi[mid] < c) {
1653
+ lo = mid + 1
1654
+ } else {
1655
+ hi = mid
1656
+ }
1657
+ }
1658
+ return lo < out && this.clsLo[lo] <= c
1129
1659
  }
1130
1660
  }
1131
1661
 
@@ -1207,6 +1737,8 @@ const CTX_LINE: i32 = 2
1207
1737
  const CTX_OTHER: i32 = 3
1208
1738
  const CTX_EOT: i32 = 4
1209
1739
  const CTX_KINDS: i32 = 5
1740
+ // The kinds, then the slot that says whether U+017F and U+212A are word characters.
1741
+ const CTX_MASK_LEN: i32 = 6
1210
1742
  const CTX_SLOTS: i32 = 4
1211
1743
 
1212
1744
  /**
@@ -1216,7 +1748,7 @@ const CTX_SLOTS: i32 = 4
1216
1748
  * twice.
1217
1749
  */
1218
1750
  const regexContextMask = (bits: i32): i32[] => {
1219
- const m: i32[] = new Array<i32>(CTX_KINDS)
1751
+ const m: i32[] = new Array<i32>(CTX_MASK_LEN)
1220
1752
  const line: boolean = (bits & (1 << ASSERT_BEGIN_LINE)) !== 0
1221
1753
  if ((bits & (1 << ASSERT_BEGIN_TEXT)) !== 0) {
1222
1754
  m[CTX_START] = CTX_START
@@ -1225,11 +1757,12 @@ const regexContextMask = (bits: i32): i32[] => {
1225
1757
  } else {
1226
1758
  m[CTX_START] = CTX_OTHER
1227
1759
  }
1228
- const word: boolean = (bits & ((1 << ASSERT_WORD) | (1 << ASSERT_NOT_WORD))) !== 0
1760
+ const word: boolean = (bits & ASSERT_WORD_BITS) !== 0
1229
1761
  m[CTX_WORD] = word ? CTX_WORD : CTX_OTHER
1230
1762
  m[CTX_LINE] = line ? CTX_LINE : CTX_OTHER
1231
1763
  m[CTX_OTHER] = CTX_OTHER
1232
1764
  m[CTX_EOT] = CTX_OTHER
1765
+ m[CTX_KINDS] = (bits & ASSERT_FOLD_BITS) !== 0 ? 1 : 0
1233
1766
  return m
1234
1767
  }
1235
1768
 
@@ -2484,8 +3017,13 @@ export class Regex {
2484
3017
  const b2: i32 = toI32(text.charCodeAt(p + 2))
2485
3018
  return toI32(text.charCodeAt(p + 1)) === 0x80 && (b2 === 0xa8 || b2 === 0xa9)
2486
3019
  }
2487
- const before: boolean = p > 0 && isRegexWordByte(toI32(text.charCodeAt(p - 1)))
2488
- const after: boolean = p < len && isRegexWordByte(toI32(text.charCodeAt(p)))
3020
+ let before: boolean = p > 0 && isRegexWordByte(toI32(text.charCodeAt(p - 1)))
3021
+ let after: boolean = p < len && isRegexWordByte(toI32(text.charCodeAt(p)))
3022
+ if (kind >= ASSERT_WORD_FOLD) {
3023
+ before = before || regexFoldWordBefore(text, p)
3024
+ after = after || regexFoldWordAt(text, p, len)
3025
+ return kind === ASSERT_WORD_FOLD ? before !== after : before === after
3026
+ }
2489
3027
  return kind === ASSERT_WORD ? before !== after : before === after
2490
3028
  }
2491
3029
 
@@ -2724,7 +3262,12 @@ export class Regex {
2724
3262
  }
2725
3263
  const bits: i32 = bitsF | bitsR
2726
3264
  const lines: boolean = anyNl || (bits & ((1 << ASSERT_BEGIN_LINE) | (1 << ASSERT_END_LINE))) !== 0
2727
- const words: boolean = (bits & ((1 << ASSERT_WORD) | (1 << ASSERT_NOT_WORD))) !== 0
3265
+ const words: boolean = (bits & ASSERT_WORD_BITS) !== 0
3266
+ const wordFold: boolean = (bits & ASSERT_FOLD_BITS) !== 0
3267
+ // A program needs one view of U+017F and U+212A: give up on a mix.
3268
+ if (wordFold && (bits & ((1 << ASSERT_WORD) | (1 << ASSERT_NOT_WORD))) !== 0) {
3269
+ return
3270
+ }
2728
3271
  // The boundaries above ASCII: where a literal, a range or a line
2729
3272
  // terminator starts and where it stops. The reverse program reads the
2730
3273
  // same characters, so the forward one is enough.
@@ -2767,6 +3310,12 @@ export class Regex {
2767
3310
  points.push(0x2028)
2768
3311
  points.push(0x202a)
2769
3312
  }
3313
+ if (wordFold) {
3314
+ points.push(0x17f)
3315
+ points.push(0x180)
3316
+ points.push(0x212a)
3317
+ points.push(0x212b)
3318
+ }
2770
3319
  regexSortPoints(points)
2771
3320
  const lows: i32[] = [128]
2772
3321
  let i: i32 = 0
@@ -2878,7 +3427,8 @@ export class Regex {
2878
3427
  u = 0
2879
3428
  while (u < toI32(hit.length) && u < toI32(rep.length)) {
2880
3429
  const r: i32 = rep[u]
2881
- const word: boolean = r >= 0 && r < 128 && isRegexWordByte(r)
3430
+ const word: boolean =
3431
+ (r >= 0 && r < 128 && isRegexWordByte(r)) || (wordFold && (r === 0x17f || r === 0x212a))
2882
3432
  if (u < toI32(hit.length)) {
2883
3433
  hit[u] = toU8(word ? 1 : 0)
2884
3434
  }
@@ -2936,7 +3486,7 @@ export class Regex {
2936
3486
  kind = CTX_EOT
2937
3487
  } else if (r === 10 || r === 13 || r === 0x2028 || r === 0x2029) {
2938
3488
  kind = CTX_LINE
2939
- } else if (r < 128 && isRegexWordByte(r)) {
3489
+ } else if ((r < 128 && isRegexWordByte(r)) || (wordFold && (r === 0x17f || r === 0x212a))) {
2940
3490
  kind = CTX_WORD
2941
3491
  }
2942
3492
  this.dNextK[c] = kind
@@ -3038,7 +3588,7 @@ export class Regex {
3038
3588
  return nk === CTX_EOT || nk === CTX_LINE
3039
3589
  }
3040
3590
  const boundary: boolean = (ctx === CTX_WORD) !== (nk === CTX_WORD)
3041
- return kind === ASSERT_WORD ? boundary : !boundary
3591
+ return kind === ASSERT_WORD || kind === ASSERT_WORD_FOLD ? boundary : !boundary
3042
3592
  }
3043
3593
 
3044
3594
  /**
@@ -3422,13 +3972,17 @@ export class Regex {
3422
3972
  kind = CTX_LINE
3423
3973
  } else if (isRegexWordByte(b)) {
3424
3974
  kind = CTX_WORD
3425
- } else if (
3426
- (b === 0xa8 || b === 0xa9) &&
3427
- p >= 3 &&
3428
- toI32(text.charCodeAt(p - 2)) === 0x80 &&
3429
- toI32(text.charCodeAt(p - 3)) === 0xe2
3430
- ) {
3431
- kind = CTX_LINE
3975
+ } else if (b >= 0x80) {
3976
+ if (
3977
+ (b === 0xa8 || b === 0xa9) &&
3978
+ p >= 3 &&
3979
+ toI32(text.charCodeAt(p - 2)) === 0x80 &&
3980
+ toI32(text.charCodeAt(p - 3)) === 0xe2
3981
+ ) {
3982
+ kind = CTX_LINE
3983
+ } else if (this.dMaskF[CTX_KINDS] !== 0 && regexFoldWordBefore(text, p)) {
3984
+ kind = CTX_WORD
3985
+ }
3432
3986
  }
3433
3987
  }
3434
3988
  return this.dMaskF[kind]
@@ -3452,6 +4006,9 @@ export class Regex {
3452
4006
  kind = CTX_LINE
3453
4007
  }
3454
4008
  }
4009
+ if (kind === CTX_OTHER && b >= 0x80 && this.dMaskR[CTX_KINDS] !== 0 && regexFoldWordAt(text, p, len)) {
4010
+ kind = CTX_WORD
4011
+ }
3455
4012
  }
3456
4013
  return this.dMaskR[kind]
3457
4014
  }
@@ -4195,13 +4752,15 @@ export class Regex {
4195
4752
  }
4196
4753
 
4197
4754
  /**
4198
- * Compile `pattern` with `flags`, a string of `i`, `m` and `s` in any order.
4755
+ * Compile `pattern` with `flags`, a string of `i`, `m`, `s` and `u` in any
4756
+ * order; `u` changes nothing, as patterns are always read by code point.
4199
4757
  * The error names what is wrong and its byte in the pattern.
4200
4758
  */
4201
4759
  export const regexCompile = (pattern: string, flags: string): Result<Regex, string> => {
4202
4760
  let icase: boolean = false
4203
4761
  let multiline: boolean = false
4204
4762
  let dotAll: boolean = false
4763
+ let unicode: boolean = false
4205
4764
  const nflags: i32 = toI32(flags.length)
4206
4765
  let i: i32 = 0
4207
4766
  while (i < nflags) {
@@ -4212,6 +4771,8 @@ export const regexCompile = (pattern: string, flags: string): Result<Regex, stri
4212
4771
  multiline = true
4213
4772
  } else if (c === 115 && !dotAll) {
4214
4773
  dotAll = true
4774
+ } else if (c === 117 && !unicode) {
4775
+ unicode = true
4215
4776
  } else {
4216
4777
  return Err(`regex: invalid flags "${flags}"`)
4217
4778
  }