From aed31b821ea6c390497abcb512993e0f14908d8e Mon Sep 17 00:00:00 2001 From: Pecusx Date: Fri, 27 Oct 2023 14:27:05 +0200 Subject: [PATCH] All inputs (keyboard and joy) in separate module --- Atari/inputs.asm | 206 ++++++++++++++++++++++++++++++++++++++++++ C64/inputs.asm | 63 +++++++++++++ game.asm | 21 +++++ scorch.asm | 228 +---------------------------------------------- scorch.xex | Bin 56480 -> 56480 bytes scorchC64.asm | 87 +----------------- scorchC64.prg | Bin 39791 -> 39783 bytes 7 files changed, 294 insertions(+), 311 deletions(-) create mode 100644 Atari/inputs.asm create mode 100644 C64/inputs.asm diff --git a/Atari/inputs.asm b/Atari/inputs.asm new file mode 100644 index 0000000..44ca61d --- /dev/null +++ b/Atari/inputs.asm @@ -0,0 +1,206 @@ +;-------------------------------------------------- +.proc GetKey +; waits for pressing a key and returns pressed value in A +; when [ESC] is pressed, escFlag is set +; result: A=keycode +;-------------------------------------------------- + jsr WaitForKeyRelease +getKeyAfterWait + jsr GetKeyFast + cmp #@kbcode._none + beq getKeyAfterWait + ldy #0 + sty ATRACT ; reset atract mode + mvy #sfx_keyclick sfx_effect + rts +.endp + +;-------------------------------------------------- +.proc GetKeyFast +; returns pressed value in A - no waits for press +; when [ESC] is pressed, escFlag is set +; result: A=keycode ($ff - no key pressed) +;-------------------------------------------------- + .IF TARGET = 800 + lda SKSTAT + cmp #$ff + beq checkJoyGetKey ; key not pressed, check Joy + cmp #$f7 ; SHIFT + beq checkJoyGetKey + .ELIF TARGET = 5200 + lda SkStatSimulator + and #%11111110 + bne checkJoyGetKey ; key not pressed, check Joy + .ENDIF + lda kbcode + cmp #@kbcode._none + beq checkJoyGetKey + pha + and #$3f ; CTRL and SHIFT ellimination + cmp #@kbcode._esc ; 28 ; ESC + beq EscPressed + pla + jmp getkeyend +EscPressed + pla + mvy #$80 escFlag + bne getkeyend + +checkJoyGetKey + ;------------JOY------------- + ;happy happy joy joy + ;check for joystick now + lda STICK0 + and #$0f + cmp #$0f + beq notpressedJoyGetKey + tay + lda joyToKeyTable,y + bne getkeyend + +notpressedJoyGetKey + ;fire + lda STRIG0 + beq JoyButton + .IF TARGET = 800 ; Second joy button , Select and Option key only on A800 + jsr Check2button + bcc SecondButton + bne checkSelectKey +checkSelectKey + lda CONSOL + and #%00000010 ; Select + beq SelectPressed + lda CONSOL + and #%00000100 ; Option + beq OptionPressed + .ENDIF + lda #@kbcode._none + bne getkeyend +OptionPressed + lda #@kbcode._atari ; Option key + bne getkeyend +SecondButton +SelectPressed + lda #@kbcode._tab ; Select key + bne getkeyend +JoyButton + lda #@kbcode._ret ; Return key +getkeyend + rts +; ---- + .IF TARGET = 800 ; Second joy button only on A800 +Check2button + lda PADDL0 + and #$c0 + eor #$C0 + cmp PaddleState + sta PaddleState + rts + .ENDIF +.endp + +;-------------------------------------------------- +.proc getkeynowait +;-------------------------------------------------- + jsr WaitForKeyRelease + lda kbcode + and #$3f ; CTRL and SHIFT ellimination + rts +.endp + +;-------------------------------------------------- +.proc WaitForKeyRelease +;-------------------------------------------------- + lda #128-KeyRepeatSpeed ; tricky + sec + sbc FirstKeypressDelay ; tricky 2 :) + sta pressTimer +StillWait + bit pressTimer + bmi KeyAutoReleased + lda STICK0 + and #$0f + cmp #$0f + bne StillWait + lda STRIG0 + beq StillWait + .IF TARGET = 800 + lda SKSTAT + cmp #$ff + bne StillWait + lda CONSOL + and #%00000110 ; Select and Option only + cmp #%00000110 + bne StillWait + .ELIF TARGET = 5200 + lda SkStatSimulator + and #%11111110 + beq StillWait + .ENDIF +KeyReleased + mva #FirstKeySpeed FirstKeypressDelay + rts +KeyAutoReleased ; autorepeat + mva #0 FirstKeypressDelay + rts +.endp +;-------------------------------------------------- +.proc IsKeyPressed +; result: A=0 - yes , A>0 - no +;-------------------------------------------------- + lda SKSTAT + and #%00000100 + beq @+ + lda #1 +@ and STRIG0 + rts +.endp +;-------------------------------------------------- +.proc CheckStartKey +;-------------------------------------------------- + lda CONSOL ; turbo mode + and #%00000001 ; START KEY + rts +.endp +;-------------------------------------------------- +.proc CheckExitKeys +;-------------------------------------------------- +; Checks keyboard and sets appropriate flags for exit procedures +; If START+OPTION is pressed - exit to GameOver screen +; If 'O' key is pressed - displays "Are you sure?" and - exit to GameOver screen +; If 'Esc' key is pressed - displays "Are you sure?" and - exit to Menu screen +; Just setting the right flags!!! + + ; Select and Option + lda CONSOL + and #%00000101 ; Start + Option + beq QuitToGameover + lda SKSTAT + cmp #$ff + jeq nokeys + cmp #$f7 ; SHIFT + jeq nokeys + + lda kbcode + and #%10111111 ; SHIFT elimination + + cmp #@kbcode._O ; $08 ; O + bne CheckEsc + jsr AreYouSure + bit escFlag + bpl nokeys + ;---O pressed-quit game to game over screen--- +QuitToGameover + mva #$C0 escFlag ; bits 7 and 6 set + rts +CheckEsc + cmp #@kbcode._esc ; 28 ; ESC + bne nokeys +DisplayAreYouSure + jsr AreYouSure + ;---esc pressed-quit game--- +nokeys + bit escFlag + rts +; +.endp diff --git a/C64/inputs.asm b/C64/inputs.asm new file mode 100644 index 0000000..7d31a89 --- /dev/null +++ b/C64/inputs.asm @@ -0,0 +1,63 @@ +;-------------------------------------------------- +.proc GetKey +; waits for pressing a key and returns pressed value in A +; when [ESC] is pressed, escFlag is set +; result: A=keycode +;-------------------------------------------------- + jsr WaitForKeyRelease + jsr GetKeyFast + ldy #0 + sty escFlag + rts +.endp + +;-------------------------------------------------- +.proc GetKeyFast +; returns pressed value in A - no wait for press +; when [ESC] is pressed, escFlag is set +; result: A=keycode +;-------------------------------------------------- + lda #$ff + rts +.endp + +;-------------------------------------------------- +.proc getkeynowait +;-------------------------------------------------- + jsr WaitForKeyRelease + lda kbcode + and #$3f ;CTRL and SHIFT ellimination + rts +.endp + +;-------------------------------------------------- +.proc WaitForKeyRelease +;-------------------------------------------------- +StillWait + rts +.endp +;-------------------------------------------------- +.proc IsKeyPressed +; result: A=0 - yes , A>0 - no +;-------------------------------------------------- + lda #1 + rts +.endp +;-------------------------------------------------- +.proc CheckStartKey +;-------------------------------------------------- + lda #%00000001 ; START KEY not pressed + rts +.endp +;-------------------------------------------------- +.proc CheckExitKeys +;-------------------------------------------------- +; Checks keyboard and sets appropriate flags for exit procedures +; If START+OPTION is pressed - exit to GameOver screen +; If 'O' key is pressed - displays "Are you sure?" and - exit to GameOver screen +; If 'Esc' key is pressed - displays "Are you sure?" and - exit to Menu screen +; Just setting the right flags!!! + + rts +; +.endp diff --git a/game.asm b/game.asm index 860330a..1d19485 100644 --- a/game.asm +++ b/game.asm @@ -1070,6 +1070,27 @@ BarrelPositionIsFine .endp +;-------------------------------------------------- +.proc DemoModeOrKey +; Waits for the key pressed if at least one human is playing. +; Otherwise, waits 3 seconds (demo mode). +;-------------------------------------------------- + ;check demo mode + ldx numberOfPlayers + dex +checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE + lda skillTable,x + beq peopleAreHere + dex + bpl checkForHuman + ; no people, just wait a bit + ldy #75 + jmp PauseYFrames + ; rts +peopleAreHere + jmp getkey ; jsr:rts +.endp + ;---------------------------------------------- .proc SortSequence ; ;---------------------------------------------- diff --git a/scorch.asm b/scorch.asm index cf58e0f..e760d74 100644 --- a/scorch.asm +++ b/scorch.asm @@ -410,183 +410,6 @@ NoRMT_PALchange .ENDIF .endp -;-------------------------------------------------- -.proc GetKey -; waits for pressing a key and returns pressed value in A -; when [ESC] is pressed, escFlag is set -; result: A=keycode -;-------------------------------------------------- - jsr WaitForKeyRelease -getKeyAfterWait - jsr GetKeyFast - cmp #@kbcode._none - beq getKeyAfterWait - ldy #0 - sty ATRACT ; reset atract mode - mvy #sfx_keyclick sfx_effect - rts -.endp - -;-------------------------------------------------- -.proc GetKeyFast -; returns pressed value in A - no waits for press -; when [ESC] is pressed, escFlag is set -; result: A=keycode ($ff - no key pressed) -;-------------------------------------------------- - .IF TARGET = 800 - lda SKSTAT - cmp #$ff - beq checkJoyGetKey ; key not pressed, check Joy - cmp #$f7 ; SHIFT - beq checkJoyGetKey - .ELIF TARGET = 5200 - lda SkStatSimulator - and #%11111110 - bne checkJoyGetKey ; key not pressed, check Joy - .ENDIF - lda kbcode - cmp #@kbcode._none - beq checkJoyGetKey - pha - and #$3f ; CTRL and SHIFT ellimination - cmp #@kbcode._esc ; 28 ; ESC - beq EscPressed - pla - jmp getkeyend -EscPressed - pla - mvy #$80 escFlag - bne getkeyend - -checkJoyGetKey - ;------------JOY------------- - ;happy happy joy joy - ;check for joystick now - lda STICK0 - and #$0f - cmp #$0f - beq notpressedJoyGetKey - tay - lda joyToKeyTable,y - bne getkeyend - -notpressedJoyGetKey - ;fire - lda STRIG0 - beq JoyButton - .IF TARGET = 800 ; Second joy button , Select and Option key only on A800 - jsr Check2button - bcc SecondButton - bne checkSelectKey -checkSelectKey - lda CONSOL - and #%00000010 ; Select - beq SelectPressed - lda CONSOL - and #%00000100 ; Option - beq OptionPressed - .ENDIF - lda #@kbcode._none - bne getkeyend -OptionPressed - lda #@kbcode._atari ; Option key - bne getkeyend -SecondButton -SelectPressed - lda #@kbcode._tab ; Select key - bne getkeyend -JoyButton - lda #@kbcode._ret ; Return key -getkeyend - rts -; ---- - .IF TARGET = 800 ; Second joy button only on A800 -Check2button - lda PADDL0 - and #$c0 - eor #$C0 - cmp PaddleState - sta PaddleState - rts - .ENDIF -.endp - -;-------------------------------------------------- -.proc getkeynowait -;-------------------------------------------------- - jsr WaitForKeyRelease - lda kbcode - and #$3f ; CTRL and SHIFT ellimination - rts -.endp - -;-------------------------------------------------- -.proc WaitForKeyRelease -;-------------------------------------------------- - lda #128-KeyRepeatSpeed ; tricky - sec - sbc FirstKeypressDelay ; tricky 2 :) - sta pressTimer -StillWait - bit pressTimer - bmi KeyAutoReleased - lda STICK0 - and #$0f - cmp #$0f - bne StillWait - lda STRIG0 - beq StillWait - .IF TARGET = 800 - lda SKSTAT - cmp #$ff - bne StillWait - lda CONSOL - and #%00000110 ; Select and Option only - cmp #%00000110 - bne StillWait - .ELIF TARGET = 5200 - lda SkStatSimulator - and #%11111110 - beq StillWait - .ENDIF -KeyReleased - mva #FirstKeySpeed FirstKeypressDelay - rts -KeyAutoReleased ; autorepeat - mva #0 FirstKeypressDelay - rts -.endp -;-------------------------------------------------- -.proc IsKeyPressed -; result: A=0 - yes , A>0 - no -;-------------------------------------------------- - lda SKSTAT - and #%00000100 - beq @+ - lda #1 -@ and STRIG0 - rts -.endp -;-------------------------------------------------- -.proc DemoModeOrKey -; Waits for the key pressed if at least one human is playing. -; Otherwise, waits 3 seconds (demo mode). -;-------------------------------------------------- - ;check demo mode - ldx numberOfPlayers - dex -checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE - lda skillTable,x - beq peopleAreHere - dex - bpl checkForHuman - ; no people, just wait a bit - ldy #75 - jmp PauseYFrames - ; rts -peopleAreHere - jmp getkey ; jsr:rts -.endp ;-------------------------------------------------- MakeDarkScreen @@ -614,55 +437,6 @@ MakeDarkScreen rts .endp -;-------------------------------------------------- -.proc CheckStartKey -;-------------------------------------------------- - lda CONSOL ; turbo mode - and #%00000001 ; START KEY - rts -.endp -;-------------------------------------------------- -.proc CheckExitKeys -;-------------------------------------------------- -; Checks keyboard and sets appropriate flags for exit procedures -; If START+OPTION is pressed - exit to GameOver screen -; If 'O' key is pressed - displays "Are you sure?" and - exit to GameOver screen -; If 'Esc' key is pressed - displays "Are you sure?" and - exit to Menu screen -; Just setting the right flags!!! - - ; Select and Option - lda CONSOL - and #%00000101 ; Start + Option - beq QuitToGameover - lda SKSTAT - cmp #$ff - jeq nokeys - cmp #$f7 ; SHIFT - jeq nokeys - - lda kbcode - and #%10111111 ; SHIFT elimination - - cmp #@kbcode._O ; $08 ; O - bne CheckEsc - jsr AreYouSure - bit escFlag - bpl nokeys - ;---O pressed-quit game to game over screen--- -QuitToGameover - mva #$C0 escFlag ; bits 7 and 6 set - rts -CheckEsc - cmp #@kbcode._esc ; 28 ; ESC - bne nokeys -DisplayAreYouSure - jsr AreYouSure - ;---esc pressed-quit game--- -nokeys - bit escFlag - rts -; -.endp ;-------------------------------------------------- .proc ShellDelay ;-------------------------------------------------- @@ -718,6 +492,8 @@ noingame bne @- rts .endp +;-------------------------------------------------- + icl 'Atari/inputs.asm' ;-------------------------------------------------- icl 'Atari/interrupts.asm' ;---------------------------------------------- diff --git a/scorch.xex b/scorch.xex index 5e0355d0f3e17a4fa563d0e263126871e5649c57..8b8722834509741dc558a0520ed9e8a5b5b642bb 100644 GIT binary patch delta 893 zcmYLHTWpL$6gKnsy4Bch8`-!XEZbVqCRn6I@Id%W+keV~st54|S%9WHKjn=A83==Q}6Zs|9I9Y@?rH zk09nHN1#xHq`^P!n3xj|J-xfblFWE&{SjQNXEME-@wCQoB+7>y7b=u_-aOLBE4(he zk9iMU`;6y@Y=xGPSoDFKLZ8Ja_?Ekqh8|;(vsa91Euh$WGN&`E|B3bV&kvTqtp3x# z@aq0mg_wAb#lBZvvu9%zzvy3`1_=hc7~kg0BQJQsH<`qEr>}q{_-o%PUgKXV-}?tL zREPKX)zWGv^Y_muWRO=j6)R_F(-KAUQZyo)ZJ`Jarf?743m%<(x=L-_Z zWEk-OB_9R`DMb~pobgla#m<}l7$?8SH&9o(9DjC%%#9i$VXsRuh3GJ^ij8Im#P@`R zIRFs@s@W4)EKM9TEV-N zq}Xj~bz5*GNQ&#*jw7pLlf!4ZQUqvf4#O(^Wk(Gi&t%ax&tH!WbseNi;8`~)$^M6P zVW)yx(9@y_MSI@Za7TvEsr7?NJC%~SpIvgEhD6`oEFzh5$}LSp1?7yWX~U;@_I=!M DL#$}R delta 874 zcmYLHTS!zv7;ffxL$kI`%CgJfw&bl+s5ZkQ%Bav|X=m10DidMDHPqehp{TS>PB$~5 zF(X9U!rf(Z)pR6ryHUNAwBbWXdl907E)qpO7{1ty8NJLf-^~Ai-+bTi8&rIQ%DpWW zI7H~yikdSPyD#ca35$h;9~o{!Zy-cqYA?fJvBT_Ah~6gvt6_?RQ8N5N?ahbF&S@lj z1Oi3ysTf*|;KAX)&~vEU3x`ygRN0ii+G@DdvhTrQ0h}skvvgqdz@qD37Lim!chXlQ#=FsLQ)+S-?N^s5<^f+>q(FuRx6u)zD!6 zNj9q~3kz3hoo8WOKM?{h4o}b?Z%#}oIZ@&rp56SDcO*`J=gFxGY-l|F^m>FMw6wNR zf?c(nrONSI?`%U89>)ro4AsG1b&4XWtLm>IN8h=2Br9(<)Z-`-je}ax+k^)P&PO9z zTz(-x;R+cJi_#lvi12|6Ut?E@sG@{1_4@6A6Xtq+2qHv0_D(#Ny}j}gA0WeTkgYJQgNiqaYD)bFzWdM6ks{7fH#77YyTW#(`UJF6RlOXwEL z@>(~U|4}nhHT^V5ueK(m79MOp9wQl{JxOfb*1kD5dfGL9yu*g%O^^Sw+;Rh4SoA%R zn$%CM%_arjHo{EUGNO#2Mb6Bg;9~K8UKtFd4@&T~V~8HD@0&tPfrs$Pr||M9dPlT;h}8l<3b-+QwdlF93G m)?mpo>7*FOZoW%&ZP!!=HUm4cT;>cc2%>4twkYT9+ diff --git a/scorchC64.asm b/scorchC64.asm index a9089f2..1127a75 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -246,73 +246,6 @@ StartAfterSplash rts .endp -;-------------------------------------------------- -.proc GetKey -; waits for pressing a key and returns pressed value in A -; when [ESC] is pressed, escFlag is set -; result: A=keycode -;-------------------------------------------------- - jsr WaitForKeyRelease - jsr GetKeyFast - ldy #0 - sty escFlag - rts -.endp - -;-------------------------------------------------- -.proc GetKeyFast -; returns pressed value in A - no wait for press -; when [ESC] is pressed, escFlag is set -; result: A=keycode -;-------------------------------------------------- - lda #$ff - rts -.endp - -;-------------------------------------------------- -.proc getkeynowait -;-------------------------------------------------- - jsr WaitForKeyRelease - lda kbcode - and #$3f ;CTRL and SHIFT ellimination - rts -.endp - -;-------------------------------------------------- -.proc WaitForKeyRelease -;-------------------------------------------------- -StillWait - rts -.endp -;-------------------------------------------------- -.proc IsKeyPressed -; result: A=0 - yes , A>0 - no -;-------------------------------------------------- - lda #1 - rts -.endp -;-------------------------------------------------- -.proc DemoModeOrKey -; Waits for the key pressed if at least one human is playing. -; Otherwise, waits 3 seconds (demo mode). -;-------------------------------------------------- - ;check demo mode - ldx numberOfPlayers - dex -checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE - lda skillTable,x - beq peopleAreHere - dex - bpl checkForHuman - ; no people, just wait a bit - ;pause 150 - ldy #75 - jmp PauseYFrames - ; rts -peopleAreHere - jmp getkey ; jsr:rts -.endp - ;-------------------------------------------------- MakeDarkScreen ;-------------------------------------------------- @@ -338,24 +271,6 @@ MakeDarkScreen rts .endp -;-------------------------------------------------- -.proc CheckStartKey -;-------------------------------------------------- - lda #%00000001 ; START KEY not pressed - rts -.endp -;-------------------------------------------------- -.proc CheckExitKeys -;-------------------------------------------------- -; Checks keyboard and sets appropriate flags for exit procedures -; If START+OPTION is pressed - exit to GameOver screen -; If 'O' key is pressed - displays "Are you sure?" and - exit to GameOver screen -; If 'Esc' key is pressed - displays "Are you sure?" and - exit to Menu screen -; Just setting the right flags!!! - - rts -; -.endp ;-------------------------------------------------- .proc ShellDelay ldy flyDelay @@ -382,6 +297,8 @@ noShellDelay .proc CopyFromRom rts .endp +;-------------------------------------------------- + icl 'C64/inputs.asm' ;-------------------------------------------------- icl 'C64/interrupts.asm' ;---------------------------------------------- diff --git a/scorchC64.prg b/scorchC64.prg index 1d4d09917b12aa14e0114ca0246557f2f1b3e981..d98ed4ede33394e60ab0e008caa9ecf9b93ed27f 100644 GIT binary patch delta 5576 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 M?uAfxMEutDKS}R`?f?J) delta 5584 zcmZ`-3s_TEw$4eyTQHyqg5XB6ieQ`in9^ExVxmp;Xw_Ch(QxD?5G?YNhd_8_BT$10 z+v4Cf*C-syp;8dE-=v*5_WQ2X(Au8c@loxq?X=2B$7))y*J=BW+_e+5)z1CkJA3c7 z)?Rz^yJ2xY3NppAi;VpMN4#Ol3oZv|Fsn*>p;G@O6~GSQ%LOElS~S^vUc74 z|J;h!6{96(s4pKC=b}ryU}ga>6n@4g9qEj#&J1yBUT|&<**jIv=0sLr=5K!L1Mk9hIuEsTg7S=MOV0bRPFd)?TmI! zb4IzsJqDmP7%Y6*y#Rm8HCvRSn;7jW7ecWWoyq6*xC-{!pm+4qO)h$MSaGMTigc|j z3p-J8>^&{;i;Q~2FsJf%8~LzT0qm`T9KAtN`a^MT_piqN91EVjynKgy3Xdys&7FemjVF`?>O3fb+&ykO-nyaHD zDLyX5|JwYc5YhGXgSJupjw5ewit|%Gr&+fpV^@WdT;8-_HfK)B zpgswCGl$8(ZBIR&pNcox3sZ3t2S=>O*C6I$QEyb-#{M%C5(IAr`ZW}q<&Is%WRaWO zP;^9=ATjx@@XV3+coJ^$xXb{Vt6PaK>2Q(#D;+NGDzq`ji{cDcKhS&Q>}g-|`%b-m z9x>~pm;~~+E)2dyx;cRf>Fs_i8Wq=i{Z^by82nim%rI+7AomheNVah^nRZeO-**Ym zA?9;3#KlbrE#Xgz&+zHW1;~&5%*~fSn}b5h)7vLAtI5jkWlx5dB=RS&H{mq?slK-a|31f_rC z^}10xZe$B`hnf<3JnD-v-{>ZWXJVl5CwXblNWD42r)5uG2e2nf;cx|BuXQIsT1;Zn zBbgwwBt2?YYTln`Y3!4^ZihqbOzD@NJ!{NHyNl4$-MrwEvGP1{R1h(wE4>e=;tU5* zPNo;6wB)%EYRN-mdF=W;+EMRxO%$SWwquee5zI-0={5!wFpb7;)Lhi1=Y$a4Na0=% z@!Cj1pi7U^^)?0>DJuRlBDEP)Ho}RgiPE9;p|qg_@q0mr3*ZnRkVZIBITDq;kUKU&r4A+#X-|2~hRI;|o7ru8s|wdz*?fc8M_Lg!j_xJK2%Kx`qQX#KcQZZ6~r=ogK-JX&1 zk@D=y{K}%r;i~ghrIodnxbjfte^ho=_Ea`kwN$lMjZ~ek8mm25e!3bW(29J?xq_(G zdksRcct@Cu``~=7;%y;X{2w70eOrzKE1-Z_*_qYRJ8=c>5+-14BLCs27yb|u=Og6P z0OdxI5QO_si&^l(R<@ZeDvb4SF{5S!Ohl7NdZ9+@(?Ep6nQDs}qywm!5CAjw8ixAC z{ovbg_#==gV`dJpqz@(SN#wcF8RMy$v?rYBax|DTL-wO2GO;K&lG4(EmIkzRKHVu1 z<$Rj+Y`+ZnYm35|y(Ft>CSxJZMY+sua<`~((v}(_RJ;efx+4U`5*9Q2ds0!HJU_pR zYL|Po_b!CYl=}O-1>RnuX^vyW;6%qF&8XbENYgL7x4~DNpBM1z{km&kCQae4NTSmP>+#6?OqFom`~{{pCvnnn#3~# zi75>u`K4a*e)PD#Y#9h|=3vXe*wi!PHo|=8sHCC$MnexuC5KBBLCa^Q3k}cKpm#T) zmViU>W=FSL42AonL5~&yf$z*4@?=>^(T6f+<^X6!+0{VJRUgXF?#b?M z&^N*vaCJj{;D(esn?Ev=n-wtzsCl2!!en4+>zY!s7noob8f3mx+FW$5869 zFV#B(#d#E*$J{j#Js6k{Z^s*^d2U>hgf;WXgR*9X#VmLlT>$pSCx#mDV z^~Euq3Ta~no{cdIaq4BxAlEYIL{Y}hFgm@VIbwABK$B^7#z6BNc24j#3DA6Dbk2e% z5<8bdGY12T9%5&bPxj1>xm)MBuC`uQJHAv~|EgwT_*Zp!jz9FxpWMH!X8%DVD&v;l ztpmfXiNG6mvt%H6^|D%dMe!AXNI`-7kaKGPRH*r(z^Apwm~sS*XCAcsu_gRAwLHba2Nh zc&vDJ>e&Hut*Rg>y8(2JBnn$RkpEG2B&n`m!@Na4sxD;yMwS_p{FdxUXwWESXe~Kx zh?lqOkcE6~_#ML$ubPCQ*LAF_k^e@Np^{?OpDe2hmzEThkISY*aF^Fah7UG@{%>f+ zuv?oT^l3x;~YAvwU;{Kzj&2;=V2~?MKE!c+N_22_Vjy zBj$LpkS}q1nSFrPjqpx@o{vw=n;r1q z3TW$`3`O5}bd86&adRg?htu1oar(FdoG~tgbAoFRJF5kxT}4nxzq=VNAgdduO)YML z(#0x-K=z0WDR=1uZcRf}Opk|q6u1Je{<5E)+yd*ltvS^Y$=oDY8dfk12--Va z0WkP=%dnyyi~}HtMUwW;%UGa?n$(S;0@5F z4+r?9w=5uP4m^#Z#^_@KwripGvcW4m!}9M#D3>4)owG%aN9kbe{uu#bUmi{Tm!HZxTbz0W0@#xZ m5W?icLy^