From 3576cb9bc66f6f152d33ba11f836fc9dee867b73 Mon Sep 17 00:00:00 2001 From: Randy Thiemann Date: Mon, 23 Oct 2023 12:16:16 +0200 Subject: [PATCH] Decoupled release. --- DMGTRIS.GB | Bin 32768 -> 32768 bytes README.md | 47 +-- src/constants.asm | 29 +- src/field.asm | 42 +-- src/include/globals.asm | 89 ++++-- src/level.asm | 9 + src/main.asm | 88 ++++-- src/res/sources/tiles.gbr | Bin 39009 -> 39009 bytes src/res/sources/title_map.gbm | Bin 4388 -> 4388 bytes src/res/tiles.inc | 162 +++++------ src/res/title_map.inc | 72 ++--- src/rng.asm | 53 ++-- src/state_gameplay.asm | 31 +- src/state_title.asm | 528 ++++++++++++++++++++++++++-------- 14 files changed, 774 insertions(+), 376 deletions(-) diff --git a/DMGTRIS.GB b/DMGTRIS.GB index 3ed0ec5e06c3969c4b4d4f2a0eef90d4b5092fc5..ba018aa8519c966dc7018c1418140addb36aec63 100644 GIT binary patch delta 4569 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 delta 3973 zcmaJ^4R93I9e=y`mAhO%4uY-_U^jQbiV9d5rI>6Y6PuU>E>sed3*?k`h6=VyKLq)@ zKucxfATX zKGce7L@B_J4+|6?Ct7jFV5AjW@hv>0Sgrb!8%oWb=J_!hg5ox-ED+SYL13mHise z{YafU{oeb@0OLu&z>}+#6YXSo?j;l6EeHm26^MSyosd=k^!YPo$xBXCOH`I9FUypZ zJrs!($sk3{#IeQ{mDSeik8`qmZTfd6$kI6SL2>pJFrUf8XUJ~cr5(tI4SGEUrqdL` zJnO})le}z{{3JEWPf&|Iom%B7)TXYL9<~owD|Rhj6{=8!(la(dsen{xjx@<&1T%RP z?wLlcsbX@K9%$>Yrm{1Ylc_S8 zY64SD8d33`)Y26InT^RDOy*>=3?_4pm6@3{D^uB-DwV0ym@4D$suZSjFqM<3((kUa zF;#(`$x@jtZA8X(QWKlf%%-$5nT@IJOywA>;=2y0-?*E&BWibe(YAywgH@enzH zUlp>+t9kfUirTfavIb8f1)j(VJIs-WFU+_BXrjWA$xt}_8hM*0I;L@&cO@M5w~1Or z8oqK^#6jFZR6iU5Uba%JI&Fr)dsnIpXB6=JYSm3M9($}|hEp+r+#&rbWKErIp$XYc z&Ehw$M@5H~(}v0B@g%P`sANVq*Py1&WbN#k*(1JQ7%#Vu_*y-lw1Kbfx|g@~_L$yw zj`5g1evos-WBPb94Lr`B#nx4(x6jTRUENnF#@(rF#8=07asv2j*S(z6+kr8@_Kug| zGvaH3I5Fd<+v@lZ@A1ckMqe3Ap@gAbaZ96QFWqouBn_4`pVDuLfpg9xHH z3c~M*f$!v7P%p5}cjp5zC@E-yYqA^xasQYByHN7iZ}5Gn9-V?3Gw@pI7a|V|8+iNz znqUE!@4A3_Y)lJcg5Hq@+&RHvbQt(Ps0gW_E$UNeH3fs0FaQ4qFuu2Ucma3%KMW-p?CT4%Z9we7p+=(=7c+!VI6QlHNlATu zUtbb``DIQ{S=o*q@puv!7Dl6N&&KkFg`>RF>2M?~LZskQo$QbvPn=vT4z=O}SN``U zw4Zy8*E~pa?O#9!PtN)xoRhmjOGDZpS15hB2p21R@srx$mTT*4wRnxTNod90ke_=L zA3hJU>82W2TWrxl-fy?z^|m~fAFKwzRP__X$eN=WscU_8@`&*3iIO`O*t z2U;|#R45?>YGb}+j#okFi+m{nopTUIQ^{M9<}Bn2i@0WRmo^Q;p-oA_J>VAn^$-Gr zbnR_{^kA&mb-Tt-C)dC{nRJ6X>$YiOHs%OY8xn1b6V>D~spKgMs;Ih_ z`_=O0D;dt@ws9-UpDAC#aoZO|*)c542yjcD_WOO+wcPfyx+TMQG4uF|P?gVHuFtVO z{P{4!JWp$TuJRpz@h`m6oG|BR_wL&7m6nA$8|!OtRN}Lc15Kh0y0I&X2pq7B_!9mn zzN~*6S>aGYA4s*jdS*JvuS67!f2ur*nRZuC3A|A$T}*r`-*A5_6R2^hmxXr~WN7X} z?p16+irVhVSXJ2DS_CVzZ_{;GVDLq#7oeWgaw}k+3*2LVh_f{PA|@~Q>6Z>T3y~sn{dsa@%}26jqxR>j$VNDx zPNf`QhuyoONxlf>0q+28H82NwCt$OIO@P+{wi(zA_#VJ11`b%jaBPgh3YY@68v+~P zhXJP=I0f*ugS`n}}pd+$SdvT6qvW{Ve*uipclN(ScQftX1b#=u|^M8^LMy1Zaw z-Qe@&&>HSW!oC#;x8Os<1ljj7hDmeVVUXr5>%Vw$-dsoN&%n!T$h@ZBO{;XFvpOD`H*S>J*^M7xgTlCUg zuc`Z7ty;bMhmc(&F<*FNtS0kkMtr=;1koK!p+OMlL6+s4p_gLG%O8XEc{{vg{LnnO3@d|y|c6@dI L)V9B_KFR+NZO7Rt diff --git a/README.md b/README.md index f995c97..e71b94a 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ The game is heavily inspired by the TGM series of games and has the following fe - IRS (initial rotation system). - IHS (initial hold system) as well as holds. - Faithful implementations of concepts such are lock delay, piece spawn delay and DAS. -- Several RNG options available. You can choose between pure RNG, 4 history with 4 retries, 4 history with 6 retries, 4 history with infinite retries, or a 35bag with 4 history and 6 retries with drought prevention. +- Several RNG options available. You can choose between pure RNG, 4 history with 4 retries, 4 history with 6 retries, 4 history with infinite retries, a 35bag with 4 history and 6 retries with drought prevention, NES style RNG, or pure RNG. - A choice between sonic drop (pressing up grounds the piece but does not lock it), hard drop (pressing up locks the piece), or neither (pressing up does nothing at all.) - A choice between traditional ARS for rotation, or TGM3 era ARS with extra kicks. - Scoring is a hybrid between TGM1 and TGM2. @@ -14,16 +14,34 @@ The game is heavily inspired by the TGM series of games and has the following fe - A rock solid 60FPS with a traditional 20x10 grid. -## Modes -There are eight available game modes: -- TGM1: 4 history w/ 4 rerolls, never start with O, S or Z. -- TGM2: 4 history w/ 6 rerolls, never start with O, S or Z. Sonic drop. -- TGM3: 4 history w/ 6 rerolls and drought protection, never start with O, S or Z. Sonic drop. Extra floor and wall kicks for I and T pieces. -- HELL: Pure random piece generation. -- EASY: 4 history w/ 256 rerolls, never start with O, S or Z. Sonic drop. -- TGW2: TGM2 but with hard drop. -- TGW3: TGM3 but with hard drop. -- EAWY: EASY but with hard drop. +## Options +### Buttons +Switch between whether A or B rotates clockwise and vice versa. + +### RNG Mode +Choose between a few randomizer options: +- TGM1: 4 history, 4 rerolls. +- TGM2: 4 history, 6 rerolls. +- TGM3: The TGM3 RNG system. +- HELL: Pure Random. +- NES: Reroll once if you get the same piece as the previous one. + +### Rot Mode +Select the rotation rules: +- ARS1: Classic ARS from TGM1 and TGM2. +- ARS2: ARS from TGM3. + +### Drop Mode +Select whether up performs a sonic drop, a hard drop, or nothing at all. + +### Speed Curve +Check back later! For now you're stuck with the default. + +### Always 20G +Whether you want instant-drop gravity to be active at any level. + +### Start Level +Choose any of the speed breakpoints to start the game at. ## Scoring @@ -59,9 +77,8 @@ Please do not try running it on older emulators such as VBA, since this game use ## Controls ### Menu - A/B/Start — Start the game -- Left/Right — Switch A/B rotation direction -- Up/Down — Select starting level -- Select — Select game mode +- Up/Down — Change which option is selected +- Left/Right — Change the value of the option ### Gameplay - A — Rotate 1 @@ -86,8 +103,6 @@ The game can be built using gnu make and the RGBDS toolchain. ## Future Goals -- Improve main menu. -- Decouple rotation rules, rng rules, and speed curve from each other. - Multiplayer with items. - Colorization. - ... diff --git a/src/constants.asm b/src/constants.asm index 2b053ee..0b021be 100644 --- a/src/constants.asm +++ b/src/constants.asm @@ -89,10 +89,31 @@ sPause:: db " P A U S E" db "P A U S E " db " P A U S E" -sEaster0:: db $D4, $D6, $D8, $DA, $DC -sEaster1:: db $D5, $D7, $D9, $DB, $DD -sEaster2:: db $DE, $E0, $D8, $DA, $DC -sEaster3:: db $DF, $E1, $D9, $DB, $DD +sOption0:: + db "NORM" + db " INV" +sOption1:: + db "TGM1" + db "TGM2" + db "TGM3" + db "HELL" + db " NES" +sOption2:: + db "ARS1" + db "ARS2" +sOption3:: + db "SNIC" + db "HARD" + db "NONE" +sOption4:: + db "DMGT" +sOption5:: + db " NO" + db " YES" +sEaster0:: db $C4, $C6, $C8, $CA, $CC +sEaster1:: db $C5, $C7, $C9, $CB, $CD +sEaster2:: db $CE, $D0, $C8, $CA, $CC +sEaster3:: db $CF, $D1, $C9, $CB, $CD sPieceXOffsets:: ; How to draw each piece. X-offsets of the sprites. db 0, 8, 16, 24 ; I db 0, 8, 8, 16 ; Z diff --git a/src/field.asm b/src/field.asm index 7c1f580..3979a3c 100644 --- a/src/field.asm +++ b/src/field.asm @@ -781,7 +781,7 @@ FieldProcess:: ; HANDLE ROTATION ; Want rotate CCW? .wantrotccw - ldh a, [hSwapAB] + ld a, [wSwapABState] cp a, 0 jr z, .ldb1 .lda1 @@ -800,7 +800,7 @@ FieldProcess:: ; Want rotate CW? .wantrotcw - ldh a, [hSwapAB] + ld a, [wSwapABState] cp a, 0 jr z, .lda2 .ldb2 @@ -862,13 +862,9 @@ FieldProcess:: ; I piece only kicks in TGM3/TGW3/EASY/EAWY cp a, PIECE_I jr nz, :+ - ldh a, [hSimulationMode] - cp a, MODE_TGM1 - jp z, .norot - cp a, MODE_TGM2 - jp z, .norot - cp a, MODE_HELL - jp z, .norot + ld a, [wRotModeState] + cp a, ROT_MODE_ARSTI + jp nz, .norot jr .trykickright ; T/L/J only kick if not through the middle axis. @@ -948,13 +944,9 @@ FieldProcess:: ; In TGM3, TGW3, EASY, and EAWY modes, there are a few other kicks possible. .maybetgm3rot - ldh a, [hSimulationMode] - cp a, MODE_TGM1 - jp z, .norot - cp a, MODE_TGM2 - jp z, .norot - cp a, MODE_HELL - jp z, .norot + ld a, [wRotModeState] + cp a, ROT_MODE_ARSTI + jp nz, .norot ; In the case of a T piece, try the space above. .checkt @@ -1179,16 +1171,10 @@ FieldProcess:: jr z, .postdrop ; What kind, if any? - ldh a, [hSimulationMode] - cp a, MODE_TGM1 + ld a, [wDropModeState] + cp a, DROP_MODE_NONE jr z, .postdrop - cp a, MODE_HELL - jr z, .postdrop - cp a, MODE_TGW2 - jr z, .harddrop - cp a, MODE_TGW3 - jr z, .harddrop - cp a, MODE_EAWY + cp a, DROP_MODE_HARD jr z, .harddrop ; Sonic drop. @@ -1793,10 +1779,8 @@ FieldDelay:: ; Check if we are in a TGM3 mode and thus need to handle line counts of 3 and 4 differently. ldh a, [hLineClearCt] ld e, a - ldh a, [hSimulationMode] - cp a, MODE_TGM3 - jr z, .modifylines - cp a, MODE_TGW3 + ld a, [wRotModeState] + cp a, ROT_MODE_ARSTI jr z, .modifylines jr .applylines .modifylines diff --git a/src/include/globals.asm b/src/include/globals.asm index a4b5036..96929f2 100644 --- a/src/include/globals.asm +++ b/src/include/globals.asm @@ -108,23 +108,7 @@ DEF PALETTE_LIGHTER_0 EQU %11100100 DEF PALETTE_LIGHTER_1 EQU %10010000 DEF PALETTE_LIGHTER_2 EQU %01000000 DEF PALETTE_LIGHTER_3 EQU %00000000 -DEF TITLE_A EQU $99CD -DEF TITLE_B EQU $99CF -DEF TITLE_LEVEL EQU $996C -DEF TITLE_MODE EQU $9A2E -DEF FIELD_MODE EQU $9811 -DEF FIELD_TOP_LEFT EQU $9800+1 -DEF EASTER_0 EQU $9885 -DEF EASTER_1 EQU $98A5 -DEF TILE_FIELD_EMPTY EQU 4 -DEF TILE_PIECE_0 EQU 10 -DEF TILE_0 EQU 66 -DEF TILE_MODE_FAINT_0 EQU 196 -DEF TILE_MODE_0 EQU 234 -DEF TILE_CLEARING EQU 124 -DEF TILE_GHOST EQU 125 -DEF TILE_A EQU 76 -DEF TILE_B EQU 77 + DEF NEXT_BASE_X EQU 120 DEF NEXT_BASE_Y EQU 40 DEF HOLD_BASE_X EQU 120 @@ -134,8 +118,9 @@ DEF SCORE_BASE_Y EQU 115 DEF LEVEL_BASE_X EQU 120 DEF CLEVEL_BASE_Y EQU 136 DEF NLEVEL_BASE_Y EQU 148 -DEF SCURVE_N_ENTRIES EQU 32 + DEF SCURVE_ENTRY_SIZE EQU 8 + DEF PIECE_I EQU 0 DEF PIECE_Z EQU 1 DEF PIECE_S EQU 2 @@ -144,6 +129,7 @@ DEF PIECE_L EQU 4 DEF PIECE_O EQU 5 DEF PIECE_T EQU 6 DEF PIECE_NONE EQU 255 + DEF SFX_IRS EQU 7 DEF SFX_DROP EQU 8 DEF SFX_LOCK EQU 9 @@ -153,20 +139,71 @@ DEF SFX_RANK_UP EQU 12 DEF SFX_LEVEL_UP EQU 13 DEF SFX_IHS EQU 14 DEF SFX_READY_GO EQU 15 + DEF STACK_SIZE EQU 64 DEF GAME_OVER_R10 EQU 133 DEF GAME_OVER_R12 EQU 153 DEF GAME_OVER_R14 EQU 173 DEF GAME_OVER_OTHER EQU 131 DEF LEADY_GO_TIME EQU 90 -DEF MODE_TGM1 EQU 0 -DEF MODE_TGM2 EQU 1 -DEF MODE_TGM3 EQU 2 -DEF MODE_HELL EQU 3 -DEF MODE_EASY EQU 4 -DEF MODE_TGW2 EQU 5 -DEF MODE_TGW3 EQU 6 -DEF MODE_EAWY EQU 7 + +DEF BUTTON_MODE_NORM EQU 0 +DEF BUTTON_MODE_INVR EQU 1 +DEF BUTTON_MODE_COUNT EQU 2 + +DEF TILE_RNG_MODE_BASE EQU 217 +DEF RNG_MODE_TGM1 EQU 0 +DEF RNG_MODE_TGM2 EQU 1 +DEF RNG_MODE_TGM3 EQU 2 +DEF RNG_MODE_HELL EQU 3 +DEF RNG_MODE_NES EQU 4 +DEF RNG_MODE_COUNT EQU 5 + +DEF TILE_ROT_MODE_BASE EQU 225 +DEF ROT_MODE_ARS EQU 0 +DEF ROT_MODE_ARSTI EQU 1 +DEF ROT_MODE_COUNT EQU 2 + +DEF TILE_DROP_MODE_BASE EQU 229 +DEF DROP_MODE_SONIC EQU 0 +DEF DROP_MODE_HARD EQU 1 +DEF DROP_MODE_NONE EQU 2 +DEF DROP_MODE_COUNT EQU 3 + +DEF SCURVE_DMGT EQU 0 +DEF SCURVE_COUNT EQU 1 + +DEF TILE_HIG_MODE_BASE EQU 232 +DEF HIG_MODE_OFF EQU 0 +DEF HIG_MODE_ON EQU 1 +DEF HIG_MODE_COUNT EQU 2 + +DEF TILE_FIELD_EMPTY EQU 4 +DEF TILE_PIECE_0 EQU 10 +DEF TILE_0 EQU 66 +DEF TILE_CLEARING EQU 124 +DEF TILE_GHOST EQU 125 +DEF TILE_SELECTED EQU 193 +DEF TILE_UNSELECTED EQU 194 + +DEF TITLE_OPTIONS EQU 7 +DEF TITLE_OPTION_0 EQU $98E0 +DEF TITLE_OPTION_1 EQU $9920 +DEF TITLE_OPTION_2 EQU $9960 +DEF TITLE_OPTION_3 EQU $99A0 +DEF TITLE_OPTION_4 EQU $99E0 +DEF TITLE_OPTION_5 EQU $9A20 +DEF TITLE_OPTION_6 EQU $9A60 +DEF TITLE_OPTION_OFFSET EQU 15 + +DEF FIELD_RNG EQU $9852 +DEF FIELD_ROT EQU $9892 +DEF FIELD_DROP EQU $9912 +DEF FIELD_HIG EQU $9952 +DEF FIELD_TOP_LEFT EQU $9800+1 + +DEF EASTER_0 EQU $9845 +DEF EASTER_1 EQU $9865 ENDC diff --git a/src/level.asm b/src/level.asm index cc8c561..890902e 100644 --- a/src/level.asm +++ b/src/level.asm @@ -345,6 +345,15 @@ DoSpeedUp: ldh [hSpeedCurvePtr], a ld a, h ldh [hSpeedCurvePtr+1], a + + ; Do we want to force 20G? + ld a, [wAlways20GState] + cp a, 0 + ret z + ld a, 20 + ldh [hCurrentGravityPerTick], a + ld a, 1 + ldh [hCurrentFramesPerGravityTick], a ret diff --git a/src/main.asm b/src/main.asm index 26f1abe..2b2cd2b 100644 --- a/src/main.asm +++ b/src/main.asm @@ -27,10 +27,15 @@ INCLUDE "res/title_map.inc" SECTION "High Globals", HRAM hGameState:: ds 1 -hSwapAB:: ds 1 -hSimulationMode:: ds 1 + SECTION "Globals", WRAM0 +wSwapABState:: ds 1 +wRNGModeState:: ds 1 +wRotModeState:: ds 1 +wDropModeState:: ds 1 +wSpeedCurveState:: ds 1 +wAlways20GState:: ds 1 wInitialA:: ds 1 wInitialB:: ds 1 wInitialC:: ds 1 @@ -41,9 +46,13 @@ wInitialL:: ds 1 SECTION "Persistent Globals", SRAM -rMagic:: ds 3 -rSwapAB:: ds 1 -rSimulationMode:: ds 1 +rMagic:: ds 4 +rSwapABState:: ds 1 +rRNGModeState:: ds 1 +rRotModeState:: ds 1 +rDropModeState:: ds 1 +rSpeedCurveState:: ds 1 +rAlways20GState:: ds 1 SECTION "Stack", WRAM0 @@ -95,35 +104,70 @@ Main:: ; Check for save data. ld a, [rMagic] - cp a, "T" - jr nz, .nosavedata - ld a, [rMagic+1] - cp a, "G" + cp a, "D" jr nz, .nosavedata ld a, [rMagic+1] cp a, "M" jr nz, .nosavedata + ld a, [rMagic+2] + cp a, "G" + jr nz, .nosavedata + ld a, [rMagic+3] + cp a, "0" + jr nz, .nosavedata .savedata - ld a, [rSwapAB] - ldh [hSwapAB], a - ld a, [rSimulationMode] - ldh [hSimulationMode], a + ld a, [rSwapABState] + ld [wSwapABState], a + ld a, [rRNGModeState] + ld [wRNGModeState], a + ld a, [rRotModeState] + ld [wRotModeState], a + ld a, [rDropModeState] + ld [wDropModeState], a + ld a, [rSpeedCurveState] + ld [wSpeedCurveState], a + ld a, [rAlways20GState] + ld [wAlways20GState], a jr .otherinit .nosavedata - ld a, "T" + ld a, "D" ld [rMagic], a - ld a, "G" - ld [rMagic+1], a ld a, "M" + ld [rMagic+1], a + ld a, "G" ld [rMagic+2], a - xor a, a - ldh [hSwapAB], a - ld [rSwapAB], a - ld a, MODE_TGM2 - ldh [hSimulationMode], a - ld [rSimulationMode], a + ld a, "0" + ld [rMagic+3], a + + ld a, BUTTON_MODE_NORM + ld [rSwapABState], a + ld [wSwapABState], a + + ld a, RNG_MODE_TGM3 + ld [rRNGModeState], a + ld [wRNGModeState], a + + ld a, RNG_MODE_TGM3 + ld [rRNGModeState], a + ld [wRNGModeState], a + + ld a, ROT_MODE_ARSTI + ld [rRotModeState], a + ld [wRotModeState], a + + ld a, DROP_MODE_SONIC + ld [rDropModeState], a + ld [wDropModeState], a + + ld a, SCURVE_DMGT + ld [rSpeedCurveState], a + ld [wSpeedCurveState], a + + ld a, HIG_MODE_OFF + ld [rAlways20GState], a + ld [wAlways20GState], a .otherinit ld hl, sSpeedCurve diff --git a/src/res/sources/tiles.gbr b/src/res/sources/tiles.gbr index dc4620df9abf47efbd932733e716daafda575642..2c6fa616d3a6143b0212a1079f9a18ee04cdb222 100644 GIT binary patch delta 1316 zcmbVMy-EW?5Z>D(dTNA7lte^0{3neHiiL%psl=bwDus;*<_%(F705-#)+ewDq_l~( z=qre}R=$8Z-^}hM5sW{x+|AB6^Ucie?cPhvzO-zsenHLh=v){YmQciNwcx>w-nS<= zg8*U11T0=-2D>Z0evYF1%G3&LBtkBJW5DvZGZDOVw$eViJP+ydG+U4;R9CtWqiT7U z{o{E}(&whmat!XI=W>ka8Rv{>FOISbtD7qEELCkpPp4VQ>WX@@BmS#mv1Y9`I*jSg zJ;vJkQB8yahEnltsc^E6QEyu4~nr6q#bRN)54Ng5Oh_UriY`Ef{_DZ zEgu6u4(wN(ZVyYeUmniLZqs^ok#fx(9h8R#APY6A!j=3$ZD3zUxQwWPuzSE8mT=-6Z!>_TsKLJdi@D~Zv z4~e=a(7olhjpdhUh6TkUWcz#jr@O<^C82_@flz*?T4?Rc^+!l+c8c#@dKW`_Zp1OD zfN)z?(%Z~fXy~RsLmNqfj+2Q+iE_ayNBG?Iwj6n)Nmw|LL>2XrrWR?j_i9Sk3n-0 z@#}0U;l*?7oQt6v)qCjcU28-#2GC$QQ5_<2SAzG{0vu{GwxfZ(M?=pV}mdeiE^( zcqoP?rOQ$t^VpCNioNe*(#)F4L>VlVW(}qf^2BOqPmMmMw-m-R-nh`uGK)%Wc8{ diff --git a/src/res/sources/title_map.gbm b/src/res/sources/title_map.gbm index b247a682e145f05449265d49e1f4a1be0f543853..1800fc89f76b76b52412fcda5b73cbda8e9b037c 100644 GIT binary patch delta 651 zcma)2JuE{}7(Ms3uk=yrAS7rLjmFAIEkr~_kS5}%p(lci#EV_md4|14q|lqpsG#Cr{GhOBcuQcJFI| z+fdT~m|IxHM*^XUhGJ`2tEVr(!?%aefqo;_8(y|e$o}u9e@N0GId4~)RH>A}J8vNv z*Pf~jG{Qg!x-d#5GnX2g@a%Oq%Vo_qkV&mFZDoQ0k6ce#z+*vY;P}bJ zAe)f^2!ON=kb2B=i}8P7q$x-UCeI0EF9Ry_0IKB4;lWiT;Tpx7fIAF7Yh z2*^h_vv%>aMU(e1sZ4fe)|$-4ymYbyb3PCUZeGtU%Lrs7Og_W11xTl9*D-)R6VAX8 zz`&3QCV_0A2oN