tdn@spice.cs.cmu.edu (Thomas Newton) (11/10/85)
This post contains all three parts (Sampler.c, Sampler.R, Sampler.Hqx) of my Desk Accessory Sampler program. (See my message in net.micro.mac and net.sources.mac entitled 'A Program and a Flame' for details.) -- Thomas.Newton Thomas.Newton@spice.cs.cmu.edu ------------------------------ Sampler.c ------------------------------ /***************************************************************************/ /* Desk Accessory Sampler */ /* */ /* Copyright (C) 1985 Thomas D. Newton */ /* Based on SKEL 2.2.3C by Steve Maker, translated by Bill Jefferys */ /* */ /* This program may be copied, used, and modified freely so long as */ /* it is only done for noncommercial purposes, this copyright notice */ /* remains attached to any copy of the program, and any modified */ /* version carries a comment identifying who last changed it. */ /* */ /* This program has a similar function to the shareware "DA Sampler" which */ /* appeared a while back on net.sources.mac. My reaction to the shareware */ /* program was that it was handy but that it was not worth $10; the Mac OS */ /* makes this type of program entirely too easy to write. Instead of using */ /* the program without paying for it, I decided to write a similar program */ /* (which would be free) to see if my intuition was correct; the result is */ /* the program you currently see before you. If you enjoy it, please don't */ /* send any money -- keep both the program and your money. */ /***************************************************************************/ /* Definitions from .h files needed by program */ /* (The .h files need too much symbol table space for a 128K Mac) */ #include <mem.h> /* <win.h> */ #define inDesk 0 #define inMenuBar 1 #define inSysWindow 2 #define inContent 3 #define inDrag 4 #define inGrow 5 #define inGoAway 6 typedef GrafPtr WindowPtr; /* <menu.h> */ typedef char **MenuHandle; extern MenuHandle NewMenu(); extern long MenuSelect(); extern long MenuKey(); /* <event.h> */ #define mouseDown 1 #define keyDown 3 #define autoKey 5 #define updateEvt 6 #define activateEvt 8 #define charcodemask 0x000000ffL #define keyUpMask 16 #define everyEvent -1 #define cmdKey 256 typedef struct { int what; long message; long when; Point where; int modifiers; } EventRecord; /* <file.h> */ typedef char OsType[4]; /* <pack.h> */ typedef struct { boolean good; /* boolean */ boolean copy; OsType ftype; int vRefNum; int version; char fName[64]; } SFReply; typedef OsType SFTypeList[4]; /* <dialog.h> */ typedef char *DialogPtr; extern DialogPtr GetNewDialog(); #include "qdvars.h" /* The following two constants are not defined in any .h file. They are described in "Inside Macintosh" - Event Manager, pp. 14-15. */ #define charcodemask 255 #define cmdKey 256 #define NULL 0L #define lastmenu 3 /* number of menus */ #define applemenu 1 #define filemenu 2 #define editmenu 3 #define iopen 1 #define iclose 2 #define itoggle 4 #define iquit 6 #define iundo 1 #define icut 3 #define icopy 4 #define ipaste 5 #define iclear 6 GrafPtr screenport; /* a port for the whole screen */ MenuHandle mymenus[lastmenu + 1];/* our menus */ EventRecord myevent; WindowPtr whichwindow; /* points to window of mouseDown */ int windowcode; /* what mouse was in when event posted */ boolean userdone; /* true when user wants to exit program */ boolean open_file; /* true when there is an open resource file */ int the_ref_num; /* reference number of open resource file */ boolean open_any_file; /* true when there's no SFGetFile filtering */ /* SetUps for handling memory ########################## SetUpMemory ############################ This very important set of initializations can be left out of the first versions of a program. We are making sure that memory is laid out as we desire, with adequate protection against running out of memory, bad handles, etc. */ setupmemory () { #define maxStackSize 8192 /* max size of stack; the heap gets the rest */ typedef long *lomemptr; /* a pointer to low memory locations */ lomemptr nilptr; /* will have value NIL */ lomemptr stackbaseptr; /* points to current stack base */ /* Place a longint -1 (an odd and therefore illegal address) in the memory location that would be referenced by an accidentally-NULL Handle, so the error will be caught at Handle-reference time (as an Address error, ID=02) instead of later on. */ nilptr = NULL; *nilptr = -1; /* If you needed to use an Application heap limit other than the default (which allows 8K for the stack), you'd set it here, possible using this technique of explicitly specifying the maximum stack size and allocating the rest to the heap. Should be independent of memory size. */ stackbaseptr = (lomemptr) 0x908; /* CurStackBase from Tlasm/sysequ.text */ SetApplLimit ((Ptr) (*stackbaseptr - maxStackSize)); /* Expand the application heap Zone to its maximum size, without purging any purgeable resources. This saves memory compactions and heap expansions later. */ maxapplzone (); /* get plenty of master pointers now; if we let the Memory Manager Allocate them as needed, they'd form non-relocatable islands in the heap. */ MoreMasters (); MoreMasters (); MoreMasters (); } /* SetUpMemory */ /* ############################ SetUpMenus ############################# */ setupmenus () { mymenus[1] = NewMenu(1,"\024"); AppendMenu(mymenus[1],"About this program..."); AppendMenu(mymenus[1],"(-"); AddResMenu(mymenus[1],"DRVR"); mymenus[2] = NewMenu(2,"File"); AppendMenu(mymenus[2],"Open desk accessory file.../O"); AppendMenu(mymenus[2],"(Close current accessory file/K"); AppendMenu(mymenus[2],"(-"); AppendMenu(mymenus[2],"Show only Apple DA Mover files!\022/T"); AppendMenu(mymenus[2],"(-"); AppendMenu(mymenus[2],"Quit/Q"); mymenus[3] = NewMenu(3,"Edit"); AppendMenu(mymenus[3],"Undo/Z"); AppendMenu(mymenus[3],"(-"); AppendMenu(mymenus[3],"Cut/X"); AppendMenu(mymenus[3],"Copy/C"); AppendMenu(mymenus[3],"Paste/V"); AppendMenu(mymenus[3],"Clear/B"); InsertMenu(mymenus[1],0); InsertMenu(mymenus[2],0); InsertMenu(mymenus[3],0); DrawMenuBar(); } resetmenus () { DeleteMenu(1); DisposeMenu(mymenus[1]); mymenus[1] = NewMenu(1,"\024"); AppendMenu(mymenus[1],"About this program..."); AppendMenu(mymenus[1],"(-"); AddResMenu(mymenus[1],"DRVR"); InsertMenu(mymenus[1],2); /* Insert before FILE menu */ DrawMenuBar(); } /* body of SetUp Once-only initialization for Skel ############################ SetUp ############################## Initialize our program. It seems best to Handle: Memory inits first, ToolBox inits second, then the program variables' inits. Note that the order of inits is important; see "Using the Dialog Manager" in the Dialog Mgr section. */ setup () { setupmemory (); /* init memory layout and protection */ /* init QuickDraw, and everybody else */ InitGraf (&thePort); InitFonts (); InitWindows (); InitMenus (); TEInit (); InitDialogs (NULL); /* NULL => no Restart proc; see Dialog Mgr and System Error Handler */ InitCursor (); /* Init the system event mask, in case the previous program left it in a bad state. If you set it non-standard here, FIX IT BEFORE EXITING, because the Finder (1.1g) does NOT set it. */ SetEventMask (everyEvent - keyUpMask);/* standard setting */ /* Get the port which is the whole screen, to use when deactivating our window. This prevents the current GrafPort pointer from ever dangling. */ GetWMgrPort (&screenport); /* get whole screen port that window mgr uses */ SetPort (screenport); /* and start off with it */ /* set up our menus */ setupmenus (); /* set up program variables */ open_file = 0; open_any_file = 0; } /* Close all currently open desk accessories ############################ closeaccs ############################## */ CloseAllAccs() { int i; for (i = 12; i < 32; i++) CloseDeskAcc(-i-1); } /* Handle a command given through a menu selection ############################ DoCommand ############################## We carry out the command indicated by mResult. If it was Quit, we return true, else false. Since the menu was highlighted by MenuSelect, we must finish by unhighlighting it to indicate we're done. */ int docommand (mresult) long mresult; { int refnum; int themenu, theitem; char name[255]; GrafPtr saveport; /* for saving current port in when opening a desk accessory */ int returns; Point where; SFReply InRecord; char FileType[5]; #define aboutboxid 257 DialogPtr theDialog; int itemhit; returns = 0; /* assume Quit not selected */ themenu = HiWord (mresult); /* get the menu selected */ theitem = LoWord (mresult); /* ... and the Item of that menu */ switch (themenu) { case 0: break; /* user made no selection; do nothing */ case applemenu: if (theitem == 1) { /* tell about the program */ theDialog = GetNewDialog(aboutboxid, 0L, -1L); ModalDialog(0L, &itemhit); DisposDialog(theDialog); } else { /* run a desk accessory; make sure port is preserved */ GetPort (&saveport); GetItem (mymenus[applemenu], theitem, name); /* get name */ refnum = OpenDeskAcc (name);/* run the desk accessory */ SetPort (saveport); } break; case filemenu: switch (theitem) { case iopen: /* Open */ where.a.h = 82; where.a.v = 100; strcpy(FileType,"DFIL"); SFGetFile(&where, "", 0L, open_any_file ? -1 : 1, (SFTypeList *) &FileType, 0L, &InRecord); if (InRecord.good) { if (open_file) { /* Make sure that there are no open accessories from */ /* the old resource file, then close it. */ CloseAllAccs(); CloseResFile(the_ref_num); } GetVol(name, &refnum); /* Save the current default */ SetVol(0L,InRecord.vRefNum); /* Resource file is here */ the_ref_num = OpenResFile(&(InRecord.fName)); /* Open it */ SetVol(0L, refnum); /* Restore default volume */ open_file = 0; if (the_ref_num != -1) { open_file = 1; EnableItem(mymenus[filemenu],iclose); } resetmenus(); } break; case iclose: /* Close */ if (open_file) { /* Make sure that there are no open accessories from */ /* the old resource file, then close it. */ CloseAllAccs(); CloseResFile(the_ref_num); open_file = 0; DisableItem(mymenus[filemenu],iclose); resetmenus(); } break; case itoggle: /* Toggle filter for Font/DA Mover files */ CheckItem(mymenus[filemenu],itoggle,open_any_file); open_any_file = 1 - open_any_file; break; case iquit: /* Quit */ CloseAllAccs(); if (open_file) { CloseResFile(the_ref_num); open_file = 0; } returns = 1; } /* fileMenu case */ case editmenu: SystemEdit(theitem-1); } /* menu case */ HiliteMenu (0); /* turn off hilighting on the menu just used */ return (returns); } /* DoCommand */ /* the main loop that handles events ############################ MainEventLoop ########################## */ maineventloop () { /* body of MainEventLoop */ FlushEvents (everyEvent, 0); /* discard leftover events */ /* get next event, and Handle it appropriately, until user QUITs */ userdone = 0; do { SystemTask (); /* Handle desk accessories */ if (GetNextEvent (everyEvent, &myevent)) { /* get event; if for us... */ switch (myevent.what) {/* Handle each kind of event */ case mouseDown: /* find out what window the mouse went down in, and where in it */ windowcode = FindWindow (&myevent.where, &whichwindow); switch (windowcode) { /* Handle mouse-down for each place */ case inSysWindow: /* Handle the desk accessories */ SystemClick (&myevent, whichwindow); break;/* inSysWindow */ case inMenuBar: /* Handle the command */ userdone = docommand (MenuSelect (&myevent.where)); /* break; I got a compiler error here with the break left in. Good C programming Style would have a break even after the last case - WHJ 3/11/85 */ } break; /* switch */ case keyDown: case autoKey: /* if command key, pass the char to MenuKey */ if ((myevent.modifiers & cmdKey) != 0) userdone = docommand (MenuKey ((char) (myevent.message & charcodemask))); case updateEvt: break; case activateEvt: break; } } } while (userdone == 0); } /* body of Skel */ main () { setup (); maineventloop (); } ------------------------------ Sampler.R ------------------------------ * Sampler.R -- resource definition file for Desk Accessory Sampler * Adapted from the SkelR file in Skel 2.2.3C by Thomas Newton * Sampler APPLTDN1 * Version data for the finder * Our signature is "TDN1" * res. ID = 0, by convention * finder version data * Note that the blank in 'STR ' is significant 3/8/85 WHJ TYPE TDN1 = STR ,0 Desk Accessory Sampler v1.0 -- November 10, 1985 * dialog box for About command * ID (4 => pre-loaded; 32 => purgeable) * title * BoundsRect(global: TLBR) * Vis NoGo: it's visible, but has no close box * ProcID: Window type is modal dialog * RefCon: Unused user variable * res. ID of item list Type DLOG ,257(4) About Box 35 16 285 496 Visible NoGoAway 1 0 257 * dialog item list for About command * ID (4 => pre-loaded; 32 => purgeable - it should always be purgeable.) * # Items * the first item: * a Button you can select * display rect (local coords) * title * the second-last items: * Static text, disabled (i.e. can't select it) * display rect * text to be displayed Type DITL ,257(36) 8 button Enabled 220 370 241 470 OK staticText Disabled 5 145 20 481 Desk Accessory Sampler v1.0 staticText Disabled 20 121 35 481 Copyright 1985 Thomas D. Newton staticText Disabled 65 0 80 481 This program allows one to use desk accessories stored in resource files staticText Disabled 80 0 95 481 (such as the ones produced by Apple's Font/DA Mover) without installing staticText Disabled 95 0 110 481 those accessories into a System file. staticText Disabled 140 0 155 481 Desk Accessory Sampler may be copied and used by anyone, so long as staticText Disabled 155 0 170 481 that use is not for commercial purposes. **************************************************************************** **** This section contains information for the Finder; **** **** the program never accesses this information directly. **** **** The entire section can be omitted from the first versions **** **** of a program (you must then set the application's type to **** **** APPL, the creator to ????, and don't set the bundle bit); **** **** the default application icon will be used. **** **** For more info, read "Putting together a Mac Application" **** **** and "The Structure of a Mac Application". **** * * a Bundle: contains references to other finder info, (below) * ID (32 => purgeable) * Bundle owner: TDN1 (our signature), Res ID of version data = 0 * "ICN#" (means icon list), # of icon resources in bndl = 1 * local ID 0 maps to global ID 128 (the FREF uses a local ID, to refer to * an icon which has a global ID. See the FREF resource, below); * "FREF" (means file reference), # of FREF res in bndl = 1 * local ID 0 maps to global ID 128 Type BNDL ,128(32) TDN1 0 ICN# 1 0 128 FREF 1 0 128 * a File Reference * ID, (32 => purgeable) * "APPL" : a file of type APPL gets the following icon (a suitcase); * local icon ID; maps to global ID as specified in BNDL * name of file that must accompany application if transferred; omit if none. Type FREF ,128(32) APPL 0 * An icon list for the application icon (a partially opened suitcase) * REdit 1.0 (resource decompile option) * ID (the application icon), (32 => purgeable) * Data is Hex data (.H) * the icon data: 32 lines of 8 hex chars each * the icon mask: 32 lines of 8 hex chars each Type ICN# = GNRL ,128(32) .H 00000000 7245D1DC 456D5112 7755D1DC 15451112 75451DD2 00000000 00007E00 00008100 00FF7EFE 01014283 0203C385 04000009 0FFFFFF1 0AAAAAB1 0D555551 0AAAAAB1 FFFFFF51 800002B1 8FFFF351 480011B1 4FFFF151 449249B1 27FFF8D1 249248B1 27FFFCD1 12492471 13FFFC51 11249272 09FFFE34 08000018 07FFFFF0 * FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00007E00 0000FF00 00FFFFFE 01FFFFFF 03FFFFFF 07FFFFFF 0FFFFFFF 0FFFFFFF 0FFFFFFF 0FFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 7FFFFFFF 7FFFFFFF 7FFFFFFF 3FFFFFFF 3FFFFFFF 3FFFFFFF 1FFFFFFF 1FFFFFFF 1FFFFFFE 0FFFFFFC 0FFFFFF8 07FFFFF0 **** end of information for the finder **** *********************************************************************** ------------------------------ Sampler.Hqx ------------------------------ (This file must be converted with BinHex 4.0) :"e0KEA"XCA)!39"36&4%6M%J!*!(%NbA-!#3"!%!N!-4GJ!!%(B!N!2@FR3+!J! %rQejE@9ZGA-+!J!3rQejCACPER3+!J!3rRGSD@0SGfPZC'm+!J!%rRGTEQ4[Gf0 [C'8+!J!#rR9cCA*NEfjP#J)!![j[F'9ZAfCTE'8+!J!#rR4SC9pbC@CIER8+!J! #rQp`C@jIB@jjAfB+!J!#q@eKD@i+rR0PG(9`E@9YEh)+!Nj@r#3`#J!!*N+Zrr` JE[rm),crN!3YI!!!#3Mrq#"ZrrJJ%*!![!!!)!![!%kkqe0PG%&`F'a-D@d+!!! %@)p1Z[YYBAKKF("XHQpZ#J!!!Nkkqde[FQ90BA0dCA)+!!!#6VVl6@pb!*!$-c) J)%4PFfXJ3@0MCA0cEh*j)&0KEA"XCA)JGM%Z-#!Y,5"1EhCPE@*PFL!a-#`J-6N i03#3!b!!)`!3!4d"m!!"rrm!N!B"!3XJ)%&LEh9d)%*[H!!!!G3!"`#3"G`"FJ$ a!GB%!Np,!*!&"3#4!"3"iBJE4'9cDb""Bf0PFh0[FRNJ8f&YF'aPFL"f-5i`!*! '&!"j!#-"iBJK3fp`HA*TCfKd)+NJ-6Ni05"8D'pYBA-J4#iJ6Q9hG'pZ!3#3"8% !N!03!H')5&4SDA-JF(*[Ch*KE5"KE'a[Gh-JEfjP)(4[)(9cC5"NCA0V)'&MBf9 cFfpbD@9c)(0dEh*PC#"TEL"bCA0[GA*MC5"QD@aPF`#3"9!!N!0I!H')4bKcG@0 S)'&c)(4SC5"[EQ9c)("bEf4eBf9N)'*j)%&`F'aP*h-J4QpZG#p%35"0EhCPFLN JGfPdD'peG#"TER0dB@aXD@jR!*!'A`#3!fi"iBJPG'K[Ff8JB@0MCA0cEh*TCA- JD@jdEb"K)&0jFh4PE5"QD@aP,Y`!N!@-!*!$Q`(KL%0%CA0V)%&MBf9cFfpbH5" 6B@e`E'9b)'eKH5"LC5"MEh"TC@3JB@jN)(9cC@3JBRNJB@jjEfjP,#"cEb"XEfj R)'&c!*!'Q`#3!kS"iBJSG'KKG#"eFf8JDA-JEQpd)'C[FL"MEfeYCA*MD@&X)(" eFR"[Ff9c,J#3!aa84%ia!*!$!8P$6L-!N!@!4P*&4J#3"B!!N!-(39"36!#3"3% !N!9b4G(F4@e4%RG9dG`944%5G88GdJ#3"Ri!N!1"!!$rI[i"!8+$!J2$K33!!!N 2rrra#UUUX3e999%+UUUarj!$8B!!!V'2rr045!!4X8rrm9&%NNQa*rrid5555,% Rrrc4%NNNF42rr&%4***b#Irq0!J!!"J(rrr`rj!F!!"q!*!$r`!!rrrq!Iq3!`2 rN!-(rj!$$rq3!`rrN!-2rj!$$rq3$hrrN!0rrj!$Irq3!crrN!-rrj!$2rq3!ar rN!-Irj!$(rrrrJrrrr`2rrri"rrrm!#3!b!!N!-`!*!(%!#3!b!!!$mm!!'Tm!! !2c`!!UR`!!!,hJ#3!`'J0PQ2,ca%394"2c`!!+QJ*PpCMbm,UD8S(cSmrU")a85 &)!A3K+-H+%MCa5(-!VBJ8b*-)!5J,Lm,UD01V3!U3Hd!+MJSrri[#+Ra@Bm[2%0 24%8r"+QJ)&qJ5D!G5'crqNKXrrj1ZJA)8)m[,2rk2bcrrNkk"Z*1ZJ@QA)mr2!! !6VS(2Nj@rrK#V[rm)'lrr##mrj!%,A`!!!N)rrJJE[ri)"#3!,`!!#!!,`"1ZJH Q@)p1ZJHb6VS(aNkk"m*1ZJHq6Pj1G8j@!!")E!!!2c`!!8kk#-KFMbP!rqT)E!! #,bcrkNkk#1j3MdKX!"J[,2rU6VS)i'`!(#mXrqT1ZJMi8)p)E!!L2c`!!Nk k#)aFMbP!rqj)E!!S,bcrlNkk#,*3MdKX!%B[,2rZ6VS)T'`!CLmXrqj1ZJL @8)p)E!"U,bcrlNkk#)K3MdKX!)i[,2rZ6VS)HP#25'`!NLmXrqj1ZJKX8)p)E!# D2c`!!dkk##CFMbP!rr*)E!#J,bcrmNkk#%a3MdKX!+J[,2rb6VS)2P#25'`!V#m Xrr*1ZJJ`8)p)E!#b,bcrmNkk##*3MdKX!,S[,2rb6VS)&'`!`LmXrr*1ZJJ '8)p#CbmXrqT1ZJ5mA)p#CbmXrqj1ZJ5`A)p#CbmXrr*1ZJ5NA)p1ZJ5`6Pj1G8j @!!!r2!!"6VS%UP52,bcrkNkk"l4BMdKX!-Sr2!!"6VS(I&b2+8$rkNKX!-`[,2r U6VS(SP#25'`!iLmXrqT1ZJH88)p)E!$Q,bcrkNkk"ka3Mcmm!!)[,2rU6VS%1Pb 26VS%4NjH6R919J!!6VVq&NKXrm*1ZJ6k@)p1ZJH56VS%3%kk"`j1ZJ@'3UG1ZJN @@)p1ZJ652ccrldkk!qK8MdKXrrC1ZJ3U@)m[,2rf6VS%cPL26VVq%%)Xrma#,2r )6Pj1G8j@rripI!!-rri-EJ!JrrjX&M!Zrrj%3&0!2`"1ZJHN9)p5E[rqB1*1ANj e6PEqQN*Zr[3[,J!)6VS&LPL228$rr#mZ!!K1ZJ@1@)mp32rk-#lrr,"m!!"R!Q! 'B!!#!Q!)X(`!!@F#B(3-EJ!"rrTQ-#mmrj!%3UFr2!%"6VS(L0lm!!SY32kF5'l qQN+R6VS(dP#2,blqR%kk"iCBMf!f5'lqpNkk"#"BMdKZr[Sr,[rk,bcrkNkk"BM Hr!!+5'lqqNkk"V4BMce!rri[,[lf6VS$jPL2B!!"KQ!+X(`!!QF%B!!"C$!ZrrU `I!!"C`4J!!$'2A`!8[lb2A`!C2l`5'`!l%KZrU"1ZJC)8)p)E[kQ3UG"l[kJ)!J [!"!XrmKR"M!mrrpJ"$!m!!%r!%+R5'`!mNKZr["1ZJ3Bh[`!'K!ZrUCRE"!Xrma R$NkkrV!r,2r+6VS'rP525'lrrNKZr[T1ZJ5#8)mr,[kX3UG1ZJ5FA)p)E[k`6VS 'Y&L218$rbMmZrrj#Tdkk")*FMd)Xrm`-E2q3!mTR&"Pm!!(rc$mm!!)[,2rZ6VS %b&b26VVpL'!!!**J#,"m!!*R!Q!Z%#crc'FN6VVq0MmXrmT1ZJD%9)p#,2r-2c` !!LmXrqj1ZJ4qA)p1Z[e3B&TJ#,"m!!4R!Q!U%#crb%L!2`!r2!!%,bcrlNkk"(a 3Mc!m!!%@,2r)5)13!%-C32r)B#KJ#,"m!!CR!Q!H6VVpe"!XrmaR$MmXrmT1ZJB F9)p#,2r-2A`!!IldB!L`I!!$C`*J$M!ZrrT63$m!6VS")P523QG1ZJ@@9)m`,[l d6Pj1G8j@!!"#Ccmmrrp1ZJ%Z@)p#,2r16VS#8%KXrpBr22rr6VS"!&b25N"R!!# Z-#creV"m!!&R!Q"55'crdNKXrq"1ZJC+8)mj32r3-#crd,"m!!*R!Q!5,bcrdNK XrpC1ZJ#F8)pJ)'!)X(`!!@F#B"C)E2rJ6VS%kPL2,`"1Z[dq@)mC32r1B&"J$V" m!!0R#,"m!!9R!Q!`-#crj-"m!3!-3!!!Cb!J,2rB`,`!N!2r5)!r!%kk",j8Mbm !6VVmrPL2'8$rcQ!)X(`!"QF#B!4J"Q!%X(`!#"!Xrmj)J,"m!!"R!2m`6Pj1G8j @!!"1Z[a%6VVr$%jH6R91G8j@!!![,J!),bi!$+Qc6Pj1G8j@!!"96cmZ!!LT`P4 24N"1ANje6PB!!&922bi!##mZ!!UTF"!I5)"1ANje6PB!!$!Z!!VKL1')-#i!#+! b6Pj1G8j@!!!JI!!!!83`VJ!)6Pj1G8j@!!![,J!)2bi!$+Ne6Pj1G8j@!!#T0dj H6R919J!!2bi!#+Nf6Pj1G8j@!!#T%MPm!!(raNjH6R919J!!,bi!#+N36Pj1G8j @rrS[#bCZ!!Jr"cm',8[rqL!,Cai3%dL!2!!`"aE!2JB`"QE`)!Z3!+lrqP0!)'l rqK#!2"mq(bCI6Pj1G8j@!!![#bCZ!!Jr"bm+)!YR(L!,8SXN3#"!%"$!I!$r2J! `"e0(5N"R""6EB24#%L4I2KmQAdjH6R919J!!6Pj1G8j@!!"1ANje6PB!!+K36Pj 1G8j@!!![,J!)U'j1ANje6PB!!#mZ!!LSFdjH6R919J!!,bi!#+Kd6Pj1G8j@!!# TY%jH6R919[rm,@d!%2rm)'lrr#"3-+i!#%kk!rK1ANje6PErrLm,3QlrrJaZ!"A rrQ`X-#lrrZ@!3HcqS0$!$&!!!'m8-#lrrZ@!3HcqS0$!2a"1ZJ'%9)p5E[rqB-` r,J!)6VVrS&52*Pp1ANje6PB!!+R-6Pj1G8j@!!!JEJ!),a![,J!-,bi!%$mZ!"3 [,J!@,bi!'LmZ!"ir2!!#UHSJEJ!H3HJ!#Lm)6VVqd&L26Pj1G8j@!!!JEJ!)S#d j32lf6Pj1G8j@rr`[2!#!!!"1ZJ#!@)mY32rm6Pj1G8j@!!#J0NjH6R919J!!9Bm [,J!)U'S`(djH6R919J!!9Bm[,J!)U'X`(djH6R919[q`,@i!#2r#3QG)E[q`6VS #I&b2)'i!$$#ZrmB`,[r!6Pj1G8j@rl!YEJ!)rm)pEJ!-rmC#CdKZrl"1ZJ*qA)p 1ANje6PB!!#!Z!!LK(MP!r[BJ#%jH6R919J!!,bi!#$mZ!!`[,J!1U8B[,J!16VV prPL26Pj1G8j@!!![,J!)2bi!$+Nk6Pj1G8j@!!![,J!)2bi!$+Nj6Pj1G8j@!!! [,J!)2bi!$"mZ!!qT48jH6R919J!!)'i!#%SZ!!eR"+3"B!+J!8jH6R919[q`2@i !#2r)3QG)E[q`6VVrePb26Pj1G8j@!!#T-%jH6R919J!!,bi!#Nkkr6KBMeP22bi !##mZ!!UT-5mZ!!T1Z[eJ@)mJ(djH6R919J!!,bi!#+Nb6Pj1G8j@!!![,J!-6VV p!&L2,bi!##mZ!!bT-bmZ!!a1Z[dU@)p1ANje6PB!!#mZ!!JJEJ!-,a#T68jH6R9 19J!!U2j1ANje6PErr#m,,`SQEJ!)*'i!$#e,rr`@fQF#B2SJ,[rm*&mQAdjH6R9 19J!!,`XQEJ!)%"0Q""Dm!!%[#dkkr)TBMb!,8S!J3"!35)#`I!!"CJJJ#e+!)%" #%&92,`ZTYLm,6VVmSPL2-"mQAdjH6R919J!!2bi!#+Qh6Pj1G8j@!!"C6b"Z!!J [%+Np)"p1ANje6PB!!&P2%#i!#8L!2`#T2L!I6Pj1G8j@!!!r,J!)U6K1ANje6PB !!&P22bi!##mZ!!S[,J!1UA`J(djH6R919J!!,bi!#+Q$6Pj1G8j@!!![,J!)6VV li&L298m[,J!)UCF[,J!)6VVm$&L2-"p1ANje6PB!!$mZ!!LTQNjH6R919J!!,bi !##mZ!!bTN8jH6R919J!!)'i!#%SZ!!eR"+38B!+J&#"Z!!J[+!!56VVla&L2)'i !#$!S!""1ANje6PB!!#"Z!!J[+!!56VVlD&L2)'i!#%SZ!!eR"+39B!+J&5"Z!!J [+!!56VVlL&L2)'i!#$!S!""1ANje6PB!!#mZ!!LTHdjH6R919J!!6VVlTURd6Pj 1G8j@!!"96b"Z!!J[%#mZ!!bT,$!I6Pj1G3#3!``!#!!"1A`!!2ld6R8!N!2k&!" "BQpeG#"dD'Pc)("bEfGbB@dZN!-!+#d!!%459P)!!%CTE'8!!%p`C@iJC'9cDb" KBf0PFh0[FRNJCQPXC5k3!bp2!#K$E'pcC5"MGA*bC@jd)'&MBf9cFfpbH5"QD@a P,dX!+#d!!&0SEhFJEfjXH5""F("XC5"%35"0EhCPFL"QD@aPFb%5,e3!!#JY!!" 4G@Pd,e%!!%9NDA3!!&9ZC'm[@J!!+#d!!%0eG#pB!%0[F(N[3`!!8'&cG'8[9J" $E'9KFLp#!"3!3@*[GA3JG'KTFb"`FQpRFQ&Y,T!$!#JY!!"%8PC5!!"%4NP-!*! %3dp%43#3"!%!N!-4GJ!!%(B!N!2@!!"2)!#B!*!$(!$@!!G84%ia!*!$3N4-6dF !N!014%P86!#3!eT#6N4-!*!$CNC548B!N!0b5801)`#3!hj$6d4&!!)!LN4"9%% !N!1Z!!$rr`#3#!%"rrm!N!-h!*!%!3(rr`#3!eX!N!@!rrm!!!)c!*!&J2rr!!! #8`#3"B$rr`!!!Pi!N!8#rrm!!!pS!*!&!Irr!!!$KJ#3"[rr!!!$BJ#3"[rr!!! 2H!!!6rM$bJ: