X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=MUDDLE%2Fnuprm.8;fp=MUDDLE%2Fnuprm.8;h=f99afc4c1f5705a88dc24d87cbe092b5e4d52dad;hb=39c5769144e7f2a58076bdb973d2c80fa603345c;hp=0000000000000000000000000000000000000000;hpb=bab072f950a643ac109660a223b57e635492ac25;p=pdp10-muddle.git diff --git a/MUDDLE/nuprm.8 b/MUDDLE/nuprm.8 new file mode 100644 index 0000000..f99afc4 --- /dev/null +++ b/MUDDLE/nuprm.8 @@ -0,0 +1,532 @@ + +TITLE PRIMITIVE FUNCTIONS FOR THE MUDDLE SYSTEM + +RELOCATABLE + +.INSRT MUDDLE > + +.GLOBAL CALER,CALER1,NWORDT,CHARGS,CHFRM,CHLOCI,TFA,TMA,IFALSE,IPUTP,IGETP,WTYP1 +.GLOBAL ITRUTH + + +; BUILD DISPATCH TABLE FOR PRIMITIVE FUNCTIONS USAGE + +PRMTYP: + +REPEAT NUMSAT,[0] ;INITIALIZE TABLE TO ZEROES + +IRP A,,[2WORD,2NWORD,NWORD,ARGS,CHSTR,BYTE] + +LOC PRMTYP+S!A +P!A==.IRPCN+1 +P!A + +TERMIN + +LOC PRMTYP+NUMSAT + +PNUM==PBYTE+1 + +; MACRO TO BUILD PRIMITIVE DISPATCH TABLES + +DEFINE PRDISP NAME,DEFAULT,LIST + TBLDIS NAME,DEFAULT,[LIST]PNUM + TERMIN + + +; SUBROUTINE TO RETURN PRIMITIVE TYPE AND PRINT ERROR IF ILLEGAL + +PTYPE: GETYP A,(B) ;CALLE D WITH B POINTING TO PAIR + CAIN A,TILLEG ;LOSE IF ILLEGAL + JRST ILLCHOS + + PUSHJ P,SAT ;GET STORAGE ALLOC TYPE + CAIN A,SARGS ;SPECIAL HAIR FOR ARGS + PUSHJ P,CHARGS + CAIN A,SFRAME + PUSHJ P,CHFRM +PTYP1: MOVE A,PRMTYP(A) ;GET PRIM TYPE, + POPJ P, + + +; PROCESS TYPE ILLEGAL + +ILLCHO: HRRZ B,1(B) ;GET CLOBBERED TYPE + CAIN B,TARGS ;WAS IT ARGS? + JRST ILLARG + CAIN B,TFRAME ;A FRAME? + JRST ILFRAM + CAIN B,TLOCD ;A LOCATIVE TO AN ID + JRST ILLOC + + LSH B,1 ;NONE OF ABOVE LOOK IN TABLE + ADDI B,TYPVEC+1(TVP) + PUSH TP,$TATOM + PUSH TP,MQUOTE ILLEGAL + PUSH TP,$TATOM + PUSH TP,(B) ;PUSH ATOMIC NAME + MOVEI A,2 + JRST CALER ;GO TO ERROR REPORTER + +; CHECK AN ARGS POINTER + +CHARGS: PUSH P,A ;SAVE SOME ACS + PUSH P,B + PUSH P,C + MOVE C,1(B) ;GET POINTER + HLRE A,C ;FIND ASSOCIATED FRAME + SUBI C,(A) ;C POINTS TO FRAME OR FRAME POINTER + ANDI C,-1 + CAILE C,(TP) ;WITHIN STACK? + JRST ILLARG ;NO, LOSE + HLRZ A,(C) ;GET TYPE OF NEXT GOODIE + CAIE A,TENTRY ;MUST BE EITHER ENTRY OR TTB + CAIN A,TTB + JRST CHARG1 ;WINNER + +ILLARG: PUSH TP,$TATOM + PUSH TP,MQUOTE ILLEGAL-ARGUMENT-BLOCK + JRST CALER1 + +CHARG1: CAIN A,TTB ;POINTER TO FRAME? + MOVE C,1(C) ;YES, GET IT + CAIN A,TENTRY ;POINTS TO ENTRT? + MOVEI C,FRAMLN(C) ;YES POINT TO END OF FRAME + HLRZ C,OTBSAV(C) ;GET TIME FROM FRAME + HRRZ B,(B) ;AND ARGS TIME + HRRZ B,1(B) ;TIME IS IN INFO CELL + CAIE B,(C) ;SAME? + JRST ILLARG +POPBCJ: POP P,C + POP P,B + POP P,A + POPJ P, ;GO GET PRIM TYPE + + + +; CHECK A FRAME POINTER + +CHFRM: PUSH P,A ;SAVE SOME REGISTERS + PUSH P,B + PUSH P,C + HRRZ C,1(B) ;GET POINTER PART + CAILE C,(TP) ;STILL WITHIN STACK + JRST ILFRAM + HLRZ A,FSAV(C) ;CHECK STILL AN ENTRY BLOCK + CAIE A,TENTRY + JRST ILFRAM + HLRZ A,1(B) ;GET TIME FROM POINTER + HLRZ C,OTBSAV(C) ;AND FROM FRAME + CAIN A,(C) ;SAME? + JRST POPBCJ ;YES, WIN + +ILFRAM: PUSH TP,$TATOM + PUSH TP,MQUOTE ILLEGAL-FRAME + JRST CALER1 + +; CHECK A LOCATIVE TO AN IDENTIFIER + +CHLOCI: PUSH P,A + PUSH P,B + PUSH P,C + + HRRZ A,(B) ;GET TIME FROM POINTER + JUMPE A,POPBCJ ;ZERO, GLOBAL VARIABLE NO TIME + HRRZ C,1(B) ;POINT TO STACK + HRRZ C,2(C) + CAMN A,C + JRST POPBCJ + +ILLOC: PUSH TP,$TATOM + PUSH TP,MQUOTE ILLEGAL-LOCATIVE + JRST CALER1 + + + + +; FUNCTION TO GET THE LENGTH OF LISTS,VECTORS AND CHAR STRINGS + +MFUNCTION LENGTH,SUBR + + ENTRY 1 + + MOVE B,AB ;POINT TO ARGS + PUSHJ P,PTYPE ;GET ITS PRIM TYPE + JUMPE A,WTYP1 ;IF 1 WORD, LOSE + MOVEI B,0 + SKIPE C,1(AB) ;IF NON-ZERO, FIND LENGTH + AOJA B,@LENTBL(A) + JRST LFINIS ;OTHERWISE USE 0 + +PRDISP LENTBL,IWTYP1,[[P2WORD,LNLST],[P2NWORD,LNVEC],[PNWORD,LNUVEC] +[PARGS,LNVEC],[PCHSTR,LNCHAR]] + +LNLST: MOVSI A,TLIST ;WILL BECOME INTERRUPTABLE + HLLM A,CSTO(PVP) ;AND C WILL BE A LIST POINTER +LNLST1: INTGO ;IN CASE CIRCULAR LIST + HRRZ C,(C) ;STEP + JUMPE C,.+2 ;DONE, RETRUN LENGTH + AOJA B,LNLST1 ;COUNT AND GO + SETZM CSTO(PVP) + + +LFINIS: MOVSI A,TFIX ;LENGTH IS AN INTEGER + JRST FINIS + +LNVEC: ASH C,-1 ;GENERAL VECTOR DIVIDE BY 2 +LNUVEC: HLRE B,C ;GET LENGTH + MOVMS B ;MAKE POS + JRST LFINIS + +LNCHAR: LDB D,[360600,,C] ;GET POSITION FIELD + LDB E,[300600,,C] ;AND SIZE FIELD + MOVEI A,(E) ;COPY E + IDIVI D,(E) ;D=> NUMBER OF BYTES IN WORD-1 + MOVEI B,1(D) ;EXACT # OF BYTES IN 1ST WORD + MOVEI D,36. + IDIVI D,(A) ;MAX BYTES PER WORD + HRRZ E,(AB) ;POINT TO DOPE WORD + SUBI E,2(C) ;NUMBER OF WORDS IN ENTIRE STRING + JUMPL E,LSTCH2 ;NULL STRING + ADDI C,(E) ;POINT TO LAST WORD + JUMPLE E,LSTCH1 ;IF <0, NONE IN OTHER WORDS + IMULI E,(D) ;NO. OF CHARS IN THIS PART OF STRING + ADDI B,(E) ;ADD IN NO. IN 1ST WORD + +LSTCH1: LSH A,24. ;START TO BUILD BYTE POINTER TO LAST WORD + TLO A,440000+C + HRLI B,-5 ;MAX OF 5 + ILDB 0,A ;GET A BYTE + SKIPE 0 + AOBJN B,.-2 + + HRREI B,-5(B) ;FUDGE FOR DOUBLE USE OF WORD 1 + JUMPGE B,LFINIS +LSTCH2: MOVEI B,0 + JRST LFINIS + + + +MFUNCTION ATOMP,SUBR,ATOM? + + ENTRY 1 + + GETYP A,(AB) + CAIE A,TATOM + JRST IFALSE + +IDNT1: MOVE A,(AB) ;RETURN THE ATOM + MOVE B,1(AB) + JRST FINIS + +MFUNCTION QUOTE,FSUBR + + ENTRY 1 + + GETYP A,(AB) + CAIE A,TLIST ;ARG MUST BE A LIST + JRST ERRIFS + SKIPN B,1(AB) ;SHOULD HAVE A BODY + JRST ERRTFA + + GETYP C,(B) ;GET TYPE + MOVSI C,(C) ;TO LH + +QUOT2: CAMN C,$TDEFER ;DEFERRED? + JRST QUOT1 + PUSHJ P,PTYPE ;CHECK FOR LOSERS + MOVE A,C + MOVE B,1(B) ;GET DATUM + JRST FINIS + + +QUOT1: HRRZ B,1(B) ;POINT TO DEFERRED VALUE + GETYPF C,(B) ;GET TYPE + JRST QUOT2 + +MFUNCTION EQ,SUBR,[==?] + + ENTRY 2 + + MOVE B,AB ;POINT TO FIRST ARG + PUSHJ P,PTYPE ;CHECK ON IT + ADD B,[2,,2] ;SAME FOR SECOND + PUSHJ P,PTYPE + + GETYP A,(AB) ;GET 1ST TYPE + GETYP C,2(AB) ;AND 2D TYPE + MOVE B,1(AB) + CAIN A,(C) ;CHECK IT + CAME B,3(AB) + JRST IFALSE + +ITRUTH: MOVSI A,TATOM ;RETURN TRUTH + MOVE B,MQUOTE T + JRST FINIS + +IFALSE: MOVSI A,TFALSE ;RETURN FALSE + MOVEI B,0 + JRST FINIS + + + +MFUNCTION EMPTY,SUBR,EMPTY? + + ENTRY 1 + + MOVE B,AB + PUSHJ P,PTYPE ;GET PRIMITIVE TYPE + + JUMPE A,IFALSE + MOVE B,1(AB) ;GET THE ARG + + CAIE A,P2WORD ;A LIST? + JRST EMPT1 ;NO VECTOR OR CHSTR + JUMPE B,ITRUTH ;0 POINTER MEANS EMPTY LIST + JRST IFALSE + + +EMPT1: CAIE A,PCHSTR ;CHAR STRING? + JRST EMPT2 ;NO, VECTOR + JUMPE B,ITRUTH ;0 STRING WINS + HRRZ A,(AB) ;POINT TO DOPE WORD + LDB C,B ;CHECK POINTED TO CHAR + JUMPE C,ITRUTH + CAILE A,1(B) ;PAST DOPE WORD? + JRST IFALSE ;NO, RETURN + JRST ITRUTH + +EMPT2: JUMPGE B,ITRUTH + JRST IFALSE + + +MFUNCTION EQUAL,SUBR,[=?] + + ENTRY 2 + + MOVE C,AB ;SET UP TO CALL INTERNAL + MOVE D,AB + ADD D,[2,,2] ;C POINTS TO FIRS, D TO SECOND + PUSHJ P,IEQUAL ;CALL INTERNAL + JRST IFALSE ;NO SKIP MEANS LOSE + JRST ITRUTH + + +; INTERNAL EQUAL SUBROUTINE + +IEQUAL: MOVE B,C ;NOW CHECK THE ARGS + PUSHJ P,PTYPE + MOVE B,D + PUSHJ P,PTYPE + GETYP 0,(C) ;NOW CHECK FOR EQ + GETYP B,(D) + MOVE E,1(C) + CAIN 0,(B) ;DONT SKIP IF POSSIBLE WINNER + CAME E,1(D) ;DEFINITE WINNER, SKIP + JRST IEQ1 +CPOPJ1: AOS (P) ;EQ, SKIP RETURN + POPJ P, + + +IEQ1: CAIE 0,(B) ;SKIP IF POSSIBLE MATCH +CPOPJ: POPJ P, ;NOT POSSIBLE WINNERS + JRST @EQTBL(A) ;DISPATCH + +PRDISP EQTBL,CPOPJ,[[P2WORD,EQLIST],[P2NWORD,EQVEC],[PNWORD,EQUVEC] +[PARGS,EQVEC],[PCHSTR,EQCHST]] + + +EQLIST: PUSHJ P,PUSHCD ;PUT ARGS ON STACK + +EQLST1: INTGO ;IN CASE OF CIRCULAR + HRRZ C,-2(TP) ;GET FIRST + HRRZ D,(TP) ;AND 2D + CAIN C,(D) ;EQUAL? + JRST EQLST2 ;YES, LEAVE + JUMPE C,EQLST3 ;NIL LOSES + JUMPE D,EQLST3 + HLRZ 0,(C) ;CHECK DEFERMENT + CAIN 0,TDEFER + HRRZ C,1(C) ;PICK UP POINTED TO CROCK + HLRZ 0,(D) + CAIN 0,TDEFER + HRRZ D,1(D) ;POINT TO REAL GOODIE + PUSHJ P,IEQUAL ;CHECK THE CARS + JRST EQLST3 ;LOSE + HRRZ C,@-2(TP) ;CDR THE LISTS + HRRZ D,@(TP + HRRZM C,-2(TP) ;AND STORE + HRRZM D,(TP) + JRST EQLST1 + +EQLST2: AOS (P) ;SKIP RETRUN +EQLST3: SUB TP,[4,,4] ;REMOVE CRUFT + POPJ P, + + + +EQVEC: HLRE A,1(C) ;GET LENGTHS + HLRZ B,1(D) + CAIE B,(A) ;SKIP IF EQUAL LENGTHS + POPJ P, ;LOSE + JUMPGE A,CPOPJ1 ;SKIP RETRUN WIN + PUSHJ P,PUSHCD ;SAVE ARGS + +EQVEC1: INTGO ;IN CASE LONG VECTOR + MOVE C,(TP) + MOVE D,-2(TP) ;ARGS TO C AND D + PUSHJ P,IEQUAL + JRST EQLST3 + MOVE C,[2,,2] ;GET BUMPER + ADDM C,(TP) + ADDB C,-2(TP) ;BUMP BOTH POINTERS + JUMPL C,EQVEC1 + JRST EQLST2 + +EQUVEC: HLRE A,1(C) ;GET LENGTHS + HLRE B,1(D) + CAIE A,(B) ;SKIP IF EQUAL + POPJ P, + + HRRZ B,1(C) ;START COMPUTING DOPE WORD LOCN + SUB B,A ;B POINTS TO DOPE WORD + HLRZ 0,(B) ;GET UNIFORM TYPE + HRRZ B,1(D) ;NOW FIND OTHER DOPE WORD + SUB B,A + HLRZ B,(B) ;OTHER UNIFORM TYPE + CAIE 0,(B) ;TYPES THE SAME? + POPJ P, ;NO, LOSE + + JUMPGE A,CPOPJ1 ;IF ZERO LENGTH ALREADY WON + + HRLZI B,(B) ;TYPE TO LH + PUSH P,B ;AND SAVED + PUSHJ P,PUSHCD ;SAVE ARGS + +EQUV1: MOVEI C,1(TP) ;POINT TO WHERE WILL GO + PUSH TP,(P) + PUSH TP,-3(TP) ;PUSH ONE OF THE VECTORS + MOVEI D,1(TP) ;POINT TO 2D ARG + PUSH TP,(P) + PUSH TP,-3(TP) ;AND PUSH ITS POINTER + PUSHJ P,IEQUAL + JRST UNEQUV + + SUB TP,[4,,4] ;POP TP + MOVE A,[1,,1] + ADDM A,(TP) ;BUMP POINTERS + ADDB A,-2(TP) + JUMPL A,EQUV1 ;JUMP IF STILL MORE STUFF + SUB P,[1,,1] ;POP OFF TYPE + JRST EQLST2 + +UNEQUV: SUB P,[1,,1] + SUB TP,[10,,10] + POPJ P, + + + +EQCHST: PUSHJ P,PUSHCD ;SAVE ARGS TWICE + PUSHJ P,PUSHCD + MCALL 1,LENGTH ;FIND LENGTH + PUSH P,B ;AND SAVE + MCALL 1,LENGTH + POP P,A ;RESTORE OLD LENGTH + CAIE A,(B) ;SAME + JRST EQLST3 ;NO, LOSE + JUMPE A,EQLST2 ;BOTH 0 LENGTH, WINS + MOVE A,(TP) ;GET BYTE POINTERS + MOVE B,-2(TP) + HRRZ C,-1(TP) ;POINT TO DOPE WORD + HRRZ D,-3(TP) + + LDB 0,A ;GET BYTES + LDB E,B + +EQCHS2: CAIG C,1(A) ;STILL WINNING? + JRST EQCHS3 ;NO, SEE IF OTHER STRING EMPTY + CAIE 0,(E) ;CHARS EQUAL? + JRST EQCHS4 ;NO, LOSE + JUMPE E,EQLST2 ;NULL CHAR, WINS + + ILDB 0,A ;GET NEXT CHARS + ILDB E,B + JRST EQCHS2 + +EQCHS3: JUMPE E,EQLST2 ;IF E NULL , WIN + CAIG D,1(B) ;CHECK OVERFLOW + JRST EQLST2 + JRST EQLST3 + +EQCHS4: JUMPE 0,EQCHS3 ;SEE IF OTHER EMPTY + JRST EQLST3 + + +PUSHCD: PUSH TP,(C) + PUSH TP,1(C) + PUSH TP,(D) + PUSH TP,1(D) + POPJ P, + +; NTH, AT AND REST + +MFUNCTION NTH,SUBR + + ENTRY + MOVEI E,1 ;E IS A SWITCH + JRST INTH + + + +MFUNCTION GET,SUBR + ENTRY + HLRE A,AB ;GET -NUM OF A + ASH A,-1 ;DIVIDE BY 2 + AOJGE A,TFA ;0 OR 1 ARGS IS TOO FEW + GETYP A,2(AB) ;GET FIRST TYPE + CAIE A,TFIX ;IF INDICATOR IS TFIX THEN WORRY + JRST IGETP + MOVEI B,(AB) ;GET OBJECT + PUSHJ P,PTYPE + MOVEI E,1 ;E IS A SWITCH + JRST @IGETBL(A) ;DISPATCH +PRDISP IGETBL,IIGETP,[[P2WORD,INTH],[P2WORD,INTH],[P2NWORD,INTH],[PARGS,INTH],[PNWORD,INTH],[PCHSTR,INTH]] + +MFUNCTION PUT1,SUBR + JRST IPUT1 + +MFUNCTION PUT,SUBR +IPUT1: y0C+@y/õ`±õ`7'(ô õ`‡@@,j÷¤‡õ`‡7 y/î.0:. ô­ë \y0)öè<°Wõ`«!<øW<°Qô<°O.\rô<°Sõ×åöw€®½õ`©ö‹€—ös€®½+76|y/ü?+N7 y/+7ô|¯/(@ö‹€3|%zõ` y/õ öH€¥õ+7 y/(@ \%zô€¥õô€+7ô<°Oõç<°S?  <.\u+I4^7þök»ïxYô<°QöÈ<°Wa|õ`»ô<°O.\rô<°Sõ×å+7`|+7ô<°Oõç<°S?  <.\s+77@y/+7ô<°Q`|+7ô<°Oõç<°S.\s+7ô€ÕöèKïö €,z föπË2>-g+k6@y/öÈ<°Q,!4>!"øð¼°Q Ffô€Ë y.y`|õ`ã6@y/õ`õ†€G,z:"l"@ö€øð¼°Q h÷PÍ+ y/%òé§Q y/&ùðÑ(ï{<')õ1<Xü1ÿÿ+ Q2D@Q&D@ Fgô€ÏòâÏg÷@E Dh4H÷pÑöÐ<¯ö2ÿÿ+aB+ø(€ÿûBTw=Hô€Ëõ†€í+ô€Õ1& ?`i,z hô€Ë`D‡÷¡ùmd+ ùðË!$øñ<°Q+fò逧Q/&4f ûô¼¯Kô¼¯M+w!< ø÷<°Qõ`ã÷PKïõb#ô€§S Bnõ†€N§ø+ùðKï nõ`öè<°Q,z/'ùðKï+@@iùðËþ—½‰Õïx,zöÈKï,zûg€ûX,LI"`Bõ`=ùðß,zø(€ÿôI€õ†€í,zõ`;ùðÍôO€"<õÇ­ë 2Xô €22-gõ`m7@I/7@I/õ`kô$°QöÐ$°O`dõ`kô €`dõ`W2X!"BB9ô€Ýòû€§Yú2÷PKï,z:#þ¿ nûa„Twö±€9!&ïzòëŒ]eNõ`ø+€ÿ1N+õY€!&GFR)þ¿ '-.nòë€õŽ€O@oõ†€N§@)õ–€òû€ô €òû€§[þ¿ n!$BDR)ôÀÝ7 oaf@õ`; .òû€§[:e,P{+(ùðKï+ `1"xö(€-õb=ûAÝô1Twô „Twô€×ô€×XF8÷@Õ:eûaˆú1„S‡õƒÿñö €+%ô ÷d'ô òù§?õ†€!ùðKïõ` ¿1~lõbSõŽ€3^võ`a y.y`|õ`a7@y/õ`_!< ø÷<°Qõ`aõ†€G+G y/%dN@ô¼¯Kõ ƒÿÿ.&8Q&$@öèQ&@òë€4N'.aN+:ÿR‡ô¿ÿþm(Nïx0n@@o1Nô €òû€÷@<°Sõ–€,zþ¿ôJô€½öè—7õ`}6@9õ`‡ôK€ô*ƒÿýöè—7õ`…öj—+ûC€öj—+ô—+õZ€ö‹€§]ZNmöš Ÿ *P6@9 *dô€Ûõ`ù/'/ n!.BNR)ùðKï,zô,ÿý76@_+Oô ÁQ@b@lôá,FôáO@@_õ\•,zôáö”§_ô Ç4*'0GJY/ ",zô€øá Y0( Y/% Y/& *(Dï{<')õ1<Zü1ÿÿõ`ËQ&D@Q(D@òà€`Bõ`Éö”€Éö4ƒÿÿõ`ÉõŽ€õŽ€,:,:Q6@l,F,Z,Zõ–€õ–€ö€ Ÿ÷@=d[0j@õ` ¥ Y0(/$ö™ ¥ *@ô¬¯Kô,¯Mõ`­öð<¯#3^.5,z:h2^-i3^-p,z2^-s3^W,z2^-l3^-m,z3^-k,z y.y`|:h,zô§E6@y/øç<¯ô<°[ø„§EDþìQþ½ÿþíø'4\;-<fõ†€Gõ`ô<°[ù¤<¯Aø €§E6@y/4Bm!<ø÷<¯ôöO!õ`úGG\y/ûX02x+9+77 A/î+7ô °]`|+ õ†€ # < . \y.y!<øW<¯ø|¯/õ` < ø÷¦+7öÐçõ`Qöï€õ`6@y/õ`9*%{ö€#3^%{õ`+ ô<¯  \y/ ô ó \y0'7>%{õ`Cô<¯ \ y/ \ y0'ô óú¯øW<¯=,< y.y \p!y/õO€+p!< üW<°Q+ !<PøW<°Q@@y/õ`õ†€G+ õ`þ€§a!<Z \îTú¯øW¯=@@&OD/+'1:.^! X@ô€*>ô€§cõ`€7>tõ`ôG<°S.-uõ箛õÇÕ/jõçå.u.s1<õ`!<øW<°WO@tøé:'÷ðç+; >ôM!<2>-g+9öè<°W7@y/+8öo<°Oú¡.ÿŸÿÿm+8ôô<°O.>lõ`g Tt7  <ôéö‹€Yõ`ô<¯IôãõŽ€,:õŽ€4^LûA€at+C`T+SZ`t õ`§ /%`t+U ".zb'2 Dy/ô<¯Katõ`•ôžY`Tõ`•ô(¯Kat Q/%`tô(¯Kô<¯?Dy/ò耧eö€õb›p y/îô@€&"l!$(Dpõ–€,Zõ–€,zöážYô(¯K "V+E "/+EùÚ®Ûïx^7@y/+.>l2>-g,z7@y/+<'55\ô<¯ø!GDy/+üä€ ô€§kô¼¯ISbDU8ïxþ,!õ` ³üä€ ô€§kô¼¯IBy/,:,<,Z,z÷@C4~'6 <l&^$<löw7@y/+' y/î`| õbQöÐ<¯õ` ¥öß<¯#+3 y/ öW§mõ`i y.ya|õ`a@@y/!<PøW<°Q:h,z6@y/+: '7 \y/ ,zø<¯#ø8¯#++7@y/,zöW§Iõ`o!<G\y/ y.y`|õbqô§m \y/ y.y \y/!>y/ \y.yø<¯I@@y/!<pøW<°Q6\y/+ ( @&Fõ`¯õ–€,zô¸ p+[ >2>-gõ`Ó7@y/+o.>lõ`Í7 ',z >l.-g,: 0(ö?<®Á+u,Zùð<­C*-g,x B^pFõ–€õÏ­íô<¯/ø<°Q@@y0)ø<°Sø<°Oùð<°YO@y0-@@y0( sCSwQLW@Y> @øÿÿÿÿÿð %{ô€ ]ô€ © y0/ $,T %{!< &X%{õb ï \y0C \y/ ,Zy.y $':òê§u6@.ûX0(õb +iõp +õ` +ƒ*\ 0 p`b~õ` ¥$':òê§uö‘ +uõÁ./0(+ ;+@ =,z÷' +m6 7 ,Z,Zõ–€/'8+põ†€ +‡, G[4B .õ†€ = B:@,z*õ†€ ++õb +‹*õ` ¥þ¿7 + `!$GDþ¿*,: , , t,Z+ F,: ,@õ` +á hú/7ÿÿ,: ,@, t,Zõ` ¥,: , õ` +á,: ,`õ` +á,: ,`õ` +á hú/7ÿÿ,: ,@, t,Zõ` ¥,: ,õ†€ +¹,Zõ` ¥õŽ€,:ô <°‘sDlXïx ^öð + d.0öð + d.0öð + d.0öð + dõb +Ç oï~þ,:p,Z@ PpQ\@ @üÿÿQPpþõ` +ù,: ,@õ` +á,: , õ` +á,: ,, t,Z,z,: ,@õ` +á* hôwÿÿ =* h, t,Zõ` ¥õŽ€ %{,:ô <°‘öð + |.0öð + |.0öð + |.0öð + |õb +÷ \@ô&<l %{Qy/Gô7 ZPy/õ` Ã,:7\y/+ Wõ†€ + :hõŽ€ %{l>7\y/õb , + V,:ô8Z\y/, ,Zö®Áø8,zõŽ€ <';`b5> ab+ O5> Oõ–€+p + + + #+ õ` ;õ` Cõ` +õ` 3ô7ÿÿO@p,zôwÿÿO@p,zôwÿÿõŽ€!"BBp+ OôwÿÿõŽ€ô(ƒÿÿ.Bp+ Oôwÿÿ>p,zùð¦e~f/ïx ô'wÿÿY\p!`üÿÿP\pø¦e,zôwÿÿ:p,zô7ÿÿ p5> %+pZ\y.yüÿÿû7<¯l~+ ',zõŽ€,:ô8Z\y/, ,ZXhö®Áø86\y/õ` Q/'8e~+?öئ@@y/#õ`c,:õŽ€,: %{7^y/+ 3ûDwÿýô3^+ 7ûG¼ö—€§w÷' i,Zõ–€õ†€ ÷@7ÿÿ+ WõŽ€ %{,:7\y/õb w, =õ` «,:ûD8ZPy/ö®Áø8,Z,zõ†€ ‡, ,zõ†€ ‡, =,zõŽ€ %{l>,: ô<¯3\|O"~ðùæ`-ÏùæUoÏðòÙKÛÿÿþ ;ùæX]O@Pðùæ[/;O(x^ð O0';ùæ^jÉð O)JO3Jð ùæ^9ÏO6,oðùæX+O0ðO@[] O@GðO:mO ùæX~‹ðùæTF# ùæL´íðùæ^k O@U}ðO(W-îO-ðùæTo•ùæLŸ•ðùæTr]ùæL¢]ðO*|DO4^Dð!O:gO/ð#O\ùæXm‹ð%O(8Ohð'ùæT8ùæLhð)O`(O`<ð+'U@}U@ }V@1Y\ññåC'ÿ@.,ññæPµ5@ñæPµññãæl×ññ术…@@<|ñ *l|@ñäÓÁuñ '@A@ñ䟅ñ (qA@ñæ(ªñQ&4@lññ杗_@ ñä{ö+ñ(oH@ ñä{õ ññæPµ @ ñä +§IññåsæE@ ÷„`ž“ÿþ »ñä{Ы@îñåH¸GñR.'@ñæúyÏññæ©OW@S[ñ<d@9d@ñãŸ:Iñ#ñä¾I@ñæ8gñ%ñæ(5@=vTñ'n@@ñäÓÙ ñ)ñæ7q[@ñæ`=ñ+ñåڊ@ñãž=ñ-73+@'>cñ/ñäØÙÅ@ñåbgÿñ1'@ñåcEñ3f@S1 ñ5ñä +Pƒ@'*?ñ7<\@'$ñ9)x@{xñ;R?t@[ñ=ñæ­SÏ@E ñ?yMJ@ ``gñAñæ(5ƒ@!NgñCM5D@"zMñECRh@#7x`ñä +¦ëbñ愋fñæÁÌghZlhjRk,lGn(o*pñäS?r(qˆt@M[vPxx&%zñååJ|X$8 ñãÄ÷ ñæ^å @ñã5µ `R% G@÷W²ßïxîðî`71 ðñæ§(gñäùxgðDfDYHðñåßaE%]0ð L*8A/4ð ñäԏ;ñãœ;ð 2,>fðD^\ñåbað\U Eðr X gE\ðuJ 8EðA;t Zoðñäͦ#îñã•&#ðñäÑo]ñã˜ï]ðñäÑދñã™^‹ðvu }E ð!p  NZ@ð#lf b\ð%@( @(ð'@< @<ð) @`ð+&k 'O ('<@0E^h@1~l+îL y0/d'=ô ©a|õb ò€§{4\îwú/¸ú/ ©d'>û7€ ©ò€§}b'?ò€§õa@ ©+ þŸ/p€õb «d'@7>%{+îWò§ <d'Aöè<¯Eõ` ë7<+îvöO§ƒ+îw2<'BöO§…÷A€ïxî]õ` —ö·€ ¿ 0*/ô§ \y/#õÿå y0/Z4'Cô<°U,p+îd÷@ © %{öÐ<¯Iõ†€93^&Höø¦+îhöȦ“+îq6@y/õb Ñö·€ Û <õG§ \/þ€õb × >ò€§‡õ` §7@y0I6@y0Jõb Ý7@y0K6@y0L+îp+îk7@y/#+îhùð¦“ø¦‘@@&I+îhõ†€Ù<'Dõ` Áö秉!<Tõ` »ô ©a|+îx!<Põ` »p€õb õd'@7>%{+î|ò§ <d'Aöè<¯Eõ` ë d'Eô€ óô€ ©azõbõÿåö7Gõ` ò€§‹õ` ŸBy/!:y/XûG€ d'F+îRþ %{ö×<¯#õ` %{þ6@y/+ h0"õ`Ùõȼ®Á[Zö”€Eû! H0ah@õ` ¥ô–Û!( øò• õ` ¥ ø-2'Jò꧕+PEð•Nô• N0N@N@I@Iö4€õ`)+Nl.b'K.'8üƒÿÿ:hò§—û€6&I#'+RõöÈõ`)ò€,zõ` ¥öè$£Íõ`)õ`¡ ô€ô €ô +W,t .f'Lò€§™[0`Põ`í`X õ`ÏdPl`N`Xÿ’Çȟÿþ¹aX+"`X (ö -õ`Óòê÷Š)÷ŠÅòéb'M+& õÁ€§›b'NaNô@`Nô@aNò§,z0P,z "@õ`Ý`Nõ`)/0 öŒ)00+rdPõ`ßõÌ®Á @d'O,zôõÍ ®Áô€ ZP+T00õ`ÿõÌ®±+nZõÍ<®Á[PZP,z`Pý›€õ`)ò€§Ÿd'P,:õŽ€õŽ€õŽ€ ,Wõ–€õ–€õ–€,Zò€§Ÿõ\ñ,z1p 10 õ`)õ†€ +ðKïõŽ€ 2 "Gàõ†€H—õ†€ ø)ÿòù€§¡l$ (Hïvl$ Gõ–€ õ`Ýø‚ ø ô ó‚ ôŽ ð õ=21(@9õgôaõc)v|2)z5.!t$-õ@[Q|õ>&(+õ?"€[õ?"€[õ>Ž€eõ>ƀ_ú=OÏWõ@qõUQv01v@6(@/õ@]õYõWø>‡õ?&€]õ?&€])|%.)|%.)|=/)|=/õ=‚€yQv3kMAÿþ9(@<õAQ|wOiQ}P){EM){EMõ>þ›õ>þ›){=Mõ>ú›(AN5H$öð°O,zõ`IôJõ†€ƒh'Qõ`¥õ†€ƒl(üŠ +öè¯1l( H .yõ`¥  /d(ï|ò§£,zþ3B%{B /d(ï|l( H /3B%{@ /õ` ³XH /,zúB¯;õû¯;õ`U&"lõ`ÝþBy/òê§O(H‡õ¯-þõ`Uö’)õ†€ƒ,;õ`ô¯%þõ`¥  / *þ2D)/õ`}ör¯%,z.*l3*-gõ`yõ` ¥õ†€¥öP€õ`)õ` ³('Rõ`Uh'R,zöw€õ`õ†€ƒ!$@øñ¯õ†€¥õÊÿ(Hï{ õŽ€õ†€ +PõG€,H>+ õ†€ s/'8õG€öw€,z!,@øS¯,zõ–€ %{õ`›6@ H /,zd Cô¯ô '`Hh`hh@XD /îü€p /î,zõÿÝ H /6@ü3€,zõ`'ö䧥ø,ÿ5›“Ëÿþ¹ô °[+@A'S6@ /+Z,zö䧥ø, $ 0.+]úB¯!õ`Ud C+0."‡õȀ."‡ø,+@@f,zGh /Bh /õ@€('Hõ@€õ`Uõ@€h'Hõ@€,z[y/(\û<¯1,zûB¯1õ`Uô€ ©b'Uò逧«ö€ö1€1õ`ö€+}&'V1Flõ`õ`bpõ`)ôõ†€­ Ty0Fh4\at~+öЦõ†€¤Óõ`ó,, v,z!"øð¼°Q+ , võbù$'V1DWõ`éö1­õ`õûa€ü€?0Fpõ`)õ`éõ†€ò€§­+o$'Wò€§¯d"pl"`õ`éDy/ y0Fn'X+ "$.Dy/ @@y/õ` ¥f,zõ` ¥,:ô §3\'7,PM,Z,zZø<°Uò€§± 6v'Y+ZõÍ<®ÁõŽ€,\õ–€ò€§±6'Y1V+p ,y0Dú+ ô ò€§³b'Zò€§µ y/ûb€S"1V7@y0D+)5D)ûEˏÿþ9ôbL'[õ`ÙõË<®Á 0[@0`Põ` aPõ` ¥[0*õAaPõ`M &]ZI'òû€§·,:'\õ`Oô ‚LëõŽ€§¹Q&(ô +€õ`mõ†€á+hô<¯'ûxQ"(õŽ€,:õŽ€ô)ÿÝûAˆ‹0FõY[5d>&']1V5F=!&ü€ \ No newline at end of file