From 85766dad460d1bcfa8d84b673d6453308c338b0d Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Fri, 29 Sep 2023 15:25:28 -0400 Subject: [PATCH] add file i/o to zipoff, implement persistent variables, write swine meeper instructions --- assemble.com | Bin 12801 -> 12885 bytes common.jrt | 8 +++++ file.jrt | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++ jort.com | Bin 4709 -> 4838 bytes swine.com | Bin 6108 -> 6401 bytes swine.jrt | 22 +++++++++----- swine.txt | 20 +++++++++++++ tinyjort.com | Bin 4754 -> 4838 bytes tinyjort.jrt | 48 +----------------------------- zipoff.com | Bin 17237 -> 18324 bytes zipoff.jrt | 3 +- zipstub.seg | Bin 2052 -> 2960 bytes 12 files changed, 127 insertions(+), 55 deletions(-) create mode 100755 file.jrt create mode 100755 swine.txt diff --git a/assemble.com b/assemble.com index c87cb60fd68bab3f367c210c7d99b3a0b7979d01..04d17ebdb8d164e98321df9dbda80e445d056b7d 100755 GIT binary patch literal 12885 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 dup >rot ! + r@ if dup 0x100 - r@ seekto cell swap r@ fwrite ( we're in a target .com and there is no "self" - abort with 0 ) + MOV ES AX + XOR DI DI + XOR AX AX +0 :> ( search for two zeroes in a row ) + SCASB + JNZ 0 <@ + SCASB + JNZ 0 <@ + SCASW ( consume the 0x0001. DI is now a pointer to the filename ) + MOV DX DI + PUSH DS + MOV AX ES + MOV DS AX + MOV AH 0x3d # + MOV AL 2 # ( read/write access, allow child inheritance ) + INT 0x21 # + POP DS +1 <: + PUSH AX + NEXT + +:ASM close + MOV AH 0x3e # + POP BX + INT 0x21 # + NEXT + +:ASM seekto ( loc fp -- ) + XOR AX AX + XOR CX CX + MOV AH 0x42 # + POP BX + POP DX + INT 0x21 # + NEXT + +0 VAR, fcount +:ASM fread + MOV AH 0x3f # + POP BX ( fp ) + POP DX ( buffer ) + POP CX ( length ) + INT 0x21 # + MOV t& fcount @+ AX ( save number of bytes read ) + NEXT + +:ASM fwrite + MOV AH 0x40 # + POP BX ( fp ) + POP DX ( buffer ) + POP CX ( length ) + INT 0x21 # + MOV t& fcount @+ AX ( save number of bytes written ) + NEXT + +-1 CONST EOF +0 VAR, fbuffer +:t fgetc ( fp -- c ) + 1 fbuffer 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 literal 4709 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 delta 3119 zcmZWr4Qv$G5#D)wXW#AK?%wX+?H=JrCKzHjwQ)mDmDI*|TU+JF#wDrkUgRcNrKuuP zpazMCz=kHWu-d3NE3_z1u=^7QM2ehq0U1|m6m)UrD&D3lsv%8@lFAJ~l9j4G3I^Pn zw|BNHbb7bnn>YV6Z*~tp^taVR%S1Mw8ZHrE3Au*60gBw`BNi-my~zDg@1BdSahjrw zqdTDss#!B@iiV=iY(i{i(NH%&*WvE5XamxTrwjyvmLNogTdkEpEjkvhuk6MDm7=h_ zc&KEmq+`bKn5mqt{AF}JI<$7`>m5_|hd!RF|4r}t*$2Ad)o7pC&3yh`EoR`8=osu= ziKac6o%MhTJH$Uk2cvtrJ4B=1len`a_h2N+DkS%4WI1b<+|kHGPMh?gRPeh^N=OU+ zZo%F6qy`r7+~fBtiTpk#-Q#ygx+LA}_nT7SH$BPke@WHqmXDGf=7xI5%G?RMgB zl{+Ze&N}%YTT5?GZOvz)ngJ`7JK?I7gJ#yva&QE5@(Ig8v)sMCo zJ&{17!0E^ZE)V`x>_J%YU}$zdm-C>$D4?_oM0uL>TPEz!9}>GL?2~x4zxxd?f=RGYv|EW&>emTRNx zA_tl1z=J(%wMJ+@4f`}7vP!cCtY6$H783Hf79_+2Coj>UKB2aA*(qNAc@4vwfZ<(= zP$FN;%lRlrh50LL-=jJicwcjoEeDq(S-3dI)Qc1s8I{02%ziIM?xTBDAu&FNh}`v| z7fm>(Cq-6R~$k;^_rBI*Bs_=(RKNA0R?skwR2VHYq z^*SDX7|+UN`YhHY3m@gpQ789ee|{bxjc4IM@v~Z1{%U+zoLmX|Edz>vLe7Gwd;H1< z5@f7G7cqlA%*3x^URUcBKpALJDFj8L5GjLmdKc8_4o$0mp5rvs>sLagyA#m`jwqk= zSX_WZ3vhT2e@Q28bRp|?itA0ZyI0S`DXyW)@yC58#i|67+cn&X^-% z9}byxF9uNyH5Pvl97%P-@6A4uz6KnA%L==ozi3AjiIn}$9AM{78u;|S?SdP4cFiQo zKG6wSf~gMd1Cypa4(Y@Vb3)9*gNfiSl1MjG5~PkWwcEyoim^2(3O@fibRl#N&wj>B zf!W1ZUsQNH{Dp8D;~~u%cq!q-!??bcaM-h9U`zAV8)0ni};+q`%i5c@UPuflSviU^9O^7i*@)C=2W|6bijIu%hG>?_U z2Z;ub8!(_!o)rFG?Zhg+s7I6i*kap_Zq^izaeTmV*Cs0++R!%vG0-!3#q3YUl9OT- zR~8N?3vmz+@l&yucfrE2ex0PSYPjoXk`z`N+LJ!iamstiPQ1>v4+5V|rt$X8&bBAN zT!{TMBz1C@pC>6#x#SB;9WO0qBL`{xUxEdUSuZ3n$6ebhb5zR%3F~moG$KKoJ^6$@ zzo@44&ENx0OjP(2>l@a|(3Q}8SkE`$IqN%{zg^P4xdp3vpHOMxTL*dGutw##kjLjd zzu-KZHb43pGA%+TQh6MY&*AYGJqQUZl6v5ui4ztZx2EM!t&7%{ZM*mU=!Ye{ca%J} z^_gwhmRE3IzicNQ`evE2M!6Ep)RLs^ro2h7H}6<4CqK7>@+!7vwplm%Anw)Z!uRkp z(1_^4XlgfDJf)7%C{TM+%DE#9&}v&&O|=Qs_M}3`Q!DJ@)CK$PRGXbmP0Q~4snR%;YePekmqLB1+K`3T{|7+{ BXaE2J diff --git a/swine.jrt b/swine.jrt index 161adc1..7d4dbc6 100755 --- a/swine.jrt +++ b/swine.jrt @@ -1,7 +1,7 @@ -import timer.jrt -import beep.jrt +dbg" start" : meep 2000 5 -80 slide ; +: meeeep 2000 16 -50 slide ; : moop 1600 5 80 slide ; : boom 40 noise ; : click 2000 3 boop 4000 3 boop ; @@ -20,6 +20,7 @@ IN-PROGRESS bvar, game-state : uncancel cancelled? if enter then ; ( minesweeper board model ) +dbg" minesweeper board model" 30 const maxw 12 const maxh array board maxw maxh * allot @@ -121,6 +122,7 @@ var neighbour-check if FFLAG swap dup flag-noise b!^ else drop then ; ( theming ) +dbg" theming" array countcolors white b, lblue b, lgreen b, red b, blue b, brown b, cyan b, black b, gray b, @@ -135,7 +137,7 @@ var theme : col-count ( c -- ) countcolors + b@ dup 0 colvar = if drop col-grid else fg! then ; -{ :timm deftheme CREATE >t >t >t >t >t >t DOES} theme ! ; +{ :timm deftheme CREATE >t >t >t >t >t >t DOES} theme !save ; ( cursor grid block mine flag bg ) blue white black magenta red lgray deftheme win31 white yellow black lmagenta yellow red deftheme hotdog @@ -144,6 +146,7 @@ var theme win31 ( minesweeper board drawing ) +dbg" board drawing" : draw-neighbour-count ( b -- ) NEIGHBOUR-MASK & dup col-count dup if [ key 0 lit ] + else drop [ key lit ] then draw-char ; @@ -176,7 +179,7 @@ win31 drop draw-board-bottom ; ( general-purpose drawing ) - +dbg" general-purpose drawing" : clear [ key lit ] fill-page ; : emptych? ( ch -- f ) dup 32 = swap 0 = or ; @@ -190,6 +193,7 @@ win31 begin dup b@ dup while draw-char dup spacer 1+ repeat drop drop ; ( menu subsystem ) +dbg" menu" 2 cells const menu-optsize var current-menu : menu-options current-menu @ cell + 1+ ; @@ -235,6 +239,7 @@ var current-menu { :timm defitem ( cp name iopt -- ) menu-option dup >rot !t cell + !t ; } ( minesweeper game UI ) +dbg" game ui" 0 bvar, cursx 0 bvar, cursy : draw-cursor ( -- ) @@ -270,7 +275,8 @@ var current-menu 5 popupbox ( x ) 10 textxy! draw-spaced-text wait-key drop ; -: fanfare meep moop meep moop meep moop meep ; +: beat 10 sleep-csec ; +: fanfare meep beat moop beat meep beat moop beat meep beat meep beat meeeep ; : display-result game-state b@ dup WON = if fanfare green bg! lcyan fg! s" YOU WON" 26 result-message then @@ -280,7 +286,7 @@ var current-menu ' leave s" Return to game" 0 defitem :noname QUIT game-state b! ; s" Quit to title" 1 defitem -: confirm-quit cancelled? if quitmenu then ; +: confirm-quit cancelled? if quitmenu col-bg clear then ; : draw-game draw-board draw-cursor ; : play enter col-bg clear @@ -290,6 +296,7 @@ var current-menu : start init-board boardw @ 2/ cursx b! boardh @ 2/ cursy b! play ; ( title menu ) +dbg" title" array title-text t", SWINE MEEPER" 5 :noname col-bg clear ; defmenu theme-menu @@ -301,7 +308,7 @@ array title-text t", SWINE MEEPER" 20 12 30 minecount ! boardh ! boardw ! : config-game ( boardw boardh minecount -- ) - minecount ! boardh ! boardw ! leave ; + minecount !save boardh !save boardw !save leave ; 3 :noname red bg! clear ; defmenu difficulty-menu :noname 10 10 10 config-game ; s" Easy ( 10x10, 10 swine )" 0 defitem @@ -323,5 +330,6 @@ array title-text t", SWINE MEEPER" textmode uninstall-timer ; ' title ' main redefine +dbg" saving" { s" swine.com" writecom } diff --git a/swine.txt b/swine.txt new file mode 100755 index 0000000..9a9b58a --- /dev/null +++ b/swine.txt @@ -0,0 +1,20 @@ + S * W * I * N * E M * E * E * P * E * R + +Waddles, your trusty pig, is ready to go on the hunt for truffles! Leash him +up and make your way through the grove. But be warned! Digging too close can +cause damage to the truffles' mycelia, which can take years to recover from! + +HOW TO PLAY: +Select a square with the arrow keys, and press the space bar or enter to dig. +Waddles will tell you how many truffles are nearby by marking the square with +a number. This is the number of neighbouring squares (including diagonals) +that have truffles. + +If you select a square with no truffles nearby, the neighbouring squares will +automatically be cleared out. If you select a square with a truffle, it's +game over! + +You can use the "F" key to flag and unflag a square as containing a truffle +without digging there. If you select a square that has already been dug up, +and the number on the square matches the number of flags next to it, the +unflagged squares will be dug up automatically. diff --git a/tinyjort.com b/tinyjort.com index 5145478ca60ca8c76e41a7db2f96005c3ada803d..7afbfb739756ac4478debeebd0ba15670bf5fe81 100755 GIT binary patch delta 2537 zcmY*a4RBP|6+ZXAeQ)1;yYFXzT7C@#2~kUI*E(8*B)}Leqts=Frh!-_?7k(N{q62s z*tBUkQ$;uB$C@{>IH3crI-^4t)MT9LSk^da*DakI_ih$ap0c;z_m*#`XPp-G4tj#Vu&++r<9*Hdh4)|D zTW>6VnkSzRzs5I^LfI)oDs3dQMmz!+ox6nPAdQ*}_KpT-0;7j>|2>?$dZh1a&F;~? zXGT`OPA6&?1xtO$X6l=qJcQz@tO4`Ik*4;ES{qeG0kVb>GgA-{1EYblku~j`W^MZg z0V1JPE@?s?0azvS5Xlsbjxe-~BhBrbHcr&`3F|~V&f^#-vLh2U4akcltN!2kEYCs9 z;}63R$xKXiLS$<$5-~D%P>TiKW|$!;kwJ1myi7NW2gK+2N5w9Fy(37+#611ASRpSl zzjV$F70_{<9uPm{tM1#;xKwmQD3#2n;zom!h?;O!9HBREQ4}3ugOlXn;@?CHp$vxb zQyCP=PZj)MA-kOvw#IFEu?Kb3fhCaosdebyE+SlDH6((%UrE| zoUf2MvVb8X(YRrk=m|-JtQn3bXO9JBmX0Y`NS+p@0jZyC6j`|#x?diU4srchq0jgM zsaD>6oDbNJtcD+mBCx2laa!?{?94lI35|K$iH>sw4p?%NbBV3ktP67A zmCdd13nvgqo_rD*D+;HqgVNkNCuDMF_0)x#zUzUp^)?y)dbzjhlyzL1Q#d6Z+-s#mnZ}uLO8*5I;JqLQH@9KH^#_oAE6ObVc zf9LdisQ!H!r2D`&pnS{C8$9@ifn5IAWW@@;oL z99ujGIrm+3Fnqj(Z4qz3x2iCzi8@(yWAD>1Gn`(*Mqc9 zwzj(##~wf~n2B@)i!>~Jg!W d>L4{It#ef}4TY+>#AO;vL(vXj$Pr#39=h(MFRU z3C2o4rSOPts8^h}A#NlQU!**T4BBK7w@?+^amL6loW(*lwIM7XAryyC<4tgIVUrDf?B(1_kB9%v8U{XvU@^ zNM-fBlAzZVHWsGhf^alsHpEk@SS}5VRo0{SCj(<^1Ec>qeC4e5iF;F_My-&HD!{DM zB-yF{UUtF5Pp)0JuH~V%t2ea3g9ON~ui0kzuK>LDg%%A60HH&Op7J0|rl$8SO<4 zOPBsuHVbw7hHu&`4jNK5)9Tz^ByEH&4yTcGBY2#?)n1Us!; z`Zhg5kLh_jze3*7DTzkxng+3^!$P(4Pg}p$mNcuXgP5K6G%%jCo`0ayBDp#3Cw}@@@;{TJMhSa?5B4^2X^2kPlcSd zHtP!tKhd1f6HUgWNfvY=;y#U%#va@p^)O;p$b^TIo?E;+i#}~S2iYZzD@<1WbP1Fl z=TJtjhfLEt2h%dHi?!(;cljAx9j7yh4WLu z)G2((6={si;C<)$*vnc#P7l&?`U*ekN>JjfkbsxH@AkMfbQ+mz*J7HV4rm{E{j?ib zg;#Nj#PBc%Ma^s|6HS}QWR!&Sc!Nd;;+MDhy7*yXi|;sJo%GXQ0m7-T85ucW@f9h{ zxdpRM(C0C!3i+q%fJ6rpXp+3E_xeOIqsi{BRE7oJ<$Ke2TODRye$S`2@u2VhbDy9& M{|MwLfIUb51MH~%jQ{`u delta 2521 zcmY*b4Qv$06`q;B{olRa`)MpCDlsmGlyWqN6lw=^b&CTLP)y~dfEz0NZV%SJzufJ` zXZ6TlXp^1`DeavERX|EqB~@BuQEJ+VMm=27Y?4bIi_%nsr37w|lxsPRNsWf`hlwz;w=ytC7vZG+U2u0^eVF z1w~THY$|SqjD%^Sp9!bPu7yiHB6yH%oWZXO6@j2g2963637r;#M1}tj?mWm7)E9T{ zjjm;a^B`*|ZGfpnzQdMC7a`(lp~@u4KY>x6IQVyheD~A=V+h?}NeGMZ(#k>MfW1~^ zk(o?e^pal_{|uLgJBMi0D4r1e**fCCMY^ss6XGQ6;IkqJ@5Icw;bukCxb%-NO8P~`(+X0~VBzsY$fi!c2f`BOM0uGVt?+i#g z!I>vPKy2U`M9IzI9!Wwd#BwN^OY}jFUX+ICc0c(xw-4+s<1H6j-Ys#qR62Y7g(=~J z)p%uf@m8zdQM~qWL7H2+Pr_3jvmee6+n=<&yWQ2rl^ezNwuCG)H#PjpuCBVVcq^29 z$F=7^C@r$3*%R}{Tlt*-yEk!86~}WTJx@ooKbbFH>nQxHcvfm#v`;F$T)eit@amo2 zkHL+RgrevljJ^!j|B4b%nLoHb3#s2IADsH(_?cDm4sm=R=dhu3SC_yf0d8JZiSL3WnAGMc!s0| zxleKMf91+Sc^x??R%&vieH8?6CDI{^G{zOdzee%6*kA|}kMdQ88edmL*BFcU?#Y7Z zQGSF0Z7PCmP4*_JgoA{jO|Ij-!n=;Rkp%mD${`RQCs83sjdaRPT2ON;`Dt6Jk^d+o zOcl@$E0AV0V)f-B1BM0uLu?!Ok!KUXpQDHUKo(Ha7!1*SgL90#$&~@3z!&&2&ZCTR zHS#|5A#;^`Pnl$|a?{Ee)e`B472VYc)xHH+TV*Ec5U4UW0?(JB!;s2B3uNkCsk&(^ zc9Gwx2h;?4U8POfsLC$2P&}0y$feOA)k>pk+BMa|i@Y3Ku+HEX@7Lj$kA3^`ty?=c zJl@gWiPm9+=b*>TM8b%gy)d{&F{MbU?eO0A)QN2Zkfm9Ry6Ff!qO!oK9z5*r2j)E< zjGls5kK$o3y~)!O#yvI|$_s{T3`T9R-=dD-0{@!V!6&>JKMIy0@GtPc2Fr_H7{4&U zXl}QtZD1{cGM@D^=$T$xk1c8mY-M;Hdijj zt;q~-&{{Ouxj(E3ws79aFTA{ifnuB*}+P%ny z$uNqKc)Q3eS~vKsya$Di45fMixhfPYy_3WT$=@*1v~mzb4bMTOl;KDt%Jr9T;TW3(ViAso$ryyxURnH|DM^(>Z zIP?Qwg-?*vzB>cz1R!LaAeh$shR^i9;iD))@`mpf7(kbGjF*A;q_V-ACp5s|2m2gK$!-kxnK^5HKa^eWpYPm<(L+ zEkFHy+o0^Dq()w2eRu@v)& diff --git a/tinyjort.jrt b/tinyjort.jrt index 6177379..2a246ac 100755 --- a/tinyjort.jrt +++ b/tinyjort.jrt @@ -107,53 +107,7 @@ DEFERRED dictionary primary-dict : t" begin key dup [ key " lit ] != while >t repeat drop 0 >t ; dbg" i/o" -:ASM overwrite - MOV AH 0x3c # - XOR CX CX ( non-system, non-hidden ) - POP DX ( filename ptr ) - INT 0x21 # - PUSH AX - NEXT - -:ASM open - MOV AH 0x3d # - MOV AL 2 # ( read/write access, allow child inheritance ) - POP DX ( filename ptr ) - INT 0x21 # - PUSH AX - NEXT - -:ASM close - MOV AH 0x3e # - POP BX - INT 0x21 # - NEXT - -0 VAR, fcount -:ASM fread - MOV AH 0x3f # - POP BX ( fp ) - POP DX ( buffer ) - POP CX ( length ) - INT 0x21 # - MOV t& fcount @+ AX ( save number of bytes read ) - NEXT - -:ASM fwrite - MOV AH 0x40 # - POP BX ( fp ) - POP DX ( buffer ) - POP CX ( length ) - INT 0x21 # - MOV t& fcount @+ AX ( save number of bytes written ) - NEXT - --1 CONST EOF -0 VAR, fbuffer -:t fgetc ( fp -- c ) - 1 fbuffer @yzf0%)FaK+fV?Yb~MZSJ$hZ_GZEXPEQFjHCI_7MGUR^=~~i zn9Z1(O)9G`t*xo6XPHWA>ELXEcPJLZmkbkrX1dcYNac!^NJ~f1@(%vYB#BokMj~EX zyoAkDG8M)Ymdlpn7lk|&lxr2e!s^-@RJe6DD=#lC-FiZ|#>fKRU{9cf{a#tTc-v|w z(Dy1)q_nKOqI}7c@-kuPwuyt;VQFOPlJesE@?mA$W)HVcW7SplSF$ADFYRMYV;!BH zU2HPfYm8!5HPux$b7#aFWVy#LazAwhahQCZ3IE7=mh?3A%zp!#(ZV+OXcw!ZdC z*2q6pG}aP;#%p+kVCv*5Yw77?KjRH=FA$g8-)WVjl zix&^-J<1gR8$2JT0n$1%w-}2b)0k5K6S;Hg#LYciXP`X6qH-ZLRo55NSM2 zW&JQvIWAkhQ{gOcDm$n)EQt6=VGj11+SqWB&hiXw%X6?(YD48P%M|u0SiU$XF>j*n z)BT+-%&avw8xKdYHN8&aRAB`&;TcRaFDUVSx!x`4$hh>3q`7m zu@Yo;T7%_a@ZGa#27eDZ7i-oU8VimGkDmSG;3YuJV?jb3+VH~JLxWYC!iv~W1Y+Z! zv%ebr3zT>|TG*XHLCb@dw}bbd?Hf$gIO`0sCkT5yxc%&=!5e`|bHON&c8L~J+5yfZ z@CE^13$Td5fB?yTS?nW7r|G^4q2dkfJE2c^1u$2zctb;Dp3d_*>72(h49gncI4POT z2Iwtfvk3KpMD@bU`BPYxq2YC%X#tq>r?W<2be`>s!WOW0L!%xpmVl#a0lU`FI20x_ zG?n!LcMIWiPfOh`28}If^#s_X22*2}E*vx%AWYa72s@4i{$s{^vFIAGp z-ZwNh^h(TOs7oWk&q+{cdyCWwY_!qT*pQ|3K8$8fO=EUrV}okiD&?8c%1V}&E-J5I zTwJ#Z;VCZFU}4pWCUy0-6%|0(lT|Y-t17Lpt6E+TIQ{2_Xx0_*`8|Pkjuu~Y5MfSL zYM_SzUuOsK?6lHpJgu2nRy(FzcM!d{*|^BKTMa2&j0Tp~<_&let!}HNU?hNkJte3c% zq3mgI?`#HBjA^C8###JswU@`3sFG18jWv7Q+tEIrZ!(B-H#ir9b`IVoNoqweck_Vh zJ+)8SXFO@xXFQ<3Z1nTxCYnNuNnz8#vkxZhGtM>b1}&saHKNNTIwBBK9@Z=(maPf+ z5OwyN_Rq^Zy!=R-93c|}Z7 zyn}g%_m?!HDna`>yxiK{+0zk(_ZVAXHn7%!*VDop&HLv!E?;&eZL4vyS+LeZO{;9i zTJ!z|-zWamptAB>8bpJu%qG^_)YICE0G^5E^H$Qi!W*RS*rnWOKF^n#?=#|v zJ$G$hZmvBef+-Eq#pQ#WwOP@V3&g$ z(XXUgR~lr4tE^N$pr%=AVkBFQu)o#UPV<$qA6YD{JJ{mu(8cnsG}Lx4vpNGg7LnxfC^$$cxr~5ZCfHFeV#SMz)<+ zp0vg@<}espM~}Y=_u$9NhHv+Ma|PzEpZ*EC+imR9!qfd*|S$bHy8ewds(xaKh`>4fkz2H)X>^5$G0> z6^1~_K2YP4Sc-rCXf=`HMcwfGuBh$DZ#?+omMAQz*BV0x#}~&JUV6aHp4$-h8;xPH zo`b54r?jfGMwWNjkjoz5`dUrRy1(TeeEbSXT_#5MjwprYpv&%xDzQw*C~oFaY)u;i zNq3j0**l-H=mwXa1>;;XENFG1p$3VO$MAZVd0sm5TEx?ct`nz=cA5r7aqBT(?jJ5HG z=-Z`NE^giPNKdQc`o-t00Ic7LxoDp+FOfO%F5vV30$ zMa%>00H?o@QXhjb9t=oJX|7S+a&v3!yD@(LO$@C|!I&tqG&|ZmJ69puw#U*SY`ik> za8=&He?9TVTU8ewtNNK?Qrzn&l|x(qwQV92w2Z=9-t*Zdmu)?9LrDAdkt>(=e6VdH zS6;p0kfF}K^-p3PUPfu6US4gAWm3JPxhD|tV&$MEe?n|X3B+Q_mNlPNZkqid{8({i z)#AnFWmU9inWr#ik=4R{em{De67znAyg;qr6Z?%O+x~MX$?6UgnZnSy7z0`@ng1F~ zc|#*IrOP3@OZjUoIqPMsqBH{T)8TVSQwss#AG2H8VEPhvsd0)j7Z@8{w83PF3n}l# zVxh!(Lbl%@QwZz^4CZjG%2p%6B3v(UefSG0v*T3O+(pBZpdH|8#{xv!Y@$;!E#qjw z_`4A0M5mty=TG9S5gbASLfg8yr($CeU@@Y)u-&{EV=2Nv5PtxsuI2Aq-Ml~kLzENaVLE&@W}3 zkl&2IHGW0BpC5{+p}aSqE526YW;fit4|9mz|KoT~@wOwuA^-b9AT&)WnTQ>Q17l+~ z1z9A`XGuV%F$Sf{yTT`NA!Pwz#8HGLQZrJ2)+nPA@OF7UvWKaL0a3jioHZtc;#uJl zie&v{)F<%<1sRl2<`<-nu+JG4Wil!_Vzu#$m;gCv4B4&0;TxKc=rFN~tW98!*q;>w2MvHTWz8sb%k97EL9i!qtb4rnJ3o)2iZ zqt1&GZZ-LNOhP1Js|j4`P6soMrpkmDMnxr%5*v?7IFIl-Ym}m7gKCJmGj=T}p4NnQ z=(|w040=Yk0YODVF({;;Gyq$|0pK!7Q1iXJ0XOC!}DJA3e&zTD+7F(!_cn z?XdAIG&`iYN0}+=dt2cS5GhvEjD9Eq0hW+H+GOYin)fp`v+ujw7i*MWGz@HhKMxsA0FMy zsV(K|N`s%@0-Hk0r?DFI)4(~cycEA_w3!8c9qU#iYlG5lqklCz6E+`sd30=pfyLkW z+E!zn3G?y=CeMUEPQd2eN3NG!_yY+BoUzb3Og|QquMw?h+2X=L0jofF9gwIa2-xCOUD0!5D5us+Z z5otE23H96kF&EIOattqy(|fZH1fX=Uw7LO{~2RTOr)=WJ=&nObb7ms zAh6G9!-)nh%+w+KATA>|#qgJGn$ps=f=2F~1Q$0ZQs|p*`7D6~UzRPT{0-LUw0YNd z_?p1eiwW=!rhyGv`Vlb^W+d8pF7xvu{8}+&Y`mE5R%vfwO*F8aCWs0-8~=oTsF5Kv z3`yXP1C*3V*;iSjCTh^x*eApm4Ymjq%{~@KShEnWNen4xZAKRK1hD@>&$lN%kZ97u zG{Dy-nIW-&NH-^aK3c`e0F@t1Y5_Wpiu;pZO$1t$LrH&5G&4`Pe|QL!$Mz)B5Plh@ z=S7J&yswDTdX(M}rDG_a5T%nSeTWhwGc3cLppEl9Y@FvNnF#c>w9uyE=ID=MDb)oW z8tmf1BuxAynuW4T7vCZ{sG&kYGQdBjprq~V69KlXr+_7qriYY{Kx9#;U^DQK^x3gD`9?g*O`x@yX;Vsd2hqu!#9F%r{za zJdaUGL$gLB%UmxS=ucw|v>z+zA!3yNDI5O^6HeyzkSX}&HsrC-9Ctyd;d5exx#ugGN zlhCm?3zKsc;{tMBU@E|*?-En(d{>+68+ zz7{+BqsNb}jh#kpH+wfVq`WcY97-hGy+LtsnS&0cCI6AJyA(=8axehh{NAx*^pEwV z6pZ!r7oqxvvBAzxyWi8XZb-LOn>|)x8L*~!%ynZ!N_8@p1G$;8qt0Vv0n#FEu`N~hf8;b2N(YOUroe)#v5!iVs618rSxe}BAq55MfzsrC&%wYR=26*rLiCUhfeqw^7BY-r73&DZX~NzS2a?PLTZXcMil-M z2_K>Yq76tlh}3NJ1ZiPpVD3mYvXX|Wbyb(MuawOb7~4KUAj))v!tNo2dx(RxCnO@m zp|Y38sw|>FV^1OXiO>w}#R>RE>6Xfk>?492BxGV=0UBxBgo)C&ZZWM=CU92V0IMcU zWb8Enr4mrs2>@jh;LJRcL#1F-nG-;rTL2ncOcV(i*m9y&35t;|08l0Yd;n6IePb48S9yHlq{3<)X{@J}9ojohsz89h> zqHVUcjoaK<%X_s!lkc5*KyUKD!U2>3bFx`rL{u#kR zGonwKZKr9w-ay=+Ps9g=xEBRH{QcY&@Vc9V%k33Ha(=Te?UH ze!|X9G_WP*?waKS{uhf+(+HN}r|f@|R8~_<9r=vinRc^pf`Q?ny{<$cO41%GN|T7o z1fnkO;WKsvD_!i?Ia<;lxe6SFkQ_Z}kJ{5z)KD)3wxk`}HA-U*_^2k}ooRo*1?0+V z2|k>5{%U}wB~o~Q+MQ1kcv+cXK9qLXF4X2;T31;i5aG0+ABFkuTDOExrQP!);JRX+ z{%P913gGGptft@hPgsYqdAhly(;tsZmk3$or1af`;Ha)G(>Z3Q@5uuPAtXmddcU1S zN{e-l%hI2y(-D%RE&a*O!m0Jrs&(nFx<_mH6jEO+tlpY_^e5?nBR;t+{a8ynT3KBx z$iGa#@G!u-dI>(8{^fo_r784`{gw2u4hgCR|CIi9SWu;h&ZK|yo}fzbeEPSa5OuLs zrDlA#1W};ydqZx6N$z5?_sgK6NdxbM9*Sq%Bf(TA3AJfa6ymV<7d6Yg^R!sqY4N2L zVRgn@EC+smTZWArkq*)NLpdcKv-APSvAeu2qfbE$&4`O=YVmbw0kAo2jJ@y*t@afo!2=?GNjy|5fiBcR{*94XqPrzL)Ijc zBs=|l!6cF(eT9>D4dEWopw@+yp7a=soYd+eJ(LiV9UNrrebqgatl#dR(dx@(`{l4k?bHM`Y_#7{DDYXxHs3NIu@Pimj^he_L0 zretEJ&ol{wT+5JH!^Z6?1NiX16#Ndm{I+(dElVNy&lnHCW z(lmmHhNokQBQ6USfJ0VrA*mjf%c}FTbXkx{|LbU}H_MeJH80ANmFq-u!{#AkYzAjj zC>wO~d$M2|^6q6YxIo>7$>7V15jBz%H|Tcl!jM^=wIj>TU&&&&WtleqWhOyypf-F7 z)+K01G*V)jkoZ!U7%w10Hc7mhWn@Jw0$olroc0}`GaLWAV3?e}mQw{^0Q0oK%n>4P zbOB_QSbo(4o=HZ3Ui6_U?8#P?J14UFKs69b1rw@|l3 zu;FBxb)se?+bRBwIKsY!v0JlM3hILMS)H>%aGJnLv-T#zH!)L1Sf${Wn{iU-TL3=d z_>TQOi+%^$(^=RmPQsE{E;+4}sVO#I2~L{r#7V!B^BvTUP%U)M5S-NL_Q}*-@*8ag z-MnQo#iu`@d4AAr{0K@ktBsS*n5?a>`ksS?25|mF88S|0#zl6Iv{8%f4+>H#%*YT* z8$eSw&6PGBd^%S8#f-XdvYVenC7i9F+{^Dy^`z3rkh7BqF!gQxazqI^YiOqJos6+W z>T#&iK0!)?_(1|2Y|>8vB(v$ebdky~u91{BopQCHv|I!cN*;1EHtU3dAY3OzBxRRQ=@yhbNQBan z+>EDnLQoL)3K2;;s#AIdWq>FpNKf@&y{Mf-Ka20^%vL>5YAyL8I6 zf^r8@swL%VopPO^>?LIjg|cHhVWS|Fq#Kc;)XJnTH{%1Hcv28gPoeasR%Cd&8HTCS z3-1Y>eeWs=9r1u5s)hQagxU@mKd!9}@B}j9o!otOJdR`_dpC!9_&r};XAcW8q zw(+w}!H7EtejHh{=_qT0Mw4+6*-t4>A4N;<7*g|C?A)%`#VVxD*D+;3p zsoPUt!XHhTw2Lr+oBRRC8o$_Z|8c6DM^B^B@8;Sx+Md3HdG6=&(`d!VVw6o^(j&)0 z=Ws+rf21j4nuSqFjT|(|;~PnPe=3#*DTeyxx--DHr?}9dO2`#81zgjtHv!yS{7bo+o7IRQ!08p zE?By`FK4^J*!U?ayZE9KljoWq3=A|{b{ zZ`VAio(#Ky>TVWmz4qEYOjSaE!Vy%4zQ=byMAL|k~vS7;7Sst8p6ZTFWyPbJ} z4Jp6FhPJqjb}G3U_v)50Hp|hcgdI2lnod-?Vn44_<3T026a87D*GTDibh=&8H9>zl zM`aDQON91sbb79!8wGvaWX^Q*xLoNLGswF{<+s9VbtQ6jD$uDZLRb~TGjl;-D(TB~ z`eZ>j2>Mdcu?H5FuhZ#s1l=U))23ldTq^_MU4q`HIC5~c0dh-ptM&@~E`jeSyf`Y! z%{Z*<J&{-z7!NGlbk2pZV;5wd62<(73z{aonjJ{ zbhxtypNojHC{L~-oF!z3l!cI~DVIajt5Z}#Vd$d8OQi)Hb&4h^xs$Q~jgaorNd`gc zm`o>Ha=h->DMmrrnFpZ=>8MUJ3DS7s*jyc{^)!+zZ!Lz5e+C0 za{#^`utkR{nh@t+!Ff;q_7s^rM|k%Fa{!Vw0SOmU2GD}48sX|^^5tB&@zZQken?3{ z*VQhS-4GTu8~>Z2Fg5{)M-@r*;qqPwE_2a!TKQ@6Nt3(@(2Goz?f_&sd-2tCmHMWc zE^|gX*YXCHt|6Sy$IUPj6Sr#n6_TUxrwj-8^xswLYO~~gH`gd~elb)|j#rhZ@(ir3 zmQKXKQcjMyDXmTe!_`P!h|W~<%C4zwsZ6QtTX<^WsPf4Re^hd0;d2$|O0<%vin=Oy zfEpTSW?2vxNkOJ!!^hSS@+*?|IwRk}S3AW!64EbUr3_Bk=Zu{wF73SR0L&5~aS-YvLeYnM zHiNDQESo`J-L1)VNuY5Cg~zE*m1T>qGZXOTGvGmAuua|tr%=1ucshZ+zuEX|0$tUU zrI0dj25m?xpu086#h;!*cLeCF8y$4hXWmWD^)p^`(t$T!5vW6+R)}xSVE;Pt{up_q zng}n?0HL^UF$nj~*n^Mpv?h^d^Yb;#$_DzrTb*v6UO&+>v2p63#`1|F<&GH!Hfa*Q z$)UcQtYqfnTkw)4#mj^e96N|_y$?Ax1|Dktw3(#w1S~ErbqhFz&!i(>3Wc4y%4IW0 zJ`oB#=PGS8zxOgI?5tEA7$))!5!p+78LWsiZQO+_X)zhTlrX4YN_Z92i*>4v=c7cn zTr+d%T~XM1DU6|aMPcW1QOZN{2ew{QfJVuyccwGE1~U ze?b&>{un|?km<=#*m;Kl#A~6j^L`}(`iGt%QEP1cI#}nOLB9F^E26OTQN=P#J|7A@ zf2H^_O2m7is>N=Kjwi>z0GY@eqOkL2W!fzL6;asvit;o>>0waVc})2!2;%Kf*!h;Q zM?4t{JO8G<4T^YP6Lx+sDB^uk*s1U$P{gyKurrn~0w7)kg`H#h@6g`iM?hgGmc$Vc zfY7TvZZ<9x1W@%%&QZj>pRlu-ADt!M`-Gi~dHw9jOP{dwGJYjNx)oRP{n>H!IKn~q z6e1Tc`|%iJg1G&5&usddMpF}C&S%AmOCJtmADXyC>%|o-+U>q7xJee5)shsp9^=r) zI}x2|X5m0!wvFEzOC`D!^TSI^>##E!wh_kQRx!Yd zg(`ti)29%ufxStmPn${2n+QzguGchhxC;U6FJkPl_Ok*_(L?p$Vaby)mtrWjt*DSI z;`s~d*@&9tHCei^dTfqa!G%72)A!Pscke8G(?yKaBa!sL7AWZxissCWW))R6Rdtm^ z3^slSbAeV3d2>wO6rm5ci(qhBZFwDy|2>Jcf}JUh+#8FU6H@l&(+My=j{t)q=5FK< zKbb?%@xsn-epR7(h8K2jCX@AxBy8mnKjlnypdj{gJCDKy{;Pj#JykMeDWCQ2!WI9}tA%{9v; zBf|6+FTx043HFsugn zG}kd4pVCc~0w=M_vf{*j-?{p|PxO!WEesalU}3Ob+lmnor1N~bSQd7=wCCvw2M}GJ z6$T&=0qm#Yb15n||+K3Bb-C|H&tqr%1 zZJsV6c)fPV94l+{wG8v^&@zf}tqQt^MDNf}x{zs-LAXsFc0Qm*xzH``bRj(Kd|2x! z(g5|4U5{yJ3k(d0PJ(f_wg{x=bsmy>LfcS8-{z@3d$sr?oO8kaj-Utde(j+mXbg0& zAI!I|{~jy|#ne*&-t`%IXejUl38RFQgggYph*Xcv!Q| z$DQQi8vmgEVvdom!=UM0gG!ER??6;MsR0z$rq5IHR*ii7rgji!H;M9D?SIj5@-fM% zh86QA)CS0CxTDB|@1;x1%WLYePsF%1te+jj-1zG3s7H!gTI;6N(>(p#iMV8qD;DPI zhbOKqqTk+$|8UWji`w}XdLq@1YbBzWV+>coO~Ub=G`6!0e@2Z2uLU&4@OK>|H_b78 zHXk=kiAH8u7}Nz4Tt{GoAz^{kv{t~ltBqNL%R@oBfewai3_It?f8SU~1KIoN{0Cv* zsrh8zI9D9_q;fK``@)BcIu}KGs++=(krbN^cW`i*m9OQOy%Y49FjPr`|z)`>eZ!>-kN49n9 z1LYB8V=dko8SPf{k4jnbFB%1Eg)5f(#)1i-yc?)o7omQ6f#s`a0q@eqa@sc^X zYu(%#=n%K!|EG|?uh73ZNH(1*3@IT<1>3=zWI7HhJSYo0Czz(7h*yjl5vGr+NZ1@x z+I-I1>rtF#`V!ax6^l$aBDD5UvBGo;*cK|*nEFx7p~de~Q(TFW975Mv!_F&Ab4!GO znmU6)-1rSUSDUsJ$LkJofY0x1X%QW<#dI48(ox?dJY>39>KI~u$CO!uFGe&ZpaDuh zHr-efCjzjeyUo`cl&`cfi_FF7?KK`>P&^Yv^fsTtK*giLqV8r9Mkbj50(%M3Ow(?% z`37`1(Ztpv-<(=vV43aS)*y)U%$8Ck%MAEdv=KPpoLs81Ou<-U&MF0Ci;Ots=6qsA zG(tCE2WMVTssZe72C&FnOSJZ8Jh=i`WByU837{|=@FnI|1P3B;y?H$;ZuhiPm6w^f zk+68C2XMLhu2KujZ1!|@<5@CA&&$n^kxi|%o4d;VTM}*U!GkZXz2*=>ZJoGoWRN=J|*25rW zB^xah%ZCuuq}wgIR*%p zVW*&a7&8M_JDTYNJ|d&VUyheS-2oiO(Fl6U@+z4MSlm0uQf2vjSqv_IqKAXX$Q@*4 z*!i~Q?Q(jtG7|Tx#SNEW4<`n7vNfp!`(T1}nX%Tp%VWe1YKd*}t%jyj>#PbS0PS9H z7uiHZajBJ8(33T(JfhHV{ivL7p#Bhlz4gk9A?K2}Z?f(fMv%83vEEw|@%D?>#pVCq z+fP>fe|WpP;=gU)D@VeP4s^RgZ)I**9#5UW%zKhKJ2^@HGpLzjTVH2 x=&VY5X+q`n=xR}>wF)nWMVYn;CDAzLV%MRxB)S+iq;-2%lbRnzk9gqD{tuVaYd-)0 literal 17237 zcmaib34B!5_5XeMy*D%26Eax{+azQ`!UU3GNkSH~0Z~W>5;TB_lVl))OeRhy1TYMs z)doS)xL}K|+8~!go$;XS#Gx`g=Y#R!bi+4;sT)3!g{j@uBAD{MLlh@`gDyyid>)&)> zFpDt@ORuc0sI951XBkRG#o#o7w<}?UFTY5*#eA<*kgAk$A}zRtmiy8zW=XtOF%j{~ zviYn?$xs+m*d(?9e^JOqL0P9570#)xL4})Ev8t+yicKdBYfQ}N_ILT(+3U*Oxtmup zf&Q%$K}svDW>(FgUsWmW+&pG5>uqUd#r&$W`l^e{Hcz|QI*rY#u3yR$dB3!eF^#o* zy&Y^EH)@Pv)irafYpN>C>dTh0Qr>^%rl24_r>Lxa(NZ>_FFa-H7pQ)N#F)-z)z;T8 zWsCVaMPtoAXk5!11e2GmthuX$-NGB3veMaHV|j%74R2Un=d8PEii5Cwfn7MS&WZnp zf``H0+3o6Jhd^+K#z|w|Rc;?U$v2&vI@m3(j{s+p&+BL3k_u=L@}qz)A#9`yEYu3@ z1|G)zZl9;M-Q{<)EOp~vU+TGLz+;nyEV3wkC2(wx0)|nU?A^92SsD&+3 z=gu88Mx+lY-wfta2Uqo4uqq%n0?5!tCr#b#cRG2Fug1E!WOYsSUF)vW#c{0?YZ&B<9a( z`$UhonOU^O4Y_Zh|Is;L)c0>yVG~)uV$xRgpkfD%$~MHWg_ z6?4VU>a>Qim;8S_duH%;$Q83DtzmJ&G5?XX?+(rbqKNqkaiHggvj+yNHHDS1n*?J0 z?z2w}z7Hj?_GWf3P|)(bun+vdJ=-^!pmFB)u}2Ae%)jOAhQZr_NiBv^E^VF`RN4R* z5qP5j*8wac&?i9ZzD)Kxq*IN)38La2_LIkuaF3xplg@H85b%HGl!Z#9d7d7LUq zWgqK{8+s+?Ak?Lj;I|}bu)Rm>1UAxSUfhsr@a{yjvQwGOw75YvZ<6xN6wb;QR9sP2 zKew#z3b?136g`a1fj6nEubnv)2wReBVU^Vt^>x*YssN|mr$@35U#rLETVro-ZSup- zsY(s>5YXyv2cDf)yr$EdnPs+Nsdf4>YB!j!Fzr%<%FQO7Wwy9|Zg{H&mE?>B(62mX zTA>G(M?fY-DnuSK9R;Qn7{B0IpbQq9Ol(MHpOARpWHwMF(*Ro}Bwi(#!N-fa2-0i2X+pb(;`I_sND=b^}^XSHTnv-`~R`ViDP^l%pjxNDB zz^|~J)FpQsXn!$BvL>>2L$p%dgjIWO&#!mi?-Se+h$VL|(8&3{|?)y@sWP z?Xw(C4Xs2wwu9=L@&z-EiM>8EOlPg_XgFGJD|gx^t)4W=Ha05UW~-@csE-Pd3SVby z^>lcBep{2*HIVMPwO88esIuHpZNRW;!j=v{jlct8?_xw?mz^5XuN)3rq00t;6Gr9z>ftb& z#0SDmuzy)=8?7ybHDO__)8E|MZisytMtx)p4=Stq_>x}e#$*4H}X?oZzx$G&iwrRu}wcMGIsY3Kia!q7x=C}_l{m4es<5`h96gV4ZHDs zr7J4zrLHilE|#6WcW}dJWj#-9I1pYqdR=(W{Tn_T-?JkG-2t+~;I!DMYAk|4@!y7U zGZ|jeiGH6IvE|rpFTI!-fvsa!-6dr+Um z9@+F}P0gB5a$kDn8c1CwW_Ce@!g4TVRS{oUK0tRh@d(!4f<@oi;c9Z1vfU94#Wv=T zDUM?P@M1JnFAif}VgGk0evFogx3!d=AbY?zIQXB~ejTB+Zm+MI98MnwXH9r7eFlcDTdUv!3)BYuBTsk+?!oWrFz6dl=9VFJ0V&9$6d zFga2z8nT2zgK>jkb4KSAXbuuUB_EeR?B)P@a+v{}WV29=l?nlPRYcsViXr@@&U6CT3BCBU_1 z#9SR61qX{6)qx|LF*_Qf&uQDD=V`R60x<=cU1c#rr6DHfBB$XB`;~3cPX0hlJ?Q(f z$CtW&Wa$^!;!3fj{R!^jod}f?_O!AqrYZ*g){))W$=-^oPZXp03{2{3Z+82ZwRyWs z+1Z$l7nl-=e4Z))*I~R$=C`<;R-*5lR-&H&j&bsw*kV3Dc1T4k`$ANE47~2uL#^*u zDx+yrm>atSrmp6j!<~F#>^&&IjGr6OS3{j37T4pL05p*|#+Js$$9lLomZtKOSgy1# z6W#1YH}Az7qVAs*t10d_1TobA9uNpkOG*Y!N6>-KMrjHnK3dO`fJ&ourO~~-RpNrm z=aISsKMJ=*YA)6PcC1P9xjWo0Il@%KfT&(h&Kk3>xR$$wB3VBfbziKmAcAU@@dc?P z>~khX8HWnigj@M#%!L82jSDI_#hTInw$^rckEpy@XqSx}6=P;Sk_g)Cu|eg}%#R!%o8H7h`qS?51##7S_jThm~id*+Jz(tcAS3dl|X| zMDo?NqMgIwUMiX-D!AUcnXKdMXDvT>M+HDjL`BGSyC7vIaNEmi6Y-NTFHX+GZ{tuYTx zoYRUYc0#;``CHr9tUxdbrPJcCiO+z|`>%_SZqQlmZEtQe#h9@!Utse7=GVh;kZz@} zm&ffD!*tw-(49#?78t3&2Iqtsbb=vg8ZLS<7egkOCD1gIC*ylC6+Vt9FY{Kksw~bT zH!4S(Mk6-f%nI9a0uy`WUQ@_@jzIfeKA($%N9h>hYS8W`92A5TpA+>R235}C@6k^9 zP@0Y@R?=E*jYRy{-rCtR#DB&V8x-)g+;4pH0Z^s9fK3JdA;$Gd}+6bOrEP&%!23ADrhs8oTX|?i6 z%)`&&Z#bq5#-8m`>1^z8z9hCt zu!Wdt^|2VjT7>Wq)}V5?)x`WRAI?7*`Q*g831$OK1w1}+Up&T*NJWXii&t@qr*chV zEEJ_u@!G`h1fWIPmw01>g}FLC7pE}wSVIC$;a5>=5hXgDc8b#VD6JQzqbS`XN+(ge z2c@8r4$H76=#X24L+*dWGJvk;W;!%zVZR1UbpeM47js)87JeeFLRn=o&l4D0u(Il6 zUJ1-s2|ERbOep483e0l?L#7n-7J>O%V92CmzE)tu5#xnSJB{^`EqjgTbVEWf4_9}o zEeSy-IRW=Av}m>~TNCdA;zFFtx&?+@!PdlEfHNiPtZdGl+IlfmPJSYh&fGf^J^V-_ zt(G>lt;6MSYUvi3S$EP1pf+Sy1_13=Z2Jc6U34gd!vy8W3L?wrB~h;}NV2fTHGVga zX{A8VOIm>wuM1aKHCC0)#04;IP8yTU8@{n@Gp(MRs*#jd_T#61!$l>^Ah~#rGCkZlzWMYSh>;xesLqw|Qvfr%F%-B+iW zVFlt?T<`WP*%Wn%$8<1jNT^Z|q~Lg&KoizFqL>dG(b^8%Tbpedk1h|6Ha42EoosVTP+6Z6 z>KqCr+T4C|$@o61p)G&@i0ul6A@8F)C%=4znEfN7lFy`g_)4g59pU$SZ5~(qnjzg% z?K>$78w+dxo;-d;Q28zq+krgH970!IKLQ|a(pEk=NOPNbo`fM??bzAfO@4Q?T{vtC z1B&^P5f||`!n+avlkK;V9(*lO$XqA?am3rnPX3P(hlbw)eP@OfhSm>7>wAHDdju|- zFFK$-$#PjGjtI?YI3iMiadt>gq>K!gZq@H<6t_rWqju_Hqqyn+b@)FwQc>=Phd_+b zY!{PGw3iO(|5Rs>q|6qS8PpteOzcAr8(KNkoW4Wu6f#3n|dp)rfsUG@Y#+jqiz0 zsoccwC8$9{X7&)EOKlr4Y#TG2mdu~f(6RKE8-^391i6BJ!gJ@eZkF?=Soz30u?ONXQGZ#f3EgL_!_%v+FrXZE5VT4IDq&|w;R|(b#T7#EOLq4doz1Uu)+`e6SL}J4Mz93` z#eS2hvYJ{N$R^w0Y_}(j))}tL>&gY<3)_x!Hi@`OAO>wa?*O7=uG8R%O?@abRU#xu zYU=L~!MOQV^+F&o^}wt+jWyr{n1IVt|5}`?ve|PaI4||_g+olRh5F- zoBFF+sLi>cZuU%p2&CS(HdSNJTBn4!rv7Fn;JPw{et+t3`_a5PA$U*f{o7$3zPuUc zzL@&Ra|S}z_-5*^T|msKtu#13O5OdTfsh zt1{BwxG+q^r;z$uVfB=>Be`jSLw!<}b~H8(t(;RK$P3cGn+LG2UV_bO-(M@Jw1k@Q z$>RsFpi1zDv>yY4DtqXTvZTLAQy+dzof|};?CQ#!%!46I7lHv+St|D4m^CuSSz+Pmqz;! z#guf-QUV;u>2k){J_SBBEheO?xwW&Svvn<9Z&=3mLY_3WLzCp+A>;@b7)!c$j3upf zdL`Ul;Oi6Enb`3jFgQpusFaV53e|zn_1Qi;rCqGyZ6Qf^didu5T?sdYgm zH7$xfC$)M=4+Vr|M^JfateFAr^B5;AGr~oR=Ts3knpmn%_qJ9}c)}7)%XxEZH2DU6 z;qC0O%a4X+9+^%JTbXX#LLaeOI`%2_F8X}DZo-tP6eff7fVXVURa3uK}FwRHKx@rQH`A^uBC!Y-VMmE*`(y`NLm<2)ZWeBWMQGW6O zZ_B{db%uqNxL5ljN0yu!o|Q6BOunZx+A{Qv-M9p~Hv`s!rSTFTnx5|saXd#AfJ0WW zBax*i8&!W8k_CzMuR|N+GS3>C&l{B+MCyi|A>y-XoQoB-L-HyeO zkQpUvq)zNH?Anegla^VK>ExZ6yW{l?E8m$x(E3c0t2HF(M0BZyE+lpu5(kCE<3eI% zriqm-_jNePa9Xk7GAqARu)mwRno|YmfpH1UX(4g}BMl#Ahu=A#b}mzaAWe&iEGvJ7 z?MS4KrwQ>%CT%G7GbLYKR*265zJW{lDxr>Cw@_Cg*l@GVMxbUBD-*xrN7zm@Z%UR* zPF-*|8=MV-(+ti&tkA83?~Qa7Zk3$d@w6=l-wf~($4~6eO!_;>T$wm3g0r$paz15n z&ITu~cH*SJlCu|e!&M8NCj}=pI(Zy5m->wkf=(Vgj{MUhG|vN?l^;flR`nBE7A)3f z%ZxJz2@T->i6Ug&%!~{jkm#TmIv<=FPHslJP&xqa&7`%`f{Rc43XfP(SB!J=ZK#B^ ztZ}`3W=d2FeGIvK+yIt7uJ1-YFjB4>T4_thVJ?w+TxzskB7YF_D&(ciIe3<*jJ3Ia z999I*E1}x5M>_ex#_dQXtDZ7OS+3%|OwKN+J?wbekK<^Vt-OPI#s!u0<5YHejigvF zla%WOCH69iQ1Ea(Eyp1E1Y!JTBqAxZ3`(bWrFaiLFg8QM~Fa?-|@8948m$bI3Q|~l#>Q!ji4MSic{9|gF#s< zDBlW-(f;wW{nrah?08f|fh^i@5PAe*{CFsvC6&!GDC-2Jf+%w&#br-eY>++{q;8Nd zuV|3n{i#7ZB}k{q!ntyJs@c@s2a}vUHQUN{xDZ;xR(_WCW5#_3ek(u6KEQ8H&}cF4 zLiAIC+eguoiXjD!P@oPe_*5w1Lqd`1*k{G@irnZKT&#Ff@{?)79Ht4}=<(URJ>tN< zA=}CSm`$$V$sfz6<7qF}xraZWO|b$tqb&N89=aCV22J!sn)YXhF>*d6=MR50WlDt=x$wll^^ONt( z&d2q|BSJ^Zf6zfaxE<&HfML__32+)ym;1b3xRZ7HTcky=K<}4^UQOuL&`;DBlbu{m z{%|S}6XlS1j1}H72e=)Hv|r~Z)6T*KcBY+r^Zh4z9>E6+-i z6es_aUC;3FL-wd-vZ2#1RU;#jT-uu~AL>apg`)Q$8PdrUa`FYn%Hz-!iWg#XWM_Mb zmQ0ZaO(Q42EQcCNd$)%#&Y=il8aQAP z{it4mt&9FTxi^Psb8((%sF*F+epe0`eGoEs zoLFm*2}vvOWq}FQhf$a%BPWvC=W?jQR{lpuL7PoPRkXQN10p9%n!E^o>=F*z@o0|? zvV&sJeGN;W0=r3u#BI!$?8=P7O*dgH4eS;c1#D1h$1%06l1?he(=MM#ZK9d-@q|7l zV8;c}M54+ayTzc!f=b;^^k$;hNaLc)uylH+MzhCa?n;yOW*&D?5GR6$7vrEa#Y z;|~T!6O^5TB4rL36kSkWBnrN((2#s+P|SjI#7_4DGAuejNp5kR?Z+_w3ofx$Fp$$4Uwu0k}gOoh$Skk<$S%?pqK=uEEhr{(prOL7NmpN zk>*s%eg5uT8jo$mZOLcEf_O65%5P=8SVg~}DKm$hUufx&yCTQ`bS@|jmr~@S!e)^R zx8I6OA3u4AkQ@bp_h{r~?RhWeI{BzP`l2aMFYf`i0}eA_@+QQ&L~vH;{L0xJ6oIgbOOG(1Pk3F$hh0a;;nWX?8vr_jG7N?E*Or0YS6!PXvXr(YQSNN_@Dy z+>T@}N_~}|Cij?SCO|JDQOW^0n%9f3o-5UjBAN5)yw$uxr8I;G@{k!uVx8_bN-QBc z`hLoAaZkTjs%aLC8d>nrk7UwaHpIJVG$H$C{}!Iy({mlge8v9 zH}Euvc=JK}@%a!hNCrnQbwrO5Njuj$xFSBXKOQ;3F%U&5HMctO4cW-EqVM;FC#SpL z(aT?sA*FP3e}Dujm1DPqa&LkJW(trv2=!+|(TDoo4oVNuC(~E=rxGbiz&x4U<6rX- zQ;VbXZU@0(lhK2%{uY_HO%Ck_)9u5k_ir$D52I8)SqdtjI_N+$6S{{b7IW8RN*th6 zH@fJi&%6^HS(AGlbm2`Y0)q&~3h}KO?7vT#6D6~siE!Oy5X$Q2f^fy;h6K4MktLsD zu~1em2;Zgd%VA^Q8*R?MVZ@`OgG$9@ou#MK`xzRmamrg5yR!N7%N7bHRz6OA>vcLb z1|DktG11mrCgbX;!YN?n+FkmpC*YW*s8cR|&J%DQ>?rgRnlg1F)3ltNJ{7i^>Tx1<#{Mk>oTVdy#We1u7ol41}NZIBucp`Em1a3 zx#Sg4z;P`|Loa^mnkrxW1RO^d$5hy#D2jNa6L6IA zwJ73kPQWpjvuUAMIRVF2Jc1y@ifj3`SuymG!A^M!p@hqRJX{z+IwvBaY4kOXmL@W^ zrpAb*4?D3BEnK4YBE^bMyWN7DWRa|vsIcoX53Sq_??fxh%BN4W^2%r`QBKVNPFl*s zZm|v$!*E`n;0VdM4Vhy8w`nrBO5SKl`C|SJuvWg!m~){7sBf@*3jK6{)~`H0ZBEpR z=$od65`i!gMW!WXP*Rz`Oj2&n@cdAIWe2o{sFeFQ7pY}qrVeHDJpu9;nBebEy(Ek8 zRe>DfT2fGX9RwqHkHF#6F6Qku-~(LU)JyaBLfUT0H(i>uNBRcf$4J4ir(Bw^M-*CL zjro`6>yaA5&YPw(|NqLPLu_0?mmo?39dBq2--Xr;<T8^IP-zJaunzDHd}Cd$P{Wa`TD0!5+kg6##k?<;^7x``y<*XU#N=7$~d zBL!yVVxkuL#gO=@0$mB^wN^|aLo~(6#`-&!?i&Rvfl$+@5d0WAqS2rqn@r7n1DH^* z*D-KhfWpx0l|!IESfD9}tG*ND#W0tAD7Ebz%oR^nNKba5s>n21%2&NU-=c^NKqUKt zJ8mlO2I1ojPb7QbW+>?sicU|CWHYO4s_SMCF<&IKHuJhD(cnF~19^9&&EKyKpa z2ua1e`N%?rjYsKz{viC1cor9M?Bdqx^cF7Qc$R+zsSK1};qwbMRzH6MU2JR_b%?)T zpd*E6PMw60@M(o+3Mqy--sJVuEi%XmF}=sn!4=Ybxq#zi{tc=wM(J~2iBb_t=lL4c zTY?f-2MZCS;Za<`5v8V17cb!gj*;qrp@=7N0Y{d)6-7LM3pggKzd{jD-vW+lY9%ye zqExEBic$|sSEz5IbPY;Zsb@%rs%ldIK{8aAS6zl84vzuH^=eF!c*hoS+^pU{g&wd4 z9CxTGKsHiwyP7>+K3T(-pk@>yi2xUGAna2o7KL7@1spG_&!Wau;E$+vBum9(stf$$ z(OJN8N?l3(2J{d0Bt|5gxGt#A6&NqA0*)~4K5)^qt4@$2wHu2rNhS?AhH36Xk(N!5 zPee{*hEiRrAa?TMeUl6wUxPDcN(<7<7Fv4oT4g_6v8k9A{8vS*IR%YPj$=hD^iPXu zDwR$(;!Zrm!DJfX$BK^P(v0|*%v33nT+yJ7(wcOoGLt3qQizN@CfS9YzgbD(v6AJDhXBBD`W zP)T3^S4uQ8d#1kA0M`)MpzkY{npO*Vg|1<3AZ5r;dFNnQt4}M9{kgIB2C}!h zv}WSuF*lWxeXkeAAezN{@rruUBxh|MIKn1L`}gG#*W@vHH&z;k_uH;+JDCIJTl9%D z3`|ptSpU!HWiuirPm50`*9RPb)$2mYRYS-N`oA%9jo#Ir{x!%TLd<4*zu3fDLf{0` zZ8OXUNG&ZiEl0ywg~;Q{!9m^bZY~9Uv+2YPJZls%z`IPp z0odX-Cdxymf6u^!QllAvG<^YRl>r?wMV5hP^yq0*3ZPX6^ttJsQe>*rCi1nZvJ6FX zwHHkPo`wwTCa`4F&pyNDTK zz8%;`!seI{lyKHokK$DGc3^!}EHM|tp>|Pmruimdo2gi1u0=72w!ACNkC&OKLnwJQ z;JC*8VVUTkMz7zGJl}w0m3drQtkD5>@Ok9xEp(K5DhRTpen!|~{#@!9Vm)qttqk9Z zXi7i>lzw5JR30PTuD!FRb(vqj&B7|OoWf{#yITF?aUguQ85EhT~04}mjuLxrqO|FhkJRBzPxx{jL1#DVIXSi!ESCiFE#|@S`wAm*^h?_0t=pBD69{YfKhvf{Kh}1#1yO~zZW0qBz sQ>iq2p2eAvlF_L=U>PCGG_l{eWQj6G5$7y#mnkfO(hrtPUbC|Q0hvA5mH+?% diff --git a/zipoff.jrt b/zipoff.jrt index d8bd29e..25b5e91 100755 --- a/zipoff.jrt +++ b/zipoff.jrt @@ -139,7 +139,8 @@ var comfilename : readcom ( filename ) open 0x100 target! begin dup fgetc dup EOF != while >t repeat drop close ; -:init comfilename @ readcom } ; +( we write a fake all-null PSP so openself can fail gracefully ) +:init 0 target! 0xff ALLOT comfilename @ readcom } ; : writeenv ( comfile wrapper -- ) swap comfilename ! diff --git a/zipstub.seg b/zipstub.seg index a99766938856cf72d606b509cea420cee66c28f6..192cd705efc6d79f4b0b53bf31cecc7a301e83b1 100755 GIT binary patch delta 925 zcmb7?L1+^}6o&WB)MRHSR6P|5Y9ckYsF4L5Jy=asM4<)>BF4rX66i_9Kw3O5f{1G+ zF^I-n@uFT@Ls+a;4=F`rC~3$o*n?tAE*^y(5@ns4Z5nI6c-Wo!|M%w2+i&09J&*eG z@0|Jv)jXq>Co10YIb+!xSW(U4Jlc|<)fvYzg%qdU>7r(7#rf%9^V6-@M(e=CV!AF; zE8c_l$z8-e8?AU{mAynOYGpGN<%Ohi1Qf+b%yZF+YZb5II7Fm-nwWZUyEP1!$W1^D z#z-&fCu8I#_K+<8h6-?ll;9#sLIRpRTE})yfID}Hww7Lw*4At5KI=B}S*PR$&$@QY zmvQ0xNZW7u_tWzz! z{w8vn9c7qxC<*nQH}{<7-w3)PPB*j>ci~2S&bZEJevxg&`+o|>h4|TkW?2j-Srfu2 zg_`h$^B42?iCsk{D8YiP-Go^-$?W|-)jrY5Z1J8J*yFd(OD7XhSBH23x15mzJaAR{ aY$;&y+1X7