[net.sources.mac] Grep / Word Count DA

dubois@uwmacc.UUCP (Paul DuBois) (03/14/86)

I got about 20 requests for the Grep/Wc DA, so I am posting it.
This posting contains some documentation, the next contains the BinHex
of the DA itself.  I will also post the source shortly.


Grep / Word Count Desk Accessory

This document describes Grep-Wc, a desk accessory that provides word
count capability and file searching for lines matching a pattern.  It
works both with TEXT and MacWrite (WORD) files.  (As a side effect,
Grep-Wc provides the capabilities of file viewers and MacWrite-to-text
file converters, but more about that anon.)

Since this DA is a first version, and since I don't really know what
I'm doing when I'm programming a Macintosh, you should approach it
warily.  One known bug (good way to start off, right?), is that if you
open it twice, it sometimes crashes.  I have also seen it happen than
when you open it twice, none of the menu items do anything.  In that
case, use the close box in the window to quit and restart it.  Why do
these things happen, you ask?  I'd love to know.

When I posted my first notice about this DA, I said that it was about
9K.  It has now mushroomed to slightly under 11K.  The extra 2K went
into window refreshing, window resizing, control over scrolling with
pause and cancel buttons, help and error alerts, and saving of results
to a file.  I hope you feel, as I do, that the 2K is worth it.

Grep-Wc comes with no restrictions on its distribution.  It also comes
without a solicitation for money.  If you don't like it, toss it or
give it to someone that may be able to use it, and (yesyesyes!!) send
criticism to me.  If you can make it crash reliably, let me know how.
If you find bugs, let me know.


Using Grep-Wc

When Grep-Wc is executed, it puts up a standard document window.  Click
in the close box to quit.  No grow icon is drawn, but the window is
resizable.  You can also drag it around.  One menu appears in the menu
bar.  It has the following items, which are described below.

	About Grep-Wc		(help alert and author information)
	Count...		(word count)
	Search...		(grep)
	Set Pattern...		(specify pattern for grep)
	Save Output...		(save screen output to disk file)


About Grep-Wc

This menu item displays an alert containing the DA title, version
number and date, an indicator that there are no restrictions on
distribution of the DA, my address (so you know where to send
complaints!), and a blurb about pattern metacharacters (my concession
to a comment regarding user friendliness to non-Unix types).

The pattern metacharacters are described below under Search...


Count...

This function counts characters, words and either lines (for TEXT
files) or paragraphs (for WORD files).  A word is defined as a string
of non-white characters (space, tab or carriage return).  For instance,
"non-white" is a single word, "Science, July 1986, 20(3), 15-27" is
five words.  In TEXT files, strings of characters ending with carriage
return are lines.  In WORD files, strings of characters ending with
carriage return are paragraphs.  The total number of paragraphs and the
number of non-empty paragraphs are reported.  (Blank lines are empty
paragraphs.)


Search...

This function emulates Unix grep.  (Etymological note:  "Grep" means
"Globally search for Regular Expressions and Print, deriving from the
representation "g/r.e./p".)  It searches files for lines matching
patterns, and displays them.  (You can also select the inverse, i.e.,
lines failing to match the pattern).  Patterns may contain characters
to be matched literally, position-matching characters (which cause the
match to be anchored to the beginning and/or end of a line), character
classes, and a way to cause variable-length strings to be matched
(e.g., "any number of spaces").  If the last pattern entered is not
legal, Search... asks for one first before displaying a list of files
to choose from.

The Pause and Cancel buttons are activated during file searches.
Clicking in the Pause button causes its title to change to Resume, and
Grep-Wc pauses.  Clicking in the Cancel button terminates the search.
Searches are implicitly terminated by initiating another Search... or
Count..., or by clicking in the close box.

Patterns may contain the following metacharacters:

^	Match beginning of line.  This is only special at the beginning of
	the pattern.
$	Match end of line.  This is only special at the end of the pattern.
.	Match any character.
[..]	Match any character between the brackets.  If the first character
	after the left bracket is "^", then match any character except those
	between the brackets.  Character ranges may be specified with a dash,
	e.g., "[a-zA-Z0-9]" means any lowercase letter, uppercase letter, or
	digit.  A dash may be entered into the class by giving it as the first
	character of the class, e.g., "[-abc]" or "[^-abc]".
*	Match any number (including zero) of the previous pattern element.
	This is only special after something that it may sensibly apply to.
	For instance, "a*" matches any number of a's, while "^*" matches
	an asterisk at the beginning of the line.
\	Escape character.  If the character following is a metacharacter,
	its special meaning is turned off.  If the following character
	is not special, the backslash is ignored.  A backslash itself may
	be escaped ("\\") to enter a literal backslash into the pattern.


Examples (people who already understand grep might as well skip this
part):

abc
	Match literal occurrences of "abc".
^abc
	Match "abc" only when it occurs at the beginning of a line.
abc$
	Match "abc" only when it occurs at the end of a line.
^abc$
	Match "abc" only when it is the only thing on the line.
ab[def]
	Match "abd", "abe" or "abf" (anywhere in line).
^$
	Match empty line.
$^
	Match line containing "$^"
1[234]5
	Match "1", then either "2", "3" or "4", then "5".
1[^234]5
	Match "1", then anything but "2", "3" or "4", then "5".
1.5
	Match "1" and "5" with any single character in between.
1\.5
	Match "1.5" exactly.
1.*5
	Match "1" and "5" with any number of (any) characters in between
	(note that this matches "15").
^a*
	Match any number of "a" at beginning of line (note that this
	matches any line: zero a's is a match).
^*
	Match "*" at the beginning of line (* is only special when it follows
	something that matches characters).
^\*
	Same as previous.
^**
	Match any number of "*" at beginning of line.
^\**
	Same as previous.
^*\**
	Match one or more "*" at beginning of line.
^\*\**
	Same as previous.
[_a-zA-Z][_a-zA-Z0-9]*
	Match programming language identifiers (defined as sequences of
	characters beginning with either underscore or a letter, followed
	by any number of underscores, letters or digits.
[0-9]\\*\**$
	Match a digit followed by any number of backslashes, followed by any
	number of "*", when it occurs at the end of a line.
Sm[iy]the*
	Match "Smith", "Smithe", "Smythe", etc. (also matches "Smitheeeeeee")



Set Pattern...

This menu item allows you to set or change the pattern to be searched
for.  It presents a dialog containing an editable text box for entering
the pattern, two radio buttons to select either lines that match or
that don't match the pattern (the latter is like Unix "grep -v"), a
check box indicating whether line numbers should be printed, and two
buttons (OK and Cancel).  The OK button accepts the current pattern and
button settings.  Cancel simply exits the dialog and does nothing.  You
can select this item and change the line selection type or line
numbering options without having to respecify the pattern.


Save Output...

When this item is selected, the standard file dialog comes up.  Specify
a file name.  Output that appears in the Grep-Wc window will be written
to the file.  When a file is open, this menu item changes to "Stop
Saving Ouput".  Selecting it closes the file.  Grep-Wc won't let you
save output when you are in the Finder.  (If you're currently saving
output, you can select the output file as the file to be searched, but
if any line matches, you'll end up writing forever, like "cat x y>y".)

Any open output file will be closed if you click in the close box.


Miscellaneous Notes

If you put a window in front of the Grep-Wc window while you are grepping
a file, Grep-Wc pauses until you bring its window to the front.

The default pattern when Grep-Wc starts up is the empty pattern, which
is legal and matches every line.  This may not seem very useful, but an
implication is that Grep-Wc can act as a file viewer.  (Very useful
inside of programs such as Pr.)  In addition, the text of a MacWrite
file can be scanned without using MacWrite.   Hence, in conjunction with
"Save Output..." (described below), Grep-Wc acts as a WORD-to-TEXT file
converter.

Grep-Wc runs under DA Sampler (my version is 1.15) if you wish to try
it out that way.

Grep-Wc works on the currently open file in MacWrite, but there is of
course no guarantee of accuracy if you have made changes that haven't
been saved yet.  (You need not close the file, just save it.)

Line numbers are meaningless for MacWrite files.

-- 
                                                                    |
Paul DuBois     {allegra,ihnp4,seismo}!uwvax!uwmacc!dubois        --+--
                                                                    |
                                                                    |

dubois@uwmacc.UUCP (Paul DuBois) (03/14/86)

See previous posting for documentation.

(This file must be converted with BinHex 4.0)

:"dGbCA!Y9f-!4%C*6%406eB!N!JX+RYk!*!%!3#3!bZ2!!!UM`#3!jX'[J!8!!!
'a!!-!!!'bJ!5!!!'f!!Z!!!'kJ!9!!!'lJ!6!!!'mJ!6!!!(!!!2!!!(#J!8!!!
(%!!-!!!(&J!5!!!(*J!Z!!!(1!!9!!!(2!!6!!!(3!!6!!!(6J!2!!!(8J!5!!!
(DJ!)!!!(G!![!!!(K!!Y!!!(ZJ!Y!!!)-!!)!!!)2J!d!!!)8J!c!*"$+!!$!!%
!"3!#!*!,*J!#!!%!!J#3"LI5*!#3!`&U!*!$9!"#!9!!3J%##!"(FQ9`,9GM!*!
-2J!0!8B"lJ!!!3#3%8MR!2JSD3!8fI`!N!-F6[S#1NMR!2K(qJ*-5UN!&'B!!*`
J+`"D"S!!N!-FS4iM5!!85N"R$Lm*2c`!!UR))Pp1qJ)8+%MCr!#3!a`jI2q3!rB
CI!!!rqmT5IrS3UcrmN(kria+%'F!!%K)j`"`3UG#TdKkrh")H[pB2c`"!%(krf`
r%($r,`!r2!%!3UHT%b"I60m1!$&m!!N!5M&m!!3!4#P)rr)M5!!H-@N!'!"X)$`
!N!-#3S&1ZJ&`6[S"M%MR!2K+U3!8Cc3SD3!8fI`!N!-F4rS"ML!m!*!$%N+"6VS
"5#CXrqJJD`!8S4p+U`!HC`!!##mV!"kT&#*,3UN!(N+T!"4#3%cI(`"1G8MR!2K
(qJ&3+'N!&0Rm!*!$($!S!"S-3!"!Cd)-3!""Ca!-3!"$CaT&q[ki0)"1qJ!q)$`
!N!-@3S&1ZJ$J6[S!r$mS!"`r+!!H)$`!N!-DFJ41ZJ$)3QHT1%lk!1!ND!!F-K*
`!H0J`'X!AQFQ,`S[#L!m!*!$(R)%6VS!S#4I4rS!e%SXrqpQ!!#b$&,rrfF!!+S
`%Ja!!!0R!!!H$%!!"@F!!"B-3!!'C`!!8!a!!!&R!!!N6[S!K$!U!!3#3!$r2`!
r+J!1)$`!N!-+FJ41ZJ"+6[S!CLmXrr+SFbm+"TF!N!-+U(%[+J!+)$`!N!-'FJ4
1ZJ!Q6[S!3LmU!!+T)L!m!*!$$N+",`T1ZJ!1*&m[+J!#U501qJ!L)$-!!%U!Ca,
A`%UXrr*R!!!),bcrmUKc6Y-JApr"6Y"+,2r[C`!!$#*XrqJr+3!BUEG#3%cI(`"
1G3!&!!!+!*!$"Y3!N!B,f!!!#k`!!!bU!!!,hJ#3"fJ!!#6%!!!P,!#3"L8X!*!
'*5`!N!BP,!#3"L8X!*!'*5`!N!B*3!#3#Nj@!!![,!#d2bi!#+PG,b`!Z$mZ!!L
TA6!Z!!K+!&I!4!!C3!#m6PiJAplm!!*1d%SX!,aR!!!1B3!@&Mmm!2pK!2qq6R8
[,!!!U@Nr2!!!2c`!'+L62c`$k$mm!"LSN5"X!!3[%&#A,b`!"+R66R919[rq,bi
!#%(k!$3[#%(k!$![#%(k!#`[#+Q,3QF`,!"B9%!r!#mm!*!%UB8`(ce!rrj1AL"
Ih[`!"%l3!!)!!J!#6PErQ%+ZrqT+,!"QC`!!EN)X!'Br,!"S3HlrQY$m!"J`Rd*
R5'lrQKmm!!"K!#+B-"mp32rZ3HlrQY$m!#i[%%(ZrjV3r!!F)*p#CdKZrjSI2!!
!B3!LNM!I28$rlN*R2b`!D'%!)+S`(ce!rqj"qJ&k)!JY32rUB!!"6N)R3IS"HLm
),c`!!!N3(c`!!"mm!!&K!#*f%"pR!!!33IS"C#m)B3$r''!!!6ir2!"N2c`!4N(
k!9`[#%(k!@)[##mm!*!%5'`!DMmm!!'TkN(X!'T+%'F!!2*#CdKX!'S'P`#3!`T
"l!"UA)Jr%%KZrr"K!"iL-"m-3!!!9m"%!'F!!$""qJ%D)!K8J#"!,a""l[r`)"#
`ReE!4!"R!!!33IS""#m)B3$qPQ!!!,aJ!!"13QG)E!"U"TF!N!-+3H`!DPb)2a"
"qJ$Z)!K8J#"!,a""qJ$S)!K8J#"!,a"K!"j!-"m-3!!!9X"%!'F!!"""qJ$3,`K
K!2j'B!!!E%*R5'`!DJDA!*!$#N(X!'TFL$m35'`!D$mm!!*K!"4N-"m-3!!!9X"
%!'F!!"""qJ#L,`KK!2i+B!!!%KPm!!%!CN(k!*SJ##e!rqS-VJ#3"2rU9X"%!'F
!!"![,!"52c`!"LmZrqUT4djH6R818f&fC5"2GA4`GA3ZN!-#"NCTEQ4PFJ!06Qp
d)%PZ)%CTEQ4PFJYAFQPdC5"8Ebk3!`!#"5"849K8$dj[G#"")&4&@&3J4QPXC38
J4h*PF!8J9%9B9!a$B@iRG#"$FQ9KG'8##N0KELGd)%p`C@i#%P0dEh!J8f&fD@j
R)%peG("eG%"19[rX)'i!#"!3!S!!N!2r,8$rl#"X!!3J80$m!"J`%$e!rrJ[2!!
!IrJ[2!!!IrJ[,!!%UG%J,J!)8S![!#mZrq`[,!!%UGj)E[r`)'`!"#"38)JLAh!
")YK4b2rm2blrq%(Zrr!r%%(Zrr"BL$!3N!"I5-#"hce!rrir,[ri)'`!"#"32a"
"l[r`-"#3!&p)`)(I28$rr#"X!!3J80$m!&i`%*!!E[rmN!"Zrrip32rk$'i!!2r
kAX"%!'F!!*`r2!!!2blrqM!ZrrK%3-(I2`![,!!%UGd`,[rkd@lrr!aZ!"Rrr&l
!4!"R!!"Z5'lrm$mm!!!r2!!!2c`!!$mm!!#STdKZrr#SHbmm!*!%-#lrr-(m!!)
[!#"X!!3J80$m!'$4hc!35-![!#mX!!5Td5mX!!5Tecmm!!!r,[rm-#lrq-(I2`!
[,!!%UGd[,!!!"TF!N!-3U(Y+,!"QC`!!0%*R2b`!D%KZrq`J,J!)8S![!'%!(KB
`(`a!!!"@`%3!C`!!%%(k!"B[#'%!qm4K!2`%6PiJAplm!!41d"TAFQPdC5"&FR*
[FL!S3fa[FfPZCb"'D@aP+A4"qJ!+,`KK!2j#6R8"$8j@rqT"l[rZ)!JY32rU,`S
r2!!!)#i!##"ZrqUTlLe!!!JY52rU*&p)E[rZB3$q$NjH)&rHr!!%6Y"19[ri3Li
!#%*RB3!9bM!I$%!!!&I!4!"R!!#8(A`!!3!)3UHT*#!X!!#`ReE!4!"R!!!),b`
!!+NI5'`!#'%!&j*)E!!)"TF!N!-+B3$pY%(k!'3[#'%!rDT"l[rk%,`!"%*ZrrK
J!!!88Qlrq!aZ!!2rq&l!4!"Q!!!L3H`!#&5)d1lrq"m3-#lrq&*!2`""l[rkd0m
3Rf!!rp")E[rkB3$pB%(k!"3[#'%!r9CK!2Tf6Pj1G3)J+!-()'CTE'8T$8j@rJ"
+,!"NCJ!!H%+R5'lq!'%!&a`J(`b!!*!%9m"%!'F!!!TK!2SQB!!!9P+X!'")E[i
!B3!)EKmX!&T#*dKZrJ"K!!b)%"q`(eI!4!"R!!!`5L`!A'F!!"3[,!"JB3$qSN(
k!#![#'%!r04)E[i!B3!,X%KZrJ"K!2c%B3$qGNjH6R8#1L"m6PErm$mZ!!T"l[r
i9)J`RcmZ!!K"l[ri-*p)E[r`)'`!!0$m!"!LAh!")YK4b2rm3Hlrm&b)-"!%3!!
22`""l[r`9)J`Rd(Zrr"BL$!3"%!!$cm!3Hlrm$#I3LG"l[ri,a")E[r`U+d3(fF
!!*4)E[riU(")E[r`2c`!UMmm!$`r2!)!2c`"9ULR3UF[,!!!3Hlrq#m35'lrm+N
V3Hlrq##I,b`!!%(ZrrK8L$m33Hlrq$m3(c`!!DNG5'lrm#"X!!$3r!!3)Pp`!5,
B8FMrr%KZrr#SHd(Zrr!'8!!C3Hlrm&5)A&!JE!!%,a"3Pd(Zrr!LAh!")YK4b2r
mB!!!NN*R3Hlrq#m3,b`!!%KZrrbTE$!IC`!!HN*R,blrr%(ZrrJ[%#mm!*!%U@J
`(fF!!'![,!#i)#lrr,#I9m"%!'F!!!TK!2KqB!!!4LmX!,3J,[rmX*pA`%3!C`!
!0%SX!'4R!!!5,b`!Y%(k!#i[#+PIB!!!$LmX!,4"qJ!N,`LTAa!X!'4+!&I!4!!
C3!"N6PiJAplm!!41d!93BA9cC3C5CA0eE@8!6PErkN+Zrra#V[ri3Ulrp%+Zrr"
#,[rZ2A`!$IrUB!!!#M!Zrq`p32rU3QGK!!lf-"mp32rX$'lrN!2X9m"%!'F!!!C
J!!"`8Ulrm$!ZrqaJ!!"%8Ulrr!aZ!!hrkPE!4!"R!!!'8Ulrq%)ZrqjJ!!"#3Ll
rlQ!!!$S-,J!!rqjA`%3!C`!!$&+Zrr3GI!!"rqjJ!!!H$%!!$@F!rlJ-3!!JC`$
rcJa!!!PR!2r'B!$rbQ!!rfi-EJ!0rqT@`%3!C`!!#P+Zrra5V[ri,blrm'%!r!"
"qJ"b,`KK!2Sb,blrp'%!qqj"qJ"U,`KK!2SJ,blrr'%!qpa"qJ"L)!K8J#"!,a"
"l!!)9)JJ%,#I9m"%!'F!!"""qJ"+,`KK!2R`B!!!(N(k!%3[#'%!qH)[,[riB3$
lRN(k!%![#'%!qG"K!2Z#6Pj1G3JJ3fKKFR-X)!!))&G[FQ4c,#!!"5"849K8"L"
-D@jPFc)0)&"KFQ&RFQ&`D(-J+!XJEQpZ,@9YF(4j+8j@rrK)E!!!U(4#Cf%!&C)
`(cP!!&BjI-0!!&K#*f%!&3S3(fF!!!j#Cf%!&-!`(cP!!&K#TcmX!&C"qJ%B,`L
T-5!I+8!!8LmX!&)r2!!!U68[,!"53IS""#m)U61T0f%!$5TK!!LD3L`!CKPm!!%
!@N)X!&a)E[ri)'`!!0$m!"!LAh!")YK4b2rm3Hlrq!C3!"P"l[ri9)KF8%+R5'l
rq%KZrrLTdL!I+8!!"#"X!!3J80$m!%J`[2rr5'lrq$mm!!8r2!!#2c`!96mm!"D
STd+R,b`!!%KZrrK"qJ$!,`JI2!!"2c`!!$mm!!!r2!!!2c`!!#mm!*!%U93J(bP
!!,4)E[ri2c`!@Mmm!!#SU%+R,b`!!%KZrrK"qJ#',`JI2!!"2c`!!$mm!!!r2!!
!2c`!!#mm!*!%U93J(bP!!,Jr2!$rB3$e(Q%!p@"1ANje"dGbCA!Y9f0"3@*[GA3
J4h*PF#eABcXS,6Y$Eh9ZG#k3!cY6C@&bBfJZN!-l8f9d)&"KG(4PFQiZN!-l8f&
fC5"2GA4`GA3ZN!-&8'&eFf8'3f&ZBf9X!'%!#`T+,!"QC`!!"Q%!p@)[,!!!U9B
[,!!%UFdr,!"@U6B[,!"5U6+T0djeB3$de%je6PB!!$!Z!!KJ!!#+3QF`,!"B8N!
r!#mm!*!%UB8`(ce!!!KJ!!#@B3$dN!"#*f%!qAS3(fF!!!CK!2aNB!!!IQ%!p(K
+,!"HCJ!!"Q%!!*T+,!"HC`!!+N)RB3$j6K!IC`!!(N+X!'"#,!"N,b`!Y%(k!&3
[#+PI2c`!!'%!p!aJ!!!kB3!!BQ!!!$*K!25`B!!!+Ja!!!&R!2pb$%!!!fF!riB
-3!!%C`$rPJa!!!9R!2r5$%!!"QF!rp*1AL"Ih[`!"%l3"9"KGA0P3UHT*#!X!!#
`ReI!4!$!,!#mC`!!"Q%!qBK1G8)RB3!!5"!IC`!!0%KX!-*K!!)B3LG)E!$#B3!
#IK!I'8!!ANKX!-*K!!9q5L`!AQB!!!a"qJ!+,`KK!22@6R8,3Q&N)&"KG(4PFQj
19[r`3Li!#%+R2b`!@#mm!*!%,ccrN!5TI#!I+8!![KmX!&TK!!%L2c`!"amX!&a
K!!&%,b`![Mmm!!4)E[rm5'lrq%KZrr#TM5mZrrK)E!$#UBm[,!#q2c`!"$mm!!!
r2(riUAi[,!#qU49J!!!#,c`!N!4)E[rqUC%`,[rqB!!!N!![,!#q2c`!"%KZrra
)E[ri5'lrm+Q0,blrq%KX!-+TN!"#*cmm!!9K!!$q%"mC3!"D3LFr2!!(B3!!lK!
I'8!!A"em!!%!#'!!!(*J!!"UB!!!DQ!!!')I2!!"B3!!D'!!!&BI2!!!B3!!A'!
!!%Sr2!!(3LFr2!!(B3!!V"!I5J"A`%3!(`"K!!"UB!!!+Ja!!!&R!2pX$%!!!QF
!rl)-3!!&C`$rXJa!!!CR!2qf$%!!"fF!rlTJ!2md,b`![UQ$6Pj1G8j@!!!r2!!
&(bi!#'%!!#!r2!!'%#i!#%S!9m"%!"m!B3!!$%jH)&rHr!!#6Y"19[rb,b`![Mm
Z!!T)E[rk5'lrr%KZrr+TM5mZrr`3,J!)!N!!rcm!U@01AL"Ih[`!"%l36PErmLm
X!,ir,J!)5'lrqNKZrra)E[rbUBe#CbmZrrbTB$!I(8!!#NjH)&rHr!!#6Y"19[r
m)'i!#"!3!N!!rce!rr`-EJ!!rraH`%3!C`!!2N*ZrrjJ!!!B8QlrrMmZrr``,[r
qX&pF`%3!CJ!!)$!Zrrj53%M!)%$4lJ!)(a!JEJ!)d1lrrK#IB!$rcL"Z!!M3l[r
m3K"1AL"Ih[`!"%l36PErrN)Z!!a#E!6%3H`#`N)33L`%b%)X"-)JEJ!)%"!#3!$
r$%!!API!4!"R!!!-'A`!!36#8Ui!#'!!!!)JEJ!)%"!G32rq8Ui!#"!Zrri#3!$
r$%!!+PI!4!"R!!!55L`%b'F!!!TK!!%-B!$rd#"Z!!J3%!*!!2m-3!!!9m"%!"m
!%#lrrJ*!!2m-3!!N9m"%!-!IC`!!$Kmm!!GK!!%bB!$rQQ%!!933,[rq!N!!r`a
!!&aA`%3!C`!!,L"Z!!J3%!*!!2m-3!!!9m"%!'F!!!CJ!!#@)'i!#"m3B3!!mP+
Z!!KJ!2p@%#lrrJ*!!2m-3!!!9m"%!'F!!!CJ!!"Q%#lrrJ*!!2pJ!!"#(c`!"@%
!!,jJ!!"+3UF[,J!)B3!!kL!I,8!!#!bZ!*!&#&I!4!"R!!!'B!!!-'!!!#)I,[r
qB3!!LQ!!!"B-3!!ZC`$rZJa!!&YR!2qqB!$riQ!!rYSGI!!"!!a1AL"Ih[`!"%l
36PErrP*X"-3`,!6%28$rrQ!!!"Jr,!6'8flrrM!Zrrk`Aer!4!"Q!!!J-#lrrP0
!2`""l!,#d0mI%%(X!X,3l[rq%*pJ!2r13H`#`Y$X"-B3[!!'3L`%b%jH6R919J!
!(bi!#%(X!X,3l!6%%*p5E!6%3H`#`Y$X"-4#%%jH)&rHr!!#6Y!`,!6%18!%aKP
m!!%%b%je6PErq%+Z!!`GI!!"rr`JEJ!)%"!#3!$r$%!!API!4!"R!!!-(A`!![r
m8Ui!#"mZrraK!2q5B!!!!L"Z!!J3%"e!rrj5VJ!)%#lrrJ*!!2m-3!"G9m"%!'F
!!!CJ!!#+%#lrrJ*!!2m-3!!!9m"%!'F!!!CJ!!##)'i!#"!3!N!!r`a!!#e@`%3
!C`!!$KmZrrjK!2mbB!!!6"!ZrriG32rk8Ui!##"Z!!J3%"e!rrK5VJ!)%#lrq!*
!!2m-3!!!9m"%!'F!!!CJ!!!Z(c`!!f%!r[3I,[rkB3$ql"mZrrKK!2lNB!$r9"m
m!!4K!2lB)#i!##e!!!a1AL"Ih[`!"%l36PErr%*ZrraJ!!!'8Qlrr#"Z!!M3l[r
m%"!#3!$r$%!!!&I!4!"R!!!'B!!!"Q!!rp`-EJ!!rraH`%3!C`!!2M!Zrr`p32r
qB!!!&&0Zrri-EJ!"rrjG`%3!CJ!!)$!Zrrj63%M!)%$4lJ!)(a!JEJ!)d1lrrK#
IB!$rdM!Zrr`I!#"Z!!J3RdjH)&rHr!!%6Y""l!$#3K"#*dKX!-*K!2a5%"mC3!"
H6R919J!!5L`%`QF!!"T#*bmZ!!K)E!,#B3!!B"!I(8!!$'!!!%aJ!!!#3LF[,J!
)5'`#`Q%!!%33(fF!!!a`!4e!!!aJ!!!U)'i!#"!3!N!!r`a!!!"A`%3!C`!!$(!
!(8!!$'!!!!T5VJ!)B!$r[%jH)&rHr!!%6Y"19[rk)'i!#"!3!N!!r`a!!!"A`%3
!C`!!$(!"(8!!%'!!!4BJEJ!)%"!#3!$r$%!!"eI!4!"R!!!F)'i!$"!3!N!!r`a
!!!"A`%3!(8!!%'!!!1BJEJ!)%"!#3!$r$%!!"PI!4!"R!!#-8Ui!##!Z!!`Y32r
kB!!!,#"Z!!`3%"e!rrj5VJ!-3LFI,[rq,bi!#'%!!+i3(``!N!0A`%3!CJ!!"Q!
!rp4J!!!8,blrqL!Z!!b`Rer!4!"Q!!!Z8ki!$%)R,bi!$%+R,bi!#'%!!H*K!2m
X%"pR!!!-F!%G3!!3B!!!9'!!rm4`!"e!!""J!!"')'i!$"!3(8$rrP+Z!!a#*am
Zrri[,J!)B3!!0"!IC`!!)%)R,bi!$%+R,bi!#'%!!BjK!2lB%"mG3!!3B!!!"N)
Z!""1AL"Ih[`!#%l36PErrL"Z!!J3%"e!rrj5VJ!)%#lrrJ*!!2pJ!!"f3LFI,J!
-,bi!#'%!!)i3(ae!!!jJ!!"kB!!!GN)R(bi!$#mZ!!KK!!"b%"p+!&I!4!!G3!!
1B!!!@'!!!&33,J!-!N!!r`a!!!"@`%3!(8!!$Q!!!$aJ!!!i(blrrK!Z!!b`(eI
!4!!G3!!1B!!!)Q!!!"i-3!!"C`$rKJa!!!*R!2qD$%!!"@F!rl4J!2r-6PiJApl
m!!C1d%j@rrT#,J!1B!!!!L"Z!!J3%"e!rrT5VJ!)%#lrqJ*!!2m-3!!%9m"%!'F
!!!CJ!!"q%#lrqJ*!!2m-3!!$9m"%!'F!!%SJEJ!)%"!G32rm8Ui!##"Z!!J3%"e
!rrj5VJ!)(blrrK!Z!!b`(er!4!!I!"mZ!!`3,[rmX"pI`%3!`"pR!!!'B!!!)'!
!!"JI,[rk%#i!$,!I9m"%!'F!!!CJ!!!'B!$rCKem!!%!$NjH)&rHr!!'6Y"19[r
q)'i!#"!3(8$rrP+Z!!J3,[rq!N!!r`a!!!*A`%3!(`!3,[rq!N!!r`a!!!&A`%3
!J"pR!!!XB!!!&K!Zrri#3!$r$%!!"&I!4!"Q!!!8)'i!#"!3(8$rrP+Z!!KJ!2r
F)#i!##e!!!a1AL"Ih[`!"%l36PErrNSX"4CR!!"83QFr,!88B3!,B$!I28$rrN)
X"4B-E!!""4KA`%3!C`!!-JbX!*!%#5"@`%3!C`!!#LmX#5"K!!X3$+`!N!3**&E
!4!"R!!!+,b`**'%!#[K1ANje6PErX#mZ!"""l[q`d2`!%L#I2bi!$N(Zrl$3r!!
@-*m`,J!)(`""l[q`d2`!'a#I3HlrX0$m!"T#%%(Zrl$3r!!F3T!!3QG)E[q`(c`
!!'%!$D!`(ce!!"4"l[q`d2`!'$m3)'i!#M#I6PiJAplm!!a1d%)X"4BjI!""#6j
#V!NJ3U`**%je6PB!!$!X"4KJ!!!L3QGK!!!`-"mp3!!)B!!!)N*RB3!$&M!I28!
!#'!!!")-3!!"C`$rfJa!!!*R!2rL6Pj1G8j@rrSpI2rr!!J-,!!!"4CA`%3!C`!
!"Q!!!HB-,!!!#5TA`%3!C`!"*'!!!!)r,!NX8Q`*,M!X#5k`Aec!4!"R!!!+B3$
qNQ!!!EB`,!NZ`I`!%#m!)'`**#"3dGm-8!!!Am"%!'F!!!CJ!2r#-#`*,X(m!"!
[!#"X#53J80(I8)JJ%!+!!2q3!be!rrSr,!88,blrqQ%!!@`r,!885'`*0Lmm!*!
$!Q%!!B!-E!!!#6CA`%3!C`!!"Q!!rh)[,!NJ-#`*0NM!,`"K!!X13QGK!!Vd-"m
-3!!!9X"%!'F!!!i`,!NX18!*,Q!!rd)r,!88)'`*)#m3-#`*0NM!,`"K!!%S-#`
*,X(m!"![!#"X#53J80(I8)J3%1B)!N!!r`*!!!%C3!NS'A`!!3NU3L`*1N)X#6K
#E!N`3Q`*-KPm!!%*0'!!!!CJ!2lN5L`*+'B!!"SJE!NJ)&$3l!Nb%"!#3!$r28$
rrQ!!!(4J!!!3$'lrN!2q9X"%!'B!!')JE!NJ)&$3l!N`%"!#3!$r28$rrNSX#64
R!!!D3QF`,[rqk%JI!'%!!+``(ce!rrjJ!!!F3QF`,[rq!N!!$am!B3!!NM!I28$
rrP*X#6!3,!Nd5J"A`%3!'8!*0'!!rj3r,!Nf8Q`*-M!X#6+`Aec!4!"R!!!'3L`
*+M!Zrrip3!!)6Pj1G8j@rrj#CcmZ!!`r2!!",bi!#'%!#U3`(ce!rrj1AL"Ih[`
!"Nl36PB!!%*R2bi!%%KZ!!J[,J!-B3!)B$!I5-!Y3!!)6PiJAplm!!T1d%j@!!!
pI2rr!!T+,!NiC`!!'N)X#6J3,!NmJ#i!#!*!!2mp3!!+B!!!BNSX#6TR!!!D3L`
*1K!Z!!MT#"P!#6`CI!!"#6KJ!!"#%#i!#!*!!2m-3!!29m"%!'F!!!`CI!!"#6T
J!!!N3IS!+Lm)8Li!#"!Z!!J#J!#3!rmJ30(I%"!#3!$r28!!#NjH)&rHr!!#6Y!
2)'9dER*[B@PcC'aSBfC`6PErrMemrrm!#!`X!!!&&PI!4!"R!!!'B!!!DLmX#4S
`,!NH5-#`Rec!4!"R!!"!+A`!!!3!#4T#CcmX"44)E!ND5'`&'Q%!"f!`(ce!rri
J,!ND$)!!N!4A`%3!C`!!#Q%!qhjJ!!!F3Q`*(N(X"4V3l!NH%"!#3!$r28!!#&*
X#4j1ANje6PB!!$emrpS!#%*R2c`!!N(k!&)J#&5!,`"K!!"5-"m-3!!!9m"%!'F
!!$C#EJ!)-#`&''!!!"T#Cf%!!1i`(ce!!!KJ!!!DB3!"U'!!!")-3!!"C`$riJa
!!!*R!2rU6Pj1G3NJ9%9B9&G28N419J!!B3$kjMemrpS!$N)X"4Br2!"N2c`!4N(
k!*J[##mm!*!%2bi!$#mZ!!J[2!#3"%KX"-Sr2!!#UHT"l!6+5K"R!!"N3QG)E!6
+"TF!N!-+3H`%bPb)2a")E!882c`!!@%!qZJ`(`a!!!"A`%3!C`!!0MPm!!%&'%(
k!$JJ#&5!)%![%%(X"-T8L#!3X*pA`%3!C`!!#$Pm!!)&'"Pm!!%&&N*Z!!j1AL"
Ih[`!"Nl3!!)&)&4&@&419[rk3UF[2!#3"'%!"8iJ(bP!#5!r,!88,c`!!!%)B3$
p1MmX"44)E[rk,c`!N!-'B3$p6MmX"44"l[rk,a"K!2dD3UG"l[rk@)J`%%M!,`"
K!!8))"mT3!NN$+`!N!3**&I!4!"R!!!3B3$j`MemrpF!#'!!!%`[,!NNB3!%[$m
X"43JE!NN,a""l[rk@)J`%%M!,`"K!2cS,b`**'%!"(T"l[rk@)J`%%M!JI`!%$P
!#5`jI2rr#5j#,!NU3Qi!#%jH6R9#V!ND3Q`*(Nje6PB!!#mZ!!K"l!6+)Pp`*$,
B8FMrr%jH)&rHr!!%6Y"19J!!-#`&''!!!#T#TbmZ!!KK!!!k)"mY3!!-B!!!*N+
R,bi!#'%!!-SJ(be!!!aJ!!!5$%!!!@F!rp)-3!!#C`$rhNjH)&rHr!!%6Y"19[r
q3Ui!$%SX"4CQ!!!'B!!!L#"Z!!K#%'!!!!*#Cf%!qIB`(ce!rri-E[q3!rjA`%3
!C`!!"Q!!!'!J,J!),8!!$!aZ!#$rrPI!4!!I!$mX#6iJEJ!)%"!#3!$rX&pH`%3
!`4F-EJ!0rrjA`%3!J"pR!!!'B!!!)M!ZrriI!#"Z!!K5%*!$!S!!N!2r)%$4lJ!
)%*pJ!2q'6PiJAplm!!41d%j@rrj#VJ!-5L`&&QB!!!CJ!!"N)'i!#%)3B!!!!N*
RB3$m5$!I28$rrJaZrj!$rPI!4!"R!!!'B!!!2#!Z!!JY3!!-$'i!$Irq9m"%!'F
!!!CJ!!!L-#lrrKm!)'i!#&)3N!-#J!#3!rmJ30(Z!!J3Rf!!rkT1AL"Ih[`!"%l
36PB!!%(k!$JJ#'B!!""`!$e!!!KJ!!!NB!!!)%*RB3!!9$!I4%"631Y)!N!(r`"
!`!!p3!!)B!!!!NjH6R919J!!3UGK!!!J)"m%J!#3!`SJ3!a3rrpA`%3!(8!!#'!
!!!*1ANje6PB!!#m-,9m!#%jH6R919J!!3UGK!!!@)&r3r!!B-"!p3!!)B!!!!Nj
H6R919J!!3UGK!2r-)"m'J2q3!qJJ3#!3,8!!#'!!!!*1ANje6PErrN)RB3$rJK!
ICJ!!$M!m!qJp3!!)B!!!0%*RB3!!-M!I4%!#3!!I2`"#Cf%!ra``(i"I28$rrMm
ZrrjK!!!`-#lrrMe!!!KJ!!!#6Pj1G8j@!!"#Tf%!ri3JAp$m!#B`%$e!!!KJ!!!
#6Pj1G8j@!!!r,J!)3UGK!2pL)&r3r!!Q-*p1AL"Ih[`!!Nl36PErX#mZ!!j"l[q
`d2`!%L#I2bi!$%(Zrl$3r!!@-*p"l[q`d2`!(%*33HlrX0$m!"T#%%*R5'lrX"m
m!!"K!!!S-"mp3!!5,bi!#%(Zrl$3r!!J)Pp`!b,B8FMrr%jH)&rHr!!+6Y"19J!
!6PiLAa!I)&pQ"+!-B!+N$$k!6Y&1AL"Ih[`!"Nl36PErVLmZ!"*"l[q`d2`!%L#
I2bi!%%(Zrl$3r!!@-*p"l[q`d2`!'N)33QG)E[q`(c`!!'%!!(!`(ce!rkj+E[q
ZCJ!!8%(Zrl$3r!!F3P"#CdKZrl!I2!!!B3$rJM!I28$rVLmZ!!K"l[q`d2`!)##
I,bi!$%(Zrl$3r!!N)*p#CdKZrl!I2!!!B3!!2$!I28$rVM!Zrkip3!!@6PiJApl
m!!j1d%j@!!"1AL*I%"mJAfB%S!KJ!U3)2S"1d8jH)&rHr!!'6Y"19J!!6PiLAa!
I)&pQ"+!0B!+N$6k!6Y&1AL"Ih[`!"Nl36PB!!#m+)'i!#+!U,8J!##4I-F!#)%j
H)&rHr!!%6Y"19J!!,`SJEJ!)S#NY5!!)*&ma`!)J6PiJAplm!!41d%j@!!![#L!
Z!!JJEJ!-S5)Y3!!),8J!$#4I-F!#)%jH)&rHr!!%6Y"19J!!,`SJEJ!)S#-Y5!!
)*&ma`!)J6PiJAplm!!41d%j@rl!r,J!)3HlrX0$m!"J`Rd*R5'lrX"mm!!"K!!!
5-"mp3!!+6PiJAplm!!*1d%j@!!"1AL*I%"mJAfB%S!&J!U3"2S"1d8jH)&rHr!!
'6Y"19[q`2bi!%%(Zrl$3r!!B-*m[,J!)3HlrX0$m!#!JRb"Z!!`[%%(Zrl$3r!!
N)*p"l[q`d2`!,%*33HlrX0$m!#j#N!"#CdKZrl!I2!!!B3!!)M!I28!!%N(Zrl$
3r!!S,a!JEJ!-)*p1AL"Ih[`!#Nl36PB!!%jH)Pm3(b"ICJ5J!Q!#T!)qJ%l46Pi
JAplm!!C1d%j@rl!r,J!33HlrX0$m!"J`RbmZ!!K"l[q`d2`!)##I)'i!$#m33Hl
rX0$m!#3JRd(Zrl$3r!!X3P""l[q`d2`!,N+3!%*R5'lrX"mm!!"K!!!L-"mp3!!
53HlrX0$m!#J[%#"Z!!`JRdjH)&rHr!!+6Y"19J!!6PiLAa!I)&pQ"+!$B!+N!ck
!6Y&1AL"Ih[`!"Nl36PB!!#"m!!!#)$!328!!#%jH6R919J!!,`SJ,J!))'i!$+!
N,8!!##e)!!`NAc(!!L"1AL"Ih[`!#%l36PB!!%jH)Pm3(b"ICJ5J''!#T"JqJ%l
46PiJAplm!!C1d%j@!!"1AL*I%"mJAfB%S"*J!U352S"1d8jH)&rHr!!'6Y"19[r
m)'i!$"!3!S!!N!2r,`!JEJ!3N!-#J!#3!rpb%11SJ*mY32rm8Ui!%&+Z!!`I,J!
+(bi!##mZrr`J(b*Z!!`JEJ!3%KpQ$")ICJ5J2'!1T$aJ#K)ICJ5L2'!#TM`I!"e
I!"3+,J!"!"41AL"Ih[`!$%l36PErX$mZ!!j"l[q`d2`!'$#I2bi!$%(Zrl$3r!!
X-*m[,J!)3HlrX0$m!#iJRd*R5'lrX"mm!!"K!!!5-"mp3!!36PiJAplm!!K1d%j
@!!"1AL*I%"mJAfB%S%4J!U4%2S"1d8jH)&rHr!!'6Y"19J!!6PiLAa!I)&pQ"+!
!B!+N!$k!6Y&1AL"Ih[`!"Nl3!*!$)J!"!*!&8`"2!'F!L`3#6dX!N!8(!!B!4`#
3!)J#AM!!!!'H!!3!N!@8!$)!U!"Z"!*25`#3"3J!"`#'!*L)HNGbCA!J,b"AEh*
N)%0[G@jd$ABa,M!J)$%c)%eKFQ0S)$%j1$B0+&"eBQaTBb"%EfeKD@iT$3e3BA9
X)%4e3QpTF`da-M)`)%0KF'PdEf`J3fpeFR306@&NDA0[EL"A55!e-cF`0Je9980
31L"eGfeKBf-KC(9LEfPc!*!&(J#q!+i!eSJ3AJdN$5i0@biZA3d0+Jd0A!#3"4i
!fJ#Z!B@)X%eKG'0S)(0dBA*d)'pQ)'aTEQ806@&dBfJJC@jN)'pQ)'aTEQ806@&
dBfJJB@jj)'0SBA*KBh4PFJe0BA4MD#"KERNJBfKKFQ&MG'9b)'*PG(GPC@iJBR*
KBfYPG(-06@&dBfJJB@jj)'jeE@*PFL"[CL"dD'8JF(*PGQP[GA-JG'KTEQF09(9
bEL"[CQBJFh"PBfPKE#"YC@&ZD@jR)'pQ)'jPH(3JBfKKFQ&MG'9b!*!&#!#q!"S
"FiJD8h"PBfPKE#"3BA4dCA*Z)%0SBA*KBh4PFR-!N!1d!!B!N!9!!6-!9!&["!*
25`#3"9S"-`"Z!@m%"N0KEQ0PE!#3"3B!#3!A!%1)#&"KG(4PFQik!*!&(3!)!#d
"HC!!!*!'13!'!%d!f3BB6'PZCA-J3fpZG'&TEQPZCb"3BA4dCA*Z!*!&6J!'!')
!f!BF6'PZCA-J6Qpd)%0[ER4KD@jTEQFJ8'&dG'9bEJ#3"@-!"J"h!0J&$%aTEQ8
J6R9YBQ9bF`#3!a8!+!!b!+)"[!!"!*!)`d!!N!3-!$)!0!#P!-M$3N4%!*!$$!!
X!"!!j!'@`d&%4!!!!3#3!bZ2!!!UM`#3!jX!!1jf!(S!N!-F!*)!!d459P)!N!-
L4%P86!!#!#j%6%p(!*!$8N&-8P3!!3"H!"S!!#!!N!AZPX0!rrm!!#QH!!$ZEX0
"rrm!!#Im!!$ZSX0#rrm!!#I@!!$ZTX0!rrm!!#T@!!$YZX0"rrm!!#Tr!!$YMX0
#rrm!!#T[!!$YNJJ!4h*PF#eABd!)!:

-- 
                                                                    |
Paul DuBois     {allegra,ihnp4,seismo}!uwvax!uwmacc!dubois        --+--
                                                                    |
                                                                    |