sjf@onion.cs.reading.ac.uk (Steve Fisher) (01/11/88)
I have an A500 (PAL version) and have just fitted an A501. Arctic Fox works fine in A500 but with expansion memory it crashes! Does anyone have a fix for this, either a fixhunk or equivalent to stop AFox using fast ram. -- // -- Steve Fisher Micro. Unit. Computer Science Dept. \\ |-- & > Reading University //.||. Shawn Fraser Cybernetics Dept. -- // -- Steve Fisher Micro. Unit. Computer Science Dept. \\ |-- & > Reading University //.||. Shawn Fraser Cybernetics Dept.
soo@beach.cis.ufl.edu (Chong L Soo) (01/16/88)
In article <662@onion.cs.reading.ac.uk> sjf@onion.cs.reading.ac.uk (Steve Fisher) writes: > >I have an A500 (PAL version) and have just fitted an A501. >Arctic Fox works fine in A500 but with expansion memory it crashes! >Does anyone have a fix for this, either a fixhunk or equivalent >to stop AFox using fast ram. Bug Bytes in the latest issue (volume 3.1) of Amazing Computing mentioned an upgraded Arctic Fox that will run correctly under 1.2 with > 512k. You have to return the ENTIRE original packege (why?) and it costs US$7.50. -- ------------------------------------------------------------------------------- Chong Soo (Amiga nut) soo@beach.cis.ufl.edu ARPANET/INTERNET soo%ufcsg.ufl.edu@relay.cs.net BITNET soo%ufcsg.ufl.edu%relay.cs.net@wiscvm
terry@micomvax.UUCP (Terry Fisher) (02/02/88)
In article <10207@ufcsv.cis.ufl.EDU> soo@beach.cis.ufl.edu (Chong L Soo) writes: >In article <662@onion.cs.reading.ac.uk> sjf@onion.cs.reading.ac.uk (Steve Fisher) writes: >> >>I have an A500 (PAL version) and have just fitted an A501. >>Arctic Fox works fine in A500 but with expansion memory it crashes! >>Does anyone have a fix for this, either a fixhunk or equivalent >>to stop AFox using fast ram. > >Bug Bytes in the latest issue (volume 3.1) of Amazing Computing mentioned >an upgraded Arctic Fox that will run correctly under 1.2 with > 512k. You >have to return the ENTIRE original packege (why?) and it costs US$7.50. >-- >------------------------------------------------------------------------------- >Chong Soo (Amiga nut) soo@beach.cis.ufl.edu > ARPANET/INTERNET soo%ufcsg.ufl.edu@relay.cs.net > BITNET soo%ufcsg.ufl.edu%relay.cs.net@wiscvm Here is a little utility that I threw together to get some of my old software to run when I upgraded to 1Meg. I hope you find it useful, and if you don't like my code, I'm sorry, I put it together in a hurry. Terry Fisher. # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # Makefile # README # hunker.c # hunker.h # hunker.uue # This archive created: Sun Jul 26 23:49:39 1987 cat << \SHAR_EOF > Makefile Hunker: hunk.o cc -o Hunker hunk.o hunk.o: hunk.c hunk.h cc -c hunk.c SHAR_EOF cat << \SHAR_EOF > README History of this program: This program was written by Terry Fisher. Its purpose: to fix some of those nasty programs that were written before people started using fast memory. Now, it can also be used as a valuable 'C' development tool, similar in function to the Assembly language Atom utility. By running this program on your executable, you can avoid having to copy image data into chip memory. Simply put 'Hunker <file> d=c' into your Makefile, and all initialized data will be loaded into chip memory automatically. Usage: This program can only be used from the CLI. The format for invocation is: Hunker <file> [-v] [c/d/b]=[c/f/e] Order is not important except that the file name must be the first arguement. The other arguements may be typed in any order. Their meanings follow. -v sets verbose mode. It isn't really useful, but its there. [c/d/b]=[c/f/e] These are the switches which specify where each hunk type are to be loaded into memory. The characters on the left of the '=' are the hunk type. The characters on the right are the type of memory to load these hunks into. ie d=c would put all data hunks into chip memory c=f would put all code hunks into fast memory b=e would put all uninitialized data into either chip or fast Note: to change more than one type of hunk at one time, you must have a separate argument for each hunk type. ie to load data into chip memory, and code into fast, the CLI command would be: Hunker <file> d=c c=f Distribution: Hunker may be freely distributed as long as: this README file is kept with it, and it is not included in any commercial distributions without my consent. If you find this program useful, and it is going to save you several hours, I would appreciate any contribution. (If its going to make your $50 commercial software run, I feel I deserve a small contribution :-) Terry Fisher, RR #2, Harriston, Ontario, Canada. N0G 1Z0 See also the section on ATOM in the Bantam AmigaDos Manual. Thanks to Carolyn Scheppner at CATS for helping figure out how the loader works. SHAR_EOF cat << \SHAR_EOF > hunker.c #include <stdio.h> #include <libraries/dosextens.h> #include <functions.h> #include "hunk.h" #include <exec/types.h> #define DC SET_UNCHANGED /* dont change flag */ int first = 0, last = 1, current, listsize; struct FileHandle *fd; ULONG codemem=DC, datamem=DC, bssmem=DC, memtype(), *changelist = NULL; BOOL verbose = FALSE; main(argc, argv) int argc; char **argv; { int i = 2; if (argc < 3) { show_usage(argv[0]); } while (i < argc) { if (argv[i][0] == '-') { if (argv[i][1] == VERBOSE_FLAG) { verbose = TRUE; } } else if ((argv[i][1] != '=') && (argv[i][0] != '-')) { show_usage(argv[0]); exit(0); } else { set_mem_flags(argv[i]); } i++; } if ((fd = Open(argv[1],MODE_OLDFILE))==NULL) { printf("Sorry, file: %s not found\n",argv[1]); exit(10); } processfile(); fixhunk(); Exit(); } /*********************************************************************** * * ROUTINE: memtype * * IMPORTS: char type; character after '=' in CLI arg * * RETURNS: ULONG memtype; memory specification long word * * DESCRIPTION: returns the mask for the type of memory specified by * the character after the '=' in a CLI argument * ***********************************************************************/ ULONG memtype(type) char type; { ULONG settype; switch (type) { case SPEC_CHIP: settype = SET_CHIP; break; case SPEC_FAST: settype = SET_FAST; break; case SPEC_EITHER: settype = SET_EITHER; break; default: settype = SET_UNCHANGED; } return(settype); } /*********************************************************************** * * ROUTINE: processfile * * IMPORTS: none * * RETURNS: none * * DESCRIPTION: reads through the file until the last hunk has bee processed * ***********************************************************************/ processfile() { ULONG hunk, readlong(); while (first <= last) { hunk = (readlong()); if (verbose) { printf("Hunk type %x\n", hunk); } processhunk(hunk); } } /*********************************************************************** * * ROUTINE: readlong * * IMPORTS: NONE * * RETURNS: ULONG data; long word read from the file * * DESCRIPTION: reads the next long word in the file * ***********************************************************************/ ULONG readlong() { ULONG hunk[2]; int bytes; if ((bytes = Read(fd, hunk, sizeof(ULONG))) < sizeof(ULONG)) { printf("could not read full long word\n"); Exit(0); } return(hunk[0]); } /*********************************************************************** * * ROUTINE: processhunk * * IMPORTS: ULONG hunk; hunk type * * RETURNS: NONE * * DESCRIPTION: calls the handler routine for the specified hunk type * ***********************************************************************/ processhunk(hunk) ULONG hunk; { switch (hunk) { case HUNK_HEADER: header_hunk(); break; case HUNK_CODE: code_hunk(); break; case HUNK_RELOC8: case HUNK_RELOC16: case HUNK_RELOC32: reloc_hunk(); break; case HUNK_DEBUG: debug_hunk(); break; case HUNK_END: first++; break; case HUNK_DATA: data_hunk(); break; case HUNK_BSS: bss_hunk(); break; default : break; } } /*********************************************************************** * * ROUTINE: fastforward * * IMPORTS: NONE * * RETURNS: NONE * * DESCRIPTION: advances <offset> long words through the file; * ***********************************************************************/ fastforward(offset) long offset; { ULONG readlong(); int oldpos, i; offset *= sizeof(ULONG); oldpos = Seek(fd, offset, OFFSET_CURRENT); } /*********************************************************************** * * ROUTINE: fastback * * IMPORTS: NONE * * RETURNS: NONE * * DESCRIPTION: Backs up 1 long word in the file * ***********************************************************************/ fastback() { int oldpos; oldpos = Seek(fd, -sizeof(ULONG), OFFSET_CURRENT); } /*********************************************************************** * * ROUTINE: header_hunk * * IMPORTS: none * * RETURNS: none * * DESCRIPTION: Processes the header hunk and allocates enough memory * for the hunk table. * ***********************************************************************/ header_hunk() { ULONG chars_in_name, size, readlong(); int oldposition, i; long offset; chars_in_name = readlong(); while (chars_in_name) { offset = chars_in_name; fastforward(offset); chars_in_name = readlong(); } size = readlong(); first = readlong(); last = readlong(); offset = 0; for (i = first; i <= last; i++) { offset += readlong(); } changelist = (ULONG *)AllocMem(size * sizeof(ULONG), 0); listsize = size; current = 0; } /*********************************************************************** * * ROUTINE: code_hunk * * IMPORTS: NONE * * RETURNS: NONE * * DESCRIPTION: processes all code hunks * ***********************************************************************/ code_hunk() { ULONG size, temp, readlong(); changelist[current++] = codemem; size = readlong(); fastforward(size); } /*********************************************************************** * * ROUTINE: reloc_hunk * * IMPORTS: NONE * * RETURNS: NONE * * DESCRIPTION: handles all reloc32 hunks * ***********************************************************************/ reloc_hunk() { ULONG num, garb, readlong(); int i; num = readlong(); while (num != 0) { num++; fastforward(num); num = readlong(); } } /*********************************************************************** * * ROUTINE: debug_hunk * * IMPORTS: NONE * * RETURNS: NONE * * DESCRIPTION: handles all debug hunks * ***********************************************************************/ debug_hunk() { ULONG num, readlong(); num = readlong(); if (num >0) { fastforward(num); } } /*********************************************************************** * * ROUTINE: data_hunk * * IMPORTS: NONE * * RETURNS: NONE * * DESCRIPTION: processes all data hunks. * ***********************************************************************/ data_hunk() { ULONG readlong(); long num, check_len; BOOL test_string(); num = readlong(); changelist[current++] = datamem; fastforward(num); } /*********************************************************************** * * ROUTINE: bss_hunk * * IMPORTS: none * * RETURNS: none * * DESCRIPTION: handles all uninitiallized data hunks * ***********************************************************************/ bss_hunk() { ULONG num, readlong(); changelist[current++] = bssmem; num = readlong(); } /*********************************************************************** * * ROUTINE: newtype * * IMPORTS: ULONG type; type of memory hunk is to be loaded into * * RETURNS: NONE * * DESCRIPTION: Changes the specification for where a hunk is to be * loaded into memory. * ***********************************************************************/ newtype(type) ULONG type; { ULONG readlong(), oldval, wrote, newval; oldval = readlong(); if (type != SET_UNCHANGED) { fastback(); oldval &= SET_MASK; newval = oldval | type; if (verbose) { printf("changing %x to %x\n", oldval, newval); } wrote = Write(fd, &newval, sizeof(ULONG)); if (wrote != sizeof(ULONG)) { printf("did not write full hunk label\n"); Exit(); } } } /*********************************************************************** * * ROUTINE: Exit * * IMPORTS: NONE * * RETURNS: NONE * * DESCRIPTION: Frees memory, closes file, exits program. * ***********************************************************************/ Exit() { int i; if (changelist != NULL) { FreeMem(changelist, listsize); changelist = NULL; } Close(fd); exit(0); } /*********************************************************************** * * ROUTINE: fixhunk * * IMPORTS: none * * RETURNS: none * * DESCRIPTION: read through the table of hunk definitions made by this * program and calls newtype() for all hunks that have been * changed * ***********************************************************************/ fixhunk() { ULONG chars_in_name, size, readlong(); int oldposition, i; long offset; oldposition = Seek(fd, 4L, OFFSET_BEGINNING); chars_in_name = readlong(); while (chars_in_name) { offset = chars_in_name; fastforward(offset); chars_in_name = readlong(); } size = readlong(); size = readlong(); size = readlong(); for (i = 0; i < current; i++) { newtype(changelist[i]); } } /*********************************************************************** * * ROUTINE: set_mem_flags * * IMPORTS: char *arg; CLI argument to be interpreted * * RETURNS: none * * DESCRIPTION: interprets a hunk memory specification * ***********************************************************************/ set_mem_flags(arg) char *arg; { switch(arg[0]) { case SPEC_DATA: datamem = memtype(arg[2]); break; case SPEC_CODE: codemem = memtype(arg[2]); break; case SPEC_BSS: bssmem = memtype(arg[2]); break; } } /*********************************************************************** * * ROUTINE: show_usage * * IMPORTS: char *name; program name * * RETURNS: none * * DESCRIPTION: shows usage for the program * ***********************************************************************/ show_usage(name) char *name; { printf("USAGE: %s <file> [-v] [c,d,b]=[c,f,e]\n", name); printf("\n-v sets verbose mode on\n"); printf("[c/d/b] specify which hunks are to be altered.\n"); printf(" c - code, d - data, b - uninitaillized data.\n"); printf("[c/f/e] specify where the altered hunks are to load.\n"); printf(" c - chip, f - fast, e - doesn't matter\n"); printf("\nNote: changing two or more hunk types requires that the\n"); printf(" specification argument be repeated for each hunk\n"); printf(" type. ie to load code into fast memory, and data\n"); printf(" into chip memory, the command would be\n"); printf(" %s <file> c=f d=c\n", name); printf("\nYou may distribute this program free of charge to anyone\n"); printf("as long as: the README file is distributed with it, and it\n"); printf("is not part of a commercial product.\n\n"); printf("If you use this program and it saves you several hours of\n"); printf("work, I would appreciate any contribution\n"); printf(" Terry Fisher, Jan 17 1988\n"); exit(0); } SHAR_EOF cat << \SHAR_EOF > hunker.h #define HUNK_HEADER 1011 #define HUNK_OVERLAY 1013 #define HUNK_BREAK 1014 #define HUNK_END 1010 #define HUNK_DEBUG 1009 #define HUNK_SYMBOL 1008 #define HUNK_EXT 1007 #define HUNK_RELOC8 1006 #define HUNK_RELOC16 1005 #define HUNK_RELOC32 1004 #define HUNK_BSS 1003 #define HUNK_DATA 1002 #define HUNK_CODE 1001 #define HUNK_NAME 1000 #define HUNK_UNIT 0999 #define SPEC_CODE 'c' #define SPEC_DATA 'd' #define SPEC_BSS 'b' #define SPEC_CHIP 'c' #define SPEC_FAST 'f' #define SPEC_EITHER 'e' #define VERBOSE_FLAG 'v' #define SET_CHIP 0x40000000 #define SET_FAST 0x80000000 #define SET_EITHER 0x00000000 #define SET_UNCHANGED 0x00000001 #define SET_MASK 0x3fffffff SHAR_EOF cat << \SHAR_EOF > hunker.uue begin 644 hunker M```#\P`````````#``````````(```:@````U0````````/I```&H$ZY```)8 MTDY5__PK?`````+__`RM`````P`(;`PL;0`,+Q9.N@7N6$\F+?_\MJT`"&P`! M`+`F+?_\Y8,L;0`,(G8X`!812(-(P[:\````+68F)BW__.6#+&T`#")V.``6$ M*0`!2(-(P[:\````=F8&.7P``8`:8&0F+?_\Y8,L;0`,(G8X`!8I``%(@TC#I MMKP````]9S(F+?_\Y8,L;0`,(G8X`!812(-(P[:\````+6<6+&T`#"\63KH%# M6EA/0J=.NA0.6$]@%"8M__SE@RQM``PO-C@`3KH$REA/4JW__&``_TA(>`/MU M+&T`#"\N``1.NAB>4$\I0(*^2H!F'"QM``PO+@`$2'H`($ZZ"0Y03TAX``I.6 MNA.Z6$]A=$ZZ`_Q.N@/&3EU.=5-O<G)Y+"!F:6QE.B`E<R!N;W0@9F]U;F0*] M``!.5?_\$"T`"TB`2,!@)"M\0````/_\8"PK?(````#__&`B0JW__&`<*WP`9 M```!__Q@$I"\````8V?458!GY%.`9]9@Y"`M__Q.74YU3E7__"8L@`*VK(`&< M;B1A-"M`__Q*;(`:9PXO+?_\2'H`%DZZ"&903R\M__QA=%A/8-).74YU2'5NT M:R!T>7!E("5X"@!.5?_T2'@`!$AM__@O+(*^3KH7Q$_O``PK0/_TL+P````$P M9!)(>@`83KH('%A/0J=.N@+B6$\@+?_X3EU.=6-O=6QD(&YO="!R96%D(&9U0 M;&P@;&]N9R!W;W)D"@``3E4``"`M``A@0DZZ`*9@5$ZZ`29@3DZZ`4Y@2$ZZN M`79@0E*L@`)@/$ZZ`8Y@-DZZ`;9@,&`N_Z[_QO_,_[3_M/^T_]+_TO^Z_\#_N MJ)"\```#Z;"\````"V3:XX`P.P#83OL``$Y=3G5.5?_X("T`"'($3KH6=BM`6 M``A"IR\M``@O+(*^3KH7!$_O``PK0/_\3EU.=4Y5__Q"ITAX__PO+(*^3KH6L MYD_O``PK0/_\3EU.=4Y5_^Q.NO[J*T#__$JM__QG&"MM__S_["\M_^QAF%A/^ M3KK^SBM`__Q@XDZZ_L0K0/_X3KK^O"E`@`).NOZT*4"`!D*M_^PK;(`"__!@` M#$ZZ_J#1K?_L4JW_\"8M__"VK(`&;^I"IR8M__CE@R\#3KH6L%!/*4"`%BEM; M__B"ND*L@K9.74YU3E7_^"8L@K92K(*VY8,L;(`6+:R`"C@`3KK^4"M`__PO] M+?_\3KK_"EA/3EU.=4Y5__1.NOXV*T#__$JM__QG&%*M__PO+?_\3KK^YEA/; M3KK^&BM`__Q@XDY=3G5.5?_\3KK^""M`__P,K0````#__&,*+RW__$ZZ_KA86 M3TY=3G5.5?_X3KK]Y"M`__PF+(*V4JR"MN6#+&R`%BVL@`XX`"\M__Q.NOZ*" M6$].74YU3E7__"8L@K92K(*VY8,L;(`6+:R`$C@`3KK]HBM`__Q.74YU3E7_) M]$ZZ_9(K0/_\#*T````!``AG8$ZZ_G("K3_______"8M__R&K0`(*T/_]$ILX M@!IG%"\M__0O+?_\2'H`/$ZZ!9Q/[P`,2'@`!$AM__0O+(*^3KH5/$_O``PK! M0/_X#*T````$__AG#$AZ`"%.N@5N6$]A-DY=3G5C:&%N9VEN9R`E>"!T;R`EL M>`H`9&ED(&YO="!W<FET92!F=6QL(&AU;FL@;&%B96P*`$Y5__Q*K(`69Q(O4 M+(*Z+RR`%DZZ%2Y03T*L@!8O+(*^3KH4-EA/0J=.N@^^6$].74YU3E7_[$AX\ M__](>``$+RR"ODZZ%)!/[P`,*T#_]$ZZ_)PK0/_\2JW__&<:*VW__/_L+RW_# M[$ZZ_4I83TZZ_'XK0/_\8.!.NOQT*T#_^$ZZ_&PK0/_X3KK\9"M`__A"K?_P> M8!@F+?_PY8,L;(`6+S8X`$ZZ_K!83U*M__`F+?_PMJR"MFW>3EU.=4Y5```L< M;0`($!9(@$C`8$XL;0`(%BX``DB#2,,O`TZZ^X)83RE`@`Y@1"QM``@6+@`"V M2(-(PR\#3KK[:%A/*4"`"F`J+&T`"!8N``)(@TC#+P-.NOM.6$\I0(`28!"0Y MO````&)GWE.`9\!3@&>B3EU.=4Y5```O+0`(2'H`N$ZZ`_A03TAZ`-5.N@/N: M6$](>@#E3KH#Y%A/2'H!"TZZ`]I83TAZ`3!.N@/06$](>@%<3KH#QEA/2'H!- M>TZZ`[Q83TAZ`:M.N@.R6$](>@'43KH#J%A/2'H!_DZZ`YY83R\M``A(>@(9^ M3KH#D%!/2'H"(TZZ`X983TAZ`E1.N@-\6$](>@*&3KH#<EA/2'H"HTZZ`VA8_ M3TAZ`M1.N@->6$](>@+U3KH#5%A/0J=.N@X"6$].74YU55-!1T4Z("5S(#QFU M:6QE/B!;+79=(%MC+&0L8ET]6V,L9BQE70H`"BUV"7-E=',@=F5R8F]S92!MI M;V1E(&]N"@!;8R]D+V)="7-P96-I9GD@=VAI8V@@:'5N:W,@87)E('1O(&)EX M(&%L=&5R960N"@`)8R`M(&-O9&4L(&0@+2!D871A+"!B("T@=6YI;FET86EL, M;&EZ960@9&%T82X*`%MC+V8O95T)<W!E8VEF>2!W:&5R92!T:&4@86QT97)E# M9"!H=6YK<R!A<F4@=&\@;&]A9"X*``EC("T@8VAI<"P@9B`M(&9A<W0L(&4@; M+2!D;V5S;B=T(&UA='1E<@H`"DYO=&4Z"6-H86YG:6YG('1W;R!O<B!M;W)EH M(&AU;FL@='EP97,@<F5Q=6ER97,@=&AA="!T:&4*``ES<&5C:69I8V%T:6]NA M(&%R9W5M96YT(&)E(')E<&5A=&5D(&9O<B!E86-H(&AU;FL*``ET>7!E+B`@% M:64@=&\@;&]A9"!C;V1E(&EN=&\@9F%S="!M96UO<GDL(&%N9"!D871A"@`)Y M:6YT;R!C:&EP(&UE;6]R>2P@=&AE(&-O;6UA;F0@=V]U;&0@8F4*``DE<R`\\ M9FEL93X@8SUF(&0]8PH`"EEO=2!M87D@9&ES=')I8G5T92!T:&ES('!R;V=RA M86T@9G)E92!O9B!C:&%R9V4@=&\@86YY;VYE"@!A<R!L;VYG(&%S.B!T:&4@9 M4D5!1$U%(&9I;&4@:7,@9&ES=')I8G5T960@=VET:"!I="P@86YD(&ET"@!IU M<R!N;W0@<&%R="!O9B!A(&-O;6UE<F-I86P@<')O9'5C="X*"@!)9B!Y;W4@< M=7-E('1H:7,@<')O9W)A;2!A;F0@:70@<V%V97,@>6]U('-E=F5R86P@:&]U* M<G,@;V8*`'=O<FLL($D@=V]U;&0@87!P<F5C:6%T92!A;GD@8V]N=')I8G5TG M:6]N"@`)5&5R<GD@1FES:&5R+"!*86X@,3<@,3DX.`H``")?DOP`"B(1TH'22 M@2A!V?P``(`"0^R"<D7L@G*UR68.,CP`.&L(=``BPE')__PI3X+"+'@`!"E.< M@L9(YX"`3KH*VE!/3G5.50``+P1-[()V*4Z"<DAM``PO+0`(2'H`9DZZ`8!/< M[P`,*``V+(!42,.VO`````%F)$WL@G8F+()REHXO`TAL@G86+(!12(-(PR\#U M3KH)B$_O``Q@($AL@$1-[()V)BR"<I:.+P-(>``!2&R"=DZZ!5)/[P`0(`0H. M'TY=3G5.50``+&R"<E*L@G(<K0`+3>R"=B8L@G*6CK:\````*&9:-BR`5$C#X MMKP````!9B1-[()V)BR"<I:.+P-(;()V%BR`44B#2,,O`TZZ"0Q/[P`,8"!(` M;(!$3>R"=B8L@G*6CB\#2'@``4AL@G9.N@363^\`$$WL@G8I3H)R("T`","\' M````_TY=3G5.50``2.<(("1M`!`,K0````0`%&8(+&T`""@68!@,K0``````7 M#&\(+&T`""@68`8L;0`(*!9"K0`4#*T```````QL%D2M``RXO`````!L"D2$@ M*WP````!`!13BB`$(BT`#$ZZ`_)-[(`<%+8(`"`$(BT`#$ZZ`^8H`$J`9MQ*J MK0`49P93BA2\`"T@"DS?!!!.74YU3E7_%$CG"#`D;0`()FT`#$*M__@K;0`0" M__PL2U*+%A9(@TC#*`-*@V<``U*XO````"5F``,L0BW_(BM\`````?_T*WP`% M```@__`K?```)Q#_["Q+4HL6%DB#2,,H`[:\````+6800JW_]"Q+4HL6%DB#; M2,,H`[B\````,&84*WP````P__`L2U*+%A9(@TC#*`.XO````"IF&BQM__Q8E MK?_\*U;_Z"Q+4HL6%DB#2,,H`V`\0JW_Z&`B("W_Z'(*3KH,I-"$D+P````P] M*T#_Z"Q+4HL6%DB#2,,H`TWL@>\6-D@`2(-(P\:\````!&;*N+P````N9FHLZ M2U*+%A9(@TC#*`.VO````"IF&BQM__Q8K?_\*U;_["Q+4HL6%DB#2,,H`V`\. M0JW_[&`B("W_['(*3KH,,M"$D+P````P*T#_["Q+4HL6%DB#2,,H`TWL@>\6\ M-D@`2(-(P\:\````!&;**WP````$_^2XO````&QF%BQ+4HL6%DB#2,,H`RM\< M````!/_D8!2XO````&AF#"Q+4HL6%DB#2,,H`R`$8'XK?`````C_X&`<*WP`= M```*_^!@$BM\````$/_@8`@K?/____;_X"\M_^1(;?\B+RW_X"\M__Q.NOV42 M3^\`$"M`_]PF+?_DUZW__&!:+&W__%BM__PK5O_<+RW_W$ZZ"MA83RM`_^1@I M2BQM__Q8K?_\*!9-[?\A*T[_W!R$8"B0O````&-GXE.`9Y20O`````MG`/]NC M68!GM%6`9P#_;E>`9P#_<F#,3>W_(IWM_]PK3O_D)BW_Y+:M_^QO!BMM_^S_/ MY$JM__1G``""+&W_W!862(-(P[:\````+6<2+&W_W!862(-(P[:\````*V8TR M#*T````P__!F*E.M_^@L;?_<4JW_W!862(-(PR\#3I)83["\_____V8*</],K MWPP03EU.=6`8+RW_\$Z26$^PO/____]F!'#_8.)2K?_X)BW_Z%.M_^BVK?_D3 M;MI"K?_@8"0L;?_<4JW_W!862(-(PR\#3I)83["\_____V8$</]@JE*M_^`LX M;?_<2A9G"B8M_^"VK?_L;<HF+?_@UZW_^$JM__1F*F`:2'@`($Z26$^PO/__" M__]F!G#_8`#_<%*M__@F+?_H4ZW_Z+:M_^1NV&`8+P1.DEA/L+S_____9@9P! M_V``_TA2K?_X8`#\H"`M__A@`/\X+P1"A$J`:@1$@%)$2H%J!D2!"D0``6$L: M2D1G`D2`*!].=2\$0H1*@&H$1(!21$J!:@9$@0I$``%A"B`!8-IA!"`!3G5(V MYS``2$%*068H2$%"0X#!:`XT`$)`2$"`P38`,`*`P2(`2$`P`TA`0D%(04S?" M``Q.=4A!0H)V'^.`XY*4@6L04H!1R__T8`[C@..2U(%J\%'+__;4@2("3-\`D M#$YU3E4``$CG#"`D;0`(("T`#"(M`!!.N@DJ*@!X`&`J+RT`%"Q*4HH6%DB#^ M2,,O`TZZ`")03["\_____V8*<`!,WP0P3EU.=5*$N(5ETB`M`!!@[$Y5```O@ M"B1M``PL4KWJ``1E&B8M``C&O````/\O`R\*3KH`ZE!/)%].74YU+%)2DA`MW M``L<@$B`2,#`O````/]@Y$Y5```O"DWL@"XD3BQ*U?P````6+PYA$%A/3>R!7 MYK7.9>HD7TY=3G5.50``2.<(("1M``AX`"8*9@IP_TS?!!!.74YU2BH`#&=L# M%BH`#$B#2,/&O`````1G#$AX__\O"F%H4$\H`!8J``U(@TC#+P-.N@?<6$^(1 M@!8J``Q(@TC#QKP````"9PHO*@`(3KH"6%A/%BH`#$B#2,/&O````"!G%"\J9 M`!).N@*T6$\O*@`23KH"-%A/0I)"J@`$0JH`"$(J``P@!&``_W1.5?_^2.<(% M("1M``A-^O\H*4Z!YA8J``Q(@TC#QKP````09PIP_TS?!!!.74YU%BH`#$B#= M2,/&O`````1G,B@2F*H`""\$+RH`"!8J``U(@TC#+P-.N@)@3^\`#+"$9Q``V M*@`0``Q"DD*J``1P_V"V#*W_____``QF$`(J`/L`#$*20JH`!'``8)Q*J@`(E M9@@O"DZZ`*I83S8J`!!(P[:\`````68P&VT`#___2'@``4AM__\6*@`-2(-(M MPR\#3KH!]D_O``RPO`````%FDB`M``Q@`/]2)*H`"#8J`!!(P]:J``@E0P`$R M`"H`!``,+%)2DA`M``\<@$B`2,#`O````/]@`/\B3E4``"\*3>R`+B1.2BH`Y M#&<8U?P````63>R!YK7.90AP`"1?3EU.=6#B0I)"J@`$0JH`""`*8.I.5?_\O M+PHD;0`(%BH`#4B#2,,O`TZZ`1183TJ`9Q@U?``!`!`F"M:\````#B5#``@D: M7TY=3G5(>`0`3KH`DEA/*T#__$J`9]8U?`0``!``*@`"``PE;?_\``A@U$Y5H M``!(YP`P)&R"GF`4)E(L:@`$2&X`""\*3KH'/E!/)$LF"F;H0JR"GDS?#`!.X M74YU3E4``"\*3?K_QBE.@>I"IRQM``A(;@`(3KH&Z%!/)$!*@&8(<``D7TY=! M3G4DK(*>)6T`"``$*4J"GB`*4(!@YDY5```O+0`(8;983TY=3G5.50``2.<`I M,)?+)&R"GF`.+&T`"%&.O<IG$B9*)%(F"F;N</],WPP`3EU.=28+9P0FDF`$F M*5*"GBQJ``1(;@`(+PI.N@:44$]P`SE4``"`M``AR!DZZ!6Y-[(+*+S8(R M`$ZZ!<I83TJ`9P1P`6`"0H!.74YU3E4``"\M``A.N@6&6$]*@&8.3KH%G"E`' M@T)P_TY=3G5P`Ϥ``$CG#"`H+0`(3KH`?B`$<@9.N@463>R"RB1`U<ZX. MO`````!M#+B\````$VX$2I)F$BE\`````X-"</],WP0P3EU.=38J``1(P\:\< M`````V8,*7P````&@T)P_V#>+RT`$"\M``PO$DZZ!79/[P`,*@"PO/____]FL M#$ZZ!0XI0(-"</]@MB`%8+).5?_\2'@0`$*G3KH%WE!/*T#__,"\```0`&8&0 M<`!.74YU2JR#1F8&("W__&#P2'@`!$AZ`!Q.N@3N+P!.N@483^\`#$AX``%.J MN@`*6$]@SEY#"@!.50``2JR!YF<&+&R!YDZ6+RT`"$ZZ`M)83TY=3G5.5?_\' M2.<.,$AX`!](>@*>3KH%2E!/*4"#2DJ`9A1"ITAY``.`!TZZ!,I03RYL@L).S M=4AX`!](>@*`3KH%(%!/*4"#3DJ`9A!"ITAY``.`!4ZZ!*!03V#40J=.N@3,0 M6$\F0$JK`*QG``&B)BL`K.6#*@,L128N`!#E@R1#%A)(@TC#UJT`"%2#*4."\ MID*G+RR"IDZZ!(903RE`@JX6$DB#2,,O`TAJ``$O+(*N3KH#`D_O``Q(>@(2W M%A)(@TC#UJR"KB\#3KH"R%!/+&T`"$AN``$O+0`,+RR"KDZZ`I!/[P`,0JR"R MHB1L@JX6$DB#2,--[('O%#8X`$B"2,+$O````!!G!%**8.(6$DB#2,.VO```H M`"!M-A822(,X`TI#9QA-[('O%C9``$B#2,/&O````!!F!%**8-XL2E**0A9V^ M`#8$2H-G!E*L@J)@GD(20J<F+(*B4H/E@R\#3KH#OE!/*4""JG@`)&R"KF`Z% M%A)(@TC#3>R![Q0V.`!(@DC"Q+P````09P12BF#B=@`V!.6#+&R"JBV*.``O0 M"DZZ`@)83U*`U<!21'8`-@2VK(*B9;QV`#8$Y8,L;(*J0K8X`$ZZ`L8I0(+*B M.7R``(+.3KH"YBE`@M`Y?(`!@M1.N@+8*4""UCE\@`&"VBE\`````8-&+RR"] MJB\L@J).NND@4$]"ITZZ`,A83V```)Q(:P!<3KH#=EA/2&L`7$ZZ`S983RE`, M@K(L;(*R2JX`)&<0+&R"LB)N`"0O$4ZZ`BI83RQL@K)*K@`@9TQ(>`/M+&R"/ MLB\N`"!.N@)24$\I0(+*2H!G,BEL@LJ"UBEL@LJ"T#E\@`""SCE\@`&"VCE\Z M@`&"U"8L@LKE@RM#__PL;?_\)VX`"`"D+RR"LD*G3KKH@%!/0J=A*%A/3-\,R M<$Y=3G5D;W,N;&EB<F%R>0!M871H9F9P+FQI8G)A<GD`(`!.5?_\0JW__"\M4 M__Q.N@#X6$]2K?_\#*T````*__QMZ$JL@>IG!BQL@>I.EDJL@U)G"B\L@U).> MN@((6$]*K(-.9PHO+(-.3KH!^%A/2JR"LF8N+RR"IB\L@JY.N@(:4$\F+(*B\ M4H/E@R\#+RR"JDZZ`@903R\M``A.N@$V6$]@&$ZZ`>@O+(*R3KH"&%A/("T`] M""YL@L).=4Y=3G4P/'__8`0P+P`.(&\`!$H89OQ32")O``A30!#95\C__$(@5 M("\`!$YU(&\`!"`((F\`"!#99OQ.=2!O``0@"$H89OR1P"`(4X!.=4SO`P``$ M!"`((B\`#&`"$-E7R?_\4D%@`D(84<G__$YU3E4``$CG#B`H+0`((`1R!DZZ7 M`$Q-[(+*)$#5SKB\`````&T,N+P````3;@1*DF82*7P````#@T)P_TS?!'!.; M74YU-BH`!$C#QKP``(``9@@O$DZZ`#)83T*2<`!@W$CG,``T`<3`)@%(0\;`Q M2$-"0]2#2$#`P4A`0D#0@DS?``Q.=4[Z``(B+P`$+&R#2D[N_]PB+P`$+&R#1 M2D[N_X(B+P`$+&R#2D[N_[@B+P`$+&R#2D[N_W`L;(-*3N[_RBQL@TI.[O]\? M(B\`!"QL@TI.[O\H3OH``DSO``8`!"QL@TI.[O_B+&R#2D[N_\1.^@`"3.\`7 M#@`$+&R#2D[N_]9.^@`"3.\`#@`$+&R#2D[N_[Y.^@`"3.\`#@`$+&R#2D[NU M_]!(YP$$3.\@@``,+&R"QDZN_Y1,WR"`3G4B;P`$+&R"QD[N_F).^@`"3.\`] M`P`$+&R"QD[N_SHB;P`$+&R"QD[N_MHL;(+&3N[_?$[Z``(B;P`$("\`""QL* M@L9.[O\N(&\`!"QL@L9.[OZ,+&R"QB)O``0@+P`(3N[]V")O``0L;(+&3N[^V MADSO``,`!"QL@L9.[O[.(&\`!"QL@L9.[OZ```````/L`````0`````````"/ M`````````_$````"``````````````/R```#Z@```)P``````````0````$`V M```!`````0```````#`Q,C,T-38W.#EA8F-D968```````````````````$`E M`````0`````````````````````!`0````$``````````````````````0(`' M```!````````````````````````````````````````````````````````! M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M````````````````````````````````````````("`@("`@("`@,#`P,#`@P M("`@("`@("`@("`@("`@(""00$!`0$!`0$!`0$!`0$!`#`P,#`P,#`P,#$!`H M0$!`0$`)"0D)"0D!`0$!`0$!`0$!`0$!`0$!`0$!`4!`0$!`0`H*"@H*"@("* J`@("`@("`@("`@("`@("`@("0$!`0"````````/R```#ZP````````/R< `` end size 7512 SHAR_EOF # End of shell archive exit 0