diff --git a/records/track_10min_16mb/2026-04-05_CautiousMuon_SP4096_DepthRecur/README.md b/records/track_10min_16mb/2026-04-05_CautiousMuon_SP4096_DepthRecur/README.md new file mode 100644 index 0000000000..1156bb3f4c --- /dev/null +++ b/records/track_10min_16mb/2026-04-05_CautiousMuon_SP4096_DepthRecur/README.md @@ -0,0 +1,74 @@ +# Cautious Muon + SP4096 + Depth Recurrence + Parallel Residuals + +**val_bpb = 1.1604** (3-seed mean, std = 0.0033) + +This is a non-record submission exploring the effect of Cautious Muon (arXiv:2411.16085) on the PR #1334 architecture stack. + +## Results + +| Seed | val_bpb | val_loss | Artifact Size | +|------|---------|----------|---------------| +| 42 | 1.1568 | 2.6619 | 15,179,504 B | +| 314 | 1.1611 | 2.6717 | 15,173,470 B | +| 999 | 1.1634 | 2.6770 | 15,159,223 B | +| **Mean** | **1.1604** | **2.6702** | **15,170,732 B** | + +## Key Technique: Cautious Muon (arXiv:2411.16085) + +The primary modification is applying the Cautious optimizer principle to the Muon optimizer. The optimizer pipeline is: + +1. Compute momentum-corrected gradient (Nesterov) +2. **MuonEq-R row normalization** — normalize rows before Newton-Schulz +3. **Newton-Schulz orthogonalization** (5 steps) — project onto orthogonal manifold +4. **Cautious masking** — only apply update where the orthogonalized direction agrees with the raw gradient sign: + +```python +caution_mask = (g * raw_grad > 0).to(g.dtype) +g = g * caution_mask / caution_mask.mean().clamp_min(1e-3) +``` + +This filters out "stale" momentum directions that disagree with the current gradient, providing ~1.47x effective convergence per step with zero parameter overhead and no impact on artifact size. + +## Full Architecture Stack + +Built on PR #1334 (@aryanbhosale) with: +- **SP4096 BPE tokenizer** (from PR #1218, @clarkkev) +- **Depth recurrence** layers 4,5 (13 virtual layers from 11 physical, activated at step 3000) +- **Parallel residuals** from layer 7 (separate attn/MLP lanes with learnable merge) +- **MuonEq-R** row normalization before Newton-Schulz orthogonalization (arXiv:2603.28254) +- **Cautious masking** applied after Newton-Schulz orthogonalization +- **QK-Gain 5.0** per-head query-key scaling +- **EMA 0.997** weight averaging +- **Full GPTQ INT6** quantization with selective +-1 pruning +- **Brotli compression** + +## Non-matrix parameters + +Token embeddings, scalar parameters, and head use standard `torch.optim.AdamW`. Cautious masking is applied only inside Muon for matrix parameters. + +## Compliance + +- Track A fixed predictor -- no TTT, no SLOT, no eval-time adaptation +- All predictions are causal and normalized via softmax (F.cross_entropy) +- Artifact under 16MB limit (max 15,179,504 bytes) +- Training completes within 600s wallclock on 8xH100 SXM + +## Reproduction + +```bash +cd /workspace/parameter-golf +# Download SP4096 data +MATCHED_FINEWEB_REPO_ID=kevclark/parameter-golf python3 data/cached_challenge_fineweb.py --variant sp4096 +# Run +SEED=42 torchrun --standalone --nproc_per_node=8 train_gpt.py +``` + +## Decompressed Source + +The `train_gpt.py` is a self-extracting compressed script (`exec(lzma.decompress(base64.b85decode(...)))`). The decompressed source is ~1991 lines of Python. The only modification to the PR #1334 base is the two-line Cautious Muon mask inside `Muon.step()` (lines ~869-872 of the decompressed source). + +## Credits + +- PR #1334 (@aryanbhosale) -- base architecture (SP4096, depth recurrence, parallel residuals, MuonEq-R) +- PR #1218 (@clarkkev) -- SP4096 tokenizer +- Liang et al. (arXiv:2411.16085) -- Cautious Optimizers diff --git a/records/track_10min_16mb/2026-04-05_CautiousMuon_SP4096_DepthRecur/submission.json b/records/track_10min_16mb/2026-04-05_CautiousMuon_SP4096_DepthRecur/submission.json new file mode 100644 index 0000000000..c1710c95dd --- /dev/null +++ b/records/track_10min_16mb/2026-04-05_CautiousMuon_SP4096_DepthRecur/submission.json @@ -0,0 +1,39 @@ +{ + "author": "X-Abhishek-X", + "github_id": "X-Abhishek-X", + "name": "Cautious Muon + SP4096 + Depth Recurrence + Parallel Residuals", + "blurb": "Non-record submission. Applies Cautious Muon (arXiv:2411.16085) to the Muon optimizer — masks Newton-Schulz updates where the orthogonalized direction disagrees with the raw gradient sign, providing ~1.47x effective convergence per step with zero parameter overhead. Built on PR #1334 (aryanbhosale) base with SP4096 vocabulary, depth recurrence (layers 4,5), parallel residuals (from layer 7), MuonEq-R, QK-Gain 5.0, and full GPTQ INT6 + Brotli compression. Mean val_bpb = 1.1604 (3 seeds, std = 0.0033).", + "date": "2026-04-05T00:00:00Z", + "track": "10min_16mb", + "val_loss": 2.67020395, + "val_bpb": 1.16043988, + "val_loss_std": 0.00764948, + "val_bpb_std": 0.00332438, + "seeds": [42, 314, 999], + "seed_results": { + "42": { + "val_loss": 2.66190192, + "val_bpb": 1.15683191, + "artifact_bytes": 15179504 + }, + "314": { + "val_loss": 2.67174312, + "val_bpb": 1.16110878, + "artifact_bytes": 15173470 + }, + "999": { + "val_loss": 2.67696681, + "val_bpb": 1.16337894, + "artifact_bytes": 15159223 + } + }, + "artifact_bytes_mean": 15170732, + "artifact_bytes_max": 15179504, + "bytes_total": 15179504, + "bytes_code": 24659, + "hardware": "8x H100 SXM (RunPod On-Demand)", + "pytorch_version": "2.9.1", + "cuda_version": "12.8", + "technique_summary": "Cautious Muon optimizer (arXiv:2411.16085), SP4096 BPE tokenizer, depth recurrence layers 4-5 (start step 3000), parallel residuals from layer 7, MuonEq-R row normalization, QK-Gain 5.0, EMA 0.997, full GPTQ INT6 quantization with selective pruning, Brotli compression", + "comparison_baseline_pr": 1334 +} diff --git a/records/track_10min_16mb/2026-04-05_CautiousMuon_SP4096_DepthRecur/train_gpt.py b/records/track_10min_16mb/2026-04-05_CautiousMuon_SP4096_DepthRecur/train_gpt.py new file mode 100644 index 0000000000..90131a9176 --- /dev/null +++ b/records/track_10min_16mb/2026-04-05_CautiousMuon_SP4096_DepthRecur/train_gpt.py @@ -0,0 +1,2 @@ +import lzma as L,base64 as B +exec(L.decompress(B.b85decode("{Wp48S^xk9=GL@E0stWa8~^|S5YJf5;Y&G8oLvAkn@VT6Qap3bu0*kgCR~YUqB0W9R)iarr*QtEZpesGY3>~CZRiK|6Dwut$nH#N!RYqQnA}G^`ZsFO;ar92)Xt#3E3Ki5S1}OfSx<=$c<4=h|J{kt$27^CQ01M+lVgZ0tGgX0&I*V@{U&JgYc0U!(4F-btCy*+qzv6Dp~UW!y~6{U*}y$E@2-R}vd?t*s#fnDO{!j>OImt34A(d+9n>hnnvzmd((_D1Cghg~(bQ$Yj)>!Y%{*o9ex8FWa#U)!OI!!5Prl^?bnBX2V(=(Bvc+CvGo!S{LhLn7pSsR!}@U=OBW0)h6IYneQ1{|$<&k9TS^qGQpb-;#vEPAl%11UF)?6mtC8c04XzR$+h2=j84E2|i`pOEt$uyM`lGs*ejIF-}^SvSRZK$ePh1`gt+?%1r#=OVy3pW`{ofc)6PhQQRP|_h56zl+sQ(le1eJ^&&qZxdGb15aOb^-R1ouqi-H1_w|H;g(()bKz_!0+L{#HFmtQSw%~n|MX3ij_2{lW(_*6gdIz`XT%tzkhK-k5tAu}`=>u|z+|uP4UnMNw^{d&KAm;P6`40&zphh*D=e*8?KGZuo~y*`y#Wg}r(PV}?J$Oae&vv%2(eb|cSn}oTUc1&B%M^B@xlvn10$Ol5{Rc(||g*`0AO8zk14;L7H$%dzpg>)#q=gM_#uqc-I?vb;GXT^_H=R{GSK>=VuvqSe%#z|2c2YlT&*kjZ2;Kl!jcm$Q-fVo|ict&Ja4ywb`i8dvCk+h?3OCDUXX&zMsrr>Pa>PMm^gxGuU~bBkga*GhQ$y8PeK(vV5>_veh8WQRi`fT)Py)OBaHdkXS7+2I5uh#w2)7T@22C(Qzp-K-tVkOU|oncF?OgMCg#5sW{yA4RZO!84eUpjR$IRG8(QIv>WqY`&obF`+L^a;Ik$ZPqJ0w+oVi8+fefP_6}>2vq29M(7pWSxwX%h;ULwd}`?78ERR(NNJ_4KVp|BN9>arZL(Qm544oVRUtWw?7Jk|KZ1C{%$Jv!T6;U}wiQVVE)4<71$jhkVz^+^AaNS!~_W(vR4{WJ^svyxk^G3sz?RYo_N1#V&d43t{_A|@#vLRTXJ)mh_LsXCAJVuNHeI8p77$-9H%-!CvcwCI8NI<;c*6{I5uPqIoTdj3Xcr{R+d)6lXf`Tkt(h3PL4|paL6IHOjh`kZhHjzRo&SJapcs5d^H130}9Do<&`*(lN1e>3UmSuApd3~p1>+iw(L!(EeP^xfD*_e|;Pwu$5EVQsNPN$X%#{QH-cBp=0SJ2S&fh>5{xov2Q&Dt8e2OD|)&mt5}pMa#y6QbXmJX!S1_u;C#vl1c(#HwFUIq)H-{6h49qdpK8DkSGDi&|0Gm*`a@fNS(bc?SbL#Nw1qWH_Sm8H5d?bot%W2!a%_xL$l$wZMM0%5SQBB#7p$O|$EKTZ^s?k{J%APQfIG>nefD{BM8Wv~Raz5FG};~ZrIG9BYxbU)6FnJ8gyh&Uq4Ujyc@m~D|>5=W&d7!2;#A`)#%c)a{*uY@1mteo&`!#O*c-WiWMu#FM+$tI&t-Vk$6T+lan2}MAv`?+7wse?lKLKyL?o?r>aEE}`ezoaZ6fF6dUE2tY2^trIgC4f5fCd!?N^%$XSL$_1XK0UJ!A@|%cDxnG}8w&B3$6`#1#KhW&Ql2C)5ib>m5Z=M-qv1|o$Q0|W(_^uCKX09E!%ojzZI?^Mz~TizB4o%X)QO_ql@26ymjSb3)uBO=dFg!x-)Qn;kD+UVD&>jk<8!}Ec-D__4+R~K1U5lNK|w2cixht+FS$0V>V>SzHs(Zk;OrtRtI3kcE`ureK?716@eYVye|+&bYUx-7g@AdF@_<77`U8(GXS0!&D^P-u;Xz}0WKVcbvGrEFSfxcV>TP{Zc-rn}A78K>*`a+rhV?lldBS^}%@}u<;DvwQjfuz0#=9ImWl*WoNvxZqR-cYjGYAGA;O^VeTt+L*r29&lp&rMOX=u*JS$iZmC|mYP!1l_3fkt4g*|qc@{!A}d!ZdZdq-LX&)z*#yYN+$?Bqe|01W`-A|R{90OA;BuKH7-D8K#4(MtnL@`>u%l)7Wo*3m++MZ63TBcQJ>;K$x;rQt+>)>cEy7f1sq-E4-P=o=ctbBsP$HEE{Q{GTSMN5dk@gm=-fy<)o05o|SSOL_PN>QA5sw1_nYpza?AifEtB`gGmk_a_KAt7OI9}fdzZ_1%B7De4O;fOO3G|`*hODWE5!{={Lx~J%N4q)qhTlK;^Vw9bHSA_Rjjp~NFEtw76&M^}{dD!n3d^>P(=?OwyW56Vh-Y=t$TUe%*lb*hV-ny<{h?{d1B!^>a_Q*8%Kdqz9d2T04mMyR?`RR|!?x65zhQKdmwv;0x;sm38pzc6?(-obP9jShOmmBDa3go7BP9vbs9e&i9G9It6$5xhA7WL-OStpny<`(&kVy4?EY97TS{CRW^|JV3P3MOU;M}3+-DhEnhy3!eIqtF+S-{R4s7R6+d;<+>uM>@JZqKZpVUC=+lYb!!T&vJQ_3;B(#xqMak-T8X!C7Y3r#O#;_VW-k*e#2c@cGI4hYrF*;PJq%|7492kH1(f@a^mAw^}9vO?3(2y=4XxWf9{jAevrBh<|B#@>K#!Hj>cVI#kk^TT{*aP}pUue5rsHq(8L+tdb}!yS8}4mQ*vPU%%T>@i_qMFbLb#8SrKL(y*BcH_j`YW)jm|T1MSK=p0r8lb8HXOC#uTA@^z!q4|?60;qd!ah5v9(Nj8;|4c%vp9p0(MOWt_SM3Z@xfoG$eFn%?m)Ewo{?^?%@mxbUbKIBry{Rl4fN>E4f<&q?gs;fV9T4u(+c2s;SK)0GPc9EQp&loO%TJOhA4v1N9qwBbGv`rJ^aCf7kmC-=jfuipSBg6u15TPS61~aBaYw-4Prj*JmPofD{@U68LcjjN~8kBju#C%QXlBhn0MBialPcUz#yBW?Zt~=)J&lw9tsUc^N|mtb^%JYFY2W13!k1KuU?j7XyhzV?#G2;gCs%Zm(iwj2p|VujV<~EGevXYPk5X%8w(_gPL&n0zAHVckP}#);*Xh;mO58ylqV`ZC6wO%L;v|`lL#+2)>teaL-;>%7T}VR@5yN4cl1*?w&|^WMNODQYk6`wk+DhUoiQzwI>y^eSjxVVg6+F6hOjKO~fDDG!y+o_*|8~{-o#Pw>P{qe4;KQ`Rs__H^q`xDV!w#&udFw$=tAjCBbBb*su`G&DDR``?6N}$lV8pjuG?3g8gnwn?q5ax?f513pn?ikJAp6*kZI>*f2U9?6tbKV+);v3=^Pg8o^U7gfQvB+7ix0>uMtUS+6C%1>y`)#GbjVDTP2;2^d2UGZgpB%09^vS#`J`Ezq_UQN}^0W=SHy4EKXmYhp=7HdK1bmv;|9;Q8VW4CDnMI6gAuD@RF1i5&4-V#f#5v#(Co$06y`*OkgGr#-JIW2n9Nf3azCs+jI<^h$>jKVhO*8_6s)dcRHzwS&VnERy_r3KW!w1!5wA^R+GRy?bQR1RTM7ce#4@k{4qt^hoam%JU)|NXu91Gz>+Tiyo1p&pQ;C)O*w??j>_q}RpBFq0rX>7FujB@8=e9f}5yJ|!L&*+cx0?M(g(%c0g1R%n2?$@m$~oJ;xH#bzP(pzwm@-WzsL-btFU##Pqj?H$yQP@j;Dt=dnyc7!OYUVL=aD!I3HbP;3oT43ai-YjpXM06`E`_IzF-F~}3_&~=M&c&26Z~vL;DtfZ{VybL>U>(1^f{=xv7Qcga!kF2$8=KhH~AiaAbPKX$;G7&OpN%z(X--EjXO9%h#-%`8dP&P<8-Y&;I2`f%XnQg!$NKLlK!Uk&1NSS?X$iFhfNf^Y!B82w~(EGFYZ&t;R^5Vnh7Lui5tdS*!kJaRLDXmj_^r}wuZJ=DtZ0-odWL3csa!;yc=<#YVQe2NF|jlU`ZUL12tF_BhQ0%23OZgwIlaJ)#I;uk_$?{8x@Sfu@`xBidLQZoNJI#Q7{0!$dD}BxSgIH%D`Sp40N1;>l2_ht7P9bn?B$CGLB>5S-;!b20&7GKuz~;F}Pcpo$;`wb_DiVo(gZ(E3uc49-fN$$?`2{el5T!DN@CD1_=Yn-ksOFa}CBbdtv}0NwK7)mx-v!_$Km-<)%V)yh>6OWLuLarb&PkRZoB14*Vn-1YsCu*l6}2|YDWxK8iH788e&WiNtZ>w1vRSN)DMe0i>2=D$TF56DX=*VeN;%4Z3bw5+MnnKj_#NST>>6ei@y{e%MZcGv5~3A8tdc(xBfqYbd^-`p9+8{U%}B`QWb)?c3zVHYra&?Q0B%UiXRlv0f|lliRA6}ix&wQg<#wZil3Fb!IG-FbL2yj*dcI-F2wJFPlPRwe`|ZSSQ`x`-Fti3D9;=w|;^Yi7g0O|+}R0h4YTxc9Z%a*BNW>D<~EY~*tpq)rEv937SIVSiU>ZOAANUcK*Pg&Xr;7i(skvhJFD1*{nPxe3USCE{Q2phxq9xKEO=?PoI+F{3uk8*kA}2DeJ|x^HwO+O04DjHOn*dQrk_pg+0E6g8ONMQh>x$A=9FK#K%$9J?w%kxFK~4L+ojeTk21n8|WtdQ8Iny5P8wsjt(c`Tkp6AtH)(tG9pN`w9AYn&6(SlO5F2=VthJ)2Q&QNtMZr1aUmvd657wnbL;J{t)nnyw4rHW+P3OTk6QTzxO$tSa^&Mg0YF_D8KDZU@xyI7^h?lOrl89-)ZT$%3xefxMXHH1$*cr0>k_qiT3BuuKP-o`GU{!5_AcVe10hT{ZJoED8Ny}?XYn%Pfz!8`qt1_+X+>KqhW$>u<=OWkA>7Z5N}&?;Yr@L-@Xk-iB4`I=C)6Xr%JvH8FGt=i8eY1-!o(j@zK^SwP3I(hiA-%=dvP~*?XP5SAeVXWxROS#`E(}=WqY$s+V*V*0dsrww7##U4GBqeio#f1DhHq=*4k&7W?h%DIz2=E7B@VSJDlH!{)^y>V~;96_kVj^FBpwB7aFUK>@@YM$^cgP(3K0WYt=tX@>uYcYyF%0LC;@=m~P+J~8@w7%1sWhUE5nSW@u9CO-Ult9~?)_nI?mek9}&+_x@;ZMsovf-+kS3c;TSzRV5hSLdd6g7vzvrjk^*iB1QXs`OQRPyT7h~Q;r_jgR7)Cri<#!w(=$C}(oW^g?-9R7o-?z&XH!twx(3S5UCA@wKqAW{K>CZ7<1@-A<2sPmr!Q414^Z##x8XkU~ka-s4~D><-kjd9W&-HX3Zi10J<8nrMM_MNnB4Xlop+#w)ZaQD2bXd$$&^8SG;?B}q$FXyxv6DZSDzk^{*9Pcew^k8EQ^a!)d~5eP7cLYd;mS)q(?7z0)-s2A+#SvfZPY$Q`4jd*fCDj{bgc1u8l6T5Z}q~Cx?-6B9#T-SC2XBEfbo}ldQ2cQS-DmWb$XYq2oPqEh$Hd*YwIT@OET4&E;4{`YDKFuSLBSh`_pw>KSn=G+Yb{ok)vCilc$dR~EBwU?=QE%s68S}9)$w%wt!m??KIdT#D}x4U+(Ku5;(=kvs@npZVLJW`jww46>Ur3JYHqspdEH}jpoYQV^4XJb{F+nXsQQE6Sg@=JJ#iWhz%owt25(#=2LS7V124jA2@@o5pdShumd%$wONbs>ZaIhmd|C^(PeVT?Ji`ak>&d6UmLP_4a+CPup0EgSJj7S)@P5{p*~)sHWBPyWGQ!UKnWa-nGtb~QF|^N)R-BP0i2y$Z#%r4C1zL*ru$b*v13olOCX?P+B5A_5rpB%x4_bGn8&Tg4I+;6gOafGz=n(!J6BJs1+;E0)Z+Q>5qZp#w`N={4#nUU+u=Z=57F)&(9UKrh{cyh54$XX1KYN^N8*h>g?p)kM^Y47M+fxlNW5gGv3|NcSv97OK{o_NB@QXS~)=#Qkk%oXB^A|vu(^$y3j7YF`EjQH1Ds|XMUqHC}D?Z-;#x8eGpMreR_=olNY_Y=8>|j6l@7(pJl=)=xm1*}*yK6{+Xqb;|0Hup&#{ixQA(?x|6b59@9hx~sg!%wiEhRg~>%_eoFu!6lWBannefTaq!8vMw7g)UPVTnDG2TaVsau50h^X&wHocL0+)5(`bJAl6y#fV9Bol()sY{)(jK8KFAUK>*Z*yak@^q*8dPUPU57H1#Y%K!sqg?JC-)zV3KaWA`>7K$u_kv*8U*dKDq4*j^{9vAS0M4(C+!7jq64!Or5UU0~^C?GZcx4iXWMu%WUh^+Ubv+x0TosX!^@GMRU@N|7@7ho!SiJVhx7R$U-oX~$Z+Fij7&d12^?$7U18*68VR`DyI*ppL{7EH%M2z4OYtHpJktnN;u0kP13K?Ur%zkd%_%T|^a$Ev*{@sT66vTlI~cg6T*eVpQV$%x+&ha5g3CC?M(H*>Ffo=p|~t^{C2wGoPU2u@HX+5Nox6?f!xZkV988Ur*`+)1WFu-La|7RMX~>1~A>E#*99R~kKB#*#ls+;TjnD8C$eXUMM8C80OMo!AR9x2}DDVG1=bCF|}{W#en=N2EVDDT?kL>xx%XnqtIVau=7K+U*>p!5Rz_Itk6*4V7#;q{gz0ghmy!;Ymy*?*%2LfpR~n+}V67Q1sMNK{a2eIeVceLa*f^r%o5?8^x!juVk7^uDqygDTKryJx((q0B2Q7xpRR{j*cg*>Le#k+grSNGgC3wC0XEPWXF6wCjWDE6AKYlc&icyb6~XXN5wSS`kU9h~y4Sk8=|qM&zoH!_izs6XOQrHoYT<&>Xf#wfZTk-eWkgPNdd?*)!drp~(noHP9KCCSoC0@$W@Dji!MrlOE~w>Kmg`=&^Q$W`HgZ&OF(z|BA<6rO>S8BS4)_IE#(0(h8nv(F{T^;qQJ?XKEwdYn2v*yN`O+3mAuwe%$F~UTWk#n!M?H3^Q|Q*&IcZH@*BY<_Z@9b-)I&8Usjv0>i+bMz%k3IZS<)K*tRKadBTPgZbD>GVUgNrcExfffBL@Rb@tG#11lJFggtN%xl7#>qRk5epdZMbSXr6XpbiGZJ8Nv#;RS+`Hwv*x3Y{4VqqA{AJsREQMaGtxaaP@C#gl6QfADnpExi5YNjs|9P|FmIF#f`EFeUtCUghxVKUxnj7W)*`WC7WJUY8uJb?s+Q=x^mLh^oKk4kZC=F@^J|XODnP~JuC@|%LfwLji2Ejo2xDxC4w9u6Yyje@-wdftm6aA3?*iehG_0lG}O6E%;DJAPV>`DiduKqNJ-^FLR`stC-9O%qcMHd`;b55Wk!jn=&|PFU9g#N!8jgP!+nj%1t9P!ug+Kf>+Jw*&~BfS$2mQ=b8l2q5VEGH4D3Lw-c)7cw0T$lS-#}>mk3lwY;@W~0r{ecE!PEIaY(&gbgw|xtDMEoMV(7^-r3~Of9udbmgZmgo+@)^@}L!g0FAHtlierF9FOYbbpO(^1a(!*H!&#EZ65;sLf(bAi5Kl}@Y5N+rYZ0M0a^1iEoSiUNg67@Xz~x*ht9+`=-{3XDi7PCfEpYjIHLOGq%SfAM}SU&3)`a^)^yM~-H{;sV`!J1mQMG5Wc+8L6#YXa5dr=YFTdC$Si!Xx<}1AsT0Hq`7;v4vA+21dgZ{-&Bw=ma+cth|H*}68(jpb&Q8mgVY|Jfu1z3S>Zu6m$dWmRZlm{+BDS*62?luBwlX8I9B18?FEi7{VkETFRhhOAFw0L6hs{Zuky&w@d&j;Ta~;J90}3r5E&&Y(9x(C&$Ngnphp$K)>e)c?$2Y0S_>5s@*%e@6Ycy^;uyuiopogo!I}DCi-z$2%eN(odm8K%JlTJpC-z{hT2u{M$z;Fq+ppgi_E>@bJz}PNik%Jnr#``=Ly+itRGh6inv2S**)wED?9gj<$N8@f$c3aDhI#W)G!${06_H}xgYo;bYoGeKvlCb96J5=6q;W#1s1_<{I}IPFgAd;5c7&UyCucocFpoEjJbbqS|Vm29k?9T%uC}`aca@&Pa7T1ded`__$jq2qyg9U=X7$B6@DhK&J6H8O+8h~`EG7cB8MB|JKM=1ayC}rht(X#q0YjL^vQ4Iag6&fJ$Y#o?SmFMyeDt{>`HaX_!RDNqC%=o^Ou}PP8{nrKDer7BL(-{m_1!pR)@^qn&kCH2nox%~4jk&qqcBoeYOP1F6obHX`mHWIKA8yB;m8jM*|)a4ma+yKR$Q%%=uNpx6kk|JVHEV0?WqgeaQQ2P3lVcduO@RjtYH|~=t!nX+5AXZ-6t!5oiq{|G*Mtw5Lfe(Tzo;aZ|X<{i7q4R!kn9lRP+a;u=WVW384KXHkhDG;4i`$dyv8ufX^_>a;(>h^ZbmXXM7f=q{udeS1pAa=R;|ejV#Qb%2dri{zUQA8ry`edYlcL4M@k_Y53fyi{z0MOmM`MbSw9HM4tU9I%(eh$(Og3GYtK-gRV9b;RvUB87x>QE%YX$p#A`=mMUus5m*J;-YRkg$A2U^U&qs(j@yy93y?TgQW1gjEL-Y73l{;2(G7x4B$Vczf$NEG=6_iqc2Z^oyP=;=wGSuFd}*y*}8GD-(^M&`^<8}JcCCG1JG&&MzMTVtrqTa&1Qd^PhoRp$oBSXV5^#7Lf@O%}kcL{0~OZOh?m12TuuhaY}$Xt7Jg9Xg9FBgBFg_;P1$vh--dKKiL%L7F#<~3h(6$!$bogWE2AP#dHHw5{%YG5DTpTn!v6Xi^g;YOy#=6xD-@fqJn9(+#ip>3)i14N^@TM-f|xT?G^U5y*UJUJ?ddGD2pZ(SNC0T!)P+A&_IpU$m)#8MCiI}%bD*V`$}=kj~P!&ZOgaZjnd88$x=Mm!mY^$3edEqLxv&2P@*HZdBuigIgCMn}le8Y+JOo2f&zwdpsU#`d84>S-u6w&5Wy{I6wSw#}GJE$ld&8FKH;h+VXKSfM-{LUaluPT9G@BkCI8eAyC@1t)pJ?Q6-!6UX8qIZXME?JMW(u^0IycKm{4N7IJqN-)x_)`3l2_cEIn?+!GyyPBRexQc-Eg^coxePfGa*ak=s!Inr}R)-Hyme{p{41^H3mOddryaaO{Edu8S?U4Pw)HI}98#CQpxxP_xH2vev>Gj>H+Ldl~&KO_pe2lX+ABY6!(1BoI#ms*SOlCt7aHfX+hEV>%$El$E8i-j4d!&*QP4No?g8b5Sf&zUv+V&zzhVG6k4^YmXU2Z&-=Ei^c-(G;|^<76TdDx8vG|Ei+8^vhMon)G7<92~EaE74KwVg_i%7`Xu@sSG^vI1f-Fm2htuOj0D^Zugf#&#;}0wb7NM8wTf(`tUYNiaL+*Pl)Yy1N@6Pm8V1dSIF71&A*u53@=xwDE2|(eO54632oBNOJzR3BeIpy6D&06Ok>a{ho%QvQI@jpiQ}*_lTGwX0137={JKe!r`ojvQ63de6Lio0lJK0yORuCheen4W9#C6mZAqd6R;y&1-_h&Ib=WX(1be3-;|M(=Thd?joY&Gv>>+coi%U#IImh`$i2Li*?}bci>yL!6cX#4$GCw^5W26G$2F+B8K$iy9mEnv9+?Y{vxeSoTUcuGTRopyXbDdWc~oTN%A9qgDz|~_O%TLt?a{=9?AA||iqCwYPP01DfOp+gR6N`gKMd@#kk9p>y`Pkyd_c>z49QN$`N8$PUon8_`qxs$6R@(%_Gclrq%pYEPb?jk(7oQG#ci)}IEIrv{<(L_3xTHCO780rG{9fP~{mdMlYS$H%1~y7l3?*l;~U=uB}Kn6n-<$jff(A}Z_Mr?70Nib-bFzmF*3UnDRVBctPpW@(e%4^Qm_J`=uo1fde)$|GvUHjQX|Mo@&y1>>ew*=PGW{}ynp+7zFI_P`SoW17O1Z$y9Uf{9GZ$3sb8&^aOz`XFO|r~PK^_;fJaH{zQW~8?mb!$IOZ>qC6Wn9o?!3k&Oy+p*A$F_r5O5(^hGbpr0A?6g(f-Ba-#idbEAdGc>we^nKeQOywn=x*_{;i)Wku@|7nl>pvIAbNm3i1%f;d4iBtb)G@q%DT3wt-3TFaHY4obI`I53oO$T-%(xT#o2J7JjRDU|CEQ+1)}HOjx+QZf`_4%p8H8jD+h?Z34R3jmmW-!2z$>>8S$eAYaC5=MJP^j*>Z;sbHyOG0%L+8z33%-WxbS&7P|v#90}d3HuSf5<{E_{Mn7bEaZsev~}efE*0`TP1X#toJ4u3REOU;rqiNl>KR#dADKsqIbUgn2rJ_CoozFTtNjEWKd4hlww>9yhtuRa!v_`ia$lNr+v;UB6PJMAiIs2LmSibjDFU`4f*R4T$F);qvO#7J4%7e$ACsxIZQ$xkvOv(%_imt?{uu$TCty{sJ6^Mi~ywU%&BU5cE(_jt1^xq@9$I9xe_&->XA&@+s8?Q;(mICpigER9HNjQK_V&Banxw@Py%~8eT9x|y#g20CUlOYOf-xL-Mrr3&j<*&KEBvIz6u{~H(qh>0R1f=t1oQ7=wY|;4U8#sWAE68uQL$YX3*$6pGHIz5CdYZCoa1!mWINAQVke4fglIu3p(+w0`qpMG|*JvQeqZlC#7;z9~g^ce|UK8dkIA|Pv=G0>ZOTMQSkgW%*fkq##lk{^F*3z(O8c{Ts+N{9Dmaa=hw}rAG-nm4xj%!C2e%pD@9?0m-n4ug?Ja5+EB6ShhF{uor{{wuUn%&FBOkr4I46ZstA0AitopWGTEXaRC+E-|OW*Nl!EZDX3}r06^h?FBx02j87dt4)T8V|RLuhZ_t7R#PHU2OVuR77}w?QES>bp0Nk+cepWW2wb&$Xq>0-SMw!@@=H<$@Am=>{mfsm8?OrLOD(CK&1Uw~U4-jFVlY9Fv{bzxz+wB;B8-S6v`tiY21iVlLBb#=&X`+x0arm2gEK>z?-jmy|6?enxKM`0!#RClfatP?;1WWa(KHI3bMzo^c#h-h=Ncy-o;lS>jTVjTG#k$;463-Dzh>D7MKxbINRwj#et8(xaY^-{WIq&F7@a{Yk18u|lZCiI4?O+QvO47i;+od&xH+(uRZ0cc=bW`y&8jjjB^5#`N1n+uN|<(Q=}K=jxsY&aUDWk#-LF05{e>Xa=|}^`Q>BTCuD(7iQElDBvPp9S{!W^p&U3&2R~Z=n8ISu%;ByeCF#FA5#KcVaev)jy>Ez0A>qe5_wK7PhKSgeepT_b~b;|G6{CjfZo&pJ)bGTc$5T+x?oUsk%FiWUN(7)#=u1W%E{0xEG9fHw6zH0#5xD~vf^J+iPS@+(jE$QhNk2>V8WLHaBJT4k9N(wld!6wN3KQ~T8TtFJf^x_22WMKBCDZ5Eu=DWi2O!B>A1JzW@lfHLS-zhab{cV|nllGNRDOYz~Gi3_6Bpz$)}lEv3VgU%%FKax1yVogb3(QmW59ql5{`AJL;!wqYUxH4BP-+g%rZ;Jp_>r&Se?{G!4pst$|By@mxXrwU$d*%WE__I!~sQ8NKpKL#h%JahXDh>7&pse?f7w+wiM8{sFTui?*v?%3DtG(~;)jrejOqi;63GIaqnkX4`IAyma$oETQnDKiyUBSxt=azJ_`!R$xeyPj(+4wV+C40lh%BzfgB@`F-pU7ip*3s?(Ko$%y)TSV9ctSTV?kw4*ukN7yW(ft*-;XC({KR+8?aZ`6m32s4V>HSo#g55iYVZDsmyg)Li>?5^&a=Hy`as;D9D1OtO;ukj%7AR7M(iq>`UH#(TGfrjpR3svMSkPR!Z|Sm%n!)B-ls)0_ka(Ksm0=jyxOy1%^H^m`MTD(en0KQrc#=+!xk*~Tz;P!OkzA>(u3qGdoAV7yECM_!7??3NJRa*N0^Y~@GDX}C6|y)Q6_RLIgDsFaq6DpEQ7l#9VNZfOW2l8>{3G)m{P#Za8kov^-Bq_!_9OLrTN8;(*8PE+!xc?adkWjaEv=z=aq2}^qlh-dwX9_693Un8;EV0(%QiCGnS)=nYD!TiRQ^71SY+C8Z%p*P3tzR=J#eLoNT*qd*IqV7Z4!1i;2y$=kGy%LZAkWNYz1mrag|cvh2iIZ3y2BN!|14rZzAv#i3bB1X&b4C^L%9qEOKxM`c%hi^bW+a+i2QU5{BCGyg^)C(tY)$;2q&xSRt<3jL{z^8V8E?y$W^7o=ud5P47sTf;5eooeK*$8b5*m|l?QTHixCpKGgJV20`0j1!5vRZI?$)1HG)R_j)!=3csufE9CPu*pnoE-spDJ=Xh_)lsEIQPGOrq;CwlJ(cbzj-T6IR@r%PRJqqVB8V&PvMM!RTzV$^>!ar$6*kvic`_n-hk+R=ShIk$;YC%4(cCs)f!~=Ry+G5fpyf?Af>e@phiPj9vy{W)~#Y9#?!uGZQn;*byNn(&}J$I6=9I=baSJS3oRzgB552PhavBSQOBQieuP167%AW8!cp?Dx>NlFy3cF^pwo7;YKySnfx}jh?ZHiC-_N0gB08VIMwFU6zWp_anpH16C6;E;>f}4jAI~avZymKQJCG|w{6lm%?^V1!##WO#S@A~{ufAf71Oa@#7T?x0Ag9l414w7%z8FWt2yllC6ZF9Vx%@j!b@3~L7jNiFPl#N_i*&3EJVTupZ6fc1Ld&cX$M|#QGrzed*_NB(}Cd1NTHJUXu2lJA1hrDb_Q4BzaLk_#yXJ+jS*k4NSXK+n0kg1nm*@ZQ{?oAt|VzRsKnIk<&U}0iWa$nyhRxB_1R_O7Ullje&$;^Flmjv8uY+a;dtRMPA|GE)~yvl2(Jwg8AySd>arQ^N3_kUKo#RgtbYU2&idLsXHn6C%`i)w3g*0bP(+c*6_N(Qn4nxYMOxSJ9oAbP%UKHH@4a~p_J%_nR&rkklr5RBvBSs?j7mQw`$&I>nLx!0Jhn#7b#&DVB^}`H)J#@w9>53jaBoDYe~Kvjr_#90*H<&5_ikAH3VSap*AXAo-wnYgp(zf%VxV9zJNCYE}5M*$IhxL*Kq2=Ippaz0(2?O1Ixtu6!fbRCEx*29E`LT1;_uq6ybO#GBE+=D^eC|`!CkGU8^GfeF;jF4JVY@6g!KE|EtT9QG>R@7=*v@^P>;CZqr(D~LmJEl>@8O>bnNC5+1%FeyiJ|6TDJEYynVC*DZDq;bh0NB?YJqV>NtjNTz~jl{%sW!sMlMLmK&z;*TyTc5j$fim7)ep{;4qq3VnYpXD3VaNs!+)`VfkX$jcFfcDx_-dH0NLf`XN{piyYkXf5>hYD?kbYQ;*Cw|%O5A1PXCIo#ho!8%S%y}*xv8^GZep?n#d#1C2E_M4?70ie5_nqJYLYG;q>Xj*}EuT3V)coZoR7iWu2`{{AD;*iPkSOO%n}4agHl%cp+H(l#LYMTORDyMov#?E3ef_quodu`UQ0(TmFjy@`FJW23xE%NJj|KNw&lBEhY_u!j0Ox1<1U%9KnQVDB-8W={l$@UGLw9zObM^6?PNDLmZk7GDa3f!6NY0@ix!oP3Mwk?HQRPFh(PcXy;q;ur{2Jx^Wh4hYi|-J=tcH|}&w3xubM6Zrxnqz{5;)6YUj>a+w}1t9w3k3WEUd}NH5d@G^$MuTov;?ub{4fmbOTg4Lp&C>}CDQMLhDo?ZS$X=fR0vp-Uo2dWO9FYlVz#8fs?yh8+Hwdls#D7ramK_Ot)t9+AMiMQS)5@rJ)TriWQtsZ+ZQzU)s`zb)zVYOa5Fl~oiT(nNc}2eIbFd}UJn0pJHM=+00}o{7Y-_-zo|)jMgH7G@dJLH+Ctze61X1_2Nhl}Mz*`;AX$_4Q%mpf>0@Frd;E3o`JZD}ElW=f%`tU62*2Pg5*F63A?Jx{DCPMdrK>Sa{8!uH@AFWa-(|qaQE9IlkQETl05xK-_DQcEu1NN5hB}ZV$1{lOiYc-YRI`O_oXwQe2%{R@K2wAH!zKY9HjV78KH)dmhOkxn?L5R>`(S#>`#%Bz_WTu`Hq$NpfwFb25&S#8({u#^NXq7)q2%DQrUe1lnA}TDq1{9wPI*P2ap~U$a&StgzLGwWvg|w}?*@=ORyk69tY6U}fF5k_F>Af0De6%PPhn^3wARcqMky3bX#TpsrD(ML)PmgQtBI+#5c2%IpY37BfWYIe#wzPxU$xJ2mHj`e{IP72PyDfmF<|i<*V%t)8H%*oX!`pk|FasO@4gCPVXYG)Lwb53+*#7++My{f!;P~DK!O^i&LJk3J~%OwH~O_kf${HE7(IDj+}=t?#*gcy^5^&WDG^flAXoc!f)d6oZg##&Za-MfWI)!yIW$5_hUZBRFq|;bq{T^KfG`Oi;lB&zX2sM-U`(0Nf>5g91u!hS2$N;kHqVk1v!}H#!&~q-z363k)p7RK%!KX*ud2zmMbofELgjoyI&QeeJFt04+&yEC5+u0XZw;wQ4oK<;;4r=iuL|{u`u<}Mj$HcYc`EgLcp6M4(TfsA&AOz{CpBRQ63FxmSVdl&KhsD&qs);=f;GkyNbh^YbJ%<+kES^R{UvjNbS7huAxhgd_F