rsellens@watdcsu.UUCP (Rick Sellens - Mech. Eng.) (09/26/85)
begin 777 conch.exe
M35H #X @ __]@!D=+
M
M
M
M
M
M
M
M
M
M
M #IN6)5B^R![)X N'L 4.C28X/$ KB+ %#HR&.#
MQ *XD !0Z+YC@\0"N+D 4.BT8X/$ K@" 5#HJF.#Q *X-0%0Z*!C@\0"M##-
M(:(Y%8@F.A6 /CD5 G,4N&,!4.B$8X/$ K@! %#H(6.#Q *XG@%0Z%DV@\0"
MHSL5QH9__P#&!O42 .AE++BE 5#HN 6#Q +HW /HM@/H) 3H_@.X !0Z,9(
M@\0"QX9\_P QX9N____QX9P____QX9D_P QX9F_P @[Y\_PUU ^D= X.^
M9O\ =!FA: M 0!0N'$44/^V;O__MG#_Z/T#@\0(QX9D_P Z#T;@[YD_P!T
M ^GG H.^?/\-=0/IW0+HN3V)AGC_Z/\]B89V_XV&?_]0Z/Y(@\0"B89R_\>&
M=/\! (N&=/\[AG+_?Q"X( !0Z(]B@\0"_X9T_^OF_[9V__^V>/_H7#V#Q 2#
MOG#_ 'P?BX9P_P.&;O_1X(OP@<9Q%/\TC89__U#HS$V#Q 3K!<:&?_\ N&L
M4(V&?_]0N( 4.@V/5#H?SU0Z"(_@\0*B89\_XN&</^)AFK_BX9N_XF&:/^+
MGGS_Z,UC" - -D!N/_B ;#_&@*W_S@"K__, MW_ 0/G_U0# (!Q \>&9O\
M .F/ 8.^</\ ?1>X9 !0N'$44.B)*H/$!*-H ,>&</\ (N&</\#AF[_BPYH
M (/I 3O!?03_AF[_Z5<!@[YP_P!] ^E- 8N&</\#AF[_/0 ?@3_CF[_Z3D!
M@[YF_P!U,X.^</\ ?1&X9 !0N'$44.@L*H/$!*-H ,>&;O\ ,>&</\ ,>&
M9/\! ,>&9O\! .E7 *%H "T! #T4 'P#Z1( QX9P_P H6@ +0$ B89N_^LW
MH6@ +10 .X9P_W4(QX9N_Q, ZR.+AG#_!0H BPYH (/I%#O!?P>#AG#_"NL*
MH6@ +10 B89P_^FE (.^9O\ =0/IFP"+AG#_+0H /0 ?@>#KG#_"NL5@[YP
M_P!U",>&;O\ .L&QX9P_P Z7 C89__U#H.Q.#Q (] !U08V&?_]0Z((B
M@\0"N&0 4+AQ%%#H5BF#Q 2C: #_AF[_BX9P_P.&;O\[!F@ ? ;_CG#_Z^R#
MOF;_ '0&QX9D_P$ ZQV-AG__4.CH$H/$ CT '4+C89__U#H[BR#Q +K (.^
M;O\ ?16#OG#_ 'X.BX9N_P&&</_'AF[_ "#OF[_$WX8@[YF_P!T$8N&;O\M
M$P !AG#_QX9N_Q, @[YJ__]T$(N&</\[AFK_= ;'AF3_ 0"#OF;_ '0;@[YD
M_P!U%/^V:/_H, *#Q +_MF[_Z.D!@\0"Z0_]Z=G\C89__U#H41*#Q (] !U
M2HV&?_]0Z)@A@\0"Q@;U$@"-AG__4.C( H/$ HF&>O\] !T"O^V>O_HE12#
MQ +HES>#OGK_WW4-Z)H N 4.A-7X/$ L:&?_\ Z5[\B^5=PU6+[!Z,R([8
MNF $M"6P(\TA'UW#N 4+@ %#H$$6+Y5W#58OLL".T-<TAC ;N&HD>\!I=
MPU6+[+@ ([ H>X:)J.. *'P&B:CC !=PU6+[!Z,R([8NJX$M"6P(LTA'UW#
MN 4+@ %#HPD2+Y5W#58OLL".T-<TAC ;R&HD>]!I=PU6+[+@ ([ H?(:
M)J.* *'T&B:CB !=PU6+[(/L!.@F.[@! %"X 0!0Z+,Y@\0$BT8$!10 +0$
MB4;^BT;^.T8*?@^X"@!0Z+1>@\0"_T[^Z^F+1OX[1@1] ^F1 (M&_M'@B_ #
M=@C_-.CC1(/$ HOX5^@<.E\M!P [^'THN*T!4.B/7H/$ HM&_M'@B_ #=@C_
M-.A]7H/$ K@* %#H7EZ#Q +K0[BT 5#H9UZ#Q +'1OP .C:.2T' #M&_'X?
MBT;^T>"+\ -V"(LT W;\B@2T %#H*%Z#Q +_1OSKUK@* %#H&5Z#Q +_3O[I
M9/__=@;H!P"#Q *+Y5W#58OL@^P&Z/,XB4;\Z#HYB4;ZN $ 4+@4 "M&!%#H
MQ#B#Q 2XNP%0Z.Y=@\0"_W;Z_W;\Z*XX@\0$B^5=PU6+[(/L!NBV.(E&_.C]
M.(E&^K@! %"X% K1@10Z(<X@\0$N,(!4.BQ78/$ O]V^O]V_.AQ.(/$!(OE
M7<-5B^R![(8 N,D!4/]V!.AH08/$!(E&_CT '11_W;^N( 4(V&??]0Z!I9
M@\0&/0 ="^-AGW_4.A; (/$ HF&>O\] !T"O^V>O_H*!*#Q *#OGK_WW4"
MZPC'AGK_ #KNO]V_N@ 0H/$ NLAN,L!4+CU$E#HADB#Q 3_=@2X]1)0Z)M(
M@\0$QX9Z_\[_BX9Z_XOE7<-5B^R![$ &QT;^ #&AH_Z ,:&3OH Z#A=B_A7
MZ"Y=7ROXB7[L@7[LS@-S",=&^,W_Z48*_W8$Z"\/@\0"/0 = C'1OCB_^DP
M"O]V!+B %"-AM;[4(V&V/Q0Z+02@\0(B4;Z@W[Z 'T)BT;ZB4;XZ0<*B[;6
M^X \+G4(QT;XXO_I]@G'AL#Y #'AL+Y #'1O8 ,=&\@ QT;T "+1O0[
M1OI\ ^F@ (M&]-'@B_"-AM;[ _"+-( \.W0#Z8, QT;V 0#&ALWY (M&\HE&
M\(M&\#M&]'TNBT;PT>"+\(V&UOL#\/\TC8;-^5#HFD>#Q 2XW %0C8;-^5#H
MBT>#Q 3_1O#KRHM&] 4! (E&\H%^[ ('<PC'1OC-_^E;"8V&S?E0Z-G^@\0"
MB4;X/0 = G_=OCHJ!"#Q *#?OC?=0/I-@G_1O3I5?^#?O8 =0/I:P#&ALWY
M (M&\HE&\(M&\#M&]'TNBT;PT>"+\(V&UOL#\/\TC8;-^5#H#4>#Q 2XW@%0
MC8;-^5#H_D:#Q 3_1O#KRHV&S?E0Z&3^@\0"B4;X/0 = G_=OCH,Q"#Q *#
M?OC?= 7'1O@ .F\",=&] BT;T.T;Z? /I!0&+1O31X(OPC8;6^P/PBS2
M/#QU7X.^POD = ZX @!0N. !4.@_5X/$!(M&]-'@B_"-AM;[ _"+-(FVPOG_
M3OJ+1O2)1O*+1O([1OI])HM&\@4! -'@B_"-AM;[ _"+1O+1X(OXC8;6^P/X
MBS2)-?]&\NO2BT;TT>"+\(V&UOL#\(LT@#P^=5^#OL#Y '0.N ( 4+C] 5#H
MS%:#Q 2+1O31X(OPC8;6^P/PBS2)ML#Y_T[ZBT;TB4;RBT;R.T;Z?2:+1O(%
M 0#1X(OPC8;6^P/PBT;RT>"+^(V&UOL#^(LTB37_1O+KTHM&]-'@B_"-AM;[
M _"+-( \?'4%QT;^ 0#_1O3I\/Z#?OX =0/I0P*!?NP"!W,(QT;XS?_ICP?'
M1OP! (V&W/Z)AMK]_[;6^_^VVOWH946#Q 3'1O0! (M&]-'@B_"-AM;[ _"+
M-( \?'0LN!L"4/^VVOWH8$6#Q 2+1O31X(OPC8;6^P/P_S3_MMK]Z$=%@\0$
M_T;TZ\"#OL+Y '0._[;"^?^VVOWH+46#Q 2-1MY0Z%0Q@\0"N!T"4/^VVOWH
M%46#Q 2-1MY0_[;:_>@'18/$!/]&](M&]#M&^GP#Z3\!BT;\+0$ T>"+\(V&
MVOT#\(LTB;;(^8NVR/F / !T!O^&R/GK\8N&R/D% 0"+3OS1X8OQC8[:_0/Q
MB02+\,8$ (M&]-'@B_"-AM;[ _"+-( \?'1*BT;T.T;Z?4*X'P)0BT;\T>"+
M\(V&VOT#\/\TZ(1$@\0$BT;TT>"+\(V&UOL#\/\TBT;\T>"+\(V&VOT#\/\T
MZ&!$@\0$_T;TZZ*X(0)0BT;\T>"+\(V&VOT#\/\TZ$)$@\0$C4;>4(M&_-'@
MB_"-AMK] _#_-.@I1(/$!(M&]#M&^GT^C4;>4.A(,(/$ K@C E"+1OS1X(OP
MC8;:_0/P_S3H_D.#Q 2-1MY0BT;\T>"+\(V&VOT#\/\TZ.5#@\0$ZR"#OL#Y
M '09_[; ^8M&_-'@B_"-AMK] _#_-.C#0X/$!/]&_/]&].FV_L=&] BT;T
M.T;\? /I- "+1O31X(OPC8;:_0/P_S3H"_N#Q *)1O@] !T"?]V^.C:#(/$
M H-^^-]U ^EH!?]&].O!QT;XT__I6P6+AM;[B8;*^8NVROF / !T&XNVROF*
M!+0 4.CY/8/$ HNVROF(!/^&ROGKW/^VUON-AI7[4.@10X/$!,:&T?H QT;T
M 0"+1O0[1OI].8M&]-'@B_"-AM;[ _#_-(V&T?I0Z =#@\0$BT;Z+0$ .T;T
M?@^X)0)0C8;1^E#H[4*#Q 3_1O3KOXV&T?I0C8:5^U#H< >#Q 2)1OB#?O@
M= F#?OC2= /ILP2#?OC2= /IZP"X? !0C8:5^U#HPCV#Q 0] !U/[@[ %"-
MAI7[4.BN/8/$!#T '4KN'P 4(V&T?I0Z)H]@\0$/0 =1>X.P!0C8;1^E#H
MACV#Q 0] !U ^F8 (%^[ ('<PC'1OC-_^E(!/^VUOOH%!R#Q *)1NZ+=N[&
MA"X 8V&E?M0C8;-^5#H%$*#Q 2X)P)0C8;-^5#H)T*#Q 2-AM'Z4(V&S?E0
MZ!="@\0$@[["^0!T#_^VPOF-ALWY4.@!0H/$!(.^P/D = __ML#YC8;-^5#H
MZT&#Q 2-ALWY4.A6^8/$ HE&^(MV[L:$+@ Z;\#@#XY%0-R%( ^.14#= /I
M1 " /CH5 '0#Z3H N"D"4(V&E?M0Z'L\@\0$/0 =2:#OL#Y '4?@+[1^B]U
M&("^TOIC=1&X 0!0Z.8P+0$ 4.C',(/$!+@Z %"-AI7[4.B"/(/$!(OP@'P!
M '5CN$$ 4(V&E?M0C8:5^U#H?P.#Q :)1O@] !U1("^EOLZ=1N*AI7[M !0
MZ.$[@\0"+6$ 4+@. %#H#%:#Q 2-AI7[4.C7.X/$ CT" 'X2C8:5^U"X,0)0
MZ(L1@\0$B4;XZ? "N$$ 4(V&E?M0C8:5^U#H' .#Q :)1O@] !T ^G1 KB!
M %"-AM'Z4(V&T?I0Z/T"@\0&B4;X/0 = /IL@*#OL+Y '1+N$$ 4(V&C_I0
MBX;"^04! %#HU *#Q :)1O@] !T ^F) HV&C_I0Z"TI@\0"B4;T/0 =!;_
M=O3HU@F#Q +&AH_Z ,=&^ Z6 "@[[ ^0!U ^E^ (NVP/F ? $^=2G&AD[Z
M/KA %"-AD_Z4(N&P/D% @!0Z' "@\0&B4;X/0 = /I)0+K(KA! %"-AD[Z
M4(N&P/D% 0!0Z$P"@\0&B4;X/0 = /I 0*-AD[Z4.@G*H/$ HE&]#T '06
M_W;TZ$X)@\0"QH9.^@#'1O@ .G8 8V&T?J)ALKYB[;*^8 \ '4#Z5P B[;*
M^8 \)W0,B[;*^8 \(G0#Z4$ C8;1^CF&ROEW ^DB (N&RODM 0"+\( \7'44
M_[;*^8N&RODM 0!0Z',_@\0$ZQ*+ALKY!0$ 4/^VROGH7S^#Q 3_ALKYZYB-
MAI7[4.BG#H/$ CT '06C8;1^E"-AI7[4.C=#X/$!(E&^.E" 8V&4_M0C8:5
M^U#HP2.#Q 0] !U);@T E"X]1)0Z! _@\0$C8:5^U"X]1)0Z",_@\0$QT;X
MX/_I" &-AE/[4.AE%(/$ CT '4#Z6P N%P 4(V&4_M0Z/0Y@\0$B8;*^3T
M '03BX;*^04! %"-AE/[4.B[/H/$!+@O %"-AE/[4.C).8/$!(F&ROD] !T
M$XN&ROD% 0!0C893^U#HD#Z#Q 2-AM'Z4(V&4_M0Z%P4@\0$B4;XZ8D C8;1
M^E#H2SF#Q (]@ !].8V&T?J)ALKYB[;*^8 \ '0&_X;*^>OQC8;1^CF&ROER
M$XNVROF+OLKYB@2(10'_CLKYZ^/&AM'Z(.AJ\XV&T?I0C893^U#H-#6#Q 2)
M1O@]__]U(KA6 E"X]1)0Z @^@\0$C893^U"X]1)0Z!L^@\0$QT;XX/_H]_*
MOD[Z '04Z*4IB4;T/0 = G_=O3H3@>#Q * OH_Z '04Z'LGB4;T/0 = G_
M=O3H,P>#Q *+1OB+Y5W#58OL@>P6 \>&[/P .B*4HOX5^B 4E\K^(F^ZOR!
MONK\R !S![C-_XOE7</&AGO] /]V!+B %"-AOS]4(V&_OY0Z!8(@\0(B8;N
M_(.^[OP ?0B+AN[\B^5=P\>&\OP (N&\OP[AN[\? /IOP&+AO+\T>"+\(V&
M_/T#\(LTB;;X_(NV^/R*!+0 4.@##(/$ CT '0&_X;X_.OFB[;X_( \.G0#
MZ4<!B[;X_,8$ (N&\OS1X(OPC8;\_0/P_S2-AOK\4.CJ/(/$!(NV^/S&!#J-
MAOK\B8;T_(NV]/R / !T&XNV]/R*!+0 4.B0-X/$ HNV]/R(!/^&]/SKW(V&
M^OQ0Z @7@\0"B8;P_#T 'T#Z;X QX;L_ $ BX;P_-'@B_"!QB$4BS2#Q@*)
MMO;\B[;V_(H$M !0Z'I/@\0"/0 =0;_AO;\Z^:+MO;\B@2T %#H8$^#Q (]
M !T!O^&]OSKYO^V]OR-AGO]4.AD/(/$!(NV^/R ? $ =4&-AGO]B8;V_(NV
M]OR / !T!O^&]OSK\8N&]OPM 0"+\( \7'0.BX;V_"T! (OP@#PO=0R+AO;\
M+0$ B_#&! #K$XN&^/P% 0!0C89[_5#H!CR#Q 3K&XN&\OS1X(OPC8;\_0/P
M_S2-AGO]4.CI.X/$!.L;BX;R_-'@B_"-AOS] _#_-(V&>_U0Z,P[@\0$BX;N
M_"T! #N&\OQ^#[AJ E"-AGO]4.BP.X/$!/^&\OSI-/Z#ONS\ '0B@;[J_,X#
M<P>XS?^+Y5W#_W8(_W8&C89[_5#HK_V#Q ;K#HV&>_U0_W8&Z% [@\0$N
MB^5=PU6+[('LE@#H)5"+^%?H&U!?*_B)?O2!?O3( ','N,W_B^5=P\=&^@
MC89K_XE&[(E&[O]V!.CR%(/$ HE&_(-^_ !] ^D7 (MV_("\!@ = /I"@"+
M=OR O"X '0'N B^5=P\=&^-+_BW;\QH0& &+1@2)1O*+1OS1X(OP@<:!
M$XLT@\8"B7;PBW;PB@2T %#HLTV#Q (] !U#8MV\( \ '0%_T;PZ^"+=O"*
M!+0 4.B338/$ CT '0%_T;PZ^B+=O"*!+0 4.A[38/$ CT '4>BW;P@#P
M=!:+1O#_1O"+\(M&\O]&\HOXB@2(!>O/BW;RQ@0 BW;PB@2T %#H1$V#Q (]
M !T!?]&\.OHC89K_XE&\HMV\( \ '4#Z6L BW;P@#S^=3R+1@:)1NZ+=NZ
M/ !T)XV&:_^+3O(KR(/Y?W8#Z>X BT;N_T;NB_"+1O+_1O*+^(H$B 7KT<=&
M^@$ ZR*-AFO_BT[R*\B#^7]V!>G .L/BW;PBT;R_T;RB_B*!(@%_T;PZXJ#
M?OH =5B-AFO_BT[R*\B#^7]V ^F3 (M&!HE&[HMV[H \ '0+BT;R_T;RB_#&
M!""+=NZ / !T)HV&:_^+3O(KR(/Y?W8"ZV*+1N[_1NZ+\(M&\O]&\HOXB@2(
M!>O2BW;RQ@0 C89K_U#_=@;H1SF#Q 2!?O1; 7,'QT;XS?_K&_]V!O]V!.CG
M_8/$!(E&]H-^]@!T!HM&]HE&^(MV_,:$!@ BT;XB^5=PXMV\L8$ +C5_XOE
M7<-5B^R#[ +'1OX! (MV!( \ '0E@W[^ '0?BT8$_T8$B_"*!+0 4.C:2X/$
M CT '4%QT;^ #KTXM&_HOE7<-5B^R![(0 Q@;X&O^-AG__H_8:_W8$Z*C_
M@\0"/0 = NT&<TAHO@:_@;X&HMV!(!\ 3IU((MV!(!\ @!U%XMV!(H$M !0
MZ$0S@\0"+6$ !0$ HO@:@#[X&O]R ^ES (H6^!J+-O8:M$?-(7,%Q@;X&O^
M/O@:_W4BN&P"4+CU$E#H/#B#Q 3_=@2X]1)0Z%$X@\0$N-C_B^5=PX &^!I
MH/@:M !0Z*),@\0"N(0"4.BM3(/$ HV&?_]0Z*),@\0"N H 4.B#3(/$ K@
M (OE7</_=@2X.P!0Z.I,@\0$B89\_X.^?/\#=2*XAP)0N/424.C+-X/$!/]V
M!+CU$E#HX#>#Q 2XU_^+Y5W#N B^5=PU6+[(/L$,=&\@ N H 4.@F3(/$
M L=&_ BT;\.T8(? /I^0"#?@H = Z+1@@K1OPM 0")1OKK!HM&_(E&^HM&
M^M'@B_ #=@2+-(EV\(M&^M'@B_ #=@2+- -V!CMV\'8-BW;P@#P = 7_1O#K
MW_]V\.@4,H/$ HOX5^A-)U^+\(O'F??^!0$ B4;^BT;R T;^B_A7Z#LG7RT"
M #OX?E_HVR:)1O;HB":)1O2XJ0)0Z)I+@\0"Z*M+B4;X_W;V_W;TZ%0F@\0$
MN+$"4.A^2X/$ O]V]HM&]"T! %#H.B:#Q 2*1OBT %#HCS&#Q (]<0!U![C6
M_XOE7</'1O( /]V\.A(2X/$ K@* %#H*4N#Q *+1OX!1O+_1OSI_/ZX "+
MY5W#58OL@^P"BUX$@_O*?0/IMP"#^^)^ ^FO (/KRM'C+O^GWAA\&749;AEG
M&6 91!E$&5D9@QD0&8,94AD0&4L91!F#&3T9-ADO&2<9@QD0&1\9%QD0&8OE
M7</I<P#'1OZZ NEK ,=&_LD"Z6, QT;^VP+I6P#'1O[W NM4QT;^!P/K3<=&
M_B4#ZT;'1OY3 ^L_QT;^9 /K.,=&_G,#ZS''1OZ3 ^LJQT;^P0/K(\=&_L\#
MZQS'1OX!!.L5QT;^+ 3K#L=&_E8$ZP?'1OZ5!.L @#[U$@!T+[@" %"XJ 10
MZ')&@\0$N ( 4+CU$E#H9$:#Q 2X @!0N*H$4.A61H/$!,8&]1( N ( 4+BL
M!%#H0T:#Q 2X @!0_W;^Z#9&@\0$N ( 4+BN!%#H*$:#Q 2+Y5W#58OL@^P,
MBT8$B4;^BT8*B4;\QT;T "+=OR*!+0 4.@X2(/$ CT '0%_T;\Z^B+=OR
M/ !U ^D& HM&_(E&^HMV^H \/'0(BW;Z@#P^=07_1OKKZXMV^H \ '4#Z0<!
MBW;ZB@2T %#H[T>#Q (] !T ^GQ (MV^H \?'4#Z>8 BW;Z@#P[=0/IVP"+
M=OJ /#QU ^G0 (MV^H \/G4#Z<4 BW;Z@#Q<=1:+=OJ ? $G= F+=OJ ? $B
M=02#1OH"BW;Z@#PG= /I30#_1OJ+=OJ / !U ^DJ (MV^H \)W4#Z1\ BW;Z
M@#Q<= /I#P"+=OJ ? $G= /I P#_1OK_1OKKRXMV^H \ '4-N-'_4.B\_8/$
M O].^HMV^H \(G5!_T;ZBW;Z@#P ="&+=OJ /")T&8MV^H \7'4,BW;Z@'P!
M(G4#_T;Z_T;ZZ]>+=OJ / !U#;C1_U#H<_V#Q +_3OK_1OKI[OZ+1OZ)1OB+
M1OP[1OIS%HM&_/]&_(OPBT;X_T;XB_B*!(@%Z^*+1OC_1OB+\,8$ (M&]/]&
M]-'@B_ #=@:+1OZ)!(M&]#M&"'X'N-W_B^5=PXM&^(E&_HMV_(H$M !0Z))&
M@\0"/0 = 7_1OSKZ(MV_( \?'0(BW;\@#P[=5B+1O3_1O31X(OP W8&BT;^
MB02+1O0[1@A^![C=_XOE7<.+1OS_1OR+\(M&_O]&_HOXB@2(!8M&_O]&_HOP
MQ@0 BW;\B@2T %#H*D:#Q (] !T!?]&_.OHZ>_]BT;TB^5=PU6+[(/L1(U&
MO:/Y&K@* %#HAT>#Q *+-CL5@#P =0VXL 10Z(E'@\0"Z;\!H3L5B4;^BW;^
M@#P =0/IK@&+=OZ /"1T%HM&_O]&_HOPB@2T %#H14>#Q +IC0'_1OZ+=OZ*
M!+0 4.AS+8/$ HO8Z-](#@ -\<= #B'&0 ^1QP ! ==@!7'6X ;AUG ) =
M; "='6( JAUQ +<=90##'2T SQUH -L= ( )'NDW 8U&O5#HD2J#Q *-1KU0
MZ/!&@\0"Z2 !C4:]4.A#*H/$ HU&O5#HV4:#Q +I"0&+-OD:Q@0 M$>R (LV
M^1K-(;09S2&B^QJ !OL:8:#[&K0 4.BX1(/$ E#HD4:#Q *XN 10Z)Q&@\0"
MC4:]4.B21H/$ NG" +B[!%#HA4:#Q *XR@10Z'M&@\0"Z:L M!G-(:+[&H &
M^QIAH/L:M !0Z&M$@\0"4.A$1H/$ NF) +@^ %#H-T:#Q +I? "X/ !0Z"I&
M@\0"Z6\ N'P 4.@=1H/$ NEB +@] %#H$$:#Q +K5K@; %#H!$:#Q +K2K@*
M %#H^$6#Q +K/N@V(2T! %#HXB!0Z,8@@\0$N" 4.C;18/$ N@;(2T! %#H
MQR!0Z*L@@\0$ZQ"+=OZ*!+0 4.BZ18/$ NL _T;^Z4?^B^5=PU6+[(I&!+0
M4.CD0XOE/0 = 6X 0!=PXI&!+0 4.B[0XOE/0 = 6X 0!=PXI>!+< Z"Q'
M#0 D (X>(P".'B8 CAY (X>(0".'B4 CAXH (X>*0".'BT CAY[ (X>?0".
M'E\ CAX @)4>N $ 7</K NL N 7<-5B^R+=@2*'+< @_MA?0/I- &#^W9^
M ^DL 8/K8='C+O^GP![L'N(?!1_B'QX?XA_B'S<?XA_B'^(?XA_B'^(?XA]0
M'^(?:1^"'YH?LA_*'[C/!%#_=@3H0BN+Y3T '4%N $ 7</IW0"XU010_W8$
MZ"DKB^4] !U!;@! %W#Z<0 N-@$4/]V!.@0*XOE/0 =06X 0!=P^FK +C=
M!%#_=@3H]RJ+Y3T '4%N $ 7</ID@"XY010_W8$Z-XJB^4] !U!;@! %W#
MZ7D N.T$4/]V!.C%*HOE/0 =06X 0!=P^E@ +CR!%#_=@3HK"J+Y3T '4%
MN $ 7</K2+CY!%#_=@3HE"J+Y3T '4%N $ 7</K,+C^!%#_=@3H?"J+Y3T
M '4%N $ 7</K&+@&!5#_=@3H9"J+Y3T '4%N $ 7</K +@ %W#58OL@^P$
MBW8$BARW (/[87T#Z;<$@_MV?@/IKP2#ZV'1XR[_IPX@.B"S)(8@LR2H(+,D
MLR3$(+,DLR2S)+,DLR2S)+,D0"*S)%@CI"/&(R$D:"2X"P50_W8$Z/0I@\0$
M/0 =3?_=@;H\O6#Q (] !T'+@ %#_-E@ N ( 4+B!$U#H*?>#Q B+Y5W#
MZPW_=@;H*PB#Q *+Y5W#Z2T$N!$%4/]V!.BH*8/$!#T '4-_W8&Z.7U@\0"
MB^5=P^D+!+@4!5#_=@3HABF#Q 0] !U![C?_XOE7</I[P.X&050_W8$Z&HI
M@\0$/0 = /I9 &+1@:)1OZ+=OZ*!+0 4.A=08/$ CT '4(BW;^@#PM=07_
M1O[KX(MV_HH$M !0Z 8I@\0"/68 =!&X9 !0N'$44.A@"X/$!*-H (MV_HH$
MM !0Z.(H@\0"B]B#^V9] ^GC (/[=WX#Z=L @^MFT>,N_Z=-(7$A'B(>(AXB
M'B(>(AXB'B(>(AXB'B(>(GXA'B(>(AXB'B*I(>@=$+@ (OE7</IOP#_1OZ+
M=OZ*!+0 4.B[0(/$ CT '0%_T;^Z^C_=O[H+A"#Q *+Y5W#Z90 _T;^QT;\
M "+=OZ*!+0 4.A#0(/$ CT '0=BW;^B@0L,(K8BT;\N0H ]^FW /8B5[\
M_T;^Z]"#?OP =!#_=ORX<110Z(P*@\0$HV@ BW;^B@2T %#H14"#Q (] !T
M!?]&_NOH_W;^Z)\/@\0"B^5=P^L?N $ 4/\V: "X !0N'$44.AE]8/$"+@
M (OE7</K .ES K@A!5#_=@3H[B>#Q 0] !T ^D 8M&!HE&_HMV_HH$M !0
MZ.$_@\0"/0 =0B+=OZ /"UU!?]&_NO@BW;^B@2T %#HBB>#Q *+V(/[97T#
MZ:, @_MW?@/IFP"#ZV71XR[_IZ4BRR+5(C8C-B,V(S8C-B,V(S8C-B,V(S8C
M-B/B(C8C-B,V(S8C#"/H=PZ+Y5W#Z8 Z!T.N B^5=P^ES /]&_HMV_HH$
MM !0Z%<_@\0"/0 = 7_1O[KZ/]V_N@Q#H/$ HOE7</K2?]&_HMV_HH$M !0
MZ"T_@\0"/0 = 7_1O[KZ/]V_NCN#8/$ HOE7</K'[@ %#_-EP N 4+C1
M$U#H3?2#Q BX "+Y5W#ZP#I6P&X*050_W8$Z-8F@\0$/0 =3?_=@;HU/*#
MQ (] !T'+@ %#_-F N ( 4+CY$U#H"_2#Q B+Y5W#ZPW_=@;H<06#Q *+
MY5W#Z0\!N"X%4/]V!.B*)H/$!#T '4-_W8&Z(GB@\0"B^5=P^GM +@U!5#_
M=@3H:":#Q 0] !U1HM&!HE&_HMV_HH$M !0Z%X^@\0"/0 = 7_1O[KZ(MV
M_H \ '0*BW;^B@2B:@#K%J!J +0 4.B]/X/$ K@* %#HLS^#Q +ID@"X.@50
M_W8$Z TF@\0$/0 =3.+1@:)1OZ+=OZ / !T&(MV_HH$M !0Z,0E@\0"BW;^
MB 3_1O[KX/]V!N@^!H/$ HOE7</K2[A"!5#_=@3HQB6#Q 0] !U-_]V!NC$
M\8/$ CT '0<N 4/\V9 "X @!0N"$44.C[\H/$"(OE7</K#?]V!NA$!(/$
M HOE7</K +C>_XOE7<-5B^R#[ J+1@2)1OZ+=OZ / !T!?]&_NOS@V[^!,=&
M]@ @W[V!'\<BW;^ W;VB@2T %#H("6#Q *+=O:(0OG_1O;KWKA'!5"-1OE0
MZ"\E@\0$/0 = >X "+Y5W#N $ B^5=PU6+[('LQ "-1K]0N$P%4.BP#H/$
M!+A8!5"-AC[_4.@#*H/$!/]V!(V&/O]0Z!<J@\0$C88^_XF&//^+MCS_@#P
M= ;_ACS_Z_&X7 50BX8\_RT$ %#HS"F#Q 3_=@:-AC[_4.C@*8/$!(V&/O]0
MC4:_4.C%((/$!(OE7<-5B^R#[ +_=@3H>"2#Q (% 0")1O[_=O[H2PB#Q (]
M !T#_]V!/\V?Q/H>RF#Q 3K#HLV?Q/&!/^XV_^+Y5W#N B^5=PU6+[('L
M# '_=@3H,"2#Q (]?P!^![C4_XOE7<.+1@2)AOK^B[;Z_HH$M !0Z#8\@\0"
M/0 = ;_AOK^Z^:+MOK^@#P =0>XXO^+Y5W#C89__XF&_/Z+\(I&!H@$_X;\
M_HN&_/[_AOS^B_#&!""+AOS^B8;X_HNV^OZ*!+0 4.CD.X/$ CT '4CB[;Z
M_H \ '0:BX;Z_O^&^OZ+\(N&_/[_AOS^B_B*!(@%Z\F+MOS^Q@0 BX;X_HF&
M]OZ+MO;^@#P =!N+MO;^B@2T %#H7B.#Q *+MO;^B 3_AO;^Z]R+AOC^B8;V
M_HNV]OZ / !T/8NV]OZ*!+0 4.A%]X/$ CT '4CN!814+CU$E#H4BB#Q 3_
MMOC^N/424.AF*(/$!+C*_XOE7</_AO;^Z[J*7@:W (/[87T#Z?X @_MV?@/I
M]@"#ZV'1XR[_IRXG6B<:*!HH&B@:*!HH&B@:*!HH&B@:*!HH&B@:*!HH&B@:
M*,TG&B@:*!HH=B?_MOC^Z,<!@\0"/0 ? K_MOC^Z"T#@\0"Z:0 _[;X_N@B
M H/$ CT 'P*_[;X_N@!!(/$ O^V^/[HB *#Q (] !]"HNV^/Z ? $ =2.X
M+A%0N/424.B0)X/$!/^V^/ZX]1)0Z*0G@\0$N-#_B^5=P^M-_[;X_NA* H/$
M CT 'T9B[;X_H!\ 0!T#_^V^/[HL@&#Q (] !\([A&$5"X]1)0Z$,G@\0$
M_[;X_KCU$E#H5R>#Q 2XS_^+Y5W#ZP"+=@J+-#MV"'X'N-W_B^5=PXN&_/[_
MAOS^B_#&! F+MOK^B@2T %#H SJ#Q (] !T!O^&^O[KYO^V^O[_MOS^Z.8F
M@\0$C89__U#H" :#Q *+=@J+--'F W8,B02+=@J+--'F W8,@SP =0>XV_^+
MY5W#BW8*_P2+=@J+--'F W8,QP0 +@ (OE7<-5B^R#[ *+1@2)1OZ+=OZ
M/ !T%HMV_HH$.@9J '4&BW;^Q@3^_T;^Z^*X@1-0N%@ 4/\V5@"X80!0_W8$
MZ/O\@\0*B^5=PU6+[+@A%%"X9 !0_S9B +AV %#_=@3HV_R+Y5W#58OLN/D3
M4+A@ %#_-EX N'( 4/]V!.B^_(OE7<-5B^R#[ ;'1OH (M&^CL&6 !]7(M&
M!(E&_HM&^M'@B_"!QH$3BS2#Q@*)=OR+=OZ+?OR*!#H%=0C_1O[_1OSK[(MV
M_H \ '4BBW;\B@2T %#HRSB#Q (] !U"(MV_( \ '4'BT;ZB^5=P_]&^NN;
MN/__B^5=PU6+[(/L!L=&^@ BT;Z.P9D 'UDBT8$B4;^BT;ZT>"+\('&(12+
M-(/& HEV_(MV_H \ '04BW;^BW[\B@0Z!74(_T;^_T;\Z^2+=OZ / !U(HMV
M_(H$M !0Z$PX@\0"/0 =0B+=OR / !U!XM&^HOE7</_1OKKD[C__XOE7<-5
MB^R#[ ;'1OH (M&^CL&8 !]9(M&!(E&_HM&^M'@B_"!QOD3BS2#Q@*)=OR+
M=OZ / !T%(MV_HM^_(H$.@5U"/]&_O]&_.ODBW;^@#P =2*+=OR*!+0 4.C-
M-X/$ CT '4(BW;\@#P =0>+1OJ+Y5W#_T;ZZY.X__^+Y5W#58OL@^P(BT8$
MB4;\BW;\B@2T %#HDS>#Q (] !T!?]&_.OHBW;\@#P =0>XXO^+Y5W#BT;\
MB4;^BW;^B@2T %#H9C>#Q (] !U#8MV_H \ '0%_T;^Z^"+=O[&! #_=OSH
M)OZ#Q *)1O@] !](KA>$5"X]1)0Z"LD@\0$_W;\N/424.A )(/$!+C<_XOE
M7<.+1OC1X(OP@<:!$_\TZ!0$@\0"BT;XB4;ZBT;Z.P98 'TBBT;Z!0$ T>"+
M\('&@1.+1OK1X(OX@<>!$XLTB37_1OKKU:%8 -'@B_"!QH$3QP0 /\.6 "X
M "+Y5W#58OL@^P(BT8$B4;\BW;\B@2T %#HHS:#Q (] !T!?]&_.OHBW;\
M@#P =0>XXO^+Y5W#BT;\B4;^BW;^B@2T %#H=C:#Q (] !U#8MV_H \ '0%
M_T;^Z^"+=O[&! #_=OSHK?V#Q *)1O@] !](KAR$5"X]1)0Z#LC@\0$_W;\
MN/424.A0(X/$!+C0_XOE7<.+1OC1X(OP@<8A%/\TZ"0#@\0"BT;XB4;ZBT;Z
M.P9D 'TBBT;Z!0$ T>"+\('&(12+1OK1X(OX@<<A%(LTB37_1OKKU:%D -'@
MB_"!QB$4QP0 /\.9 "X "+Y5W#58OL@^P$H7\3B4;\QT;^ "+1OX[1@9]
M3HM&_M'@B_ #=@2+1OR)!(MV_( \ '0-BW;\@#S_= 7_1OSKZXMV_( \_W40
MBT;^T>"+\ -V!,<$ #K$HMV_( \ '4%_T;\Z_/_1O[KJHM&_HOE7<-5B^RA
M9 #1X(OP@<8A%,<$ "A8 #1X(OP@<;Y$\<$ "A6 #1X(OP@<:!$\<$ #'
M!G<3%A''!GD3%A''!GL3%A''!G\37@6A?Q,[!G<3<PZA?Q/_!G\3B_#&! #K
MZ<<&?Q->!:%W$RT! %#H! "+Y5W#58OLH7\3.T8$=PBA=Q,[1@1W!;@ %W#
MBT8$HWT3BS9]$\8$_UW#58OL@^P&@VX$ :%]$XE&^J%]$RL&?Q,[1@9S![@
M (OE7<.A?1,K1@:)1OZ+1@0K1@:)1OR+1OX[1OQW%HM&^O]&^HOPBT;^_T;^
MB_B*!(@%Z^*+1OX[1@1W#8M&_O]&_HOPQ@0 Z^NA?1,K1@90Z&?_@\0"BT8&
MB^5=PU6+[(/L!J%]$RL&?Q,[1@1S![@ (OE7<.A?1,M 0")1OZA?Q,#1@2)
M1OR+1OXK1@2)1OJ+1OX[1OQR%HM&^O].^HOPBT;^_T[^B_B*!(@%Z^*+1OX[
M!G\3<@V+1O[_3OZ+\,8$ .OJBT8$B^5=PU6+[(/L"/]V!.BC&X/$ @4! (E&
M^*%W$RL&>1,[1OAR ^F> *%W$RL&>1.+3O@KR%'_-GD3Z-W^@\0$B4;\@W[\
M '4'N B^5=PXM&_"D&>Q.+1OPI!GD3QT;Z "+1OH[!E@ ?16+1OK_1OK1
MX(OP@<:!$XM&_"D$Z^+'1OH (M&^CL&9 !]%8M&^O]&^M'@B_"!QB$4BT;\
M*03KXL=&^@ BT;Z.P9@ 'T5BT;Z_T;ZT>"+\('&^1.+1OPI!.OB_W8$_S9Y
M$^@'((/$!*%Y$XE&_HM&^ $&>1.+1OZ+Y5W#58OL@^P(BT8$B4;\B4;^BW;\
M@#P = 7_1OSK\_]&_(M&_"M&!(E&^(M&_#L&=Q-S%HM&_/]&_(OPBT;^_T;^
MB_B*!(@%Z^&+1OX[!G<3<PV+1O[_1OZ+\,8$ .OJQT;Z "+1OH[!E@ ?2>+
M1OK1X(OP@<:!$XLT.W8$=A"+1OK1X(OP@<:!$XM&^"D$_T;ZZ]#'1OH (M&
M^CL&8 !])XM&^M'@B_"!QOD3BS0[=@1V$(M&^M'@B_"!QOD3BT;X*03_1OKK
MT,=&^@ BT;Z.P9D 'TGBT;ZT>"+\('&(12+-#MV!'80BT;ZT>"+\('&(12+
M1O@I!/]&^NO0BT;X*09Y$XOE7<-5B^R#[ 2A7 [!EH ? >XW?^+Y5W#_W8$
MZ*D9@\0"!0$ B4;^_W;^_S9[$^C\_(/$!#T '16QT;\ "+1OP[!EP ?16+
M1OS1X(OP@<;1$XM&_BD$_T;\Z^+_=@2A>Q,K1OZ+#EP _P9< -'AB_&!QM$3
MB010Z' >@\0$H5P T>"+\('&T1/'! ZP>XV_^+Y5W#N B^5=PU6+[*%[
M$RT! %#H7/R+Y<<&7 *%< -'@B_"!QM$3QP0 %W#58OLN 4+C1$U#_
M-EP _W8$Z*X B^5=PU6+[+A:,%#_=@3HS &+Y5W#58OL@^P&QT;\ #'1OX
M (M&_CL&7 !]+(-^_-]T)HM&_M'@B_"!QM$3_S3H9]6#Q *)1OH] !T!HM&
M^HE&_/]&_NO+BT;\B^5=PU6+[(/L J%]$XE&_O\V?Q/HNON#Q +_=O[HL?N#
MQ *+Y5W#58OLN $ 4+AQ%%#_-F@ _W8$Z!4 B^5=PU6+[+B;)5#_=@3H,P&+
MY5W#58OL@^P&N(H14/]V!.C0%8/$!(E&_CT '4QN(P14+CU$E#H/QV#Q 3_
M=@2X]1)0Z%0=@\0$N*(14+CU$E#H1AV#Q 3'1OK,_^G3 (-^"@!U ^EE (M&
M!BT! (E&_(-^_ !\5/]V_HM&_-'@B_ #=@C_-.BZ+8/$!#T '42_W;^N*\1
M4.BH+8/$!#T '0CN+$14+CU$E#HRAR#Q 3_=@2X]1)0Z-\<@\0$QT;ZR__I
M; #_3OSKINM@QT;\ "+1OP[1@9]4_]V_HM&_-'@B_ #=@C_-.A7+8/$!#T
M '42_W;^N,L14.A%+8/$!#T '0BN,T14+CU$E#H9QR#Q 3_=@2X]1)0Z'P<
M@\0$QT;ZR__K"O]&_.NEQT;Z #_=O[HJA6#Q *+1OJ+Y5W#58OL@>R* ,=&
M_ N.<14/]V!.B;%(/$!(E&_CT '4#Z7D _W;^N( 4(V&>?]0Z$HL@\0&
M/0 =%>-AGG_B89W_XNV=_^ / !T!O^&=__K\?^.=_^+MG?_@#P-= F+MG?_
M@#P*=0^+AG?__XYW_XOPQ@0 Z]^-AGG_4/]6!H/$ HE&^CT '0&BT;ZB4;\
MZY+_=O[H"!6#Q +K,+CI$5"X]1)0Z(X;@\0$_W8$N/424.BC&X/$!+C_$5"X
M]1)0Z)4;@\0$N,[_B^5=PXM&_(OE7<-5B^R#[ ;'1OH! /]V!/]V!NA.&X/$
M!+@N %#_=@3H=Q:#Q 0] !T&/]V!NCB 8/$ CT '0'N $ B^5=P^EK /]V
M!NCW%8/$ HOP W8&B7;^N \24/]V_N@&&X/$!/]V!NBL 8/$ CT '0#Z9H!
MN!024/]V_NCH&H/$!/]V!NB. 8/$ CT '0#Z7P!N!D24/]V_NC*&H/$!/]V
M!NAP 8/$ CT '0#Z5X!N#H 4/]V!.CB%8/$!#T '42N%P 4/]V!.C0%8/$
M!#T '0'N B^5=PX,^#1( =12X'A)0Z 8"@\0"4.A) 8/$ J,+$H,^"Q(
M=0>X "+Y5W#QT;Z #'1OP (M&_-'@B_ #-@L2@SP =0/I[0"+1OS1X(OP
M S8+$O\T_W8&Z#(:@\0$_W8&Z 45@\0"+0$ B_ #=@: /%QT#;@C$E#_=@;H
M,1J#Q 3_=@3_=@;H)1J#Q 2X+@!0_W8$Z"P5@\0$/0 =!G_=@;HEP"#Q (]
M !T",=&^@$ Z8 Z7< _W8&Z*L4@\0"B_ #=@:)=OZX)1)0_W;^Z+H9@\0$
M_W8&Z& @\0"/0 = ?'1OH! .M*N"H24/]V_NB8&8/$!/]V!N@^ (/$ CT
M '0'QT;Z 0#K*+@O$E#_=O[H=AF#Q 3_=@;H' "#Q (] !T!\=&^@$ ZP;_
M1OSI /^+1OJ+Y5W#58OL,\G_=@2X3@!0Z$@NB^4] !U![@! %W#ZP6X !=
MPUW#58OL@^P(BW8$@#P =0>X "+Y5W#QT;Z 0#'1OX (MV! -V_H \ '03
MBW8$ W;^@#P[=0/_1OK_1O[KXHM&^@4! -'@4.AZ 8/$ HE&^(M&^M'@B_ #
M=OC'! QT;\ #'1OX (M&_CM&^GU BW8$ W;\BT;^T>"+^ -^^(DUBW8$
M W;\@#P[=!"+=@0#=OR / !T!?]&_.OEBT;\_T;\BW8$ _#&! #_1O[KN(M&
M^(OE7<-5B^R#[#;_=@2-1N10Z&<8@\0$N#024(U&Y%#H>QB#Q 2-1N10Z"L3
M@\0"B4;X!HS('1 CL FH2P !Z/\&L=&R@ QT;B #&1LX _W;XC4;.4(U&
MY%#H"1.#Q 8] !T4H-^R@!U3(M&XHE&_AZ.'OP:BW;^@#P =0?'1LH! .LO
MQT;, "+1LP[1OA]$XMV_@-VS(M^S(H$B$/._T;,Z^6+1N+_1N*+\( \ '0"
MZ_$?ZYB#?LH =!6X 0!0Z$P @\0"B4;\BW;\Q@0 ZS>+1N(K1OXK1OB)1OK_
M=OKH+ "#Q *)1OR+1O@!1OY1!AZ,V8[!CA[\&HMV_HM^_(M.^O.D'P=9BT;\
MB^5=PU6+[(/L O]V!.CA$H/$ HE&_CT '4*N $ 4.B3*X/$ HM&_HOE7<-5
MB^R#[ *#/C82"GP'N)S_B^5=P[L #/ M$7'!@(; #-(7,&QP8"&P$ HP ;
M@SX"&P!T":$ &_?8B^5=PZ$V$O\&-A+1X(OP@<8$&Z$ &XD$BT8$H_X:BQ;^
M&C/ M#W'!@(; #-(7,&QP8"&P$ HP ;@SX"&P!T":$ &_?8B^5=PZ$ &XE&
M_HM&_J, &XL> !LSR3/ M$;'!@(; #-(7,&QP8"&P$ HP ;@SX"&P!T":$
M&_?8B^5=PXM&_J, &XL> !LSP+0^QP8"&P S2%S!L<& AL! *, &X,^ AL
M= FA !OWV(OE7<.X "+Y5W#58OL@SXV$@!_!;B<_UW#_PXV$J$V$M'@B_"!
MQ@0;BS2)-@ ;BQX &S/),\"T1L<& AL ,TA<P;'!@(; 0"C !N#/@(; '0'
MH0 ;]]A=PZ$V$M'@B_"!Q@0;BS2)-@ ;BQX &S/ M#['!@(; #-(7,&QP8"
M&P$ HP ;@SX"&P!T!Z$ &_?87<.X !=PU6+[(/L!,=&_ @SXX$@I\![B<
M_XOE7<.[ 0 SP+1%QP8"&P S2%S!L<& AL! *, &X,^ AL = FA !OWV(OE
M7<.A.!+_!C@2T>"+\('&&!NA !N)!(MV!( \/G0#Z4$ _T8$QT;\ 0"+1@2C
M_AJ+%OX:,\"T/; !QP8"&P S2%S!L<& AL! *, &X,^ AL = FA !OWV(OE
M7<.A !N)1OZ#?OP ="\STC/)BQX &[1"L +'!@(; #-(7,&QP8"&P$ HP ;
M@SX"&P!T":$ &_?8B^5=PX-^_ !U-XM&!*/^&HL6_AHSR;0\QP8"&P S2%S
M!L<& AL! *, &X,^ AL = FA !OWV(OE7<.A !N)1OZ+1OZC !N+'@ ;N0$
M,\"T1L<& AL ,TA<P;'!@(; 0"C !N#/@(; '0)H0 ;]]B+Y5W#BT;^HP ;
MBQX &S/ M#['!@(; #-(7,&QP8"&P$ HP ;@SX"&P!T":$ &_?8B^5=P[@
M (OE7<-5B^R#/C@2 '\%N)S_7</_#C@2H3@2T>"+\('&&!N+-(DV !N+'@ ;
MN0$ ,\"T1L<& AL ,TA<P;'!@(; 0"C !N#/@(; '0'H0 ;]]A=PZ$X$M'@
MB_"!QA@;BS2)-@ ;BQX &S/ M#['!@(; #-(7,&QP8"&P$ HP ;@SX"&P!U
M ^D' *$ &_?87<.X !=PU6+[* [$K0 4* Z$K0 4/]V!.AX (OE_@8Z$H ^
M.A)Z=@G^!CL2Q@8Z$F%=PU6+[(/L0H ^.Q)A=P> /CH2879(_@XZ$H ^.A)A
M<PG&!CH2>OX..Q*@.Q*T %"@.A*T %"-1K]0Z"4 @\0&N$$ 4(U&OU"-1K]0
MZ(+5@\0&C4:_4.A; (/$ NNJB^5=PU6+[.A$ %#_=@3H$Q.+Y;@\$E#_=@3H
M*1.+Y8MV!( \ '0%_T8$Z_.+1@3_1@2+\(I&"(@$BT8$_T8$B_"*1@:(!(MV
M!,8$ %W#58OLN$(27<-5B^R+1@2C+!N+%BP;,\"T0<<&+AL ,TA<P.C+ANA
M+AOWV%W#5;0/S1"B?A**S+4 B0YZ$H@^?Q+&!H 2!SP$<@D\!W0%Q@: $@"T
M %W#PU6+[(I&!+0 S1#HR/]=PU6+[(M6!HM&!(KPBCY_$K0"S1!=PU6P #/)
MBC9\$O[.BA9Z$O[*BCZ $K0&S1!=PU6*/G\2M /-$(H.>A(JRK4 L""*'H 2
MBCY_$K0)S1!=PU7HV_^T XH^?Q+-$+ BN[^Q3HN?!)T%K$ BC9\$O[.BA9Z
M$O[*BCZ $K0&S1!=PZ%Z$DA0H7P22% SP%"@@1)0L %0Z 0 @\0*PU6+[(I&
M!(IN!HI."(IV"HI6#(H^@!*T!LT07<.A>A)(4*%\$DA0,\!0H($24+ !4.@$
M (/$"L-5B^R*1@2*;@:*3@B*=@J*5@R*/H 2M ?-$%W#58OLBD8$BCY_$K0.
MS1!=PU6T ,T6/ !U&+M($H _ '0).B=T!8/# NOR0XH'M !=P[0 7<-5M '-
M%K@ '0#Z,[_7</#58H^?Q*T",T0"L!U K @M !=PU6 /GX2!'('@#Y^$@=U
M![D #[0!S1!=PU6Y#0R /GX2!W3ON0<&@#Y^$@1RY5W#5;#;BAZ $KD! (H^
M?Q*T"<T07<-5B^RT \T0BW8$N0$ BEX&_*P*P'0Y/ IU%(OLB78$L VT#LT0
MM ZP"LT07>O2BCY_$K0)S1#^PH#Z4'(,L@#^QCHV?!)R NO1M +-$.O!7<-5
MB^R+1@8M 0!0BT8$+0$ 4.@1_HOE7<-5B^R#[ 3'1OX ,=&_ QP:.$@ /
MN! 4.BJ"H/$ L<&CA( [@0 %#HF@J#Q *AE!**Q+0 B4;^H902)?\ B4;\
MBT;^!0$ B^5=PU6+[(/L!,=&_@ QT;\ #'!HX2 ^X$ !0Z%T*@\0"QP:.
M$@ #N! 4.A-"H/$ J&4$HK$M ")1OZAE!(E_P")1OR+1OP% 0"+Y5W#58OL
MN% 7<-5B^RX&0!=PU6+[.CJ_U#H[O]0Z##_B^6#?@0 ?@ZX"@!0Z$ DB^7_
M3@3K[%W#58OLZ%0 /0 =!:#?@0 = C'!I(2 ?K!L<&DA( #.L4@WX$ '0(
MQP:2$@ $ZP;'!I(2 ;H(@ ] !T!X,&DA(-ZP6#!I(2!\<&CA( ;@0 %#H
MH0F+Y5W#58OLM _-$#+DHS ;@SXP&P=U",<&,!L! .L&QP8P&P H3 ;7<-5
MB^SHS/Q=PU6+[(/L!HM&!(E&^HMV^H \ '4#Z8$ BW;Z@#P*=1#HAOX% 0")
M1O['1OP! .LRBW;ZB@2B,ANT"KD! +< H#(;S1"T [< S1")%C,;N0D H3,;
MT^B)1OZA,QLE 0&)1OSHWOXY1OQ^",=&_ $ _T;^Z-;^.4;^?@W_3OZX 0!0
MZ,_^@\0"_W;\_W;^Z '^@\0$_T;ZZ73_B^5=PU6+[(/L$L=&]@ QT;T "+
M1O31X(OP W8,@SP = 7_1O3K[(M&" -&!(OX5^AV_E^+\%97Z';^7U[W[COX
M?@_H8_Z+^%?H9?Y?]^^)1@C_=@C_=@;_=@3HE .#Q :+^%?H2OY?._A^#[@!
M %#H1OZ#Q +_3@;KU_]V!/]V!NAS_8/$!/]V"NB>(H/$ O]V"NC1"(/$ HE&
M^O]V^O]V!O]V!.@A X/$!E#_=OK_=@;_=@3H.@.#Q 90Z#C]@\0$Z%H#B4;X
M/0 =0+K\XM>^.CW(PH K?^W00T 14*N_Y5"&P"^0K/_"4.U_QU#" I0[G_
M/T.Q_T=# (!60_]V"NAB"(/$ CM&^G\#Z7H BT8* T;ZB4;RBT;R!0$ 4/]V
M\NAE#8/$!,=&_@$ Z.X"B4;\/:W_=2/_=@KH* B#Q ([1OI^$(M&\@4! %#_
M=O+H-PV#Q 3_1O[KTO]V_.@+ X/$ O]V\NC (8/$ L=&_ BT;\.T;^?P^X
M( !0Z)0A@\0"_T;\Z^GI#P*X !0Z$O]@\0"_W8*Z,H'@\0"B4;Z_W;Z_W8&
M_W8$Z!H"@\0&4/]V^O]V!O]V!.@S H/$!E#H,?R#Q 2X"@!0Z$8A@\0"N T
MB^5=P^F_ 8-^]@!T$;@ %#H]?R#Q +'1O8 .L/N $ 4.CD_(/$ L=&]@$
MZ98!_W8$_W8&Z.C[@\0$QT;^ 0#_=@KH2@>#Q ([1OY\#[@@ %#HZB"#Q +_
M1O[KXXMV"L8$ ,=&^@ QT;V "X !0Z)3\@\0"Z4L!_W8*Z! '@\0".T;Z
M?@/_1OKI-P&#?OH ?@/_3OKI*P&#?OH ?@W_3OJXK?]0Z.P!@\0"Z14!QT;Z
M #I#0'_=@KHT@:#Q *)1OKI_@#'1OX (M&_CM&]'T^BT;^T>"+\ -V#(LT
M.W;X=2BX !0Z!S\@\0"_W8$_W8&Z"C[@\0$L *T /=N_HMV# /PBP2+Y5W#
M_T;^Z[J*1OBT %#HU!Z#Q (] !U ^F= (I&^+0 4.C)'H/$ CT '0#Z8D
M@W[V '4G_W8*Z$H&@\0".T;Z?AF+=@H#=OJ*1OB(!/]V^.C@'X/$ O]&^NM<
M_W8*Z",&@\0".T8(?4[_=@KH%0:#Q (#1@H% 0")1O*+1@H#1OH[1O)S%HM&
M\BT! (OPBT;R_T[RB_B*!(@%Z]^+=@H#=OJ+1OB(!(M&"@-&^E#HEQ^#Q +_
M1OKK /]V^O]V!O]V!.@A (/$!E#_=OK_=@;_=@3H.@"#Q 90Z#CZ@\0$Z?W\
MB^5=PU6+[(/L HM&" %&!.C1^HE&_HM&!#M&_GX(BT;^*48$Z_"+1@2+Y5W#
M58OL@^P"BT8( 48$Z*CZB4;^BT8$.T;^?@R+1OXI1@2#1@8!Z^R+1@:+Y5W#
M58OL@^P"H802B4;^/0 = W'!H02 "+1OZ+Y5W#Z#@ /0 =0>X "+Y5W#
MZ/,>M ")1OX] !U#>CF'K0 N?__]^F)1OZ+1OZ+Y5W#58OLBT8$HX027<-5
MB^RX !0N L 4.@+'XOE7<,
M
M
M
M
M NQ@9*10$N
MC Y"1;M#1XX&[1(NC 9(12:A+ NHRI&ZRHNQ@9*10 NC!Y"12Z))D1%+HDN
M1D6.!NT2+HP&2$4FH2P +J,J1HL>[Q(.![]+15I>_*RJ"L!U^EY6OWE%+HD^
M+$8N_PXL1BZ,#BY&L0"LJO[!"L!U^/[)+H@.>$6P#4^J7E)24K_Z12Z)/C!&
M+HP.,D:P ;0IS2&_"D8NB3XT1BZ,#C9&L &T*<TA^HX6[1*\ '[#A^Q!-/K
M+@,>0D5#+BL>2$4NC@9(1;1*S2$.![LJ1KI+1; M$O-(;C__W($M$W-(2Z
M/DI% 707+HX>0D7Z+HX60D4NBR9$1?LNBRY&1<.T +1,S2%5B^RT*LTAC-B.
MP(M^!(OW_(K>Z%0 @#PP=0/&!""P+:J*VNA$ + MJH'I; >*V>@X + JEW#
M58OLM"S-(8S8CL"+?@2+]_R*W>@= ( \,'4#Q@0@L#JJBMGH#0"P.JJ*WN@%
M + JEW#BL.T +<*]O<$,*J*Q 0PJL-5B^R#[ *+=@:*'+< @_MA?0/ISP"#
M^W=^ ^G' (/K8='C+O^GY4=32*)(HDBB2*)(HDBB2*)(HDBB2*)(HDBB2*)(
MHDBB2*)($TBB2*)(HDBB2#5(N ( 4/]V!.AG"(/$!(E&_CW__W4&L "T .L#
MBT;^B^5=P_]V!.A/!X/$ HE&_CW__W4&L "T .L#BT;^B^5=P[@" %#_=@3H
M)PB#Q 2)1OX]__]T'+@" %"Z "X !24/]V_N@M X/$"(M&_HOE7</_=@3H
M >#Q *)1OX]__]U!K M #K XM&_HOE7<.X "+Y5W#B^5=PU6+[/]V!.A%
M$HOE7<-5B^R#[ *+1@CW9@90_W8$_W8*Z +@\0&B4;^@W[^_W0&@W[^ '4&
ML "T .L(BT;^,]+W=@:+Y5W#58OLBT8(]V8&4/]V!/]V"N@=#HOE/?__=0:P
M +0 ZP.+1@A=PU6+[/]V"O]V"/]V!O]V!.A\ HOE7<-5B^RX !0N@ N
M4E#_=@3H8P*+Y9E=PU6+[/]V!.B?$XOE7<-5B^S_=@:*1@2T %#H716+Y5W#
MB2Z($EJ)%HH2B2:&$K@ /_B6EI8BR:&$HLNB!+_)HH2 %6+["Z))HI)
M+HP>C$F*1@0NHLE)H8X2BQZ0$HL.DA*+%I02BS:6$HL^F!*.!IH2@SZ<$O]T
M!(X>G!+- RZ+)HI)'BZ.'HQ)CP:<$L8&C!( <P7&!HP2 <8&C1( =07&!HT2
M 8OLHXX2B1Z0$HD.DA*)%I02B3:6$HD^F!*,!IH27<-:6% \07(&/%IW @0@
M_^):7E8SP( \ '0$0$;K]__B6E]>68/L!NL)6E]>@^P$N>C]B@0X!7(/=Q)&
M1PK = +B\+@ /_BN/___^*X 0#_XEI>6X/L!/PSR:PZPW4#C4S_"L!U](O!
M_^):7EN#[ 3\K K = 8ZPW0&Z_6T /_BC43__^+HD1E:65%2B]0KT'(B*]%R
M'H/J!'89HYX2HZ 2B]C&!YV)5P&+P@/:@\,#Q@?&PS/ PX,^GA( =0RX 10
MZ,#_"\!8=.I:65%2BQZ@$HL^H!**!SR==5$Y3P%R+,8'JXM' 8U7 RO!/08
M=AF+\8=/ 0/>@\,#Q@>=B1Z@$BO.@^D#B4\!B\+#C7<# W<!@#R==16+1 $%
M P !1P$[]W6Q WP!@\<#ZZD#7P&#PP,\QG4$BQZ>$CO?=9<SP,-:6U-2@^L#
M@#^K=?'&!YVX 0##58OL_W8&Z%G_60O =!"+=@3&1/V=B_@>!_SSI%W#73/
MPU6+[(M&!/=F!E#H,_]9"\!TZHOX'@?\B]"P /.JB\)=PU6+[(/L#(%F!/\'
M@WX$!'X,@WX$#'\&@'X* G8*NO__N/__B^5=P\<&O!)C (M&!-'@B_"!QJ(2
MQP3__XM&!"T% -'@B_"!QK\:BS2)-CT5BS8]%8H$B$;Y@'[Y '4*NO__N/__
MB^5=PXLV/16*1 *(1OC_=@3H<@^#Q *+-CT5QD0" (!^^0-U!XLV/17&! 2
M/O$2 '19@'[X '4;@'X* 745BS8]%8L^/16+= 4K=0,I=@:#7@@ H3T5!3
MBS8]%8E$!8LV/16)1 .*1@JT %#_=@C_=@:+1@0M!0#1X(OP_[3/&NCB%X/$
M"(OE7<. ?@H!=4>^!P"!YO\ S8]%8L$,]*Q!^@$&0%&!A%6"(LV/16A/14%
M, "+^(MT ROWB7;\@W[\ '03BT;\ 48&@U8( (%N!H @UX( (!^"@)T'+$'
MBU8(BT8&Z+48BS8]%8M,"3/;Z- 4?0/IA "+-CT5@'P!@'0#Z7< BS8]%:$]
M%04+ (OXBW0)B74AQT4C "A/14%, !0N!H 4.@0%X/$!*$]%04+ %"X(0!0
MZ/\6@\0$/0 = JZ__^X__^+Y5W#QD;Y@(!^^0!T&?Y.^:$]%04P (OPBD;Y
MM #\( \&G4"Z^&*1OD$ 8LV/16(1 & ?@H"=2V+-CT5OPD @>?_ ,^/16+
M!3/2L0?H#1B+VHO(BD0!M ST@/!$],!1@815@B!?@@ 78*QT8& #'1@@
M (LV/16_"0"!Y_\ SX]%8L%,]*Q!^C/%XO:B\B*1 &T #/2 \$3TXE&](E6
M]HM6"(M&!HM>]HM.].C'$W\#Z80 N 4/]V]O]V]/]V!.B'_8/$"+O__[G_
M_^BF$W4*NO__N/__B^5=PXM6"(M&!HM>]HM.]"O!&].)1OR#?OP =#F#?OP0
M=@:P$+0 ZP.+1OR)1OK_=OJX-1M0_W8$Z+0(@\0&/?__=0JZ__^X__^+Y5W#
MBT;Z*4;\Z\&+5@B+1@:+Y5W#L0>+5@B+1@;H#!>+#CT5@\$+B_&)1"&+-CT5
MB40'H3T5!0L B_#'1", *$]%04P %"X&@!0Z'P5@\0$H3T5!0L 4+@A %#H
M:Q6#Q 2A/14%, "+-CT5B40%BS8]%8E$ XM6"(M&!HE&_H-F_G^#?OX ="BA
M/14%, !0_S8]%>@Y!X/$!(E&_(LV/16+1OX!1 .+-CT5BT;\ 40%BU8(BT8&
MB^5=PUI?7EF#[ ;K"5I?7H/L!+GH_8O'BAR('49'"MMT N+T_^);7UY9@^P&
MZPE;7UZ#[ 2YW/^+QXH5"M)T T?K]XH4B!5&1PK2= 7B],8% /_C58OL@^P$
MN ( 4/]V!.A- H/$!(E&_H-^_@1_ ^G1 (M&_BT% +FP /?I!3\5B_"+1OXM
M!0#1X(OX@<>_&HDUB38]%8 ^\1( =![_=@3HRA2#Q *+3OZ#Z071X8OQ@<;/
M&HD$B$;]ZR6A/14%"P!0N!, 4.A)%(/$!*$]%04+ %"X%@!0Z#@4@\0$B$;]
M@'[]_W4'QT;^___K5HLV/17&! .+-CT5QD0" (LV/17&1 $ H3T5!3 BS8]
M%8E$!8LV/16)1 .+-CT5QT0) "+-CT5QT0' "A/14%"P"+\,=$# H3T5
M!0L B_#&1" BT;^#0 (B^5=PU6+[(/L!(I&!HA&_(!^!@)V!(!N!@. ?@8"
M=@>X__^+Y5W#BD8&M !0_W8$Z#0!@\0$B4;^@W[^!'\#Z1L!BT;^+04 N;
M]^D%/Q6+\(M&_BT% -'@B_B!Q[\:B36)-CT5@#[Q$@!T)(I&!K0 4/]V!.B^
M$X/$!(M._H/I!='AB_&!QL\:B02(1OWK%*$]%04+ %"X#P!0Z"H3@\0$B$;]
M@'[]_W4(QT;^___IJ@ SP(!^_ -R 4"+=OZ(A-\:H3T5!0L B_#'1 P *$]
M%04+ (OPQD0@ *$]%04+ (OPBD00)'^+-CT5B$0!H3T5!0L B_"Q!XM4$HM$
M$.@H%(LV/16)1 F+-CT5@'P! '49BS8]%8-\"0!T#XLV/17&1 & BS8]%?],
M"8LV/17'1 < *$]%04P (LV/16)1 6+-CT5B40#BS8]%<9$ @"*1@8$ 8LV
M/16(!(M&_@T "(OE7<-5B^R#[$J-1K>)1OJ+=@2 /&%R&XMV!( \>G<3BT8$
M_T8$B_"*!"P@BW;ZB 3K#XM&!/]&!(OPBW[ZB@2(!8M&^O]&^HOP@#P =<&X
MOA)0C4:W4.AH 8/$!#T '04@'X& '4&L "T .L$L &T (OE7<.XPQ)0C4:W
M4.A! 8/$!#T '43N,@24(U&MU#H+@&#Q 0] !T![@$ (OE7</'1OX (-^
M_@A\ ^D* 8M&_KFP /?I!3\5B_" / !T ^GO (M&_KFP /?I!3\5B4;ZQT;\
M "#?OPE?1.+1OH%"P"+\ -V_,8$ /]&_.OGC4:WB4;X@'ZX.G43BD:W+$"+
M3OJ#P0N+\8@$@T;X L=&_ $ @W[\"7U#BW;X@#PN=":+=OB / !T'HM&^/]&
M^(OPBT;\_T;\BT[Z@\$+B_D#^(H$B 7K$XM&_/]&_(M.^H/!"XOQ _#&!"#K
MMXMV^( \+G4#_T;X@W[\#'T[BW;X@#P =!Z+1OC_1OB+\(M&_/]&_(M.^H/!
M"XOY _B*!(@%ZQ.+1OS_1OR+3OJ#P0N+\0/PQ@0@Z[^+1OX%!0"+Y5W#_T;^
MZ>W^N/__B^5=PU6+[(MV!(M&!O]&!HOXB@0Z!70%N 7<.+1@3_1@2+\( \
M '7=N $ 7<-5B^R#[ R+1@:)1OV!9@3_!X-^! !\#(-^! Q_!H-^! 1U![C_
M_XOE7<.+1@B)1OB#?@0"?T>#?O@ =#?_=@3HWPB#Q *)1O0] !\#(-^]!IT
M!H-^] IU NL8@W[T#700BT8&_T8&B_"+1O2(!/].^.O#BT8(*T;XB^5=PXM&
M!"T% -'@B_"!QK\:BS2)-CT5BS8]%8H$B$;_@'[_ '0&@'[_ G4'N/__B^5=
MPXLV/16+/CT5BW0%*W4#B7;Z@W[Z '1>BS8]%8!\ @!T%XLV/16+/CT5BW0'
M.W4)=@>X "+Y5W#BT;Z.T8(=@:+1@B)1OJ#?OH ="G_=@:+-CT5_W0#_W;Z
MZ'80@\0&BS8]%8M&^@%$ XM&^@%&!HM&^BE&^(%^^( <F2 /O$2 '0U_W;X
M_W8&BT8$+04 T>"+\('&SQK_-.BR#X/$!HE&^H-^^O]U![C__XOE7<.+1OHI
M1OCIUP#_=@;_-CT5Z! !@\0$B4;ZBT;Z*4;X@7[Z@ !T ^FW (M&^@%&!NN5
M@W[X '4#Z:8 H3T5!3 BS8]%8E$ X ^\1( =#.X@ !0H3T5!3 4(M&!"T%
M -'@B_"!QL\:_S3H,P^#Q :)1OJ#?OK_=0>X__^+Y5W#ZQBX@ !0H3T5!3
M4/\V/17HD "#Q :)1OJA/14%, #1OJ+-CT5B40%BT;Z.T;X=@:+1OB)1OJ#
M?OH ="/_=@:+-CT5_W0#_W;ZZ%8/@\0&BS8]%8M&^@%$ XM&^BE&^(M&""M&
M^(E&^(E&^HMV!("\WQH =0/I(P#'1O@ (M&^#M&^G(#Z1, BW;] W;X@#P:
M=0/I!0#_1OCKXHM&^(OE7<-5B^R#[ *+=@2 ? ( =!__=@;_=@3H3 2#Q 0]
M@ !]![@ (OE7<.+=@3&1 ( _W8&N!H 4.C"#8/$!(M&! 4+ %"X% !0Z+$-
M@\0$B4;^@W[^ '4'QT;^@ #K+(-^_@%U!\=&_@ ZQ^#?OX#=12+1@0%"P"+
M\(I$$"1_M ")1O[K!<=&_@ @7[^@ !]!XM&_HOE7<.+=@2+?@2+= D[=0=U
M)(%&!H @W[^ '00_TX&BW8&@#P:=07_3O[KZHMV!(M&_HA$ 8MV!/]$!XM&
M_HOE7<-5B^R#[ B!9@3_!X-^! !\!H-^! Q^![C__XOE7<.+1@B)1OJ#?@0"
M?RJ+1OK_3OH] !T&/]V!(M&!O]&!HOPB@2T %#H5@>#Q 3KW8M&"(OE7<.#
M?@0$=2N+1OK_3OH] !T&8M&!O]&!HOPB@2T %"X!0!0Z*P,@\0$Z]R+1@B+
MY5W#BT8$+04 T>"+\('&OQJ+-(DV/16+-CT5B@2(1O^ ?O\"<P>X__^+Y5W#
MBS8]%:$]%04P (MT!2OPB7;XBS8]%:$]%04P #E$!703H3T5!3 B_"-M(
MBSX]%8EU!8LV/16+/CT5BW0%*W4#B7;\@W[\ '4#Z4,!BS8]%8!\ @!T ^E_
M (LV/17_3 >+-CT5H3T5!0L B_B+= >)=2''12, ( ^\1( ="2X 0!0BT;X
M]]B94E"+1@0M!0#1X(OP@<;/&O\TZ $,@\0(ZRZA/14%, !0N!H 4.C$"X/$
M!*$]%04+ %"X(0!0Z+,+@\0$/0 = >X__^+Y5W#BS8]%<9$ @&+1OP[1@AV
M!HM&"(E&_(-^_ !U ^F@ (LV/17_= /_=@;_=OSH>PR#Q :+-CT5BT;\ 40#
MBT;\ 48&BT;\*4;ZBS8]%8L^/16+= ,[=05U9X ^\1( ="^X@ !0H3T5!3
M4(M&!"T% -'@B_"!QL\:_S3HP N#Q 8]__]U![C__XOE7</K':$]%04P %#_
M-CT5Z'(!@\0$/0 =0>X__^+Y5W#H3T5!3 BS8]%8E$!8LV/16)1 .!?OJ
M ')=@#[Q$@!T*_]V^O]V!HM&!"T% -'@B_#_M,\:Z%D+@\0&/?__=06X___K
M XM&"(OE7</_=@;_-CT5Z P!@\0$B4;\BT;\*4;Z@7[\@ !S![C__XOE7<.!
M1@: .N<@W[Z '4#Z=L @'[_ W4#Z:0 @#[Q$@!U ^DK /]V^O]V!HM&!"T%
M -'@B_#_M,\:Z.<*@\0&/?__=06X___K XM&"(OE7<.+-CT5BSX]%8MT!SMU
M"7(:BS8]%8L^/16+= <[=0EU3XLV/16 ? $ =$6A/14%, !0N!H 4.@""H/$
M!(LV/16A/14%"P"+^(MT!XEU(<=%(P H3T5!0L 4+@A %#HV@F#Q 0] !T
M![C__XOE7<.+-CT5@40%@ "+-CT5_W0#_W8&_W;ZZ+@*@\0&BS8]%8M&^@%$
M XLV/17&1 (!BT8(B^5=PU6+[(/L O]V!K@: %#HA@F#Q 2+1@0%"P!0N!4
M4.AU"8/$!(E&_HMV!,9$ @"+=@3_1 >#?OX = :P +0 ZP2P@+0 B^5=PU6+
M[(%F!/\'@WX$!'\%N 7<.+1@0M!0#1X(OP@<:_&HLTB38]%8-^! Q_"8LV
M/16 / !U!;C__UW#_W8$Z%8 B^4]__]U!;C__UW#BS8]%<8$ ,<&O!)C ( ^
M\1( =!6+1@0M!0#1X(OP_[3/&NC&"8OE7<.X"P #!CT54+@0 %#HR0B+Y3W_
M '4%N/__ZP2P +0 7<-5B^R#[ *+1@0M!0#1X(OP@<:_&HLTB38]%8LV/16
M? ( =0/I[@"+-CT5H3T5!3 BW0#*_"+QHA&_X ^\1( =":*1O^T %"X, #
M!CT54(M&!"T% -'@B_#_M,\:Z.\(@\0&B^5=PXLV/16+/CT5BW0).W4'=42+
M-CT5@'P!@'4DBS8]%?Y, :$]%04P (OXBD0!M #^( ]&G4"Z^.+-CT5_D0!
MBS8]%8I$ 3I&_W8*BS8]%8I$ 8A&_XLV/16+/CT5BW0'.W4)<C:+-CT5BSX]
M%8MT!XEU"8LV/16*1O^(1 & ?O^ <QB*1O_^1O^+#CT5@\$PB_&T /PQ@0:
MZ^*A/14%, !0_S8]%>@1_H/$!.M#BS8]%8L^/16+= <[=0EV,XLV/16 ? &
M=!.+-CT5BW0)@\8!BSX]%3MU!W,6BS8]%8L^/16+= >)=0F+-CT5QD0! +@
M (OE7<-5B^R#[ 3'1OX (%F!/\'BT8$T>"+\('&HA*#//]T)HM&!-'@B_"!
MQJ(2BS2)=OR+1@31X(OP@<:B$L<$__^+1OR+Y5W#@WX$ GX#Z3\ @#[Q$@!T
M';@! %"-1OY0_W8$Z'8'@\0&/0 =07'1OX: .L&Z$<&B4;^@W[^&G0#Z04
MN/__ZP.+1OZ+Y5W#BT8$+04 T>"+\('&OQJ+-(DV/16+-CT5BSX]%8MT!3MU
M W8?BS8]%8!\ @!U%8LV/16+1 /_1 .+\(H$M ")1O[K';@! %"-1OY0_W8$
MZ #V@\0&/0$ = >X__^+Y5W#BW8$@+S?&@!T"X-^_AIU!<=&_O__BT;^B^5=
MPU6+[(/L H%F!/\'@WX$ G\4Z)\%B$;_Z)D%BT[^ \B+P8OE7<.+1@0M!0#1
MX(OP@<:_&HLTB38]%8LV/16+= .#Q@&+/CT5.W4%<R6+-CT5@'P" '4;BS8]
M%8MT XLTB7;^BS8]%8-$ P*+1OZ+Y5W#N ( 4(U&_E#_=@3H5O6#Q 8] @!T
M![C__XOE7<.+1OZ+Y5W#58OL@68&_P>+1@;1X(OP@<:B$H,\_W0%QT8$__^+
M1@;1X(OP@<:B$HM&!(D$BT8$7<-5B^R!9@;_!X-^!@)_+X ^\1( =!B#?@8"
M=1*X 0!0C48$4/]V!NCW!8OE7<.*1@2T %#HU@2+Y;@ %W#@WX&!'44BD8$
MM !0N 4 4.@W!8OEN 7<.+1@8M!0#1X(OP@<:_&HLTB38]%8LV/16+= .#
MQ@&+/CT5.W4%<@/I( "+-CT5@'P" '06BS8]%8M$ _]$ XOPBD8$B 2X !=
MP[@! %"-1@10_W8&Z+/WB^5=PU6+[+@" %"-1@10_W8&Z)[WB^5=PU6+[(/L
M!(%F"/\'@WX(!'\6@#[Q$@!U#_]V!.C; (/$ HOE7</K5HM&!(E&_/].!H-^
M!@!T-/]V".@K_8/$ HE&_CT 'PC@W[^&G0=@W[^#70-BT8$_T8$B_"+1OZ(
M!(-^_@IU NL"Z\.+=@3&! "+1OP[1@1U!<=&_ BT;\B^5=PU6+[(/L H%F
M!O\'@WX& G\0_W8$Z+X#@\0"N B^5=PXM&!/]&!(OPB@2(1O\\ '0\@'[_
M"G49_W8&N T 4.AR_H/$!#W__W4'N/__B^5=P_]V!HI&_[0 4.A7_H/$!#W_
M_W4'N/__B^5=P^NSN B^5=PU6+[+@ E"+1@2C11M0Z < B^6A11M=PU6+
M[(/L!L=&_@ @#[Q$@!T0[@ %#_=@;_=@3HT/Z#Q :)1OZ#?OX =!V+=@2
M/ !T$XMV!( \"G4&BW8$Q@0 _T8$Z^7K!L<&11L (M&_HOE7<.+1OX[1@9\
M ^F] .C\ HA&^XI>^[< Z'L$" # "MA" X87\ .&$8 &%A&@",80H DF$-
M ))A ("98;C-$E#HL0*#Q +H4@*#?OX ="'_3OZX" !0Z(8"@\0"N" 4.A\
M H/$ K@( %#H<@*#Q +K5(-^_@!T(_]._K@( %#H70*#Q *X( !0Z%,"@\0"
MN @ 4.A) H/$ NO7ZRG'!D4; #'1@8 .L<BD;[M !0Z"P"@\0"BT;^_T;^
MBW8$ _"*1ON(!.DX_XMV! -V_L8$ +@* %#H!@*#Q *+1OZ+Y5W#.]-U%WD+
M.\%T$; !<@L\ L,[P70&L %R]3P PUI84#QA<@8\>W,"+""T /_B6EA0/#!R
M"3PZ<P6X 0#_XC/ _^):6% \87("+" \07()/%IW!;@! /_B,\#_XEI84#Q!
M<O4\6G?QZ^I:6% \87+H/'IWY.O=6EA0/"!TUCP)=-(\"G3./ UTRNO-6EA0
M4E#HK_];"L!T <-:6% \,'()/#IS!;@! /_B,\#_XEI84#R <I_KHEI84#P@
M<I8\?W22ZY5:6% \('*./']RA>N(6EA04E#HZ_];"L!U <-:6%!24.BE_ULU
M 0##-HP>[1*A @",TRO#=P/ITP!(/0 0<@.X_P^Q!-/@.\1S ^F_ #:+'@
M-@,> @"#PW\[XW4"B^ VB2;O$K0PS2$\ G(&-L8&\1(!Q@;_ W&!H (+D!
M +[__T:*A($ / UT!#P*=?.X !0]\8! '0!1(O\*^:+[$Z#_O]T)HJ$@0 \
M('0$/ EU!+ ZQ* O( ('0'@+R EU!(T:4T&( NO45XOL55&,T([8BSX
M (L. @".P+ _/.J@\<"@^?^B3[K$NA]G+ ZP)86( ^\1( = 2T3,TA_S;M
M$K@ %#+N-D24.@\ (/$ K "Z]Z /O(2 '0*H/(2Q@;R$@#K!+0!S2&T #P:
M= '#N/__PUA:4E" ^@IU![(-Z ( L@JT LTAPUA;4U"*!PK = Q34.C<_X/$
M EM#Z^[#@#[R$@!T"Z#R$L8&\A( M ##M ?-(;0 P[0&LO_-(:+R$K0 PUA:
M4E"T!LTAPZ'K$L-:B\3_XEI;.^QU HOKB^-3_^*,V,.,R,-:'Q[_XE6+[(IF
M!(M6!LTAM !=PU6+[(M6!(S8CL"+?@:T5LTAN <P.X__]=PU6+[(I&"HM>
M!(M6!HM."+1"S2%S!KC__[K__UW#58OLBU8$M$'-(;@ ',#N/__7<-5B^R+
M5@0SR;0\S2%S [C__UW#58OLBU8$BD8&M#W-(7,#N/__7<-5B^R+7@2+3@B+
M5@:T/\TA<P.X__]=PU6+[(M>!(M."(M6!H/[ G8%@_L$=2"+\H \"G4)NO02
MZ"0 BU8&Z!X _T8&_TX(BU8&=>+K#[1 4<TA63O!=0)S [C__UW#N0$ 4[1
MS2%;PU6+[(M>!(/[!+@ '8,M#[-(;@ ',#N/__7<-5B^R+3@2+=@:+?@B,
MV([ _#OW<Q<#\8/N @/Y@^\"_='I\Z5S T9'I/Q=P]'I\Z5S :1=PUXNBPR#
MQ@(NBP0] (!T"SO8=!"#Q@3B[__B+HM4 H/&!.OD+O]D K4 XP;1ZM'8XOK#
MM0#C!M'@T=+B^L, (" @(" @ '( 0V]U;&0@;F]T(&]P96XZ( @ " 5&]O
M(&UU8V@@:6YP=70@<F5D:7)E8W1I;VXN"@!4;V_U$E(( &8
M
M "< 3 $P "< !C
M) T N/^P_[?_K__=_^?_ *0V]N8V@@5F5R<VEO;B ,2XP,0 @(" @("!#
M;W!Y<FEG:'0@4FEC:&%R9"!7(%-E;&QE;G,@,3DX-0H* %1H:7,@<')O9W)A
M;2!I<R!S:&%R97=A<F4N($EF('EO=2!U<V4@:70@<F5G=6QA<FQY('!L96%S
M92!S96YD("0R-2!T;SH*"@ @(" @(%)I8VAA<F0@5RX@4V5L;&5N<PH@(" @
M(#,W,D$@0VAU<F-H:6QL($-O=7)T"@ @(" @(%=A=&5R;&]O+"!/;G1A<FEO
M"B @(" @0V%N861A("!.,DP@-D(T"@H "B!3;W)R>2P@=&AI<R!P<F]G<F%M
M(')E<75I<F5S($1/4R R+C @;W(@:&EG:&5R('1O(')U;BX*"@!04D]-4%0
M8V]N8VAR8P @(" @(" (" @(" @ #X^/CX^( @(" @(" <@!#;W5L9"!N
M;W0@;W!E;CH@ " ( !4;V\@;75C:"!I;G!U="!R961I<F5C=&EO;BX* %1O
M;R!M=6-H(&]U='!U="!R961I<F5C=&EO;BX* " /@ @ #P /@ @ " 8V]M
M;6%N9 !C9 !4<GEI;F<@=&\@9FEN9"!C;VUM86YD('1O(&UA=&-H.B 5')Y
M:6YG('1O(&5X96-U=&4Z( @ $1E=FEC92!D;V5S(&YO="!E>&ES=#H@ #I<
M %1R>6EN9R!T;R!C:&%N9V4@9&ER96-T;W)I97,@=&\Z( !M;W)E+BXN " @
M(" @(" * $]U="!O9B!-96UO<GDN $)A9"!#;VUM86YD($YA;64N $EN<W5F
M9FEC:65N="!0;VEN=&5R(%-P86-E+@!"860@06QI87,@3F%M92X 3F\@36]R
M92!3<&%C92!I;B!-86EN($)U9F9E<BX 17AT<F$@07)G=6UE;G1S(%-U<'!L
M:65D('1O($EN=&5R;F%L($-O;6UA;F0N $)A9"!$979I8V4@3F%M92X 0F%D
M(%!A=&@@3F%M92X 0V]M;6%N9"!4;V\@3&]N9R!7:&5N($5X<&%N9&5D+@!7
M87)N:6YG("TM(%5N;6%T8VAE9"!3:6YG;&4@;W(@1&]U8FQE(%%U;W1E<RX
M0F%D($9I;&5N86UE+@!296-U<G-I;VX@5&]O($1E97 @+2T@3F5E9"!,87)G
M97(@365M;W)Y(%9E<G-I;VXN $-O=6QD($YO="!/<&5N($9I;&4@+2T@4')O
M8F%B;'D@1&ES:R!&=6QL+@!%<G)O<B!7<FET:6YG($9I;&4@+2T@4')O8F%B
M;'D@1&ES:R!&=6QL+@!);&QE9V%L($-H87)A8W1E<B!I;B!.86UE("TM($$M
M6BP@,"TY+" D(R9 (24H*2U[?5\@4&5R;6ET=&5D+@!5;G-P96-I9FEE9"!E
M<G)O<BX "@ * H "@!C;VYC:#X@ #I< $-O;F-H(%9E<G-I;VX@ #$N,#$
M86QI87, 8V0 97AI= !H:7-T;W)Y '!E;F1I;F< <F1E=@!S;W5R8V4 ='-U
M8@!U;F%L:6%S '9D978 86QI87, 8V0 97AI= !H:7-T;W)Y '!E;F1I;F<
M<F1E=@!S;W5R8V4 ='-U8@!U;F%L:6%S '9D978 +F)A= !C;VUM86YD+F-O
M;0 O8R ( #_
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M !4<GEI;F<@
M=&\@9&5F:6YE(&YA;64Z( !4<GEI;F<@=&\@9&5F:6YE('9D978Z( !4<GEI
M;F<@=&\@9&5F:6YE(')D978Z( !4<GEI;F<@=&\@=6YA;&EA<SH@ %1R>6EN
M9R!T;R!R96UO=F4@=F1E=CH@ '< 5')Y:6YG('1O(&]P96X@9FEL93H@ "!F
M;W(@;W5T<'5T+@ * %1R>6EN9R!T;R!W<FET92!O;B!F:6QE.B "@!4<GEI
M;F<@=&\@=W)I=&4@;VX@9FEL93H@ '( 5')Y:6YG('1O(&]P96X@9FEL93H@
M "!F;W(@:6YP=70N N0T]- "Y%6$4 +D)!5 !0051( %P +D-/30 N
M15A% "Y"050 /0 86$E<&EP90!T96UP.@!('E ?2QU-'$?(3\E)RE'+
M=\QUS5+.4\]ST730.](\TSW4/M4_UD#70=A"V4/:1-L _U &0 <"
M #_____________________
M_____________V, 0T]..@!04DXZ $Q35#H *D-O;G1R;VP@0RH ;F]T(&5N
M;W5G:"!M96UO<GD* #2X 0F%D($%L:6%S($YA;64N $YO($UO
M<F4@4W!A8V4@:6X@36%I;B!"=69F97(N $5X=')A($%R9W5M96YT<R!3=7!P
M;&EE9"!T;R!);G1E<FYA;"!#;VUM86YD+@!"860@1&5V:6-E($YA;64N $)A
M9"!0871H($YA;64N $-O;6UA;F0@5&]O($QO;F<@5VAE;B!%>'!A;F1E9"X
M5V%R;FEN9R M+2!5;FUA=&-H960@4VEN9VQE(&]R($1O=6)L92!1=6]T97,N
M $)A9"!&:6QE;F%M92X 4F5C=7)S:6]N(%1O;R!$965P("TM($YE960@3&%R
39V5R($UE;6]R>2!697)S:6]N+G)S
endrsellens@watdcsu.UUCP (Rick Sellens - Mech. Eng.) (09/26/85)
--------------cut here----------------------------------------------------
\def\vertone{0in} % vskip after section, heading titles
\def\verttwo{.1875in} % vskip before section, heading titles
\def\vertthree{.5in} % vskip between chap no. and title
\def\vertfour{.5in} % vskip after chapter title
\def\vertfive{12pt} % vskip between table of contents entries
\def\tcindent{\hskip 1em\relax} % Size of table of contents indents.
\font\secfont=amr10 scaled\magstep1 % for section titles
\font\headfont=amr10 scaled\magstep1 % for heading titles
% and "Chapter Number XX" lines
\font\chapfont=amr10 scaled\magstep2 % for chapter titles
\newbox\tcbox % box to hold the table of contents
\global\setbox\tcbox=\vbox{ }
\newbox\refbox % box to hold the refences list
\global\setbox\refbox=\vbox{ }
\newcount\chapno % chapter number of current chapter
\newcount\chappage % page current chapter began on
\newcount\secnoone % current first level section number
\newcount\secnotwo % current second level section number
\newcount\secnothree % current third level section number
\newcount\secnofour % current fourth level section number
\newcount\eqnumcount % number of last equation
\newcount\refno % number of last reference
\chapno=0
\chappage=1 % put the number at the bottom on page one
\secnoone=0
\secnotwo=0
\secnothree=0
\secnofour=0
\eqnumcount=0
\refno=0
% Adds a table of contents entry.
%
\def\addtblcon #1#2{
\global\setbox\tcbox=\vbox{\unvbox\tcbox \vskip\vertfive
\line{\rm{#1}\ifnum #2=0 \hfil \else \dotfill{#2} \fi}}}
% Adds a two line table of contents entry.
%
\def\addtblcontwo #1#2#3{
\global\setbox\tcbox=\vbox{\unvbox\tcbox \vskip\vertfive
\rm\baselineskip=14pt
\line{{#1}\hfil}\nobreak
\line{{#2}\ifnum #3=0 \hfil \else \dotfill{#3} \fi}\nobreak}}
% Produces a table of contents starting at page number #1.
%
\def\outputtc #1{\vfill\eject\centerline{\headfont Table of Contents}
\vskip .5in
\pageno=#1
\unvbox\tcbox}
% Produces a section heading -- no section number.
%
\def\heading #1{\penalty -1000
\vskip \verttwo
\vbox{{\noindent\headfont #1}}
\nobreak\vskip \vertone\nobreak
\addtblcon{\ifnum\chapno=0\else\tcindent\fi
\ifnum\secnoone=0\else\tcindent\fi
\ifnum\secnotwo=0\else\tcindent\fi
\ifnum\secnothree=0\else\tcindent\fi
\ifnum\secnofour=0\else\tcindent\fi{#1}}{\number\pageno}}
% Produces a section title with a section number.
%
\def\sectitle #1{\penalty -1000
\vskip\verttwo
\vbox{{\noindent\secfont \secnum #1}}
\nobreak\vskip\vertone\nobreak}
% Produces a section number for a section heading.
% (Screws up if you call too deep, i.e. a secthree right after a secone.)
%
\def\secnum {\ifnum\chapno>0 \number\chapno .\fi
\ifnum\secnoone>0 \number\secnoone .\fi
\ifnum\secnotwo>0 \number\secnotwo .\fi
\ifnum\secnothree>0 \number\secnothree .\fi
\ifnum\secnofour>0 \number\secnofour .\fi
\ }
% Start a new chapter with title {#1}.
%
\def\chapter #1{
\advance\chapno by 1
\secnoone=0
\secnotwo=0
\secnothree=0
\secnofour=0
\eqnumcount=0
\vfill\eject
\chappage=\pageno
\centerline{\headfont Chapter \number\chapno}
\vskip \vertthree
\centerline {\chapfont #1}
\vskip \vertfour
% add a blank line in the table of contents
\addtblcon{\null}{0}
% add a two line T of C entry with the chapter number line and
% the chapter title line with a page number
\addtblcontwo{Chapter \number\chapno}{#1}{\number\pageno}}
\def\secone #1{
\advance\secnoone by 1
\secnotwo=0
\secnothree=0
\secnofour=0
\sectitle {#1}
\addtblcon{\tcindent\secnum #1}{\number\pageno}}
\def\sectwo #1{
\advance\secnotwo by 1
\secnothree=0
\secnofour=0
\sectitle {#1}
\addtblcon{\tcindent\tcindent\secnum #1}{\number\pageno}}
\def\secthree #1{
\advance\secnothree by 1
\secnofour=0
\sectitle {#1}
\addtblcon{\tcindent\tcindent\tcindent\secnum #1}{\number\pageno}}
\def\secfour #1{
\advance\secnofour by 1
\sectitle {#1}
\addtblcon{\tcindent\tcindent\tcindent\tcindent\secnum #1}{\number\pageno}}
% Put the page number in the middle at the bottom if the page
% is page one, is less than zero (roman), or if the page begins
% a chapter. Otherwise put it at the top right.
\footline={\ifnum\chappage=\pageno {\hfil\rm--\ \folio\ --\hfil}
\else {\ifnum\pageno<0 {\hfil\rm--\ \folio\ --\hfil}
\else {\hfil}\fi}\fi}
\headline={\ifnum\chappage=\pageno {\hfil}
\else {\ifnum\pageno<0 {\hfil}
\else {\hfil\rm\folio}\fi}\fi}
% Macros for producing sequentially numberred endnote references.
% \ref, \rref, etc. should appear *immediately* following the word
% and any punctuation the reference is to be attached to.
% e.g. these references are dirty,\ref
% {Text for endnote number one.}
% and they make no\rref
% {Text for endnote number two.}
% {Text for endnote number three.}
% sense at all.
%
\def\ref #1{\global\advance\refno by 1
\refsuperscript {\number\refno}\addref{\number\refno}{#1}}
\def\rref #1#2{\global\advance\refno by 1
\refsuperscript{\number\refno,
\addref{\number\refno}{#1}
\global\advance\refno by 1
\number\refno}\addref{\number\refno}{#2}}
\def\rrref #1#2#3{\global\advance\refno by 1
\refsuperscript{\number\refno,
\addref{\number\refno}{#1}
\global\advance\refno by 1
\number\refno,%
\addref{\number\refno}{#2}
\global\advance\refno by 1
\number\refno}\addref{\number\refno}{#3}}
\def\refsuperscript #1{\mathsurround=0pt $^{#1}$}
\def\raisedrefs{
\def\refsuperscript ##1{\mathsurround=0pt $^{##1}$}}
\def\bracketrefs{
\def\refsuperscript ##1{\mathsurround=0pt $\,[{##1}]$}}
\def\addref #1#2{\global\setbox\refbox=\vbox{\unvbox\refbox
\vskip\parskip
\vbox{\parindent=0pt
\hangindent=25pt
\hangafter=1
{[#1]~{#2}}\par}}}
% Produces a list of references.
%
\def\outputref{\vfill\eject\centerline{\headfont References}
\vskip\parskip
\unvbox\refbox}
% End of numberred endnote macros
% Produces an equation number enclosed in parentheses.
% If the chapter is non-zero the number will be of the
% form 1.17 for the seventeenth equation in chapter one,
% otherwise the number will be a simple integer.
%
\def\eqnum {(\ifnum\chapno>0 {\number\chapno .}\fi
\global\advance\eqnumcount by 1
\number\eqnumcount)}
% Use for putting the lower argument of limits a little lower
\def\sub #1{{\lower 2pt\hbox{$\scriptstyle{#1}$}}}
\magnification=\magstep1 % make everything 1.2 times larger
\baselineskip=20pt % vertical line spacing
\parskip=12pt % additional space between paragraphs
\hsize=6 true in % horizontal line width
\vsize=8.5 true in % vertical height of text
\voffset=-.75 true in % correction fx80 past tof
% Make the space around displays bigger than standard
\abovedisplayskip=18pt plus 3pt minus 9pt
\belowdisplayskip=18pt plus 3pt minus 9pt
\widowpenalty=300
\clubpenalty=300
\footline={\ifnum\pageno<1 {\hfil}
\else {\hfil\rm--\ \folio\ --\hfil}\fi}
\headline={\hfil}
\baselineskip=12pt % vertical line spacing
\parskip=8pt % additional space between paragraphs
\hsize=6 true in % horizontal line width
\vsize=8.5 true in % vertical height of text
\voffset=-.75 true in % correction fx80 past tof
\pageno=0
\def\point {\parindent=0in\hangindent=.75in\hangafter=1}
\
\kern 1in
{\chapfont\centerline{Conch}}
\kern 3em
{\baselineskip=20pt\headfont
\centerline{An Enhanced Command Shell}
\centerline{For IBM PCs And Compatibles}
\centerline{Running MS-DOS}
\kern .5in
\centerline{Version 1.00}
\kern .5in
\centerline{Written by}
\centerline{Richard W. Sellens}
}
\vfil
\centerline{\copyright\ R.W. Sellens 1985}
\kern 2em
\noindent Trademarks
{\sevenrm
\settabs\+\quad&MS-DOS\qquad&\cr
\+&IBM&- International Business Machines Corporation\cr
\+&MS-DOS&- Microsoft, Inc.\cr
\+&Unix&- AT\&T, Bell Labs\cr
\+&DeSmet&- DeSmet Software\cr}
\eject
\pageno=0
This program is shareware.
You are encouraged to copy the executable code and documentation and
distribute it to others, subject to these simple conditions:
{
\point\qquad$\bullet$
This program and documentation are copyright. The copyright and all
other rights to this program remain the property of the author,
Richard W. Sellens.
\point\qquad$\bullet$
This program and documentation are not to be distributed in modified
form.
\point\qquad$\bullet$
This program and documentation are not to be distributed for profit.
\point\qquad$\bullet$
The author will not be responsible for any damages arising from the
use, misuse, or inability to use this program.
}
The essentially unrestricted distribution of this program allows you,
the end user, to test the program under your own operating
conditions and determine whether or not it is useful to you. If you
make regular use of this program I ask that you make a contribution to
my continuing software development efforts. Please send \$25 license
fee to:
\kern\parskip
{\settabs\+\kern 1in&\cr
\+&Richard W. Sellens\cr
\+&372A Churchill Court\cr
\+&Waterloo, Ontario\cr
\+&Canada\quad N2L 6B4\cr}
\noindent A receipt will be provided on request.
If you find any bugs in the program, or have any suggestions for
improvements, please let me know by mail at the above address.
\vfill\eject
\heading{Introduction to Conch}
As anyone who has used MS-DOS must have noticed, the command processor supplied
with the operating system is quite simple. People who have used the facilities
available on Unix systems must long for a more sophisticated, powerful shell.
Those who spend a lot of time interacting with the computer at the command line
level could benefit from a more comfortable way to make use of the basic
command processor features. Conch does not provide a fully programmable shell,
but it does provide many of the comfort features.
{
\point
{\bf Command line editing} - Conch uses the PC editing keys in just the manner that
one would expect. This makes it much easier to enter commands and correct
errors.
\point
{\bf I/O redirection} - Conch performs I/O redirection and piping itself, using
the same command line format as the DOS shell.
\point
{\bf History} - Conch maintains a buffer of previously entered command lines
which can be recalled to the command line, edited, and re-executed. This is
done using the vertical cursor motion keys to select the desired command.
\point
{\bf Command Aliasing} - It is often desirable to call a given command sequence
by another name. This allows the shortening of long command strings to simple
mnemonics as well as the reassignment of the standard command names to names
which make more sense to the user.
\point
{\bf Virtual Device Names} - On hard disk systems with complex directory tree
structures it can be difficult to remember the exact paths to directories that
are in common use. Also, it is painful to type a long path name for every
directory reference. Conch allows you to define virtual device names to
shorten and simplify command line path references.
}
Conch is written in DeSmet C, and uses only standard MS-DOS function calls,
with one exception: IBM PC BIOS interrupt 10 hex is used to access the video
screen. The net result is that Conch should run on any machine that makes a
half hearted attempt to be compatible with the IBM PC.
\vfill\eject
\heading{Starting Conch}
Two things should be done at the DOS level, perhaps in an autoexec.bat file,
before starting Conch:
{
\point
\qquad$\bullet$\quad The command search path should be set to the desired value
using the DOS path command. This cannot be changed from within Conch.
\point
\qquad$\bullet$\quad The prompt string should be set to the desired value using
the DOS prompt command. This cannot be changed from within Conch.
}
\noindent Conch is then invoked by typing
{\tt conch}
\noindent Conch will load, display a banner with the version number and
copyright notice and initialize itself. As part of this initialization Conch
will look for a file named {\tt conchrc} in the current directory. Commands
will be taken from this file and executed, just as if they had been typed at
the command line, but they will not be recorded as history.
If the default directory is changed before Conch is invoked, then Conch will
take {\tt conchrc} from the new directory, rather than the root directory.
This makes it possible to provide different initialization procedures for
different users. A simple start-up program can be used to switch to a user's
home directory before Conch is invoked, thus controlling the initialization
file used.
\vfill\eject
\heading{The Command Line Editor}
When Conch is started it will perform some initialization and then display the
command prompt, just as the DOS shell does. You may then enter a command, just
as you would with DOS, using the alpha-numeric keys followed by a carriage
return. If your typing is perfect then you will notice no difference. If
however, you are prone to error like the rest of us, the following features
will make it easy to modify the command as typed so far.
{
\point
{\bf Motion} - The left and right arrow keys will move the cursor one space
left or right, but will move no further left than the first character of the
command line and no further right than the first space beyond the end of the
current command line. The {\tt Home} and {\tt End} keys will move the cursor
to the beginning and end of the command line respectively, while the {\tt Esc}
key will move the cursor to the beginning of the command line and erase
anything typed so far.
\point
{\bf Delete} - The {\tt Del} key will delete the current character, unless the
cursor is at the end of the line, in which case it has no effect. The
backspace key deletes the character immediately to the left of the cursor and
moves the remainder of the line in, unless the cursor is at the beginning of
the line, in which case it has no effect.
\point
{\bf Insert} - Normally a character typed at the keyboard will overtype the
character under the cursor. The {\tt Ins} key toggles the insert mode on and
off. When in insert mode, characters typed at the keyboard are inserted before
the current character. When insert mode is on the cursor will appear as a
block, rather than the usual underbar.
}
If this sounds familiar, it is because it duplicates the line editing
facilities of the BASIC interpreter at the command line. This capability
simplifies the entry of commands and makes it easy to edit previous commands
called up from the history facility of the shell.
In addition to these editing capabilities, there are two key combinations that
have a special effect at the command line. {\tt Alt-H} will cause the current
contents of the command line to be added to the history buffer. {\tt Alt-P}
will cause the current contents of the command line to be added to the pending
commands list. In neither case will the command be executed, it will just be
stored.
\vfill\eject
\heading{What Does a Command Line Look Like?}
The most general form of the command line is:
{\tt <command group>[;<command group>]...}
\noindent Any number of command groups may be entered on a line, separated by
semicolons, subject only to the maximum allowable length of a line. (The DOS
imposed maximum is 128 characters.) Each command group will be executed in
sequence, just as if they had been entered on succeeding command lines. This
feature is an extension of the DOS command processor.
Conch will treat any command line which starts with a period (.) as a null
line. This is consistent with DOS, and provides a way to include comments in
command lists.
A command group has the same form as the command line described in the DOS
manual. In its simplest form a command group contains only the name of the
command to be executed, but it may also contain arguments, pipes, and I/O
redirection.
{\tt <command> [arg...][|<command> [arg...]...][<infile][[>]>outfile]}
\noindent If a pipe ({\tt |}) is used to join commands, then the data sent to
standard output by the first command is fed to the standard input of the second
command. Any number of commands may be piped together in this way. See the
section titled Pipes and/or the DOS manual for further details.
If arguments are found that begin with one of `{\tt <}', `{\tt >}', or `{\tt
>>}' the remainder of that argument is used as a source or destination for I/O
redirection. `{\tt <}' indicates a source file or device which is to replace
the current standard input device. `{\tt >}' indicates a destination file or
device that is to replace the current standard output device. If the file
exists the current contents will be replaced. `{\tt >>}' is the same as `{\tt
>}', except that the output will be appended to the current contents of the
file, if any. See the DOS manual for further details.
Commands and arguments are separated by spaces or tabs as delimiters. Spaces
are optional around pipes, semicolons, and preceding I/O redirection. Quotes
may be used to prevent special characters such as `{\tt |}', `{\tt ;}', `{\tt
<}', `{\tt >}', tabs and spaces from being interpreted by the shell. See the
section titled Parsing of the Command Line for details.
\vfill\eject
\heading{Command History Mechanism}
Conch automatically saves each command typed at the keyboard in a buffer for
future reference. When the buffer fills, the oldest commands are discarded to
make room for new ones. The number of commands that are available is dependent
on the size of the buffer, buffer utilization by the other features of Conch,
and the lengths of the commands that were saved. Generally the buffer will
hold more history than you need, but if the amount saved is insufficient it
will be necessary to move up to a version of the shell that was created with a
larger buffer.
When Conch gives you the command prompt you may enter a command using the
editing keys as described in the Command Line Editor section, or you may select
a previously typed command from the history buffer. While on the command line,
the up and down arrow keys will move you through the history buffer, displaying
a previously entered command on the current command line. The up arrow moves
backward in time, while the down arrow will move you forward. The buffer does
not wrap, so that eventually you will reach the oldest available command entry
and go no further.
Additionally, if the {\tt PgUp} key is pressed while on the command line, it
will provide a display of a page of the history buffer so that commands appear
in context. Each line of the display will contain an old command, or just the
first part of the command if the complete command would have run off the
screen. An indicator points out the currently selected line of history and, as
before, the selected history line will appear in its entirety on the
current command line. In this display mode the up and down arrow keys will
still move through the history buffer one command at a time, while the {\tt
PgUp} and {\tt PgDn} keys will move up or down in larger increments.
Once the desired command has been selected it may be executed as is, simply by
pressing carriage return, or it may be edited just as if the text of the
command had been entered from the keyboard. Any modifications made to the text
on the command line will have no effect on the image of the old command stored
in the history buffer. Also, when you re-execute the command it will be stored
in the history buffer again, whether or not it was modified.
In addition to the history buffer, Conch maintains a pending commands buffer.
Commands are added to the buffer by using {\tt Alt-P} to store the current
command line, or by reading them in using the {\tt -r} option of the {\tt
pending} command. The {\tt pending} command also allows you to display the
contents of the buffer, execute the commands in the buffer, write them to a
file, or flush the buffer. See the command summary for details.
\vfill\eject
\heading{Command Aliasing}
Conch maintains a list of command aliases which are input by the user. A
command alias is essentially a statement that ``When I say this, I really mean
that.''. An alias is added to the shell's list by using the {\tt alias}
command.
{\tt alias <name> <replacement string>}
\noindent {\tt <name>} is the name that you will use to request a particular
action and {\tt <replacement string>} is the command line to be used to produce
that action. For example
{\tt alias dir ls -l}
\noindent tells Conch that each time you enter the command {\tt dir}, it should
execute the command {\tt ls -l}. This can be extremely useful, especially for
the more complex commands.
{\tt <name>} must be a string of less than 64 characters containing only the
letters {\tt A} through {\tt Z}, the digits {\tt 0} through {\tt 9} and the
characters
{\tt \$ \# \& @ ! \% ( ) - $\{$ $\}$ \_}
\noindent All alias names are converted to lower case for storage, making Conch
case independent just like DOS.
If the previously aliased {\tt <name>} is followed by arguments on the command
line they are usually just transferred to the end of the {\tt <replacement
string>}, and separated from it by whitespace. The command entry
{\tt dir $\backslash $temp$\backslash $idea}
\noindent would be translated into
{\tt ls -l $\backslash $temp$\backslash $idea}
\noindent for execution. The exception comes when {\tt <replacement string>}
contains one or more occurrences of the tail substitution character. (The tail
substitution character is initially set as `{\tt\$}' but it can be changed to
any other character using the {\tt tsub} command.) If the tail substitution
character occurs in the replacement string, in each instance it will be
replaced with the command tail. The command tail will be stripped of leading
and trailing whitespace so that if this alias is set,
{\tt alias killer "del file\$.bak ; del dud\$.*"}
\noindent (Note that quotes are required around the replacement string to
prevent Conch from interpreting the semicolon before it is sent to the {\tt
alias} command.)
{\tt killer 1}
\noindent will be expanded to
{\tt del file1.bak ; del dud1.*}
\noindent and
{\tt killer test}
\noindent will be expanded to
{\tt del filetest.bak ; del dudtest.*}
If the {\tt alias} command is issued with a name which is already aliased, then
the new alias definition will replace the old. No warning or diagnostic
message will be issued. If an alias is to be removed, rather than redefined,
the {\tt unalias} command is used. It takes the form:
{\tt unalias <name> }
\noindent where {\tt <name>} is the name of a previously defined alias.
The aliasing mechanism is fully recursive, so aliases may be defined in terms
of other aliases. There is a check on the recursion to prevent either direct,
or indirect circular recursion.
{\tt alias ls ls -l}
\noindent will result in one substitution, giving {\tt ls -l} whenever {\tt ls} is entered.
{\tt alias ls dir -l}
{\tt alias dir ls}
\noindent will result in two substitutions, giving {\tt ls -l} whenever {\tt
ls} is entered.
\vfill\eject
\heading{Virtual Device Names}
When tree structured directories grow, the paths to the directories can become
long, and perhaps hard to remember. The use of virtual device names makes it
easier to remember the names of commonly used directories, as well as easing
the typing load. A virtual device is defined by the {\tt vdev} command
{\tt vdev <name> <replacement string>}
\noindent and can be redefined by issuing another {\tt vdev} command for the
same name. {\tt <name>} must be at least 2 characters long, so as not to
conflict with the single letter disk drive identifiers.
For example, the text of my thesis might be stored in a directory named\break
{\tt c:$\backslash $rick$\backslash $school$\backslash $thesis$\backslash $}.
A virtual device could be created by
{\tt vdev thesis c:$\backslash $rick$\backslash $school$\backslash $thesis$\backslash $}
\noindent Any time the characters {\tt thesis:} appear at the start of a token
they will be replaced by the replacement string; in this case {\tt
c:$\backslash $rick$\backslash $school$\backslash $thesis$\backslash $}. Thus
{\tt type thesis:chap1}
\noindent will be expanded to
{\tt type c:$\backslash $rick$\backslash $school$\backslash $thesis$\backslash $chap1}
\noindent In the special case where the name and colon form the entire token,
any trailing backslash will be removed, so that
{\tt cd thesis:}
\noindent will be expanded to
{\tt cd c:$\backslash $rick$\backslash $school$\backslash $thesis}
\noindent just the way it should be.
Also, simply declaring a virtual device name on the command line will take you
to the directory it represents. This is analogous to using {\tt a:} to move to
drive A. This means that
{\tt thesis:}
\noindent is almost equivalent to
{\tt cd thesis:}
\noindent The difference is that {\tt cd thesis:} will change the default
directory of drive C to {\tt $\backslash $rick$\backslash $school$\backslash
$thesis} without changing the default drive, while {\tt thesis:} will also
change the default drive to ``take you there''. On machines with a single hard
disk, where the default drive is likely to remain constant, the two are
interchangeable.
The virtual device name facility is fully recursive, so virtual device names
may be defined in terms of other virtual device names.
{\tt vdev old thesis:old$\backslash $}
\noindent will set up {\tt old:} to be expanded into {\tt c:$\backslash
$rick$\backslash $school$\backslash $thesis$\backslash $old$\backslash $}. Any
circular reference, where a virtual device name is defined in terms of itself,
will cause an error.
To complement the virtual device naming capability, Conch keeps a list of
reserved device names. The {\tt rdev} command is used to add a device name to
the list.
{\tt rdev <name>}
\noindent The {\tt vdev} command will generate an error if the user tries to
create a virtual device with the same name as a previously defined reserved
device. This is the only purpose of the reserved device name facility.
The rules given for legal characters in {\tt alias} names also apply to both
{\tt vdev} and {\tt rdev} names. They are also stored in lower case, making
them case independent.
\vfill\eject
\heading{Summary of Conch Internal Commands}
This section lists all of the Conch internal commands, and provides the
mechanical details of their use. For further information, and examples of the
more complex commands, see the narrative sections of the manual.
\vskip .125in
{\tt\noindent alias [<name> <replacement string>]}
{\parindent=.25in\hangindent=.25in
Instructs the shell to substitute a replacement string for the command {\tt
<name>} in future. If {\tt <replacement string>} contains special characters
like `{\tt |}', `{\tt ;}', `{\tt >}', `{\tt <}, etc., enclose the string in
either single ({\tt ''}) or double ({\tt ""}) quotes to prevent their
evaluation before substitution. If no arguments are given, the current list of
aliases is printed.
}
\vskip .125in
{\tt\noindent cd [d:][<path>]}
{\parindent=.25in\hangindent=.25in
Behaves just like the DOS {\tt cd}, except that {\tt <path>} may include a
virtual device name.
}
\vskip .125in
{\tt\noindent exit}
{\parindent=.25in\hangindent=.25in
Leaves Conch and returns to DOS.
}
\vskip .125in
{\tt\noindent history [-n [<filename>]]}
{\parindent=.25in\hangindent=.25in
Prints out the complete history buffer, in the order in which the commands were
entered. If an argument is included the results will be:
}
\vskip 8pt
{\settabs\+&\kern .375in{\tt -w[n] <filename>}\quad&\cr
\+&\hfill{\tt -f}\quad&the history buffer is flushed, eliminating all previous\cr
\+&\hfill&entries.\cr
\+&\hfill{\tt -w[n] <filename>}\quad&writes the most recent {\tt n} commands
from the contents\cr
\+&\hfill& of the history buffer to {\tt <filename>}.\cr
\+&\hfill{\tt -r <filename>}\quad&reads in command lines from {\tt
<filename>} and adds\cr
\+&\hfill&them to the history buffer.\cr
}
\vfill\eject
{\tt\noindent pending [-n [<filename>]]}
{\parindent=.25in\hangindent=.25in
Prints out the list of pending commands if no arguments are given. If
arguments are included the results will be:
}
\vskip 8pt
{\settabs\+&\kern .375in{\tt -w <filename>}\quad&\cr
\+&\hfill{\tt -e}\quad&the pending commands are executed. They will
not be\cr
\+&\hfill&recorded as history, since they were not entered from\cr
\+&\hfill&the command line.\cr
\+&\hfill{\tt -f}\quad&the pending command list is flushed,
eliminating all\cr
\+&\hfill&previous entries.\cr
\+&\hfill{\tt -w <filename>}\quad&writes the contents of the pending
command list to\cr
\+&\hfill&{\tt <filename>}.\cr
\+&\hfill{\tt -r <filename>}\quad&reads in command lines from {\tt
<filename>} and appends\cr
\+&\hfill&them to the pending command list.\cr
}
\vskip .125in
{\tt\noindent rdev [<name>]}
{\parindent=.25in\hangindent=.25in
Adds {\tt <name>} to the reserved device name list. If no argument is given, a
list of the defined reserved device names is printed.
}
\vskip .125in
{\tt\noindent source <filename>}
{\parindent=.25in\hangindent=.25in
Takes command input from a file, rather than the keyboard. This provides the
most rudimentary of batch facilities. The commands in {\tt <filename>} will
not be recorded as history, since they were not entered from the command line.
}
\vskip .125in
{\tt\noindent tsub [<char>]}
{\parindent=.25in\hangindent=.25in
Sets the tail substitution character to the first non-blank character after
{\tt tsub}. If there is no argument, the current tail substitution character
is displayed.
}
\vskip .125in
{\tt\noindent unalias <name>}
{\parindent=.25in\hangindent=.25in
Removes the alias entry, if any, for {\tt <name>}.
}
\vskip .125in
{\tt\noindent vdev [<name> <replacement string>]}
{\parindent=.25in\hangindent=.25in
Adds {\tt <name>} to the virtual device name list, so that in future {\tt
name:} at the beginning of a token will be replaced with {\tt <replacement
string>}. If no arguments are given, the current virtual device name list will
be printed.
}
\vfill\eject
\heading{Parsing of the Command Line}
To interpret the Conch command line it is necessary to take it apart, massage
it a bit, and reassemble it. This is called parsing and processing.
For the most part Conch parsing is very simple; a command is composed of tokens
which are separated by whitespace. (Whitespace is the generic term for
characters such as spaces or tabs, appearing singly or in a group.) When the
command is processed the tokens are separated, and the whitespace between the
tokens is thrown away. After the tokens are processed, they are reassembled
into a command with new whitespace between them. This will have no effect on
the execution of the command, unless the exact configuration of the whitespace
was important. Conch will not preserve bizarre combinations of whitespace
between tokens. Thus, if your application is sensitive to the configuration of
whitespace, special measures may be needed.
After the command line is broken into tokens, it is checked for semicolons. If
any are found the line is broken into separate command groups which are
sequentially fed back into the top of the processor. Then any I/O redirection
is stripped out. (Conch is not sensitive to the position of I/O redirection
tokens in the command group.) If a command group contains pipes it is broken
into separate commands, with appropriate redirection to temporary files, and
fed back into the top of the processor.
Once it is dealing with a single command the processor tests the first word for
alias substitution. If a substitution results in multiple commands (using
either semicolons or pipes) the command group is fed back into the top of the
processor. The processor then tests each token to see if it begins with a
recognized virtual device name, and if so, makes the necessary substitution.
Any I/O redirection required is set up. Any quotes within the command string
are removed, unless they are preceded by a backslash ($\backslash$), in which
case the backslash is removed. If the command is one of the internal commands
the appropriate function is called. Otherwise, Conch looks in the current
directory and down the search path for the named command as either a .com,
.exe, or .bat file. If found, it is executed and passed a tail composed of all
the remaining tokens, separated by spaces.
The tail will also have one leading space, so that it will appear to the
application that it was invoked from the DOS command line with exactly one
space between the command name and the arguments. Some badly written programs
process the command tail based on the assumption that it has exactly one
leading space.
\vfill\eject
\heading{Quotation Marks}
Single ({\tt ''}) and double ({\tt ""}) quote pairs can be used to keep the
parser from messing with portions of the command line. Anything within single
or double quotes will be untouched by the parser. The quotes will be removed
before the command tail is passed to the command itself.
This is useful for maintaining peculiar whitespace combinations, and for
slipping normally significant characters past the command processor. The
command
{\tt grep " ;"}
\noindent will result in {\tt grep} being invoked and passed a command tail
composed of two spaces and a semicolon. (The first space is the one separating
the command and the tail, while the second comes from within the quoted
string.) If the quotes were not present, Conch would interpret the semicolon as
a command separator, and would ignore the superfluous space. The result would
be the same if single quotes ({\tt ''}) had been used, rather than double
quotes.
The next question is ``How do you include quotes on the command line as
characters, rather than delimiters?''. To include quotes as characters they
must be preceded by a backslash ($\backslash $). For example
{\tt grep $\backslash $'"$\backslash $" ;"}
\noindent would invoke {\tt grep}, and pass it a command tail made up of a
space, a single quote, a double quote, a space and a semicolon.
\heading{Pipes}
Since DOS is not multi-tasking, it is not possible to implement ``true'' pipes.
The technique used by Conch is the same as that used by {\tt command.com}.
Piped commands are converted into a sequentially executed series of commands
with I/O redirection through temporary files.
Under Conch these files have names of the form {\tt temp:\%pipexx} where {\tt
xx} is a two letter combination that varies to differentiate between files, and
{\tt temp:} is a virtual device name which must be defined by the user before
piping is used. If a RAM disk is being used, setting {\tt temp:} to represent
a directory on the RAM disk will result in much faster execution of piped
commands.
Conch ensures that the {\tt xx} in the pipe filenames are different for each
file created, but if multiple copies of Conch are active, then the pipe
filenames will not be unique. This will cause problems if commands containing
pipes are piped into a second copy of Conch. For example, the command:
{\tt dummy | conch | cat}
\noindent will not behave properly if {\tt dummy} feeds piped commands to {\tt
conch}, because the pipefile names will conflict. This is a bug, but one that
is unlikely to cause significant inconvenience, or even be evident to most
users.
\vfill\eject
\heading{Command.com and MS-DOS Internal Commands}
Conch installs itself on top of {\tt command.com}, and uses some of the
features provided by {\tt command.com}, such as the 4B hex function call for
executing a program. This is not as much of penalty as might be expected.
Only the resident portion of {\tt command.com} is retained, and its size is
only a couple of Kbytes.
Conch does not provide most of the internal commands that exist in {\tt
command.com}. These commands are not lost to the user. They can still be run
by invoking {\tt command.com} with the {\tt /c} option; i.e.,
{\tt command /c dir}
\noindent This is extremely bulky, but the internal commands can be aliased.
{\tt alias dir command /c dir}
\noindent will make {\tt dir} behave just the way it does when issued at the
DOS command line.
Invoking {\tt command.com} to perform DOS tasks takes a little longer. On my
PC with a 10 Mbyte hard drive it takes about three quarters of a second longer
to start the task. In my opinion, this delay is not particularly noticeable,
as the commonly used DOS internal commands are I/O bound anyway, so the
response is never instantaneous.
Using {\tt command.com} to perform program loading and internal commands allows
for complete compatibility with a bare DOS system, so that you will be hit with
a minimum number of surprises. It also means that Conch is independent of DOS
version. If a new version of DOS is issued, with an expanded or different
command set, just change the aliases. I feel that these advantages outweigh
the minor performance disadvantage.
It is a quirk of DOS that whenever a new {\tt command.com} is invoked, it must
be the same copy as the machine was booted from. Because of this, the first
copy of {\tt command.com} found down the search path must be the one that you
booted from. This will usually mean including {\tt c:$\backslash $} as one of
the path elements. Alternatively you could alias {\tt command} to {\tt
c:$\backslash $command}, so as to be specific.
\vfill\eject
\heading{Batch Files}
Conch runs batch files by invoking {\tt command.com}. This means that none of
the features of Conch are available inside the batch file. However, when a
batch file is run, the command line arguments will be processed by Conch before
they are passed to {\tt command.com}, so virtual device names, etc. may be
used on the command line.
Commonly used batch files tend to be just lists of commands, without any use of
the flow control and other batch file features provided by DOS. Batch files of
this type can be replaced by aliasing, if the list of commands is short, or by
using the {\tt source} command if the list of commands is longer. See the
sample {\tt conchrc} for an aliasing example.
\vfill\eject
\heading{Error Messages Produced by Conch}
If Conch detects an error it will print out one of the messages contained in
this section. It may also print a line of text to provide a clue concerning
the cause of the error, or an explanation. Most error messages produced by
Conch are self explanatory.
{\tt\noindent Bad Alias Name.}
{\tt\noindent Bad Command Name.}
{\tt\noindent Bad Device Name.}
{\tt\noindent Bad Filename.}
{\tt\noindent Bad Path Name.}
If Conch says something is ``bad'', then that thing either does not exist, or
Conch was unable to find it, or in the case of a device it has already been
defined as a reserved device name.
{\tt\noindent Illegal Character in Name -- A-Z, 0-9, \$\#\&@!\%()-${}$\_ Permitted.}
An attempt was made to define an alias, virtual device name or
reserved device name containing characters other than those
permitted.
{\tt\noindent Command Too Long When Expanded.}
DOS restricts commands to a maximum of 128 characters. Conch will not allow
you to input a command that is longer than that, however, if subsequent
expansion of the command would make it longer than 128 characters this error
message is generated.
{\tt\noindent Extra Arguments Supplied to Internal Command.}
Too many arguments were given when invoking a Conch internal command.
{\tt\noindent Insufficient Pointer Space.}
{\tt\noindent No More Space in Main Buffer.}
{\tt\noindent Out of Memory.}
{\tt\noindent Recursion Too Deep -- Need Larger Memory Version.}
Any of these errors indicate that you were asking Conch to do something that
was too big or too complex for the version of the program installed. This
includes things such as defining more aliases, etc. than will fit in the space
allotted for the buffer or pointers, or asking Conch to evaluate a complex
command group involving many levels of recursion in the definition of aliases
or virtual device names.
The solution to the problem is to use a larger memory version of the program.
On the distribution disk are several sequentially numbered versions of the
program. ({\tt conch1.exe, conch2.exe,} etc.) The higher the number, the
larger the amount of working space provided for Conch. Naturally, using a larger
memory version of the program will leave less of your machine's memory
available to run applications in.
{\tt\noindent Warning -- Unmatched Single or Double Quotes.}
If Conch finds unmatched quotes it will issue this warning message. It will
proceed with the execution of the command, but the entire portion of the line
after the last quotation mark will be treated as a single token. The effect
will be the same as if a closing quotation mark had been added at the end of
the line.
{\tt\noindent Could Not Open File -- Probably Disk Full.}
{\tt\noindent Error Writing File -- Probably Disk Full.}
These two are self explanatory
{\tt\noindent Unspecified error.}
This message will appear if the program just run terminated with a non-zero
exit code. The exit code is mechanism provided by DOS which allows a program
to communicate its exit status to the program that invoked it. Usually a
non-zero exit code means the program terminated due to some error condition.
This message will also be displayed if one of Conch's internal routines returns
an unforseen error code. This should not happen. If it does please contact
the author with details of how the error occurred, and how it can be repeated.
\outputtc {0}
\vfill\eject
\pageno=0
\heading{Ordering Information for the Program and Source Code}
A complete copy of the source code for Conch is available for personal use
only. It is written in the DeSmet C language, with some imbedded assembly
code. A signed and dated copy of the declaration below must accompany your
order.
\parskip=4pt
Please send me a copy of the complete source code for Conch. This source code
is to be used only by me, or by my agents under my supervision. No portion of
the source code, or any executable code produced from it will be distributed to
a third party.
I understand that this program and documentation are copyright and that the
copyright and all other rights to this program remain the property of the
author, Richard W. Sellens.
I also understand that the author will not be responsible for any damages
arising from the use, misuse, or inability to use this program.
\kern\parskip
\kern\parskip
{
\settabs\+\quad&Address\quad&\kern 1.7in&\qquad&Signature\quad&\cr
\+&\hfill Name\quad&\hrulefill&&\hfill Signature\quad&\vrule height0pt
depth.4pt width1.5in\cr
\+&\hfill&\hfill&&\hfill Date\quad&\vrule height0pt
depth.4pt width1.5in\cr}
\kern\baselineskip
\hrule
\heading{Order Form\qquad -- \qquad Conch Shell Program}
\hangindent=1in\hangafter=1
Demo Diskette -- Software and manual text on diskette.
\qquad\qquad\vrule height0pt depth.4pt width.5in\quad copies at \$10
each\hfill\$\vrule height0pt depth.4pt width1in
\hangindent=1in\hangafter=1
Conch Program Package -- Software on diskette complete with hardcopy manual.
Includes \$25 license fee.
\qquad\qquad\vrule height0pt depth.4pt width.5in\quad copies at \$35
each\hfill\$\vrule height0pt depth.4pt width1in
\hangindent=1in\hangafter=1
Conch Source Package -- Software and source code on diskette complete
with hardcopy manual. Includes \$25 license fee. A signed and dated
copy of the declaration above must be provided for each copy ordered.
\qquad\qquad\vrule height0pt depth.4pt width.5in\quad copies at \$50
each\hfill\$\vrule height0pt depth.4pt width1in
\hfill Total\qquad\$\vrule height0pt depth.4pt width1in
\hfill Ontario residents add 7\% P.S.T.\qquad\$\vrule height0pt
depth.4pt width1in
\hfill Enclosed with this order\qquad\$\vrule height0pt depth.4pt width1in
\kern\parskip
\kern\parskip
Name\quad\vrule height0pt depth.4pt width2in
Address\quad\vrule height0pt depth.4pt width3in
\qquad\qquad\vrule height0pt depth.4pt width3in
\vskip .1in
\noindent Mail to: R.W. Sellens, 372A Churchill Ct., Waterloo, Ont.,
Canada N2L 6B4
\bye rsellens@watdcsu.UUCP (Rick Sellens - Mech. Eng.) (09/26/85)
----------cut here-----------------------------------------------
Conch
An Enhanced Command Shell
For IBM PCs And Compatibles
Running MS-DOS
Version 1.00
Written by
Richard W. Sellens
(c) R.W. Sellens 1985
Trademarks
IBM - International Business Machines Corporation
MS-DOS - Microsoft, Inc.
Unix - AT&T, Bell Labs
DeSmet - DeSmet Software
This program is shareware.
You are encouraged to copy the executable code and documentation and
distribute it to others, subject to these simple conditions:
- This program and documentation are copyright. The copyright
and all other rights to this program remain the property of the
author, Richard W. Sellens.
- This program and documentation are not to be distributed in
modified form.
- This program and documentation are not to be distributed for
profit.
- The author will not be responsible for any damages arising from
the use, misuse, or inability to use this program.
The essentially unrestricted distribution of this program allows you,
the end user, to test the program under your own operating conditions
and determine whether or not it is useful to you. If you make
regular use of this program I ask that you make a contribution to my
continuing software development efforts. Please send $25 license
fee to:
Richard W. Sellens
372A Churchill Court
Waterloo, Ontario
Canada N2L 6B4
A receipt will be provided on request.
If you find any bugs in the program, or have any suggestions for
improvements, please let me know by mail at the above address.
Introduction to Conch
As anyone who has used MS-DOS must have noticed, the command
processor supplied with the operating system is quite simple. People
who have used the facilities available on Unix systems must long for
a more sophisticated, powerful shell. Those who spend a lot of time
interacting with the computer at the command line level could benefit
from a more comfortable way to make use of the basic command
processor features. Conch does not provide a fully programmable
shell, but it does provide many of the comfort features.
Command line editing - Conch uses the PC editing keys in just the
manner that one would expect. This makes it much easier to enter
commands and correct errors.
I/O redirection - Conch performs I/O redirection and piping
itself, using the same command line format as the DOS shell.
History - Conch maintains a buffer of previously entered command
lines which can be recalled to the command line, edited, and
re-executed. This is done using the vertical cursor motion keys
to select the desired command.
Command Aliasing - It is often desirable to call a given command
sequence by another name. This allows the shortening of long
command strings to simple mnemonics as well as the reassignment
of the standard command names to names which make more sense to
the user.
Virtual Device Names - On hard disk systems with complex
directory tree structures it can be difficult to remember the
exact paths to directories that are in common use. Also, it is
painful to type a long path name for every directory reference.
Conch allows you to define virtual device names to shorten and
simplify command line path references.
Conch is written in DeSmet C, and uses only standard MS-DOS function
calls, with one exception: IBM PC BIOS interrupt 10 hex is used to
access the video screen. The net result is that Conch should run on
any machine that makes a half hearted attempt to be compatible with
the IBM PC.
Starting Conch
Two things should be done at the DOS level, perhaps in an
autoexec.bat file, before starting Conch:
- The command search path should be set to the desired value
using the DOS path command. This cannot be changed from within
Conch.
- The prompt string should be set to the desired value using the
DOS prompt command. This cannot be changed from within Conch.
Conch is then invoked by typing
conch
Conch will load, display a banner with the version number and
copyright notice and initialize itself. As part of this
initialization Conch will look for a file named conchrc in the
current directory. Commands will be taken from this file and
executed, just as if they had been typed at the command line, but
they will not be recorded as history.
If the default directory is changed before Conch is invoked, then
Conch will take conchrc from the new directory, rather than the root
directory. This makes it possible to provide different
initialization procedures for different users. A simple start-up
program can be used to switch to a user's home directory before Conch
is invoked, thus controlling the initialization file used.
The Command Line Editor
When Conch is started it will perform some initialization and then
display the command prompt, just as the DOS shell does. You may then
enter a command, just as you would with DOS, using the alpha-numeric
keys followed by a carriage return. If your typing is perfect then
you will notice no difference. If however, you are prone to error
like the rest of us, the following features will make it easy to
modify the command as typed so far.
Motion - The left and right arrow keys will move the cursor one
space left or right, but will move no further left than the first
character of the command line and no further right than the first
space beyond the end of the current command line. The Home and
End keys will move the cursor to the beginning and end of the
command line respectively, while the Esc key will move the cursor
to the beginning of the command line and erase anything typed so
far.
Delete - The Del key will delete the current character, unless
the cursor is at the end of the line, in which case it has no
effect. The backspace key deletes the character immediately to
the left of the cursor and moves the remainder of the line in,
unless the cursor is at the beginning of the line, in which case
it has no effect.
Insert - Normally a character typed at the keyboard will overtype
the character under the cursor. The Ins key toggles the insert
mode on and off. When in insert mode, characters typed at the
keyboard are inserted before the current character. When insert
mode is on the cursor will appear as a block, rather than the
usual underbar.
If this sounds familiar, it is because it duplicates the line editing
facilities of the BASIC interpreter at the command line. This
capability simplifies the entry of commands and makes it easy to edit
previous commands called up from the history facility of the shell.
In addition to these editing capabilities, there are two key
combinations that have a special effect at the command line. Alt-H
will cause the current contents of the command line to be added to
the history buffer. Alt-P will cause the current contents of the
command line to be added to the pending commands list. In neither
case will the command be executed, it will just be stored.
What Does a Command Line Look Like?
The most general form of the command line is:
<command group>[;<command group>]...
Any number of command groups may be entered on a line, separated by
semicolons, subject only to the maximum allowable length of a line.
(The DOS imposed maximum is 128 characters.) Each command group will
be executed in sequence, just as if they had been entered on
succeeding command lines. This feature is an extension of the DOS
command processor.
Conch will treat any command line which starts with a period (.) as a
null line. This is consistent with DOS, and provides a way to
include comments in command lists.
A command group has the same form as the command line described in
the DOS manual. In its simplest form a command group contains only
the name of the command to be executed, but it may also contain
arguments, pipes, and I/O redirection.
<command> [arg...][|<command> [arg...]...][<infile][[>]>outfile]
If a pipe (|) is used to join commands, then the data sent to
standard output by the first command is fed to the standard input of
the second command. Any number of commands may be piped together in
this way. See the section titled Pipes and/or the DOS manual for
further details.
If arguments are found that begin with one of `<', `>', or `>>' the
remainder of that argument is used as a source or destination for I/O
redirection. `<' indicates a source file or device which is to
replace the current standard input device. `>' indicates a
destination file or device that is to replace the current standard
output device. If the file exists the current contents will be
replaced. `>>' is the same as `>', except that the output will be
appended to the current contents of the file, if any. See the DOS
manual for further details.
Commands and arguments are separated by spaces or tabs as delimiters.
Spaces are optional around pipes, semicolons, and preceding I/O
redirection. Quotes may be used to prevent special characters such
as `|', `;', `<', `>', tabs and spaces from being interpreted by the
shell. See the section titled Parsing of the Command Line for
details.
Command History Mechanism
Conch automatically saves each command typed at the keyboard in a
buffer for future reference. When the buffer fills, the oldest
commands are discarded to make room for new ones. The number of
commands that are available is dependent on the size of the buffer,
buffer utilization by the other features of Conch, and the lengths of
the commands that were saved. Generally the buffer will hold more
history than you need, but if the amount saved is insufficient it
will be necessary to move up to a version of the shell that was
created with a larger buffer.
When Conch gives you the command prompt you may enter a command using
the editing keys as described in the Command Line Editor section, or
you may select a previously typed command from the history buffer.
While on the command line, the up and down arrow keys will move you
through the history buffer, displaying a previously entered command
on the current command line. The up arrow moves backward in time,
while the down arrow will move you forward. The buffer does not
wrap, so that eventually you will reach the oldest available command
entry and go no further.
Additionally, if the PgUp key is pressed while on the command line,
it will provide a display of a page of the history buffer so that
commands appear in context. Each line of the display will contain an
old command, or just the first part of the command if the complete
command would have run off the screen. An indicator points out the
currently selected line of history and, as before, the selected
history line will appear in its entirety on the current command line.
In this display mode the up and down arrow keys will still move
through the history buffer one command at a time, while the PgUp and
PgDn keys will move up or down in larger increments.
Once the desired command has been selected it may be executed as is,
simply by pressing carriage return, or it may be edited just as if
the text of the command had been entered from the keyboard. Any
modifications made to the text on the command line will have no
effect on the image of the old command stored in the history buffer.
Also, when you re-execute the command it will be stored in the
history buffer again, whether or not it was modified.
In addition to the history buffer, Conch maintains a pending commands
buffer. Commands are added to the buffer by using Alt-P to store the
current command line, or by reading them in using the -r option of
the pending command. The pending command also allows you to display
the contents of the buffer, execute the commands in the buffer, write
them to a file, or flush the buffer. See the command summary for
details.
Command Aliasing
Conch maintains a list of command aliases which are input by the
user. A command alias is essentially a statement that ``When I say
this, I really mean that.''. An alias is added to the shell's list
by using the alias command.
alias <name> <replacement string>
<name> is the name that you will use to request a particular action
and <replacement string> is the command line to be used to produce
that action. For example
alias dir ls -l
tells Conch that each time you enter the command dir, it should
execute the command ls -l. This can be extremely useful, especially
for the more complex commands.
<name> must be a string of less than 64 characters containing only
the letters A through Z, the digits 0 through 9 and the characters
$ # & @ ! % ( ) - { } _
All alias names are converted to lower case for storage, making Conch
case independent just like DOS.
If the previously aliased <name> is followed by arguments on the
command line they are usually just transferred to the end of the
<replacement string>, and separated from it by whitespace. The
command entry
dir \temp\idea
would be translated into
ls -l \temp\idea
for execution. The exception comes when <replacement string>
contains one or more occurrences of the tail substitution character.
(The tail substitution character is initially set as `$' but it can
be changed to any other character using the tsub command.) If the
tail substitution character occurs in the replacement string, in each
instance it will be replaced with the command tail. The command tail
will be stripped of leading and trailing whitespace so that if this
alias is set,
alias killer "del file$.bak ; del dud$.*"
(Note that quotes are required around the replacement string to
prevent Conch from interpreting the semicolon before it is sent to
the alias command.)
killer 1
will be expanded to
del file1.bak ; del dud1.*
and
killer test
will be expanded to
del filetest.bak ; del dudtest.*
If the alias command is issued with a name which is already aliased,
then the new alias definition will replace the old. No warning or
diagnostic message will be issued. If an alias is to be removed,
rather than redefined, the unalias command is used. It takes the
form:
unalias <name>
where <name> is the name of a previously defined alias.
The aliasing mechanism is fully recursive, so aliases may be defined
in terms of other aliases. There is a check on the recursion to
prevent either direct, or indirect circular recursion.
alias ls ls -l
will result in one substitution, giving ls -l whenever ls is entered.
alias ls dir -l
alias dir ls
will result in two substitutions, giving ls -l whenever ls is
entered.
Virtual Device Names
When tree structured directories grow, the paths to the directories
can become long, and perhaps hard to remember. The use of virtual
device names makes it easier to remember the names of commonly used
directories, as well as easing the typing load. A virtual device is
defined by the vdev command
vdev <name> <replacement string>
and can be redefined by issuing another vdev command for the same
name. <name> must be at least 2 characters long, so as not to
conflict with the single letter disk drive identifiers.
For example, the text of my thesis might be stored in a directory
named c:\rick\school\thesis\. A virtual device could be created by
vdev thesis c:\rick\school\thesis\
Any time the characters thesis: appear at the start of a token they
will be replaced by the replacement string; in this case
c:\rick\school\thesis\. Thus
type thesis:chap1
will be expanded to
type c:\rick\school\thesis\chap1
In the special case where the name and colon form the entire token,
any trailing backslash will be removed, so that
cd thesis:
will be expanded to
cd c:\rick\school\thesis
just the way it should be.
Also, simply declaring a virtual device name on the command line will
take you to the directory it represents. This is analogous to using
a: to move to drive A. This means that
thesis:
is almost equivalent to
cd thesis:
The difference is that cd thesis: will change the default directory
of drive C to \rick\school\thesis without changing the default drive,
while thesis: will also change the default drive to ``take you
there''. On machines with a single hard disk, where the default
drive is likely to remain constant, the two are interchangeable.
The virtual device name facility is fully recursive, so virtual
device names may be defined in terms of other virtual device names.
vdev old thesis:old\
will set up old: to be expanded into c:\rick\school\thesis\old\. Any
circular reference, where a virtual device name is defined in terms
of itself, will cause an error.
To complement the virtual device naming capability, Conch keeps a
list of reserved device names. The rdev command is used to add a
device name to the list.
rdev <name>
The vdev command will generate an error if the user tries to create a
virtual device with the same name as a previously defined reserved
device. This is the only purpose of the reserved device name
facility.
The rules given for legal characters in alias names also apply to
both vdev and rdev names. They are also stored in lower case, making
them case independent.
Summary of Conch Internal Commands
This section lists all of the Conch internal commands, and provides
the mechanical details of their use. For further information, and
examples of the more complex commands, see the narrative sections of
the manual.
alias [<name> <replacement string>]
Instructs the shell to substitute a replacement string for the
command <name> in future. If <replacement string> contains
special characters like `|', `;', `>', `<, etc., enclose the
string in either single ('') or double ("") quotes to prevent
their evaluation before substitution. If no arguments are given,
the current list of aliases is printed.
cd [d:][<path>]
Behaves just like the DOS cd, except that <path> may include a
virtual device name.
exit
Leaves Conch and returns to DOS.
history [-n [<filename>]]
Prints out the complete history buffer, in the order in which the
commands were entered. If an argument is included the results
will be:
-f the history buffer is flushed, eliminating all
previous entries.
-w[n] <filename> writes the most recent n commands from the
contents of the history buffer to <filename>.
-r <filename> reads in command lines from <filename> and
adds them to the history buffer.
pending [-n [<filename>]]
Prints out the list of pending commands if no arguments are
given. If arguments are included the results will be:
-e the pending commands are executed. They will not
be recorded as history, since they were not
entered from the command line.
-f the pending command list is flushed, eliminating
all previous entries.
-w <filename> writes the contents of the pending command list
to <filename>.
-r <filename> reads in command lines from <filename> and
appends them to the pending command list.
rdev [<name>]
Adds <name> to the reserved device name list. If no argument is
given, a list of the defined reserved device names is printed.
source <filename>
Takes command input from a file, rather than the keyboard. This
provides the most rudimentary of batch facilities. The commands
in <filename> will not be recorded as history, since they were
not entered from the command line.
tsub [<char>]
Sets the tail substitution character to the first non-blank
character after tsub. If there is no argument, the current tail
substitution character is displayed.
unalias <name>
Removes the alias entry, if any, for <name>.
vdev [<name> <replacement string>]
Adds <name> to the virtual device name list, so that in future
name: at the beginning of a token will be replaced with
<replacement string>. If no arguments are given, the current
virtual device name list will be printed.
Parsing of the Command Line
To interpret the Conch command line it is necessary to take it apart,
massage it a bit, and reassemble it. This is called parsing and
processing.
For the most part Conch parsing is very simple; a command is composed
of tokens which are separated by whitespace. (Whitespace is the
generic term for characters such as spaces or tabs, appearing singly
or in a group.) When the command is processed the tokens are
separated, and the whitespace between the tokens is thrown away.
After the tokens are processed, they are reassembled into a command
with new whitespace between them. This will have no effect on the
execution of the command, unless the exact configuration of the
whitespace was important. Conch will not preserve bizarre
combinations of whitespace between tokens. Thus, if your application
is sensitive to the configuration of whitespace, special measures may
be needed.
After the command line is broken into tokens, it is checked for
semicolons. If any are found the line is broken into separate
command groups which are sequentially fed back into the top of the
processor. Then any I/O redirection is stripped out. (Conch is not
sensitive to the position of I/O redirection tokens in the command
group.) If a command group contains pipes it is broken into separate
commands, with appropriate redirection to temporary files, and fed
back into the top of the processor.
Once it is dealing with a single command the processor tests the
first word for alias substitution. If a substitution results in
multiple commands (using either semicolons or pipes) the command
group is fed back into the top of the processor. The processor then
tests each token to see if it begins with a recognized virtual device
name, and if so, makes the necessary substitution.
Any I/O redirection required is set up. Any quotes within the
command string are removed, unless they are preceded by a backslash
(\), in which case the backslash is removed. If the command is one
of the internal commands the appropriate function is called.
Otherwise, Conch looks in the current directory and down the search
path for the named command as either a .com, .exe, or .bat file. If
found, it is executed and passed a tail composed of all the remaining
tokens, separated by spaces.
The tail will also have one leading space, so that it will appear to
the application that it was invoked from the DOS command line with
exactly one space between the command name and the arguments. Some
badly written programs process the command tail based on the
assumption that it has exactly one leading space.
Quotation Marks
Single ('') and double ("") quote pairs can be used to keep the
parser from messing with portions of the command line. Anything
within single or double quotes will be untouched by the parser. The
quotes will be removed before the command tail is passed to the
command itself.
This is useful for maintaining peculiar whitespace combinations, and
for slipping normally significant characters past the command
processor. The command
grep " ;"
will result in grep being invoked and passed a command tail composed
of two spaces and a semicolon. (The first space is the one
separating the command and the tail, while the second comes from
within the quoted string.) If the quotes were not present, Conch
would interpret the semicolon as a command separator, and would
ignore the superfluous space. The result would be the same if single
quotes ('') had been used, rather than double quotes.
The next question is ``How do you include quotes on the command line
as characters, rather than delimiters?''. To include quotes as
characters they must be preceded by a backslash (\). For example
grep \'"\" ;"
would invoke grep, and pass it a command tail made up of a space, a
single quote, a double quote, a space and a semicolon.
Pipes
Since DOS is not multi-tasking, it is not possible to implement
``true'' pipes. The technique used by Conch is the same as that used
by command.com. Piped commands are converted into a sequentially
executed series of commands with I/O redirection through temporary
files.
Under Conch these files have names of the form temp:%pipexx where xx
is a two letter combination that varies to differentiate between
files, and temp: is a virtual device name which must be defined by
the user before piping is used. If a RAM disk is being used, setting
temp: to represent a directory on the RAM disk will result in much
faster execution of piped commands.
Conch ensures that the xx in the pipe filenames are different for
each file created, but if multiple copies of Conch are active, then
the pipe filenames will not be unique. This will cause problems if
commands containing pipes are piped into a second copy of Conch. For
example, the command:
dummy | conch | cat
will not behave properly if dummy feeds piped commands to conch,
because the pipefile names will conflict. This is a bug, but one
that is unlikely to cause significant inconvenience, or even be
evident to most users.
Command.com and MS-DOS Internal Commands
Conch installs itself on top of command.com, and uses some of the
features provided by command.com, such as the 4B hex function call
for executing a program. This is not as much of penalty as might be
expected. Only the resident portion of command.com is retained, and
its size is only a couple of Kbytes.
Conch does not provide most of the internal commands that exist in
command.com. These commands are not lost to the user. They can
still be run by invoking command.com with the /c option; i.e.,
command /c dir
This is extremely bulky, but the internal commands can be aliased.
alias dir command /c dir
will make dir behave just the way it does when issued at the DOS
command line.
Invoking command.com to perform DOS tasks takes a little longer. On
my PC with a 10 Mbyte hard drive it takes about three quarters of a
second longer to start the task. In my opinion, this delay is not
particularly noticeable, as the commonly used DOS internal commands
are I/O bound anyway, so the response is never instantaneous.
Using command.com to perform program loading and internal commands
allows for complete compatibility with a bare DOS system, so that you
will be hit with a minimum number of surprises. It also means that
Conch is independent of DOS version. If a new version of DOS is
issued, with an expanded or different command set, just change the
aliases. I feel that these advantages outweigh the minor performance
disadvantage.
It is a quirk of DOS that whenever a new command.com is invoked, it
must be the same copy as the machine was booted from. Because of
this, the first copy of command.com found down the search path must
be the one that you booted from. This will usually mean including
c:\ as one of the path elements. Alternatively you could alias
command to c:\command, so as to be specific.
Batch Files
Conch runs batch files by invoking command.com. This means that none
of the features of Conch are available inside the batch file.
However, when a batch file is run, the command line arguments will be
processed by Conch before they are passed to command.com, so virtual
device names, etc. may be used on the command line.
Commonly used batch files tend to be just lists of commands, without
any use of the flow control and other batch file features provided by
DOS. Batch files of this type can be replaced by aliasing, if the
list of commands is short, or by using the source command if the list
of commands is longer. See the sample conchrc for an aliasing
example.
Error Messages Produced by Conch
If Conch detects an error it will print out one of the messages
contained in this section. It may also print a line of text to
provide a clue concerning the cause of the error, or an explanation.
Most error messages produced by Conch are self explanatory.
Bad Alias Name.
Bad Command Name.
Bad Device Name.
Bad Filename.
Bad Path Name.
If Conch says something is ``bad'', then that thing either does not
exist, or Conch was unable to find it, or in the case of a device it
has already been defined as a reserved device name.
Illegal Character in Name -- A-Z, 0-9, $#&@!%()-{}_ Permitted.
An attempt was made to define an alias, virtual device name or
reserved device name containing characters other than those
permitted.
Command Too Long When Expanded.
DOS restricts commands to a maximum of 128 characters. Conch will
not allow you to input a command that is longer than that, however,
if subsequent expansion of the command would make it longer than 128
characters this error message is generated.
Extra Arguments Supplied to Internal Command.
Too many arguments were given when invoking a Conch internal command.
Insufficient Pointer Space.
No More Space in Main Buffer.
Out of Memory.
Recursion Too Deep -- Need Larger Memory Version.
Any of these errors indicate that you were asking Conch to do
something that was too big or too complex for the version of the
program installed. This includes things such as defining more
aliases, etc. than will fit in the space allotted for the buffer
or pointers, or asking Conch to evaluate a complex command group
involving many levels of recursion in the definition of aliases or
virtual device names.
The solution to the problem is to use a larger memory version of the
program. On the distribution disk are several sequentially numbered
versions of the program. (conch1.exe, conch2.exe, etc.) The higher
the number, the larger the amount of working space provided for
Conch. Naturally, using a larger memory version of the program will
leave less of your machine's memory available to run applications in.
Warning -- Unmatched Single or Double Quotes.
If Conch finds unmatched quotes it will issue this warning message.
It will proceed with the execution of the command, but the entire
portion of the line after the last quotation mark will be treated as
a single token. The effect will be the same as if a closing
quotation mark had been added at the end of the line.
Could Not Open File -- Probably Disk Full.
Error Writing File -- Probably Disk Full.
These two are self explanatory
Unspecified error.
This message will appear if the program just run terminated with a
non-zero exit code. The exit code is mechanism provided by DOS which
allows a program to communicate its exit status to the program that
invoked it. Usually a non-zero exit code means the program
terminated due to some error condition.
This message will also be displayed if one of Conch's internal
routines returns an unforseen error code. This should not happen.
If it does please contact the author with details of how the error
occurred, and how it can be repeated.
Ordering Information for the Program and Source Code
A complete copy of the source code for Conch is available for
personal use only. It is written in the DeSmet C language, with some
imbedded assembly code. A signed and dated copy of the declaration
below must accompany your order.
Please send me a copy of the complete source code for Conch. This
source code is to be used only by me, or by my agents under my
supervision. No portion of the source code, or any executable code
produced from it will be distributed to a third party.
I understand that this program and documentation are copyright and
that the copyright and all other rights to this program remain the
property of the author, Richard W. Sellens.
I also understand that the author will not be responsible for any
damages arising from the use, misuse, or inability to use this
program.
Name _____________________________ Signature _______________________
Date _______________________
---------------------------------------------------------------------
Order Form -- Conch Shell Program
Demo Diskette -- Software and manual text on diskette.
_______ copies at $10 each $_____________
Conch Program Package -- Software on diskette complete with hardcopy
manual. Includes $25 license fee.
_______ copies at $35 each $_____________
Conch Source Package -- Software and source code on diskette complete
with hardcopy manual. Includes $25 license fee. A signed
and dated copy of the declaration above must be provided for
each copy ordered.
_______ copies at $50 each $_____________
Total $_____________
Ontario residents add 7% P.S.T. $_____________
Enclosed with this order $_____________
Name: ______________________________________
Address: ______________________________________
______________________________________
Mail to: R.W. Sellens, 372A Churchill Ct., Waterloo, Ont.,
Canada N2L 6B4