From bcc7a72ae1503b90272c2c01abc73b81d43adb55 Mon Sep 17 00:00:00 2001 From: stevenhowes <38082088+stevenhowes@users.noreply.github.com> Date: Sun, 16 May 2021 20:04:09 +0100 Subject: [PATCH] Very WIP PCM sound support --- !TheEsc/!Run,feb | 1 + !TheEsc/!RunImage,ff8 | Bin 22636 -> 23244 bytes !TheEsc/DataVox,ffa | Bin 0 -> 21152 bytes !TheEsc/Makefile,fe1 | 4 ++++ !TheEsc/c/CTheEscape | 6 +++++- !TheEsc/c/Mission1 | 38 +++++++++++++++++++++++++++++++++++++- !TheEsc/c/Mission2 | 1 + !TheEsc/c/Sound | 35 +++++++++++++++++++++++++++++++++++ !TheEsc/h/Sound | 39 +++++++++++++++++++++++++++++++++++++++ !TheEsc/sounds/torpedo | 1 + 10 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 !TheEsc/DataVox,ffa create mode 100644 !TheEsc/sounds/torpedo diff --git a/!TheEsc/!Run,feb b/!TheEsc/!Run,feb index c619d7e..54b463e 100644 --- a/!TheEsc/!Run,feb +++ b/!TheEsc/!Run,feb @@ -2,4 +2,5 @@ Set TheEsc$Dir IconSprites .!Sprites WimpSlot -min 256k -max 256k Dir +RmEnsure DataVox 3.69 RmLoad .DataVox Run .!RunImage \ No newline at end of file diff --git a/!TheEsc/!RunImage,ff8 b/!TheEsc/!RunImage,ff8 index add60a05102fc160b07bcb5c316a78ecbf86b509..5026c2e3a6563d9ae9e1597cd7fdb565f555a313 100644 GIT binary patch delta 4773 zcmZWt3v`rKlD_xvN4k?v($73ecawKIPXgg3kVZh55FwF=XcQ6%j)OcR#2J}|NrQnP z!y`}#g9pvO4!Ci39U!`TjEAEha7X0n0)~f}?%rQXnpXtGAn@;Zlb$&&+vikn)vc;q z^;gxcx^Q_fKk^|@WlZ)9FfkT-)y_f|#;&E$VysnSeZNn)Z%IAyoY}$Jk4r3M)v(Y} ztY)k?v5xY#C>3m*GSR_8)3Hv#I*WavjKivBa?ovVQ5ahVkb_#Rc6W<1B1R5cjJ|;R z`Q)zScGjKV!I*&Z4oc$AhHG}#zKgXeML0r&nOLa42j{N9+&UbW8oN1=54sWfK;RzW zZ-J)(WIzxwKAMI6SUaLv=xPiLF;*13tE!P4>us!)u~z|oJM@#FKhDfTry+mZ%*KUw zSpUDmLFU4DHY*WuN_-1zt?D}AW2_#2PpezXUdH;^lEw8RWGg!83@_kqq?59wKiR23 zavDEEWQAUkW=Ls{_rg>MRxMi_V9m1sByE(EjdGZCg!W0pq^Wl5mNFwJgo7jkq&XuE zx6@CWREHL#dN-2iU8CsCeMtc4GQUpqwXV2Jw*HT)YppW&au(wF;&eN` zuARc~P?t8BA0&s)#XqGIT^hegPw8@Xtx(ZXqAr=sv`3f4Kc}O*9r`*O>#pyh1^NQM ziFWFTNi%HpjXqT>x6#k~VyVqCCDHPmWmS z;9Sp)}Dl{Ra)qW*fRGR z9B(+WF~Gfz0Uw(l>{iutBB@2VO~Y_JRhm<1k@*FFpU#?__ywx5q)7$~t+hD$P1<8A zlw{PW#nZ5C$xDlC=hV$xG-u(Gn%ZSGi|Q867v-D4m>T_=?C&|B-=*DK9*AVm`rk3L zcIK7+wZ0a`fMyXWkb^vDb%2@WAnr^^hwnANqe#wYZmv+SzmVL8W4gCm)A?^H!e|^YG~Vwx@ka>MDn1UJ2t zSY>Po%V{V&sYxomLorDe#&ow{6;Q*0QdUz%9R&Q_tc4=S;s zMV56YIe3aH-NU4H9kkx<8T*k?^UA>^uzDQ|e+?@&RyK9&s!Lpc+|w?HrfFaXv$Ni^_~=EYbq`Kf@zIo4jirMWCC)v=;Or(65AP186Jg zhA?dgEvD$dglRkI1kis7(+S=^4$-Wa^{Qmcb0jVb?@x=CZ4pMF)y>v8mV^IW8k^U^ zC(`G6%eaS1@~h}Vl&N7QJQhv#_-!>*6mGiT0v{A^x~G5-4maJCz=wpJ?lIscXsQQ( zQA1jkL5CMT1nED8exYTJN+8A;;COW!fFG=G=^IZXdY^({V#LD;HZfMFqf#6D6a_OT zy8o$~4*^V#zPa-tzY)rr;N8KKR?MUac?-d-!%%h_8J*8B88*JAzGmiF6nPzV&s*h8>}6N$1-5`I4#8%WaOtKDDn8XZwoPz%yO{)mKxeH z-lc5BhuZP%_Lnt^-xm&S*avGOy&9xzmuqU@ zOpOBG0$f}P1Ms(iiz}l8z6ZFFmw@L0#EbvSpViRE1{V5Yg7B_U`4D&$cn{Ci?we|8 z0OVI9YBOAN@Q0gfX{Zv)Cm<{;9}fWI+fZHydN)>P-lo)=SHYz~)+@=FXPdi`0H;4;cy8{=?hl^E*F;&xos*!`c^fYwP;W0a4<>3yn6?+eNfQ{G_ zFF74vatBoPlk4wRb)lnG<&Z_%{i2{N z;GOulqK0}$7H0gYW9{``1RJ?xMx0{yDZlE(^=wpRSPcSZ(c_OKKUT=t;VBp(J`9kL z?y2Wv@f7PsHqWED=iF06n^5Q*K(`_X_fP?Ifonv0;UW|visDs)Zu;+!te>zCtT!P3 zE>zz^JFCSURsqjo?`iOUk0ZXu5k3C-lQ0jUU6AoyP+lrZ_rS0ffz*3c}M1NfY!rB zLO3n%p_2RNx*8fyN4;5+{$^iMOdY$NYbF(O`ufp~m=Bo8ee9 zeg{~_SlhX_g2xYVYt0okl!CfiRI_-F7yxgdqx(}vN^7ss$f+KE?iDpkzCsJ8&NYsx zixlgIxTZjRuR delta 4262 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

Ki6$j*Nrzld*d@nK5;|h z(+N*?S>JhGrzbnE{o|SrtJ^XNct~OT1Ki2BemdoOnwpbFoIA&4w z!l*|gAC6dHsMJ^J<_lgXpg+&Beh=Td>vdKyOS9&Se6y;^_h_cD%ZAuQ&Wiv~&w29Z z*YM+0SXAT?&bx^HxCYKsPc~^dC?~hzI-|sEb zPI8f-z(a*Hg&jGs@(tj3Y>uybrkKcnLR})cZs*aR>BRlWd0*L~F47kDM$?_C8O-^o z!0*iYjXTy=rg~3dD*pudU9Qi^#`L5H?qP5f8g!BOzN-S&dlHLazYO8J>;pd${3$q) zh*t_~6^WCNl==aOD!Jq%RMaUjVvOO&nk^EuVF zi@@#5x%{kvtErbSU5Mv8JP2+#aA7N+3*EHc|C*dlXF}OMZd*}73RC@}%Ua)^hr4xFN(=}fA|FeboH&qn>IqLvTBvZ`b?V4N*y6^rGQ z3DonUk{G+7=I3D44`D2Y@=csM(Y`*ap0v7=YGZEk~~o16Gij=`e%k=GQaa(jc@ z8(bX8!jm%3nGZ93#YzO8E&ES6Twfuu57o>0~4s+cHs7DR(2i^bVzDQ4^-gw pDO{#<_Cj;bt`ws52tWUW_M53~2- #define PLAYER_Y_START 100 #define PLAYER_X_SPEED 10 @@ -11,6 +14,9 @@ extern sound_composition_save(char *filename); extern sound_composition_load(char *filename); +extern _kernel_swi_regs inreg; +extern _kernel_swi_regs outreg; + enum sprite_e{player_ship, durno_ship, ship_trgt, durno_ship2, ship2_trgt, player_shipl,player_shipr,explode_start,explode_shp2,explode_shp3,explode_end,photon1,photon2,plasma1,plasma2}; char *sprites[] = {"player_ship","durno_ship","ship_trgt","durno_ship2","ship2_trgt","player_shipl","player_shipr","explode_shp1","explode_shp2","explode_shp3","explode_shp4","photon1","photon2","plasma1","plasma2"}; @@ -140,6 +146,12 @@ void game_spawn_projectile(int id, int Px, int Py, int Vx, int Vy, enum sprite_e Projectiles[id].nextframe = tick + 10; Projectiles[id].damage = damage; Projectiles[id].collidable = 1; + // Play it + inreg.r[0] = 4; + inreg.r[1] = -15; + inreg.r[2] = 1; + inreg.r[3] = 1; + _kernel_swi (Sound_Control, &inreg, &outreg); } } @@ -785,7 +797,31 @@ void game_setup_audio() sound_set_voice(1,"WaveSynth-Beep"); sound_set_voice(2,"Percussion-Noise"); sound_set_voice(3,"Percussion-Soft"); - sound_set_voice(4,"Percussion-Noise"); + sound_set_voice(4,"DataVox-Voice"); + sound_pcm_loadsample("sounds.torpedo"); + + + inreg.r[0] = 4; + inreg.r[1] = (int) audiobuffer; + inreg.r[2] = (int) audiobuffer + 20000; + _kernel_swi (DataVox_SetMemory, &inreg, &outreg); + + // Unsigned 8-bit PCM + inreg.r[0] = 4; + inreg.r[1] = 1; + _kernel_swi (DataVox_Type, &inreg, &outreg); + + // Not timed + inreg.r[0] = 4; + inreg.r[1] = 0; + _kernel_swi (DataVox_Timed, &inreg, &outreg); + + // Bitrate + inreg.r[0] = 4; + inreg.r[1] = 4000; // I was expecting this to be 125 to 8KHz but.... No idea + _kernel_swi (DataVox_Pitch, &inreg, &outreg); + + } void game_draw_hud() diff --git a/!TheEsc/c/Mission2 b/!TheEsc/c/Mission2 index 0affaef..295fd5a 100644 --- a/!TheEsc/c/Mission2 +++ b/!TheEsc/c/Mission2 @@ -266,6 +266,7 @@ void game2_setup() game2_loadmap("m2_map"); game2_loadsmarttiles("m2_smart"); game2_loadareanames("m2_areas"); + game2_fillmap(TilePlayer.mapoffset.X,TilePlayer.mapoffset.Y); } diff --git a/!TheEsc/c/Sound b/!TheEsc/c/Sound index 9def5ea..ae79070 100644 --- a/!TheEsc/c/Sound +++ b/!TheEsc/c/Sound @@ -13,6 +13,8 @@ int composition_startcent = -1; struct CompositionElement composition[COMPOSITION_MAX]; +unsigned char audiobuffer[20000]; + char *notes[] = {"AX","A#","BX","CX","C#","DX","D#","EX","FX","F#","GX","G#"}; void sound_on() @@ -195,3 +197,36 @@ int sound_composition_incomplete() else return 1; } + +void sound_pcm_loadsample(char* filename) +{ + int length; + + memset(audiobuffer,0x00,20000); + + // Attempt to get file info + inreg.r[0] = 5; + inreg.r[1] = (int) filename; + _kernel_swi(OS_File,&inreg,&outreg); + + // Length will be in R4 if it exists + length = outreg.r[4]; + + if(length > sizeof(audiobuffer)) + { + screen_nobuffer(); + while (1) + printf("Sample exceeds %d bytes (%d bytes) object type is %d\n",sizeof(audiobuffer),length,outreg.r[0]); + } + + // Attempt to get file info + inreg.r[0] = 16; + inreg.r[1] = (int) filename; + inreg.r[2] = (int) audiobuffer; + inreg.r[3] = 0; + + _kernel_swi(OS_File,&inreg,&outreg); + + // Fill remainder of array with final byte + memset(audiobuffer + length,audiobuffer[length-1],sizeof(audiobuffer)-length); +} diff --git a/!TheEsc/h/Sound b/!TheEsc/h/Sound index 12a4d51..e628a44 100644 --- a/!TheEsc/h/Sound +++ b/!TheEsc/h/Sound @@ -1,5 +1,42 @@ #define COMPOSITION_MAX 128 +#define DataVox_Type 0x44380 +#define DataVox_Timed 0x44381 +#define DataVox_Pitch 0x44382 +#define DataVox_ReadPitch 0x44383 +#define DataVox_ReadTimer 0x44384 +#define DataVox_ReadType 0x44385 +#define DataVox_SetMemory 0x44386 +#define DataVox_ReadMemory 0x44387 +#define DataVox_ReadAddress 0x44388 +#define DataVox_SetRepeat 0x44389 +#define DataVox_ReadRepeat 0x4438A +#define DataVox_SetReverse 0x4438B +#define DataVox_ReadReverse 0x4438C +#define DataVox_PitchToSample 0x4438D +#define DataVox_SampleToPitch 0x4438E +#define DataVox_Duplicate 0x4438F +#define DataVox_Unset 0x44390 +#define DataVox_ConvertByte 0x44391 +#define DataVox_ReadBufferFlag 0x44392 +#define DataVox_AllocateChannel 0x44393 +#define DataVox_DeAllocateChannel 0x44394 +#define DataVox_RequestChannel 0x44395 +#define DataVox_ChannelsFree 0x44396 +#define DataVox_ConvertArea 0x44397 +#define DataVox_ChannelFreeMap 0x44398 +#define DataVox_UpCallHandler 0x44399 +#define DataVox_FlushKeys 0x4439A +#define DataVox_VoiceActive 0x4439B +#define DataVox_SystemSpeed 0x4439C +#define DataVox_Version 0x4439D +#define DataVox_SlaveChannel 0x4439E +#define DataVox_ReadMaster 0x4439F +#define DataVox_ReadUpCallStatus 0x443A0 +#define DataVox_SetUpCallStatus 0x443A1 +#define DataVox_AdjustMemory 0x443A2 +#define DataVox_SetInternalPitch 0x443A3 + struct CompositionElement { signed short int Start; unsigned char Note; @@ -8,3 +45,5 @@ struct CompositionElement { /*unsigned char word alignment*/ unsigned short int Length; }; + +extern unsigned char audiobuffer[20000]; diff --git a/!TheEsc/sounds/torpedo b/!TheEsc/sounds/torpedo new file mode 100644 index 0000000..e7d0650 --- /dev/null +++ b/!TheEsc/sounds/torpedo @@ -0,0 +1 @@ +€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}€€~€€€€€€€€€€~€~€€€€~‚€~€€~€~€€€€€€€€€~€€~€€~€€~€~€~~€€€€€€ƒ€‚€€~~€€~~€€€€€€€}}~}|€~~€ƒ‚‚ƒƒ‚€€€}}~~~~~~€€€~‚‚€€€€€€€€‚€€€€~€€€~~~~~~}~€€€€€€€€€€~~~}~~}~€~~€€€€€‚‚€‚‚€€}}|~~~~}|~~~€€ƒ‚ƒ„ƒƒ‚„ƒƒ~€€‚{|~}€~~€€€‚‚‚€€ƒƒ‚€}}}{|}|z}}yz}~||~~yx}€|~|yz~~~|{}‚|y‚†€}€€„…„€‡ˆ„„ƒ†‰‡„€„‰Š†‚‚ƒŠŠ†ƒ€„‡‹†‡ƒ‚ˆŒ‰ƒ}ƒ†‡‡€|x}„‚‚{y~ƒ†}{|†…~yzvz€„~xsrtwssprz€ƒ~xrps|…€zvru|„ˆ†€zwwxˆ‡€{ust}„……zxtpv„‡‡{xtty‡†‡€zvsy‡‹Œ‡|x{}„ŠŒŒ…‚{vz~„Їwwwy‚‰Šxrow~‡Žˆzxxz€…‹ƒuvy~ˆ‹‘“„|{xuyƒŠ‰ˆysrpwz„‰‹ƒzyrs{ˆ‹“‘Œ„}xrqw~‹šˆxoqqyv|‰Œ–Ž„plls|‰‹ˆ…ƒ}xdez€•‹€’Œ€z~vckyk|ƒ“”¤‘xldktmri—‡””yˆxt^Ygjdy|ušŒ•—‚wmyhs^`Ue~‡Š”ˆ„|‹nnrscae„x¢¦™’¤§™– zz\u{Ž‚~ŒˆŠš¢Ÿš‰“‰‡ph{vŠ‘‰† ¥“𝠮™~lrtfmbm{Ž’Žspƒn\NCYa:CI3K]fqxbq‰qtœ^{lmbYQz’‘mo}yŸ¦ž§˜˜œg‚ƒ‹s‘c[]‰˜Š—ˆ„ž£·É³™ž™¡‹x [or’}}s®–€¨·´|Ÿ§ª{•žŽeayj…cb]g|‚{nŽ€q§›}ޝ‚o›’ujOMŒjEWS[MGb‚tD^uvv„£ƒ]]y]fa\d[N]bcuh¢›€“¸ÐÁÜÈŠs¨†sw‡pdY^x`]WzgYDV‚›{m·Á£²­³•s¬yŠprY„Ÿ¤s`ˆn~Ÿ­«¦¦Ÿ·¾ÇİŒ’¢­­Ç«’ŠI>}¦pv‰”Z*Stƒ[ˆƒu£¦lZ²œ_n¨ˆiRMŠvYAyTcK[M[Ca‡s[aifp}vmjgs†“µ¦—{‰›q^Z‘§œ\i……}],PZˆx^_Ltna„œ²¤•‰j–·ÖÍ´œ‚¬´²†^bs”žzjMMU]ClIMŠ~qtS|¡‘¬¡‰pƒŒo°Àšllœ°­  m_{„‹›¡{ˆoCrvWmjkXEMSWq‡du•r\[{v„—§Ÿyz…Ž¡¿«Šeoxu–Œ—›srda[PEM––‡gUb[KFP‡²­m—¹zŒ—¼©¡±È¨›q]}‰}œ{€ugzH6RF^rcw~Ÿ¡œžuUf‡}²Ä¾Â¶ª­Å©’dWgcm‹Žn„ƒl‚–pV@K8[}»Ï®†sƒ}‰}ViPdlf›³Æ¸©»¨›pQ]y‰„‚¤£…„±¼«ŸŽ•ŸˆcPKXTRb­Â³£†ul`€ƒh:;QR`^V`KKkƒ™›¥®®º¶’|auUWphvl€…›¶«‰wacacujU5/79d†cx{nІu”±¢™‡ol‰Ÿž~n[QVIniu…‰®¢  †š®»Âª¡œvwuމ‚pjUTMXTUXl‡œ¶Á± —¡|nއ~orWKT]HVWXv²´Ä½µ´¬¥Ÿ—“lkrfcŠ˜šˆ‹™œ¨¶®§¨³¼¶¬œ¢£›uv|tT3/;Yp^O\\mpqz}ˆvaonha|„…ƒk\RKL@9;FN_\u„ƒ†tƒ‘«°ÁÕ³¯› ‰‚އЅœqt€mqyd__lNemƒ“˜®›°®³¨²ª¢“’‡ƒŠˆ˜‘ˆ‹ˆŠ…q‰„Љ‡|a`OEG\fpyjrn€y’¢«›”¢ž§¹µ² Ÿˆyt}{|okdlbjfheZffj{Œ~px‚™Ÿ ¤¤›œ’—œŠvZe^glnrY\Zfcƒˆ~|xvoqslkmababUSUDLRFVUVMHNNUYhsvw‚— Ÿ¥©Ÿ›©®µÃ¹ºÀ»´¤¤š›ž Ÿ—xrs‹…‰|ƒv^]ixu„zncaZU^bw…—•Œ†‡–¢µ·ºÁ¾±ƒz‡‡Ž‡ŽŽ‚{vƒyˆ“œ¡ŽŠtjecl}Ž’…qtqhgbkwzy‡‹‹‚psfY^qƒ{nfgTTM[fXQNEHMLJTRRW_js„Œžšš‹‰‰”ªµÇ¿Äùµ³·´ª³±¡‰‘ˆ†–¤£†wnqy{|“Šrt^XY^axvspc`[RNADZ^pmig^`gUVVaspupvpnƒ†‘¥©©› •¢¢§ÁÈÂÄ´®¦¥šˆ–©¼·°¢¦•Œ“‡q\Z{€Ž˜˜†€’tvgMBHMdz‰“—’Ž‹sguxjs€|Žzzy’’€…vha\h}v†zrvkffaXWojn„Š„€nSGBTYlrƒ—•Ž’„‚pfmce`gttq‹”˜–š{qknvsny€…‡Žˆ˜›™žœœ”‹tynkz{~€‚Ž–Ÿ—‹•…ˆ…uqzo~„‰…‚ Ž‚š‘’œ–ª–Š’’‘–‘‘…‘‰y|‘Œ{†Œƒzq„‘w}‹‰ˆ|{}styvmhW`aaoj‡Š…”š}w[ckYUe`^limlxfuƒs|Œ‹yvmgelxb]gtremq‡Œ‰‡x}„tzss’ŽŽŠx‡‰…ot‹†‹Œ† ˜œœ¢«œ›ˆŠ€}xor|~vyw¬˜”«š”|{}{xyss}sYjy„™£ œƒ„Œ‰„ˆ„sjwblzxІ‘•–˜’‰~gnowlolc^ajurz •“ ¥¡¨™|||qisg]^_XYkfu{rxt”Ž“œ‘…‹rŒˆ|qwhS]\bY[hllyއŠy~vt„v~m|swrpwktrj{|–™¨§ª²œ–§†q€ufngcbr_lwir~‘™›¯´¯Ã°³¬™¢˜™—˜Žˆ†‰sms]g\xxntjsq˜’Ÿ™ž¯—Ÿ“Ÿ«Ÿ ¥™Žng\\g^fOmwojN]_\xxu˜Šƒ€‰z€”•y•{l[f[L]ngu}n}f}gl‹‚›ž§’Š{ymeyoˆ}dlbkSRSc€ln€}˜˜”’œ¯‘”‹„˜‹£}œ¨˜‹‰pihksŠ…v~iŽmclp~yžŸˆ—ŠŒ‘† †…‹Œ‚‹š’𝔒}ƒ”{tioln}pˆy{z|Šn|„‹—„™Ÿ™£Œˆ‡£•zƒŽ˜•ƒ~sqiVaFcSFTN_lzuhkwkˆ†ss–‹‘‘„­§ª­k“ž†ŒtŒŠ_oqdieod[kXqpw…“wnh`Ouxs˜„u¢Š˜”¡‹hk‡~‰zz°›£€›­z£ž}{–‡Œ‡†wlSRfZ{vyŒyvqu‹`\gmžyz¡’›™—‰”Žty€|“›–t€Ž‰§¶xŽj‘nƒ‹‹‰u\ove}u‚‹•–—¥Ÿš}i{gf›‡¢x`•…’œ†€tudIne\^[X…qožq€hKo€”‘>G\_‚ž˜¦•fƒ‚€“YhŒk}£¯‹°¢VbL9dˆy‚rZq—–•—vuX0x‰MfRSkk”¨œŒ”w¢ša‘³•…£ny‹¡£±¦¢¨{Šzr´—°š}€{PmLK…°›»žoˆ]ˆ´~[~`MŽs‰bi¢£ŽŽtl”†g–ƒq¼ˆˆ¹dG{caž‰™¼mŠw†X:\i^«³ˆ›u[›yh”irQQ[4BXQc³‰q©{Žo‚ŠVn‡x‡³“™´Œ†x|‰ƒz‚šž©¢|•…d`ibK{¡ŽoRc¡€pGXf…žbTndhn˜†gŸ†q³œˆ®”•”ts…–¤¦ªËihn‡¸¢ªŸŠ¤±|zvM‚v¡—]>£‡‚w]>¤omcq~‘ofgx…`uœ`nН¢’‘¥ŸKfŽe‘Š{’†ƒ¥–™ZukR^›˜ˆbkœeVrZ~‹tMZtbyV¦}‡|Wa{œˆz\TŠ~yb}‡qPjpN¥^‰°œÀ£|‰vhfglvŸŒš’—¨¶Ÿ}Ÿxr}|xh«~›µ˜~jØcPs}tx‹‚bqŸŸnzƒs—s—‡\Q‚¤Š~Ä ‘œ‚~l]Tkzzg˜’ž‹‡z§Ÿi_wšŠiM¥”cs£ƒ|‚]lˆ~™‚\{BNqŸšddL^𥙥b_xo‰}sƒo—z‹mz§«‡i¥…’}€h”›¥–[y}’•¬‘‹q`yx…ˆ‰…aŒ—ˆj†s{Š•¨›jtgnr€m~r‹’–d{k•ˆjwulnˆwkg]r~‘nƒ¢}Œu\nur}—¨•xon‚~Š”vck€kƒ‡šwk|‚ox~‹–€…ƒhˆzpl‘eŸ|z“‡s^kn„ƒ•‘‚‰˜‚€¡ƒssˆ†mx“’w‰‹€w‡’‚‚Ž~m‰‚py›Ž{~ˆ„€Š‘‹‡zzcgix`‰{|oƒtdf~v{|Šw€‚~††‘|€ymv„‹‚vyoouŠx~f€……{r‚ˆ\t•v…p‘“y”sr{yjy‚€x–“…ƒ•…}Œ‡k…„–ƒ|u„ƒ‡”ˆ‰}~|zŠ„xˆ‚‡yvƒ{tuxŠ„lfsuu~‚q…z…Œtsˆ|l…v„ƒ‹Ÿ‘‰{}~~pŒi\wkncvƒ…†”™œ‰‹“‡x‡•Šu|“މ’†…‰‰u‡”wy‹†}whrj[o„{nyŽ€~‚ur…nd}|l}‰wp{setuwvƒxlu‘qj„vy}›ƒ‚†s‰—x|~~Šl€”…†ˆ‰–—……{Œ~tˆ†rrŒzˆ|s‹‰‚{…‰„…ކ“uj|•mb|t†ƒ†–„vi\gzpgzt|‚Ž‘”~‹twy}}ˆty‹Œ‰„…‹‰†ˆ‡†€„‘†‡~€Šyu‘‚uy~z{†€‰x~†vrm{ˆpuuyˆp}€{i}|yztm~|v€r€w…€lvv‡wnrtqrfyƒƒ‚z‚„†ˆ€r…†}‚‡‚‘ˆ…ˆw€{~…~ox„ww……’‰…‰…‡‰ŽŠ|„„„Šƒ}|„t€ˆ‰ˆƒ}u„xt{~tt{ƒ‚||ƒ~€‰„|…~}wtty„‚ypxs}{wdk|{vu{z||„rvz~…y{€‹Š„‡Š‘€uˆŒ’‘{y~‚ˆˆ†trxz|wyŒ‡{yƒ‰ƒ‚ƒ€‚„z|uƒ€rw~‚€spx|Œ~lxv}ƒxyxˆ……„{w€Ž}ˆvw†…’Ž„~zz†ˆ‡„rx}„‡}jo‚€…‰vz€}~€‚‡t|…|y‡ƒ~„}z„ƒ…‚z‚…‰ˆx„Šxr{}|ƒ€…wq{u†Š}w}„…†„}ƒ|t|tw„…~y|{xv‚yvyv‰€…†{yv~~‚ƒ„}€ƒz„}†…~„~yƒ‚u†Œ‰‹ƒ…†~‡‚zƒ‹{vw„€…„‰ƒ‚Š…‰zzztyŠ{‚‚‚z|€‚y{„|~zƒ‚ƒ~}||u‚ywyt‚|‡y|{zs€†|||…Ž~yqr€…†{yr|ƒ„ƒ„s~Їƒƒ|{†}‡„‚ƒ~{wwƒ‰†‚~w†ŽŒŽ‰†}zt„†‡‰y†~z{ƒ|ly€€x~~{v~„‚ˆ~{‚vƒ†…{s„pxˆ‡~€z}„„‚Œ~ˆƒ€€€‚|ƒ„z~v‚‡€„Œ|y~ˆ‚‚‹Œ€y‚y~‰ˆ}€ƒur}‹†~~wvwnt‰w‚Ž‚|††{€yƒ{|‚ƒ~Š|t|†„x„y{{{€‡‡~‡v|‚}‡‚|ywz|{||z}ƒ‚}†…€‚~}~‚‚†ƒƒŠŠ|~†‹Œ{x}„€‹„|ƒx‚†„‡ƒ€|„z}{{|{w~‚||~…{|~|yƒ|z€}ƒ}‚ƒƒ}~~z~zzƒƒ~„}~x†ˆ‚‚ƒy~}~|€€}†‚‚ƒ€{z}}z‚€{|‚~{ƒ‚{‚…„xy…€{{~‚„ˆ‚†…‰|{€y€~ƒˆ‚‚‰ƒ„‰†|~ƒ‚€|‚~~…‚‚z}€vu}z}„x€~s{€ƒƒ}ƒ~|z‚{…‰„w}}zvw~„{…~„„v}{}u€„€ƒz~ˆ…}ƒƒy}‡‚€~|€‚‡†yx€‚€€‡‚x}…†z€u||{~}~€ƒ…{‚‚}€z†€†‰y}~…€~ƒ…~‚v{‚yy‚€‚‡‚‚z~€~‚{yƒ|ƒ†}ƒ‰‚z{‹‚z{‚€~‚‚„€}~~~…|{z‚…€~z€†~{‡ˆ‚‚‡……~|€|‡~}†„„|}|ƒ~{~wyw†|t}€€~…}x~|~~€„~€{w„…y…|€~y‚ƒ|||‰‰||~‚€}‚z€†ƒ{~}‚~‚€~‚‚€‚‚{{}ƒ‚‡†‚~}„}{v~ˆ~}‚€ƒ‚{}‚~„„€‚‚€…„x|…ƒ~„ƒx~}}‚…‚}…ƒƒ{~†‚€}‚yv€€}€w|}w||y}}z{€~z|…|}‚‚ƒ‰‚}xˆŠ{}~…~{„…ƒ€„‚~~ƒ{~}€‡‚z‚……{ƒ†ƒw€ƒy~~{{ƒ}zzƒ|…„}wƒ~{€€y~~‚~†~€ƒ€~}|}|‚z~}‰…„|€}}ƒxz€z…„…~y~„ƒ~y|‚‚€~~}}‚‰„€}……€„z{†ƒ|„}|ƒ~ƒ~…}|~}‚y~~y||}~}||y€|}‚~€€|ƒ€|‚ˆ‚‡Š…ƒ‡…‡€€€{€}{{‚„‚€€{{€{{€{€…†€ƒˆ|}~~€~~€}~ƒ„|~€|€~€‚~~…‚{y‚~ƒ‚†{z…‰z‚‰‚x||€€|‚‚}~€}~~~~{~†€}z}}|€~~„ƒ€}~~ƒ‚„}{|~…ƒƒ‡‚|€„ƒ‚~‚ƒ‚€~{~{~}~‚€{}€~ƒƒ~w{|€|€~|€…€€~|ˆƒ„~y}ƒ€ƒ~ƒ‡ƒ}„€||€„‡„ƒ€€~€€}€}}~||~~}{|€yy}{€€‡„‚ƒ…ƒ€~}|€|€‚{€‚‚€{‚„€ƒƒ~{y‚}}€}|~‚‚€}„ƒ~‚‚‚„|„„~}|„„‚|~ƒ€}|}yz}}‚€~|€~}‚€}{ƒ€~{}|€ƒ€|€ƒ€‚‚†}€}|}€~~~‚ƒˆƒ€y|}~€}~}~}|€€ƒ€~€~ƒz{~……~‚ƒ~~‚€|~ƒ€~~‚€}~€~~…„€~~ƒƒ€€‚~~}y{…†‚‡ƒ}~{€}€€€€€‚‚~}€}€„„€zy|}‚{|€~z~{}‚„€€„}}€€~€}|‚ƒ~€…„€€~~€~|}€‚‚€‚„‚€€€€~||}}‚~~~„„‚€‚€€€ƒ~~~‚~€~|~|€ƒ‚~~€‚€ƒ€‚‚€‚|||}€‚‚|ƒƒ~}~}€‚~}~€€~|~€€‚€€€€€€€€€€€€€€‚~}‚€‚‚€~~~~~}|~~€€€€‚ƒ~}€€}|~€€€€}€~~€~~€€€ƒ‚€‚€€}|}}‚€€€~€~~‚~‚€~€~}~€~~~€€€€~€€€~~€~€~€~€€€€€~€€€€€€€€€€€€€€~€€€€~}€~~€€€€€~€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€~€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ \ No newline at end of file