From 36e8f50149c346779ef367c595f57410c804c91d Mon Sep 17 00:00:00 2001 From: Christian Johannesen Date: Thu, 22 Oct 2026 11:25:15 +0200 Subject: [PATCH] Add five mathematics and physics programs --- README.md | 7 +++++- orbit-lab/orbit-lab.bas | 36 +++++++++++++++++++++++++++ orbit-lab/orbit-lab.prg | Bin 0 -> 1220 bytes pi-drop/pi-drop.bas | 27 +++++++++++++++++++++ pi-drop/pi-drop.prg | Bin 0 -> 934 bytes prime-workshop/prime-workshop.bas | 39 ++++++++++++++++++++++++++++++ prime-workshop/prime-workshop.prg | Bin 0 -> 1216 bytes programs.json | 30 +++++++++++++++++++++++ projectile-lab/projectile-lab.bas | 30 +++++++++++++++++++++++ projectile-lab/projectile-lab.prg | Bin 0 -> 1108 bytes wave-composer/wave-composer.bas | 33 +++++++++++++++++++++++++ wave-composer/wave-composer.prg | Bin 0 -> 1091 bytes 12 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 orbit-lab/orbit-lab.bas create mode 100644 orbit-lab/orbit-lab.prg create mode 100644 pi-drop/pi-drop.bas create mode 100644 pi-drop/pi-drop.prg create mode 100644 prime-workshop/prime-workshop.bas create mode 100644 prime-workshop/prime-workshop.prg create mode 100644 projectile-lab/projectile-lab.bas create mode 100644 projectile-lab/projectile-lab.prg create mode 100644 wave-composer/wave-composer.bas create mode 100644 wave-composer/wave-composer.prg diff --git a/README.md b/README.md index b9b8c29..3fd9ab2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # C64 Program Collection -Thirty-three small, polished programs for the Commodore 64, written in stock Commodore BASIC V2 and 6502 machine code. The collection mixes arcade action, puzzles, simulations, creative tools, music, utilities, and visual effects. Every entry is self-contained and runs on an ordinary PAL or NTSC C64 without a cartridge or BASIC extension. +Thirty-eight small, polished programs for the Commodore 64, written in stock Commodore BASIC V2 and 6502 machine code. The collection mixes arcade action, puzzles, simulations, mathematics, physics, creative tools, music, utilities, and visual effects. Every entry is self-contained and runs on an ordinary PAL or NTSC C64 without a cartridge or BASIC extension. Browse and run the collection at [c64.p20.dev](https://c64.p20.dev). @@ -41,6 +41,11 @@ Browse and run the collection at [c64.p20.dev](https://c64.p20.dev). | Plasma Grid | 2026-10-16 | Demo | Machine Code | `1`-`3`, `C`, Space, `Q` | Fill the screen with a flowing field of color generated in real time. | [ASM](plasma-grid/plasma-grid.asm) | [Run](https://c64.p20.dev/program/plasma-grid) | | Neon Rift | 2026-10-16 | Demo | Machine Code | `1`-`3`, `C`, `M`, Space, `Q` | Enter a neon-colored world of orbiting sprites, a scrolling message, and a three-voice SID score. | [ASM](neon-rift/neon-rift.asm) | [Run](https://c64.p20.dev/program/neon-rift) | | Infinite Road | 2026-10-21 | Demo | Machine Code | `A`, `D`, `1`-`3`, `C`, `M`, Space, `Q` | Cruise along an endless synthwave highway with sweeping curves and a driving three-voice SID score. | [ASM](infinite-road/infinite-road.asm) | [Run](https://c64.p20.dev/program/infinite-road) | +| Projectile Lab | 2026-10-22 | Physics | BASIC | `5`-`30`, `10`-`80`, `R`, `Q` | Plot a projectile's flight from launch speed and angle. | [BAS](projectile-lab/projectile-lab.bas) | [Run](https://c64.p20.dev/program/projectile-lab) | +| Prime Workshop | 2026-10-22 | Mathematics | BASIC | `2`-`9999`, Return, Space, `Q` | Factor whole numbers and calculate divisor counts and Euler's totient. | [BAS](prime-workshop/prime-workshop.bas) | [Run](https://c64.p20.dev/program/prime-workshop) | +| Pi Drop | 2026-10-22 | Mathematics | BASIC | Space, `Q` | Estimate pi by dropping random coordinates into a virtual unit circle. | [BAS](pi-drop/pi-drop.bas) | [Run](https://c64.p20.dev/program/pi-drop) | +| Wave Composer | 2026-10-22 | Physics | BASIC | `A`, `Z`, `S`, `X`, Space, `Q` | Combine two sine waves and watch interference reshape the graph. | [BAS](wave-composer/wave-composer.bas) | [Run](https://c64.p20.dev/program/wave-composer) | +| Orbit Lab | 2026-10-22 | Physics | BASIC | `1`-`3`, `T`, `R`, Space, `Q` | Explore how velocity and gravity shape a simple two-dimensional orbit. | [BAS](orbit-lab/orbit-lab.bas) | [Run](https://c64.p20.dev/program/orbit-lab) | ## Running the programs diff --git a/orbit-lab/orbit-lab.bas b/orbit-lab/orbit-lab.bas new file mode 100644 index 0000000..0a66ac6 --- /dev/null +++ b/orbit-lab/orbit-lab.bas @@ -0,0 +1,36 @@ +10 GOSUB 9000 +100 G=50:T=1:GOSUB 500 +110 PRINT CHR$(147):PRINT "ORBIT LAB GRAVITY";G;" 1/2/3" +120 PRINT "T=TRAIL SPACE=PAUSE R=RESET Q=QUIT" +130 IF T=1 THEN 140 +135 O=1024+INT(12+Y)*40+INT(20+X):IF O>=1024 AND O<2024 THEN POKE O,32 +140 R=SQR(X*X+Y*Y):IF R<2 OR R>19 THEN GOSUB 500:GOTO 130 +150 AX=-G*X/(R*R*R):AY=-G*Y/(R*R*R) +160 VX=VX+AX*.08:VY=VY+AY*.08:X=X+VX*.08:Y=Y+VY*.08 +170 POKE 1024+12*40+20,42:POKE 55296+12*40+20,7 +180 P=1024+INT(12+Y)*40+INT(20+X) +190 IF P>=1024 AND P<2024 THEN POKE P,81:POKE P+54272,3 +200 GET A$:IF A$="1" THEN G=35 +210 IF A$="2" THEN G=50 +220 IF A$="3" THEN G=70 +230 IF A$="T" THEN T=1-T +250 IF A$="R" THEN GOSUB 500 +260 IF A$=" " THEN GOSUB 600 +270 IF A$<>"Q" THEN 130 +280 GOTO 9900 +500 X=12:Y=0:VX=0:VY=2.05:RETURN +600 GET A$:IF A$="" THEN 600 +610 IF A$="Q" THEN 9900 +620 RETURN +9000 POKE 53280,0:POKE 53281,0:PRINT CHR$(147);CHR$(154) +9010 PRINT:PRINT:PRINT " ORBIT LAB":PRINT +9020 PRINT CHR$(5);" WATCH VELOCITY BEND AROUND GRAVITY":PRINT:PRINT +9030 PRINT CHR$(153);" CONTROLS":PRINT +9040 PRINT CHR$(158);" 1-3";CHR$(5);" GRAVITY ";CHR$(158);"T";CHR$(5);" TRAIL ";CHR$(158);"R";CHR$(5);" RESET" +9050 PRINT " ";CHR$(158);"SPACE";CHR$(5);" PAUSE ";CHR$(158);"Q";CHR$(5);" QUIT":PRINT:PRINT +9060 PRINT " HTTPS://C64.P20.DEV":PRINT +9070 PRINT CHR$(152);" RELEASED 22 OCTOBER 2026":PRINT:PRINT +9080 PRINT CHR$(158);" PRESS SPACE TO START" +9090 GET A$:IF A$<>" " THEN 9090 +9100 RETURN +9900 POKE 53280,14:POKE 53281,6:PRINT CHR$(147):END diff --git a/orbit-lab/orbit-lab.prg b/orbit-lab/orbit-lab.prg new file mode 100644 index 0000000000000000000000000000000000000000..f79f5ab0a7a580a82cac9127ae8afa7c8eddb37e GIT binary patch literal 1220 zcmZ`(O=#3W6n-rpcGJa!c<>(lxk+v=lx@ZZddZx(;5- znJ|-AH7=64-ZvQy1xup3eG9$qEQrt1+YyvSWgF-<3;{n%w;@Ph*P?!u#Qj($2Ri~^ zV6e?wl$J@cZy+}q>@VK~CrY*c$~&bn4xf?oWKTVyXQh}T(E{I>nFTwwxPIyy(OQ+%& zTK&IT{l*L@LO-!gF)bPfd?|l~hv*z8z0ToO=Q?Taq=p6G%b$rvVIs#Y2EWT+2bhs# z(+u`$-v*de7~RE|grnN80T?JS_raXDXDnyL9Bh&~d~I(A?riI;3RUNOT01ay16$-L zxTx)pMJX3{oHCovlYZhM|)&wrl6xw^dx$0p{gs?w^HcTYO9y@a9L_1ffT zTyR$w(FwdY`Wt#&5rUjJkri>vP-Xu5 zskkhHdC!c5f+Cc)jt;vMr-)e}Ny$2_NXt8Ilzp{`WnGsEIaoQHu@nlHr1X3C)Kt4^ zPWpmPF1n%8;aAQNbchkbf!lSRp1X)bpx2h(f*T<9W0NYV=1S$#sP^F!J_+dMp97R0 u_M{WgCt#y;ty;K%T$FjM#aayRS8i9=;a#PFWO(V^EN;D7+`4@g0R8}d8BY%Y literal 0 HcmV?d00001 diff --git a/pi-drop/pi-drop.bas b/pi-drop/pi-drop.bas new file mode 100644 index 0000000..150c86c --- /dev/null +++ b/pi-drop/pi-drop.bas @@ -0,0 +1,27 @@ +10 GOSUB 9000 +100 R=RND(-TI):N=0:H=0:PRINT CHR$(147) +110 FOR Y=3 TO 22:FOR X=1 TO 38:POKE 1024+Y*40+X,32:NEXT:NEXT +120 X=RND(1)*2-1:Y=RND(1)*2-1:N=N+1:Z=X*X+Y*Y +130 C=1+INT((X+1)*18.5):Q=3+INT((Y+1)*9.5):IF C>38 THEN C=38 +140 IF Q>22 THEN Q=22 +150 P=1024+Q*40+C:POKE P,46 +160 IF Z<=1 THEN H=H+1:POKE P+54272,5:GOTO 180 +170 POKE P+54272,10 +180 IF N/20<>INT(N/20) THEN 210 +190 E=4*H/N:PRINT CHR$(19);"PI DROP SAMPLES";N;" PI";INT(E*10000)/10000 +200 PRINT "GREEN=INSIDE RED=OUTSIDE" +210 GET A$:IF A$=" " THEN 100 +220 IF A$<>"Q" THEN 120 +230 GOTO 9900 +9000 POKE 53280,0:POKE 53281,0:PRINT CHR$(147);CHR$(154) +9010 PRINT:PRINT:PRINT " PI DROP":PRINT +9020 PRINT CHR$(5);" ESTIMATE PI WITH RANDOM COORDINATES":PRINT:PRINT +9030 PRINT CHR$(153);" CONTROLS":PRINT +9040 PRINT CHR$(158);" SPACE";CHR$(5);" RESET THE EXPERIMENT" +9050 PRINT " ";CHR$(158);"Q";CHR$(5);" QUIT":PRINT:PRINT +9060 PRINT " HTTPS://C64.P20.DEV":PRINT +9070 PRINT CHR$(152);" RELEASED 22 OCTOBER 2026":PRINT:PRINT +9080 PRINT CHR$(158);" PRESS SPACE TO START" +9090 GET A$:IF A$<>" " THEN 9090 +9100 RETURN +9900 POKE 53280,14:POKE 53281,6:PRINT CHR$(147):END diff --git a/pi-drop/pi-drop.prg b/pi-drop/pi-drop.prg new file mode 100644 index 0000000000000000000000000000000000000000..42f4ab8e1b4ce221c016c07907fb4422cc2cd670 GIT binary patch literal 934 zcmY*XF>ljA6n<=W!XJR?$*E9`qW11=r-?%c;~d0NV>|X0oGvV#J2B7+8m6j+u~jw@ zNR`qQDK3?ekQi7%NGuFYY)JeAR>X7CrtMkQJ-_?D_r71BV+?L<8<6B5 zt4As@-7sfvhu$H6sd9VSgub>3+t|-7e2YT3+nD8?LaX5(AZNlJ^~W|FWi?B<19t$= zwI`5KF>a2<5qJ9+VVH*_?yl$AI3rFUK4=5*b3Qt)R4?i`1++i99DBMz{g zL@{FOb>mf;8m+KpAjW~wI<3kvr~75*@pOZI{VNR7xSvQFt^{Ekv?XF9+bhwUDn1N& zr~iQ0=q=FD-a>AmL9K}kpY>lP%3C;@7`cQ-tIsWSp8>#s5{dva literal 0 HcmV?d00001 diff --git a/prime-workshop/prime-workshop.bas b/prime-workshop/prime-workshop.bas new file mode 100644 index 0000000..a6c66d2 --- /dev/null +++ b/prime-workshop/prime-workshop.bas @@ -0,0 +1,39 @@ +10 GOSUB 9000 +100 PRINT CHR$(147):PRINT " PRIME WORKSHOP":PRINT +110 INPUT "NUMBER 2-9999 (0 QUITS)";N +120 IF N=0 THEN 9900 +130 IF N<2 OR N>9999 OR N<>INT(N) THEN PRINT "WHOLE NUMBERS ONLY.":GOTO 110 +140 M=N:P=2:F$="":C=0:D=1:T=N +150 IF P*P>M THEN 230 +160 E=0 +170 IF M/P<>INT(M/P) THEN 200 +180 M=M/P:E=E+1:C=C+1:GOTO 170 +200 IF E=0 THEN 220 +210 GOSUB 500:D=D*(E+1):T=T-T/P +220 P=P+1:GOTO 150 +230 IF M>1 THEN P=M:E=1:C=C+1:GOSUB 500:D=D*2:T=T-T/P +240 PRINT:PRINT "FACTORIZATION:":PRINT F$:PRINT +250 IF C=1 THEN PRINT N;"IS PRIME.":GOTO 270 +260 PRINT N;"IS COMPOSITE." +270 PRINT "DIVISORS:";D +280 PRINT "EULER TOTIENT:";T +290 PRINT:PRINT "SPACE=ANOTHER Q=QUIT" +300 GET A$:IF A$=" " THEN 100 +310 IF A$<>"Q" THEN 300 +320 GOTO 9900 +500 IF F$<>"" THEN F$=F$+" X " +510 F$=F$+MID$(STR$(P),2) +520 IF E>1 THEN F$=F$+"^"+MID$(STR$(E),2) +530 RETURN +9000 POKE 53280,0:POKE 53281,0:PRINT CHR$(147);CHR$(154) +9010 PRINT:PRINT:PRINT " PRIME WORKSHOP":PRINT +9020 PRINT CHR$(5);" FACTOR NUMBERS AND EXPLORE TOTIENTS":PRINT:PRINT +9030 PRINT CHR$(153);" CONTROLS":PRINT +9040 PRINT CHR$(158);" 2-9999";CHR$(5);" NUMBER ";CHR$(158);"RETURN";CHR$(5);" SOLVE" +9050 PRINT " ";CHR$(158);"SPACE";CHR$(5);" AGAIN ";CHR$(158);"Q";CHR$(5);" QUIT":PRINT:PRINT +9060 PRINT " HTTPS://C64.P20.DEV":PRINT +9070 PRINT CHR$(152);" RELEASED 22 OCTOBER 2026":PRINT:PRINT +9080 PRINT CHR$(158);" PRESS SPACE TO START" +9090 GET A$:IF A$<>" " THEN 9090 +9100 RETURN +9900 POKE 53280,14:POKE 53281,6:PRINT CHR$(147):END diff --git a/prime-workshop/prime-workshop.prg b/prime-workshop/prime-workshop.prg new file mode 100644 index 0000000000000000000000000000000000000000..0c16f36131870b8b15d6238c4b5d7f7220575064 GIT binary patch literal 1216 zcmY*YF>KRN5WOIfY$sws42-9rfD);cZ?|b1he|cc54A|_AN#kI3LyqIq^^_&p-K!@ z3kwn`3xcVr6p6SnA~7I9j7%UgFflPOFdzoReYIOi~9 zT!R6=uiBH-HFtmv^G8O0PvFHcx)9HYlDPv|Hdf#cvS6WiPDJROZqS2Oj{OB+#WmIp z;JUF28yF-Ux3EF{@YGn-fn5h*U@%Mz=&(C{RSjx{p@tXd!>+)LGsZCJUK(faI@&ge zcg804lE9UT<8~?uV{R+qZacAEl?3qFctF&0M-F?$OP^>OSO%-%# zcgXrWHbJq=)?8sdGyI12i_#sP)>*QxQ`u&?gbX&UzlH4o$Liavtc^J}cxD-gNcL2^ zJ?s^>t@9$y53OT|?!gzUT7HQ231^0naW^~JbQ&#gllHehS%X5+DbqI{+~Z8V1B*Oe zJX_Ya^;(l*W<$P#UeHFdB)efGMta5M4H1K__V@6MPXM%VXG+jfHNAH zT@*$`rv3J=52B9Pbq$GxT8M%i5r^GH!Qf|cnP{ldJ}~tv$9d;HKS;;eNA&Y-YGXS1 ziPE)j!TD+x5c8KyIWe>o7?&C10&HDUM$*lEij~wP47N;rZQ1( zmRA4&)=>u;i8#h|Tv8EZ30 THEN 100 +120 INPUT "ANGLE (10-80 DEGREES)";A +130 IF A<10 OR A>80 THEN 120 +140 R=A*3.14159265/180:G=9.8 +150 D=V*V*SIN(2*R)/G:H=V*V*SIN(R)*SIN(R)/(2*G) +160 PRINT CHR$(147):PRINT "PROJECTILE LAB SPEED";V;" ANGLE";A +170 PRINT "RANGE";INT(D*10)/10;"M HEIGHT";INT(H*10)/10;"M" +180 FOR X=1 TO 38:POKE 1024+22*40+X,45:POKE 55296+22*40+X,12:NEXT +190 FOR I=0 TO 38:X=D*I/38:Y=X*TAN(R)-G*X*X/(2*V*V*COS(R)*COS(R)) +200 IF Y<0 THEN Y=0 +210 Q=21-INT(Y/H*17):IF Q<4 THEN Q=4 +220 P=1024+Q*40+I+1:POKE P,42:POKE P+54272,7:NEXT +230 PRINT:PRINT "R=RELAUNCH Q=QUIT" +240 GET A$:IF A$="R" THEN 100 +250 IF A$<>"Q" THEN 240 +260 GOTO 9900 +9000 POKE 53280,0:POKE 53281,0:PRINT CHR$(147);CHR$(154) +9010 PRINT:PRINT:PRINT " PROJECTILE LAB":PRINT +9020 PRINT CHR$(5);" PLOT A FLIGHT THROUGH GRAVITY":PRINT:PRINT +9030 PRINT CHR$(153);" CONTROLS":PRINT +9040 PRINT CHR$(158);" 5-30";CHR$(5);" SPEED ";CHR$(158);"10-80";CHR$(5);" ANGLE" +9050 PRINT " ";CHR$(158);"R";CHR$(5);" RELAUNCH ";CHR$(158);"Q";CHR$(5);" QUIT":PRINT:PRINT +9060 PRINT " HTTPS://C64.P20.DEV":PRINT +9070 PRINT CHR$(152);" RELEASED 22 OCTOBER 2026":PRINT:PRINT +9080 PRINT CHR$(158);" PRESS SPACE TO START" +9090 GET A$:IF A$<>" " THEN 9090 +9100 RETURN +9900 POKE 53280,14:POKE 53281,6:PRINT CHR$(147):END diff --git a/projectile-lab/projectile-lab.prg b/projectile-lab/projectile-lab.prg new file mode 100644 index 0000000000000000000000000000000000000000..ba8f1897663e163a063f60edd141262b5abade57 GIT binary patch literal 1108 zcmY*ZF>KRN5WPwajvGeylT$$~HR=C9cA7X8$xU1*RcLI-jS^-gB!*559U+1NwJ?G@ zAc}-kDRrdQp=)8I8-kgEiJ1{qLgK!Yx~&J>d3W#MyL;!%DOp8@S6F3?K}mTCd-yfa zjb+_>fm++%+^9FP>p4yX^JbyMbgkBdb!7{7us1RB2z$pRh6l)r{aD!sBH0^m+rd0% zg$l!l;|7k?C7KOGWk@u8!Wr@GV~P?_FnF)*LJ-?gsmKj(Rz=wy^9r-vxLT~hneql2 zaWCpcpYtLL^s#F-XFmg-FhU4-b@-?3Uuxe&%?mo~PCaaqmbSf$IPHSu*ECEdN=ZC3 zB9aym;Apjzd?VsaA9GgI?jtsxmfH*^+`NP}c$E1B&#)hJ{D`HB^_F@U#z=_BV59z` zVG?4RqFPQNF03K!XHJRLirJLaj~h{IO!PtAkG@bBhi=r5`mz_<>nS10O^2h*8BJ|4 zk<%K)48CQ4fFBEfc#8P*DHC2ecRHXnP^n0&Qlot)5E@7beG=FEL>-Xsb8o zUSgFN2%f0<9Ccq36}HIa9O#YH+r>`RXthj3hj*&TQEgeBj7hKSmTA@=d{^)0B-zx- zHF_(fq^dDHlSU zVd!22 THEN Y=22 +170 Q=1024+Y*40+X:C=(X+P)-INT((X+P)/8)*8 +175 POKE Q,42:POKE Q+54272,3+C:NEXT +180 P=P+1:GET A$ +190 IF A$="A" AND F1<8 THEN F1=F1+1 +200 IF A$="Z" AND F1>1 THEN F1=F1-1 +210 IF A$="S" AND F2<8 THEN F2=F2+1 +220 IF A$="X" AND F2>1 THEN F2=F2-1 +230 IF A$=" " THEN GOSUB 400 +240 IF A$<>"Q" THEN 110 +250 GOTO 9900 +400 GET A$:IF A$="" THEN 400 +410 IF A$="Q" THEN 9900 +420 RETURN +9000 POKE 53280,0:POKE 53281,0:PRINT CHR$(147);CHR$(154) +9010 PRINT:PRINT:PRINT " WAVE COMPOSER":PRINT +9020 PRINT CHR$(5);" MIX TWO SINE WAVES INTO ONE PATTERN":PRINT:PRINT +9030 PRINT CHR$(153);" CONTROLS":PRINT +9040 PRINT CHR$(158);" A/Z";CHR$(5);" WAVE 1 ";CHR$(158);"S/X";CHR$(5);" WAVE 2" +9050 PRINT " ";CHR$(158);"SPACE";CHR$(5);" PAUSE ";CHR$(158);"Q";CHR$(5);" QUIT":PRINT:PRINT +9060 PRINT " HTTPS://C64.P20.DEV":PRINT +9070 PRINT CHR$(152);" RELEASED 22 OCTOBER 2026":PRINT:PRINT +9080 PRINT CHR$(158);" PRESS SPACE TO START" +9090 GET A$:IF A$<>" " THEN 9090 +9100 RETURN +9900 POKE 53280,14:POKE 53281,6:PRINT CHR$(147):END diff --git a/wave-composer/wave-composer.prg b/wave-composer/wave-composer.prg new file mode 100644 index 0000000000000000000000000000000000000000..5936dcac7d9d180f07c87a81aa7e509a0cd23bf8 GIT binary patch literal 1091 zcmY*YJ#5oZ5WZ}-Q!z3zoSX_`DKvi1PMSEagh_1?sg0f3ZIdo6ox8AfL893ZZN)@Y zx`0#($qlOF(t!me7TAzjSeRMpz>GR@?>UK5d%1VtefRV3dpTuJ(cl2wVX<%Fr}9OKs_vlk86PBPe$hotJz0@Srsyj!>Ol~Lrp=~C;lEs~YGk}4z z3zAzm8v3TY;bAja3xmk(BKk~k_^hF$&&l90QU(;OyXCEA5y>zr_oT%!3f-o+9J=d~ zhn?lldMno9O4+AQrsex7w9)2zsdr4>veKuTRRU@&a=S+AwdAMP~wekvHVE@9x zcVZN{rM?m85$DpuIaJgHI_bel9e=R z^2h222-7fO&RcZn;i>wGO1Sf>?&^3>vtQJx7G1K>5(X#gw=uevp(8dy&lr4Ee~i&c zqCDgB)aS(gss0+Hy$sE`0wwO1`g@F`PAL!2ru~BUS2{07dPjH}Ga;}2gXdVM{e!N( z%!#I*tYHx$SXJ$HF7rr|3|-PrbBD046$?jLv3SianRFAvVq{HJ(;)FwYy zr(R~h8@kY)WB8&i6$H0JqQSLR597@MqgLBP5gK8u9S0cDF?8eD>$ZtQtUsDBS*&6S z-p#KWwBv5D8j1Ax^WiwKCIU%tI&~